UniversalAI:想当大模型界的requests
HTTP时代有个requests库,写一次调用,到处都能跑。现在搞LLM应用,一个项目里接OpenAI又要接Anthropic还要接本地Ollama,每个SDK的API风格、错误处理还不一样,代码东拼西凑。UniversalAI这库想干的事就是:把大模型API层的差异抹平——统一接口,改一行字符串就能换供应商。
下一篇
我的机器人会计收到驱逐通知 →
一、上手很轻
pip install universal-ai用起来就是实例化一个AI对象:
from universal_ai import AI
# 自动从环境变量识别provider
ai = AI()
response = await ai.chat("用一句话解释量子计算")
print(response.content)指定供应商也就改个参数的事:
ai = AI(provider="openai", model="gpt-4o")
ai = AI(provider="anthropic", model="claude-sonnet-4-20250514")
ai = AI(provider="ollama", model="llama3")同一套代码,换个provider字符串就能跑,还包括Gemini、Groq、Mistral、OpenRouter、HuggingFace、Azure OpenAI,覆盖9家。还做了同步wrapper,脚本和Notebook里不用纠结async。
二、两个让我眼前一亮的设计
Tool Calling用装饰器搞定,不用手动写工具调用的解析循环:
from universal_ai import AI, tool
@tool
def get_weather(city: str, unit: str = "celsius") -> str:
"""获取城市天气"""
return f"{city}天气:22°C,晴"
ai = AI(provider="openai", model="gpt-4o")
response = await ai.chat("北京天气怎么样?")标注了类型和docstring,AI自动决定调用时机,执行循环是库内部处理的。
中间件机制自带重试、缓存、限速、熔断,还有成本追踪和日志。这套东西自己搭一遍挺费劲的,内置了确实省事。路由策略也给了fallback、轮询、最低延迟、最低成本四种——生产环境做多供应商容灾时直接用。
三、说实话的观察
这类unified SDK有个天然宿命:功能覆盖面广,但某些provider的独家特性会滞后。OpenAI新出的功能,直接调官方SDK当天就能用,等UniversalAI同步可能得几天。另外RAG和Agent编排这种重功能也内置了,但真正复杂场景我大概率还是会用专门的框架,这个库更适合做轻量集成。
不过对个人开发者和中小项目,它的价值很实在——多供应商切换的成本被压到最低,不会被某一家绑定。如果你手上同时在玩好几个模型的API,这库值得扔进依赖里试试。省下的时间拿来调prompt比啥都值。