# 从 Anthropic 迁移 (/docs/cookbook/migration/from-anthropic)



保留 Anthropic SDK 和 Messages 请求结构，修改地址、Key、模型 ID，再用新模型验证原提示词。

```diff
 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. 准备 [#1-准备]

需要 Python 3.10+、[uv](https://docs.astral.sh/uv/getting-started/installation/) 和一个 Praxis Key。在[控制台 → API Keys](https://console.deepraxis.ai/keys)创建 Key，将它安全注入当前终端的 `PRAXIS_API_KEY` 环境变量；不要把 Key 写进代码或日志。保留原服务的配置与 Key，供回滚使用。以下命令在 macOS / Linux 的 Bash 中执行。

```bash
test -n "${PRAXIS_API_KEY:-}"
```

期望：退出码 0；退出码 1 表示变量未设置，先设置再继续。

## 2. 选择模型 [#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 字段支持](/docs/api/compatible/anthropic/createMessage)。
* 从 `content` 中读取文本块，不要假定第一块就是正文；推理模型可能先返回思考块。
* `count_tokens` 返回带 `x-praxis-token-count: estimated` 的校准估算，不是精确计费依据，见 [统计 token](/docs/api/compatible/anthropic/countTokens)。
* Chat 的 `usage.cost` 是实付金额；Responses 和 Messages 目前不返回该字段。收到 `X-Praxis-Generation-Id` 时，可按 [生成记录 API](/docs/api/native/model/getGeneration) 用 `GET /model/v1/generation?id=生成ID` 查费用（记录可能延迟几秒）。若响应没有该头，去[控制台 → 用量与费用](https://console.deepraxis.ai/usage)查本次调用；不要把响应正文的 `id` 或 `X-Request-Id` 当成生成 ID，也不要将缺失费用当成零。

## 不支持的操作与替代 [#不支持的操作与替代]

模型兼容接口提供 Messages、token 统计、模型列表和文件操作，各自限制见 [Anthropic API 参考](/docs/api/compatible/anthropic)。不提供 Message Batches（`/anthropic/v1/messages/batches`）；改为应用控制并发逐次调用 Messages，或保留原服务的批处理。官方模型 ID、文件 ID 不会自动映射；应选择目录模型，并重新上传需要的源文件。

## 3. 验证一次请求 [#3-验证一次请求]

```bash
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. 回滚 [#4-回滚]

恢复 `https://api.anthropic.com`、`ANTHROPIC_API_KEY` 中的原 Key 和原 Claude 模型 ID，同时恢复原思考选项与文件引用。重启客户端，运行原 Messages 冒烟请求，保留请求 ID。

期望：原服务返回可用正文。修改配置不会搬运文件、历史会话状态，也不会撤销已产生的费用。

[API 参考 →](/docs/api/compatible/anthropic) · [兼容指南 →](/docs/cloud/services/model/guides/anthropic-compatible)
