Structured Output
Request JSON and validate a MovieScript with Pydantic through Ollama's local Responses API.
Use Ollama server v0.13.3 or later, independently of the installed Python SDK version. Follow the standalone setup below: this program uses gpt-oss:20b, despite the older llama3.1:8b pull command in the preserved source comment.
The compatible Responses API receives the schema in text.format. Agno validates the returned content locally. Use the local server; Ollama Cloud currently does not support structured outputs.
"""Structured output example using Ollama with the OpenAI Responses API.
This demonstrates using Pydantic models for structured output with Ollama's
Responses API endpoint.
Requirements:
- Ollama v0.13.3 or later running locally
- Run: ollama pull llama3.1:8b
"""
from typing import List
from agno.agent import Agent
from agno.models.ollama import OllamaResponses
from pydantic import BaseModel, Field
# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------
class MovieScript(BaseModel):
name: str = Field(..., description="Give a name to this movie")
setting: str = Field(
..., description="Provide a nice setting for a blockbuster movie."
)
ending: str = Field(
...,
description="Ending of the movie. If not available, provide a happy ending.",
)
genre: str = Field(
...,
description="Genre of the movie. If not available, select action, thriller or romantic comedy.",
)
characters: List[str] = Field(..., description="Name of characters for this movie.")
storyline: str = Field(
..., description="3 sentence storyline for the movie. Make it exciting!"
)
agent = Agent(
model=OllamaResponses(id="gpt-oss:20b"),
description="You write movie scripts.",
output_schema=MovieScript,
)
agent.print_response("New York")
# ---------------------------------------------------------------------------
# Run Agent
# ---------------------------------------------------------------------------
if __name__ == "__main__":
passoutput_schema describes the expected type. If parsing or validation fails, result.content can remain a string. Before accessing schema fields in a run result, use isinstance(result.content, YourSchema), replacing YourSchema with the class you passed as output_schema.
Run the Example
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateInstall dependencies
uv pip install -U agno ollama openaiSelect the local Ollama server
In the shell used for the pull commands and Python example, clear a previous cloud key and point native clients and embeddings at your local server:
unset OLLAMA_API_KEY
export OLLAMA_HOST="http://localhost:11434"Without this reset, OLLAMA_API_KEY makes Agno's default Ollama model route to https://ollama.com even when OLLAMA_HOST points locally. Keep a local Ollama server running for the following steps.
Prepare Ollama
Install and start Ollama server v0.13.3 or later, then pull the model used by this example:
ollama pull gpt-oss:20bRun the example
Save the code above as structured_output.py, then run:
python structured_output.pyFull source: cookbook/90_models/ollama/responses/structured_output.py