🚅

LiteLLMのPython SDKを使ってAzure、AWS、Google CloudのLLMサービスを呼び出す

に公開

LiteLLm とは

LiteLLM は OpenAI、Azure OpenAI Service や Bedrock、Huggingface などのモデルを統一的なインターフェースで操作することを目指した OSS です。

LiteLLm は Python SDK と Proxy Server(LLM Gateway)が提供されていますが、本記事では Python SDK を扱います。

LiteLLM Python SDK の導入

LiteLLM の Python SDK を利用するためにプロジェクトの依存関係にlitellmを追加します。

uv add litellm

なお本記事の執筆時点で利用する LiteLLM のバージョンは 1.72.4 になります。
LiteLLM の Python SDK が依存する他のライブラリとしては以下が含まれます。

[[package]]
name = "litellm"
version = "1.72.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
    { name = "aiohttp" },
    { name = "click" },
    { name = "httpx" },
    { name = "importlib-metadata" },
    { name = "jinja2" },
    { name = "jsonschema" },
    { name = "openai" },
    { name = "pydantic" },
    { name = "python-dotenv" },
    { name = "tiktoken" },
    { name = "tokenizers" },
]
sdist = { url = "https://files.pythonhosted.org/packages/83/80/d73c821a2f65ee5b97b41e61d9b18324ebb9d616e1e21844f4253ac38957/litellm-1.72.4.tar.gz", hash = "sha256:8855de30f78bcb1f37af244519b37a37faaaf579401b1414400b5b5e5b616d57", size = 8132997, upload-time = "2025-06-11T05:46:38.041Z" }
wheels = [
    { url = "https://files.pythonhosted.org/packages/6f/0d/0f86db9724b9bd63d057b912aa6aa532a76e6e707f9bb75abbd3b0a0401a/litellm-1.72.4-py3-none-any.whl", hash = "sha256:f98ca994420ed649c466d423655a6e0f2aeecab4564ed372b3378a949e491dc2", size = 8036589, upload-time = "2025-06-11T05:46:34.727Z" },
]

Azure OpenAI Service の呼び出し

まずは Azure で提供される Azure OpenAI Service を LiteLLM で呼び出してみます。
認証はキーベースを用います。キーとエンドポイントの情報は Azure ポータルから参照します。

LiteLLM で テキスト生成の LLM サービスを呼び出す際は completion 関数を利用します。

Azure OpenAI Service を呼び出す際は model パラメータには接頭辞に azure/ をつけた Azure OpenAI Service のデプロイ名、api_baseパラメータに Azure OpenAI Service のエンドポイント情報、api_keyパラメータに Azure OpenAI Service のキー情報を与えます。

コード例ではエンドポイントとキーの情報は環境変数から読むようにしています。

import os
from litellm import completion

azure_openai_base_url = os.getenv("AZURE_OPENAI_TEXT_BASE_URL")
azure_openai_api_key = os.getenv("AZURE_OPENAI_TEXT_API_KEY")
azure_openai_deployment_name = "gpt-4o-mini"

model = f"azure/{azure_openai_deployment_name}"

response = completion(
    model=model,
    api_base=azure_openai_base_url,
    api_key=azure_openai_api_key,
    messages=[
        {
            "content": "LiteLLMはどんなライブラリですか?",
            "role": "user",
        },
    ],
)

結果は OpenAI ライクに取得できます。

{'id': 'chatcmpl-BiXXo4qyOaKePcpIItSsHfkuErer9',
 'created': 1749955076,
 'model': 'gpt-4o-mini-2024-07-18',
 'object': 'chat.completion',
 'system_fingerprint': 'fp_57db37749c',
 'choices': [Choices(finish_reason='stop', index=0, message=Message(content='LiteLLMは、軽量の大規模言語モデル(LLM)を構築、トレーニング、デプロイするためのライブラリです。このライブラリは、主に以下の特長を持っています。\n\n1. **軽量性**: モデルのサイズを小さく保ちながら、効率的に動作することを重視しています。これにより、リソースが限られた環境でも使用しやすくなります。\n\n2. **高い性能**: 軽量でありながら、様々な自然言語処理タスクに対して高い性能を発揮する設計がなされています。\n\n3. **簡単なインターフェイス**: ユーザーフレンドリーなAPIを提供しているため、開発者が迅速にモデルを構築・トレーニング・デプロイできるようになっています。\n\n4. **柔軟性**: ユーザーは自分のデータセットに基づいてモデルをカスタマイズすることが可能です。\n\n5. **コミュニティとサポート**: オープンソースである場合が多く、ユーザーコミュニティがサポートを提供していることも特徴です。\n\nこのような特長により、LiteLLMは特定のアプリケーションや環境において、軽量かつ効率的に動作する大規模言語モデルを提供するための有用なツールです。', role='assistant', tool_calls=None, function_call=None, provider_specific_fields={'refusal': None}, annotations=[]))],
 'usage': Usage(completion_tokens=346, prompt_tokens=19, total_tokens=365, completion_tokens_details=CompletionTokensDetailsWrapper(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0, text_tokens=None), prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=0, cached_tokens=0, text_tokens=None, image_tokens=None)),
 'service_tier': None,
 'prompt_filter_results': [{'prompt_index': 0,
                            'content_filter_results': {'hate': {'filtered': False,
                                                                'severity': 'safe'},
                                                       'jailbreak': {'filtered': False,
                                                                     'detected': False},
                                                       'self_harm': {'filtered': False,
                                                                     'severity': 'safe'},
                                                       'sexual': {'filtered': False,
                                                                  'severity': 'safe'},
                                                       'violence': {'filtered': False,
                                                                    'severity': 'safe'}}}]}

