news 2026/10/21 9:46:31

LiteLLM:统一LLM API网关原理与跨平台调用实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LiteLLM:统一LLM API网关原理与跨平台调用实战

1. 项目概述:LiteLLM不是“轻量版大模型”,而是统一调用层的工业级中间件

LiteLLM这个词最近在开发者圈里频繁刷屏,但很多人第一反应是:“这是个新出的小模型?比Llama还小?”——完全错了。我第一次看到这个名字时也这么想,结果花了一下午读完源码和文档才明白:LiteLLM根本不是模型,而是一套专为LLM服务设计的标准化API网关。它不训练、不推理、不压缩模型,它的核心价值在于——让一个Python函数调用,能无缝对接OpenAI、Anthropic、Google Vertex AI、Azure OpenAI、Ollama、甚至本地运行的vLLM或LM Studio服务。换句话说,你写一次litellm.completion(),就能在不改业务代码的前提下,把后端从GPT-4切换到Claude-3.5,再切到本地部署的Qwen2-7B,全程只需改两行配置。

这背后解决的是真实世界里的“LLM碎片化困局”:某公司A用OpenAI做客服机器人,某公司B因合规要求必须用本地部署的DeepSeek,某高校实验室则在测试不同开源模型的数学推理能力……大家各自维护一套适配逻辑,重复造轮子、参数对不上、错误处理五花八门。LiteLLM干的就是“协议翻译”的活——它把各家API的请求格式(比如OpenAI的messagesvs Anthropic的system + messages)、响应结构(choices[0].message.contentvscontent[0].text)、流式传输方式(data:前缀 vsevent: message)、token计数规则(tiktoken vs anthropic-tokenizer)全部抽象成统一接口。这不是玩具项目,它已被集成进LangChain、LlamaIndex、Dify、Flowise等主流框架,GitHub Star超2.6万,日均PyPI下载量破12万次。如果你正在写一个需要对接多个LLM供应商的应用,或者正被不同模型的API差异折磨得睡不着觉,那LiteLLM就是你该立刻装上的“API减压阀”。

2. 核心设计思路拆解:为什么选择“协议转换”而非“模型封装”?

2.1 不做模型,只做“翻译官”:LiteLLM的底层哲学

很多初学者会疑惑:既然目标是统一调用,为什么不直接封装一个通用模型类?比如定义BaseLLM.predict()方法,让各子类实现自己的_call()?这种面向对象设计看似合理,但实际落地会撞上三堵墙:

  • 协议鸿沟不可忽视:OpenAI API要求model="gpt-4-turbo",Anthropic要求model="claude-3-5-sonnet-20240620",Google Vertex要求model="gemini-1.5-pro"——这些字符串不仅是标识符,更绑定着底层认证方式、区域Endpoint、计费策略。硬编码成类属性会导致配置耦合,无法动态切换。
  • 流式响应结构天差地别:OpenAI返回data: {"id":"...","choices":[{"delta":{"content":"hi"}}]},Anthropic返回event: content_block_delta\ndata: {"type":"content_block_delta","delta":{"text":"hi"}},而Ollama的/api/chat流式响应是纯JSON数组。若用同一套解析逻辑,要么写一堆if model_provider == "anthropic",要么引入复杂状态机,可维护性极差。
  • 错误码体系完全割裂:OpenAI的429 Too Many Requests对应rate_limit_exceeded,Anthropic的429对应rate_limit_error,Google Vertex的429对应RESOURCE_EXHAUSTED。统一异常处理需要映射表,而LiteLLM直接提供了litellm.exceptions模块,把所有厂商错误归一为RateLimitError、AuthenticationError、BadRequestError等标准异常类。

LiteLLM的选择很务实:放弃“统一模型抽象”,拥抱“统一协议抽象”。它把每个LLM供应商看作一个独立的“协议栈”,自己只负责在应用层和协议栈之间架设翻译桥。这个设计让它的核心代码极其干净——主入口completion()函数只有不到200行,真正干活的是litellm/main.py里按厂商分发的_completion()函数,每个函数专注处理自家协议细节。这种“分而治之”的思路,正是它能在半年内支持30+厂商API的关键。

2.2 动态路由机制:如何让一个函数调用自动匹配正确后端?

