本页目录
Context EngineeringNote 18

02 Runtime context:每次调用的静态配置

它是什么

它是什么

Runtime context 是 invoke 时传入的每轮固定配置,比如用户 ID、角色、租户、连接信息或 API key。它默认不会进入模型 prompt,只有工具或 middleware 读取后才会产生影响。它解决的问题是:工具需要知道“当前是谁、有什么权限”,但不应该把敏感值直接塞进对话文本。

最小代码

文件:deepagent_src/context_engineering_teach/02_runtime_context.py

@dataclass
class RunContext:
    user_id: str
    role: str


@tool
def current_user_note(query: str, runtime: ToolRuntime[RunContext]) -> str:
    """Return a note scoped to the invoking user."""
    return f"{runtime.context.user_id}:{runtime.context.role}:{query}"

运行

uv run python deepagent_src/context_engineering_teach/02_runtime_context.py

预期输出:

runtime context real agent ok

验证方式

脚本会真实调用 Agent,并要求 Agent 调用 current_user_note 工具,断言工具输出里包含从 runtime.context 读到的 user_idrole

常见误区

别把 runtime context 当成长期记忆。它只属于本次运行;跨 thread、跨会话要用 long-term memory 或外部存储。

相关资源

  • 查看示例代码:deepagent_src/context_engineering_teach/02_runtime_context.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
        role: str
    
    
    @tool
    def current_user_note(query: str, runtime: ToolRuntime[RunContext]) -> str:
        """Return a note scoped to the invoking user."""
        return f"{runtime.context.user_id}:{runtime.context.role}:{query}"
    
    
    def main() -> None:
        agent = create_deep_agent(
            model=get_real_model(),
            tools=[current_user_note],
            context_schema=RunContext,
        )
    
        result = invoke_and_pretty_print(
            agent,
            {
                "messages": [
                    {
                        "role": "user",
                        "content": (
                            "必须调用 current_user_note 工具,query 参数填 recent activity,"
                            "然后只用一句话复述工具结果。"
                        ),
                    }
                ]
            },
            context=RunContext(user_id="u-123", role="readonly"),
        )
    
        tool_outputs = [
            getattr(message, "content", "")
            for message in result["messages"]
            if message.__class__.__name__ == "ToolMessage"
        ]
    
        assert any("u-123:readonly:recent activity" in output for output in tool_outputs)
        print("runtime context real agent ok")
    
    
    if __name__ == "__main__":
        main()