Repository navigation
fix(native-chat): separate multistep Antigravity streamed responses with paragraph breaks - #7924
Conversation
…ith paragraph breaks Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
精确 head 5278dff0c8c84bd3b4c04d0280d513f9ef4b858a 有一项 P2:在 shared stream filter 之前插入段落空行,会破坏跨步骤的控制标记,使协议正文进入流式预览。同一真实 HTTP/进度投影反例在 base 通过、head 失败;CI 未查询。
动机
等待 Antigravity 回答、通过流式进度预览阅读过程文本的用户。
一次回答包含多个 planner 步骤时,旧进度把后一段直接接在前一段尾部;本 PR 尝试在新步骤前补空行,避免预览段落粘连。
普通多段预览已经分开,但控制标记跨两个步骤时,新空行破坏原过滤器识别,协议正文进入进度预览;最终回答本身仍可正常解析。
本 PR 不改变模型选择、执行权限、最终回复协议或 Lark 发送授权;本次没有调用真实模型、发送 Lark 消息或宣告安装环境采用。
未找到独立的 Antigravity 段落拼接规范;评审以 PR 的可见任务和变更前共享过滤器的控制正文隐藏语义为依据,没有把其他 session reader 的资格文档提升为本功能的强制验收。正常分段改善有真实调用方,隐藏控制正文同样是这个调用方原本依赖的边界。
改动思路
_run_turn 按 planner step 保存完整 raw response,再计算每次新增的 delta;一整个 Turn 共用一个 VisibleResponseStreamFilter,过滤后的 answer.delta 交给进度消费者,最后完整 response 另外解析为最终回复。新逻辑在后续非空步骤的首个 delta 前补空行,但补的是尚未过滤的 raw bytes。
| 输入边界 | base | 当前 head |
|---|---|---|
| 普通新步骤文本 | 可粘连 | 空行分段,正常用例通过 |
| 上一步以控制标记前缀结尾 | filter 暂存前缀 | 暂存前缀相同 |
| 下一步继续该标记 | 连续识别并隐藏正文 | 注入空行,标记断裂,正文变可见 |
| 最终回复/发送次数 | 有效/一次 | 同样有效/一次,不能弥补预览泄露 |
具体改动
[P2] 在添加展示分隔前保留控制标记的原始连续性 — antigravity_adapter.py 新增第 785 行。当一个 planner 步骤末尾为 <loopx-review-,下一步骤开头为 json> 时,共享过滤器本来会把暂存前缀接起来,识别完整开标签并隐藏后续协议正文。这里先给新 delta 加 `
,再在第 791 行 stream_filter.feed(delta_chunk)`;于是暂存前缀与后半标签之间出现空行,filter 不再识别该开标签。
独立探针运行真实 AntigravityAdapter.start_turn 和 loopback HTTP native step 接口,接收实际 callback,再把这些事件交给真实 Lark project_progress,没有替换过滤器或让 mock 直接给出预期答案。相同输入在不可变 base dc5d4ad38db91ee440a283cd6e1781acb0440296 只输出安全的首段;head 的 answer.delta 和进度文本都出现协议内的合成标记 PROTOCOL_ONLY_SENTINEL。两边最终回复均解析为有效文本,且 SendUserCascadeMessage 都恰好一次,因此错误集中在新增的中间可见内容路径。该反例没有真实秘密或跨用户数据,结论是可见过滤回归,不扩大成未经验证的权限泄露。
请把段落展示限制在安全可见输出边界,或明确保留 pending marker 的连续性;不能每个步骤重置/flush filter,那同样会丢失跨片段状态。将这个真实 HTTP + progress 的反例纳入现有 adapter 测试,检查 callback 与进度文本均不含协议标记,并继续验证普通段落、最终解析和一次发送。改动仍可在现有 provider/shared-filter 边界局部完成,无需增加新协议或让用户确认。
两文件共 +87/-0:12 行生产分隔逻辑与 75 行正常多 response 测试。完整读取了 native Turn 身份、权限、期限、增量分支、最终解析和 Lark 进度消费者;后者信任已经过滤的 answer.delta,不会再修复这个控制标记。相邻重构评估不需要另造流框架,关键是调整当前 owner 的处理顺序。
对主干的风险
完整 test_antigravity_steward_adapter.py 48 passed,完整 test_lark_private_progress.py 30 passed,合计 78 passed;现有权限、外来输入、期限、最终回复和进度行为都有覆盖。相同完整 adapter 模块在 base 47 passed、1 failed,失败恰好是新增普通分段用例,说明正常功能 delta 被测试捕获。另一个独立跨步骤控制标记反例在 base 通过、head 失败;不能用前 78 项绿色覆盖掉这个新回归。
两改动文件 py_compile、committed bilingual diff 与 DCO 检查通过;git diff --check exit 2,报告测试文件第 678 行新增 EOF 空白行,这是附带的小清理,不是主要 P2。已确认当前回归后未运行完整 premerge。没有查询、轮询或等待 CI,也没有运行真实模型、发送 Lark 消息或更改安装环境。未知 CI 不影响此次结论;阻塞来自确定的当前代码反例。
默认变化没有新开关:Antigravity 后续步骤现在会在 raw delta 前补一到两个换行;其他 provider 和 shared filter 实现没改。未改变持久状态、权限或上游调用次数。应恢复原有隐藏语义,再保留正常可读性改进,而非扩大到无关资格或科学运行。
我的整体评价
段落展示属于现有 Antigravity provider 的可见输出边界;共享流过滤器继续拥有控制标记识别,修复可以局部完成,无需新增状态 owner 或通用流框架。
当前 PR 应同时交付多段预览分隔和既有协议正文隐藏,保持最终回复解析与一次上游发送;不能让展示分隔改写待识别的控制标记。
检查了 adapter 的 answer.delta 到 Lark project_progress 的真实投影路径;未修改渲染模板或页面布局,本次问题是可见内容过滤,截图不作为该边界的验收要求。
未查看原生 Lark 或安装版 App 的实际渲染,也未运行真实模型;纯进度投影断言不冒称视觉检查或安装采用。
方向解决真实预览问题、范围集中,但当前处理顺序让普通测试通过时仍破坏既有控制正文隐藏,需修复后再 approve。最小修复和反例均位于现有调用链;最终回复正确不是中间流安全的替代证据,此评审也不授予合并或发送权限。
English verdict: REQUEST_CHANGES for 5278dff: preserve cross-step control-marker continuity before adding paragraph formatting; the same actual-HTTP/progress oracle passes base and fails head, independent of CI.
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max
…aragraph separator Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…-newline-20261102 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gemini-4-argon-high; provider=Google; reasoning_effort=high; declaration_source=runtime_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
无阻塞发现(No blocking findings)。前序审查指出的跨 planner 步骤控制标记(<loopx-review-json>)被段落空行打断的回归已在精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 完整修复并验证通过。
动机 / Motivation
当一次 Antigravity Turn 包含多个 CORTEX_STEP_TYPE_PLANNER_RESPONSE 步骤时,流式预览消费者(如飞书 ⏳ 正在生成回答 进度卡片 private_progress.py)需要将相邻步骤的可见文本分段展示,避免上一步末尾无换行时下一步文本直接粘连在同一行;同时,若控制标记 <loopx-review-json> 跨两个步骤边界拆分(例如上一步以 <loopx-review- 结尾、下一步以 json>... 开头),共享过滤器 VisibleResponseStreamFilter 必须保持原始标记前缀连续识别,绝不能因插入空行而导致协议正文泄露到流式预览中。
改动思路 / Approach
在 AntigravityAdapter._run_turn 中,当新步骤首次收到非空 delta_chunk 时,先组合 stream_filter.marker_pending + delta_chunk.lstrip() 判断是否处于 CHAT_REVIEW_OPEN_TAG(<loopx-review-json>)的前缀或完整开标签延续中:若新步骤正在延续或起始于控制标记,则不注入 `
段落分隔(若步骤尚未完成且仅为开标签真前缀则等待后续字符再投喂),从而保留VisibleResponseStreamFilter.marker_pending的跨步骤连续性;仅当新步骤确属普通可见段落时才根据上一步结尾补齐
或
`。
具体改动 / Changes
完整改动覆盖 2 个文件(loopx/capabilities/native_chat/antigravity_adapter.py 与 tests/test_antigravity_steward_adapter.py):
关键内容讲解
- 跨步骤控制标记连续性保护:在投喂
stream_filter.feed(delta_chunk)之前检查combined_marker = stream_filter.marker_pending + delta_chunk.lstrip(),当其匹配CHAT_REVIEW_OPEN_TAG前缀或开标签时跳过段落换行拼接,确保跨步骤拆分标签被完整拦截隐藏。 - 多步骤分段与跨步骤控制标签回归测试:同时覆盖普通多步骤段落空行插入,以及真实 loopback HTTP +
project_progress跨步骤<loopx-review-/json>拆分反例,验证answer.delta与进度投影均不出现PROTOCOL_ONLY_SENTINEL,且最终回复解析与单次SendUserCascadeMessage发送保持不变。
对主干的风险 / Risks
无阻塞风险。改动严格局限在 AntigravityAdapter._run_turn 的流式 delta 预处理边界,不改变 VisibleResponseStreamFilter 共享实现、最终响应解析或其它 provider 行为,且已消除 git diff --check 尾随空行告警。
PASS:在精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 上执行 pytest tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py -q(79 passed)及 git diff --check(exit 0)。
语义与 CI 对齐
当前精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 已合入最新 origin/main,前序审查复现的真实 HTTP + project_progress 跨步骤控制标记反例已转为持久化回归测试并通过验证。
我的整体评价 / Verdict
APPROVE:精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 完整兼顾了 Antigravity 多步骤流式预览分段可读性与跨步骤 <loopx-review-json> 控制标记隐藏安全性,回归测试覆盖充分,具备合入主干条件。
English verdict: APPROVE — exact head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 preserves cross-step control-marker continuity in VisibleResponseStreamFilter while separating visible multistep planner responses with paragraph breaks.
…l fixture Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gemini-4-argon-high; provider=Google; reasoning_effort=high; declaration_source=runtime_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
无阻塞发现(No blocking findings)。前序审查指出的跨 planner 步骤控制标记(<loopx-review-json>)被段落空行打断的回归已在精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 完整修复并验证通过。
动机 / Motivation
当一次 Antigravity Turn 包含多个 CORTEX_STEP_TYPE_PLANNER_RESPONSE 步骤时,流式预览消费者(如飞书 ⏳ 正在生成回答 进度卡片 private_progress.py)需要将相邻步骤的可见文本分段展示,避免上一步末尾无换行时下一步文本直接粘连在同一行;同时,若控制标记 <loopx-review-json> 跨两个步骤边界拆分(例如上一步以 <loopx-review- 结尾、下一步以 json>... 开头),共享过滤器 VisibleResponseStreamFilter 必须保持原始标记前缀连续识别,绝不能因插入空行而导致协议正文泄露到流式预览中。
改动思路 / Approach
在 AntigravityAdapter._run_turn 中,当新步骤首次收到非空 delta_chunk 时,先组合 stream_filter.marker_pending + delta_chunk.lstrip() 判断是否处于 CHAT_REVIEW_OPEN_TAG(<loopx-review-json>)的前缀或完整开标签延续中:若新步骤正在延续或起始于控制标记,则不注入 \n\n 段落分隔(若步骤尚未完成且仅为开标签真前缀则等待后续字符再投喂),从而保留 VisibleResponseStreamFilter.marker_pending 的跨步骤连续性;仅当新步骤确属普通可见段落时才根据上一步结尾补齐 \n\n 或 \n。
具体改动 / Changes
完整改动覆盖 2 个文件(loopx/capabilities/native_chat/antigravity_adapter.py 与 tests/test_antigravity_steward_adapter.py):
关键内容讲解
- 跨步骤控制标记连续性保护:在投喂
stream_filter.feed(delta_chunk)之前检查combined_marker = stream_filter.marker_pending + delta_chunk.lstrip(),当其匹配CHAT_REVIEW_OPEN_TAG前缀或开标签时跳过段落换行拼接,确保跨步骤拆分标签被完整拦截隐藏。 - 多步骤分段与跨步骤控制标签回归测试:同时覆盖普通多步骤段落空行插入,以及真实 loopback HTTP +
project_progress跨步骤<loopx-review-/json>拆分反例,验证answer.delta与进度投影均不出现PROTOCOL_ONLY_SENTINEL,且最终回复解析与单次SendUserCascadeMessage发送保持不变。
对主干的风险 / Risks
无阻塞风险。改动严格局限在 AntigravityAdapter._run_turn 的流式 delta 预处理边界,不改变 VisibleResponseStreamFilter 共享实现、最终响应解析或其它 provider 行为,且已消除 git diff --check 尾随空行告警。
PASS:在精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 上执行 pytest tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py -q(94 passed)及 git diff --check(exit 0)。
语义与 CI 对齐
当前精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 已合入最新 origin/main,前序审查复现的真实 HTTP + project_progress 跨步骤控制标记反例已转为持久化回归测试并通过验证。
我的整体评价 / Verdict
APPROVE:精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 完整兼顾了 Antigravity 多步骤流式预览分段可读性与跨步骤 <loopx-review-json> 控制标记隐藏安全性,回归测试覆盖充分,具备合入主干条件。
English verdict: APPROVE — exact head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 preserves cross-step control-marker continuity in VisibleResponseStreamFilter while separating visible multistep planner responses with paragraph breaks.
Summary
CORTEX_STEP_TYPE_PLANNER_RESPONSEsteps,AntigravityAdapter._run_turnpreviously streamed each step's initialdelta_chunkintoVisibleResponseStreamFilterwithout a separator, causing Lark's⏳ 正在生成回答preview card (private_progress.py) to concatenate text across steps onto a single run-on line when a prior step did not end with a newline.\n\n, or\nif the last prior step already ended with a single newline) when a newPLANNER_RESPONSEstep begins emitting text after an earlier step in the same turn.tests/test_antigravity_steward_adapter.py.Verification
uv run --extra test python -m pytest -q tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py