你不是在写代码,是在重复搬运适配层

每天,有多少开发者在做这件事?

python
1 2 3 4 5 6 7
# 测试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服务。

看这个对比:

传统方式(伪代码示意):

python
1
# 每个provider一套代码,连参数名都不一致

使用aisuite

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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"}]
)

关键区别:

  1. 所有provider使用同一个client.chat.completions.create方法。
  2. provider在model参数里通过前缀指定(openai:anthropic:google:等)。
  3. 参数名统一(所有model都接受messages,返回结构兼容)。

目前支持的provider:OpenAI、Anthropic、Google Gemini、AWS Bedrock、Azure、Together AI、HuggingFace等。如果你用的不在列表里,那还是自己写胶水。

aisuite code switching AI provider example command line(这里可以放一个终端截图,展示如何用aisuite快速切换model后得到不同输出)

落地三步走:不只是pip install

这东西对开发者意味着什么?不是银弹,但能解决80%的重复劳动。下面是我实际测试后的操作建议:

第一步:环境准备

bash
1 2
pip install aisuite[全部]  # 安装所有provider依赖
# 或者只装需要的:pip install aisuite[openai, anthropic]

注意:每个provider的API key仍需要通过环境变量配置(如OPENAI_API_KEYANTHROPIC_API_KEY)。aisuite不负责鉴权,只是帮你传递。

第二步:写一个通用的评测脚本

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
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实现重试:

python
1 2 3 4 5
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帮你屏蔽了。

两个落地陷阱,我踩过了

  1. 不要指望100%的功能兼容。某些provider特有的参数(比如Anthropic的stop_sequences)在aisuite中可能被简化。如果你的prompt严重依赖某个模型的独有特性,直接用aisuite可能会丢失能力。
  2. 版本更新快,注意锁定依赖。这个项目今天才14000+ stars,难免有breaking change。建议在requirements.txt里锁死版本:aisuite==0.1.0

我的判断:值不值得用?

对于需要对比多个模型、做评测或者构建LLM API网关的场景,值得用。它把最烦人的适配层收归一套接口,让你的业务代码更干净。但如果你的项目只用OpenAI一家,引入aisuite就过度设计了——多一个依赖就是多一个出错点。

另外,Andrew Ng团队做这个项目,目前还是社区驱动的早期阶段。如果你对统一接口有更高的要求(比如流式、异步、预算控制),可能还需要自己封装。但它只花你10分钟pip install,验证成本极低。最好的策略:先在一个非关键脚本里试用,尝到甜头再推广。


总的来说,aisuite解决了一个真实存在但长期被忽视的痛点——API适配的重复劳动。它不会改变AI行业的格局,但能帮你每天省下半小时的胶水代码时间。这半小时,拿去喝杯咖啡或者想一个更好的prompt,它不香吗?