Chapter 03

provider 全家桶配置

100+ 家 provider 各有各的脾气,但都逃不过三种认证方式:API Key、云厂商凭证、自定义 base_url。本章一家家过,告诉你怎么接入,以及每家最常见的坑。

认证方式的三大派别

在具体讲每家之前,先说一个宏观结构。所有 provider 的认证方式无非三类:

派别一:API Key(最常见)
一串字符串就是全部。OpenAI、Anthropic、Gemini、DeepSeek、Groq、Together、Moonshot、智谱、通义、Fireworks、OpenRouter 等都是这种。只要一个环境变量就能跑。
派别二:云厂商凭证
Azure 要 key + endpoint + api_version;Bedrock 要 AWS IAM 的 access/secret + region;Vertex AI 要 GCP 的 ADC(Application Default Credentials)或 Service Account JSON。企业部署高频。
派别三:自建服务(base_url)
Ollama、vLLM、SGLang、LM Studio、私有化的任何 OpenAI 兼容服务。特征是 base_url 要手动指,key 常常是空字符串或随便填。

理解了这三类,接下来每家只要学"它属于哪类、要配几个变量、有什么专属坑"即可。

OpenAI(含兼容第三方)

最简单的一家。环境变量:

export OPENAI_API_KEY="sk-..."
# 可选, 默认 https://api.openai.com/v1
export OPENAI_API_BASE="..."
# 可选, 某些企业账号需要
export OPENAI_ORGANIZATION="org-..."

调用:

completion(model="gpt-4o",         messages=msgs)
completion(model="gpt-4o-mini",    messages=msgs)
completion(model="o1",             messages=msgs)  # 推理模型
completion(model="o3-mini",        messages=msgs)

调第三方 OpenAI 兼容:改 base_url

很多厂商直接提供 OpenAI 兼容端点(DeepSeek、Moonshot、Groq 都有专属前缀可省事,但如果你要接一个没有专属前缀的服务,比如公司内部的 qwen 服务),用通用的 openai/ 前缀 + 显式 base_url:

resp = completion(
    model="openai/qwen2.5-72b-instruct",
    messages=msgs,
    api_key="sk-company-xxx",
    api_base="https://llm-gateway.company.internal/v1",
)

这是"万能兜底"用法——只要服务端长得像 OpenAI,都能走这条路。

Anthropic Claude

export ANTHROPIC_API_KEY="sk-ant-..."
completion(model="anthropic/claude-sonnet-4-5",  messages=msgs, max_tokens=1024)
completion(model="anthropic/claude-haiku-4-5",   messages=msgs, max_tokens=1024)
completion(model="anthropic/claude-opus-4-1",    messages=msgs, max_tokens=4096)
三个必须记住的特点
1. max_tokens 是必填。不传 LiteLLM 会用默认值,但我们强烈建议显式传——否则某些老版本会报错。
2. temperature 上限是 1,不是 2。
3. system 消息写在 messages 最前面即可,LiteLLM 会自动抽出来塞到 Anthropic 的独立 system 字段。

Claude 独有:Prompt Caching 和 Extended Thinking

Claude 3.5 / 4 支持 prompt caching——把 system 或长文档标记为可缓存,下次命中折扣 90%。LiteLLM 支持这种写法:

resp = completion(
    model="anthropic/claude-sonnet-4-5",
    messages=[
        {"role": "system", "content": [
            {"type": "text",
             "text": "<20 万字的长合同...>",
             "cache_control": {"type": "ephemeral"}},   # 标记可缓存
        ]},
        {"role": "user", "content": "请总结第 3 条"},
    ],
    max_tokens=1024,
)
print(resp.usage.prompt_tokens_details.cached_tokens)  # 缓存命中的 token 数

Extended thinking(会思考的 Claude)通过 thinking 参数开启:

resp = completion(
    model="anthropic/claude-sonnet-4-5",
    messages=msgs,
    max_tokens=8192,
    thinking={"type": "enabled", "budget_tokens": 4000},
)

