
一、工程核心意图:让多LLM集成变简单
二、工程目录结构:清晰易懂,上手无压力
llm-protocol-adapter/├── core/核心逻辑目录(重点关注)│ ├── adapters/适配器实现(核心中的核心)│ │ ├──__init__.py│ │ ├── base_adapter.py适配器基类(所有适配器的基础)│ │ ├── openai_adapter.pyOpenAI专属适配器│ │ ├── anthropic_adapter.pyAnthropic专属适配器│ │ └── gemini_adapter.pyGemini专属适配器│ ├── constant.py常量定义(不用改,直接用)│ ├── exceptions.py异常定义(统一异常处理)│ ├── llm_adapters.py适配器工厂函数(快速创建适配器)│ ├── llm_client.py统一客户端(对外提供通用接口)│ ├── llm_response.py响应对象(统一三种API的返回格式)│ └── message.py消息对象(统一三种API的请求格式)├── tests/测试用例目录(验证适配效果)│ ├── openai/OpenAI测试用例(四种调用方式全覆盖)│ ├── anthropic/Anthropic测试用例│ └── gemini/Gemini测试用例├── .gitignore├── LICENSE└── README.md
三、快速开始:3步搞定多LLM调用
from core.llm_client import LLMClient1. 创建客户端(自动适配对应厂商,改model和base_url即可切换)client = LLMClient(model="gpt-4o",api_key="your-api-key",替换成你的API密钥base_url="https://api.openai.com/v1",厂商对应接口地址timeout=60)2. 非流式调用(适合短文本回复,直接获取完整结果)response = client.invoke([{"role":"user","content":"你好"}])3. 流式调用(适合长文本、实时回复,逐段获取内容)for chunk in client.stream_invoke([{"role":"user","content":"讲故事"}]):print(chunk, end="")4. 异步调用(适合高并发场景,不阻塞主线程)import asyncioresponse = await client.ainvoke([{"role":"user","content":"你好"}])
四、三大LLM协议差异详解(必看!避坑关键)
1. 消息格式差异(最直观的区别)
| 特性 | OpenAI | Anthropic | Gemini |
|---|---|---|---|
| 消息字段 | messages | messages | contents |
| 消息内容 | content(字符串) | content(字符串或数组) | parts(数组) |
| System Prompt | 放在messages数组中,role为system | 独立的system字段 | system_instruction对象 |
| 角色 | system, user, assistant | user, assistant | user, model |
{"model":"gpt-4o","messages":[{"role":"system","content":"你是一个助手"},{"role":"user","content":"你好"}]}
{"model":"claude-sonnet-4-20250514","max_tokens":1024,"system":"你是一个助手","messages":[{"role":"user","content":"你好"}]}
{"system_instruction": {"parts": [{"text":"你是一个助手"}]},"contents": [{"role":"user","parts": [{"text":"你好"}]}]}
2. 认证方式差异(容易踩坑的点)
| 厂商 | 认证方式 |
|---|---|
| OpenAI | 请求头携带 Authorization: Bearer sk-xxx(sk开头的密钥) |
| Anthropic | 请求头携带 x-api-key: sk-ant-xxx + anthropic-version 头 |
| Gemini | 请求头携带 x-goog-api-key: xxx(直接填密钥,无Bearer前缀) |
3. 必看差异:Anthropic的max_tokens是必填项
| 参数 | OpenAI | Anthropic | Gemini |
|---|---|---|---|
| model | 必填 | 必填 | 必填(在URL路径中) |
| max_tokens | 可选,最大4096 | 必填,最大因模型而异 | 可选,最大因模型而异 |
| messages/contents | 必填 | 必填 | 必填 |
4. 其他关键差异(简要说明)
五、协议对比总结:选对厂商更高效
| 对比项 | OpenAI | Anthropic | Gemini |
|---|---|---|---|
| 设计理念 | 简洁易用,事实标准 | 安全优先,透明可解释 | 多模态集成,Google生态 |
| 学习曲线 | 低(最容易上手) | 中 | 中高(多模态部分较复杂) |
| 适用场景 | 通用聊天、RAG(检索增强生成) | 安全敏感应用(如金融、医疗) | 多模态应用、Google生态集成 |
六、运行测试:快速验证适配效果
1. 设置环境变量(替换成你的API密钥)
exportOPENAI_API_KEY="your-key"exportANTHROPIC_API_KEY="your-key"exportGEMINI_API_KEY="your-key"
2. 运行测试用例(分别测试三个厂商的调用)
python tests/openai/test_invoke.pypython tests/openai/test_stream_invoke.pypython tests/anthropic/test_invoke.pypython tests/gemini/test_invoke.py
最后总结
