Skip to content

fix(claude): keep custom Grok requests on their selected provider - #5307

Merged
MagicLizi merged 4 commits into
makecindy:mainfrom
PraiseZhu:fix/claude-grok-provider-binding
Oct 1, 2026
Merged

MagicLizi merged 4 commits into
makecindy:mainfrom
PraiseZhu:fix/claude-grok-provider-binding

Conversation

@PraiseZhu

@PraiseZhu PraiseZhu commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

Claude Code 新会话首次请求可能早于 SDK 会话 ID 回填。此时本地代理无法识别用户选择的自定义供应商,裸 grok-4.6 会进入 xAI OAuth bridge,并在没有对应授权时本地返回 502。

在本地 SDK 启动前预先指定原生请求 UUID,让活跃 Session 和 CLI 请求从一开始使用相同请求 ID。请求路由通过 requestSessionId 识别当前 CLI;可恢复 ID 保留在 handle.id,未接受的 fork 始终保持源 ID。初始 Maker 保存和 SDK init 都不再提前持久化目的 ID;输入进入队列成功后才同步提交一次。普通 resume 保留原 ID,其他引擎通过可选字段回落保持原契约。

fork 启动失败或输入接受前取消时,恢复源 ID、宿主记录和重试位置;目录授权保持完整源会话 fork,rewind 保持原消息锚点。成功接受输入后才解除本轮回滚。

变更类型

  • fix 缺陷修复

范围

  • 关联需求:自定义供应商 Grok 首次请求保持用户所选路由。
  • 本 PR 包含:本地 Claude SDK 会话 ID 预分配、恢复与重建回归、真实 CLI 路由 E2E。
  • 明确不包含:网关服务端、模型目录、Pi、原生 CLI 版本与登录配置。
  • 用户可见变化:选用自定义供应商的 Grok 不因首次会话 ID 尚未回填而转入 xAI OAuth。
  • 是否存在 breaking change:无。

UI 变化

不涉及。

  • 引用的设计规范:不涉及。

怎么验证的

自动验证

pnpm --filter @cindy/maker-core exec vitest run src/agents/claude-code/__tests__ --reporter=dot
Claude 回归包含 fresh/resume/fork/invalid-resume/rewind/remote,以及构造失败、接受前取消、转换失败、init 后取消、目录授权重试、初始及运行期 fork 在转换中关闭、提交目的 ID 仅一次。

pnpm --filter @cindy/maker-core exec vitest run --reporter=dot
165 个文件、5006 项测试通过;6 个文件、40 项测试按既有条件跳过。

CINDY_TEST_CLAUDE_BINARY=<本 worktree 内置 Claude 2.1.280 路径> pnpm --filter desktop exec vitest run src/main/maker-host/__tests__/claudeGrokSessionAffinity.integration.test.ts --reporter=dot
真实 Claude CLI + SDK 0.2.112 -> 真实生产路由代理 -> 本机假 Art 上游,两个并发会话及初始 resume+fork 通过。
fork 输入接受前,新请求 ID 可以路由到 Art,持久 ID 仍为源;接受后只提交一次目的 ID。所有请求保持 Grok 模型和 fixture Art 认证,未进入 xAI bridge。

pnpm --filter desktop exec vitest run src/main/maker-host/__tests__/claudeProxyScopeGate.test.ts
58 项既有路由边界测试通过。

pnpm --filter @cindy/maker-core exec tsc --noEmit
pnpm --filter desktop typecheck
pnpm check:endpoints
git diff --check
通过。

新增 E2E 只在显式提供 CINDY_TEST_CLAUDE_BINARY 时执行,使用临时 HOME、配置目录和 fixture key,不访问开发者授权。

独立 Sonnet 5.5(anthropic/claude-sonnet-5-5 / high / xd)对 dd5fe2dfc 的冻结增量终审通过:Greptile 评论 4147782975 的“未接受输入就持久化 fork ID”P1 已关闭,未发现新的 P0/P1。审核没有重跑上述测试。

手工验证

未替换或重启正在运行的 Cindy。真实 CLI 的 HTTP 链路由自动 E2E 验证。

未执行的验证

  • 未调用真实 Art 或 xAI 上游;没有 GUI 操作验证。
  • 全文件 ESLint 存在 16 项既有 unused 错误。已用 git show origin/main:<文件> | eslint --stdin 复核:原生 Agent 的 3 项、rewind 测试的 13 项与主干完全一致;本次新增 E2E 和其他修改测试的 ESLint 通过。
  • 远端完整 CI 以 PR checks 为准。

风险

风险分类

  • 权限 / 安全 / 用户数据
  • 其他:本地 Claude 会话初始化、resume/fork 与事件持久化时序。

