跳至主要內容

結構化輸出(JSON 模式)

快速開始

from litellm import completion
import os

os.environ["OPENAI_API_KEY"] = ""

response = completion(
model="gpt-4o-mini",
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
print(response.choices[0].message.content)

檢查模型支援

1. 檢查模型是否支援 response_format

呼叫 litellm.get_supported_openai_params 以檢查模型/提供者是否支援 response_format

from litellm import get_supported_openai_params

params = get_supported_openai_params(model="anthropic.claude-3", custom_llm_provider="bedrock")

assert "response_format" in params

2. 檢查模型是否支援 json_schema

這用於檢查您是否可以傳入

  • response_format={ "type": "json_schema", "json_schema": … , "strict": true }
  • response_format=<Pydantic Model>
from litellm import supports_response_schema

assert supports_response_schema(model="gemini-1.5-pro-preview-0215", custom_llm_provider="bedrock")

請參閱 model_prices_and_context_window.json 以取得完整的模型清單及其對 response_schema 的支援情況。

傳入 'json_schema'

若要使用結構化輸出,只需指定

response_format: { "type": "json_schema", "json_schema": … , "strict": true }

適用於:

  • OpenAI 模型
  • Azure OpenAI 模型
  • xAI 模型(Grok-2 或更新版本)
  • Google AI Studio - Gemini 模型
  • Vertex AI 模型(Gemini + Anthropic)
  • Bedrock 模型
  • Anthropic API 模型
  • Groq 模型
  • Ollama 模型
  • Databricks 模型
import os
from litellm import completion
from pydantic import BaseModel

# add to env var
os.environ["OPENAI_API_KEY"] = ""

messages = [{"role": "user", "content": "List 5 important events in the XIX century"}]

class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]

class EventsList(BaseModel):
events: list[CalendarEvent]

resp = completion(
model="gpt-4o-2024-08-06",
messages=messages,
response_format=EventsList
)

print("Received={}".format(resp))

events_list = EventsList.model_validate_json(resp.choices[0].message.content)

驗證 JSON Schema

並非所有 vertex 模型都支援將 json_schema 傳給它們(例如 gemini-1.5-flash)。為了解決這個問題,LiteLLM 支援在用戶端對 json schema 進行驗證。

litellm.enable_json_schema_validation=True

如果已設定 litellm.enable_json_schema_validation=True,LiteLLM 將使用 jsonvalidator 驗證 json 回應。

查看程式碼

# !gcloud auth application-default login - run this to add vertex credentials to your env
import litellm, os
from litellm import completion
from pydantic import BaseModel


messages=[
{"role": "system", "content": "Extract the event information."},
{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
]

litellm.enable_json_schema_validation = True
litellm.set_verbose = True # see the raw request made by litellm

class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]

resp = completion(
model="gemini/gemini-1.5-pro",
messages=messages,
response_format=CalendarEvent,
)

print("Received={}".format(resp))

Gemini - 原生 JSON Schema 格式(Gemini 2.0+)

Gemini 2.0+ 模型會自動使用原生 responseJsonSchema 參數,這可提供與標準 JSON Schema 格式更好的相容性。

優點(Gemini 2.0+):

  • 標準 JSON Schema 格式(較小寫的型別,例如 stringobject
  • 支援 additionalProperties: false,以進行更嚴格的驗證
  • 與 Pydantic 的 model_json_schema() 更相容
  • 不需要 propertyOrdering

用法

from litellm import completion
from pydantic import BaseModel

class UserInfo(BaseModel):
name: str
age: int

response = completion(
model="gemini/gemini-2.0-flash",
messages=[{"role": "user", "content": "Extract: John is 25 years old"}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "user_info",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
},
"required": ["name", "age"],
"additionalProperties": False # Supported on Gemini 2.0+
}
}
}
)

模型行為

模型使用的格式additionalProperties 支援
Gemini 2.0+responseJsonSchema(JSON Schema)✅ 是
Gemini 1.5responseSchema(OpenAPI)❌ 否

LiteLLM 會根據模型版本自動選取適當的格式。