界面持续等待 → 先核对任务事件和进程,再决定继续等;没有新的重试开始证据或等待边界不可控 → 保存现场并停止,不要反复刷新页面。

这套方法适合本地用户、远程 Agent 运维人员和平台工程师:你可以判断等待到底发生在 LLM retry、网络连接、模型配置,还是工具与审批环节。

先用一个失败现场确认:页面运行,不等于任务在运行

一个常见现场是:DeepSeek Harness 页面一直显示“运行中”,没有明显报错,也看不到新的结果。用户等了很久后刷新页面,页面仍然显示等待,于是继续等。

这一步最容易误判。加载动画只能证明界面还在展示某种状态,不能证明模型请求已经发出,更不能证明后台任务仍在推进。你需要把观察对象从页面切换到证据链:

  • 任务状态是否发生过变化;
  • 会话事件是否持续产生;
  • 是否出现新的模型请求或工具调用;
  • 运行进程是否仍存在;
  • 工作目录中的输出、检查点或日志时间是否变化。

DeepSeek API 在等待调度时可能持续返回空行,流式请求也可能收到 SSE 保活注释,因此“连接没有立即断开”不等于模型已经返回内容。官方文档还说明,如果请求在 10 分钟内没有开始推理,服务器可能关闭连接。(api-docs.deepseek.com)

⚠️ 注意: 不要把浏览器刷新当成恢复手段。刷新最多改变你看到的界面,不会修复凭据、网络出口、工具进程或工作目录问题。

如果任务事件停在“等待工具结果”或“等待审批”,就不要继续沿着模型重试路径排查。此时真正的阻塞点可能在 Bash、Hook、人工确认或外部工具。

第一步:等待界面没有新证据时,先查三组状态

观察信号

你看到的现象通常包括:

  • 页面状态长时间不变;
  • 没有新的请求开始记录;
  • 没有新的 assistant、tool 或结果事件;
  • CPU、网络和工作目录都没有明显变化;
  • 终端仍保持连接,但任务没有输出。

其中,最有价值的不是“页面还亮着”,而是最后一条可确认事件。例如,最后一条记录是“模型响应完成”,后面没有工具完成事件,那么问题更可能在工具执行,而不是 LLM retry。

核验动作

按以下顺序检查:

  1. 导出或复制当前任务的会话标识;
  2. 查看持久化事件中最后一条记录的类型和时间;
  3. 对照是否有新的请求创建、请求结束或重试开始证据;
  4. 检查任务进程是否仍存在;
  5. 查看工作目录中日志、临时文件和检查点是否有更新;
  6. 确认当前远程连接只是断开,还是主机已经重启或身份改变。

停止条件

满足任意一项,就不要无限等待:

  • 只有“重试已安排”,没有对应的“重试开始”;
  • 连续观察期间没有新的会话事件;
  • 等待时间已经无法由当前任务的超时策略解释;
  • 进程消失,或者工作目录已经不可访问;
  • 同一确定性错误反复出现。

恢复标准

只有同时满足以下条件,才适合继续观察:

  • 任务状态仍可读取;
  • 进程仍存在;
  • 会话事件继续推进;
  • 工作目录和环境身份未变化;
  • 下一次请求或工具调用有明确开始证据。

第二步:重试已安排但请求没有开始,保存现场再判断

“重试已安排”只表示调度器记录了下一步意图,不表示下一次 HTTP 请求已经发出。你至少要寻找一组成对证据:

需要核对的证据 能说明什么 缺失时的风险
重试安排记录 系统决定进入重试流程 可能只是写入计划,尚未执行
重试开始记录 新请求实际进入执行阶段 没有它就不能证明正在重试
请求结束记录 请求得到响应或明确失败 网络中断时可能只有开始没有结束
进程状态 本地或远程工作进程仍在运行 连接断开不代表进程一定停止
工作目录变化 任务可能仍在写入结果 无变化也不能单独证明任务已死

远程连接断开有两种完全不同的含义:网络会话断了,但远程进程仍在;或者主机休眠、重启、容器退出,任务已经不存在。仅凭 SSH、终端或网页连接断开,不能证明任务仍在运行,也不能证明任务已经停止。

在停止前,至少保存以下现场:

  • 当前版本和启动参数;
  • 会话标识、任务标识和工作目录;
  • 最近一条事件及其时间;
  • 已出现的错误状态和错误文本;
  • 当前模型、Provider、Base URL 配置摘要;
  • 进程列表、主机重启记录和网络出口信息。

如果现场可读但没有推进证据,优先选择“取消并保存现场”。不要先删除会话、清空目录或重新安装 Harness,否则你可能丢失判断重试链路的关键证据。

第三步:同类错误反复出现,停止增加重试次数

