第一次接 DeepSeek API 的人,往往不是卡在代码上,而是卡在「账单对不上」「报错看不懂」「重试一轮钱翻倍」这类事上。这篇不讲 API 怎么调,只讲接入前后该看哪几页、该记哪几个字段、出错先查哪一格。看完你能自己判断一个问题该去哪核、该不该动手改。
第一次接 DeepSeek API,卡住人的往往不是代码。代码其实很直白,一个 key、一个地址、一次 POST 就通了。真正麻烦的是后面那几件事:账单对不上、报错看不懂、重试一轮费用翻倍、系统提示词写老长却根本没命中缓存。这些事在文档里都有,但分散在好几个页面,第一次接的人基本要挨个踩一遍。
这篇不教怎么调接口,只讲接入前后该看哪几页、该记哪几个字段、出错先查哪一格。看完你应该能自己判断:一个问题是账户层的、计费层的还是请求层的,该去站内哪一页核对当时的数字,以及哪些坑值得动手改、哪些可以先放着。有个前提得先说清楚:下面讲的是「少花冤枉钱、少走回头路」的判断标准,不是性能承诺,业务量级差别大的时候,权重得自己调。
先对齐计费口径,再写第一行代码
见过太多人先跑通再说钱,等到月底发现账单和预期差一截。问题多半不在单价,而在口径没对齐。DeepSeek 的输入和输出是两套单价,输出这块尤其容易失控——你写 prompt 的时候,输出多长往往被当成「结果」,其实它是个成本变量。同样一句话,让它「详细展开」和让它「一句话说完」,费用能差出一个量级。
还有一层是缓存。命中缓存和未命中算两个价,做长系统提示词之前,先弄清命中条件是什么,别想当然觉得「我这段提示词每次一样就会命中」。官方页面给的是单价,一次调用的实际花费得乘上本次的 token 数,这个换算建议动手做一次,不要拍脑袋估。
- 写 prompt 时把输出长度当成本项,能约束就约束,别把「越详细越好」当默认
- 用站内计算器把一次典型调用换算成花费,估出日调用量再乘,得到量级而不是精确值
- 长系统提示词先确认命中条件,再决定值不值得做;不确定就先按未命中估
- 把输入和输出分开记账,后期复盘才知道钱花在哪一头
密钥、余额、权限这几格最容易填错
密钥这块的坑不在技术,在习惯。最常见的错误是把生产 key 直接写在配置文件的默认值里,提交到仓库,或者塞进前端。换 key 之后旧 key 立刻失效,但代码里如果还留着硬编码的那一份,线上会突然全挂,而且报错看起来像是「网络问题」,排查方向直接跑偏。
余额和免费额度是两回事,扣费顺序不一样。报「额度不足」的时候,先分清到底是账户余额用完了,还是单次请求超了上限——这两种处理方式完全相反,前者要充值,后者要把请求拆小或改参数。分不清就去账户页看当前扣的是哪一种,别靠猜。
- 环境隔离
- 开发、测试、生产各用各的 key,换 key 时一处改完同步到配置中心,别散落在代码里
- 额度不足
- 先看是余额耗尽还是单次请求超限,前者充值,后者拆请求,方向反了只会白折腾
- 权限范围
- 确认这个 key 所属的账户和项目,多个项目共用一个 key 时,账单也会混在一起
限速和重试:最容易被忽略的一笔额外开销
重试逻辑写不好,是第一次接入最贵的一课。被限速之后重发请求,很多情况下仍然会计费;如果你写了个没有上限的死循环重试,一次故障就能烧掉一批额度。更麻烦的是分不清「客户端超时」和「服务端已处理」——前者请求可能压根没到,重试没问题;后者服务端已经算完了,你再重试就是双份费用。
- 先量延迟基线去 /tools/speed-test 测一下当前网络到接口的延迟,拿到一个实测区间,别拿感觉当阈值
- 设超时和退避超时阈值参考基线往上留余量;重试用指数退避,设最大次数,超了就抛错而不是继续
- 区分两种超时客户端侧连接超时可以重试;已发出但等不到响应的,先查请求 ID 再决定要不要重发
- 把重试计数进日志每次请求记下重试次数,复盘时能一眼看出是不是重试在放大费用
这套东西不复杂,但顺序不能反。先测基线再设阈值,比先设个「看起来合理」的数字然后天天误判正常请求要省事得多。什么情况下不适用?如果你的业务本身就是低并发、允许失败重来的批处理,退避可以更激进,代价是慢。
缓存与上下文长度,两个悄悄放大账单的开关
长系统提示词每次原样发送,不一定命中缓存,命中条件得看官方页面的说明。这一点特别容易被误判:有人以为「我这段提示词一个字没改,肯定命中」,实际用下来发现计费按未命中走。所以做缓存优化之前,先拿一两条真实请求对照一下命中情况,再决定要不要把长提示词固化下来。
上下文长度是另一个隐形开关。把整段历史对话每次都带上,是最常见的浪费,而且越聊越贵。实际只需要哪几轮就带哪几轮,或者把历史压成一句摘要。同样是省钱,先砍输入长度通常比换更便宜的模型见效快,因为输入是每次都在重复付的。
| 常见做法 | 问题 | 改法 |
|---|---|---|
| 整段历史每次带上 | 输入 token 持续增长 | 只带相关轮次或压成摘要 |
| 长系统提示词不做命中验证 | 按未命中计费,白花钱 | 先验证命中条件再固化 |
| 输出不设长度约束 | 输出费用不可控 | prompt 里写清长度和格式要求 |
走官方还是走中转,判断标准不一样
官方直连省心,结算和汇率自己扛;中转便宜的前提是倍率、模型版本、计费口径都对得上。选之前别只看价格,先去 /rankings 和 /sites/all 看检测口径和在线情况——同样是「能用」,稳定性差别很大,检测方式不一样结论也不一样。
我的建议是分层:对稳定性要求高的主链路走官方,测试和批量任务走中转,比全部押一边稳。全部押中转的风险是一旦出问题整条业务断,全部押官方的问题是对测试流量来说成本不划算。判断标准很简单:这条链路断了,业务能不能等?能等就走中转试,不能等就留官方。
报错时的排查顺序:从外到内四步
报错最怕的是东查一下西查一下。固定一个从外到内的顺序,能省掉大量重复劳动。第一步看返回状态码,第二步分清是账户层还是请求层,第三步看模型名有没有拼错,第四步才回去看代码。顺序反了,往往会花半小时改代码,最后发现是 key 错了。
日志字段也得提前定好。每次请求至少记下请求 ID、模型名、输入和输出 token 数,没有这几个字段,后面既没法对账也没法复现。这套排查顺序写进团队文档贴一次,新人接手能少走一遍弯路——这事儿花十分钟,值。
每月花十分钟做一次用量复盘
复盘不用做得很重,十分钟够了。拉出当月调用总量,按模型和任务类型分开看,找出花费最高的那一类,问问它是不是真的需要这么贵。对照站内用量榜看自己的量级是否正常,异常突增先查是不是重试或者循环调用在放大。
复盘只做一件事:确认下个月的预算是按实际用量算的,而不是按记忆算的。记忆里的「我们量不大」和账单上的数字经常对不上,尤其是接了新功能之后。至于具体的量级和费用,去 /price-watch 和相关用量页核对当时的数字,别拿这篇里的任何描述当基准。
下一步接入前先花两分钟换算一次真实调用成本,比事后对账省心;价格和口径以页面当时显示为准。→常见问题
DeepSeek API 的免费额度和余额有什么区别?
免费额度通常是赠送的、有有效期、用完即停;余额是你自己充的钱,扣费时先走哪一种各家不同。接入前先确认自己账户里到底哪种在用,否则报「额度不足」时会改错地方。具体数字和规则去官方 API 页面核。
被限速之后重发请求会重复扣费吗?
看情况。服务端已经处理完、只是响应超时的,重发会产生第二次计费;请求根本没到服务端的,重发一般安全。所以重试逻辑要区分错误类型,加上退避和次数上限,别统一当成可以无限重试。
同样的提示词,为什么两次调用费用不一样?
输出长度不一样是最常见的原因,模型每次生成的字数不会完全相同。其次是缓存命中情况不同、上下文带的历史不一样。想稳定估算就去站内换算工具按最长输出算一次,别按最好的那种情况估。
走中转站真的比官方便宜吗?
不一定。中转的价格受倍率、模型版本、计费口径影响,低倍率也可能因为计费单位不同而更贵。要对比就先对齐口径,再去中转站排行榜看检测结果,别只看宣传页上的倍数。
接入前最该先做的一件事是什么?
先用最小的请求跑通一次,把返回里的 token 用量字段记下来,再乘单价算出这次的真实花费。有了这个基准,后面所有估算才有参照,否则都只是感觉。