10.3 合并(Coalescing)与人性化节奏
10.3.1 连续块合并策略:空闲间隙、最小/最大字符数
块发射控制
// src/agents/pi-embedded-subscribe.ts(简化)
const emitBlockChunk = (text: string) => {
if (state.suppressBlockChunks) return; // 压制中(已有最终文本)
// 1. 剥离 <think>/<final> 标签
const chunk = stripBlockTags(text, state.blockState).trimEnd();
if (!chunk) return;
// 2. 去重:与上一次发射的相同 → 跳过
if (chunk === state.lastBlockReplyText) return;
// 3. 消息工具去重:已通过 messaging tool 发送 → 跳过
const normalizedChunk = normalizeTextForComparison(chunk);
if (isMessagingToolDuplicateNormalized(
normalizedChunk, messagingToolSentTextsNormalized
)) return;
// 4. 助手文本去重:与最近的 assistantText 相同 → 跳过
if (shouldSkipAssistantText(chunk)) return;
// 5. 记录并发射
state.lastBlockReplyText = chunk;
assistantTexts.push(chunk);
if (!params.onBlockReply) return;
// 6. 解析回复指令(媒体 URL、音频标记、引用标签)
const splitResult = replyDirectiveAccumulator.consume(chunk);
if (!splitResult) return;
void params.onBlockReply({
text: splitResult.text,
mediaUrls: splitResult.mediaUrls,
audioAsVoice: splitResult.audioAsVoice,
replyToId: splitResult.replyToId,
replyToCurrent: splitResult.replyToCurrent,
});
};块边界模式
模式
行为
适用场景
工具执行前的强制刷新
消息边界重置
10.3.2 人性化延迟(Human Delay):natural / custom 模式
natural / custom 模式配置
工作原理
压缩期间的缓冲重置
本节小结
Last updated