观察信号

每次请求都返回同类模型错误,通常表现为:

  • 错误状态码和错误文本高度一致;
  • 请求一开始就失败;
  • 没有成功的最小请求作为对照;
  • 重试间隔变化,但错误内容没有变化;
  • 修改提示词后仍然立即失败。

这类故障更像模型链路配置问题,而不是需要更多等待时间。官方错误说明中,400 对应请求格式问题,401 对应 API Key 认证失败,402 对应余额不足,422 对应参数无效,429 对应请求过快,500503 分别对应服务器错误与过载。(api-docs.deepseek.com)

核验动作

依次核对:

  1. 当前模型名称是否仍在官方模型目录中;
  2. API Key 是否来自当前账户,是否被截断、过期或读错环境变量;
  3. Base URL 是否与当前 Provider 配置匹配;
  4. 请求是否带入了当前模型支持的参数;
  5. 是否误把旧模型名、旧路径或旧参数继续写入配置;
  6. 是否因为 thinking 模式的上下文字段缺失而触发确定性错误。

DeepSeek 官方文档指出,在带工具调用的 thinking 模式中,后续请求需要正确传回 reasoning_content;缺失时可能返回 400。这类错误不是靠增加 LLM retry 次数解决的。(api-docs.deepseek.com)

停止条件

出现以下情况时,应立即停止自动重试:

  • 连续得到相同的确定性状态码;
  • API Key、Base URL 或模型名尚未核对;
  • 当前配置使用了未经确认的 Provider;
  • 请求体结构与官方接口文档不一致;
  • 错误证据不完整,无法判断是请求失败还是解析失败。

恢复标准

修复后不要直接恢复原来的长任务。先发起一个最小文本请求,只验证:

  • 凭据能否通过;
  • Base URL 是否可达;
  • 模型是否接受当前请求;
  • Harness 是否能记录完整的开始、响应和结束事件。

DeepSeek 的 Chat Completions 文档列出了模型、消息、工具调用、流式响应和结束原因等字段。最小请求应尽量删除工具、长上下文和复杂输出格式,只保留必要消息。(api-docs.deepseek.com)

第四步:模型已经成功,卡住点转到工具执行

模型响应成功后,Agent 任务仍然可能没有完成。因为模型只负责返回文本或工具调用,实际函数、Shell 命令和外部服务仍由你的 Harness 执行。官方工具调用流程也是“模型返回工具调用 → 客户端执行工具 → 把工具结果送回模型”,模型本身不会替你执行函数。(api-docs.deepseek.com)

观察信号

重点看最后一条事件:

  • 有 assistant 响应,且包含 tool call;
  • 没有对应的 tool started 或 tool finished;
  • 有工具开始事件,但没有工具结束事件;
  • 工具输出为空,进程却持续存在;
  • 任务停在审批、Hook 或 Bash 阶段。

核验动作

从最小权限开始检查:

  1. 确认工具进程是否存在;
  2. 单独执行同一个工具的最小参数;
  3. 检查 Bash 是否等待标准输入;
  4. 检查审批队列是否有未处理项目;
  5. 检查 Hook 是否等待文件、端口或外部服务;
  6. 检查工具返回值是否被 Harness 正确写入会话;
  7. 检查工作目录是否仍是任务启动时的目录。

不要为了试错直接放开全部权限。这样可能掩盖路径错误、命令阻塞和审批缺失,还会扩大远程任务的安全边界。

停止条件与恢复标准

工具没有开始事件时,先查路由和审批;工具有开始但没有结束时,先停止该工具进程;工具完成但模型没有继续请求时,查工具结果序列化和会话写入。

恢复标准不是“页面重新显示运行中”,而是最小工具调用能完成、返回结果,并生成下一条可核验的会话事件。

第五步:远程进程和网络波动,分开处理瞬时故障

网络波动通常不会留下与配置错误相同的证据。你需要区分:

可恢复的瞬时问题: 请求曾成功开始,偶发连接重置,远程进程仍在,工作目录持续更新。

持续复现的环境问题: 每次请求都在同一出口失败,主机反复重启,休眠后进程消失,路径或权限发生变化。

检查项目包括:

  • 运行进程和父子进程关系;
  • 网络出口、DNS 和 TLS 连接;
  • 系统是否休眠、重启或被回收;
  • 工作目录、挂载盘和临时目录;
  • API Key 是否只存在于交互式 Shell;
  • 远程会话断开后,后台任务是否仍由独立进程托管。

如果环境身份已经变化,例如主机重建、工作目录迁移、密钥重新注入或进程树消失,就不要强行续跑旧任务。先创建一个新验证任务,确认模型、工具和目录都能工作,再决定是否从检查点恢复。

