在聚合站上用 DeepSeek:从拿到 key 到第一次成功返回
面向在 LLM API 聚合站上首次调用 DeepSeek 的开发者,梳理从拿到 API key 到第一次成功返回的完整流程,包括 model 名称选择、OpenAI 兼容请求体与 DeepSeek 参数的对应关系,以及如何识别响应中的异常信号。
准备:聚合站的 key 与 DeepSeek 的关系
在聚合站上,你拿到的 API key 是聚合站的 key,不是 DeepSeek 官方的 key。这个 key 可以调用站内多个模型,DeepSeek 只是其中之一。请求会先发到聚合站的网关,由它转发到对应的上游。
因此有两点需要注意:
- 认证头、base URL、错误结构都遵循聚合站的约定(通常与 OpenAI 兼容)。
- 计费按聚合站的规则走,而不是 DeepSeek 官方账单。
第一步:确认 base URL 和认证方式
聚合站一般提供 OpenAI 兼容的入口,形如:
https://<聚合站域名>/v1/chat/completions
认证方式通常是在请求头里带上:
Authorization: Bearer <你的聚合站 key>
不要把 DeepSeek 官方 key 填进来,那属于另一套体系。如果你同时持有官方 key 和聚合站 key,先在文档里确认当前调的是哪一端。
第二步:选择正确的 model 名称
聚合站的 model 名称不一定和官方完全一致。常见做法有两种:
- 直接沿用官方名称,例如
deepseek-chat(对话)和deepseek-reasoner(推理)。 - 加前缀区分来源,例如
deepseek/deepseek-chat或带渠道标识的写法。
不要凭记忆硬写。最稳妥的做法是:
- 查聚合站的模型列表接口(通常是
GET /v1/models)。 - 或者查文档里的「模型名称」表格。
- 复制其中一字不差的字符串填进
model字段。
名称写错的典型表现是返回 404 或明确的 “model not found”,这比返回空内容更容易排查。
第三步:写对请求体
DeepSeek 在 OpenAI 兼容层上工作,所以请求体基本就是标准的 chat completions 结构:
{
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个简洁的助手。"},
{"role": "user", "content": "用一句话解释什么是向量数据库。"}
],
"temperature": 0.7,
"max_tokens": 512,
"stream": false
}
几个容易踩的点:
messages必须是数组,且每条有role和content。role用system/user/assistant,不要自创。temperature、topp、maxtokens这些常规采样参数通常直接透传。- 如果你用的是
deepseek-reasoner这类推理模型,部分参数(比如temperature)可能不被接受或被忽略,具体以聚合站文档为准。 - 想边生成边看,把
stream设为true,但流式响应的解析方式和非流式不同,第一次调通建议先用false。
第四步:发请求
用 curl 最简单,能排除 SDK 封装带来的干扰:
curl https://<聚合站域名>/v1/chat/completions \
-H "Authorization: Bearer <你的聚合站 key>" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "你好"}]
}'
如果这一步就报错,问题多半在认证、URL 或 model 名称,和业务逻辑无关。先用 curl 跑通,再换成 Python / Node SDK。
第五步:看懂正常响应长什么样
非流式的成功响应结构大致是:
{
"id": "...",
"object": "chat.completion",
"created": 1700000000,
"model": "deepseek-chat",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 34,
"total_tokens": 46
}
}
重点关注三处:
choices[0].message.content:真正的模型输出。finishreason:正常结束是stop;如果是length,说明被maxtokens截断,不是模型坏了。usage:令牌计数。聚合站按它计费,和官方口径可能略有差异。
第六步:识别返回异常
第一次调用后,先过一遍这些检查项,能快速区分「配置错」和「模型本身的问题」:
- HTTP 状态码:401/403 是认证,404 多为 model 或路径写错,429 是限流,5xx 是上游或网关问题。
- content 为空但 finish_reason 正常:检查是不是触发了内容过滤,或者 system 提示把输出压成了空串。
- content 里出现非预期结构:比如推理模型可能把思考过程放在单独的字段里,而不是
content,需要按文档取值。 - 响应里的 model 字段:如果显示的不是你请求的模型,说明网关做了路由或替换,值得留意。
- 流式返回:每条
data:行是增量 chunk,最后一条通常是data: [DONE];如果中途断了,检查网络或网关超时。
注意事项与后续步骤
- 把 key 放在环境变量里,不要硬编码进代码或提交到仓库。
- 先用小
max_tokens跑通,确认链路无误后再放开。 - 聚合站的计费规则(比如按官方价的倍数扣费)以站内说明为准,别拿官方账单来对。
跑通第一次之后,建议把 curl 请求翻译成团队常用的 SDK,并加上重试和超时逻辑。之后再考虑流式、多轮对话、函数调用等更复杂的用法,这样每一步出问题都容易定位。