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.py
"""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__":
    pass

output_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/activate

Install dependencies

uv pip install -U agno ollama openai

Select 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:20b

Run the example

Save the code above as structured_output.py, then run:

python structured_output.py

Full source: cookbook/90_models/ollama/responses/structured_output.py