Litelm: LiteLLMの機能限定版
Litelm: LiteLLM Without the Bloat (github.com)
要約
Litelmは、LiteLLMのコア機能であるプロバイダールーティングとメッセージ翻訳を、約2,900行のコードと2つの依存関係(openai、httpx)に凝縮したライブラリです。プロキシサーバー、キャッシュ、コスト追跡などの不要な機能を排除し、モデルルーティング、メッセージ翻訳、ストリーミング、ツール使用、埋め込みに特化しています。LiteLLMとの互換性を保ちつつ、より軽量な代替手段を提供します。
全文翻訳
litelm
[画像: PyPI] [画像: Python] [画像: Tests] [画像: License: MIT]
litelmは、LiteLLMスタイルの共通APIを通じて言語モデルを呼び出すためのPythonライブラリです。プロバイダーの選択、メッセージの変換、ストリーミング、ツール呼び出し、埋め込みなどを扱います。
LiteLLMのルーター、プロキシサーバー、レスポンスキャッシュ、コスト追跡は含まれていません。これらの機能が必要な場合は、litelmはLiteLLMの代替にはなりません。
インストール
pip install litelm # openai + httpx2
pip install litelm[anthropic] # + anthropic SDK
pip install litelm[bedrock] # + boto3
pip install litelm[all] # everything
直接のランタイム依存関係は openai[httpx2]>=2.54.0,<3 と httpx2>=2.12.0,<3 の2つです。リクエストはHTTPX2を使用します。OpenAIは推移的な依存関係としてHTTPXをインストールします。Anthropicのextraはanthropic>=1.5.0を必要とし、これもHTTPX2を使用します。
使用方法
import litelm
# 基本的な補完
response = litelm.completion("openai/gpt-4o", messages=[{"role": "user", "content": "Hello!"}])
print(response.choices[0].message.content)
# ストリーミング
for chunk in litelm.completion("groq/openai/gpt-oss-20b", messages=[...], stream=True):
print(chunk.choices[0].delta.content or "", end="")
# 埋め込み
response = litelm.embedding("openai/text-embedding-3-small", input=["hello world"])
すべての関数には非同期バリアントがあります: acompletion, aembedding, aresponses, atext_completion。
サポートされている関数は、LiteLLMスタイルの引数とレスポンスアクセスパターンを使用します。これはスコープを限定した互換性レイヤーであり、完全なドロップイン代替ではありません。変更する前に機能テーブルを確認してください。空でない fallbacks= は ValueError を発生させます。litelmはフェイルオーバーを実行しません。空または None のフォールバックは受け入れられます。
含まれるもの / 含まれないもの
| litellm | litelm | |
|---|---|---|
モデルルーティング (provider/model → 右エンドポイント) | ✓ | ✓ |
| メッセージ変換 (Anthropic, Bedrock, Cloudflare, Mistral) | ✓ | ✓ |
ストリーミング + stream_chunk_builder | ✓ | ✓ |
| ツール使用 (関数呼び出し) | ✓ | ✓ |
| 埋め込み | ✓ | ✓ |
| テキスト補完 | ✓ | ✓ |
| OpenAIレスポンスAPI | ✓ | ✓ |
| モックレスポンス | ✓ | ✓ |
| ルーター (ロードバランシング、フォールバック) | ✓ | ✗ |
| プロキシサーバー | ✓ | ✗ |
| キャッシュ / バジェット / コスト追跡 | ✓ | ✗ |
| トークンカウント | ✓ | ✗ |
| 画像生成、音声、OCR、ファインチューニング | ✓ | ✗ |
| エージェント、ガードレール、スケジューラー | ✓ | ✗ |
プロバイダー
"provider/model-name" 構文を通じて19のプロバイダーにルーティングします。カスタムのOpenAI互換エンドポイントには api_base を使用します。
最初のセグメントがプロバイダーを選択し、残りがモデル識別子です。例えば、OpenRouterのモデル z-ai/glm-5.3-flash は openrouter/z-ai/glm-5.3-flash になります。未知のプレフィックスは、リクエストをサイレントにOpenAIに送信するのではなく、実際の呼び出しのために明示的な api_base を必要とします。スラッシュのないベアネームは、依然としてOpenAIを選択します。
| プロバイダー | 環境変数 | ハンドラー | 検証済み |
|---|---|---|---|
| OpenAI | OPENAI_API_KEY | OpenAI SDK | はい |
| Anthropic | ANTHROPIC_API_KEY | カスタム | はい |
| Groq | GROQ_API_KEY | OpenAI互換 | はい |
| Mistral | MISTRAL_API_KEY | カスタム | はい |
| xAI | XAI_API_KEY | OpenAI互換 | はい |
| OpenRouter | OPENROUTER_API_KEY | OpenAI互換 | はい |
| Azure | AZURE_API_KEY | OpenAI SDK (Azure) | はい |
| Bedrock | AWS_ACCESS_KEY_ID | カスタム | いいえ |
| Cloudflare | CLOUDFLARE_API_TOKEN | カスタム | いいえ |
| Together | TOGETHERAI_API_KEY | OpenAI互換 | いいえ |
| Fireworks | FIREWORKS_API_KEY | OpenAI互換 | いいえ |
| DeepSeek | DEEPSEEK_API_KEY | OpenAI互換 | いいえ |
| Perplexity | PERPLEXITYAI_API_KEY | OpenAI互換 | いいえ |
| DeepInfra | DEEPINFRA_API_TOKEN | OpenAI互換 | いいえ |
| Gemini | GEMINI_API_KEY | OpenAI互換 | いいえ |
| Cohere | COHERE_API_KEY | OpenAI互換 | いいえ |
| Ollama | — | OpenAI互換 | いいえ |
| vLLM | — | OpenAI互換 | いいえ |
| LM Studio | — | OpenAI互換 | いいえ |
APIキー
プロバイダーの環境変数を設定します。
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
または直接渡します。
litelm.completion("openai/gpt-4o", messages=[...], api_key="sk-...")
litelm.completion("openai/gpt-4o", messages=[...], api_base="http://localhost:8000/v1")
エラーハンドリング
litelmの例外階層を使用して、プロバイダーAPIのエラーをキャッチします。
from litelm import ContextWindowExceededError, RateLimitError, AuthenticationError
try:
response = litelm.completion("openai/gpt-4o", messages=messages)
except ContextWindowExceededError:
# プロンプトが長すぎる — 切り詰めて再試行
pass
except RateLimitError:
# バックオフ
pass
except AuthenticationError:
# APIキーが無効
pass
リトライとストリーミングエラー
num_retries は、チャット補完呼び出しに対するプロバイダーSDKのリトライを設定します(デフォルト: 0)。max_retries はエイリアスです。両方が指定された場合、num_retries が優先されます。これはOpenAI互換プロバイダーおよびAnthropic、Bedrock、Cloudflare、Mistralハンドラーに適用されます。各SDKは、どのエラーをリトライするか、およびバックオフ動作を制御します。
ストリーミングレスポンスが開かれたら、イテレーターの失敗はリクエストを再生せずに表面化されます。トランスポートタイムアウトは Timeout になり、その他のHTTPX2リクエストエラーは APIConnectionError になります。既にyieldされた出力は再生されません。レスポンスを解放するために、close() または await aclose() で部分的に消費されたストリームを明示的に閉じます。
ContextWindowExceededError は、入力/コンテキストのオーバーフローを識別します。無効なトークン資格情報、パラメータ長、および出力専用の max_tokens 制限は、コンテキストオーバーフローとは分類されません。
補完コールバック
LiteLLM互換のコールバックは (kwargs, response, start_time, end_time) を受け取ります。
def on_failure(kwargs, response, start_time, end_time):
error = kwargs["exception"]
print(kwargs["model"], error)
litelm.failure_callback.append(on_failure)
success_callback と failure_callback は、非ストリーミング completion および acompletion 呼び出しをカバーします。コールバックのエラーは、プロバイダーの結果または例外を置き換えることなくログに記録されます。コールバックの kwargs にはメッセージやリクエストメタデータが含まれる場合があります。オブザーバーは、エクスポートされたテレメトリを明示的に削除する必要があります。ストリーミングライフサイクルコールバックはまだサポートされていません。
古い success_callbacks 単一イベント辞書レジストリは、litelm 0.5.0互換性のために引き続き利用可能です。
ツール呼び出し
tools = [{"type": "function", "function": {
"name": "get_weather",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}}]
response = litelm.completion(
"openai/gpt-4o", messages=[{"role": "user", "content": "Weather in Paris?"}],
tools=tools, tool_choice="required",
)
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name, tool_call.function.arguments)
カスタム / ローカルプロバイダー
OpenAI互換サーバーのエンドポイントをオーバーライドするには api_base を使用します。ollama, vllm, lm_studio, lmstudio プレフィックスはAPIキーなしで機能します。明示的なキーまたはプロバイダーの環境変数がSDKプレースホルダーよりも優先されます。
# vLLM
litelm.completion("vllm/my-model", messages=[...], api_base="http://localhost:8000/v1")
# Ollama
litelm.completion("ollama/llama3", messages=[...], api_base="http://localhost:11434/v1")
# LM Studio
litelm.completion("lm_studio/local-model", messages=[...], api_base="http://localhost:1234/v1")
開発の透明性
litelmは人間主導のAI支援ソフトウェアです。コードの多くはClaude CodeとClaude Opus 4.6/4.7を使用して書かれました。2026-05-14以降に書かれたコードは、PiとGPT-5.5を通じて書かれています。互換性の主張は、テストとメンテナーのレビューに基づいています。AIによる作成ではありません。
アップストリームの証明
メンテナーの証明、2026-09-11: LiteLLMのルーティング/フォーマットの変更は、649eb2d から 9a715df2 までレビューされました。監査は360のコアパスコミットをトリアージし、関連する可能性のある動作のためにアップストリームテストを検査し、結果の互換性のギャップをテストファーストで修正しました。ローカルスコープテスト: 262件合格、55件スキップ。利用可能なすべての45プロバイダーライブテストと、すべての10 DSPyスモークテストも現在の依存関係ロックで合格しました。
これはlitelmが宣言したルーティング/フォーマット/DSPyサーフェスのみを証明するものであり、完全なlitellm互換性を証明するものではありません。
ステータス
アルファ版。 580件の独自テストが合格しています。現在のスコープ限定LiteLLM 9a715df2 ベースラインでは、75件の移植されたテストが合格し、アクション可能なアサーション/ランタイムの失敗は残っていません。
DSPy ドロップイン検証済み — 8つの実行パスすべてがライブであることが証明されました(Predict, CoT, 型付きシグネチャ, ストリーミング, 埋め込み, ツール使用, マルチ出力)。
レジリエンス検証、2026-10-01: 580件のローカルテストがPython 3.10および3.14で合格しました。49件のアップストリーム契約テストが合格しました。選択された52件のライブプロバイダー/DSPyテストすべてが合格しました。これには、修正されたAnthropicの出力トークンエラー分類も含まれます。2つのコンテキストウィンドウテストと廃止されたgpt-3.5-turbo-instructテストは除外されました。Bedrockの署名/リトライは、ライブAWS検証ではなく、同期/非同期のモックトランスポートカバレッジを持っています。
テスト
uv run --extra all pytest tests/ -x --ignore=tests/ported --timeout=10 # 580 非ライブテスト
bash scripts/ported_contract.sh # 49 高速アップストリーム契約テスト
uv run --extra all pytest tests/test_live.py -m live --timeout=30 # 45 ライブプロバイダーテスト
uv run pytest tests/test_dspy_smoke.py -m live --timeout=60 # 10 DSPy統合テスト
ライブテストには .env.test にAPIキーが必要です。デフォルトでスキップされます。-m live で実行してください。