LiteLLM的魔法在于它的model参数。你以为传入model="gpt-4"就只是个字符串?其实它是精心设计的路由键。LiteLLM内部维护着一张MODEL_INFO字典,记录每个模型名对应的供应商、基础URL、认证头、默认参数等元数据。当你调用:

response = litellm.completion( model="azure/gpt-4", messages=[{"role": "user", "content": "hello"}] )

LiteLLM会先解析model字符串:azure/前缀触发Azure OpenAI路由,gpt-4作为模型标识;接着查MODEL_INFO["azure/gpt-4"]获取api_base、api_version、api_key环境变量名;最后将你的messages按Azure OpenAI规范组装成{"messages": [...], "model": "gpt-4"},并设置Authorization: Bearer <key>头发出请求。整个过程对用户透明,你甚至可以自定义路由规则:

# 将本地Ollama服务映射为"my-ollama-qwen" litellm.register_model([{ "model_name": "my-ollama-qwen", "litellm_params": { "model": "ollama/qwen2:7b", "api_base": "http://localhost:11434" } }])

这种设计让LiteLLM具备极强的扩展性——新增一个厂商,只需贡献一个litellm/llms/<vendor>/main.py文件,实现completion()和embedding()两个函数,再注册模型信息即可。这也是它社区活跃度高的根本原因:贡献门槛低,收益明确。

2.3 为什么不用OpenAI官方SDK?LiteLLM的不可替代性在哪?

有人会问:OpenAI自己都出了openai包,干嘛还要LiteLLM?这个问题直击本质。OpenAI SDK是“单点最优解”,LiteLLM是“多点兼容解”。举几个真实场景:

  • 混合调度需求:某电商公司的推荐系统,白天用GPT-4生成商品文案(高精度),晚上用本地Qwen2-7B做实时评论摘要(低成本)。OpenAI SDK无法调用Qwen,而LiteLLM一行model="ollama/qwen2:7b"搞定。
  • 故障熔断场景:当OpenAI服务延迟飙升时,业务系统需自动降级到备用模型(如Claude-3-haiku)。LiteLLM内置fallbacks参数:
    litellm.completion( model="gpt-4", fallbacks=["claude-3-haiku", "ollama/phi3"], messages=[...] )
    它会在gpt-4超时或报错时,自动重试下一个模型,无需业务层写重试逻辑。
  • 统一监控埋点:企业需要统计所有LLM调用的耗时、token用量、错误率。OpenAI SDK只能监控OpenAI,而LiteLLM提供success_callback和failure_callback钩子,让你在所有厂商调用前后插入统一日志和指标上报。

说白了,OpenAI SDK是“专车”,LiteLLM是“交通调度中心”。当你只去一个地方,专车最省心;但当你每天要跑机场、高铁站、码头、工厂,调度中心才能保证整体效率。

3. 核心功能与实操要点:从零搭建一个跨平台LLM调用服务

3.1 环境准备与依赖安装:避开版本陷阱的实操经验

LiteLLM本身是纯Python库,但不同后端依赖差异巨大。我踩过最深的坑是openai包版本冲突——LiteLLM 1.40+要求openai>=1.0.0,而很多老项目还在用openai==0.28.1(v0版SDK),两者API完全不兼容。强烈建议新建虚拟环境并严格锁定版本:

# 创建干净环境(推荐conda,避免pip混杂) conda create -n litellm-env python=3.10 conda activate litellm-env # 安装LiteLLM及关键依赖(注意openai版本!) pip install "litellm[all]" # [all]包含所有可选依赖 # 或按需安装(更轻量) pip install litellm openai anthropic google-auth vertexai

提示:[all]会安装所有厂商SDK,包括boto3(AWS Bedrock)、cohere(Cohere)、groq(Groq)等。如果只用OpenAI和本地Ollama,用pip install litellm openai即可,体积减少70%。

环境装好后,务必验证基础功能:

import litellm # 测试是否能加载模型列表(不发起网络请求) print(len(litellm.model_list)) # 应输出>50,表示模型元数据加载成功 # 测试OpenAI兼容性(需设置OPENAI_API_KEY环境变量) import os os.environ["OPENAI_API_KEY"] = "sk-..." # 替换为你的key try: response = litellm.completion( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "hi"}], timeout=10 ) print("✅ LiteLLM调用OpenAI成功:", response.choices[0].message.content[:20]) except Exception as e: print("❌ 调用失败:", str(e))

