按观察到的现象或报错原文定位原因与解决办法。
本页按观察到的现象索引。如果已经拿到错误码、异常类名或进程退出码,请直接查阅错误与错误码,该页按错误身份索引。
现象:
排查启动问题时建议捕获
部分选项会在前置阶段校验,因此拼写错误会立即失败,而非让某项功能被静默关闭。以下异常在 Qoder CLI 启动之前同步抛出。
现象:
现象: 工具已注册、会话正常启动,但 Agent 绕过该工具完成了任务。
按以下顺序排查:
现象: 工具调用被拒绝,或运行停滞在一个永不到来的审批上。
完整的优先级顺序参见权限控制。
现象:
建议在回调之外缓存决策结果,而非反复提高超时时间。这里的每一毫秒都会叠加到每一轮请求上。
仅适用于 TypeScript —— Python SDK 未提供
若
现象: 设置文件中已开启某项功能,但会话表现为未开启。
部分查询选项具有最终决定权:一旦传入,它会替换而非合并对应的设置块,未显式列出的开关全部按
现象: Agent 遵循了提示词中并不存在的约定。
运行 Qoder CLI 的机器上的指令文件默认会被加载,且这些文件可以引入其他文件。可通过日志确认实际加载了什么:
若需在不同主机上获得可复现的运行结果,使用
需要升级排查时,请在现场信息丢失前收集以下内容:
同时记录 SDK 版本、
会话始终无法启动
现象: query() 没有产出任何消息,或首个 await 长时间挂起后抛出异常。
| 原因 | 如何确认 | 解决办法 |
|---|---|---|
qodercli 可执行文件不在 PATH 中 | 异常为 QoderCliProcessError,且提示信息中包含可执行文件 | 设置 pathToQoderCLIExecutable,或导出 QODERCLI_PATH |
| 启动超出加载超时 | 每次都在固定时长后失败 | 提高 loadTimeoutMs;磁盘较慢时的冷启动可能超过默认值 |
| 未配置凭证 | 异常带有 code: 'auth_not_configured' | 传入 auth,参见认证 |
| 凭证环境变量未设置 | code: 'auth_access_token_env_var_not_configured' 或 ..._service_account_... | 导出认证辅助函数读取的那个变量 |
stderr,其中通常直接指明了真实原因:
选项在进程启动前即被拒绝
部分选项会在前置阶段校验,因此拼写错误会立即失败,而非让某项功能被静默关闭。以下异常在 Qoder CLI 启动之前同步抛出。
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
securityScan contains unknown option: <key>security_scan contains unknown option: <key>. | 开关名拼写错误 | TypeScript 使用 l1StaticCheck / l2LightweightScan / l3DeepScan;Python 使用 l1_static_check / l2_lightweight_scan / l3_deep_scan |
securityScan.<key> must be a booleansecurity_scan.<key> must be a bool. | 传入了 'yes' 之类的字符串 | 传入 true 或 false |
security_scan must be a dict. | Python 侧传入了非映射类型 | 传入开关组成的 dict |
native mode requires at least one enabled scope; use memory: {} to disable SDK memory | projectScope 与 userScope 同时设为 false(仅 TypeScript) | 保留一个作用域,或用 memory: {} 关闭记忆 |
[createSdkMcpServer] Server name must be a non-empty string. | name 缺失或为空 | 为服务指定名称 |
[createSdkMcpServer] Tool name must be a non-empty string in server "<server>". | 定义工具时未提供名称 | 为每个工具命名 |
[createSdkMcpServer] Tool "<tool>" must have a non-empty description string. | 缺少 description | 补充描述;模型依赖它判断何时调用该工具 |
SDK 与运行时版本不匹配
现象: ProtocolVersionMismatchError 或 UnsupportedCliCapabilityError。
这表示 SDK 与 Qoder CLI 来自不兼容的版本,通常出现在运行时由使用方单独管理、而非使用包内自带运行时的情况下。
UnsupportedCliCapabilityError.capability 会指明缺失的具体能力,据此可判断应升级运行时还是停用该选项。解决办法是升级 Qoder CLI,或移除 pathToQoderCLIExecutable 覆盖,改用包内自带的运行时。
Agent 始终不调用自定义工具
现象: 工具已注册、会话正常启动,但 Agent 绕过该工具完成了任务。
按以下顺序排查:
- 确认完整工具名。 服务名为
my_tools、工具名为greet时,模型看到的是mcp__my_tools__greet。白名单必须使用完整名称。 - 确认未被白名单排除。 若设置了
tools或allowedTools但未包含该工具,模型不会看到它。参见工具命名与白名单。 - 确认懒加载影响。 启用 MCP 懒加载后,工具不会全部常驻。对必须始终可用的工具做标记:
- 检查工具描述。 描述是模型判断该工具适用场景的唯一依据。「做某件事」这类描述会被忽略,应明确写出触发条件。
Agent 在本应有权限的操作上停住
现象: 工具调用被拒绝,或运行停滞在一个永不到来的审批上。
| 原因 | 解决办法 |
|---|---|
disallowedTools 覆盖了该工具 | disallowedTools 的优先级高于 allowedTools 和 permissionMode |
| 非交互任务中缺少审批处理 | 设置不需要交互提示的 permissionMode,或提供 canUseTool |
同时设置了 canUseTool 与 permissionPromptToolName | 两者互斥,只能择一 |
模型选择回调超时
现象: ModelPolicyTimeoutError。
resolveModel 位于每次请求的关键路径上,默认预算为 500 毫秒。若回调中查询数据库或调用 HTTP 服务,将超出该预算。
记忆未被写入
仅适用于 TypeScript —— Python SDK 未提供 memory 选项。
现象: Agent 已获得新知识,运行结束后却没有任何内容被保存。
生成在轮次结束之后由后台 Agent 执行。若进程在收到最终 result 消息后立即退出,可能中断正在进行的写入。
flushMemory() 已返回而文件仍无变化,请检查生成结果:no_change 和 skipped 属于正常结果,并非失败。参见查看记忆的执行结果。
在设置中开启的功能未生效
现象: 设置文件中已开启某项功能,但会话表现为未开启。
部分查询选项具有最终决定权:一旦传入,它会替换而非合并对应的设置块,未显式列出的开关全部按 false 处理。
securityScan 即属于此类。若 settings.json 开启了 l1StaticCheck,而查询传入 securityScan: { l3DeepScan: true },则本次会话的 l1StaticCheck 为关闭状态。需要保留的开关必须逐个重新声明。参见该选项覆盖设置,而非合并。
Agent 遵守了未曾设置的规则
现象: Agent 遵循了提示词中并不存在的约定。
运行 Qoder CLI 的机器上的指令文件默认会被加载,且这些文件可以引入其他文件。可通过日志确认实际加载了什么:
settingSources: [] 不从磁盘加载任何文件。参见从文件系统加载指令。
收集可用于上报的诊断信息
需要升级排查时,请在现场信息丢失前收集以下内容:
system/init 消息中的 Qoder CLI 版本、session_id,以及 Result 的 subtype 和可能存在的 error_code。除诊断流程明确需要,凭证、提示词和源码内容应做脱敏处理,参见日志与问题反馈。