Azure OpenAI Service のレスポンスには Azure OpenAI Service 固有のコンテンツフィルターの結果が含まれています。

Amazon Bedrock の呼び出し

次に AWS の生成 AI サービスである Amazon Bedrock のモデルを呼び出してみます。
AWS のコンソールで Amazon Bedrock にアクセスし、モデルにアクセス権があることを確認しておきます。

認証には IAM ユーザーのアクセスキーを利用します。アクセスキーの作成手順は以下リンクの手順に従います。

https://docs.aws.amazon.com/ja_jp/keyspaces/latest/devguide/create.keypair.html

また LiteLLm では AWS のクライアントとなるboto3がデフォルトでは依存関係に入っていないため追加しておく必要があります。

uv add boto3

アクセスキーの情報は環境変数から読むようにして、Azure OpenAI Service と同様に completion 関数を使って、Amazon Bedrock のモデルを呼び出します。
Amazon Bedrock のモデルを呼び出す際は、modelパラメータに接頭辞にbedrock/を付けたモデル ID、aws_access_key_idパラメータにアクセスキーの ID、aws_secret_access_keyにアクセスキー、aws_region_nameにリージョン情報を与えます。

今回、呼び出すモデルはClaude 3.5 Sonnet v2を使います。

import os
from litellm import completion

aws_access_key_id = os.getenv("AWS_ACCESS_KEY_ID")
aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
region = "ap-northeast-1"
model_id = "apac.anthropic.claude-3-5-sonnet-20241022-v2:0"

model = f"bedrock/{model_id}"

response = completion(
    model=model,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    aws_region_name=region,
    messages=[
        {
            "content": "LiteLLMはどんなライブラリですか?",
            "role": "user",
        },
    ],
)

出力は先ほどと同様の形式で取得できます。

{'id': 'chatcmpl-9c80f8c8-af67-4fec-9f49-5e6684e6bc01',
 'created': 1750697916,
 'model': 'apac.anthropic.claude-3-5-sonnet-20241022-v2:0',
 'object': 'chat.completion',
 'system_fingerprint': None,
 'choices': [Choices(finish_reason='stop', index=0, message=Message(content='LiteLLMは、異なるLLM(大規模言語モデル)プロバイダーに対して統一的なインターフェースを提供するPythonライブラリです。主な特徴は以下の通りです:\n\n1. 統一的なAPIインターフェース\n- OpenAI、Anthropic、Hugging Face、Google、Azureなど複数のLLMプロバイダーに対して共通のAPIを提供\n- OpenAIのAPIフォーマットをベースにした使いやすいインターフェース\n\n2. サポートされる主なプロバイダー\n- OpenAI (GPT-3.5, GPT-4)\n- Anthropic (Claude)\n- Google (PaLM)\n- Azure OpenAI\n- Hugging Face\n- その他多数\n\n3. 主な機能\n- 複数のモデルの同時使用\n- フォールバック機能\n- レート制限の処理\n- エラーハンドリング\n- キャッシュ機能\n\n4. 使用例\n```python\nfrom litellm import completion\n\n# OpenAIモデルの使用\nresponse = completion(\n    model="gpt-3.5-turbo", \n    messages=[{"role": "user", "content": "Hello!"}]\n)\n\n# Anthropicモデルの使用\nresponse = completion(\n    model="claude-instant-1", \n    messages=[{"role": "user", "content": "Hello!"}]\n)\n```\n\n5. メリット\n- コードの互換性維持が容易\n- プロバイダーの切り替えが簡単\n- 統一的なエラーハンドリング\n- シンプルな実装\n\nこのライブラリは、複数のLLMプロバイダーを扱う開発者にとって特に有用です。', role='assistant', tool_calls=None, function_call=None, provider_specific_fields=None))],
 'usage': Usage(completion_tokens=497, prompt_tokens=23, total_tokens=520, completion_tokens_details=None, prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=None, cached_tokens=0, text_tokens=None, image_tokens=None), cache_creation_input_tokens=0, cache_read_input_tokens=0)}