影响与回滚

  • 影响范围:本地 Claude SDK 新会话及 fork;普通 resume 继续使用原会话,SSH 分支保持现有行为。
  • 截图 P1 已修:未接受的 fork 不再写入目的 ID,关闭任务无需依赖补发回滚事件;验证了初始保存、init 早到、转换中关闭及接受后提交,未进行真实应用进程强杀测试。
  • 既有未实测边界:fresh 会话首条消息前改变目录,再次重建可能需要处理无转录的预绑定 UUID。Sonnet 将其列为非阻塞 P2,本轮未宣称覆盖该独立场景。
  • 回滚方式:revert 本 PR;没有数据库迁移、用户配置转换或凭证存储变更。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s)
  • 未提交凭证、令牌或授权文件
  • 已核对受影响的文档,本次无需更新既有权威说明
  • 已确认测试结果并说明未执行项

Signed-off-by: PraiseZhu <zhuzan@xd.com>
Signed-off-by: PraiseZhu <zhuzan@xd.com>
@PraiseZhu
PraiseZhu requested a review from a team as a code owner September 30, 2026 17:55
@greptile-apps

greptile-apps Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Medium risk] Adjusts how Claude agent sessions bind to providers.

暂不宜合并;fork 重建期间关闭任务可能留下无法恢复原上下文的持久化会话 ID。

Findings

  1. P1 未接受输入就持久化 fork ID ▶
Fix with agent prompt
### Issue 1
packages/maker-core/src/agents/claude-code/index.ts:4138-4140
重建 fork 时,这里在用户输入被接受前发布目的会话 ID,Maker 随即可能将它写入 `sdk_session_id`。如果用户在附件转换或运行时设置重放期间关闭任务,事件流会结束,回滚源 ID 的事件便无法可靠落库。下次打开任务可能尝试恢复尚未收到输入的 fork,转为全新会话并失去原有上下文。需要让关闭路径也能持久恢复源 ID,或等输入被接受后再持久化目的 ID。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
Summary

此 PR 为本地 Claude SDK 新会话和 fork 预分配原生会话 ID,使首次请求能够按活跃 Session 选择自定义供应商。

  • 增加 fresh、resume、fork、取消与重建的回归测试,以及真实 CLI 到本地供应商 fixture 的路由测试。
  • fork 在输入接受前发布目的 ID,关闭任务时仍有持久化错误 ID 的风险。
Diagram
sequenceDiagram
  participant C as Claude Agent
  participant M as Maker 持久化
  participant U as 用户输入
  C->>C: 创建 fork Query 和目的 ID
  C->>M: 发布 session_id(目的 ID)
  M->>M: 写入 sdk_session_id
  U-->>C: 输入转换尚未完成
  C->>C: 任务关闭,结束事件流
  C--xM: 源 ID 回滚事件可能无法送达
Loading

Reviews (1) · Last reviewed commit: "fix(claude): restore fork source when in..."

Comment thread packages/maker-core/src/agents/claude-code/index.ts Outdated
@MagicLizi MagicLizi added the touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) label Sep 30, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

你好,本 PR 命中维护者确认门,正在等待维护者确认后再继续自动审查与合并:

  • 插件基座(pluginBase):触及 apps/desktop/src/main/cindy-brain/(library extraDirs 授权契约测试),影响全部已装插件的兼容契约,需维护者对存量插件兼容明确确认;
  • 核心路径(arch):核心路径改动 531 行 ≥ 150 行阈值。

具体确认请求见讨论 issue:#5339

确认方式:请维护者直接在本 PR 上 Approve;需要修改则 Request Changes,你改完后由维护者重新 Approve。维护者确认完成前,自动流程不会合并本 PR。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) labels Oct 1, 2026
@PraiseZhu

Copy link
Copy Markdown
Contributor Author

已核对 PR 当前 HEAD 449f1aa3。fork 的新 session ID 只在用户输入成功入队后才发出 session_id;输入接受前关闭时仍保留源 ID。当前代码和对应回归测试已覆盖这一路径,因此本轮无需追加代码修改。

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

可以推进

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Oct 1, 2026
@MagicLizi
MagicLizi merged commit 7dfd589 into makecindy:main Oct 1, 2026
10 checks passed
@MagicLizi

Copy link
Copy Markdown
Contributor

合了。会话身份预绑定把「自定义供应商 Grok 首发误进 xAI OAuth」这个时序坑钉死了,未接受 fork 不落目的 ID、取消回滚源会话的边界处理和回归覆盖得很扎实,真实 CLI 的路由 E2E 也确实跑通了——谢谢。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants