故障排查
先看运行状态,再看最近事件,最后看日志。大多数问题都能在这三处确定是合同、模型、插件还是存储层出错。
最短诊断流程
CLI:
scientific-agent status RUN_ID
scientific-agent status RUN_ID --events
Control API:
curl -sS http://127.0.0.1:8000/api/v1/health | jq
curl -sS http://127.0.0.1:8000/api/v1/diagnostics | jq
curl -sS http://127.0.0.1:8000/api/v1/runs/RUN_ID/state | jq
桌面端:打开 Control Room,先看 State 的 current_terminal_failure 和 Recent failures,再看 Timeline 的 Failures 过滤器、Jobs 和 Model calls。Settings → About 可以打开日志位置。
理解运行状态
| 状态 | 含义 | 下一步 |
|---|---|---|
CREATED |
合同已创建,尚未开始 | Start 或 resume |
RUNNING |
正在规划或执行 | 等待;检查 Timeline/SSE |
PAUSED |
已安全暂停 | 修正外部条件后 Resume |
BLOCKED |
当前决策无法前进 | 看失败、备注和缺失输入,必要时介入 |
CAPABILITY_MISSING |
合同需要的能力不可用 | 启用/修复插件后 Resume |
BUDGET_EXHAUSTED |
某项预算到上限 | 审查结果;有限更新预算后 Resume |
INTERRUPTED |
进程在非安全终态退出 | Recover 或 resume |
RECOVERING |
正在恢复未完成工作 | 等待并检查 Jobs |
CANCELLING |
正在请求作业停止 | 等待 Executor 确认 |
CANCELLED |
已取消,终态 | 创建新运行继续 |
SUCCESS |
所有指标和产物条件满足 | 审查并导出 |
FAILED |
不可恢复失败或失败预算耗尽 | 查根因,修复后创建新运行 |
不要只根据“进度条不动”判断卡死。长求解器可能没有中间指标;检查 Jobs 的状态和 Timeline 是否仍有心跳更新。
无法创建研究合同
acceptance metric has no producer
所选能力的 metric_outputs 中没有验收指标。
- 打开能力详情核对实际指标名。
- 检查大小写、点号和下划线;指标会规范化,但不能凭近似名称匹配。
- 插件开发者需同时更新
plugin.yaml与 Python manifest。 - 如果指标必须独立评估,加入对应 trusted evaluator 能力。
重复或冲突的验收条件
acceptance_criteria 中每个 metric 只能出现一次,且第一项必须与 acceptance 完全相同。合并同名条件或选择更严格的一项。
能力约束无效
每条约束只能包含映射类型的 when 和 require。先用能力示例跑通,再增加冻结参数;嵌套字段必须与插件实际输入一致。
输入上传失败
桌面端一次研究最多 20 个输入文件。检查文件是否仍可读、Base64 是否完整,以及 artifact type 是否合适。大数据集更适合由受控插件从明确位置生成或导入,不要塞进 API 请求。
Provider 或模型失败
找不到密钥
CLI 配置中的 auth_env 是环境变量名,不是密钥值:
export OPENAI_API_KEY="..."
python -c 'import os; print(bool(os.environ.get("OPENAI_API_KEY")))'
从不同终端、systemd 或 IDE 启动时,环境变量可能没有传入。桌面端应在 Settings → Providers 重新保存凭据并运行 Test connection。
Codex CLI 未登录
codex login
完成浏览器登录后,回到 Settings 重新检测。确保 Desktop 与终端使用同一操作系统用户和同一个 Codex 配置目录。
连接成功但结构化输出失败
- 核对 API format 与端点:Responses、Chat Completions、Anthropic Messages 不可混用。
- 为兼容端点尝试其确实支持的
json_schema、json_object或tool_call。 - Anthropic Messages 不支持这里的
json_object模式。 - 增加 schema repair 只能处理有限格式偏差,不能修复不兼容 API。
超时或频繁重试
查看 Model calls 的延迟、错误码、重试数和 fallback。先减小 max_output_tokens 或任务规模,再谨慎增加 timeout_seconds。持续的 401/403、model not found 和配额错误不会因为重试而改善。
插件问题
Installed 但能力不可选
插件还没有 Enable,或启用后发现依赖缺失。打开详情检查 status、missing_dependencies 和 load_error。
entrypoint 无法导入
entrypoint 使用 package.module:ClassName,不是文件路径。确认:
- ZIP 或目录中包含该 Python package;
- package 目录有
__init__.py; - 类继承
ScientificPlugin; - 依赖装在 Scientific Agent 实际使用的 Python 环境中;
- import 阶段没有执行依赖外部文件或网络的副作用。
ZIP 被拒绝
常见原因是多个 plugin.yaml、压缩包内含虚拟环境/符号链接、路径穿越、加密条目,或超过 10 MiB/50 MiB/512 文件限制。只打包清单、源代码和少量必要资源。
能力调用输入错误
从能力详情复制 example,再逐项替换。普通输入不能有清单未声明的键;需要的产物必须放在 artifact_inputs,不能把 artifact ID 当普通路径字段传入。
Local Executor 问题
- 命令找不到:依赖工具没有安装在应用进程的 PATH 中。用同一用户和环境在终端确认。
- 输出缺失:生成代码没有写入 JobSpec 声明的相对文件名。
- 退出码非零:查看 Jobs 中保存的 stdout、stderr 和结构化 failure type。
- 取消很慢:外部进程没有及时处理终止信号;等待状态完成,必要时在隔离环境中清理。
- 路径被拒绝:输入/输出必须留在工作区,不能使用绝对路径或
..。
不要通过放宽路径检查来修复任务;应修正 JobSpec 或代码的文件约定。
产物或谱系问题
hash mismatch / 产物损坏
底层文件与记录的 SHA-256 不一致。不要覆盖记录或重新计算 hash 来掩盖问题。
- 停止该运行。
- 保存日志和损坏文件的副本。
- 从已验证备份恢复整个相关运行,或创建新运行重算。
- 检查同步盘、手工编辑和磁盘故障。
Lineage 中没有预期关系
插件应通过 artifact inputs、已有 artifact ID 或同一次返回中的 parent_names 声明关系。仅在 metadata 的自由文本中写文件名不会形成谱系边。
无法预览文件
控制室内置文本和 CSV 预览;大型或二进制产物可能只能下载。下载后使用领域工具打开,并核对 UI 中的类型、大小和 hash。
存储与恢复问题
找不到旧运行
最常见原因是 --data-dir 不同。运行:
scientific-agent --data-dir EXPECTED_DIR status RUN_ID
桌面端在 Settings → Storage 查看当前目录。不要把 cache 目录误当 data 目录。
数据目录不可写或空间不足
检查目录权限、挂载状态和可用空间。先暂停运行并创建备份,再通过 Settings 或 /storage/location 迁移。不要在应用运行时手工移动一半目录。
resume 被拒绝
只有可继续状态才能 resume。SUCCESS、FAILED 和 CANCELLED 是终态。对 INTERRUPTED 使用 Recover;对 BUDGET_EXHAUSTED 先审查并通过受控介入增加有限预算。
Control API 问题
| HTTP 状态 | 常见含义 |
|---|---|
| 401 | 正在访问 Desktop 内部 API,但缺少或使用了错误临时令牌 |
| 404 | Run/artifact/plugin ID 不存在,或在开发模式调用 Desktop-only shutdown |
| 409 | 生命周期冲突、重复命令或当前状态不允许该操作 |
| 422 | JSON 字段、枚举、分页或科学命令契约无效 |
先访问 /api/v1/health 确认端口与 mode。开发服务的交互式 schema 在 /api/v1/docs。SSE 断线后使用上次 cursor 重连,不要同时启动大量从 after=0 开始的流。
Benchmark 问题
--prepare-only失败:先确认 Xsuite/ML 依赖和 spec 中相对base_config路径。- spec hash 不一致:冻结规格、基础配置或协议相关文件发生改变;不要强行复用旧结果目录。
- 没有有效成功结果:查看各 trial 的 Runtime 状态和可信验收指标,而不仅是聚合报告。
- integrity 失败:该报告无效;检查私有数据泄漏、事件冻结、predictor hash 和跨运行隔离。
- 重跑没有从头开始:difficulty runner 设计为按 slot 恢复;若要独立实验,使用新的
--data-dir。
更新检查不可用
About 页面会显示当前 Desktop 和 Runtime 版本。若发行版没有配置更新源,Check for updates 会明确显示不可用;这不是网络故障。按项目的正式发布渠道安装新版本,并在升级前创建备份。
提交问题时附带什么
提供最小且已脱敏的信息:
- Desktop、Runtime、操作系统和 Python 版本;
- run ID 与最终状态;
diagnostics输出;- Timeline 中相关事件类型和错误码;
- 插件 ID/版本、能力 ID和
load_error; - 可复现的最小配置(删除密钥、私有数据和绝对个人路径)。
不要发送 API key、操作系统凭据、evaluator-private 内容或整份敏感数据目录。