mcpField
A
Awaitless

Awaitless

本地服务
github.com开发工具110 周前更新

关于 Awaitless

Awaitless 为编码 Agent 提供持久化执行层,可在本机、SSH 主机或 Slurm 上运行命令。它提供稳定的任务跟踪、具名 FIFO 队列和结果恢复,不需要常驻服务。

主要功能

  1. 01带稳定 ID 的持久化任务
  2. 02具名 FIFO 并发队列
  3. 03本机、SSH 与 Slurm 执行
  4. 04可恢复结果与有限日志
  5. 05CLI 与 MCP 任务控制

适用场景

  1. 01运行长时间构建或测试,无需轮询
  2. 02为具名稀缺资源排队
  3. 03客户端断开后恢复结果
  4. 04收集并行任务的完成结果

MCP 相关

其 stdio MCP 服务允许编码 Agent 提交、运行、等待和收集任务。持久化任务状态与执行不会因服务端或客户端会话结束而中断。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"xpluspro-awaitless": {
"command": "uvx",
"args": [
"awaitless-runner"
]
}
}
}
启动命令uvx awaitless-runner

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiawaitless-runner0.8.0

工具

11

收录的工具列表 · 更新于 2 周前

参数类型必填说明
cwdany否
envany否
hostany否
nameany否
queueany否
backendany否
commandarray是
artifactsany否
resourcesany否
capture_logsany否
slurm_optionsany否
timeout_secondsany否
client_request_idany否
stall_timeout_secondsany否
inline_timeout_secondsany否

详细介绍

Awaitless

CI PyPI Python

为编码 Agent 提供自适应的持久化执行能力。

通过一个执行层运行命令。快速任务以内联方式返回;较长或排队中的任务则会在本地、SSH 和 Slurm 环境中持久运行。你的工作负载始终运行在你已有的基础设施上。

Agent 提交任务,Awaitless 负责执行。

Awaitless 是连接编码 Agent 与其所用计算资源的自适应持久化执行层。它为 Agent 提供统一稳定的任务约定,同时在底层复用你的本地机器、SSH 主机和 Slurm 集群。

简体中文 · 文档 · 基准测试 · PyPI

在现有计算资源上统一管理任务生命周期

Coding agent → submit work → Awaitless owns the job lifecycle → Local / SSH / Slurm
持久化任务命名的稀缺资源队列完成与恢复
稳定 ID、状态、取消操作、有限长度的日志和 Artifacts,都会在客户端断开连接后保留。持久化 FIFO 准入机制可防止过多任务同时使用同一命名资源。可通过 Job ID 或可重放的完成游标获取退出代码和结果。

Awaitless 负责任务生命周期,而非硬件。它不会发现资源、理解 GPU 拓扑、分配多个资源,也不会取代集群调度器。运维人员为队列命名并设置固定并发数;Slurm 继续处理 --gpus 2 --mem 64G 等请求以及所有物理集群调度。

Awaitless SSH 提交、断开连接、恢复和 Artifact 演示

编码 Agent 应该编写代码,而不是看管任务

Agent 可以自行编写 run → sleep → check 循环。更难的问题是,如何在长时间运行的工作负载和不断变化的会话中,可靠地管理任务标识、断开连接后的恢复、队列准入、取消和结果交付。缺少这一执行层时,Agent 会不断将同一份不断增长的日志拉回上下文:

ssh gpu 'run_benchmark > job.log 2>&1 &'
ssh gpu 'tail -n 200 job.log'  # again...
ssh gpu 'tail -n 200 job.log'  # and again...

Awaitless 将整个生命周期整合为一次自适应执行调用和一个结果边界:

awaitless run --json --host gpu --artifact results.json -- ./run_benchmark
# quick: {"state":"succeeded","delivery":"inline","exit_code":0,...}
# longer: {"job_id":"job_019F...","state":"running","delivery":"detached",...}

awaitless wait job_019F... --json
# {"state":"succeeded","exit_code":0,"parsed_results":{...}}

