GET /v1/models列出当前账号可见模型,再按偏好顺序挑选默认值(例如 mistral-small-latest)。部署前把「默认模型」写进配置,而不是写死过期 ID。
先看清成品
- mock 返回列表并 pick 到 mistral-small-latest。
- 2 项 pytest 通过。
合规提醒:面向用户的助手原名 Le Chat,官方称已更名为 Vibe(入口与账号保留,以官网公告为准);开发调用走 Mistral API(Studio 管理密钥)。密钥勿入库;生成内容需人工审,避免违法与侵权输出。免费额度与价格以 Studio/官网为准,本文不编造。
运行说明:无正式
MISTRAL_API_KEY。A/B 用本地 mock;对官方api.mistral.ai无效密钥实测 HTTP 401。C 为文档粘贴体积守卫。2026-10-23(Asia/Shanghai)pytest 通过。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
pick_model.py |
模型选择 |
mock_mistral.py |
假服务 |
test_104b.py |
测试 |
需要准备哪些环境?
| 项目 | 说明 |
|---|---|
| Python | 3.10+ |
| 环境变量 | MISTRAL_API_KEY |
关键事实
| 事实 | 来源 |
|---|---|
| 模型 ID 与别名(*-latest)以 Models 文档为准 | 官方 |
| 账号可见集合随套餐变化 | 实践 |
| 挑选逻辑在客户端,不保证该模型适合所有任务 | 重要 |
文件结构
104-mistral-le-chat-B-src/
├── pick_model.py
├── mock_mistral.py
└── test_104b.py
第 1 步:选择脚本
#!/usr/bin/env python3
"""List Mistral models and pick a default by preference order."""
from __future__ import annotations
import argparse, json, os, sys, urllib.error, urllib.request
PREFER = ["mistral-small-latest", "open-mistral-nemo", "mistral-large-latest"]
def list_models(base, key):
req = urllib.request.Request(
f"{base.rstrip('/')}/v1/models",
headers={"Authorization": f"Bearer {key}"},
method="GET",
)
try:
with urllib.request.urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
raise SystemExit(f"HTTP {e.code}: {e.read().decode(errors='replace')}") from e
def pick(ids: list[str], prefer: list[str]) -> str | None:
for p in prefer:
if p in ids:
return p
return ids[0] if ids else None
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--base", default=os.environ.get("MISTRAL_BASE_URL", "https://api.mistral.ai"))
ap.add_argument("--key", default=os.environ.get("MISTRAL_API_KEY", ""))
ap.add_argument("--prefer", nargs="*", default=PREFER)
args = ap.parse_args(argv)
if not args.key:
print("设置 MISTRAL_API_KEY", file=sys.stderr); return 2
data = list_models(args.base, args.key)
ids = [m.get("id") for m in (data.get("data") or []) if m.get("id")]
choice = pick(ids, args.prefer)
print(json.dumps({"models": ids, "picked": choice}, ensure_ascii=False, indent=2))
return 0 if choice else 1
if __name__ == "__main__":
raise SystemExit(main())
第 2 步:测试
import subprocess, sys, time
from pathlib import Path
from pick_model import pick
HERE = Path(__file__).resolve().parent
def test_pick():
assert pick(["x", "mistral-small-latest"], ["mistral-small-latest"]) == "mistral-small-latest"
def test_cli():
port = 19105
proc = subprocess.Popen([sys.executable, str(HERE/"mock_mistral.py"), "--port", str(port)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
try:
time.sleep(0.3)
r = subprocess.run([sys.executable, str(HERE/"pick_model.py"), "--base", f"http://127.0.0.1:{port}", "--key", "mistral-test-key"], capture_output=True, text=True, check=True)
assert "mistral-small-latest" in r.stdout
finally:
proc.terminate(); proc.wait(timeout=5)
第 3 步:运行
$ pytest pick_model
.. [100%]
2 passed in 0.41s
怎么检查结果?
- JSON 含 models 与 picked。
- picked 落在 prefer 列表中。
调试示例
prefer 全是下架 ID。 pick 会退回列表第一项或失败。定期对照 Models Overview 更新 prefer。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 只要 large | 改 --prefer | 注意成本 |
| 列表为空 | 401/权限 | 检查密钥 |
| 开源权重本地跑 | 另见自托管文档 | 本篇走托管 API |
模板规则
- 默认模型可配置。
- 贵模型勿用于琐碎任务。
- 变更写进变更日志。
项目资源
| 用途 | 地址 |
|---|---|
| Models Overview(官方) | https://docs.mistral.ai/getting-started/models/models_overview |
| API 参考(官方) | https://docs.mistral.ai/api/ |
| Docs 首页(官方) | https://docs.mistral.ai/ |
选得到的模型,才是默认模型。