import { tool } from "../tool.js"; import { answerUiAnchors } from "../../src/chat/answer-ui-publication.js"; export default tool({ description: "提交本轮完整的最终答复。收尾前按阅读任务检查表达:多对象比较和数值趋势优先已用 present_answer 发布 Table/Chart,简单解释、单个事实或用户要求纯文字可直接回答;不要遗漏报告需要的交互内容。全部工具结果与需要的业务写回已核实后调用;需要浏览器动作回执时先核实回执,本地回答界面发布不等待浏览器回执;阶段说明留在过程记录。answer 保留必要正文、结论和关键边界,不重复整张表;在 answer 中用独立一行 [[ui:block_id]] 指定界面位置,代码块、缩进代码和引用中的标记不生效。ui_block_ids 是允许引用列表,必须与锚点去重后的顺序一致,只列本轮已经用 present_answer phase=final 发布的 block_id;process 界面不得引用。收到最终报告后,其他过程文字、界面与轨迹自动折叠。普通聊天与任务协作在此工具完成、当前工具和追加输入均已处理后结束本轮,之后不能继续更新界面;需要补充内容应先更新再提交最终答复。后台任务仍以 Server 的完成/失败接口为准,此工具不代表任务、工单或运行已完成。", args: { answer: tool.schema.string().min(1).max(30000), ui_block_ids: tool.schema.array(tool.schema.string().regex(/^[a-zA-Z0-9_-]{1,80}$/)).max(48).optional(), }, async execute({ answer, ui_block_ids }) { const refs = ui_block_ids ?? []; const anchors = [...new Set(answerUiAnchors(answer))]; if (JSON.stringify(anchors) !== JSON.stringify(refs)) { throw new Error("ui_block_ids 必须与 answer 中独立一行的 [[ui:block_id]] 锚点按去重后顺序一致"); } return JSON.stringify({ answer, ui_block_ids: refs }); }, });