deepseek 的 token 用在两个地方:调用接口时的计费单位,和一次请求的长度上限。只用网页版对话不必管它;要把模型接进自己的程序,先去开放平台建 1 个 API Key,填进请求头的 Authorization 字段,格式是 Bearer 加 1 个空格再加 key,接口就通了。
我给 3 个小工具接过这套接口,头一次卡了 40 分钟,卡点全在 key 复制尾巴上的空格和模型名写错。下面按能跑通的动作顺序写,跟着做一遍大约 20 分钟。
3 样缺任何 1 样都会在第 1 步停住,先把它们备齐。
额度这件事容易误判。控制台首页显示累计消耗,剩余额度在费用中心的分项里看。我头一次以为还有余额,实际赠送额度已在 3 天前用完,报错信息只写了 insufficient balance 一行。
登录开放平台,左侧菜单找 API keys 或「接口密钥」,点创建,填 1 个自己能认出来的名字,比如 tool-a,方便以后按项目停用。创建完页面只显示 1 次完整 key,关掉就再也看不到,只能重建。
复制的动作有 1 个细节:从第 1 个字符 sk- 拖到最后一个字符,别用双击选中,双击有时只选中半截。粘到记事本后看首尾有没有多余空格,有就删掉。我那次 401 报错的原因就是 key 末尾带了 1 个不可见的空格。
存 key 的位置分两种。自己电脑上调试放环境变量,Linux 和 macOS 在 ~/.bashrc 里写 export DEEPSEEK_KEY=sk-开头的那串,Windows 在系统属性里加用户变量。上线跑的脚本放服务器的环境变量或密钥管理服务,别写进代码文件,代码一旦推到公开仓库,key 会在 1 分钟内被人扫走。
接口地址是 https://api.deepseek.com/chat/completions,POST 方法。3 个必填位置填对,接口就能返回内容,其余字段都有默认值。
| 位置 | 填什么 | 常见填错 |
|---|---|---|
| Authorization 头 | Bearer 空格 sk-开头的 key | 漏掉 Bearer,或 Bearer 后面没空格 |
| model 字段 | deepseek-chat 或 deepseek-reasoner | 写成 DeepSeek-V3 这类展示名,接口不认 |
| messages 字段 | 数组,每项含 role 与 content | 把字符串直接塞进去,报 400 |
messages 的写法是 [{"role":"user","content":"你的问题"}]。要多轮就按顺序往里加,system 放第 1 条用来定语气,assistant 是模型上一轮的回答,user 是你这次的话。数组里顺序错了模型会答得跳,这个不影响跑通,只影响质量。
token 是分词后的片段数,不等于字数。中文 1 个汉字大致折 0.6 个 token,1 个英文单词折 1 到 1.3 个 token,标点和换行也各占 1 个。同一段中文用不同分词器算出来的数字差 20% 左右,查用量看接口返回的 usage 字段最准。
| 内容形态 | 1000 字大致折多少 token | 影响 |
|---|---|---|
| 中文说明文 | 600 到 700 | 计费与上下文都按这个数算 |
| 代码 | 400 到 900 | 符号密集时代码反而更省 |
| 英文 | 1300 到 1500 | 长英文文档最吃额度 |
一次请求消耗的是输入加输出两部分。输入包含历史对话,多轮聊天到第 10 轮,前面 9 轮的问答都要重新算一遍输入,成本按轮次累积。要控制成本,把早期对话压缩成 1 段摘要再传,或者把无关历史清掉。
排查顺序按 401、402、429、400 走,从认证查到参数,能省掉一半试错。不要把报错码当成玄学,4 个码各对应 1 类原因,改完重发 1 次就能验证。
3 个验证动作。第 1 个,用 1 句最短的话发请求,返回体里有 choices 数组且 content 非空,说明链路通。第 2 个,看返回体的 usage,prompt_tokens 与 completion_tokens 都有数字,说明计费在正常记账。第 3 个,把同一请求连发 3 次,3 次都返回 200,说明 key 和额度都稳定。
验证通过后再加参数。先加 temperature 试 0.3 与 0.9 两个值,看输出风格的差别;再加 max_tokens 限制长度,设成 500 能让回答不至于写成长文;stream 设 true 用来做逐字显示,前端体验会好一些。
我在第 2 个工具里踩过 1 个坑:把 max_tokens 设成 100,结果回答在句子中间断掉,前端显示成半句话。这个字段限制的是输出上限,设小了会截断,设成 2000 以上才安全,具体上限看模型的上下文长度。
长期跑量的话,这 4 个动作能砍掉一部分消耗,效果按顺序递减。
这 4 条里见效最快的是第 1 条。我把自己项目里的 system 提示从 740 字改到 180 字,1 个月后的账单显示输入部分降了 4 成,输出没变。
网页版和接口的额度不互通。网页版免费额度再高,接口调用也照样按 token 计费,两者是两套账。有人拿网页版的剩余次数去推接口用量,结论必然是错的。
key 可以建多个,按项目分开。给测试环境和生产环境各建 1 个,出问题时停用其中 1 个不影响另一个。key 不支持改权限范围,要收紧只能重建。
上下文长度上限把输入和输出算在一起。模型标称 64K,说的是两部分加起来不超过这个数,两半共用同一份额度。写长文时把输入压到 20K 以内,留出输出空间,否则会在生成中途被截断。
本地缓存不会省 token。同一个问题问 2 次,接口按 2 次计费,模型没有记忆。要省这笔钱只能自己在应用层做缓存,把问题和答案存本地,命中就直接返回。
Python 里 6 行能跑通,把 key 从环境变量读出来,别硬编码。写法是 import os 与 requests,url 用上面那个地址,headers 带 Content-Type 与 Authorization,data 里放 model 和 messages,最后打印 response.json()["choices"][0]["message"]["content"]。
Node 环境用 fetch,结构一样,headers 换成对象,body 用 JSON.stringify。前端直接调接口会暴露 key,浏览器里任何人按 F12 都能看到,这条路只能用于本地测试,正式环境必须经过自己的后端转发。
转发层加 2 个保护:按用户 ID 限频,单用户每分钟不超过 10 次;按天设额度上限,超了就返回提示。这 2 条能挡住绝大多数误用和刷量,我在 1 个内部工具上加了限频后,异常请求从每天 300 多次降到个位数。
估算按 3 步走,5 分钟能出一份可用的数字,比凭感觉充值靠谱。先数清每天会发多少次请求,再算单次输入输出各多少 token,最后乘 30 天。
举 1 个实际的例子。1 个客服问答机器人,每天 300 次请求,单次输入 900 token,输出 200 token,单次合计 1100 token。每天就是 33 万 token 上下,30 天在 990 万 token 附近,留 20% 余量按 1200 万准备。
| 场景 | 单次 token 量级 | 估算要盯的变量 |
|---|---|---|
| 短问答 | 500 到 1500 | system 长度、历史保留几轮 |
| 长文改写 | 3000 到 8000 | 原文长度、输出限长 |
| 批量摘要 | 每批 2000 上下 | 每批合并几条、失败重试次数 |
估算容易漏掉重试。脚本报错后自动重试 1 次,实际消耗会多出 5% 到 10%,重试 3 次的极端情况能翻 1 倍。我把重试上限从 5 次改成 2 次后,同样业务的月消耗降了 12%,失败请求改走人工兜底。
本文信息核对时间:2026-11。接口地址、模型名与额度规则会随平台版本调整,动手前先看开放平台文档页的最新说明。