正文预览:有序输出,不代替最终接受
按已登记的 stage/tool/字段路径提取可展示正文,拒绝把控制提议当作已执行结果。
createReplyPreview 接收 rules、sink、可选 render 和 maxChars,返回供 ModelRunner.sink.output 调用的 handler。规则是暂态展示范围:哪些阶段、哪个 Tool、哪些正文路径可展示。
预览接收的是尚未完整校验的模型流,不能据此执行工具、批准写操作或持久化最终回复。model.end 失败会撤销预览。sink 按序等待并传播失败;不要误写成忽略 Promise 的旁路 observer。render 同步,规则及接收者在创建时固定。
由简到繁的同业务示例
为纯文本阶段增加预览
入门 · Node.js
ts
import { ModelRunner, Support } from '@jangts/agent-core';
const preview = Support.createReplyPreview({ rules: [{ stageId: 'reply' }],
sink: bubbles => { console.log('preview', bubbles); },
});
const runner = new ModelRunner({ provider: { async *stream() { yield '你好'; yield ',Core'; } }, sink: { output: preview } });
console.log((await runner.invoke({ input: '你好', stageId: 'reply' })).value);js
import { ModelRunner, Support } from '@jangts/agent-core';
const preview = Support.createReplyPreview({ rules: [{ stageId: 'reply' }],
sink: bubbles => { console.log('preview', bubbles); },
});
const runner = new ModelRunner({ provider: { async *stream() { yield '你好'; yield ',Core'; } }, sink: { output: preview } });
console.log((await runner.invoke({ input: '你好', stageId: 'reply' })).value);只允许明确正文协议的可展示字段
配置 · Node.js
规则必须对应 App 实际登记的 reply Tool 与 Schema,配置预览本身不创建模型 Tool。
ts
import { Support } from '@jangts/agent-core';
const preview = Support.createReplyPreview({
rules: [{ stageId: 'reply', toolId: 'reply', paths: [['answer'], ['bubbles', '*']],
when: { path: ['kind'], values: ['reply'] } }],
sink: async bubbles => { console.log('当前暂态正文', bubbles); },
maxChars: 4000,
});
console.log(typeof preview);js
import { Support } from '@jangts/agent-core';
const preview = Support.createReplyPreview({
rules: [{ stageId: 'reply', toolId: 'reply', paths: [['answer'], ['bubbles', '*']],
when: { path: ['kind'], values: ['reply'] } }],
sink: async (bubbles) => { console.log('当前暂态正文', bubbles); },
maxChars: 4000,
});
console.log(typeof preview);