Repository navigation
fix(chat): keep context-limit failures in the pending queue - #8164
Conversation
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: model_agent; GPT-6 family; OpenAI; self_reported.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
使用原飞书私聊与连接设置查看积压消息的用户会遇到这一问题。模型上下文超限后,失败提示已经送达,原问题却从待处理计数中消失;修复后同一失败请求仍显示待处理。让未完成问题持续可见,并由原恢复流程决定能否继续执行。本次修复待处理投影,不宣告旧问题业务完成。原请求后续实质处理、直接答案及原渠道读回仍需沿既有负责人验收。同一原问题已经有持久失败记录,因此让用户重新描述问题或手动制造另一个请求,会增加重复执行和漏追踪风险。这里的收益是修复现有状态的可信度,完整补办仍依赖原服务逐项处理。
改动思路 / Approach
失败生命周期由现有 TypeScript 规则派生;传输、恢复准入和停止仍由各自现有 owner 执行,无需增加状态或消费者。当前 PR 只补齐上下文超限的待处理语义,并为相邻历史线程来源判断补足字符串类型检查。先比较了不改、在飞书适配器另维护一个计数,以及扩展共享投影三条路:不改会继续漏记,独立计数会复制状态,当前规则修复可以同时进入已有健康检查和设置读模型。恢复是否能执行仍需独立核验原来源、原生执行效果和预算,不能从一个待处理数字推导出来。这个变化用现有契约和回归即可说明,无需新增状态图或配置界面。
具体改动 / Changes
关键代码讲解
planBoundConversationRequest的pending_observation分支,在既有接受状态、Session/Turn 精确关联、停止和关闭检查后,将已知context_window_exceeded失败保留为待处理。它返回投影结果,没有调用接续或模型执行。planExhaustedStewardAnswer对历史与实际原生thread_id先做字符串判断,保留已知来源的成员匹配。原实现存在unknown参数导致的类型检查失败;这里用实际类型收窄修复,未用类型断言放过未知证明。空值、数字和外国线程都仍不能取得恢复资格。- 既有
LarkPrivateConversations.health继续读取原请求与 Core 的相关性,通过同一批量 TS 规则生成计数;private-conversation-panel.tsx继续展示这一个原生计数。没有第二份状态,也不需要用户额外授权或录入。
规范依据:docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,revision 927d0b389096a9ca8702c4da14a43836063ed29b 的“Native history migration and unfinished-request continuation”段。FAILURE-LIFETIME:失败送达不能结清业务,由新旧实现同例对照与集成用例证明。ORIGINAL-QUEUE:保留原失败、原源与既有同 Session 队列,集成检查核对原持久记录和启动次数。STOP-PROOF:停止、关闭、未知原生证明继续阻止恢复;TS 负例和 /stop、/new 场景验证。此次未改写规范来迎合实现。
对主干的风险 / Risks
未发现阻断性问题。最强反例是“计数正确但健康检查又执行了一次业务”:6 项真实 Core/传输集成检查禁止 enqueue_turn 和恢复调用,比较原消息、持久失败和 provider 写入,验证重建 transport 后仍只有一次模型启动。模型和外部 provider IO 为合成边界,未把它说成用户的真实消息已经完成。相同 TS 用例放到不可变 base 后为55通过、1项预期失败,唯一失败就是上下文超限被算为无待办;当前 head 56项通过。另5项 conversation scope 回归通过。
首次类型检查失败保留,最终以字符串收窄后通过;RFC 双语差分、diff hygiene 和3个变更文件公开边界检查通过。全局检查仍有两个既有本地 authority 诊断,未迁移其状态,也没有把整体命令称为通过。完整路由回归另有374项通过、114项按所选范围未运行;quick premerge gate 通过,保留工具报告的一项既有可维护性 advisory,未把它改写成全树无债务。按当前配置不查询、不等待 CI。此次只复用已有错误值和状态 owner,没有增加公共协议、状态存储、消费者或重试预算。
我的整体评价 / Verdict
long_horizon 与 user_experience 均为 improved:已接受但未完成的问题不会因为失败提示送达而失去可见性,原有停止、关闭和防重放约束仍生效。代码量和维护成本与这个已复现的问题相称,复用现有 owner 比 provider 特判更合适。已检查 private-conversation-panel.tsx 的计数消费与 HTTP 数据契约;本次没有渲染布局、控件或文案改动。本评审不认证安装后的完整原生 App 体验或所有旧业务已补办。尚余业务及运行采用不能由56项测试或一个正确计数替代。当前精确 head 为 ed53ff7156b673e29fb1ce9e58918870c07c4a9e;在远端版本再次核对不变、全部必要本地检查和既有合并授权成立后,可进入正常合并路径。
English verdict: APPROVE — ed53ff7; retain context-limit failure visibility, preserve original stop/replay boundaries; 56 TS and 6 Core/transport integration cases plus typecheck pass.
上下文超过模型限制后,原请求已经失败、失败提示也已送达,但连接设置的“待处理或回复”计数会把它漏掉。本改动让这类原请求继续保留为待处理;停止与会话关闭仍按原生命周期结清,恢复执行仍需通过既有准入。
复用现有 TypeScript pending observation 和两组失败恢复回归,没有增加状态、消费者或执行入口。同时修复该文件历史 native thread 读取的
unknown类型检查失败:先核实字符串,再匹配已有原生线程来源。验证:
/stop、/new后不重放。这次交付补齐遗漏请求的待处理投影。旧失败请求的实质业务和结果回传需要沿原服务分别验收。