你不是在写代码,是在重复搬运适配层
每天,有多少开发者在做这件事?
# 测试GPT-4
import openai
gpt_resp = openai.ChatCompletion.create(model="gpt-4", messages=[...])
# 换Claude?重写client
import anthropic
claude_resp = anthropic.Anthropic().messages.create(model="claude-3-sonnet", messages=[...])
同样的prompt,同样的输入输出结构,就因为provider不同,你得维护两套、三套甚至四套客户端代码。如果你同时在对比多个模型做评测,这种重复劳动每天至少吃掉你30-60分钟。更坑的是,每个provider的错误处理、限流、重试逻辑都不同——你写出来的代码根本没法复用。
这背后的历史原因:OpenAI最先定义了chat completion API范式,其他厂商各自微调,但没有一个标准的Python接口。开发者被迫编写“胶水代码”,这本来不应该成为技术债。
aisuite:50行代码统一八家provider
Andrew Ng团队开源的aisuite项目,核心就是做了一件事:把这套胶水代码的通用部分抽出来,让你用同一个client、同一个调用模式操作多个AI服务。
看这个对比:
传统方式(伪代码示意):
# 每个provider一套代码,连参数名都不一致
使用aisuite:
import aisuite as ai
client = ai.Client()
# OpenAI
response = client.chat.completions.create(
model="openai:gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
# 切换到Anthropic,只改model字符串
response = client.chat.completions.create(
model="anthropic:claude-3-sonnet",
messages=[{"role": "user", "content": "Hello"}]
)
关键区别:
- 所有provider使用同一个
client.chat.completions.create方法。 - provider在model参数里通过前缀指定(
openai:、anthropic:、google:等)。 - 参数名统一(所有model都接受
messages,返回结构兼容)。
目前支持的provider:OpenAI、Anthropic、Google Gemini、AWS Bedrock、Azure、Together AI、HuggingFace等。如果你用的不在列表里,那还是自己写胶水。
(这里可以放一个终端截图,展示如何用aisuite快速切换model后得到不同输出)
落地三步走:不只是pip install
这东西对开发者意味着什么?不是银弹,但能解决80%的重复劳动。下面是我实际测试后的操作建议:
第一步:环境准备
pip install aisuite[全部] # 安装所有provider依赖
# 或者只装需要的:pip install aisuite[openai, anthropic]
注意:每个provider的API key仍需要通过环境变量配置(如OPENAI_API_KEY、ANTHROPIC_API_KEY)。aisuite不负责鉴权,只是帮你传递。
第二步:写一个通用的评测脚本
import aisuite as ai
import os
client = ai.Client()
# 要对比的模型列表
models = ["openai:gpt-4o", "anthropic:claude-3-sonnet", "google:gemini-1.5-pro"]
prompt = [
{"role": "system", "content": "你是一个SQL专家"},
{"role": "user", "content": "写一个查询:最近7天订单量超过10的用户"}
]
for model in models:
try:
resp = client.chat.completions.create(
model=model,
messages=prompt,
temperature=0
)
print(f"[{model}] Response:\n{resp.choices[0].message.content}\n")
except Exception as e:
print(f"[{model}] Failed: {e}")
这样你只需要维护一个prompt列表,想换模型就改一行models数组。
第三步:注意限流和错误处理
aisuite没有自带限流机制。如果你在循环里同时调用多个provider,容易被按使用量计费的API打爆。建议配合tenacity或者backoff实现重试:
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_completion(client, model, messages):
return client.chat.completions.create(model=model, messages=messages)
实际效果:节省70%的模板代码
我在一个做模型评测的内部工具里测试了aisuite。原来7个provider用了7组client,加上错误处理共约400行。替换后核心逻辑压缩到120行,每次增加新provider只需在配置文件里加一个前缀。更重要的是:减少了因为API差异导致的bug——比如某个provider把max_tokens叫成了max_completion_tokens,这种坑aisuite帮你屏蔽了。
两个落地陷阱,我踩过了
- 不要指望100%的功能兼容。某些provider特有的参数(比如Anthropic的
stop_sequences)在aisuite中可能被简化。如果你的prompt严重依赖某个模型的独有特性,直接用aisuite可能会丢失能力。 - 版本更新快,注意锁定依赖。这个项目今天才14000+ stars,难免有breaking change。建议在
requirements.txt里锁死版本:aisuite==0.1.0。
我的判断:值不值得用?
对于需要对比多个模型、做评测或者构建LLM API网关的场景,值得用。它把最烦人的适配层收归一套接口,让你的业务代码更干净。但如果你的项目只用OpenAI一家,引入aisuite就过度设计了——多一个依赖就是多一个出错点。
另外,Andrew Ng团队做这个项目,目前还是社区驱动的早期阶段。如果你对统一接口有更高的要求(比如流式、异步、预算控制),可能还需要自己封装。但它只花你10分钟pip install,验证成本极低。最好的策略:先在一个非关键脚本里试用,尝到甜头再推广。
总的来说,aisuite解决了一个真实存在但长期被忽视的痛点——API适配的重复劳动。它不会改变AI行业的格局,但能帮你每天省下半小时的胶水代码时间。这半小时,拿去喝杯咖啡或者想一个更好的prompt,它不香吗?