/** * 任务迁移 Agent * * 当会话上下文达到阈值时,由迁移 Agent 读取完整对话历史, * 筛选出对后续工作有用的信息,生成结构化的 Markdown 交接文档。 * * 交接文档将作为新会话的第一条用户消息,让新 Agent 了解任务背景。 * * 迁移 Agent 是专用的、无状态的,不注册任何工具,用完即弃。 */ import { Agent, AgentNS, Message } from "@ai-zen/agents-core"; /** * 将单条消息渲染为纯文本格式 * * 渲染规则: * - 每种 role 用特定前缀标识,一目了然 * - content 为字符串的直接输出 * - content 为数组的(多模态),text 部分拼接输出,image_url 标注 [图片] * - tool_calls 保留 call_id、函数名和参数 * - function_call 保留函数名和参数 * - tool 消息保留 tool_call_id * - 隐藏/omit 消息跳过 * * 注意:当前仅处理 type="function" 的工具调用(ToolCall.function), * 忽略 ToolCall.type 和 ToolCall.index 字段。 * 如果未来引入非 function 类型的工具调用(如 code_interpreter、file_search 等), * 此处需要补充对应的渲染逻辑。 */ export declare function formatMessageToText(msg: AgentNS.Message): string | null; /** * 将消息列表渲染为纯文本对话记录 * * 相比 JSON.stringify 的优势: * - 去掉冗余的字段名,大幅缩减体积 * - 更易读,迁移 Agent 可以直接理解 * - 保留 tool_call_id 等关键关联信息 * * @example 输出格式: * ``` * [system] 你是一个AI助手... * [user] 帮我看看项目结构 * [assistant] [tool_call] readFile (call_0): {"path":"package.json"} * [tool] [回应 call_0] {"name":"readProject","content":"..."} * [assistant] 已查看项目结构 * ``` */ export declare function formatHistoryToText(messages: AgentNS.Message[]): string; /** * 计算消息列表的总字符数(JSON 序列化后的大小) */ export declare function calcTotalChars(messages: AgentNS.Message[]): number; /** * 判断是否需要进行任务迁移 * 当消息内容总字符数超过模型 maxContextChars 时返回 true */ export declare function shouldMigrate(messages: AgentNS.Message[], maxContextChars: number | undefined): boolean; /** * 创建任务迁移 Agent * 用于生成交接文档,不注册任何工具 */ export declare function createMigrationAgent(): Promise; /** * 记录迁移错误日志 * 存储最原始的信息:原始聊天记录 + 迁移 Agent 的完整消息列表 + 错误信息 */ export declare function logMigrationError(historyMessages: AgentNS.Message[], error: Error, migrationAgentMessages?: AgentNS.Message[], options?: { userPrompt?: string; }): string; /** * 伪造一轮工具调用,返回一对消息:assistant(含 tool_calls)+ tool(含返回结果)。 * * ## 设计缘由 * * 任务迁移需要将对话历史传给独立的迁移 Agent 分析。序列化历史有两种选择: * * 1. **JSON 格式** — 结构化,Agent 能准确区分每条消息的角色和字段,不会混淆。 * 但体积巨大(每条消息重复出现 role/content/tool_calls 等字段名), * 在长对话场景下可能比纯文本大 3-5 倍,严重挤占迁移 Agent 的上下文窗口。 * * 2. **纯文本格式**(formatHistoryToText)— 紧凑,体积小,保留关键信息。 * 但如果直接作为 user 消息传给迁移 Agent,Agent 看到一大段纯文本对话记录, * 会分不清这是"需要分析的历史数据"还是"当前正在发生的对话",导致分析偏差 * (如把历史中的用户消息当成当前用户指令、忽略工具调用的关联关系等)。 * * 本函数的解决方案:将纯文本历史包装为一轮伪造的 `readFile` 工具调用。 * 迁移 Agent 看到的是:用户请求读文件 → assistant 调用了 readFile → tool 返回了文件内容。 * 这样 Agent 能借助工具调用的语义边界,清晰区分: * - "工具返回的内容" = 需要分析的历史数据 * - "用户的消息" = 当前任务指令 * * 既享受了纯文本的小体积优势,又避免了直接注入导致的混淆。 */ export declare function forgeToolCallRound(options: { toolName: string; toolArgs: Record; toolResult: string; callId?: string; }): [Message, Message]; /** * 使用迁移 Agent 生成交接文档 * @param historyMessages 原始会话的完整消息列表 * @returns 交接文档的 Markdown 文本 */ export declare function generateMigrationDoc(historyMessages: AgentNS.Message[]): Promise; //# sourceMappingURL=task-migration-agent.d.ts.map