これは、なにをしたくて書いたもの?
モデルプロバイダーに対するプロキシサーバー、というか各プロバイダーに対するAPIの読み替えができるソフトウェアを
探していたのですが、LiteLLMというものがあったので試してみることにしました。
LiteLLM
LiteLLMのGitリポジトリーはこちら。
ドキュメントはこちら。
LiteLLM - Getting Started | liteLLM
LiteLLMは入出力をバックエンドにしているモデルプロバイダーのエンドポイントに読み替えられるソフトウェアです。
プロキシサーバーとして実行する形態と、Python SDKを使ってアプリケーション内で使う方法の2つの使い方があります。
プロキシサーバーとして実行する形態は、LLM Gatewayと呼ぶようです。
- LiteLLM Proxy(LLM Gateway)
- Python SDK
今回関心があるのはLLM Gatewayの方ですね。
サポートしているモデルプロバイダーですが、それはそれはたくさんあります…。
今回は、モデルプロバイダーとしてOllamaを使おうと思います。
使い方や設定はこのあたりを見ていけばよさそうです。
Getting Started Tutorial | liteLLM
ひとまず使ってみましょう。
環境
今回の環境はこちら。
$ python3 --version Python 3.12.3 $ uv --version uv 0.10.9
Ollama。
$ bin/ollama --version ollama version is 0.17.7
LiteLLM Proxy(LLM Gateway)をインストールする
まずはLiteLLM Proxy(LLM Gateway)をインストールしましょう。
インストールはpipパッケージとDockerイメージの2つの方法がありますが、今回はpipパッケージとしてインストールします。
プロジェクトを作成。
$ uv init --vcs none litellm-proxy $ cd litellm-proxy
LiteLLM Proxy(LLM Gateway)をインストール。[proxy]が必要なことに注意しましょう。
$ uv add 'litellm[proxy]'
プロジェクトの情報。
pyproject.toml
[project] name = "litellm-proxy" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ "litellm[proxy]>=1.82.0", ]
インストールされたライブラリーの一覧。
$ uv pip list Package Version ------------------------- ------------ aiohappyeyeballs 2.6.1 aiohttp 3.13.3 aiosignal 1.4.0 annotated-doc 0.0.4 annotated-types 0.7.0 anyio 4.12.1 apscheduler 3.11.2 attrs 25.4.0 azure-core 1.38.2 azure-identity 1.25.2 azure-storage-blob 12.28.0 backoff 2.2.1 boto3 1.40.76 botocore 1.40.76 certifi 2026.2.25 cffi 2.0.0 charset-normalizer 3.4.5 click 8.3.1 croniter 6.0.0 cryptography 46.0.5 distro 1.9.0 dnspython 2.8.0 email-validator 2.3.0 fastapi 0.135.1 fastapi-sso 0.16.0 fastuuid 0.14.0 filelock 3.25.0 frozenlist 1.8.0 fsspec 2026.2.0 gunicorn 23.0.0 h11 0.16.0 hf-xet 1.3.2 httpcore 1.0.9 httpx 0.28.1 httpx-sse 0.4.3 huggingface-hub 1.6.0 idna 3.11 importlib-metadata 8.7.1 isodate 0.7.2 jinja2 3.1.6 jiter 0.13.0 jmespath 1.1.0 jsonschema 4.26.0 jsonschema-specifications 2025.9.1 litellm 1.82.0 litellm-enterprise 0.1.33 litellm-proxy-extras 0.4.50 markdown-it-py 4.0.0 markupsafe 3.0.3 mcp 1.26.0 mdurl 0.1.2 msal 1.35.1 msal-extensions 1.3.1 multidict 6.7.1 oauthlib 3.3.1 openai 2.26.0 orjson 3.11.7 packaging 26.0 polars 1.38.1 polars-runtime-32 1.38.1 propcache 0.4.1 pycparser 3.0 pydantic 2.12.5 pydantic-core 2.41.5 pydantic-settings 2.13.1 pygments 2.19.2 pyjwt 2.11.0 pynacl 1.6.2 pyroscope-io 0.8.16 python-dateutil 2.9.0.post0 python-dotenv 1.2.2 python-multipart 0.0.22 pytz 2026.1.post1 pyyaml 6.0.3 redis 7.3.0 referencing 0.37.0 regex 2026.2.28 requests 2.32.5 rich 13.7.1 rpds-py 0.30.0 rq 2.7.0 s3transfer 0.14.0 shellingham 1.5.4 six 1.17.0 sniffio 1.3.1 soundfile 0.12.1 sse-starlette 3.3.2 starlette 0.52.1 tiktoken 0.12.0 tokenizers 0.22.2 tqdm 4.67.3 typer 0.24.1 typing-extensions 4.15.0 typing-inspection 0.4.2 tzlocal 5.3.1 urllib3 2.6.3 uvicorn 0.41.0 uvloop 0.21.0 websockets 15.0.1 yarl 1.23.0 zipp 3.23.0
OllamaをバックエンドにしてLiteLLM Proxy(LLM Gateway)を設定する
では、本題に入りましょう。LiteLLM Proxy(LLM Gateway)のバックエンドにOllamaを設定します。
このあたりを見ながら、設定ファイルを用意。
config.yaml
model_list: - model_name: "gemma3" litellm_params: model: "ollama_chat/gemma3:4b" - model_name: "llama3.2" litellm_params: model: "ollama_chat/llama3.2:3b"
model_nameはAPI呼び出しを行う時のモデル名です。実際のOllamaのモデルはlitellm_paramsのmodelで指定します。
ollama_chatというのは、モデルプロバイダーごとのprefixと思えばよさそうです。
この設定ファイルを--configオプションで指定して、LiteLLM Proxy(LLM Gateway)を起動。
$ uv run litellm --config config.yaml
こんな表示が出てきます。4000ポートでリッスンしているようです。
LiteLLM: Proxy initialized with Config, Set models:
gemma3
llama3.2
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:4000 (Press CTRL+C to quit)
まずはGemma3にアクセスしてみます。
$ curl -s -X POST -H 'Content-Type: application/json' localhost:4000/chat/completions -d \ '{ "model": "gemma3", "messages": [ { "role": "user", "content": "あなたの自己紹介をしてください" } ] }' | jq
レスポンス。
{ "id": "chatcmpl-5321b0c9-adec-4488-a15f-dd719723174b", "created": 1772982917, "model": "gemma3", "object": "chat.completion", "choices": [ { "finish_reason": "stop", "index": 0, "message": { "content": "こんにちは!私はGemmaです。Google DeepMindによってトレーニングされた、大規模言語モデルです。\n\n私はオープンウェイトモデルであり、広く一般に公開されています。テキストと画像をインプットとして受け取り、テキストのみを出力することができます。\n\n私の作成者は、Birmingham大学のチームです。\n\nより詳しく知りたい場合は、私のリポジトリ ([https://github.com/gemma/gemma](https://github.com/gemma/gemma)) をご覧ください。\n", "role": "assistant" } } ], "usage": { "completion_tokens": 102, "prompt_tokens": 14, "total_tokens": 116 } }
返ってきましたね。
Llama 3.2。
$ curl -s -X POST -H 'Content-Type: application/json' localhost:4000/chat/completions -d \ '{ "model": "llama3.2", "messages": [ { "role": "user", "content": "あなたの自己紹介をしてください" } ] }' | jq
こちらもOKです。
{ "id": "chatcmpl-df2831dc-74de-4238-b39a-daf7f8797ebd", "created": 1772982975, "model": "llama3.2", "object": "chat.completion", "choices": [ { "finish_reason": "stop", "index": 0, "message": { "content": "私は、Meta の機械学習モデルです。私は、さまざまなトピックで助言し、情報を提供することができます。私は人工知能の分野でActive Learningを使用して、自分の知識を広げ ongoinglyします。", "role": "assistant" } } ], "usage": { "completion_tokens": 58, "prompt_tokens": 33, "total_tokens": 91 } }
ドキュメントを見ているとAuthorization: BearerでAPIキーを指定していますが、今回は省略しています。
ひとまず動いたのでこれでよしとしましょう。
おわりに
LiteLLM Proxy(LLM Gateway)でOllamaへのプロキシサーバーを立ててみました。
けっこう苦労するのかなと思っていたのですが、割とあっさりと動きました。 ちょっとドキュメントがとっつきにくい気がするのですが、こういうのこそ触ってみないとわからないなという感じです。
LiteLLM Proxyを使って、少しやってみたいことがあるのですが…それはまたの機会に。