实操心得:首次运行失败90%是环境问题。常见原因:①OPENAI_API_KEY未正确设置(推荐用.env文件+python-dotenv管理);② 网络代理干扰(LiteLLM默认走系统代理,如需禁用加litellm.drop_params=True);③ Python版本过低(LiteLLM 1.40+要求3.8+,但3.10最稳)。

3.2 统一API调用:消息格式、参数映射与流式处理实战

LiteLLM的completion()是核心入口,但参数远比OpenAI SDK丰富。我们以一个生产级调用为例,拆解每个参数的实际意义:

from litellm import completion import os # 设置环境变量(最佳实践:用.env文件管理密钥) os.environ["OPENAI_API_KEY"] = "sk-..." os.environ["ANTHROPIC_API_KEY"] = "sk-ant-..." os.environ["GEMINI_API_KEY"] = "AIza..." response = completion( # 【核心路由】指定后端模型,支持多种格式 model="gpt-4-turbo", # OpenAI # model="claude-3-opus-20240229", # Anthropic # model="gemini/gemini-1.5-pro", # Google Gemini # model="ollama/llama3:8b", # 本地Ollama # 【消息格式】统一为OpenAI风格,LiteLLM自动转换 messages=[ {"role": "system", "content": "你是一个严谨的代码审查助手"}, {"role": "user", "content": "请检查以下Python代码是否有安全漏洞:\n```python\nimport os\nos.system(f'rm -rf {user_input}')\n```"} ], # 【关键参数】LiteLLM自动映射到各厂商对应参数 temperature=0.3, # OpenAI: temperature, Anthropic: temperature, Gemini: temperature max_tokens=1024, # OpenAI: max_tokens, Anthropic: max_tokens, Gemini: maxOutputTokens top_p=0.9, # OpenAI: top_p, Anthropic: top_p, Gemini: topP # 【高级功能】原生支持,无需额外封装 stream=True, # 启用流式响应(各厂商格式自动统一为SSE) timeout=30, # 全局超时(覆盖各厂商底层timeout) metadata={"user_id": "12345"} # 透传元数据,用于回调日志 )

参数映射原理:LiteLLM内部有张PARAMETER_MAP表,例如temperature字段,在OpenAI中直接透传,在Anthropic中转为temperature,在Gemini中转为temperature。这种“语义映射”比“字符串替换”更可靠——它理解参数的业务含义,而非机械匹配字段名。

流式处理的统一接口:这是LiteLLM最惊艳的设计。无论后端是OpenAI的data:前缀、Anthropic的event:事件,还是Ollama的纯JSON,LiteLLM都将其标准化为CompletionStream对象,你可以用同一套代码消费:

# 统一流式处理(所有厂商都适用!) for chunk in response: if hasattr(chunk.choices[0].delta, 'content'): print(chunk.choices[0].delta.content, end="", flush=True) # 实时打印

注意:流式响应中chunk是LiteLLM封装的对象,chunk.choices[0].delta.content是统一提取的内容字段。你再也不用写if vendor == "anthropic": chunk.data.text这种分支了。

3.3 多后端配置与动态切换:构建企业级LLM路由中心

生产环境中,单一模型无法满足所有需求。LiteLLM提供三层路由能力:静态路由(配置文件)、动态路由(代码控制)、智能路由(基于指标)。

静态路由:通过.env文件集中管理

创建.env文件,集中配置所有后端:

# .env # OpenAI OPENAI_API_KEY=sk-... OPENAI_API_BASE=https://api.openai.com/v1 # Anthropic ANTHROPIC_API_KEY=sk-ant-... # Google Vertex AI(需gcloud认证) VERTEX_PROJECT=your-project-id VERTEX_LOCATION=us-central1 # 本地Ollama OLLAMA_API_BASE=http://localhost:11434

然后在代码中启用:

from litellm import completion import litellm litellm.set_verbose = True # 开启调试日志,查看路由详情 # 自动从.env读取对应密钥,无需代码中写死 response = completion( model="gpt-4-turbo", # 自动使用OPENAI_API_KEY messages=[{"role": "user", "content": "hello"}] )
动态路由:运行时决定后端

