想把本地部署的 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_sequences、top_k等特定参数的“静默丢弃 (Dropped silently)”行为,这对调试非常有用。
🚀 性能与技术说明
- 性能报告:在
v1.72.2-stable版本中,/v1/messages端点的代理开销已降至 50ms,单实例可处理 250 RPS。近期版本(v1.87.0)在提升流式响应吞吐量的同时,也将首字节时间(TTFT)的开销降低了约 90%。 - 路由更新:从
v1.82.0版本开始,/v1/messages请求默认被路由至 OpenAI 的/responsesAPI。如需保持使用旧版/chat/completions路径,可通过设置环境变量LITELLM_USE_CHAT_COMPLETIONS_URL_FOR_ANTHROPIC_MESSAGES=true来切换。
这篇文章基于Deepseek对话总结整理而成。