从 Anthropic 迁移
保留 Messages SDK,核对模型、思考与 token 估算差异。
保留 Anthropic SDK 和 Messages 请求结构,修改地址、Key、模型 ID,再用新模型验证原提示词。
client = Anthropic(
- base_url="https://api.anthropic.com",
- api_key=os.environ["ANTHROPIC_API_KEY"],
+ base_url="https://api.deepraxis.ai/anthropic",
+ api_key=os.environ["PRAXIS_API_KEY"],
)
-model = "claude-sonnet-4-5"
+model = "deepseek-flash"1. 准备
需要 Python 3.10+、uv 和一个 Praxis Key。在控制台 → API Keys创建 Key,将它安全注入当前终端的 PRAXIS_API_KEY 环境变量;不要把 Key 写进代码或日志。保留原服务的配置与 Key,供回滚使用。以下命令在 macOS / Linux 的 Bash 中执行。
test -n "${PRAXIS_API_KEY:-}"期望:退出码 0;退出码 1 表示变量未设置,先设置再继续。
2. 选择模型
| 原选择 | Praxis 选择 | 要检查什么 |
|---|---|---|
官方 Claude ID,如 claude-sonnet-4-5 | 本例使用 deepseek-flash | 这是另一个模型,不是 Claude 别名;重新评估质量与工具行为 |
| 必须使用 Claude | 从 /anthropic/v1/models 复制可用的 Claude ID | 2026-10-12 目录包含 claude-opus-5;使用前确认所需能力 |
SDK 基础地址只到 /anthropic,不要加 /v1,SDK 会追加 /v1/messages。目录仅列可走 Anthropic 协议的模型,与 /openai/v1/models、/google/v1beta/models 各自独立。
期望:完整模型 ID 出现在 client.models.list();不要未经检查直接沿用官方 ID。
行为差异
thinking可用enabled、adaptive、disabled,并支持output_config.effort。部分模型不能关闭思考,返回400(cannot disable thinking);组合选项前查 Messages 字段支持。- 从
content中读取文本块,不要假定第一块就是正文;推理模型可能先返回思考块。 count_tokens返回带x-praxis-token-count: estimated的校准估算,不是精确计费依据,见 统计 token。- Chat 的
usage.cost是实付金额;Responses 和 Messages 目前不返回该字段。收到X-Praxis-Generation-Id时,可按 生成记录 API 用GET /model/v1/generation?id=生成ID查费用(记录可能延迟几秒)。若响应没有该头,去控制台 → 用量与费用查本次调用;不要把响应正文的id或X-Request-Id当成生成 ID,也不要将缺失费用当成零。
不支持的操作与替代
模型兼容接口提供 Messages、token 统计、模型列表和文件操作,各自限制见 Anthropic API 参考。不提供 Message Batches(/anthropic/v1/messages/batches);改为应用控制并发逐次调用 Messages,或保留原服务的批处理。官方模型 ID、文件 ID 不会自动映射;应选择目录模型,并重新上传需要的源文件。
3. 验证一次请求
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy
uv run -q --no-project --with openai --with anthropic python - <<'PY'
import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.deepraxis.ai/anthropic",
api_key=os.environ["PRAXIS_API_KEY"],
timeout=90.0,
max_retries=0,
)
models = client.models.list()
assert "deepseek-flash" in {m.id for m in models.data}
raw = client.messages.with_raw_response.create(
model="deepseek-flash",
max_tokens=1024,
messages=[{"role": "user", "content": "Reply OK."}],
)
reply = raw.parse()
text = "".join(block.text for block in reply.content if block.type == "text")
print("HTTP", raw.status_code)
print("X-Request-Id:", raw.headers.get("x-request-id"))
print("X-Praxis-Generation-Id:", raw.headers.get("x-praxis-generation-id"))
print(text)
assert raw.status_code == 200 and text and text.strip()
assert raw.headers.get("x-request-id")
PY期望:退出码 0,输出 HTTP 200、非空正文(通常为 OK.)和 X-Request-Id。断言同时检查模型存在与真实回复;不是只检查能否连接。保留请求 ID 便于排查,不要记录 Key。示例会产生少量调用费用。
失败分支
| 实测报错 | 处理 |
|---|---|
400(cannot disable thinking) | 移除关闭思考的要求,或选择目录声明可关闭思考的模型 |
404(anthropic.messages is not offered for …) | 选择 Anthropic 协议目录内且支持所需操作的 ID |
Message Batches 返回 404 Not Found | 逐次调用 Messages,或保留原批处理服务 |
4. 回滚
恢复 https://api.anthropic.com、ANTHROPIC_API_KEY 中的原 Key 和原 Claude 模型 ID,同时恢复原思考选项与文件引用。重启客户端,运行原 Messages 冒烟请求,保留请求 ID。
期望:原服务返回可用正文。修改配置不会搬运文件、历史会话状态,也不会撤销已产生的费用。