Go製の軽量LLMプロキシ。LiteLLM の設定形式に互換性があり、LiteLLMからの移行やドロップイン代替として使用できる。
OpenAI・Gemini・TavilyのAPIを統一的なOpenAI互換インターフェースで利用でき、各バックエンドへのパススルーも可能。プロキシがAPIキーを注入するため、クライアント側でのキー管理が不要になる。
LiteLLMの全機能を実装しているわけではありません。 APIキー管理・プロバイダルーティング・ログ記録など、プロキシとしての中核機能に特化しています。
- 高速起動 - 0.1秒以内に起動完了(環境による)
- 省メモリ - 起動直後のメモリ使用量10MB以内(ステートレス設計のため長時間運用でも安定)
- OpenAI互換エンドポイント (
/v1/chat/completions) - プロバイダプレフィックスでバックエンド自動ルーティング - パススルーエンドポイント (
/openai/*,/gemini/*,/tavily/*) - 各APIへそのまま転送 - LiteLLM互換設定 -
model_list,general_settings,os.environ/構文に対応 - APIキー認証 -
master_keyによるプロキシアクセス制限 - APIキー注入 - 環境変数で設定したキーをリクエストに自動挿入
- SSEストリーミング対応 - Geminiレスポンスも自動でOpenAI SSE形式に変換
- リクエストログ - JSONL形式でリクエスト/レスポンスを記録(user, metadata, トークン使用量対応)
go build -o gollmproxy .export OPENAI_API_KEY="sk-..."
export GEMINI_API_KEY="AIza..."
export TAVILY_API_KEY="tvly-..."# デフォルト設定 (ポート8080, ログ: gollmproxy.log)
./gollmproxy
# ポート指定
./gollmproxy -port 9090
# 設定ファイル指定
./gollmproxy -config config.yamlmodel フィールドに プロバイダ/モデル名 を指定することでバックエンドが自動選択される。
# Gemini経由
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini/gemini-2.5-flash",
"messages": [{"role": "user", "content": "Hello!"}]
}'
# OpenAI経由
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'
# ストリーミング
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini/gemini-2.5-flash",
"messages": [{"role": "user", "content": "Tell me a story"}],
"stream": true
}'
# user / metadata 付き
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini/gemini-2.5-flash",
"messages": [{"role": "user", "content": "Hello!"}],
"user": "user_12345",
"metadata": {"org_code": "org_abc", "app_name": "my_app"}
}'プレフィックスなしの場合はOpenAIとして扱われる。
各バックエンドAPIにそのままリクエストを転送する。APIキーのみ自動挿入される。
# OpenAI - モデル一覧
curl http://localhost:8080/openai/v1/models
# Gemini - 直接呼び出し
curl -X POST http://localhost:8080/gemini/v1beta/models/gemini-2.5-flash:generateContent \
-H "Content-Type: application/json" \
-d '{
"contents": [{"parts": [{"text": "Hello"}]}]
}'
# Tavily - Web検索
curl -X POST http://localhost:8080/tavily/search \
-H "Content-Type: application/json" \
-d '{"query": "latest AI news"}'curl http://localhost:8080/health
# => {"status":"ok"}| 変数名 | 説明 | デフォルト |
|---|---|---|
PORT |
サーバーポート | 8080 |
LOG_FILE |
リクエストログファイルパス | gollmproxy.log |
LITELLM_MASTER_KEY |
プロキシ認証用マスターキー | (なし) |
OPENAI_API_KEY |
OpenAI APIキー | (なし) |
GEMINI_API_KEY |
Gemini APIキー | (なし) |
TAVILY_API_KEY |
Tavily APIキー | (なし) |
OPENAI_BASE_URL |
OpenAI APIベースURL | https://api.openai.com |
GEMINI_BASE_URL |
Gemini APIベースURL | https://generativelanguage.googleapis.com |
TAVILY_BASE_URL |
Tavily APIベースURL | https://api.tavily.com |
-config フラグで指定。LiteLLMと同じ形式の設定ファイルを使用できる。
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
litellm_key_header_name: X-Litellm-Api-Key
port: 8080
log_file: "gollmproxy.log"
log_request_body: true
log_response_body: true
model_list:
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: os.environ/OPENAI_API_KEY
api_base: https://api.openai.com
- model_name: gemini-flash
litellm_params:
model: gemini/gemini-2.5-flash
api_key: os.environ/GEMINI_API_KEY
search_tools:
- search_tool_name: tavily-search
litellm_params:
search_provider: tavily
api_key: os.environ/TAVILY_API_KEY
google_ai_studio_passthrough:
api_key: os.environ/GEMINI_API_KEY
environment_variables:
OPENAI_API_KEY: "sk-..."
GEMINI_API_KEY: "AIza..."
TAVILY_API_KEY: "tvly-..."general_settings: ポート・ログファイル・認証・ログ出力設定master_key: プロキシへのアクセスを制限するAPIキー(os.environ/構文対応)litellm_key_header_name: 認証ヘッダ名(未設定時はAuthorization)log_request_body: リクエストボディをログに記録するか(デフォルト:true)log_response_body: レスポンスボディをログに記録するか(デフォルト:true)
model_list: LiteLLM互換。litellm_params.modelのプレフィックス (openai/,gemini/) でプロバイダ判定search_tools: 検索ツール設定(Tavily等)google_ai_studio_passthrough: Geminiパススルー用APIキー設定environment_variables: YAMLからOS環境変数をセット(既存の環境変数が優先)os.environ/VARNAME: LiteLLM互換の環境変数参照構文(api_key等で使用)
master_key を設定すると、プロキシへのリクエストにAPIキー認証が必要になる(/health を除く)。
# Authorization ヘッダで認証
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer your-master-key" \
-H "Content-Type: application/json" \
-d '{"model": "gemini/gemini-2.5-flash", "messages": [{"role": "user", "content": "Hello!"}]}'
# カスタムヘッダ名を設定した場合 (litellm_key_header_name: X-Litellm-Api-Key)
curl -X POST http://localhost:8080/v1/chat/completions \
-H "X-Litellm-Api-Key: your-master-key" \
-H "Content-Type: application/json" \
-d '{"model": "gemini/gemini-2.5-flash", "messages": [{"role": "user", "content": "Hello!"}]}'環境変数 > YAML設定ファイル > コマンドラインフラグ > デフォルト値
リクエストログはJSONL形式 (1行1リクエスト) で記録される。
tail -f gollmproxy.log | jq .各エントリのフィールド:
| フィールド | 説明 |
|---|---|
timestamp |
リクエスト受信時刻 (RFC3339) |
request_id |
ユニークなリクエストID |
method |
HTTPメソッド |
path |
リクエストパス |
user |
リクエストの user フィールド |
metadata |
リクエストの metadata オブジェクト |
model |
使用モデル名 |
provider |
バックエンドプロバイダ (openai, gemini) |
stream |
ストリーミングリクエストかどうか |
status_code |
レスポンスステータスコード |
latency_ms |
レイテンシ (ミリ秒) |
prompt_tokens |
プロンプトトークン数 |
completion_tokens |
生成トークン数 |
total_tokens |
合計トークン数 |
req_body |
リクエストボディ (最大10KB, 設定で無効化可) |
resp_body |
レスポンスボディ (最大10KB, 設定で無効化可) |
client_ip |
クライアントIPアドレス |
トークン使用量は非ストリーミングレスポンスで記録される。