你也可以先参考 MACCOME 的云端 Mac 算力方案 了解远程环境交付边界;如果任务依赖固定工作目录和持续运行进程,环境验收应先于模型重试参数调整。

FAQ:把最容易误判的 4 个问题一次分清

DeepSeek Harness 一直等待,是不是正在重试?

不一定。你必须同时看到重试安排和重试开始的证据,才能确认进入 LLM retry。只有页面状态、空行或连接保活,都不足以证明请求正在重试。若最后事件停在工具或审批阶段,应改查工具管线。

自动重试的次数应该到哪里查?

不要使用没有版本依据的固定次数。当前公开边界不足以支持统一数字,具体行为可能受错误类型、Provider 和版本影响。运维上应记录每次安排、开始和结束事件,并为不可控等待设置人工停止边界。

反复重试时,应该继续等还是取消?

有新事件、进程仍在、环境未变且错误可能是瞬时上游问题时,可以继续观察。没有新的重试开始证据,或同一配置错误重复出现时,应取消并保存现场。反复刷新 Web UI 不会改变这个判断。

远程任务重试后,如何恢复现场?

先核验进程、工作目录、会话持久化和环境身份。身份未变时,从最后一个完整检查点恢复;身份已变时,创建新验证任务,不要直接续跑旧任务。恢复必须以最小模型请求和最小工具调用成功为准。

用这张清单决定:继续等待、取消重跑,还是迁移环境

  • [ ] 已保存版本、会话标识、任务标识和工作目录。
  • [ ] 已确认最后一条事件,而不是只查看页面加载状态。
  • [ ] 已找到“重试安排”和“重试开始”的成对证据。
  • [ ] 已确认远程进程仍存在,且工作目录仍在更新。
  • [ ] 已核对模型路由、API Key、Base URL 和 Provider。
  • [ ] 已保存官方返回的状态码与错误文本。
  • [ ] 已用最小文本请求验证 DeepSeek API 链路。
  • [ ] 已将工具、审批、Hook 和 Bash 与模型请求分开检查。
  • [ ] 已完成最小工具调用,并拿到可读返回值。
  • [ ] 已确认远程主机没有重启、休眠或身份变化。
  • [ ] 若环境身份改变,已创建新的验证任务。
  • [ ] 已定义取消、重跑和迁移的责任人与时间边界。

结尾前的方案对比:不要把环境故障伪装成模型故障

当前处理方式 适合情况 真实缺点 更稳妥的做法
本地 Mac 长时间运行 任务短、需要本地文件和物理接口 睡眠、断网、终端关闭会影响后台任务 使用独立进程并保存检查点
临时远程主机 短期验证和一次性测试 重启后身份、目录、密钥可能变化 先做环境验收,再提交长任务
只增加重试次数 明确的瞬时上游故障 会放大成本,掩盖确定性配置错误 先区分 429、5xx、凭据和参数问题
刷新 Web UI 只想重新查看状态 不会恢复进程、工具或网络 读取持久化事件和进程状态

对于只在断线、休眠或长时间无人值守时复现的问题,当前本地方案往往有 3 类真实短板:后台进程容易随会话退出、网络与睡眠状态不可控、故障现场不一定能保留。临时远程主机则可能出现身份变化、工作目录丢失和凭据未注入。此时,把问题简单归因于 DeepSeek Harness 的重试逻辑,通常会让排障方向越走越偏。

如果你的任务需要临时算力、远程验证或连续运行的后台任务,可以对照 MACCOME 的 Mac mini 云算力租赁方案评估固定环境、远程连接和恢复条件。它不一定适合长期稳定重负载或必须直接接入物理设备的场景,但比在不稳定的本地会话中无限等待,更适合做可控的 DeepSeek Harness 验证与迁移。

最终分流:按证据落到一个动作

证据组合 结论 下一步
有新事件、有进程、环境未变 任务仍可能推进 继续观察,并记录下一条事件
只有重试安排,没有重试开始 调度或进程可能中断 保存现场,达到边界后取消
同一 400、401、402、422 类错误重复出现 更像确定性配置问题 停止重试,修复配置后做最小请求
出现 429、500、503 或连接波动 可能是上游或网络问题 核对状态、出口和并发,再有限度重跑
模型成功但工具无结束事件 工具管线阻塞 停工具、查审批与 Hook,不要改模型重试
远程环境身份已改变 旧任务恢复条件不成立 创建新验证任务,再从可验证检查点迁移

排障的终点不是让页面重新出现“运行中”,而是拿到一条完整证据链:请求是否开始、模型是否响应、工具是否执行、结果是否写回、远程环境是否保持一致。只要其中一环没有证据,就不要用“再等一会儿”代替判断。