管线阶段
生成经过 14 个固定阶段,从用户输入到保存消息,每个插件钩子都遵循相同的 优先级、超时、取消、权限和错误隔离规则。
阶段顺序
顺序是固定的,对每次生成都相同:
用户输入
→ 宏
→ 角色/人设数据
→ 设定集
→ 记忆/RAG
→ 令牌计数
→ 上下文移位
→ 插件拦截器
→ Instruct 格式渲染
→ 提供商序列化
→ 请求
→ 流式响应
→ 后处理钩子
→ 保存消息
逐阶段说明
- 用户输入 —— 捕获本次请求的草稿消息和生成选项。
- 宏 ——
{{user}}、{{char}}和自定义变量由replaceMacros解析。 未知宏保持原样。 - 角色/人设数据 —— 角色卡字段和活动人设被组装进消息数组。
- 设定集 —— 匹配的设定集条目根据其激活规则插入。标记为必需的条目 受到保护,不会被移除。
- 记忆/RAG —— 检索记忆和向量召回块并排序。
- 令牌计数 —— 本地分词器配置文件统计组装好的上下文。
- 上下文移位 —— 上下文被装进令牌预算。请参阅上下文移位。
- 插件拦截器 —— 插件可以检查并修改消息数组。在最后一个拦截器之后, 管线重新统计令牌并重新应用预算,因此任何插件都无法绕过它。
- Instruct 格式渲染 —— 干净的消息数组被渲染为选定的 instruct 格式, 或保持结构化。请参阅Instruct 格式。
- 提供商序列化 —— 适配器构建提供商请求:聊天适配器接收结构化的消息 数组,文本适配器接收渲染好的提示词字符串。
- 请求 —— 请求带
AbortSignal、超时和客户端断开处理发送。 - 流式响应 —— 响应通过 SSE 流式返回。可选的
assistantPrefill恰好一次前置到第一个增量。 - 后处理钩子 —— 插件可以在保存前处理流式响应。
- 保存消息 —— 最终消息、其变体和生成元数据在单个事务中保存。
钩子规则
每个插件钩子都由同一个契约定义:
- 顺序和优先级 —— 钩子按优先级顺序运行;优先级相同时按确定性顺序排列。
- 超时 —— 每个钩子都有一个超时。超时的钩子会被中止。
- 取消 —— 钩子接收生成的
AbortSignal,必须在其触发时停止工作。 - 权限 —— 只有当插件持有其声明能力所需的权限时,钩子才会运行。
- 异常隔离 —— 一个插件钩子中的错误会被捕获、记录并跳过。管线继续; 损坏的拦截器绝不能静默地破坏整个生成。
- 诊断日志 —— 每次提示词更改都会被记录。更改日志在生成诊断中返回,
并存储在响应消息的
meta中,因此你始终可以看到实际发送了什么。
提示词后处理
在聊天模式下,消息数组在序列化之前可能会经过一个可选的重建阶段 ——
经典 mergeMessages 算法的移植。模式包括 merge、semi、strict 和
single,以及保留工具消息的 _tools 变体。在文本模式下此阶段被跳过,
因为 instruct 渲染已经把角色折叠成一个字符串。