aisuite:Andrew Ng 的 LLM 统一调用库
如果你的项目里同时对接了 OpenAI、Anthropic、Google 三家 API,代码大概率长这样:每个 SDK 一套参数格式,命名风格不同,错误处理各写各的,换模型要改 import 语句。更麻烦的是,想对比同一个 prompt 在不同模型下的输出质量,你得手动切代码、改配置、盯着 API 返回格式差异。有没有一个库能让所有 LLM 的调用接口统一起来,换行代码就切换供应商?
Andrew Ng 团队开源的 aisuite 就是干这个的。项目在 GitHub 上有 15,700+ stars,定位是 LLM 调用的轻量抽象层——上层统一 Chat Completions 接口和 Agents API,下层对接 OpenAI、Anthropic、Google、Mistral、Hugging Face、AWS Bedrock、Cohere、Ollama、OpenRouter、Requesty 等十余个供应商。模型名一律用 <provider>:<model-name> 格式:改冒号前的名字就换供应商,冒号后不改,连参数都不用动。
两个核心层
aisuite 分两层设计,两层解决不同粒度的问题。
Chat Completions API 是所有操作的基础。它把各供应商的 SDK 差异消化掉,暴露一个 OpenAI 风格的 client.chat.completions.create(Model=modeL, Messages=MessagES)。streaming、工具调用、异步都原生支持,连流式返回的 chunk 结构在各供应商之间也是统一的:
import aisuite as ai
client = ai.Client()
models = ["openai:gpt-4o", "anthropic:claude-3-5-sonnet-20240620"]
messages = [
{"role": "system", "content": "用一句话回答。"},
{"role": "user", "content": "Python 3.13 有什么新特性?"},
]
for model in models:
response = client.chat.completions.create(
model=model, messages=messages, temperature=0.7
)
print(model, "→", response.choices[0].message.content)
两行换一个供应商,响应结构完全一致。这意味着你可以把模型选择做成环境变量或配置文件,不用改一行业务代码就在 GPT-4o 和 Claude 之间自由切换。想要流式输出?加一行 stream=True,循环逻辑完全一样。
Agents API 是更高层的抽象。它支持把普通 Python 函数作为工具传给模型,自动生成 JSON Schema、执行多轮调用、把结果喂回模型。配合 max_turns 参数可以做限定步数的工具调用循环——不需要自己写 while 循环:
def search_knowledge(query: str):
\"\"\"搜索知识库\"\"\"
return db.search(query)
response = client.chat.completions.create(
model="openai:gpt-4o",
messages=[{"role": "user", "content": "查询昨天的热门文章"}],
tools=[search_knowledge],
max_turns=3
)
Agents API 还内置了 file、git、shell 等现成的 Toolkits,以及 MCP 协议对接支持。这意味着一行代码就可以让模型读取本地文件或执行 shell 命令,不依赖任何三方 Agent 框架。
白物集项目的实际关联
aisuite 的设计思路和白物集内容管线高度吻合。白物集每天有早报生成、热点深度文章、知识卡片采集、Skill 推荐等多条内容管线,每条管线对模型的要求不同:
- 早报生成(08:00 ECS cron)用 DeepSeek,因为成本优先——每天一篇,量不大但长期跑,成本敏感
- 热点深度文章(09:00/17:00 agent cron)需要长篇叙事和结构化输出,理想选择是 GPT-4o 或 Claude Sonnet
- 知识卡片摘要(07:00 agent cron)短文本,用 Claude Haiku 性价比最高
- 建站系列教程(09:30 agent cron)技术教程,DeepSeek 足以胜任
目前每条管线各自硬编码了模型和 API key——早报走 ECS 上的 generate-morning-digest.cjs,热点文章走 Hermes Agent 里配置的 DeepSeek 模型。切换模型需要改多处配置,不能动态调整。
如果引入 aisuite 的抽象层,内容管线的模型选择可以降维成一行 YAML 配置:
# content-pipeline-models.yaml
morning_digest_model: "deepseek:deepseek-chat"
hot_article_model: "openai:gpt-4o"
card_summary_model: "anthropic:claude-3-5-sonnet-20240620"
tutorial_model: "deepseek:deepseek-chat"
管线代码里统一写 client.chat.completions.create(model=config[key], ...),供应商切换不需要改 import 路径,不需要装不同版本的 SDK 适配。这是 aisuite 最实在的价值——它做的不多,但做的恰好是你最常重复写的那段胶水代码。
适合什么场景,不适合什么场景
适合: - 项目对接多个 LLM 供应商,希望统一调用接口 - 写原型需要快速切换模型对比效果、选型 - 需要把模型选择做成用户可配置项的 SaaS 平台 - 团队维护多条 AI 管线,不想每条都写一套适配
不适合:
- 只用一个供应商一个模型——直接装 SDK 更轻量
- 需要深度利用某个供应商特有参数(如 Anthropic 的 thinking、Google 的 grounding),抽象层抹平了差异
- 极端延迟敏感场景(抽象层带来约微秒级开销,通常可忽略不计)
快速上手
第一步:安装
pip install 'aisuite[all]'
如果只用某个供应商的模型,可以只装对应的 extras。
第二步:设置 API Key
aisuite 按环境变量读取密钥,命名规则是 <PROVIDER>_API_KEY:
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
export DEEPSEEK_API_KEY="..."
第三步:统一调用
写一个 client.chat.completions.create(),来回切换模型名就能对比响应质量。
第四步:试试 Agents
给模型传一个 Python 函数作为工具,让它自动完成多轮工具调用。
第五步:上生产
把模型名外提到配置文件中,一条管线跑多个供应商。
aisuite 不是那种要改变你架构的框架——它就是一层轻量接口,解决的是「不同供应商各自为政」这个琐碎但高频的问题。Andrew Ng 团队在 2024 年 6 月开源,迭代一年多后积累了 15,700+ stars 和 1,600+ forks,证明市场对这样的抽象有真实需求。如果你的项目已经或将来需要对接两个以上的 LLM 供应商,aisuite 值得一试。