如何用 Python 一键切换不同大模型 API
你是否遇到过这样的场景:用 DeepSeek 写代码、用 Claude 做长文分析、用 Gemini 处理多模态,每个平台都要单独申请 Key、适配不同 SDK,切换时还得改一堆代码。其实,只要写一个轻量级的 Python 调度器,就能像换插件一样在不同大模型之间无缝切换。这篇文章就带你从零封装一个“一键切换”的多模型客户端。
## 为什么需要统一调用层
目前主流大模型 API 虽然都遵循类似的 Chat Completions 风格,但细节千差万别: - 请求地址不同,如 `openai.com`、`api.deepseek.com`、`generativelanguage.googleapis.com`; - 鉴权方式不同,有的用 `Authorization: Bearer`,有的用 `x-api-key`; - 消息格式有细微差异,比如 Gemini 需要将 `system` 角色转成 `systemInstruction`; - 流式响应的事件格式也不统一。
如果你同时用到 3 个以上模型,又不希望项目中散落大量 if-else,统一调用层几乎是必选项。
## 设计一个模型路由器
最直接的方式是定义一个统一接口,内部根据 `model` 参数自动拼接 URL、注入鉴权、标准化请求体,并统一返回生成器。下面是一个极简版实现,只依赖 `requests`。
先定义配置字典,集中管理 Key 和 Base URL:
```python MODEL_CONFIG = { "deepseek-chat": { "base_url": "https://api.deepseek.com/v1/chat/completions", "api_key": "your-deepseek-key", "headers": lambda key: {"Authorization": f"Bearer {key}"}, }, "gpt-4o": { "base_url": "https://api.openai.com/v1/chat/completions", "api_key": "your-openai-key", "headers": lambda key: {"Authorization": f"Bearer {key}"}, }, "gemini-1.5-pro": { "base_url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent", "api_key": "your-gemini-key", "headers": lambda key: {}, # Gemini 用 query 参数传 key }, # 更多模型可以继续添加 } ```
然后编写统一调用函数 `chat_completion`:
```python import requests import json
def chat_completion(model: str, messages: list, stream: bool = False): config = MODEL_CONFIG.get(model) if not config: raise ValueError(f"不支持的模型: {model}")
url = config["base_url"] key = config["api_key"] headers = {"Content-Type": "application/json"} headers.update(config["headers"](key))
# 针对 Gemini 的消息格式转换 if model.startswith("gemini"): payload = { "contents": [{"parts": [{"text": msg["content"]}]} for msg in messages], "generationConfig": {"temperature": 0.7}, } if messages and messages[0]["role"] == "system": payload["systemInstruction"] = { "parts": [{"text": messages[0]["content"]}] } url = f"{url}?key={key}" else: payload = { "model": model, "messages": messages, "stream": stream, }
if stream: # 统一处理流式响应 resp = requests.post(url, headers=headers, json=payload, stream=True) for line in resp.iter_lines(): if line: yield line.decode("utf-8") else: resp = requests.post(url, headers=headers, json=payload) return resp.json() ```
只要传不同的 `model`,函数就会自动选择对应的配置,开发者无需关心底层差异。
## 一键切换实战
调用时只需修改 `model` 参数即可:
```python messages = [{"role": "user", "content": "用 Python 写一段快速排序"}]
# 使用 DeepSeek result = chat_completion("deepseek-chat", messages) print(result["choices"][0]["message"]["content"])
# 切换到 GPT-4o,完全相同的调用 result = chat_completion("gpt-4o", messages) print(result["choices"][0]["message"]["content"])
# 切换到 Gemini result = chat_completion("gemini-1.5-pro", messages) print(result["candidates"][0]["content"]["parts"][0]["text"]) ```
如果想更优雅,还可以封装成类,支持动态切换、自动统计 Token 消耗,甚至集成异步调用。核心思想都是“配置驱动 + 适配层”,把变化隔离在字典里。
## 更进一步:流式与错误处理
上面示例中流式返回的是原始 SSE 行,你可以再封装一层解析器,将不同模型的 `data:` 行统一洗成 `delta` 文本。同时,建议为每种模型添加重试逻辑和请求超时,例如:
```python resp = requests.post( url, headers=headers, json=payload, timeout=30, ) resp.raise_for_status() ```
这样,当某个模型暂时不可用时,你可以轻易降级到备用模型,实现“热切换”。
## 从本地密钥到 API 中转
自己管理多套 Key 很麻烦,还会碰到额度用尽、区域限制等问题。对于个人开发者或小团队,使用 API 中转站是更轻量的选择。比如 **TokenPocket API 中转站**([https://tokenpocket.site](https://tokenpocket.site))就聚合了 DeepSeek、Qwen、Claude、Gemini 等主流模型,统一按量计费,不需要逐个申请 Key。新用户注册还有免费额度,很适合快速验证多模型方案。你只需把上面代码里的 `base_url` 全部指向中转站的统一接口,`api_key` 换成平台提供的令牌,就能用一个 Key 调度所有模型,维护成本几乎为零。
大模型 API 的碎片化只是暂时的,但在统一标准到来之前,用一套 Python 调度层优雅地屏蔽差异,正是技术博主的快乐所在。赶紧动手试试吧。