数据截至 (上游 commit 3f15dc32871c)
LiteLLM — 架构与原理
30 秒导读: LiteLLM 让你用一套 OpenAI 格式的代码去调 OpenAI、Anthropic、Gemini、Bedrock、Azure 等上百家 LLM——换供应商只改一个
model字符串。同一份代码还能包成一台 FastAPI 网关,给团队发虚拟 key、记账、限流、多实例负载均衡。
1. 这是什么(零基础也能懂)
一句话定义: LiteLLM 是一个统一 LLM 调用层——对上暴露 OpenAI 的接口形状,对下把请求翻译成各家供应商自己的格式,再把各家的返回翻译回 OpenAI 格式。
它解决谁的什么问题
假设你写了个 agent,用的是 OpenAI 的 chat.completions.create()。现在老板说:成本太高,换成 Claude;某些请求走公司自建的 vLLM;欧洲用户必须走 Azure。
按原样做,你要:
- 装三个不同的 SDK,学三套 API;
- 处理三套鉴权(API key / AWS SigV4 / Azure AD token);
- 三套参数名(OpenAI 的
max_tokens、Anthropic 的max_tokens但语义不同、Gemini 的maxOutputTokens); - 三套流式协议;
- 三套异常类型;
- 三套计费口径。
LiteLLM 把这六件事全部收进库里。你的业务代码只改 model="anthropic/claude-sonnet-4-20250514"。
它有两种用法
| 形态 | 是什么 | 适合谁 |
|---|---|---|
| Python SDK | pip install litellm,调 completion() | 单个应用、单个开发者 |
| AI Gateway(Proxy) | 一台 FastAPI 服务,监听 /v1/chat/completions | 团队/公司,要发 key、记账、限流 |
关键点:网关不是另一套实现。网关内部就是拿 HTTP 请求体去调同一个 SDK,外面套了认证、预算、路由。
用起来什么样
SDK 形态,换供应商只动 model 这一行:
# 示意,非源码
from litellm import completion
# 环境变量里放好 ANTHROPIC_API_KEY / OPENAI_API_KEY
r = completion(
model="anthropic/claude-sonnet-4-20250514", # 换成 "openai/gpt-4o" 即切供应商
messages=[{"role": "user", "content": "Hello!"}],
)
print(r.choices[0].message.content) # 返回对象永远是 OpenAI 形状
网关形态,连业务代码都不用改——直接把 OpenAI SDK 的 base_url 指过来:
# 示意,非源码
import openai
client = openai.OpenAI(api_key="sk-1234", base_url="http://0.0.0.0:4000")
client.chat.completions.create(model="gpt-4o", messages=[...])
网关侧只需要一份 YAML 声明"对外叫什么名字、实际打到哪":
# 示意,非源码;真实样例见克隆根的 proxy_server_config.yaml
model_list:
- model_name: gpt-3.5-turbo # 对外的模型组名
litellm_params:
model: openai/gpt-4.1-mini # 实际打到哪
api_key: os.environ/OPENAI_API_KEY
一句话直觉
把 LiteLLM 当成 LLM 世界的 ODBC / JDBC。 数据库驱动层做的事是:定义一套标准 SQL 接口,每种数据库写一个驱动做方言翻译。LiteLLM 做的是同一件事——标准接口选的是 OpenAI 格式,每家供应商写一个「驱动」(一个 BaseConfig 子类)。