Skip to content

OAuth模式下Opus 4.6用着用着就从模型列表消失了 #367

@yike-gunshi

Description

@yike-gunshi

环境

  • CodePilot v0.38.4 / v0.38.5,OAuth 登录(Claude Max),macOS Apple Silicon

问题

用 OAuth 登录后,模型列表一开始是正常的(Sonnet / Opus / Haiku 都在),但用一段时间后再看,只剩 Sonnet 4.6 了,Opus 直接没了。重启 CodePilot 又好了,过一会儿又没了,反复出现。

0.38.4 加的全局默认模型设置挺好的,但这个问题没解决——就算默认设了 Opus,列表被覆盖后 Opus 选项直接消失,设置也没用了。

我排查到的原因

翻了一下编译产物,问题出在 /api/providers/models 路由里:

// 先用硬编码列表初始化(Sonnet、Opus、Haiku 都有)
i[0].models = A.map(...)

// 然后从 claude SDK 的 supportedModels() 拿缓存
const o = getCachedModels("env")

// 如果缓存有东西,直接把整个列表换掉
if (o.length > 0) {
  i[0].models = o.map(...)  // 这里是替换,不是合并
}

问题就在 supportedModels() 返回的结果不稳定,有时候只返回一个 Sonnet,然后整个列表就被覆盖成只有 Sonnet 了。

重启后好了是因为缓存是空的,o.length 是 0,走不进覆盖逻辑,用的是完整的硬编码列表。

建议

getCachedModels 的结果应该跟硬编码列表合并,而不是直接替换。或者加个兜底:如果 SDK 返回的模型数比硬编码列表少,就不要用它。

相关

#252 不同——那个是 UI 显示和实际调用不一致(已确认是预期行为),这个是模型从列表里彻底消失。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions