DeepSeek API 用起来和 OpenAI 格式兼容,换一个 base_url 就能接。但它的模型命名有过一次大变动,很多旧教程还在写 deepseek-chat、deepseek-reasoner,照着抄会踩坑。这篇按官方文档,把模型名、流式输出、上下文缓存、计费与并发这几件事一次讲清。

模型名怎么选

判断写进第一句:现在只有两个正式模型——deepseek-flash 和 deepseek-v4-pro,旧的 deepseek-chat / deepseek-reasoner 已于 2026 年 7 月 24 日弃用。

deepseek-flash 背后是 DeepSeek-V4.1-Flash-1017,deepseek-v4-pro 背后是 DeepSeek-V4-Pro-0813。两者都支持 1M 上下文、最大 384K 输出、思考/非思考模式、JSON 输出、Tool Calls、Responses API 和 Anthropic 格式。差别在两点:flash 支持图像理解,v4-pro 不支持;flash 便宜、并发高(2500),v4-pro 贵、并发低(500),但推理更强。

有两个遗留名要注意:deepseek-v4-flash 和 deepseek-v4-flash-vision-exp 仍能调用,但对应模型已下线,请求由 DeepSeek-V4.1-Flash-1017 接管,按 flash 价计费。所以新代码直接写 deepseek-flash 就行。

最小调用与思考模式

base_url 用 api.deepseek.com,模型默认开思考模式。要快速回答就把 thinking 关掉:

from openai import OpenAI

client = OpenAI(api_key="sk-xxx", base_url="https://api.deepseek.com")
resp = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{"role": "user", "content": "一句话解释上下文缓存"}],
    extra_body={"thinking": {"type": "disabled"}},   # 关思考,走快速回答
)
print(resp.choices[0].message.content)

思考模式下,推理过程在 reasoning_content 字段里,最终答案在 content 里。用 reasoning_effort 可以调低/高/最高三档。一个容易踩的坑:思考模式下 temperature 不生效,tool_choice 设为 required 会返回 400——要强约束工具调用就先关思考。

流式输出

流式就是设 stream=True,逐 chunk 读 delta:

stream = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{"role": "user", "content": "写一段 200 字的产品简介"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)

注意思考模式流式时,reasoning_content 和 content 是分开流的,前端要分别接;别把推理过程当正文吐给用户。

上下文缓存怎么蹭

DeepSeek 有自动上下文缓存:请求的前缀命中缓存,输入费用便宜一大截。flash 缓存命中价是 0.02 元/百万 token,未命中是 1 元,差 50 倍。蹭缓存的原则是「不变的长内容放最前」:

# 把 system + 长文档这类不变内容放最前,后续每轮只追加新内容,就能命中缓存
system = "你是财报分析助手。" + ("公司年报摘要:" + annual_summary)  # 长且不变
resp = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "system", "content": system},
        {"role": "user", "content": "今年研发费用同比变化?"},
    ],
)
hit = resp.usage.prompt_cache_hit_tokens   # 看命中了多少输入 token

只有「完全相同的前缀」才算命中,所以多轮对话里别每轮都改 system 里的一个字。拿 usage.prompt_cache_hit_tokens 看实际命中量,比猜管用。

计费与并发

计费是 token 消耗 × 单价,按百万 token 计。flash 空闲时段输入缓存未命中 1 元、命中 0.02 元、输出 4 元;v4-pro 分别是 4.5 元、0.15 元、13.5 元。高峰时段翻倍。高峰是北京时间周一至周五(不含法定节假日)9:00–12:00、14:00–18:00,其余时间(含周末)都是半价。

并发限制 flash 是 2500、v4-pro 是 500,超了会被限速。另外 Search 和 Fetch 这两个独立 API 按次数计费,5 元/千次。

几个高频误区

一是还在用 deepseek-chat/reasoner 的旧代码,模型名弃用后行为会漂移,尽早改成新名。二是把思考模式开着做简单抽取,白白多烧 token 和延迟,判断标准是任务要不要多步推理。三是忽视缓存命中率——把 system 和文档放最前、别乱改前缀,命中率上去了成本能降一个量级。四是高峰时段没做错峰,批处理任务排到周末或晚间,直接省一半。这几条都不玄,但加起来省的钱很实在。