import type { CompressionResult } from '../compressor/compressor'; import type { Message, Model } from '@agforge/core'; /** * 压缩模式。 * * - 'none': 不需要压缩 * - 'async': 异步压缩(后台执行,当前轮次继续使用原消息,下一轮 loop 开始前等待完成) * - 'sync': 同步压缩(立即执行,压缩后的消息用于当前轮次) */ export type CompressionMode = 'none' | 'async' | 'sync'; /** * 压缩决策。 * * Strategy 负责分析消息并返回"压缩计划": * - 决定是否压缩、压缩模式 * - 分离消息:哪些要压缩,哪些要保留 * - 设定压缩目标 */ export type CompressionDecision = { /** 压缩模式 */ mode: CompressionMode; /** * 需要被压缩的消息。 * Compressor 将把这些消息压缩成摘要。 * 当 mode 为 'none' 时,此字段为空数组。 */ messagesToCompress: ReadonlyArray; /** * 保留的消息(原样保留,不参与压缩)。 * 这些消息将拼接在压缩结果之后。 */ messagesToPreserve: ReadonlyArray; /** 目标 token 数量(可选,用于指导压缩器压缩到多大) */ targetTokens?: number; }; /** * 压缩判断上下文。 * 提供策略判断所需的所有信息。 */ export type CompressionContext = { /** 模型实例(可获取 maxContextTokens 等参数) */ model: Model; /** 持久化消息列表 */ messages: ReadonlyArray; }; /** * 压缩策略管理器接口。 * * 负责决定"何时触发压缩"、"使用哪种压缩模式"、"哪些消息需要压缩"以及"压缩到什么程度"。 * * 策略与压缩行为解耦: * - Strategy 负责消息分区决策(业务逻辑) * - Compressor 只负责压缩算法(技术实现) */ export type CompressionStrategy = { /** * 判断是否需要压缩并返回压缩决策。 * * 同步方法,表明此操作应为低耗时的轻量判断(如对比 token 数与阈值)。 * * 职责: * 1. 判断是否需要压缩 * 2. 决定压缩模式(sync/async) * 3. 分离消息:哪些要压缩,哪些要保留 * 4. 设定压缩目标(targetTokens) * * @param context - 压缩判断上下文 * @returns 压缩决策(包含模式、消息分区和可选的目标参数) */ shouldCompress(context: CompressionContext): CompressionDecision; /** * 压缩完成回调。 * * 可选实现。用于策略更新内部状态(如重置计数器、记录压缩时间等)。 * 仅在压缩成功完成后调用,压缩失败时不调用。 * * @param context - 压缩上下文(包含压缩前的状态) * @param result - 压缩结果 */ onCompressionComplete?(context: CompressionContext, result: CompressionResult): void; /** * 压缩失败回调。 * * 可选实现。用于策略处理压缩错误(如记录日志、调整阈值、决定是否重试等)。 * * @param context - 压缩上下文 * @param error - 压缩过程中的错误 */ onCompressionError?(context: CompressionContext, error: Error): void; };