agent-context 0.1.5

Multi-backend agent context manager with three-zone memory model
Documentation
//! 请求者 → AgentContext 的请求消息。
//!
//! 每条消息的 `impl Message<…> for `[`AgentContext`](super::super::actor::AgentContext) 块定义在
//! [`context::actor`](super::super::actor) 模块中。

use crate::role::Role;

// ---------------------------------------------------------------------------
// 变更消息
// ---------------------------------------------------------------------------

/// 追加一条消息到 incremental 区末尾。
///
pub struct RequestAppend<M> {
    /// 要追加的消息
    pub message: M,
}

/// 批量追加消息到 incremental 区。
///
pub struct RequestExtend<M> {
    /// 要批量追加的消息列表
    pub messages: Vec<M>,
}

/// 替换 incremental 区指定索引的消息。
///
/// 仅对 incremental 区有效。
pub struct RequestUpdate<M> {
    /// incremental 区索引
    pub index: usize,
    /// 新消息
    pub message: M,
}

/// 在 incremental 区指定索引插入消息。
///
pub struct RequestInsert<M> {
    /// incremental 区插入位置
    pub index: usize,
    /// 要插入的消息
    pub message: M,
}

/// 移除 incremental 区指定索引的消息。
///
pub struct RequestRemove {
    /// incremental 区索引
    pub index: usize,
}

/// 弹出 incremental 区最后一条消息。
///
pub struct RequestPop;

/// 按角色保留 incremental 区消息,其余移除。
///
pub struct RequestRetain {
    /// 要保留的角色
    pub role: Role,
}

/// 清空整个 incremental 区。
///
pub struct RequestClear;

// ---------------------------------------------------------------------------
// 查询消息
// ---------------------------------------------------------------------------

/// 获取三区总消息数。
pub struct RequestLen;

/// 检查三区是否全部为空。
pub struct RequestIsEmpty;

/// 按全局索引获取消息。
///
/// 索引按 immutable → compressed → incremental 顺序计算。越界返回 `None`。
pub struct RequestGet(pub usize);

/// 获取三区全部消息的拼接结果。
///
/// 顺序:immutable → compressed → incremental。
pub struct RequestMessages;

/// 获取 immutable 区的消息副本。
pub struct RequestImmutable;

/// 获取 compressed 区的消息副本。
pub struct RequestCompressed;

/// 获取 incremental 区的消息副本。
pub struct RequestIncremental;

/// 按角色筛选三区全部消息。
pub struct RequestFindByRole(pub Role);

// ---------------------------------------------------------------------------
// 对话消息
// ---------------------------------------------------------------------------

/// 非流式对话。
///
/// 发送前根据 [`crate::CommonOpts`] 检查上下文是否已满,满则自动压缩或返回错误。
/// 然后拼接三区消息 + scratch,发送给后端 LLM。
/// 成功后自动将响应消息存入 incremental 区。
pub struct RequestSend<O> {
    /// 传递给后端 `send()` 的请求选项
    pub opts: O,
}

/// 流式对话。
///
/// 发送前根据 [`crate::CommonOpts`] 检查上下文是否已满,满则自动压缩或返回错误。
/// 然后拼接三区消息 + scratch,发送给后端 LLM。
pub struct RequestSendStream<O> {
    /// 传递给后端 `send_stream()` 的请求选项
    pub opts: O,
}

// ---------------------------------------------------------------------------
// 压缩消息
// ---------------------------------------------------------------------------

/// 压缩策略参数。
#[derive(Debug, Clone)]
pub enum CompressStrategy {
    /// 摘要压缩:保留最近 `keep` 条,将更早的消息交由后端 LLM 生成摘要存入 compressed 区。
    Summarize {
        /// 保留的最新消息条数
        keep: usize,
        /// 自定义摘要提示词,`None` 时使用内置默认提示词
        prompt: Option<String>,
    },
}

/// 触发上下文压缩。
///
/// 根据 [`CompressStrategy`] 对 incremental 区执行压缩。
/// 摘要由后端 LLM 生成,通过 `opts` 传递请求选项。
/// 也可通过 [`crate::CommonOpts::auto_compress`] 在 [`RequestSend`]/[`RequestSendStream`] 时自动触发。
pub struct RequestCompress<O> {
    /// 压缩策略
    pub strategy: CompressStrategy,
    /// 传递给后端 `send()` 的请求选项
    pub opts: O,
}

// ---------------------------------------------------------------------------
// 工具消息
// ---------------------------------------------------------------------------

/// 估算三区全部消息的 token 数量。
///
/// 委托给后端的 [`estimate_tokens`](crate::ContextBackend::estimate_tokens)。
/// 失败时降级返回 0。
pub struct RequestEstimateTokens;

/// 将三区全部消息导出为字符串(完整上下文)。Reply = `Result<String, AgentError>`。
///
/// 消息按 immutable → compressed → incremental 顺序输出,每条消息序列化为一行紧凑 JSON。
pub struct RequestExportAll;

/// 将 incremental 区消息导出为字符串。Reply = `Result<String, AgentError>`。
///
/// 与 [`RequestImportIncremental`] 互为逆操作,仅处理对话流。
pub struct RequestExportIncremental;

/// 从字符串导入消息到 incremental 区。Reply = `Result<(), AgentError>`。
///
/// 先解析全部行,再替换 incremental 区。每行一条 JSON,空行跳过。
/// 解析失败返回错误。
/// 与 [`RequestExportIncremental`] 互为逆操作。
pub struct RequestImportIncremental {
    /// 导入 JSON 字符串,每行一条消息
    pub json: String,
}