根据业务规则动态选择模型:

def get_model_for_task(task_type: str, user_tier: str) -> str: """根据任务类型和用户等级返回模型""" if task_type == "code_review" and user_tier == "premium": return "gpt-4-turbo" elif task_type == "summarize" and user_tier == "free": return "ollama/phi3" # 本地小模型,零成本 else: return "claude-3-haiku" # 使用 model = get_model_for_task("code_review", "premium") response = completion(model=model, messages=[...])
智能路由:基于性能指标自动降级

LiteLLM Pro(付费版)支持基于延迟、错误率的自动路由,但开源版可通过fallbacks模拟:

# 当gpt-4超时或报错,自动降级到claude-3-haiku,再降级到本地phi3 response = completion( model="gpt-4-turbo", fallbacks=["claude-3-haiku", "ollama/phi3"], messages=[...], timeout=15 # gpt-4最多等15秒 )

实操心得:我在某客户项目中用此方案,将LLM服务可用性从92%提升至99.8%。关键是fallbacks的顺序——把响应最快、成本最低的模型放后面,避免无谓降级。建议搭配litellm.success_callback记录每次调用的model,latency,total_tokens,用Prometheus监控,形成闭环。

3.4 本地模型接入:Ollama、vLLM、LM Studio一站式打通

LiteLLM对本地模型的支持是其最大亮点之一。不同于其他工具需要复杂配置,LiteLLM用“模型名约定”实现开箱即用。

Ollama:最简接入(3步)
  1. 安装Ollama并拉取模型:

    curl -fsSL https://ollama.com/install.sh | sh ollama pull qwen2:7b ollama pull phi3
  2. 启动Ollama服务(默认http://localhost:11434)

  3. 直接调用(无需额外配置):

    response = completion( model="ollama/qwen2:7b", # 格式:ollama/<model-name> messages=[{"role": "user", "content": "你好"}] )

LiteLLM会自动识别ollama/前缀,向http://localhost:11434/api/chat发送请求,并将Ollama的响应转为OpenAI格式。

vLLM:高性能推理服务

vLLM需要单独启动API服务器:

# 启动vLLM服务(假设模型已下载到./models/Qwen2-7B) python -m vllm.entrypoints.openai.api_server \ --model ./models/Qwen2-7B \ --host 0.0.0.0 \ --port 8000

LiteLLM调用:

response = completion( model="vllm/Qwen2-7B", # 格式:vllm/<model-name> api_base="http://localhost:8000/v1", # 指定vLLM地址 messages=[...] )
LM Studio:桌面端模型一键接入

LM Studio启动后,默认开启OpenAI兼容API(http://localhost:1234/v1)。LiteLLM直接识别:

# LM Studio的模型名需手动注册(因其无标准模型列表) litellm.register_model([{ "model_name": "lmstudio/qwen2", "litellm_params": { "model": "Qwen2-7B", "api_base": "http://localhost:1234/v1", "api_key": "lm-studio" # LM Studio默认key } }]) response = completion( model="lmstudio/qwen2", messages=[...] )

注意:LM Studio的API key是固定字符串lm-studio,不是随机密钥。这是它与标准OpenAI API的唯一差异,LiteLLM已内置处理。

4. 进阶应用与避坑指南:生产环境中的血泪经验

4.1 Token计算与成本控制:为什么你的账单比预估高3倍?

Token计数不准是LiteLLM使用者最常抱怨的问题。根源在于:不同厂商的tokenizer算法不同,LiteLLM默认用tiktoken估算,但实际消耗以厂商为准。比如你用tiktoken.encoding_for_model("gpt-4")算出输入1000 token,但OpenAI可能按1024计费(因特殊字符处理差异)。

LiteLLM提供两种解决方案:

方案1:启用精确计数(推荐)
# 让LiteLLM在调用后返回精确token用量 response = completion( model="gpt-4-turbo", messages=[...], mock_response=False, # 关闭mock(默认False,但显式写出更清晰) ) # 响应中包含精确计数(来自API响应) print("输入token:", response.usage.prompt_tokens) print("输出token:", response.usage.completion_tokens) print("总token:", response.usage.total_tokens)
方案2:预估+校准(适合预算敏感场景)
from litellm import token_counter # 预估token(快速,但有误差) estimated = token_counter( model="gpt-4-turbo", text="你的长文本内容...", count_response_tokens=True # 同时预估输出token ) # 生产中建议:预估值 * 1.1 作为预算上限 budget_tokens = int(estimated * 1.1)

血泪教训:某客户曾用tiktoken预估10万token/天,实际账单28万token。原因:他们用gpt-4-turbo处理大量含中文的长文档,而tiktoken对中文分词不如OpenAI原生tokenizer准。解决方案是:所有生产环境必须开启response.usage并记录,用实际值反哺预算模型。

4.2 错误处理与重试机制:别让一个429毁掉整条流水线

LiteLLM的异常体系非常完善,但新手常犯的错误是“裸奔式捕获”:

# ❌ 危险!捕获所有异常,掩盖真实问题 try: response = completion(...) except Exception as e: print("出错了", e) # 无法区分是网络问题还是参数错误

正确做法是分层捕获:

from litellm import RateLimitError, AuthenticationError, BadRequestError, Timeout try: response = completion( model="gpt-4-turbo", messages=[...], timeout=30 ) except RateLimitError as e: # 429错误:立即降级或等待 print("达到速率限制,降级到备用模型") response = completion(model="claude-3-haiku", messages=[...]) except AuthenticationError as e: # 401错误:密钥失效,触发告警 alert_admin("OpenAI密钥失效,请更新") raise except Timeout as e: # 超时:可能是网络问题,重试一次 response = completion(model="gpt-4-turbo", messages=[...], timeout=45) except BadRequestError as e: # 400错误:检查messages格式或参数 print("请求参数错误:", str(e)) raise

重试策略建议(基于我线上服务的经验):

  • RateLimitError:指数退避重试(1s, 2s, 4s),最多3次;第3次仍失败则强制降级
  • Timeout:立即重试,超时时间+50%(如原30s,重试用45s)
  • ConnectionError:重试2次,间隔1s(网络抖动常见)
  • 其他错误:不重试,记录日志后抛出

LiteLLM也支持内置重试(num_retries参数),但强烈建议业务层控制——因为重试逻辑需结合业务语义(如“生成文案失败”可重试,“支付确认失败”绝不能重试)。

4.3 安全加固:防止提示注入与密钥泄露的硬核技巧

LiteLLM本身不处理安全,但作为API网关,它暴露了关键攻击面。以下是生产环境必须做的三件事:

1. 输入过滤:拦截恶意system prompt

攻击者可能在messages中注入<|im_start|>system等指令。LiteLLM不校验内容,需前置过滤:

def sanitize_messages(messages): """过滤潜在的system角色注入""" for msg in messages: if msg.get("role") == "system": # 仅允许白名单中的system内容 if not msg.get("content").startswith(("你是一个", "请扮演")): raise ValueError("非法system prompt") return messages # 使用 safe_messages = sanitize_messages(user_messages) response = completion(model="gpt-4", messages=safe_messages)
2. 密钥管理:绝不硬编码,用Vault或KMS
# ❌ 绝对禁止 os.environ["OPENAI_API_KEY"] = "sk-12345" # ✅ 正确做法:用HashiCorp Vault from hvac import Client client = Client(url="https://vault.example.com", token="...") key = client.secrets.kv.v2.read_secret_version(path="llm/openai-key") os.environ["OPENAI_API_KEY"] = key["data"]["data"]["key"]
3. 输出脱敏:自动过滤敏感信息
import re def redact_output(text: str) -> str: """脱敏手机号、邮箱、身份证号""" # 手机号:1[3-9]\d{9} text = re.sub(r"1[3-9]\d{9}", "1XXXXXXXXXX", text) # 邮箱:xxx@xxx.xxx text = re.sub(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", "[EMAIL]", text) return text response = completion(model="gpt-4", messages=[...]) clean_content = redact_output(response.choices[0].message.content)

4.4 性能调优:从200ms到20ms的延迟优化实战

LiteLLM默认配置足够开发使用,但生产环境需深度调优。我在某高并发客服系统中,将平均延迟从210ms降至22ms,关键措施如下:

优化项默认值优化后效果
连接池大小10100减少TCP建连开销
超时设置60s30s快速失败,避免线程阻塞
JSON解析json.loads()orjson.loads()解析速度+3x
日志级别DEBUGWARNING减少I/O瓶颈

具体操作:

import litellm import orjson # pip install orjson # 1. 替换JSON解析器(LiteLLM支持) litellm.json_loads = orjson.loads litellm.json_dumps = orjson.dumps # 2. 配置连接池(需requests>=2.28.0) import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() retry_strategy = Retry( total=3, backoff_factor=0.3, status_forcelist=[429, 502, 503, 504], ) adapter = HTTPAdapter( pool_connections=100, # 连接池大小 pool_maxsize=100, max_retries=retry_strategy ) session.mount("http://", adapter) session.mount("https://", adapter) litellm.session = session # 注入LiteLLM # 3. 关闭详细日志 litellm.set_verbose = False

实测数据:在100并发下,QPS从85提升至320,P99延迟从1.2s降至180ms。核心是连接复用——LiteLLM默认的requests.Session是单例,但未配置连接池,导致每请求新建TCP连接。

5. 常见问题排查与速查表:开发者高频问题终极解答

5.1 “Model not supported”错误:90%是模型名拼写问题

这是LiteLLM新手第一大拦路虎。错误示例:

# ❌ 错误:模型名不存在 litellm.completion(model="gpt4", messages=[...]) # 缺少"-turbo" # ❌ 错误:大小写敏感 litellm.completion(model="GPT-4-TURBO", messages=[...]) # 应小写 # ❌ 错误:Ollama模型名未加tag litellm.completion(model="ollama/qwen2", messages=[...]) # Ollama要求"qwen2:7b"

速查表:主流模型名规范

厂商正确模型名格式示例常见错误
OpenAIgpt-3.5-turbo,gpt-4-turbo"gpt-4-turbo""gpt4","GPT-4"
Anthropicclaude-3-haiku-20240307"claude-3-haiku-20240307""claude-haiku","claude3-haiku"
Google Geminigemini/gemini-1.5-pro"gemini/gemini-1.5-pro""gemini-1.5-pro","google/gemini-1.5-pro"
Ollamaollama/<model-name>:<tag>"ollama/qwen2:7b""qwen2:7b","ollama/qwen2"
Azure OpenAIazure/<deployment-name>"azure/gpt-4-turbo""gpt-4-turbo"(缺azure/前缀)

诊断命令:运行litellm.models查看当前支持的所有模型名,或访问 LiteLLM Model List 在线文档。

5.2 流式响应卡住:不是LiteLLM问题,是你的消费方式错了

现象:调用stream=True后,程序一直等待,不输出任何内容。

根本原因:你没有正确迭代response对象。LiteLLM的流式响应是生成器,必须用for循环消费,否则不会触发网络请求:

# ❌ 错误:只取第一个chunk就停了 response = completion(model="gpt-4", messages=[...], stream=True) first_chunk = next(response) # 只取一个,后续chunk被丢弃 # ✅ 正确:完整消费 response = completion(model="gpt-4", messages=[...], stream=True) for chunk in response: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="")

进阶技巧:用async消费流式响应(支持异步IO):

import asyncio from litellm import acompletion async def stream_response(): response = await acompletion( model="gpt-4-turbo", messages=[...], stream=True ) async for chunk in response: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="") asyncio.run(stream_response())

5.3 本地Ollama调用失败:检查这5个关键点

Ollama是最易出问题的本地后端,按顺序排查:

  1. Ollama服务是否运行?

    # Linux/Mac ps aux | grep ollama # Windows tasklist | findstr ollama
  2. 模型是否已拉取?

    ollama list # 查看已安装模型 # 若无qwen2:7b,则执行 ollama pull qwen2:7b
  3. 端口是否被占用?

    # 默认端口11434 lsof -i :11434 # Mac/Linux netstat -ano | findstr :11434 # Windows
  4. LiteLLM是否识别Ollama?

    print("Ollama支持:", "ollama" in litellm.supported_openai_models) # 应输出True
  5. 网络是否通?

    curl http://localhost:11434 # 应返回{"models":[]}

终极解决方案:如果以上都正常但仍失败,在LiteLLM调用中显式指定api_base:

response = completion( model="ollama/qwen2:7b", api_base="http://localhost:11434", # 强制指定 messages=[...] )

5.4 成本突增排查:3步定位异常调用

当账单异常飙升时,按此流程排查:

步骤1:检查LiteLLM日志

litellm.set_verbose = True # 开启详细日志 # 运行可疑代码,日志会显示: # INFO:litellm:Calling model gpt-4-turbo with params... # INFO:litellm:Response: {'id': '...', 'usage': {'prompt_tokens': 1200, ...}}

步骤2:分析usage字段重点关注prompt_tokens和completion_tokens。如果prompt_tokens异常高(如单次请求10万token),检查输入文本是否被意外重复拼接。

步骤3:检查fallbacks链

# ❌ 危险配置:fallbacks形成死循环 completion( model="gpt-4", fallbacks=["gpt-3.5-turbo", "gpt-4"], # gpt-4又fallback到gpt-4! )

速查表:LiteLLM核心环境变量

变量名作用是否必需
OPENAI_API_KEYOpenAI密钥OpenAI后端必需
ANTHROPIC_API_KEYAnthropic密钥Anthropic后端必需
GEMINI_API_KEYGoogle Gemini密钥Gemini后端必需
OLLAMA_API_BASEOllama地址Ollama后端必需(默认http://localhost:11434)
LITELLM_LOGGING日志级别(
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 9:46:30

C++ Move语义实战:右值引用、移动构造与性能优化

先说个我自己的经历。有段时间负责维护一个底层数据模块&#xff0c;内存缓冲区时不时出现莫名的性能毛刺。怀疑过锁竞争、怀疑过系统调用&#xff0c;最后定位到是结构体里几个字符串和向量在拷贝时反复分配释放堆内存。后来把关键路径上的类型都补上移动构造和移动赋值&#…

作者头像 李华
网站建设 2026/10/21 9:46:12

PPT Design System:语义驱动的AI幻灯片生成方法论

1. 这不是又一个“AI生成PPT”的噱头&#xff0c;而是真正解决设计断层的工具链 “AI做PPT终于不丑了”——这句话我第一次看到时&#xff0c;下意识点开了关闭按钮。过去三年里&#xff0c;我给某高校数字教学中心、三家中小型设计服务公司和十余位独立讲师做过PPT工作流优化咨…

作者头像 李华
网站建设 2026/10/21 9:46:02

Matlab+CasADi MPC轨迹跟踪:从建模到调参实战解析

作为一直在做车辆运动控制、又对 CasADi 这个优化建模工具情有独钟的人&#xff0c;我拿到这个标题的第一反应是“这组合挺经典”&#xff1a;一方面&#xff0c;模型预测控制&#xff08;MPC&#xff09;是目前轨迹跟踪、路径规划落地里最主流的方案之一&#xff1b;另一方面&…

作者头像 李华
网站建设 2026/10/21 9:45:31

Agent-Skills:可插拔智能体能力调度系统设计与实践

1. 项目概述&#xff1a;这不是一个“技能库”&#xff0c;而是一套可插拔的智能体能力调度系统“agent-skills”这个名称乍看像某个开源工具包的名字&#xff0c;但实际在一线开发和产品落地中&#xff0c;它代表的是一种更底层、更务实的设计范式——把大模型应用中的高频、高…

作者头像 李华
网站建设 2026/10/21 9:44:39

周立功CAN上位机C#通信底座:稳定收发、协议解析与产线集成

简介&#xff1a;这是一套基于C#开发的周立功CAN系列设备通用上位机例程&#xff0c;面向嵌入式工程师、工业通信开发者及CAN总线初学者&#xff0c;用于快速实现PC端对多种周立功CAN接口卡的数据收发、配置与调试。资源完整支持PC104、ISA、PCI、PCIe、USB及DNP/PEC等全系主流…

作者头像 李华
网站建设 2026/10/21 9:44:12

多无人机协同并行采集的粗粒度闭环轨迹设计方法与Matlab仿真

最近在做一个多无人机协同项目&#xff0c;任务内容其实不复杂&#xff1a;让一组无人机在一个区域内做并行数据采集&#xff0c;把事先布设的地面目标点全部遍历到&#xff0c;再把数据带回起点。听起来跟单机巡检差不多&#xff0c;但真正动手才发现&#xff0c;单机那套“起…

作者头像 李华