LiteLLM Pass-through Endpoint
介紹 LiteLLM 與 pass-through endpoint,並以本地 Ollama 實作 YAML passthrough 與自訂 adapter server 兩種測試。
🧭 TL;DR I: What is LiteLLM?
LiteLLM 是一個 多模型統一代理層 (proxy + SDK)。
可以用一套 OpenAI-compatible API 格式,去打任何下層模型服務(如 Azure OpenAI、Bedrock、Ollama、Claude、Gemini、Mistral 等)。
👉 主要功能:
- 統一 API 格式(
/v1/chat/completions、/v1/embeddings…) - 管理多個 provider 的 key / quota / routing
- 提供代理伺服器模式(LiteLLM Proxy)
- 支援 passthrough 模式(可把請求轉給任意 endpoint,例如本地 Ollama)
這讓上層應用(Python SDK、LangChain、或者 Web App)不用改 code,就能切換不同模型或供應商。
🧭 TL;DR II: What is Pass Through Endpoint?
在 LiteLLM Proxy 裡,「每個 model」定義(在 config.yaml 的 model_list 裡)
都會對應到一個 pass-through route(轉發路徑)。
每條 route 知道要轉給哪個底層 API(api_base),
所以可以把它理解成「一個 model = 一個 pass-through endpoint」。
⚙️ custom passthrough endpoint vs 直接內建 provider 的差異
| 項目 | 內建 provider (ex: Azure, OpenAI) | custom passthrough endpoint |
|---|---|---|
| 設定方式 | 直接在 config.yaml 裡寫 model + api_base + api_key | 在 config.yaml 中設置 "model":"custom/<name>" 並指定 passthrough endpoint |
| 認證方式 | SDK 幫帶 key(例如 api_key, azure_ad_token) | 自行決定 header/body 內容(LiteLLM 只轉發) |
| 請求結構 | LiteLLM 封裝成各 provider 的格式 | 要確保下游 endpoint 能理解 OpenAI 格式 |
| 適用場景 | 常見 LLM API(OpenAI, Azure, Anthropic, etc.) | 任何自建推論服務(如 Ollama, vLLM, Bedrock custom, LoRA endpoint) |
| 是否需 adapter | ❌ 不需要,官方已內建 | ✅ 若 endpoint 不是標準 OpenAI 格式,需要自訂 adapter |
🔧 adapter 的實際用途(advanced custom adapters)
官方文件(Advanced Custom Adapters)裡提到的 adapter,是針對這種情況:
後端 endpoint 不是 OpenAI-compatible API 格式,LiteLLM 需要轉換請求與回應。
例如:
- 你有一個 FastAPI 服務
/api/v1/inference,body schema 完全不同。 - 你要讓 LiteLLM 能把
/v1/chat/completions的格式轉成你後端的格式。
此時你可以寫一個自訂 adapter,例如:
from litellm.adapters.custom_httpx import CustomHttpxAdapter
class MyAdapter(CustomHttpxAdapter):
def format_request(self, body, headers):
# 轉換 LiteLLM 的 body 成你後端的格式
return {"prompt": body["messages"][-1]["content"]}
def format_response(self, response):
# 轉換你後端回傳的結果成 OpenAI 格式
return {"choices": [{"message": {"content": response["output"]}}]}
然後在 config.yaml 指定:
model_list:
- model_name: mycustom
litellm_params:
model: custom/mycustom
api_base: http://localhost:5000
adapter: my_module.MyAdapter
🧩 測試一:本地 Ollama passthrough 實作
目標
在 本地機器上用 Docker 起一個 LiteLLM Proxy,讓它:
- 對外提供
/v1/chat/completions- 內部自動把 request 轉給本地的
Ollama(http://ollama:11434)達到「讓 LiteLLM 當作 Ollama 的 OpenAI API 介面」。
🏗️ 最終工作架構
[openai-python SDK]
│
▼
http://localhost:4000/v1/chat/completions
│
▼
[LiteLLM Proxy container]
│
▼
http://ollama:11434/api/chat
│
▼
[Ollama]
🧱 主要設置過程回顧
-
Docker Compose 服務架構
services: ollama: image: ollama/ollama:latest ports: ["11434:11434"] volumes: ["ollama_data:/root/.ollama"] litellm: image: ghcr.io/berriai/litellm:main platform: linux/amd64 # for M1/M2 macs ports: ["4000:4000"] environment: LITELLM_API_KEY: sk-local-123 OLLAMA_API_BASE: http://ollama:11434 volumes: - ./lite.yaml:/app/proxy_server_config.yaml command: [ "litellm", "--host","0.0.0.0", "--port","4000", "--config","/app/proxy_server_config.yaml" ] depends_on: [ollama] -
lite.yaml(覆蓋預設 Azure config)model_list: - model_name: tinyllama litellm_params: model: ollama/tinyllama api_base: http://ollama:11434 litellm_settings: drop_params: true set_verbose: true -
測試:
curl http://localhost:4000/health # → {"status":"ok"} curl -X POST http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer sk-local-123" \ -H "Content-Type: application/json" \ -d '{"model":"tinyllama","messages":[{"role":"user","content":"hi"}]}'成功即代表整個 pipeline 正常。
-
Python SDK 測試:
from openai import OpenAI client = OpenAI( base_url="http://localhost:4000/v1", api_key="sk-local-123", ) resp = client.chat.completions.create( model="tinyllama", messages=[{"role": "user", "content": "Hello world"}], ) print(resp.choices[0].message.content)
🧩 測試二:Ollama + Custom Server Adapter
目標
在本地環境驗證以 自訂 FastAPI + LiteLLM Adapter Server 為核心的新版 Pass-through 架構。
相較於 YAML 直通配置,本版本透過 自建
server.py服務:
- 直接實作
/v1/custom-ollama-openai(OpenAI → Ollama 格式轉換)- 提供
/v1/custom-ollama(Ollama 原生 passthrough)- 保留
/v1/chat/completions(標準 LiteLLM 介面)- 支援
/health深度健康檢查與/healthz輕量健康檢查此架構讓 LiteLLM 不再僅是 Proxy,而成為可程式化的 LLM 接入層。
⚙️ 架構概念
┌────────────────────────────┐
│ OpenAI / LangChain / SDK │
│ (OpenAI-compatible Client) │
└──────────────┬─────────────┘
│
▼
http://localhost:4000
│
▼
┌────────────────────────────────────┐
│ Custom LiteLLM Adapter Server │
│ • /v1/custom-ollama-openai │ ← OpenAI → Ollama 格式轉換
│ • /v1/custom-ollama │ ← 原生 passthrough
│ • /v1/chat/completions │ ← 標準 OpenAI API
│ • /health /healthz │ ← 健康檢查
└────────────────────────────────────┘
│
▼
http://ollama:11434/api/generate
│
▼
┌───────────────────────────┐
│ Ollama Container (LLM) │
└───────────────────────────┘
💡 此版本不再使用 pass_through_endpoints 的 YAML 設定,而是由 server.py 動態載入 lite.yaml,解析其中的 model_list 與 api_base。
🧱 主要設定架構
-
lite.yaml定義模型別名與路由資訊,例如:
model_list: - model_name: tinyllama litellm_params: model: ollama/tinyllama api_base: http://ollama:11434 general_settings: master_key: sk-1234 litellm_settings: default_model: tinyllama這讓
/v1/chat/completions與/health自動識別所有已登錄模型,無須再配置pass_through_endpoints。 -
Docker 結構
services: ollama: image: ollama/ollama:latest ports: ["11434:11434"] volumes: ["ollama_data:/root/.ollama"] litellm-custom: build: . ports: ["4000:4000"] environment: MASTER_KEY: "sk-1234" OLLAMA_URL: "http://ollama:11434" volumes: - ./lite.yaml:/app/lite.yaml depends_on: [ollama] restart: unless-stopped volumes: ollama_data:
🤖 Server 中的 Adapter 與 Custom Pass-Through Endpoint 介紹
在 測試二 中,我們使用了自訂的 Adapter 與 Custom Pass-Through Endpoint,這使得 LiteLLM 不僅限於將請求直接轉發至標準 OpenAI 或其他內建模型服務,而是提供了更多的自訂與擴展功能,特別是在處理 非標準 LLM 服務 時的靈活性與彈性。
-
Adapter 的角色
Adapter 是用來處理非標準 OpenAI 格式的請求與回應轉換,將 LiteLLM 的 OpenAI-style API 格式轉換為目標服務(如 Ollama)所期望的格式。這使得 LiteLLM 可以與 任何自建或非標準的推論服務(如 Ollama、vLLM 等)順利對接。
例如在專案中,
MyOllamaAdapter就是負責將 OpenAI 的messages格式轉換為 Ollama 所需的prompt格式,並將 Ollama 的回應轉換回 OpenAI 所期望的格式。這不僅簡化了 API 對接的工作,還允許你為每個服務實現自定義的邏輯,例如:- 修改請求的 body 格式
- 改寫 header(如客製化的授權 token)
- 實作回應的格式化與錯誤處理邏輯
-
Custom Pass-Through Endpoint 的應用
Custom Pass-Through Endpoint 是 LiteLLM 的一個強大特性,它允許你定義一個 自訂的路由,將請求轉發到任何模型或推論服務。當使用者呼叫
/v1/custom-ollama這個路由時,LiteLLM 不會直接將請求發送給內建的 API,而是根據配置將其轉發給你指定的 endpoint。在專案中,這個 endpoint 實現了兩種功能:
- 原生 passthrough(
/v1/custom-ollama):這是將請求無任何修改直接轉發到 Ollama 的路由。這對於標準的 LLM 服務(如 Ollama)非常有效,因為它們本身就與 OpenAI 兼容。 - Adapter + Pass-Through(
/v1/custom-ollama-openai):這個路由在將請求轉發到 Ollama 之前,會先進行格式轉換,將 OpenAI 的請求格式(包含messages和temperature等參數)轉換為 Ollama 所能理解的格式。轉換後,再將其送出,並在收到回應後,將其格式化為 OpenAI 所期待的結果。
這樣的結構不僅能支援標準的 OpenAI 兼容服務,也能靈活應對任何自建模型或非標準的 LLM 接口,並可根據需求進行精細化控制,增加了系統的擴展性與靈活性。
- 原生 passthrough(
-
應用場景
這種 Adapter + Custom Pass-Through Endpoint 的模式非常適用於以下場景:
- 跨雲混合架構:當你需要在同一個架構中同時運行來自不同雲端提供者(如 OpenAI、Azure、AWS Bedrock)的模型服務時,可以利用 Adapter 層進行轉換,讓它們無縫協同工作。
- 自建推論服務:如 Ollama、vLLM 等,這些模型服務未必支持標準的 OpenAI 格式,這時 Adapter 就能提供必要的格式轉換,讓 LiteLLM 與這些服務兼容。
- 客製化管控需求:例如需要自訂授權 token、加入額外的流量控制或監控邏輯時,Adapter 提供了程式化的可擴展點。
🧩 健康檢查
/healthz:輕量檢查,確認服務啟動與預設模型。/health:深度檢查(需 Bearer Token),會:- 讀取
lite.yaml的所有模型; - 對每個
api_base執行連線測試; - 對 Ollama 檢查模型是否存在;
- 回傳延遲、可用性與 endpoint 清單。
- 讀取
curl -H "Authorization: Bearer sk-1234" http://localhost:4000/health
🧪 測試步驟
-
OpenAI → Ollama 自動轉換測試
curl -X POST http://localhost:4000/v1/custom-ollama-openai \ -H "Authorization: Bearer sk-1234" \ -H "Content-Type: application/json" \ -d '{ "model": "ollama/tinyllama", "messages": [{"role": "user", "content": "Hello! Say hi in a friendly way."}], "max_tokens": 50, "temperature": 0.7 }' -
直接轉發至 Ollama
curl -X POST http://localhost:4000/v1/custom-ollama \ -H "Authorization: Bearer sk-1234" \ -H "Content-Type: application/json" \ -d '{ "model": "tinyllama", "prompt": "User: Hello! Say hi in a friendly way.", "stream": false, "options": {"temperature": 0.7, "num_predict": 50} }' -
標準
/v1/chat/completions呼叫curl -X POST http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer sk-1234" \ -H "Content-Type: application/json" \ -d '{ "model": "tinyllama", "messages": [{"role": "user", "content": "Hello! Say hi in a friendly way."}] }'
🧠 架構比較
| 項目 | 測試一:Ollama passthrough | 測試二:Custom Adapter Server |
|---|---|---|
| LiteLLM 角色 | YAML Proxy Layer | 可程式化 Adapter Layer |
| 路由管理 | YAML pass_through_endpoints | FastAPI routes in server.py |
| 設定來源 | lite.yaml + proxy_server_config.yaml | lite.yaml(動態載入) |
| 可擴展性 | 僅支援 OpenAI-compatible | 可轉換任意 API 結構 |
| 健康檢查 | /healthz(簡單) | /health + /healthz |
| 適用場景 | 單純代理 | 混合雲、自建推論層、企業治理 |
🧭 Mermaid 架構圖
flowchart TD
A[Client / SDK] --> B['/v1/chat/completions']
A --> C['/v1/custom-ollama-openai']
A --> D['/v1/custom-ollama']
subgraph S[Custom LiteLLM Adapter Server]
B -->|auto route| E[LiteLLM Core]
C -->|OpenAI→Ollama Adapter| F[Ollama API /api/generate]
D -->|Raw passthrough| F
E --> F
end
F --> G[(Ollama Container)]
🧠 結語
在這個新版的實驗中,LiteLLM 的定位從「OpenAI Proxy Layer」進化成一個可編程的 LLM 整合中樞(Programmable Integration Layer)。
過去它只是轉發請求、統一格式;現在則能透過自訂 Adapter Server,掌控整個模型接入、轉換與監控生命週期。
這個新結構具備三個關鍵價值:
-
標準化(Standardization)
所有上層應用(SDK、LangChain、UI)依舊使用相同的 OpenAI API 介面。
LiteLLM 負責對齊格式、路由、與金鑰管理,無論後端是 OpenAI、Azure、Bedrock、還是本地 Ollama,都可透明切換。
-
可程式化(Programmability)
透過
server.py實作的 Adapter,開發者能:-
改寫請求/回應 JSON 結構
-
插入自訂認證與 header
-
實作流量治理、降級策略、或模擬 hybrid routing
這使 LiteLLM 不再只是 proxy,而是智慧轉接層(intelligent translation & governance layer)。
-
-
可監控與可治理(Observability & Governance)
整合的
/health與/healthz端點提供兩層健康檢查:-
/healthz:存活檢查,確保服務運作。 -
/health:深度檢查,對每個模型與上游 endpoint 測試可用性與延遲。這為多模型部署提供了基礎的可觀測性(Observability),也能納入後續監控與報警系統。
-
綜合來看:
- 「測試一」 驗證了 LiteLLM 的「開箱即用」能力:本地 Ollama 能以 OpenAI 介面被直接呼叫。
- 「測試二」 則證明了 LiteLLM 在「非標準環境、混合雲與企業治理場景」中的靈活性與可延展性。
最終,LiteLLM 不只是「能轉發」的代理,而是建立了一個:
可控(Controllable)、可監控(Observable)、可替換(Interchangeable) 的
LLM Abstraction & Governance Layer ——
一個讓多模型環境真正落地、可維運、可持續演進的核心中介層。