本页目录
Context EngineeringNote 21

05 Subagents:上下文隔离

它是什么

它是什么

Subagent 用独立上下文处理重活,主 Agent 只接收最终结果。它解决的问题是:网页搜索、文件读取、数据库查询这类多步工具调用会制造大量中间日志,容易把主上下文撑爆。runtime context 会传给 subagent,所以用户和权限信息仍然可用。

最小代码

文件:deepagent_src/context_engineering_teach/05_context_isolation_subagents.py

research_subagent = {
    "name": "researcher",
    "description": "Do heavy research and return only a concise summary.",
    "system_prompt": "Keep the final answer under 120 words. Do not return raw tool logs.",
    "tools": [get_user_marker],
}

运行

uv run python deepagent_src/context_engineering_teach/05_context_isolation_subagents.py

预期输出:

context isolation subagent real agent ok

验证方式

脚本真实调用主 Agent,让它把任务交给 subagent;subagent 调用 get_user_marker 工具,验证 runtime context 能传到 subagent。

常见误区

别让 subagent 返回原始搜索结果和完整工具日志。subagent 的价值就是隔离上下文,返回一份够主 Agent 决策的短总结。

相关资源

  • 查看示例代码:deepagent_src/context_engineering_teach/05_context_isolation_subagents.py
    from __future__ import annotations
    
    from dataclasses import dataclass
    
    from deepagents import create_deep_agent
    from langchain.tools import ToolRuntime, tool
    
    from _model import get_real_model
    from deepagent_src.agent_output import invoke_and_pretty_print
    
    
    @dataclass
    class RunContext:
        user_id: str
        thread_id: str
    
    
    @tool
    def get_user_marker(runtime: ToolRuntime[RunContext]) -> str:
        """Return the user marker from runtime context."""
        return f"{runtime.context.user_id}@{runtime.context.thread_id}"
    
    
    research_subagent = {
        "name": "researcher",
        "description": "Do heavy research and return only a concise summary.",
        "system_prompt": "Keep the final answer under 120 words. Do not return raw tool logs.",
        "tools": [get_user_marker],
    }
    
    
    def main() -> None:
        agent = create_deep_agent(
            model=get_real_model(),
            subagents=[research_subagent],
            context_schema=RunContext,
        )
        result = invoke_and_pretty_print(
            agent,
            {
                "messages": [
                    {
                        "role": "user",
                        "content": (
                            "把任务交给 researcher subagent。"
                            "要求 subagent 调用 get_user_marker 工具,并返回工具结果。"
                        ),
                    }
                ]
            },
            context=RunContext(user_id="u-123", thread_id="t-1"),
        )
    
        assert agent is not None
        assert research_subagent["tools"] == [get_user_marker]
        assert "u-123@t-1" in result["messages"][-1].content
        print("context isolation subagent real agent ok")
    
    
    if __name__ == "__main__":
        main()