分离运行的 JSON 还包含 job_state、wait_state、delivery_state 和可直接复制的 next_command。客户端等待超时并不意味着工作负载失败:可使用 awaitless wait --last --json 等待最近分离运行的 Job,也可使用返回的命令及其稳定 Job ID。若要查看基准测试行而无需读取大量日志末尾内容,可使用 awaitless logs <job-id> --grep 'PASS|FAIL|median|CV'。

每次 run 都会在启动前持久化。在内联时间窗口内完成时,结果看起来与普通命令执行结果无异;超过时间窗口则只会分离等待操作。中断等待操作、关闭 MCP 客户端,或启动全新的 Agent 会话:Job 仍会继续运行,其稳定 ID 可用于恢复结果。

在命名资源空闲前排队处理工作

创建一次持久化 FIFO 队列,然后立即提交每条命令:

awaitless queue create gpu0 --concurrency 1

awaitless submit --queue gpu0 -- python train_a.py
awaitless submit --queue gpu0 -- python train_b.py
awaitless submit --queue gpu0 -- python train_c.py

第一条命令会运行,其余命令会报告 queued。有可用容量时,每条命令都会自动启动。这是针对命名稀缺资源的持久化准入控制:固定并发数和 FIFO 顺序,不支持优先级或抢占。Awaitless 绝不会终止正在运行的工作来为后续任务腾出空间。

运维人员还可以全局或按主机将自适应运行绑定到队列:

[hosts.gpu]
hostname = "gpu.example.com"
queue = "gpu0"

这样,Agent 就可以调用 run,无需选择队列,也无需事先探测 GPU。

此队列不会发现资源、识别 GPU 拓扑、动态分配设备、发放租约,也不会组合诸如两块 GPU 加 64 GB 内存之类的请求。这些职责应由 Slurm 或其他调度器承担;Awaitless 则围绕该调度器提供面向 Agent 的作业生命周期管理。

消费最先完成的作业

v0.7 新增了 completions ... --drain --json,可在一次调用中消费一小组并行作业,无需客户端维护游标。长时间运行的作业可以通过 wait --progress-interval 30s 发出结构化心跳更新。使用 --capture-log PATH 保存由命令管理的日志,并使用 --resource gpu=0 或 --device 0 进行显式独占准入;终态结果会冻结有大小限制的日志、诊断信息、计时、环境以及以 SHA-256 标识的快照。

提前提交彼此独立的工作,保留每个 Job ID,然后在一个持久化的完成边界等待:

awaitless completions job_A job_B job_C --json
# {"completions":[...],"next_cursor":"cmp_...","active_job_ids":[...]}

awaitless completions job_A job_B job_C --after cmp_... --json

首次调用会立即返回已完成的工作,否则会阻塞,直到至少一个所选 Job 完成。处理完这批结果后,再推进到 next_cursor;重用较旧的游标可以安全地重放相同的完成 ID。如果客户端消失,新会话可以从已保存的游标继续。Awaitless 会持久化后续结果以供获取,但不会执行 Agent 的下一步推理,也不要求常驻通知服务。

v0.8 证据套件用四个问题取代了历史上的调用次数演示:Agent 是否正确选择协议,Job 在故障后能否存续且不会重复启动,Awaitless 是否能让执行管理状态远离推理循环,以及自适应 run 是否能让短命令保持低使用门槛。请参阅 v0.8 证据计划。

v0.8 证据状态

发布证据与模型和提交版本相关。仓库中检入的套件不会沿用早期版本或其他模型的数据。运行 v0.8 基准测试,检查每条原始记录,然后发布注明日期的报告,其中包含模型、配置哈希、Git 提交、跳过的工作负载,以及计入分母的所有失败。经过审核的 v0.8 证据报告包含完整的原始记录和分析摘要,而非仅列出选定的分数。

30 秒体验故障恢复流程

需要 Linux、Python 3.10+ 和 Bash。运行内置演示,无需持久安装:

uvx --from awaitless-runner awaitless demo --json