Vertex AI の呼び出し

続いて Google Cloud の LLM サービスである Vertex AI のモデルを呼び出してみます。

Google Cloud のコンソールで Vertex AI API を有効化しておきます。

認証にはサービスアカウントを利用します。

サービスアカウントの作成手順は以下のリンクに従います。

https://cloud.google.com/iam/docs/service-accounts-create?hl=ja

サービスアカウントの機密情報の JSON ファイルを手元にダウンロードしておきます。

また Bedrock の呼び出し時と同様に LiteLLm では Vertex AI のクライアントとなるgoogle-cloud-aiplatformがデフォルトでは依存関係に入っていないため追加しておく必要があります。

uv add google-cloud-aiplatform

JSON ファイルを読み取るようにして、 completion 関数を使って Vertex AI のモデルを呼び出します。
呼び出すモデルにはgemini-2.5-proを利用します。

import os
import json
from litellm import completion


json_file_path = os.getenv("VERTEX_AI_CREDENTIALS_FILE", "")
model_id = "gemini-2.5-pro"

model = f"vertex_ai/{model_id}"

with open(json_file_path, "r") as file:
    credentials = json.load(file)

response = completion(
    model=model,
    vertex_credentials=credentials,
    messages=[
        {
            "content": "LiteLLMはどんなライブラリですか?",
            "role": "user",
        },
    ],
)

出力は以下のような形です。

