跳到主要内容

管线阶段

生成经过 14 个固定阶段,从用户输入到保存消息,每个插件钩子都遵循相同的 优先级、超时、取消、权限和错误隔离规则。

阶段顺序

顺序是固定的,对每次生成都相同:

用户输入
→ 宏
→ 角色/人设数据
→ 设定集
→ 记忆/RAG
→ 令牌计数
→ 上下文移位
→ 插件拦截器
→ Instruct 格式渲染
→ 提供商序列化
→ 请求
→ 流式响应
→ 后处理钩子
→ 保存消息

逐阶段说明

  1. 用户输入 —— 捕获本次请求的草稿消息和生成选项。
  2. —— {{user}}{{char}} 和自定义变量由 replaceMacros 解析。 未知宏保持原样。
  3. 角色/人设数据 —— 角色卡字段和活动人设被组装进消息数组。
  4. 设定集 —— 匹配的设定集条目根据其激活规则插入。标记为必需的条目 受到保护,不会被移除。
  5. 记忆/RAG —— 检索记忆和向量召回块并排序。
  6. 令牌计数 —— 本地分词器配置文件统计组装好的上下文。
  7. 上下文移位 —— 上下文被装进令牌预算。请参阅上下文移位
  8. 插件拦截器 —— 插件可以检查并修改消息数组。在最后一个拦截器之后, 管线重新统计令牌并重新应用预算,因此任何插件都无法绕过它。
  9. Instruct 格式渲染 —— 干净的消息数组被渲染为选定的 instruct 格式, 或保持结构化。请参阅Instruct 格式
  10. 提供商序列化 —— 适配器构建提供商请求:聊天适配器接收结构化的消息 数组,文本适配器接收渲染好的提示词字符串。
  11. 请求 —— 请求带 AbortSignal、超时和客户端断开处理发送。
  12. 流式响应 —— 响应通过 SSE 流式返回。可选的 assistantPrefill 恰好一次前置到第一个增量。
  13. 后处理钩子 —— 插件可以在保存前处理流式响应。
  14. 保存消息 —— 最终消息、其变体和生成元数据在单个事务中保存。

钩子规则

每个插件钩子都由同一个契约定义:

  • 顺序和优先级 —— 钩子按优先级顺序运行;优先级相同时按确定性顺序排列。
  • 超时 —— 每个钩子都有一个超时。超时的钩子会被中止。
  • 取消 —— 钩子接收生成的 AbortSignal,必须在其触发时停止工作。
  • 权限 —— 只有当插件持有其声明能力所需的权限时,钩子才会运行。
  • 异常隔离 —— 一个插件钩子中的错误会被捕获、记录并跳过。管线继续; 损坏的拦截器绝不能静默地破坏整个生成。
  • 诊断日志 —— 每次提示词更改都会被记录。更改日志在生成诊断中返回, 并存储在响应消息的 meta 中,因此你始终可以看到实际发送了什么。

提示词后处理

在聊天模式下,消息数组在序列化之前可能会经过一个可选的重建阶段 —— 经典 mergeMessages 算法的移植。模式包括 mergesemistrictsingle,以及保留工具消息的 _tools 变体。在文本模式下此阶段被跳过, 因为 instruct 渲染已经把角色折叠成一个字符串。

另请参阅