OpenAI 兼容接口 · 可直接使用官方 SDK 对接
https://hw.hfcms.xyz/v1Authorization: Bearer <你的密钥>ModelScope/MNN/Qwen3.5-2B-MNNapplication/json(流式返回 text/event-stream)openai 官方 SDK,只需把
base_url 和 api_key 换成本文档的值即可,其余代码不用改。
curl https://hw.hfcms.xyz/v1/models \
-H "Authorization: Bearer <你的密钥>"
返回模型列表即为正常。若返回 401,说明密钥无效或已过期。
curl -N https://hw.hfcms.xyz/v1/chat/completions \
-H "Authorization: Bearer <你的密钥>" \
-H "Content-Type: application/json" \
-d '{
"model": "ModelScope/MNN/Qwen3.5-2B-MNN",
"messages": [{"role": "user", "content": "用一句话介绍你自己"}],
"stream": true
}'
-N(curl)或关闭客户端缓冲,否则响应会攒到最后一次性输出。
服务端已关闭代理缓冲,数据是逐字下发的。
from openai import OpenAI
client = OpenAI(
base_url="https://hw.hfcms.xyz/v1",
api_key="<你的密钥>",
)
stream = client.chat.completions.create(
model="ModelScope/MNN/Qwen3.5-2B-MNN",
messages=[{"role": "user", "content": "用一句话介绍你自己"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://hw.hfcms.xyz/v1",
apiKey: "<你的密钥>",
});
const stream = await client.chat.completions.create({
model: "ModelScope/MNN/Qwen3.5-2B-MNN",
messages: [{ role: "user", content: "用一句话介绍你自己" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
import json, requests
r = requests.post(
"https://hw.hfcms.xyz/v1/chat/completions",
headers={
"Authorization": "Bearer <你的密钥>",
"Content-Type": "application/json",
},
json={
"model": "ModelScope/MNN/Qwen3.5-2B-MNN",
"messages": [{"role": "user", "content": "你好"}],
"stream": True,
},
stream=True,
timeout=600,
)
for line in r.iter_lines():
if not line:
continue
line = line.decode("utf-8")
if not line.startswith("data:"):
continue
payload = line[5:].strip()
if payload == "[DONE]":
break
delta = json.loads(payload)["choices"][0]["delta"].get("content")
if delta:
print(delta, end="", flush=True)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/models |
列出可用模型,可用于验证密钥有效性 |
| POST | /v1/chat/completions |
对话补全,支持流式与非流式、支持图片输入 |
| POST | /v1/messages |
Anthropic Messages 兼容格式(实验性) |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 填 ModelScope/MNN/Qwen3.5-2B-MNN |
messages | array | 是 | 消息数组,元素含 role 与 content。role 可为 user / assistant / system |
stream | boolean | 否 | 默认 false。true 时以 SSE 逐字返回 |
max_new_tokens | integer | 否 | 限制生成的最大长度,建议 512 至 2048 |
temperature | number | 否 | 采样温度,越大越发散 |
{
"id": "chatcmpl-...",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}
]
}
每一行形如 data: {json},增量内容在 choices[0].delta.content,最后以 data: [DONE] 结束。
data: {"choices":[{"delta":{"content":"你"}}]}
data: {"choices":[{"delta":{"content":"好"}}]}
data: [DONE]
模型自带视觉编码器,可直接识图。content 传数组,图片用 base64 data URL:
import base64
b64 = base64.b64encode(open("photo.jpg", "rb").read()).decode()
body = {
"model": "ModelScope/MNN/Qwen3.5-2B-MNN",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有什么?"},
{"type": "image_url",
"image_url": {"url": "data:image/jpeg;base64," + b64}}
]
}],
"max_new_tokens": 512,
}
<img>URL</img> 这类内联标签写法,请务必使用上面的标准格式。
| 状态码 | 含义 | 处理建议 |
|---|---|---|
200 | 成功 | 正常读取响应 |
401 | 密钥无效或缺失 | 检查请求头是否为 Authorization: Bearer <key>,注意不要漏掉 Bearer 和空格 |
404 | 路径错误 | 确认路径以 /v1/ 开头 |
429 | 请求过于频繁 | 降低发起频率,稍后重试 |
502 / 504 | 后端模型暂不可用 | 稍等后重试;若持续出现请反馈 |
错误响应体统一为 JSON:
{
"error": {
"message": "Invalid API key. Send header: Authorization: Bearer <your-key>",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
</think> 标记分隔。
正式答案位于该标记之后;如需只展示结论,可按此标记截取。通常是密钥问题。本服务在不带密钥时会返回 401,但如果你经过其他代理层转发,可能出现 200 空响应的情况。请先用第 2.1 节的方式单独验证密钥。
模型正在生成。流式请求下首个字符通常需要 2 至 10 秒,复杂推理题可能更久。 若使用非流式请求,需等整段生成完毕才会返回,请务必把超时设长。
服务端已开启跨域支持,允许任意来源、允许 Authorization 请求头,
浏览器端可直接调用。生产环境仍建议从服务端发起,以免密钥暴露。