Google Gemini(AI Studio)

Google 的 LLM 有两条路:AI Studio(面向开发者,一个 key 搞定)和 Vertex AI(面向企业,要 GCP 项目)。前者用 gemini/ 前缀,后者用 vertex_ai/

export GEMINI_API_KEY="AIza..."
completion(model="gemini/gemini-2.5-pro",    messages=msgs)
completion(model="gemini/gemini-2.5-flash",  messages=msgs)
completion(model="gemini/gemini-2.0-flash",  messages=msgs)
completion(model="gemini/gemini-2.0-flash-thinking-exp", messages=msgs)

Gemini 的特有参数

resp = completion(
    model="gemini/gemini-2.0-flash",
    messages=msgs,
    temperature=0.5,
    extra_body={
        "topK": 40,                      # Gemini 专有
        "safetySettings": [                # 审查策略
            {"category": "HARM_CATEGORY_HATE_SPEECH",
             "threshold": "BLOCK_NONE"},
        ],
    },
)

Azure OpenAI

Azure 是 OpenAI 模型,但挂在微软的 endpoint 下,认证方式完全不同。三个变量缺一不可:

export AZURE_API_KEY="..."
export AZURE_API_BASE="https://my-instance.openai.azure.com"
export AZURE_API_VERSION="2024-10-21"
# model 是你在 Azure Portal 创建的 deployment 名
completion(model="azure/my-gpt4o-deployment", messages=msgs)
Azure 和 OpenAI 的细微差异
· model 参数是你的 deployment 名,不是模型名。
· api_version 每几个月更新一次,太旧会报错;太新可能没 GA。
· Azure 有 content filter,回复可能被包裹成 content_filter finish_reason。
· 国区 Azure(Azure China)要换 endpoint(.openai.azure.cn)和独立 key。

AWS Bedrock

Bedrock 是 AWS 的 LLM 聚合服务,里面有 Anthropic、Meta、Mistral、Cohere、Titan 等厂商的模型。认证走标准 AWS IAM:

export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION_NAME="us-east-1"
# 如果你在 EC2 或 Lambda 里, 用 IAM Role 就不用上面三个变量
# Bedrock 里的 Claude
completion(
    model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
    messages=msgs,
    max_tokens=1024,
)

# Bedrock 里的 Llama
completion(
    model="bedrock/meta.llama3-70b-instruct-v1:0",
    messages=msgs,
    max_tokens=1024,
)

# Bedrock Nova (AWS 自家 2024 新模型)
completion(
    model="bedrock/us.amazon.nova-pro-v1:0",
    messages=msgs,
    max_tokens=1024,
)
Bedrock 三个经典坑
1. Region 问题:不是所有模型都在所有 region 上线。Claude 一般在 us-east-1、us-west-2、eu-central-1。国内用户最多的是 us-east-1。
2. Inference Profile:2024 年起 Bedrock 要求跨 region inference 走 profile,model id 会带 us. 前缀(如 us.amazon.nova-pro-v1:0)。
3. AssumeRole:跨账号场景用 STS 临时凭证时,设 AWS_SESSION_TOKEN

Vertex AI(GCP)

Vertex 是 Google 的企业级 LLM,底下模型既有 Google 自家的 Gemini,也有 Anthropic Claude。认证走 GCP 的 ADC:

# 方式一: service account JSON
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/sa.json"

# 方式二: gcloud CLI 登录 (本地开发)
gcloud auth application-default login

# 必填
export VERTEXAI_PROJECT="my-gcp-project-id"
export VERTEXAI_LOCATION="us-central1"
# Gemini on Vertex
completion(model="vertex_ai/gemini-2.5-pro", messages=msgs)

# Claude on Vertex
completion(
    model="vertex_ai/claude-sonnet-4-5@20250822",  # 注意版本号写法
    messages=msgs,
    max_tokens=1024,
)

