Mistral API 的接入链路很短:一个 Base URL、一个 Key、一个模型名,就能完成第一次调用。真正让人卡住的通常不是代码,而是三个细节——地址有没有写全、模型名是不是当前版本、Key 和入口是不是配成一对。
本文从官方入口 https://api.mistral.ai/v1 讲起,依次完成 curl 和 Python 第一次调用,再补充流式输出、JSON 模式、工具调用、常见报错,以及从官方直连迁到中商起航 AI 网关时的检查清单。
说明:Mistral、Mistral AI 及相关模型名称是 Mistral AI 的商标。本文与 Mistral AI 官方无隶属关系,模型、参数和额度可能随版本调整,请以官方文档和站内模型价格为准。
一、接入前确认三件事
第一是 Key 的来源。官方 Key 在 https://console.mistral.ai 创建,只能配官方入口;网关 Key 在中商起航控制台创建,只能配网关入口。
第二是 Base URL。官方入口是 https://api.mistral.ai/v1,聊天补全的完整路径是 https://api.mistral.ai/v1/chat/completions。
第三是模型名。Mistral 同时提供 -latest 别名和带日期的固定版本名,两者含义不同。别名会随官方切换默认版本而变化,固定版本更适合生产环境做回归对比。
这三件事确认完,再写代码。顺序反过来,很容易在 401 和 404 之间反复试错。
二、Base URL 与请求路径
官方 API 的基础地址是:
https://api.mistral.ai/v1
聊天补全使用 POST /v1/chat/completions。请求头需要两项:
Authorization: Bearer <MISTRAL_API_KEY>
Content-Type: application/json
如果你用官方 Python SDK,通常只需要传 api_key,SDK 会自动拼接地址。如果用 OpenAI SDK,则把 base_url 设为 https://api.mistral.ai/v1,SDK 会在后面追加 /chat/completions。
这里最常见的错误是重复拼接:base_url 已经带了 /v1,请求路径又写一次 /v1/chat/completions,最后变成 /v1/v1/chat/completions,返回 404。另一个常见错误是把官方地址和网关地址混用,表现为 401。
中商起航 AI 网关的 OpenAI 兼容入口是 https://ai.zhongshangqihang.com/v1,路径规则相同。切换时只改 base_url 和 api_key,不要让两者交叉。
三、模型名:别名与固定版本怎么选
截至 2026 年 10 月,官方快速开始使用 mistral-large-latest,函数调用文档还列出了 mistral-medium-latest、mistral-small-latest 等别名。模型总览页给出的固定版本名包括 mistral-large-4(公开预览)、mistral-large-2512、mistral-medium-3-5、mistral-small-2603,以及 ministral-14b-2512、codestral-2508 等专用模型。
两类名字的差异在于:
-latest别名指向官方当前的默认版本,适合快速验证和非关键业务,但默认版本变化时行为可能跟着变。- 带日期或代数的固定版本名指向明确版本,适合生产环境锁定行为,便于做发布对比和回滚。
官方不同页面更新节奏不完全一致,别名对应的具体版本以调用时控制台或模型列表返回为准。接入前可以用 SDK 的 client.models.list() 或控制台确认当前可用模型,不要照抄旧文章里的模型名。
如果使用中商起航 AI 网关,模型名以站内模型价格页面为准。网关可能对上游模型名做映射,直接把官方模型名搬过来不一定可用。
四、第一次 curl:先跑通最小请求
先设置环境变量,再发一条最短请求。max_tokens 给小一点,减少等待和干扰。
export MISTRAL_API_KEY="你的密钥"
curl https://api.mistral.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $MISTRAL_API_KEY" \
-d '{
"model": "mistral-large-latest",
"messages": [
{"role": "user", "content": "只回复 OK"}
],
"max_tokens": 32
}'
返回 200,并且 choices[0].message.content 里有内容,说明 Key、Base URL、模型名三项都对。如果返回 401,先查 Key 和请求头;返回 404,先查路径和模型名;返回 402,先查账单状态。
五、Python 调用:Mistral SDK 与 OpenAI SDK
官方 Python SDK 的包名是 mistralai:
pip install mistralai
最小调用示例:
import os
from mistralai.client import Mistral
with Mistral(api_key=os.environ["MISTRAL_API_KEY"]) as client:
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{"role": "system", "content": "你是中文技术助手,回答简洁。"},
{"role": "user", "content": "用三句话解释什么是向量数据库。"},
],
max_tokens=256,
)
print(response.choices[0].message.content)
print(response.usage)
注意导入路径:当前 SDK 文档使用 from mistralai.client import Mistral,部分旧版本写作 from mistralai import Mistral。两者不要混着抄,报 ModuleNotFoundError 时先看安装的 SDK 版本和官方迁移说明。
如果你想复用现有的 OpenAI SDK 代码,可以把 base_url 指向 https://api.mistral.ai/v1,把 api_key 换成 Mistral Key。Mistral 的请求形状与 OpenAI Chat Completions 很接近,社区里这样用得很普遍;但官方文档并没有把 Mistral API 作为“OpenAI 兼容产品”来宣传,参数支持范围、错误结构和扩展字段仍以官方 API 参考为准。上线前用真实请求逐项验证,不要默认所有 OpenAI 参数都生效。
六、流式输出
聊天界面通常需要逐字返回。Mistral SDK 用 client.chat.stream(...),返回的是事件流,正文增量在 chunk.data.choices[0].delta.content:
with Mistral(api_key=os.environ["MISTRAL_API_KEY"]) as client:
stream = client.chat.stream(
model="mistral-large-latest",
messages=[{"role": "user", "content": "写一个读取 CSV 的 Python 示例"}],
)
for chunk in stream:
delta = chunk.data.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
流式响应使用 data-only SSE,最后以 data: [DONE] 结束。工程上要处理三件事:空增量、客户端断开、以及超时重试。不要在每个增量上做数据库写入,先拼接完整文本,结束后再落库。
七、JSON 模式、结构化输出与工具调用
JSON 模式使用 response_format={"type": "json_object"}。官方文档说明,除 codestral-mamba 外的当前模型都支持。开启后输出会被约束为合法 JSON,但 content 里是字符串形式的 JSON,仍需要自己 json.loads()。提示词里要明确写出“返回 JSON 对象”和期望字段,不要只依赖参数。
结构化输出适合字段固定的场景。官方 SDK 提供 client.chat.parse(...),可以直接传入 Pydantic 模型,返回解析后的对象;如果走原始 JSON Schema,需要设置 strict: true,并在对象上设置 additionalProperties: false。字段越严格,模型自由发挥的空间越小,后续校验也越简单。
工具调用使用 tools 数组,tool_choice 可选 auto、any、none,parallel_tool_calls 控制是否允许并行。模型只负责返回工具名和参数,真正执行函数的是你的后端。拿到 tool_calls 后,把 assistant 消息原样追加回消息列表,再追加一条带 tool_call_id 的 tool 消息,然后再次调用模型,直到它给出最终回答。多轮工具调用要循环处理,不能只跑一轮。
八、常见报错与排查
| 报错 | 常见原因 | 处理 |
|---|---|---|
| 400 | 请求体不是合法 JSON,缺少 model 或 messages |
先用 curl 验证最小请求体 |
| 401 | Key 缺失、错误、过期,或与入口不匹配 | 检查 Bearer 头和 Key 来源 |
| 402 | 账单问题:余额、消费上限、付款失败 | 到控制台检查账单和额度 |
| 403 | 账号或工作区没有该模型权限 | 检查工作区、模型权限和套餐 |
| 404 | 路径写错,或模型/资源不存在 | 确认 /v1/chat/completions 和模型名 |
| 422 | JSON 合法但参数值不合法 | 检查类型、枚举值和数组长度 |
| 429 | 超过速率、Token 或并发限制 | 指数退避,读取 Retry-After |
| 500/503 | 服务端异常或暂时过载 | 短暂等待后重试,持续异常看状态页 |
429 不要靠“多建几把 Key”绕过。官方按账号、工作区或套餐维度统计额度,多把 Key 往往共享同一个限制。正确做法是降并发、做指数退避、把批量任务错峰,必要时再考虑更高套餐。
九、从官方迁到网关的检查清单
- 在中商起航 AI 网关创建账号,生成网关 Key,和官方 Key 分开保存。
- 把
base_url改为https://ai.zhongshangqihang.com/v1,同时更换api_key。 - 按站内模型价格重新确认模型名,不要直接沿用官方名称。
- 保留原请求体,先删掉网关不支持的扩展参数,再逐项加回。
- 用同一批真实提示词对比输出、耗时和
usage,观察三到七天。 - 保留官方直连作为备用通道,写好回滚开关。
- 监控 401、429、5xx 和超时,异常时先切通道再排查。
迁移不是“改个地址就完事”。模型映射、参数支持、流式行为和计费口径都可能不同,先用小流量验证,再切生产。
常见问题
Base URL 到底要不要带 /v1?
官方入口要带 /v1,即 https://api.mistral.ai/v1。聊天补全的完整路径是 https://api.mistral.ai/v1/chat/completions。用 OpenAI SDK 时,base_url 写到 /v1 即可,SDK 会自己追加 /chat/completions,不要再手写一遍。
模型名用 -latest 还是固定版本?
快速验证可以用 mistral-large-latest 这类别名,省去查版本号。生产环境更建议用带日期或代数的固定版本名,行为可复现,出问题也容易回滚。无论用哪种,上线前都到官方文档或控制台确认当前可用性。
Mistral API 可以直接用 OpenAI SDK 吗?
请求形状接近,把 base_url 指向 https://api.mistral.ai/v1、换成 Mistral Key 通常可以跑通。但官方没有把它作为 OpenAI 兼容产品来宣传,个别参数和错误结构可能不同。建议先用最小请求验证,再逐项检查项目里用到的扩展参数。
JSON 模式为什么拿到的不是对象?
JSON 模式保证输出是合法 JSON,但返回的 content 是字符串,需要自己解析。先 json.loads(),再做 schema 校验;提示词里明确要求 JSON 和字段结构,能减少空字段和格式漂移。
官方 Key 能配中商起航网关地址吗?
不能。官方 Key 对应 https://api.mistral.ai/v1,网关 Key 对应 https://ai.zhongshangqihang.com/v1。迁移时 Key 和 Base URL 必须成对更换,混用通常会返回 401。
相关阅读:
