HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Litelm: LiteLLMの機能限定版

Litelm: LiteLLM Without the Bloat (github.com)

162 pointsby kennethwolters57 コメント

要約

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 のフォールバックは受け入れられます。

含まれるもの / 含まれないもの

litellmlitelm
モデルルーティング (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を選択します。

プロバイダー環境変数ハンドラー検証済み
OpenAIOPENAI_API_KEYOpenAI SDKはい
AnthropicANTHROPIC_API_KEYカスタムはい
GroqGROQ_API_KEYOpenAI互換はい
MistralMISTRAL_API_KEYカスタムはい
xAIXAI_API_KEYOpenAI互換はい
OpenRouterOPENROUTER_API_KEYOpenAI互換はい
AzureAZURE_API_KEYOpenAI SDK (Azure)はい
BedrockAWS_ACCESS_KEY_IDカスタムいいえ
CloudflareCLOUDFLARE_API_TOKENカスタムいいえ
TogetherTOGETHERAI_API_KEYOpenAI互換いいえ
FireworksFIREWORKS_API_KEYOpenAI互換いいえ
DeepSeekDEEPSEEK_API_KEYOpenAI互換いいえ
PerplexityPERPLEXITYAI_API_KEYOpenAI互換いいえ
DeepInfraDEEPINFRA_API_TOKENOpenAI互換いいえ
GeminiGEMINI_API_KEYOpenAI互換いいえ
CohereCOHERE_API_KEYOpenAI互換いいえ
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 で実行してください。