想把本地部署的 OpenAI 兼容模型(如 vLLM、Ollama、LocalAI 等)转换成 Anthropic API 格式向外提供,最好的方法是使用 LiteLLM 的代理服务器(Proxy Server)。它能自动处理不同 API 之间的格式转换,让你已经支持 OpenAI 协议的本地模型,也能被设计为调用 Claude API 的工具(例如 Claude Code 等)所使用。

⚙️ 工作原理

整个流程可以简化为:客户端(期望 Anthropic 格式) ↔ LiteLLM 代理 ↔ 本地模型(OpenAI 格式)。LiteLLM 在中间充当一个智能翻译官和路由网关的角色。

接收请求:LiteLLM 代理启动后,会提供一个 ANTHROPIC_BASE_URL(通常是 http://localhost:4000)。支持 Anthropic API 的客户端可以通过这个地址向 LiteLLM 发送请求。

实时转换:收到客户端的 Anthropic 格式请求(如 POST /v1/messages)后,LiteLLM 会根据你预先配置好的路由规则,将请求参数、消息结构等实时转换为标准的 OpenAI Chat Completions 格式。例如,Anthropic 的 max_tokens 参数会被映射为 OpenAI 的 max_completion_tokens,tools 也会被转换成对方需要的格式。

转发并返回:转换完成后,LiteLLM 将新的请求转发给你指定的、运行在本地且兼容 OpenAI 协议的模型服务。

结果返回:本地模型返回 OpenAI 格式的结果后,LiteLLM 会再次进行逆向转换,将结果封装回 Anthropic 期望的消息格式,最终返回给客户端。

🛠️ 具体操作步骤

可以通过以下步骤实现这种格式转换。

步骤 1:确保本地模型服务正常运行

这是基础,你的本地服务(如 vLLM、Ollama 等)需要能通过 OpenAI 兼容的 API 端点和格式(例如 http://localhost:8000/v1)被访问。

步骤 2:安装并配置 LiteLLM 代理

安装 LiteLLM: 推荐安装带 Proxy 依赖的版本,确保获取全部功能。

pip install 'litellm[proxy]'

创建 config.yaml 配置文件: 创建一个配置文件,用于告诉 LiteLLM 本地模型在哪里,以及它应该以什么名字暴露给客户端。你需要定义 model_list 部分,其中包括一个对客户端可见的 model_name 以及实际后端模型服务的具体信息。可以参考以下示例:

示例:使用 vLLM

model_list:
  # 这是我们自己定义的名字,客户端通过这个名字来请求
  - model_name: my-local-model
    litellm_params:
      # LiteLLM 调用后端的格式:openai/<模型部署名>
      model: openai/Qwen/Qwen2.5-7B-Instruct
      # 你本地 OpenAI 兼容服务的地址
      api_base: http://localhost:8000/v1
      api_key: dummy  # 如果本地服务需要 API Key,请填写,否则随意
      # 可选:如果需要指定 API 版本
    # api_version: "2024-02-15-preview"

示例:使用 Ollama

model_list:
  - model_name: llama3-local
    litellm_params:
      # Ollama 的模型名
      model: ollama/llama3
      api_base: http://localhost:11434

还可以利用 LiteLLM 的通配符路由,避免为单个模型重复配置,例如直接指定 model: openai/*,它会自动将客户端发来的模型名映射过去。

步骤 3:启动 LiteLLM 代理

使用上一步创建的配置文件启动代理服务器。

litellm --config /path/to/your/config.yaml --port 4000

成功启动后,你会看到类似 Proxy Server: Running on http://0.0.0.0:4000 的信息。

步骤 4:配置并测试客户端

现在,你的客户端(如一个原本为 Claude 设计的代码)只需要将 API 端点指向 LiteLLM 代理即可。

环境变量配置:对于支持 Anthropic API 的工具,通常可以通过设置环境变量来指定 API 地址和密钥。

# 将请求地址指向 LiteLLM 代理
export ANTHROPIC_BASE_URL="http://localhost:4000"
# 使用你在启动代理时设置的 master key,默认是 "sk-1234"
export ANTHROPIC_API_KEY="sk-1234" 

命令行测试:也可以用 curl 直接测试 LiteLLM 代理的格式转换功能是否正常。

curl -X POST http://localhost:4000/v1/messages \
  -H "Authorization: Bearer sk-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "my-local-model",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Hello, local model!"}]
  }'

成功的话,你会收到一个 Anthropic 格式的 JSON 响应。

⚠️ 局限性与说明

需要注意的是,Anthropic 和 OpenAI 的 API 并非完全相同,格式转换也存在局限性:

/v1/messages 端点:LiteLLM 官方文档详细说明了该转换过程,但 Anthropic 的一些独特功能,如提示缓存(Prompt Caching) 和扩展思考(Extended Thinking),在转换中会受限或不被支持。

最佳实践:对于格式转换,LiteLLM 官方文档中推荐的做法是直接使用标准 Anthropic SDK 并指向 LiteLLM 代理(如 /v1/messages 端点)。在上面的示例中,就已经展示了通过 curl 访问 /v1/messages 的成功方式。这说明在正确的配置下,此路径是官方支持和鼓励使用的。

💎 总结

核心配置:核心在于通过 LiteLLM 的 config.yaml 文件,将你本地运行的服务定义为 OpenAI 格式的后端。

关键操作:客户端侧的配置非常简洁,只需要修改 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY 这两个环境变量。

格式转换:LiteLLM 会自动处理从 openai/chat/completions 到 /v1/messages 的请求和响应转换。

如果你想了解 LiteLLM 更高级的负载均衡或异常处理机制,我可以继续为你介绍。

LiteLLM 官方文档/v1/messages的说明

🌐 /v1/messages 端点官方参考

这是最核心的文档,介绍了该端点作为 Anthropic 兼容接口的能力。

  • 官方核心文档:Anthropic | liteLLM
    • 链接:https://docs.litellm.ai/docs/providers/anthropic
    • 核心信息:LiteLLM 将所有 Anthropic 模型的路由前缀统一为 anthropic/。同时,它明确支持 /v1/messages/chat/completions 两个端点,相当于在 LiteLLM 内部提供了一个“透传 (passthrough)”通道,让完全按照 Anthropic 格式构建的请求可以通过。

🔄 参数映射与格式转换详解

当你通过 /v1/messages 端点请求非 Anthropic 的模型(例如 OpenAI、Azure、本地部署的模型)时,LiteLLM 会自动转换格式。这份参数映射文档极为关键:

  • 官方映射文档:v1/messages → /responses Parameter Mapping
    • 链接:https://docs.litellm.ai/docs/anthropic_unified/messages_to_responses_mapping
    • 核心信息:该文档详细说明了 LiteLLM 如何将 /v1/messages 的请求参数映射为 OpenAI Responses API 的格式。映射表(Request: Anthropic → Responses API)展示了 max_tokens 等字段的对应关系,并说明了不支持 stop_sequencestop_k 等特定参数的“静默丢弃 (Dropped silently)”行为,这对调试非常有用。

🚀 性能与技术说明

  • 性能报告:在 v1.72.2-stable 版本中,/v1/messages 端点的代理开销已降至 50ms,单实例可处理 250 RPS。近期版本(v1.87.0)在提升流式响应吞吐量的同时,也将首字节时间(TTFT)的开销降低了约 90%
  • 路由更新:从 v1.82.0 版本开始,/v1/messages 请求默认被路由至 OpenAI 的 /responses API。如需保持使用旧版 /chat/completions 路径,可通过设置环境变量 LITELLM_USE_CHAT_COMPLETIONS_URL_FOR_ANTHROPIC_MESSAGES=true 来切换。

这篇文章基于Deepseek对话总结整理而成。