[GH-ISSUE #50] qwen 这里多账号配置文件是不是有点问题? #45

Closed
opened 2026-02-27 07:17:38 +03:00 by kerem · 3 comments
Owner

Originally created by @MengxuanDai on GitHub (Sep 17, 2025).
Original GitHub issue: https://github.com/justlovemaki/AIClient-2-API/issues/50

最后使用codex让其修复了

  1. 复现与日志
    • 直接跑 node src/api-server.js(为了跳过默认的 0.0.0.0 绑定,后来加了 --host 127.0.0.1)。启动日志里首先打出配置载入成功,紧接着提示 system
      prompt 文件缺失和一些无关的 API key 警告,然后服务器在绑定 8005 端口时被沙箱拒绝。虽然端口没绑定成功,但足够看到初始化流程和 token 刷新触发的位置。
  2. 排查配置和刷新实现
    • 发现 [Config Error] Failed to load provider pools…,追查 provider_pools.json 后看到里面混入全角逗号,JSON.parse 直接失败,导致所有号池配置被忽
      略,服务退回到单账号模式。
    • 继续看 Qwen 适配器,SharedTokenManager 是单例且始终读写默认的 ~/.qwen/oauth_creds.json 和 oauth_creds.lock。即使配置里提供了
      QWEN_OAUTH_CREDS_FILE_PATH,也没被用到;多个账号也会抢同一个锁。定时刷新或 401 重试时,因为没有正确的 refresh token,就抛出“刷新失败”。
  3. 修复措施
    • 先把 provider_pools.json 里的全角逗号替换成 ASCII 逗号,使号池配置能正确解析并带出各自的 QWEN_OAUTH_CREDS_FILE_PATH。
    • 改写 Qwen 模块:在服务初始化时解析出真实的凭据路径;调用 shared token manager 时把这个路径传进去;重构 SharedTokenManager,按凭据文件路径维护
      独立的缓存和锁文件(锁文件改为 oauth_credsX.json.lock),并在进程退出时清理所有锁。
  4. 验证
    • 在沙箱里无法真正监听端口,但单独构造了两个 QwenApiService 实例,分别指向 oauth_creds1.json 和 oauth_creds2.json,调用 _initializeAuth 后都成功
      载入各自的 access/refresh token,说明路径隔离生效。
    • 后续你在本机启动 node src/api-server.js 并打一次 Qwen 请求或等定时任务跑,就能看到刷新成功的心跳日志,不再报错。

整个过程从日志暴露的 JSON 解析异常入手,确认配置没有生效,再深入到 token 管理器的实现,最终让多个账号各用各的凭据和锁,刷新逻辑恢复正常。

▌ 如果provider_pools.json是好的后面会正常运行么?

单把 provider_pools.json 改成合法 JSON 还不够。虽然号池配置能被加载,但旧版 SharedTokenManager 依然会忽略配置里提供的 QWEN_OAUTH_CREDS_FILE_PATH,所
有账号还是去读写默认的 ~/.qwen/oauth_creds.json,刷新时找不到对应的 refresh token,照样报“刷新失败”。必须同时引入本次对 Qwen 模块的改动,让每个池成
员使用自己的凭据与锁文件,刷新流程才会真正恢复正常。

Originally created by @MengxuanDai on GitHub (Sep 17, 2025). Original GitHub issue: https://github.com/justlovemaki/AIClient-2-API/issues/50 最后使用codex让其修复了 1. 复现与日志 - 直接跑 node src/api-server.js(为了跳过默认的 0.0.0.0 绑定,后来加了 --host 127.0.0.1)。启动日志里首先打出配置载入成功,紧接着提示 system prompt 文件缺失和一些无关的 API key 警告,然后服务器在绑定 8005 端口时被沙箱拒绝。虽然端口没绑定成功,但足够看到初始化流程和 token 刷新触发的位置。 2. 排查配置和刷新实现 - 发现 [Config Error] Failed to load provider pools…,追查 provider_pools.json 后看到里面混入全角逗号,JSON.parse 直接失败,导致所有号池配置被忽 略,服务退回到单账号模式。 - 继续看 Qwen 适配器,SharedTokenManager 是单例且始终读写默认的 ~/.qwen/oauth_creds.json 和 oauth_creds.lock。即使配置里提供了 QWEN_OAUTH_CREDS_FILE_PATH,也没被用到;多个账号也会抢同一个锁。定时刷新或 401 重试时,因为没有正确的 refresh token,就抛出“刷新失败”。 3. 修复措施 - 先把 provider_pools.json 里的全角逗号替换成 ASCII 逗号,使号池配置能正确解析并带出各自的 QWEN_OAUTH_CREDS_FILE_PATH。 - 改写 Qwen 模块:在服务初始化时解析出真实的凭据路径;调用 shared token manager 时把这个路径传进去;重构 SharedTokenManager,按凭据文件路径维护 独立的缓存和锁文件(锁文件改为 oauth_credsX.json.lock),并在进程退出时清理所有锁。 4. 验证 - 在沙箱里无法真正监听端口,但单独构造了两个 QwenApiService 实例,分别指向 oauth_creds1.json 和 oauth_creds2.json,调用 _initializeAuth 后都成功 载入各自的 access/refresh token,说明路径隔离生效。 - 后续你在本机启动 node src/api-server.js 并打一次 Qwen 请求或等定时任务跑,就能看到刷新成功的心跳日志,不再报错。 整个过程从日志暴露的 JSON 解析异常入手,确认配置没有生效,再深入到 token 管理器的实现,最终让多个账号各用各的凭据和锁,刷新逻辑恢复正常。 ▌ 如果provider_pools.json是好的后面会正常运行么? > 单把 provider_pools.json 改成合法 JSON 还不够。虽然号池配置能被加载,但旧版 SharedTokenManager 依然会忽略配置里提供的 QWEN_OAUTH_CREDS_FILE_PATH,所 有账号还是去读写默认的 ~/.qwen/oauth_creds.json,刷新时找不到对应的 refresh token,照样报“刷新失败”。必须同时引入本次对 Qwen 模块的改动,让每个池成 员使用自己的凭据与锁文件,刷新流程才会真正恢复正常。
kerem closed this issue 2026-02-27 07:17:38 +03:00
Author
Owner

@MengxuanDai commented on GitHub (Sep 17, 2025):

仅供参考,我这修复后就正常运行了。

<!-- gh-comment-id:3303125232 --> @MengxuanDai commented on GitHub (Sep 17, 2025): 仅供参考,我这修复后就正常运行了。
Author
Owner

@justlovemaki commented on GitHub (Sep 17, 2025):

能把你修复后的代码传上来看看吗?配置文件的逗号问题可能是你的手误,示例的配置文件放json格式化里是没有报错的。其他的可能有问题,明天看看

<!-- gh-comment-id:3303732282 --> @justlovemaki commented on GitHub (Sep 17, 2025): 能把你修复后的代码传上来看看吗?配置文件的逗号问题可能是你的手误,示例的配置文件放json格式化里是没有报错的。其他的可能有问题,明天看看
Author
Owner

@justlovemaki commented on GitHub (Sep 18, 2025):

fixed with #52

<!-- gh-comment-id:3305977909 --> @justlovemaki commented on GitHub (Sep 18, 2025): fixed with #52
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/AIClient-2-API-justlovemaki#45
No description provided.