该演示会提交两个本地作业,终止它们的首个完成等待客户端,然后使用新客户端通过游标获取两个有大小限制的结果和 JSON Artifacts。

常规 CLI 用法:

uv tool install awaitless-runner
awaitless doctor --json

也可以使用 pip install awaitless-runner。

将其交给你的编码 Agent

在客户端的配置中添加一个 stdio MCP 服务(根据你的客户端调整外层键):

{
  "mcpServers": {
    "awaitless": {
      "command": "uvx",
      "args": ["awaitless-runner"]
    }
  }
}

首选的 run 工具会直接返回快速命令的结果,并自动为较长时间运行或排队的工作提供持久句柄。支持 Tasks 的客户端仍可使用 run_job,而低级客户端仍可使用 submit_job 和 wait_for_job。使用相同的 client_request_id 重试高成本提交,不会启动重复作业。对于并行工作,无论是否支持 MCP Tasks,所有客户端都可以使用 wait_for_completions。 规范性的身份、生命周期、续接、完成、Artifact 和兼容性契约见 Awaitless Agent Job Protocol。

Codex 插件

此仓库也是一个 Codex 插件。其清单将 Awaitless Agent 技能与 stdio MCP 服务打包在一起,Codex 会通过 uvx 启动该服务。从本地 Codex 市场安装此仓库,然后启动新的 Codex 任务,以便同时加载技能和 MCP 工具。

此插件要求 PATH 中有 uvx;首次启动 MCP 时,如果缓存中尚无 awaitless-runner,则会从 PyPI 下载。

直接使用 CLI 时,完整流程如下:

awaitless run --json --name tests -- python -m pytest -q
# If delivery is detached, save the returned job_id, then:
awaitless wait <job-id> --json
# Or recover the most recent detached job:
awaitless wait --last --json

一个接口,三种运行位置

后端Awaitless 提供的功能
本地持久化进程组跟踪、取消、限制日志大小,以及具名事务队列。
SSH相同的作业契约,以及在目标主机上协调的队列,无需远程守护进程。
Slurm真正的 sbatch 调度,以及持久化的 Slurm ID、队列/记账状态、退出码、日志、取消和 Artifacts。

使用 --backend、--host 或配置默认值即可切换目标,无需更改 Agent 提交和收集工作的方式。

为什么不直接使用 shell 或 tmux?

工具最适合的场景Agent 仍需构建的内容
阻塞式 shell 调用快速检查和交互式工作工程命令运行时间超出预期后的生命周期管理。
Shell 轮询/nohup让基本命令持续运行ID、状态、退出码恢复、限制日志大小、取消、去重和结果解析。
tmux人类从交互式 shell、REPL 和 TUI 中脱离可靠的非交互式作业协议和包装脚本。
AwaitlessAgent 运行的构建、测试、基准测试、远程作业和集群工作只需提供命令,以及可选的要返回的 JSON Artifact。

Awaitless 不会取代交互式终端或 Slurm。它为编码 Agent 提供本地/SSH 机器上的持久化固定并发队列,并将集群资源调度交由 Slurm 处理。

工作原理

flowchart LR
    A["Coding agent"] -->|"run"| B["Awaitless MCP / CLI"]
    B --> C[("SQLite job record")]
    C --> Q["Optional queue admission"]
    Q -->|"capacity available"| D{"Backend"}
    D --> L["Local process"]
    D --> S["SSH host"]
    D --> H["Slurm allocation"]
    L --> I{"Finished inline?"}
    S --> I
    H --> I
    I -->|"yes: result"| A
    I -->|"no: durable handle"| A
    A -. "reconnect with stable ID" .-> C
    C --> E["Durable completion cursor"]
    E -->|"state + exit code + bounded logs + Artifacts"| A

Awaitless 没有守护进程、HTTP 服务或托管沙盒。每次调用都会打开同一个 SQLite 存储;已提交的运行器和调度器作业会在创建它们的 stdio 服务退出后继续运行。完整日志会保留在磁盘上,只有有限长度的尾部日志会进入 Agent 上下文。

文档

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。