Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions docs/build.md
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ CreateApplet(对话没有可继续的应用时) → 应用 ID
CodeAssistantOffline(WAA proof) → 任务 ID
StreamCodeAssistantOfflineGeneration → 步骤快照流,读到本轮回复结束或上游关闭
StreamCodeAssistantOfflineGeneration (消息列表在回复完成前结束时再请求一次)
CodeAssistantOffline、StreamCodeAssistantOfflineGeneration(回复没有正文、问题与函数调用,或上游步骤在已输出正文后失败时追加用户轮,最多 3 次)
CodeAssistantOffline、StreamCodeAssistantOfflineGeneration(回复没有正文、问题与函数调用,调用代码块缺失或无法解码,调用了被禁止的工作区工具,或上游步骤在已输出正文后失败时追加用户轮,最多 3 次)
流关闭后在后台:
CancelCodeAssistantOfflineGeneration (已取得任务 ID、流没有正常解码完成且任务没有以失败步骤结束时)
巡检、删除账户、新建应用后写入记录失败:
Expand All @@ -587,7 +587,7 @@ CodeAssistantOffline、StreamCodeAssistantOfflineGeneration(回复没有正文
服务按请求所用 API key 与对话历史把请求对应到应用:

- 对话轮按连续的 model 轮与其余轮次分组,逐组累积 SHA-256 摘要。每组计入非思考正文 Part 直接连接后按空白归一的结果、函数调用的名称与键排序的参数、函数结果键排序的内容,其余 Part 去掉思考签名计入,内联数据以其 SHA-256 计入;调用 ID 不计入,客户端以不同格式回传同一回复时摘要相同
- 本轮回复完整结束、没有以 `malformed_function_call` 结束、没有在函数调用之后继续输出正文、也没有在上游步骤失败后接着写时,本进程把“请求的对话 + 本轮回复的正文与函数调用”的摘要记为该应用可以继续的位置
- 本轮回复完整结束、没有以 `malformed_function_call` 结束、没有调用被禁止的工作区内置工具、没有在函数调用之后继续输出正文、也没有在上游步骤失败后接着写时,本进程把“请求的对话 + 本轮回复的正文与函数调用”的摘要记为该应用可以继续的位置
- 新请求最后一组之前最近的 model 轮组摘要与记录相同时,在该应用中继续:field 1 只提交该组之后的轮次,field 6 为 `2`、field 14 为 `[2]`、field 21 为应用 ID;记录的位置被取走,回复完整结束后移到新回复之后,同时到达的另一请求找不到记录
- 找不到时新建应用,最后一组之前的对话轮转录在 field 9 中,见“请求映射”;包括第一轮、重新生成、编辑或压缩过的历史、回到较早的回复另起分支、另一个 API key、上一轮回复没有完整结束或在步骤失败后接着写过、最后一组过长或是 model 轮与服务重启之后;对话所在账户没有空闲槽位或不可用、请求被调度到其他账户时,放弃原应用并在新账户新建
- 新建的应用 ID 以资源类型 `assistant-applet` 记入账户运行状态。生成服务启动时与之后每 10 分钟,巡检删除闲置超过 1 小时、或本进程没有可继续对话的应用并删除记录,`DeleteApplet` 返回 404 时同样删除记录;进行中的请求所用应用保留,没有空闲槽位的账户跳过本轮;删除失败时以 WARN 记录 “闲置写代码助手应用删除失败: <错误>”,记录保留到下一轮
Expand Down Expand Up @@ -720,13 +720,13 @@ Part 的 field 2 为文本,field 13 为 `1` 或 `true` 时是思考。只修
3. 跳过 role 不是 `model` 的对话轮。模型轮的 Part 以(步骤序号,Part 序号)定位,同一步骤内多个模型轮的 Part 序号连续编号
4. Part 文本是该位置的完整快照:以上一次快照开头时输出新增部分,与上一次相同时不输出;不以上一次快照开头时返回协议错误 “步骤正文不是上一次快照的延续”
5. 思考 Part 的增量输出为 reasoning,其余为 text;text 来自与上一段 text 不同的步骤、且是该 Part 的第一段增量时,前面加 `\n\n`
6. 请求声明了函数时,语言标记为 `function_calls`、`function_results`、`function_call`、`tool_calls`、`tool_call` 与 `tool_code` 的代码块暂缓到以换行加 ```` ``` ```` 结束(流结束时补上结尾)再判定,围栏可以出现在行中;其他代码块按原文输出为 text,可能是围栏开头的结尾反引号暂缓输出。判定取代码块中的第一个 JSON 值,解码失败时把字符串中不合法转义(如 `\x27`,以及 `\u` 之后不是 4 位十六进制的 Windows 路径 `C:\users`)的反斜杠按字面字符、原始控制字符(如多行代码中的换行)按转义再解码一次;值为调用数组或单个调用对象时,每个元素输出为一个函数调用,调用 ID 为新的 UUID,`arguments` 为 `null` 或缺失时为 `{}`。`function_calls` 块接受任意函数名,其余标记的块只在函数均已声明时解码为调用,否则按原文输出。`function_results` 块不输出;输出函数调用之后的正文不再输出;无法解码的 `function_calls` 块不输出,回复以 `malformed_function_call` 结束
7. 状态为 `1` 的步骤的 field 10 带 `search_web` 时,查询记入 `webSearchQueries`,每个 `[标题, 地址]` 记为一个网页来源块;同一步骤只记录一次。带 `ask_question` 且本轮还没有输出函数调用时,各问题输出为正文,选项各占一行 `- <选项>`;问题为说明中交回函数调用的那句时不输出
8. 状态为 `1` 的步骤含模型轮时,回复记为已完成;消息中最后一个步骤状态为 `1`、含非思考正文且 field 10 为空时,本轮回复结束;输出函数调用之后模型继续输出非空白正文时,本轮回复在调用处结束,任务流关闭后取消生成任务;输出函数调用之后的步骤失败时,本轮回复同样在调用处结束,任务已经结束,不再取消。这些情况都不再读取后续消息与流尾状态
6. 请求声明了函数时,语言标记为 `function_calls`、`function_results`、`function_call`、`tool_calls`、`tool_call` 与 `tool_code` 的代码块暂缓到以换行加 ```` ``` ```` 结束(流结束时补上结尾)再判定,围栏可以出现在行中;其他代码块按原文输出为 text,可能是围栏开头的结尾反引号暂缓输出。判定取代码块中的第一个 JSON 值,解码失败时把字符串中不合法转义(如 `\x27`,以及 `\u` 之后不是 4 位十六进制的 Windows 路径 `C:\users`)的反斜杠按字面字符、原始控制字符(如多行代码中的换行)按转义并去掉 `}` 或 `]` 前的尾随逗号再解码一次;值为调用数组或单个调用对象时,每个元素输出为一个函数调用,调用 ID 为新的 UUID,`arguments` 为 `null` 或缺失时为 `{}`。`function_calls` 块接受任意函数名,其余标记的块只在函数均已声明时解码为调用,否则按原文输出。`function_results` 块不输出;输出函数调用之后的正文不再输出;无法解码的 `function_calls` 块不输出,回复记为 `malformed_function_call`
7. 状态为 `1` 的步骤的 field 10 带 `search_web` 时,查询记入 `webSearchQueries`,每个 `[标题, 地址]` 记为一个网页来源块;同一步骤只记录一次。带 `ask_question` 且本轮还没有输出函数调用时,各问题输出为正文,选项各占一行 `- <选项>`;问题为说明中交回函数调用的那句时不输出,此时本轮还没有输出函数调用且没有待闭合的调用代码块则记为 `malformed_function_call`。请求声明了函数且本轮还没有输出函数调用时,步骤执行了 `search_web` 与 `ask_question` 以外的工作区内置工具则停止读取该任务后续步骤
8. 状态为 `1` 的步骤含模型轮时,回复记为已完成;消息中最后一个步骤状态为 `1`、含非思考正文且 field 10 为空时,本轮回复结束;输出函数调用之后模型继续输出非空白正文、或调用了被禁止的工作区内置工具、或发出交回函数调用的 `ask_question` 而没有函数调用时,本轮任务在该步骤处结束,任务流关闭后取消生成任务;输出函数调用之后的步骤失败时,本轮回复同样在调用处结束,任务已经结束,不再取消。这些情况都不再读取后续消息与流尾状态
9. 消息列表结束后读取流尾状态,code 0 为成功,其他 code 按“错误、额度与能力边界”的表换算 HTTP 状态。上游有时在模型步骤仍为状态 `2` 时正常结束消息列表;此时以同一任务 ID 与应用再请求一次 `StreamCodeAssistantOfflineGeneration`,已完成的任务立即返回状态为 `1` 的最终快照与用量,按同一组规则继续解码,已输出的正文与函数调用不重复输出;重新打开的任务流仍在模型步骤完成前结束时,已解出函数调用或写出正文则以已有内容结束本轮,任务流关闭后取消生成任务,下一轮新建应用并带全部历史
10. 本轮回复结束或流关闭时回复已完成:依次输出暂缓的文本、记录的搜索 grounding、用量之和,再以 `stop` 结束(无法解码的 `function_calls` 块时为 `malformed_function_call`);回复没有完成、也没有函数调用与正文时返回协议错误 “流结束前没有完成的模型回复”
10. 本轮回复结束或流关闭时回复已完成:依次输出暂缓的文本、记录的搜索 grounding、用量之和,再以 `stop` 结束(无法解码的 `function_calls` 块或调用了被禁止的工作区内置工具且没有解出函数调用时为 `malformed_function_call`);回复没有完成、也没有函数调用与正文时返回协议错误 “流结束前没有完成的模型回复”

一次任务的回复完成时没有输出正文、问题与函数调用(例如只有思考)且没有以 `malformed_function_call` 结束时,在同一应用中继续:field 1 只含用户轮 `Your last turn ended without any visible reply. Continue now and give your reply.`,再读取新任务的任务流,按同一组规则解码,最多 3 次;用量的输入与缓存取最后一次,输出为各次之和。
一次任务的回复完成时没有输出正文、问题与函数调用(例如只有思考),或 `function_calls` 代码块缺失、无法解码,或调用了被禁止的工作区内置工具时,在同一应用中继续:没有正文、问题与函数调用时 field 1 为用户轮 `Your last turn ended without any visible reply. Continue now and give your reply.`;代码块缺失、无法解码或调用了被禁止的工作区内置工具时提交要求只输出 `function_calls` 代码块并调用 `ask_question` 的用户轮,已输出正文时附上 `<partial_reply>`(最后至多 20000 个字符),后续任务开头重复已输出正文的前缀自动去掉;再读取新任务的任务流,按同一组规则解码,最多 3 次;用量的输入与缓存取最后一次,输出为各次之和。

本轮已输出正文、还没有输出函数调用时出现失败步骤且不带额度标记的,同样在同一应用中继续:field 1 只含下面的用户轮,`<partial_reply>` 中为本轮已输出正文的最后至多 20000 个字符;新任务的输出接在已输出的正文之后,失败任务中已完成步骤的搜索来源与用量照常输出,用量按上一段的规则合并,搜索记录一并保存,与上一段的追加合计最多 3 次,仍失败时以该失败步骤的错误结束。失败之前只有思考时返回错误,由生成层重新生成:

Expand Down
2 changes: 1 addition & 1 deletion docs/protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ ListModels 能力码 91(目录能力 `output_continuation`)的模型由官
| 18 | missing_thought_signature | 19 | malformed_response |
| 22 | continuation | 其他整数 | `provider_<code>` |

Build 通道的 Gemini API 终止原因去掉 `FINISH_REASON_` 前缀后转为上表的同名小写原因,上表没有的名称为 `provider_<小写名称>`。上游以 `malformed_function_call`、`unexpected_tool_call` 或 `malformed_response` 结束,或流在完成帧之前中断、以 5xx 流尾状态结束,且这次生成没有输出正文、函数调用与媒体时(不输出给客户端的搜索、网址上下文、地图与文件检索步骤不计入,MCP 调用计入),服务在同一账户上以同一请求重新生成,最多再生成 3 次,之后按最后一次的终止原因或中断错误结束;被重新生成取代的那一次的网页来源与引用不输出,每次重新生成从头匹配停止序列,上一次暂存的停止序列前缀不输出,重新生成的请求发送失败时本次生成以该错误结束。两个通道第一次带终止原因的帧中的内容事件标记为结束帧,自动续写中转入下一轮的帧不标记;Gemini 流式输出把结束帧的内容放进最后一块。
Build 通道的 Gemini API 终止原因去掉 `FINISH_REASON_` 前缀后转为上表的同名小写原因,上表没有的名称为 `provider_<小写名称>`。上游以 `malformed_function_call`、`unexpected_tool_call` 或 `malformed_response` 结束,或流在完成帧之前中断、以 5xx 流尾状态结束,且这次生成没有输出正文、函数调用与媒体时(不输出给客户端的搜索、网址上下文、地图与文件检索步骤不计入,MCP 调用计入),服务在同一账户上以同一请求重新生成;已经输出纯文本且没有输出函数调用、媒体、可执行代码与服务端工具步骤时,Playground 与 Build 通道在同一账户上把已输出纯文本作为 model 轮并附上带 `<partial_reply>`(最后至多 20000 个字符)的用户提示继续生成,续写轮开头重复已输出正文的前缀自动去掉并保留思考签名,用量按续写合并。两种情况合计最多 3 次,之后按最后一次的终止原因或中断错误结束;被重新生成取代的那一次的网页来源与引用不输出,每次重新生成从头匹配停止序列,上一次暂存的停止序列前缀不输出,重新生成的请求发送失败时本次生成以该错误结束。两个通道第一次带终止原因的帧中的内容事件标记为结束帧,自动续写中转入下一轮的帧不标记;Gemini 流式输出把结束帧的内容放进最后一块。

候选 field 5(`$[0][frame][0][0][4]`)为安全评级 `[[null, null, 类别, 概率, blocked?], ...]`,类别编号与安全设置相同,概率 `NEGLIGIBLE`=1、`LOW`=2、`MEDIUM`=3、`HIGH`=4;输入拒绝帧 `[null,[block_reason,ratings?,message]]` 的 ratings 为同形数组。Build 通道读取候选与 `promptFeedback` 的 `safetyRatings`。

Expand Down
Loading