Anthropic 风格 API 对接开源模型:vLLM 与 LiteLLM 兼容层实战 📅 发布时间:2026/8/28 1:42:09 👁 浏览次数: 实际在 AI 应用开发中Anthropic 风格消息接口和开源模型自部署经常会同时出现在一个项目里。团队先用 Anthropic 模型验证效果打磨完提示词和业务流程后再评估是否把推理服务迁移到本地开源模型也有的团队因为调用成本、数据合规、私有化交付等原因必须把模型服务部署在自己环境里同时希望业务侧保留原来的代码结构尽量少改 SDK 调用。这两个诉求叠加后技术点就落在了 API 兼容层用 Anthropic Messages API 的调用格式去访问背后由开源模型提供的推理服务并且把连接、路由、错误处理这条链路彻底弄清楚。这篇文章围绕一条主线展开当业务代码已经习惯使用 Anthropic Messages API 时如何在自部署开源模型的环境中复用这套调用方式当接口出现无法连接、404、401、模型名不匹配、显存不足等错误时应该按什么顺序排查。文章以 vLLM 作为开源模型推理服务以 LiteLLM 作为兼容接入层给出一个可在本地机器上复现的最小结构并单独说明学习环境与生产环境的差异。前两章先解决概念问题中间三章进入实现与验证最后一章讨论生产化落地。1. 先想清楚为什么要把 Anthropic 风格调用和开源模型打通1.1 托管 API 与自部署模型在项目里的不同位置在 AI 应用里Anthropic 这类托管 API 提供的是“已经训练好的模型 远程推理服务”调用方只需要组织好 messages 数组、设置模型名、传入 API Key就能拿到模型输出。优点是上手快、不需要 GPU 和模型运维缺点是每一次请求都会携带业务数据离开自己的环境成本也随调用量线性增长。开源模型则相反。模型权重可以下载到自己的服务器或本地开发机上由推理框架加载并对外提供接口。数据不离开内网单次调用成本主要取决于服务器电费和硬件折旧还能针对业务场景做微调。缺点同样明显需要准备 GPU、维护推理服务、处理并发和显存并且模型效果不一定能达到商业 API 的同等水平尤其在复杂指令遵循、长文档理解和工具调用场景。注意这里不能用“开源一定更强”或“开源一定更差”这种结论实际项目必须按场景验证。所以实际项目里并不是“二选一”而是“按场景切换”。早期的效果验证放在托管 API 上数据敏感或高频生产调用放到本地模型是很多团队的路线图。既然要在不同阶段切换后端业务代码就不应该绑死在某一种协议格式上。1.2 兼容层要解决的不是“改代码”而是“协议转换”切换后端时会遇到一个现实问题Anthropic 的官方 SDK 默认把请求发到api.anthropic.com消息格式是/v1/messages风格而 vLLM、Ollama 这类开源推理框架默认提供的是 OpenAI 兼容接口/v1/chat/completions。如果直接换后端客户端代码要么改 SDK要么改网络地址要么在业务层做适配。真正的兼容层应该在 SDK 和推理框架之间再增加一个接入服务它接收 Anthropic Messages 格式的请求转换成 OpenAI Chat Completions 格式转发给 vLLM再把 vLLM 的返回结果转换成 Anthropic 消息格式。对外客户端看到的还是一个 Anthropic 风格接口对内实际处理请求的是开源模型。整条链路的组件顺序是客户端 - 兼容接入层 - 开源推理服务 - 模型。在这个结构里业务代码基本不用动。切换模型时只需要修改接入层的路由配置而不是重写一层请求组装逻辑。后面的部署环节会用一个具体案例把这套链路跑起来。2. 先看懂两个协议差异后面排错才有的放矢2.1 Anthropic Messages API 的请求语义Anthropic Messages API 的典型请求对象包含model、messages、max_tokens等字段。它的消息数组描述的是用户和助手之间的对话内容system提示词一般放在顶层不混在 messages 数组里。max_tokens是必填参数客户端如果不传请求会直接报错。响应体也不是简单的choices结构而是多级结构content数组里每个元素带type文本元素的值在text字段。这种设计对最终用户是友好的返回内容可以包含文本块、工具调用块、思考块等多个类型客户端根据type分支处理即可。但正因为消息结构和返回结构与 OpenAI 协议不同做兼容层时必须双向转换不能只改一个请求路径。下面是一个典型的 Anthropic 风格请求体{ model: claude-3-5-sonnet-latest, max_tokens: 1024, system: 你是一个数据助手。, messages: [ {role: user, content: 用一句话介绍开源协议} ] }注意system在顶层max_tokens必须显式给出。2.2 OpenAI 风格接口的请求语义OpenAI Chat Completions 的接口把system提示词放在 messages 数组首条消息中messages是[{role, content}]形式。max_tokens不是必填而是有默认值。响应结构是choices[0].message.content流式场景下则是choices[0].delta。vLLM 提供的 OpenAI 兼容 API 基本沿用了这套结构。同一个对话在 OpenAI 风格请求里通常写成这样{ model: qwen2.5-7b-instruct, messages: [ {role: system, content: 你是一个数据助手。}, {role: user, content: 用一句话介绍开源协议} ] }于是同一个语义两种协议里的 JSON 结构不同但表达的是同一个对话。兼容层要做的就是在两者之间做映射。2.3 用表格快速对比两种协议对比项Anthropic Messages APIOpenAI Chat Completions请求端点POST /v1/messagesPOST /v1/chat/completions认证方式x-api-key anthropic-versionAuthorization: Bearersystem 提示词顶层 system 字段messages 数组中 rolesystem 的首条消息max_tokens必填可选messages 结构用户与助手交替可包含 system/user/assistant响应文本位置content[].textchoices[0].message.content流式事件content_block_delta 等choices[0].delta这张表在后面排错时非常有用。看到404时先确认端点看到401时先确认认证方式看到max_tokens报错时先确认是不是 Anthropic 风格请求缺少必填参数。2.4 为什么错误信息容易误导有时客户端明明收到了一个错误提示但从提示本身很难判断是哪一层出的问题。比如请求一直超时可能是外层网络问题也可能是本地推理服务并发太高返回 401可能是 API Key 不对也可能是网关转发时没有把 Key 正确带给后端返回 model not found往往是客户端、网关、推理服务三处的模型名不一致。所以遇到错误时不要先改业务代码要先确定请求到底停在哪个环节。后面第 5 章会给一套具体的排查路径。在此之前先把环境搭起来。3. 环境准备三台“逻辑组件”只需要一台机器也能跑通3.1 组件划分整套链路分成三个逻辑组件客户端可以是 Anthropic 官方 SDK、OpenAI SDK也可以是 curl。客户端只发 Anthropic 格式请求。接入层使用 LiteLLM 启动一个本地接入服务负责协议转换和模型路由。推理服务使用 vLLM 加载开源模型对外暴露 OpenAI 兼容接口。学习阶段这三个组件可以全部放在一台带 GPU 的 Linux 开发机上。生产环境则需要把推理服务和接入层拆分部署甚至推理服务本身再分成多个副本。不要在一开始就追求复杂架构先最小闭环再逐步扩展。3.2 学习环境需要准备什么下面是学习环境的最小清单先在本地验证再对标生产环境扩展。项目学习环境建议说明操作系统Ubuntu 22.04 或类似 Linux 发行版Windows 可以通过 WSL 或容器但 GPU 透传要看驱动支持GPU显存建议不小于 16GB7B 模型在 FP16 下通常需要 14GB 到 16GB 显存Python3.10 或 3.11vLLM 和 LiteLLM 对 Python 版本有要求安装前先看官方说明推理框架vLLM启动时加载模型权重并对外提供 OpenAI 兼容 API接入层LiteLLM接收 Anthropic 格式请求并转发到 OpenAI 兼容端点模型权重Qwen2.5-7B-Instruct 等开源模型具体名称、版本和序列长度以模型卡为准模型可以换成其他开源模型例如 Llama 系列、DeepSeek 系列、Qwen 系列。在实际项目中应根据硬件显存、业务语言、工具调用能力来选择。版本不要照搬公告里的性能数字要以当前官方发布为准。3.3 生产环境需要额外关注什么生产环境不是简单多加一台机器。至少要额外考虑多个模型副本用负载均衡把请求分发到多个 vLLM 实例避免单点故障。网关鉴权和限流接入层要校验调用方身份并设置每分钟请求数、Token 数上限。日志与监控记录每次请求的模型名、耗时、Token 数、错误码并配置告警。模型版本管理权重文件和接入层配置一起发布记录每次模型切换的变更。网络边界推理服务只对内网开放接入层才对外提供接口接口本身要加认证。这些在后续第 6 章会落到可执行清单。4. 从零跑通vLLM 加 LiteLLM 组成本地 Anthropic 兼容服务4.1 安装依赖建议使用独立的 Python 虚拟环境避免系统环境被污染。以 Linux 为例python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install vllm litellm这里没有固定版本号是因为 vLLM 更新较快不同版本的启动参数和模型支持有差异。安装完成后使用vllm --version和litellm --version确认版本。如果机器显存有限也可以先使用远程推理服务验证接入层逻辑但那样就不是“自部署开源模型”了数据仍会出网本文以本地自部署为主。注意如果安装依赖时出现编译或 CUDA 相关错误先检查 Python 版本、NVIDIA 驱动和 CUDA 工具链是否满足当前 vLLM 版本要求不要盲目升级系统包。4.2 准备模型权重模型权重可以放在固定目录比如/data/models。以 Qwen2.5-7B-Instruct 为例先确认能从模型仓库获取对应权重并检查授权协议。如果已经安装了huggingface-cli可以直接下载huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir /data/models/Qwen2.5-7B-Instruct也可以根据团队情况使用其他模型平台或离线传输方式。把权重下载到本地后建议先验证目录中包含config.json、权重文件等核心文件再启动服务避免启动时报“权重不存在”。4.3 启动 vLLM 推理服务使用以下命令启动vllm serve Qwen/Qwen2.5-7B-Instruct \ --served-model-name open-model-7b \ --host 127.0.0.1 \ --port 8000 \ --api-key local-key-123 \ --max-model-len 8192关键参数解释Qwen/Qwen2.5-7B-Instruct模型标识如果已经把权重下载到本地可以替换成本地目录路径。--served-model-name open-model-7b对外暴露的模型名。客户端和接入层看到的都是这个名字建议取一个稳定、跟业务相关的名称而不是直接用权重文件夹名。--host 127.0.0.1只在本机监听。生产环境如果要被其他机器访问需要改成0.0.0.0同时用防火墙或安全组限制来源 IP。--api-key local-key-123为 OpenAI 兼容接口设置访问 Key防止无授权访问。如果 vLLM 版本较老不支持该参数可以省略但生产环境必须通过其他方式鉴权。--max-model-len 8192限制输入加输出的最大 Token 数。显存不足时可以调小。启动成功后终端会显示监听地址并提示模型就绪。用另一个终端验证curl http://127.0.0.1:8000/v1/models返回 JSON 中可以看到模型名为open-model-7b。如果这一步返回不出模型后面的接入层一定会跟着报错所以这是第一个检查点。4.4 配置 LiteLLM 接入层LiteLLM 通过一个 YAML 文件声明模型路由。创建config.yamlmodel_list: - model_name: claude-style-open litellm_params: model: openai/open-model-7b api_base: http://127.0.0.1:8000/v1 api_key: local-key-123解释几个字段model_name: claude-style-open接入层对外暴露的模型名客户端传入这个名称。取这个名字是为了让客户端不感知后端是开源模型也可以改成其他别名但注意不要与真实模型名混淆。model: openai/open-model-7bopenai/前缀告诉 LiteLLM这个模型走 OpenAI 兼容协议。后面的open-model-7b要和 vLLM 的--served-model-name严格一致。api_base指向 vLLM 的地址。api_key