智能体运行时
智能体运行时(代理运行时)
相关源文件
本章引用的主要源码文件:
crates/jcode-message-types/src/lib.rssrc/agent/compaction.rssrc/agent/interrupts.rssrc/agent/provider.rssrc/agent/turn_execution.rssrc/agent/turn_loops.rssrc/agent/turn_streaming_broadcast.rssrc/agent/turn_streaming_mpsc.rssrc/agent_tests.rssrc/message/tests.rssrc/provider/gemini_tests.rssrc/provider/openai/stream.rssrc/provider/openai_tests/parsing_tools.rssrc/provider/openrouter_sse_stream.rssrc/provider/state.rssrc/server/client_lifecycle_tests.rssrc/session/render.rssrc/session_tests/cases.rssrc/tui/app/remote/queue_recovery.rssrc/tui/app/tests/commands_accounts_01/part_02.rssrc/tui/app/tests/commands_accounts_02/part_02.rssrc/tui/app/tests/remote_events_reload_02/part_01.rssrc/tui/app/tests/remote_events_reload_02/part_02.rs
Agent Runtime(代理运行时)是 jcode 的核心执行引擎。它管理单个对话会话的生命周期,处理用户输入、大语言模型(LLM)提供者交互、工具执行和内存管理之间的状态转换。该引擎设计为高度可中断,并支持上下文压缩和子代理生成等高级功能。
智能体结构体
Agent 结构体是维护会话状态和执行 run_turn 循环的主要实体。它封装了大语言模型(LLM)提供者、工具注册表、会话历史以及用于异步交互的各种信号队列。
| 字段 | 描述 |
|---|---|
provider | Provider trait 的实现(例如 Anthropic、OpenAI)src/agent/mod.rs:88 |
session | 包含消息历史和元数据的 Session 对象 src/agent/mod.rs:91 |
registry | 可用工具的 Registry src/agent/mod.rs:89 |
soft_interrupt_queue | 用于在回合中注入消息的线程安全队列 src/agent/mod.rs:115 |
background_tool_signal | 将正在运行的工具移至后台任务的信号 src/agent/mod.rs:117 |
graceful_shutdown | 停止生成并保存状态的信号 src/agent/mod.rs:119 |
cache_tracker | 跟踪消息前缀以检测仅追加违规 src/agent/mod.rs:121 |
来源: src/agent/mod.rs:87-136
run_turn 状态机
代理运行时在 run_turn_streaming_mpsc(用于每个客户端的流式传输)或 run_turn_streaming(用于广播)中作为状态机运行。如果大语言模型(LLM)调用工具,单个"回合"会涉及多次迭代。
回合执行流程
- 修复与准备:
repair_missing_tool_outputs扫描缺失的工具输出并修复记录src/agent/turn_streaming_mpsc.rs:14-20 - 压缩检查:
messages_for_provider评估上下文是否超过 Token 限制,并在必要时触发压缩src/agent/turn_streaming_mpsc.rs:21-45 - 内存注入:
build_memory_prompt_nonblocking_shared执行非阻塞相关性检查,将长期记忆作为<system-reminder>用户消息注入src/agent/turn_streaming_mpsc.rs:50-89 - 提供者调用:
complete_split使用静态和动态部分构建提示,以优化缓存src/agent/turn_streaming_mpsc.rs:110-116 - 流处理:处理传入事件(文本增量、工具调用增量),并通过
ServerEvent广播给客户端src/agent/turn_streaming_mpsc.rs:149-160 - 工具执行:执行请求的工具。如果工具通过
background_tool_signal标记为后台运行,则将其移交给BackgroundTaskManagersrc/agent/mod.rs:117-118 - 循环/完成:如果执行了工具,则追加结果并重复循环。如果存在
SoftInterrupt,则在下次大语言模型(LLM)调用前注入src/agent/turn_streaming_mpsc.rs:13-160
代理运行时管线
来源: src/agent/mod.rs:138-180, src/agent/turn_execution.rs:71-120, src/agent/turn_streaming_mpsc.rs:4-160
中断系统
运行时支持几种中断类型,以允许对代理的执行进行控制:
- 硬取消:通过
Request::Cancel协议消息立即停止当前提供者请求。 - 软中断:在不停止当前生成的情况下向对话中注入消息。消息在
SoftInterruptQueue中排队,并在下一个安全点(通常在工具执行之间)注入src/agent/interrupts.rs:122-152 - 后台工具信号:由
Request::BackgroundTool触发,允许将长时间运行的工具移至后台任务,同时代理继续其回合src/agent/interrupts.rs:160-164 - 优雅关闭:信号用于检查当前部分响应并干净退出
src/agent/interrupts.rs:170-176
来源: src/agent/interrupts.rs:1-176
子代理生成
运行时允许代理生成"子代理"来处理专门任务。这主要用于 Swarm 系统和环境模式。
生成逻辑
- 会话管理:服务器管理按会话 ID 索引的活动代理实例。
- 上下文移交:新会话可以使用现有会话数据初始化,以提供连续性
src/agent/turn_execution.rs:132-143 - 通知:代理可以通过
push_alert向其他代理推送警报,这些警报会在接收者的下一个回合中注入src/agent/interrupts.rs:111-118
Swarm 成员生命周期
来源: src/agent/turn_execution.rs:71-120, src/agent/interrupts.rs:166-172
缓存跟踪与验证
为确保高效的提供者交互,Agent 使用 CacheTracker 来检测消息历史中的仅追加违规。
- 违规检测:在每个 API 请求之前,
record_client_cache_request检查当前消息前缀是否与之前的前缀匹配。如果消息被移除或前缀被修改,则记录违规src/agent/turn_streaming_mpsc.rs:66-67 - 重置逻辑:在上下文压缩或会话回滚时重置跟踪器
src/agent/turn_execution.rs:184 - 压缩处理:在压缩时,由于消息历史结构已发生根本性变化,跟踪器会被重置
src/agent/turn_streaming_mpsc.rs:24-25
来源: src/agent/turn_streaming_mpsc.rs:21-67, src/agent/turn_execution.rs:184-185