{'id': '3oVaaNz5FKXTnvgPlIeSoQg',
 'created': 1750762972,
 'model': 'gemini-2.5-pro',
 'object': 'chat.completion',
 'system_fingerprint': None,
 'choices': [Choices(finish_reason='stop', index=0, message=Message(content='はい、承知いたしました。LiteLLMについて詳しく解説します。\n\n---\n\n### LiteLLMとは?\n\n**LiteLLM**は、**様々な大規模言語モデル(LLM)のAPIを、統一されたシンプルな形式で呼び出すためのPythonライブラリ**です。\n\n一言で言うと、**「LLMのAPIを操作するための『万能リモコン』」**のようなものです。\n\n通常、OpenAIのGPT、AnthropicのClaude、GoogleのGeminiなど、異なる会社のLLMを利用する場合、それぞれに特有のAPI形式やライブラリを使ってコードを書く必要があります。LiteLLMは、この違いを吸収し、開発者が**一度コードを書けば、モデル名を変更するだけで様々なLLMを簡単に切り替えられる**ようにします。\n\n### LiteLLMの主な特徴とメリット\n\n#### 1. 統一されたインターフェース (Unified Interface)\nこれがLiteLLMの最大の特徴です。すべてのLLMを`litellm.completion()`という単一の関数で呼び出せます。この関数は、業界標準となりつつあるOpenAIのAPI形式(`messages`パラメータなど)を採用しているため、多くの開発者にとって直感的で使いやすいです。\n\n**【問題】**\n*   OpenAI: `openai.ChatCompletion.create(model="gpt-4", messages=[...])`\n*   Anthropic: `anthropic.Anthropic().messages.create(model="claude-3-opus-20240229", messages=[...])`\n*   Google: `genai.GenerativeModel(\'gemini-pro\').generate_content(...)`\n\n**【LiteLLMによる解決策】**\n```python\nimport litellm\n\n# OpenAIのGPT-4を呼び出す\nresponse = litellm.completion(\n  model="gpt-4", \n  messages=[{"role": "user", "content": "こんにちは!"}]\n)\n\n# AnthropicのClaude 3を呼び出す(model名を変えるだけ!)\nresponse = litellm.completion(\n  model="claude-3-haiku-20240307", \n  messages=[{"role": "user", "content": "こんにちは!"}]\n)\n```\n\n#### 2. プロバイダーの簡単な切り替え\n上記の例のように、`model`パラメータの文字列を変更するだけで、利用するLLMを瞬時に切り替えられます。これにより、以下のようなことが容易になります。\n*   **A/Bテスト**: 複数のモデルの性能や応答を簡単に比較できます。\n*   **コスト最適化**: タスクに応じて最もコストパフォーマンスの良いモデルを選択できます。\n*   **ベンダーロックインの回避**: 特定のLLMプロバイダーに依存しないアプリケーションを構築できます。\n\n#### 3. フォールバックとリトライ機能\nAPI呼び出しが失敗した場合(例: サーバーエラー、レート制限)、自動的にリトライ(再試行)したり、あらかじめ設定しておいた別のモデル(フォールバック先)に切り替えて処理を続行させたりできます。これにより、アプリケーションの堅牢性(Reliability)が大幅に向上します。\n\n#### 4. コスト管理とロギング\nAPI呼び出しごとにかかったコストを自動で追跡・計算する機能があります。どのモデルにどれくらいの費用がかかっているかを簡単に把握できるため、予算管理に非常に役立ちます。また、詳細なログを出力することも可能です。\n\n#### 5. ロードバランシング\n複数のAPIキーやデプロイメント(例: Azure OpenAIの複数のインスタンス)に対して、リクエストを分散させることができます。これにより、スループットを向上させ、レート制限を回避しやすくなります。\n\n#### 6. LiteLLMプロキシ (Proxy)\nLiteLLMは、単体のプロキシサーバーとしても動作させることができます。このプロキシを立てることで、組織内のすべてのLLMリクエストを一つのゲートウェイに集約できます。\n*   APIキーを中央で安全に管理\n*   統一されたエンドポイントを提供\n*   リクエストのキャッシュによるコスト削減と高速化\n*   ユーザーごとのレート制限や予算管理\n\n### どのような人・場合に便利か?\n\n*   **複数のLLMを試したい・比較したい開発者や研究者**\n*   **特定のLLMプロバイダーに依存せず、柔軟なアプリケーションを構築したい場合**\n*   **本番環境で、一部のLLMサービスがダウンしても安定して稼働するシステムを作りたい場合**(フォールバック機能)\n*   **LLMの利用コストを厳密に管理・監視したい企業やチーム**\n*   **OpenAIのAPI形式に慣れていて、他のLLMも同じ感覚で使いたい開発者**\n\n### 簡単なコード例\n\n1.  **インストール**\n    ```bash\n    pip install litellm\n    ```\n\n2.  **APIキーの設定**\n    利用したいサービスのAPIキーを環境変数に設定します。\n    ```bash\n    export OPENAI_API_KEY="sk-..."\n    export ANTHROPIC_API_KEY="sk-ant-..."\n    export GOOGLE_API_KEY="..."\n    ```\n\n3.  **コードの実行**\n    ```python\n    import litellm\n\n    messages = [{"role": "user", "content": "LiteLLMについて3つのポイントで教えて。"}]\n\n    # === OpenAI GPT-3.5 Turbo を使う ===\n    print("--- Calling OpenAI ---")\n    response_openai = litellm.completion(\n        model="gpt-3.5-turbo",\n        messages=messages\n    )\n    print(response_openai.choices[0].message.content)\n\n\n    # === Anthropic Claude 3 Haiku を使う ===\n    print("\\n--- Calling Anthropic Claude ---")\n    response_claude = litellm.completion(\n        model="claude-3-haiku-20240307", # model名を変えるだけ\n        messages=messages\n    )\n    print(response_claude.choices[0].message.content)\n\n\n    # === Google Gemini Pro を使う ===\n    print("\\n--- Calling Google Gemini ---")\n    response_gemini = litellm.completion(\n        model="gemini/gemini-pro", # model名を変えるだけ\n        messages=messages\n    )\n    print(response_gemini.choices[0].message.content)\n    ```\n\n### まとめ\n\nLiteLLMは、乱立するLLMのAPIを統一的な方法で扱えるようにする「抽象化レイヤー」です。これにより、開発者はLLMの切り替えを気にすることなく、アプリケーションのロジック開発に集中できます。\nマルチLLM時代において、開発の効率化、コスト管理、システムの安定性向上を実現するための、非常に強力で便利なライブラリと言えるでしょう。', role='assistant', tool_calls=None, function_call=None, provider_specific_fields=None))],
 'usage': Usage(completion_tokens=3238, prompt_tokens=10, total_tokens=3248, completion_tokens_details=CompletionTokensDetailsWrapper(accepted_prediction_tokens=None, audio_tokens=None, reasoning_tokens=1743, rejected_prediction_tokens=None, text_tokens=1495), prompt_tokens_details=PromptTokensDetailsWrapper(audio_tokens=None, cached_tokens=None, text_tokens=10, image_tokens=None)),
 'vertex_ai_grounding_metadata': [],
 'vertex_ai_url_context_metadata': [],
 'vertex_ai_safety_results': [],
 'vertex_ai_citation_metadata': []}

Vertex AI のレスポンスには、Azure OpenAI Service 固有のコンテンツフィルターと同様に Vertex AI 固有のフィールドが含まれています。

まとめ

LiteLLM を使うことで異なるクラウドベンダーの LLM サービスの呼び出しを統一的なインターフェースで実現できます。
統一的なインターフェースで実現できることに加えて、LiteLLM ではエラー時の例外情報も LiteLLM 固有の例外クラスとして補足できるので複数の LLM サービスを呼び出す必要があるユースケースのあるアプリケーション開発などでも有効な選択肢になりそうです。

Discussion