Structured Outputs
Use response_schema to ask providers for schema-shaped output:
from praval import Agent
agent = Agent("extractor", provider="openai", model="gpt-5.4-mini")
response = agent.generate(
"Extract company and amount: Acme paid $42.",
response_schema={
"type": "object",
"properties": {
"company": {"type": "string"},
"amount": {"type": "number"},
},
"required": ["company", "amount"],
},
)
The runtime rejects structured output requests when the resolved capability profile does not support them. It also enforces a schema size limit to avoid oversized provider payloads.
The schema is sent to the provider as a generation constraint. The returned
value remains JSON text in ModelResponse.content; Praval does not perform a
second local JSON Schema validation pass.
import json
payload = json.loads(response.content)
Use a JSON Schema validator or a typed model in application code when local validation is required.
Provider adapters map the neutral schema into provider-specific fields:
Provider |
Mapping |
|---|---|
OpenAI Chat Completions |
|
OpenAI Responses |
|
Anthropic Messages |
|
Gemini |
|
Local OpenAI-compatible |
Disabled unless explicitly enabled |
Agent.chat() still returns text. Prefer Agent.generate() when you need a
provider-constrained schema, response metadata, or usage.