用 Vertex 的理由通常是合规——数据必须留在 GCP 项目里,不能走公共 API。企业部署非常常见。

Ollama(本地)

Ollama 是 Mac/Linux 上跑本地模型的首选工具。启动后默认监听 http://localhost:11434。LiteLLM 直接接:

ollama pull llama3.2
ollama pull qwen2.5
completion(
    model="ollama/llama3.2",
    messages=msgs,
    api_base="http://localhost:11434",  # 默认就是这个, 可省
)

两种前缀的区别:

ollama/
走 Ollama 原生 /api/chat 协议。LiteLLM 做翻译。
ollama_chat/
同样走原生协议,但用的是新接口,支持 tool use。新代码推荐这个

还有第三种写法——把 Ollama 当 OpenAI 兼容服务接:

completion(
    model="openai/llama3.2",
    messages=msgs,
    api_base="http://localhost:11434/v1",
    api_key="ollama",                    # 随便填, Ollama 不校验
)

Together AI / Groq / Fireworks

这三家都是"开源模型托管+OpenAI 兼容"类型的服务,主打性价比和速度。配法统统超简单:

export TOGETHER_API_KEY="..."
export GROQ_API_KEY="gsk_..."
export FIREWORKS_AI_API_KEY="fw_..."
completion(model="together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo", messages=msgs)
completion(model="groq/llama-3.3-70b-versatile",                     messages=msgs)
completion(model="fireworks_ai/accounts/fireworks/models/llama-v3p3-70b-instruct", messages=msgs)

Groq 主打 延迟——70B 模型实测 300+ tok/s,适合需要流畅 UI 流式输出的场景。Together 和 Fireworks 型号最全。

OpenRouter

OpenRouter 自己就是一个"聚合网关",一个 key 就能调几十家。在 LiteLLM 里被当成普通 provider 接入,但你可以拿它做 provider-of-providers——适合小团队省去自己对接的麻烦:

export OPENROUTER_API_KEY="sk-or-..."
completion(model="openrouter/anthropic/claude-sonnet-4-5", messages=msgs)
completion(model="openrouter/openai/gpt-4o",                messages=msgs)
completion(model="openrouter/google/gemini-2.0-flash",       messages=msgs)

什么时候用 LiteLLM、什么时候用 OpenRouter?一句话区分:

OpenRouter vs LiteLLM 的定位
OpenRouter 是 SaaS 网关,它给你发一个 key,你付钱给它,它付钱给上游。省事但不可控。
LiteLLM 是开源库/自建网关,你自己持有各家 key,自己承担 ops。可控但要自己维护。
混用:完全可以把 OpenRouter 当 LiteLLM 的一个 provider,用 LiteLLM 做路由 + OpenRouter 做兜底。

国内厂商:DeepSeek / 智谱 / 通义 / Moonshot

国内几家大模型都提供 OpenAI 兼容端点,LiteLLM 都有专属前缀,配法极简单:

DeepSeek

export DEEPSEEK_API_KEY="sk-..."
completion(model="deepseek/deepseek-chat",     messages=msgs)  # 通用对话 V3
completion(model="deepseek/deepseek-reasoner", messages=msgs)  # R1 推理模型

DeepSeek 性价比无敌,R1 推理模型在实测中对标 o1-mini 但便宜 20 倍。国内直连稳定。

智谱 GLM

export ZHIPU_API_KEY="..."
completion(model="zhipu/glm-4-plus",  messages=msgs)
completion(model="zhipu/glm-4-flash", messages=msgs)

通义千问 Qwen(阿里)

通义在 LiteLLM 里没有独立前缀,走 openai/ + 兼容端点:

completion(
    model="openai/qwen-max",
    messages=msgs,
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

Moonshot 月之暗面

export MOONSHOT_API_KEY="sk-..."
completion(model="moonshot/moonshot-v1-8k",   messages=msgs)
completion(model="moonshot/moonshot-v1-32k",  messages=msgs)
completion(model="moonshot/moonshot-v1-128k", messages=msgs)

自建推理服务:vLLM / SGLang / TGI

如果你自己跑一个开源模型(例如用 vLLM 部署 Llama-3-70B),不用给 LiteLLM 写什么插件——这些推理服务都主动暴露 /v1/chat/completions:

# 启动 vLLM
vllm serve meta-llama/Llama-3.3-70B-Instruct --port 8000
completion(
    model="openai/meta-llama/Llama-3.3-70B-Instruct",
    messages=msgs,
    api_key="sk-no-key-required",
    api_base="http://llm-01.intranet:8000/v1",
)

SGLang、TGI、LM Studio 统统同理。这种 openai/ + base_url 的组合就是兜底——第 12 章的生产部署最终态,就是这套。

一份 dev 环境配置模板

把上面的东西整理成一份可以直接用的 .env 文件,放在项目根目录,用 python-dotenv 加载:

# ===== 基础三大家 =====
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AIza...

# ===== 企业网关 =====
AZURE_API_KEY=...
AZURE_API_BASE=https://my.openai.azure.com
AZURE_API_VERSION=2024-10-21

AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION_NAME=us-east-1

# ===== 性价比备用 =====
DEEPSEEK_API_KEY=sk-...
GROQ_API_KEY=gsk_...
TOGETHER_API_KEY=...

# ===== 国内 =====
ZHIPU_API_KEY=...
MOONSHOT_API_KEY=sk-...
DASHSCOPE_API_KEY=sk-...

# ===== 本地 =====
# Ollama 不用 key

加载模板:

from dotenv import load_dotenv
from litellm import completion

load_dotenv()   # 自动把 .env 读入 os.environ

# 这之后, 所有 completion(model="xxx") 都会找到对应 key
resp = completion(model="anthropic/claude-sonnet-4-5",
                  messages=[{"role":"user","content":"hi"}],
                  max_tokens=100)

探测可用性:validate_environment

你配了一大堆环境变量,怎么知道哪家能调通?LiteLLM 有个工具函数:

import litellm

result = litellm.validate_environment("anthropic/claude-sonnet-4-5")
print(result)
# {'keys_in_environment': True, 'missing_keys': []}

result = litellm.validate_environment("azure/my-deployment")
print(result)
# {'keys_in_environment': False,
#  'missing_keys': ['AZURE_API_KEY', 'AZURE_API_BASE', 'AZURE_API_VERSION']}

写个启动时的健康检查,保证程序起来就知道哪些路通、哪些路断:

import litellm

PROVIDERS = [
    "gpt-4o-mini",
    "anthropic/claude-haiku-4-5",
    "gemini/gemini-2.0-flash",
    "deepseek/deepseek-chat",
    "groq/llama-3.3-70b-versatile",
]

for m in PROVIDERS:
    r = litellm.validate_environment(m)
    flag = "OK " if r["keys_in_environment"] else "MISSING"
    print(f"{flag}  {m}  {r['missing_keys']}")

每家的模型到哪找

一个现实问题:厂商的模型名经常变。LiteLLM 维护了一份实时模型表,叫 model_prices_and_context_window.json,里面有每个模型的价格、上下文窗口、支持能力。在线版本:

https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json

Python 里直接读:

import litellm

info = litellm.get_model_info("anthropic/claude-sonnet-4-5")
print(info["max_input_tokens"])       # 200000
print(info["input_cost_per_token"])    # 0.000003
print(info["output_cost_per_token"])   # 0.000015
print(info["supports_function_calling"])
print(info["supports_vision"])

这个表是社区滚动更新的,价格精度每周都在刷新。第 9 章会讲怎么覆盖它——比如你买了 Bedrock 的 savings plan,实际价格比公开报价低 40%。

企业部署的安全实践

上线前几条硬底线:

本章小结