本页目录
Subagents / 子 AgentNote 36

04 structured output

它是什么

它是什么

Subagent 可以设置 response_format,让子 Agent 最终结果按 schema 结构化。父 Agent 收到的是 JSON 序列化后的 ToolMessage 内容,不再是随意文本。它适合父 Agent 需要继续处理结果、传给下游工具或保存到结构化存储的场景。

常用程度

中高。只要父 Agent 后面还要程序化处理子 Agent 结果,就该优先考虑。

适合:

  • 子 Agent 返回评分、置信度、sources、风险等级。
  • 父 Agent 要把结果写数据库或传给另一个工具。
  • UI 需要固定字段展示。

不适合:

  • 子 Agent 只需要返回一段总结。
  • schema 还没稳定,频繁改字段会让示例和下游都变烦。

父 Agent 收到什么

没有 response_format 时:

ToolMessage content = 子 Agent 最后一条文本

response_format 时:

ToolMessage content = JSON 字符串

所以父 Agent 或你的代码需要 json.loads(...) 后再处理字段。

最小代码

文件:deepagent_src/subagents_teach/04_structured_output.py

class LessonFinding(BaseModel):
    summary: str
    confidence: float
    sources: list[str]


structured_subagent = {
    "name": "structured-reporter",
    "description": "Use this subagent when the parent needs JSON findings.",
    "system_prompt": "Return structured data.",
    "response_format": LessonFinding,
}

运行

uv run python deepagent_src/subagents_teach/04_structured_output.py

预期输出末尾:

subagent structured output real agent ok

验证方式

脚本真实调用主 Agent,让它委派 structured-reporter;随后解析父 Agent 收到的 task 工具内容为 JSON,并断言字段符合 schema。

本章断言三个字段:

summary = structured-subagent-summary
confidence = 0.91
sources = ["subagent-docs"]

常见误区

structured output 约束的是 subagent 的最终返回结果,不是 subagent 内部每一步工具输出。

另一个坑:父 Agent 拿到的是 JSON 字符串,不是 Python 对象。你在应用代码里要自己解析。

相关资源

  • 查看示例代码:deepagent_src/subagents_teach/04_structured_output.py
    from __future__ import annotations
    
    import json
    
    from deepagents import create_deep_agent
    from pydantic import BaseModel, Field
    
    from _model import get_real_model
    from deepagent_src.agent_output import invoke_and_pretty_print
    
    
    class LessonFinding(BaseModel):
        """Structured result returned by a subagent."""
    
        summary: str = Field(description="Short summary")
        confidence: float = Field(description="Confidence from 0 to 1")
        sources: list[str] = Field(description="Source names")
    
    
    structured_subagent = {
        "name": "structured-reporter",
        "description": "Use this subagent when the parent needs JSON findings.",
        "system_prompt": (
            "Return structured data with summary exactly 'structured-subagent-summary', "
            "confidence exactly 0.91, and sources exactly ['subagent-docs']."
        ),
        "tools": [],
        "response_format": LessonFinding,
    }
    
    
    def main() -> None:
        agent = create_deep_agent(
            model=get_real_model(),
            system_prompt=(
                "You are a coordinator. Delegate JSON finding requests to "
                "structured-reporter with the task tool. Do not ask clarification "
                "for this lesson."
            ),
            subagents=[structured_subagent],
        )
        result = invoke_and_pretty_print(
            agent,
            {
                "messages": [
                    {
                        "role": "user",
                        "content": (
                            "必须调用 task 工具,subagent_type 必须是 structured-reporter。"
                            "任务描述:返回本课固定结构化 findings。"
                        ),
                    }
                ]
            },
        )
    
        task_outputs = [
            getattr(message, "content", "")
            for message in result["messages"]
            if getattr(message, "name", "") == "task"
        ]
        parsed = json.loads(task_outputs[-1])
    
        assert parsed["summary"] == "structured-subagent-summary"
        assert parsed["confidence"] == 0.91
        assert parsed["sources"] == ["subagent-docs"]
        print("subagent structured output real agent ok")
    
    
    if __name__ == "__main__":
        main()