-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Closed
Description
Description
I want to be able to use native structured generation in the direct mode. Currently, this works but requires to import from a private module. This would be cleaner if users could from pydantic_ai.output import OutputObjectDefinition.
All other possible argument types of ModelRequestParameters are available in public modules, this is the only one missing.
from pydantic import BaseModel
from pydantic_ai._output import OutputObjectDefinition # <<<<<<<< private import
from pydantic_ai.direct import model_request_sync
from pydantic_ai.messages import (
ModelRequest,
SystemPromptPart,
UserPromptPart,
)
from pydantic_ai.models import ModelRequestParameters
from pydantic_ai.models.openai import (
OpenAIResponsesModel,
)
model = OpenAIResponsesModel(
model_name="gpt-5-mini",
)
class LineItem(BaseModel):
item_name: str
quantity: int
messages = [
ModelRequest(
[
SystemPromptPart("Extract the line items from the message."),
UserPromptPart("hi i want to order five pizzas."),
]
)
]
request_parameters = ModelRequestParameters(
output_mode="native",
output_object=OutputObjectDefinition(
json_schema=LineItem.model_json_schema(),
),
)
response = model_request_sync(
model,
messages,
model_request_parameters=request_parameters,
)
print(response)
# ModelResponse(
# parts=[
# ThinkingPart(
# content="",
# id="...",
# signature="...",
# provider_name="openai",
# ),
# TextPart(
# content='{"item_name":"pizza","quantity":5}',
# id="...",
# ),
# ],
# usage=RequestUsage(
# input_tokens=56, output_tokens=148, details={"reasoning_tokens": 128}
# ),
# model_name="gpt-5-mini-2025-08-07",
# timestamp=datetime.datetime(2025, 9, 23, 14, 54, 25, tzinfo=TzInfo(UTC)),
# provider_name="openai",
# provider_details={"finish_reason": "completed"},
# provider_response_id="...",
# finish_reason="stop",
# )References
No response
Metadata
Metadata
Assignees
Labels
No labels