Files
agcore/src/agent/runtime.rs
T
徐涛 5baa170508 docs: 更新 README feature 表 + 升级指南 + 示例注释 + roadmap 同步
- README 添加 feature 组合表 + 模块级 features 清单 + 升级指南
- 18 个 example 顶部添加 Required features 注释
- roadmap.md 和 roadmap-v0.3.2.md 同步 Phase 26-27 完成状态
- cargo fmt 全量格式化(修复预存格式问题,CI format job 可通过)
2026-07-19 08:18:04 +08:00

128 lines
5.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! Runtime Bundle —— 显式依赖注入容器(OpenHarness 风格)。
//!
//! 集中持有 Agent 运行所需的全部运行时依赖:`LlmProvider` / `ToolRegistry` / `HookExecutor` /
//! `MemoryStore`(弱引用)/ `MemoryRetriever`(弱引用) / `AgentConfig`。
//!
//! **设计意图**(参见 `docs/7-agent-runtime.md` §3.2.2):
//!
//! - 所有运行时依赖显式打包,便于跨 `AgentSession` 共享、便于测试注入 mock
//! - `memory_store` / `retriever` 为 `Option`:上层应用不传也能跑(无记忆模式)
//! - 构造时若 `retriever` 为 `Some`,自动注册 `"retrieve"` toolv0.1 占位——
//! Phase 4a 不在 `submit_turn` 中真正调用;Phase 4a 任务范围仅"装配可注册",
//! 真正的 `RetrieveTool` 实现留待 v0.2 接入)
//! - 不持有 `Box<dyn LlmProvider>` 而是 `Arc<dyn LlmProvider>`:支持多 session 共享
use std::sync::Arc;
use std::time::Duration;
use crate::agent::summary::SummaryConfig;
use crate::llm::LlmProvider;
use crate::llm::compact::CompactConfig;
use crate::llm::hooks::HookExecutor;
use crate::memory::retriever::MemoryRetriever;
use crate::memory::store::MemoryStore;
use crate::tools::ToolRegistry;
/// Agent 运行配置。
#[derive(Debug, Clone)]
pub struct AgentConfig {
/// 单次会话最大 turn 数(含工具循环内部 turn),默认 50。
pub max_turns: u32,
/// 单次会话最大工具循环轮次(与 LlmCycle 的 `max_tool_turns` 对齐),默认 10。
pub max_tool_turns: u32,
/// 会话 TTLNone 表示无过期),默认 None。
pub session_ttl: Option<Duration>,
/// 上下文压缩配置(None 表示不启用自动压缩),默认 None。
pub compact_config: Option<CompactConfig>,
/// 摘要自动生成配置(`None` = 不启用)。
/// 设置后 `AgentSession` 每轮 OnTurnEnd 之后进行水位 + 防抖检查,触发时调 LLM
/// 生成摘要并写入 `FocusedConfig.summary_override` 与 `SessionMemory["conversation_summary"]`。
pub summary_config: Option<SummaryConfig>,
}
impl Default for AgentConfig {
fn default() -> Self {
Self {
max_turns: 50,
max_tool_turns: 10,
session_ttl: None,
compact_config: None,
summary_config: None,
}
}
}
/// Agent Runtime 依赖注入容器。
///
/// 通过 `AgentBuilder::build()` 构造;构造完成后内部为只读视图。
/// `Arc` 共享,多个 `AgentSession` 可共用同一个 bundle。
#[derive(Clone)]
pub struct RuntimeBundle {
/// LLM 后端(强引用,多 session 共享)。
pub provider: Arc<dyn LlmProvider>,
/// 工具注册表(强引用,多 session 共享)。
pub tool_registry: Arc<ToolRegistry>,
/// 钩子执行器(强引用,多 session 共享)。
pub hook_executor: Arc<HookExecutor>,
/// 持久化记忆后端(弱引用 —— 不传也能跑)。
pub memory_store: Option<Arc<dyn MemoryStore>>,
/// 记忆检索器(弱引用 —— 不传也能跑)。
/// 传入时可在 `submit_turn` 内部将检索能力作为工具暴露给 LLM。
pub retriever: Option<Arc<MemoryRetriever>>,
/// SessionMemory 后端(选填)。
/// 传入时 `SessionMemory` 使用该后端(支持跨进程共享);
/// 不传时 `AgentSession` 内部自动创建 `InMemoryStore` 作为进程级隔离的后端。
pub session_memory_backend: Option<Arc<dyn MemoryStore>>,
/// 运行时配置。
pub config: AgentConfig,
}
impl std::fmt::Debug for RuntimeBundle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RuntimeBundle")
.field("provider_type", &"<dyn LlmProvider>")
.field("tool_names", &self.tool_registry.list_tools())
.field("has_memory_store", &self.memory_store.is_some())
.field("has_retriever", &self.retriever.is_some())
.field(
"has_session_memory_backend",
&self.session_memory_backend.is_some(),
)
.field("config", &self.config)
.finish()
}
}
impl RuntimeBundle {
/// 构造一个 `RuntimeBundle`。
///
/// **Phase 4a 行为**`retriever` 存在时仅占位记录,不真正注入工具
/// v0.1 不在 `submit_turn` 中启用检索;Phase 4c 之后再决定是否注册成 tool)。
/// 真正的工具注入留待 v0.2 接入 `RetrieveTool` 实现。
pub fn new(
provider: Arc<dyn LlmProvider>,
tool_registry: Arc<ToolRegistry>,
hook_executor: Arc<HookExecutor>,
memory_store: Option<Arc<dyn MemoryStore>>,
retriever: Option<Arc<MemoryRetriever>>,
session_memory_backend: Option<Arc<dyn MemoryStore>>,
config: AgentConfig,
) -> Self {
Self {
provider,
tool_registry,
hook_executor,
memory_store,
retriever,
session_memory_backend,
config,
}
}
}