Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.agno.com/llms.txt

Use this file to discover all available pages before exploring further.

Research that ends in prose is hard to act on and harder to audit. The last step of a research pipeline should produce a decision with a fixed shape: the call, the conviction, the reasoning, and what it was based on. Give the final agent an output_schema and it returns a validated object.
from typing import List, Literal

from agno.agent import Agent
from agno.models.openai import OpenAIResponses
from pydantic import BaseModel, Field


class Decision(BaseModel):
    call: Literal["BUY", "HOLD", "PASS"] = Field(..., description="The committee decision")
    conviction: Literal["low", "medium", "high"] = Field(..., description="Confidence in the call")
    allocation_usd: float = Field(..., description="Dollar allocation, 0 if not BUY")
    rationale: str = Field(..., description="Why, referencing the analyst inputs")
    citations: List[str] = Field(default_factory=list, description="Sources and prior memos used")


chair = Agent(
    name="Committee Chair",
    model=OpenAIResponses(id="gpt-5.5"),
    output_schema=Decision,
    instructions=(
        "Synthesize the analyst inputs into a decision. Every BUY needs a "
        "dollar amount. Every decision must reference at least one risk."
    ),
)


def briefing(*analyst_outputs: str) -> str:
    return "Analyst inputs:\n\n" + "\n\n".join(analyst_outputs)


result = chair.run(briefing(market, fundamentals, technicals, risk)).content
# Decision(call='BUY', conviction='high', allocation_usd=2_000_000.0,
#          rationale='Momentum and fundamentals align; sized within the
#                      sector cap the Risk Officer set.',
#          citations=['memo:NVDA-2024Q3', 'research:semiconductors'])
Because output_schema=Decision, the run returns a validated Decision, not prose. result.call and result.allocation_usd are safe to act on without parsing text. The chair takes no tools. Its only job is to weigh the specialists’ inputs and commit to a call. Constraining the output to a schema is what makes the result routable: a downstream system can act on call and allocation_usd without parsing prose.

Two artifacts, two purposes

A research system usually produces both a machine-actionable decision and a human-readable memo.
ArtifactFormConsumer
DecisionTyped object (output_schema)Downstream automation, dashboards, audit
MemoMarkdown written to diskHumans, the next review’s context
The memo is written by a dedicated agent with file tools and a fixed template, then archived. The next review reads it back as prior work. The decision is the row you store and act on.

Make it auditable

FieldWhy it earns its place
convictionLets you threshold: act on high, queue medium for review
rationaleThe reasoning trail, required not optional
citationsTies the call back to grounded sources, not the model’s prior
A decision without its citations is unverifiable. Require them in the schema and the instructions.

Gate the irreversible

When a decision triggers a real action (moving capital, publishing a number), put a human in the loop on that step. Approve the call, then let automation act. See human approval.

Next steps

TaskGuide
Carry the memo into the next runGrounding research
Make decisions improve over timeInstitutional learning
Serve the decision to a surfaceServe and embed

Developer Resources