Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
- MiddlewareContext 加 Clone derive, 支持并行克隆上下文 - AgentMiddleware trait 新增 parallel_safe() 默认方法 (false) - MiddlewareChain::run_before_completion 改为分波执行: 连续 2+ 个 parallel_safe 中间件用 tokio::spawn 并发执行, 各自独立修改 system_prompt, 执行完成后合并贡献 - 5 个只修改 system_prompt 的中间件标记 parallel_safe: evolution(P78), butler_router(P80), memory(P150), title(P180), skill_index(P200) - 非 parallel_safe 中间件 (compaction, dangling_tool 等) 保持串行 分波效果: Wave 1: evolution + butler_router → 并行 (省 ~0.5-1s) Wave 2: compaction → 串行 (可能修改 messages) Wave 3: memory + title + skill_index → 并行 (省 ~0.5-2s) Wave 4+: 工具/安全中间件 → 串行
51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
//! Title generation middleware — auto-generates conversation titles after the first turn.
|
|
//!
|
|
//! Inspired by DeerFlow's TitleMiddleware: after the first user-assistant exchange,
|
|
//! generates a short descriptive title using the LLM instead of defaulting to
|
|
//! "新对话" or truncating the user's first message.
|
|
//!
|
|
//! Priority 180 — runs after compaction (100) and memory (150), before skill index (200).
|
|
//!
|
|
//! NOTE: This is a structural placeholder. Full implementation requires an LLM driver
|
|
//! reference to generate titles asynchronously, which will be wired through the
|
|
//! middleware context in a future iteration. For now it simply passes through.
|
|
|
|
use async_trait::async_trait;
|
|
use crate::middleware::{AgentMiddleware, MiddlewareDecision};
|
|
|
|
/// Middleware that auto-generates conversation titles after the first exchange.
|
|
///
|
|
/// When fully implemented, this will:
|
|
/// 1. Detect the first user-assistant exchange (via message count)
|
|
/// 2. Call the LLM with a short prompt to generate a descriptive title
|
|
/// 3. Update the session title via the middleware context
|
|
///
|
|
/// For now, it serves as a registered placeholder in the middleware chain.
|
|
pub struct TitleMiddleware {
|
|
_reserved: (),
|
|
}
|
|
|
|
impl TitleMiddleware {
|
|
pub fn new() -> Self {
|
|
Self { _reserved: () }
|
|
}
|
|
}
|
|
|
|
impl Default for TitleMiddleware {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl AgentMiddleware for TitleMiddleware {
|
|
fn name(&self) -> &str { "title" }
|
|
fn priority(&self) -> i32 { 180 }
|
|
fn parallel_safe(&self) -> bool { true }
|
|
|
|
// All hooks default to Continue — placeholder until LLM driver is wired in.
|
|
async fn before_completion(&self, _ctx: &mut crate::middleware::MiddlewareContext) -> zclaw_types::Result<MiddlewareDecision> {
|
|
Ok(MiddlewareDecision::Continue)
|
|
}
|
|
}
|