压缩时机从 process 整体返回后提前到每轮工具调用完成后,更及时控制上下文大小。 两阶段压缩: - 工程化压缩(70% 阈值触发):截断非子代理 tool 结果到 100 token,仅改内存不影响 DB - LLM 压缩(50% 阈值触发):工程化压缩后仍超 50% 才调 LLM,避免不必要的 LLM 调用 LLM 压缩三段保留策略: - 保留最旧 5 个 unit 和最新 5 个 unit 原样 - 中间段用 LLM 生成摘要(heavy prompt) - SystemGuard 永远保留不计入配额 - ToolRound 原子性由 parse_to_units 保证,切分在 unit 边界 工程化压缩: - truncate_tool_results_in_place 截断 role="tool" 且 tool_name!="task" 的消息 - 子代理返回(tool_name="task")保持原样 - char_indices 确保 UTF-8 字符边界安全,截断后追加 "...[已截断]" 标记 AgentLoop 集成: - 新增 CompactionSink trait,LLM 压缩结果通过 sink 回写 DB - AgentProcessResult 新增 compaction_performed 和 engineering_compaction_applied 标记 - finalize_result 据此决定是否 reload DB 历史(避免重复 append)和跳过兜底压缩 错误恢复: - LLM 压缩失败降级为仅工程化压缩,不中断 agent loop - sink.compact 失败记 error 日志继续使用内存压缩结果,DB 下次 process 会重新触发压缩 清理旧的 two-segment 差异化压缩代码(OLDER_BUDGET_RATIO、find_safe_split_point、 build_light_summary_prompt 等),新增 unit_to_messages 辅助函数。
16 lines
502 B
Rust
16 lines
502 B
Rust
pub mod agent_loop;
|
|
pub mod context_compressor;
|
|
pub mod runtime_config;
|
|
pub mod system_prompt;
|
|
|
|
pub use agent_loop::{
|
|
AgentError, AgentLoop, AgentProcessResult, CompactionSink, EmittedMessageHandler,
|
|
PersistingEmittedMessageHandler, SkillProvider,
|
|
};
|
|
pub use context_compressor::ContextCompressor;
|
|
pub use runtime_config::AgentRuntimeConfig;
|
|
pub use system_prompt::{
|
|
CompositeSystemPromptProvider, SystemPrompt, SystemPromptContext, SystemPromptProvider,
|
|
generate_system_env_prompt,
|
|
};
|