团队可以像单个代理一样,使用 Pydantic 模型生成结构化数据。此功能非常适合协调数据提取、分析和报告生成,其中多个代理协同工作以产生结构化结果。

示例

让我们创建一个生成结构化 StockReport 的股票研究团队。
stock_team.py
from typing import List
from pydantic import BaseModel, Field
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
from agno.tools.yfinance import YFinanceTools

class StockAnalysis(BaseModel):
    symbol: str
    company_name: str
    analysis: str

class CompanyAnalysis(BaseModel):
    company_name: str
    analysis: str

class StockReport(BaseModel):
    symbol: str = Field(..., description="股票代码符号")
    company_name: str = Field(..., description="完整公司名称")
    current_price: str = Field(..., description="当前股票价格")
    analysis: str = Field(..., description="结合多种视角的全面分析")
    recommendation: str = Field(..., description="投资建议:买入、持有或卖出")

# 创建专业代理
stock_searcher = Agent(
    name="股票搜索器",
    model=OpenAIChat("gpt-4o"),
    response_model=StockAnalysis,
    role="搜索当前股票信息和价格数据。",
    tools=[
        YFinanceTools(
            stock_price=True,
            analyst_recommendations=True,
        )
    ],
)

company_info_agent = Agent(
    name="公司信息搜索器", 
    model=OpenAIChat("gpt-4o"),
    role="研究公司基本面和近期新闻。",
    response_model=CompanyAnalysis,
    tools=[
        YFinanceTools(
            stock_price=False,
            company_info=True,
            company_news=True,
        )
    ],
)

# 创建具有结构化输出的团队
stock_research_team = Team(
    name="股票研究团队",
    mode="coordinate",
    model=OpenAIChat("gpt-4o"),
    members=[stock_searcher, company_info_agent],
    response_model=StockReport,
    markdown=True,
    show_members_responses=True,
)

stock_research_team.print_response("给我一份关于 NVDA 的全面股票报告")
该团队将协调其成员之间进行工作,并生成一个结构化的 StockReport 对象:
StockReport(
symbol='NVDA',
company_name='NVIDIA Corporation',
current_price='$875.42',
analysis='NVIDIA 通过 H100 和即将推出的 H200 GPU 的强劲需求,继续主导人工智能芯片市场。由于企业人工智能的采用和云计算提供商的扩展,该公司在数据中心收入方面表现出卓越的增长。与主要科技公司的近期合作关系巩固了其市场地位,尽管来自 AMD 和英特尔的竞争正在加剧。',
recommendation='Buy'
)

使用解析器模型

您可以使用额外的模型来解析和结构化主模型的输出。当主模型针对推理任务进行了优化时,这种方法特别有效,因为此类模型可能无法始终产生详细的结构化响应。
team = Team(
    name="股票研究团队",
    mode="coordinate",
    model=Claude(id="claude-sonnet-4-20250514"),
    members=[stock_searcher, company_info_agent],
    response_model=StockReport,
    parser_model=OpenAIChat(id="gpt-4o"),
)
您还可以为 Parser Model 提供自定义的 parser_model_prompt

流式传输结构化输出

团队支持流式传输与结构化输出,其中 content 事件包含完整的结构化结果作为单个事件。
streaming_team.py
from typing import List
from pydantic import BaseModel, Field
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team.team import Team
from agno.tools.yfinance import YFinanceTools

class MarketAnalysis(BaseModel):
    sector: str = Field(..., description="正在分析的市场领域")
    key_trends: List[str] = Field(..., description="影响该领域的关键趋势")
    top_performers: List[str] = Field(..., description="该领域表现最佳的股票")
    market_outlook: str = Field(..., description="整体市场前景和预测")
    risk_factors: List[str] = Field(..., description="需要考虑的关键风险因素")

# 创建研究代理
trend_analyst = Agent(
    name="趋势分析师",
    model=OpenAIChat("gpt-4o"),
    role="分析市场趋势和行业表现。",
    tools=[YFinanceTools(stock_price=True, analyst_recommendations=True)]
)

risk_assessor = Agent(
    name="风险评估师", 
    model=OpenAIChat("gpt-4o"),
    role="识别和评估市场风险与机遇。",
    tools=[YFinanceTools(company_news=True, company_info=True)]
)

# 创建流式传输团队
market_research_team = Team(
    name="市场研究团队",
    mode="coordinate", 
    model=OpenAIChat("gpt-4o"),
    members=[trend_analyst, risk_assessor],
    response_model=MarketAnalysis,
    markdown=True,
    show_members_responses=True,
)

# 流式传输团队响应
market_research_team.print_response(
    "分析 2024 年第一季度科技行业", 
    stream=True, 
    stream_intermediate_steps=True
)
当使用团队和结构化输出进行流式传输时,您将看到来自个别团队成员的中间步骤,但最终的结构化结果是作为一个完整的块交付的,而不是渐进式流式传输的。

开发者资源