feat: 添加对话压缩功能和上下文使用情况显示

- 新增 context 模块实现 Prune 和 Compaction 压缩策略
- Prune: 将旧工具调用结果替换为占位符
- Compaction: 使用 AI 生成对话摘要
- CLI 提示符显示上下文使用量 [used/available]
- 添加 /compact 命令手动压缩对话
- 添加 /context 命令查看上下文详情
- Agent 集成自动压缩 (85%阈值) 和强制压缩功能
This commit is contained in:
2025-12-11 10:59:43 +08:00
parent dddec9b6d5
commit c6f8ba95ec
8 changed files with 955 additions and 9 deletions
+77
View File
@@ -0,0 +1,77 @@
import type { LanguageModel } from 'ai';
/**
* Token 使用统计
*/
export interface TokenUsage {
/** 输入 tokens(估算) */
input: number;
/** 上下文限制 */
contextLimit: number;
/** 可用空间(contextLimit - outputReserve */
available: number;
/** 使用百分比 (0-100) */
usagePercent: number;
}
/**
* 压缩配置
*/
export interface CompressionConfig {
/** 模型上下文限制 (默认 200k) */
contextLimit: number;
/** 预留输出 tokens (默认 32k) */
outputReserve: number;
/** 保护最近 tokens 不被 prune (默认 40k) */
pruneProtect: number;
/** 最小清理量才执行 prune (默认 20k) */
pruneMinimum: number;
/** 溢出阈值,超过此比例触发自动压缩 (默认 0.85) */
overflowThreshold: number;
}
/**
* 默认压缩配置
*/
export const DEFAULT_COMPRESSION_CONFIG: CompressionConfig = {
contextLimit: 200_000,
outputReserve: 32_000,
pruneProtect: 40_000,
pruneMinimum: 20_000,
overflowThreshold: 0.85,
};
/**
* 压缩占位符
*/
export const COMPACTED_PLACEHOLDER = '[此工具输出已压缩]';
/**
* 摘要消息标记 key
*/
export const SUMMARY_MARKER = '__summary__';
/**
* 工具结果压缩标记 key
*/
export const COMPACTED_MARKER = '__compacted__';
/**
* 压缩上下文(传递给压缩器的参数)
*/
export interface CompressionContext {
config: CompressionConfig;
model?: LanguageModel;
}
/**
* 压缩结果
*/
export interface CompressionResult {
/** 压缩后的消息 */
messages: import('ai').ModelMessage[];
/** 释放的 tokens */
freedTokens: number;
/** 压缩类型 */
type: 'prune' | 'compaction' | 'both';
}