OCTOS × ARC-BENCH / HANDS-ON

用 Octos 完成一次
ARC-Bench 提交,再改进它

从安装、敲命令到网站点击,每一步都有操作和验收点。第一部分用官方内核跑通一题;第二部分从 ARC 适配版仓库 octos-org/octos-arc 出发,改、测、交、看榜。

课堂基线:macOS Apple Silicon · 官方 Octos v2.0.2 或魔改 Release v2.0.3-rc.11-arc.11 · 仓库 octos-org/octos-arc(main)· 更新于 2026-09-13

第一次来:从安装开始 →已有产物:看打包与上传已跑通:看怎么改进并刷榜
先认识三个东西

Octos 写代码,适配包接题,ARC 验收

Octos 是用 Rust 编写的、可嵌入的 AI Agent harness 内核。它提供执行循环、上下文管理、记忆、工具、技能、工作流与 Agent 协调。

你可以把内核编译进应用,或通过 OUP(Octos UI Protocol)托管运行时,由原生应用、终端、浏览器或另一个 Agent 控制。应用负责界面和产品流程,Octos 负责 Agent 执行与运行状态。

本课用 CLI 演示,再用适配层通过 stdio 控制内核;不需要先部署 Web UI,也不是把本机 Octos 服务暴露到公网。云端平台会另起一份运行时。

Octos 项目与 README ↗ · ARC 适配版仓库 octos-arc ↗

OVERVIEW

全景:这套东西一共有几块,各自在哪

先看清楚全貌,再一步步敲。整个参赛流程只涉及三方、一个仓库、五条命令。

角色是什么在哪你会动它吗
Octos 内核Rust 写的 Agent 运行时:模型调用循环、工具执行、沙箱、上下文管理仓库 crates/;官方二进制 v2.0.2 从 GitHub Release 下载路径二才动
ARC 适配包Python 程序,平台启动它;它读需求、驱动 Octos、整理产物、上报进度仓库 arc/:main.py、octos_stdio.py、arcbench_agent_runtime/路径一动它
公开验收测试每道题的 Playwright 测试脚本,平台评分用的就是这些任务页 tests 标签;容器内 /workspace/tests;仓库 arc/public-tests/只读,不改
本机工具做题、评分、打包三个脚本arc/run-task-local.py、arc/grade-local.py、arc/pack.sh直接用
ARC-Bench 平台出题、跑你的适配包、用验收测试打分、排榜https://arc-bench.com网页或接口操作

一次提交的完整流转

  1. 你上传 zip(适配包,根目录是 main.py)到某场比赛,保存为一个提交快照。
  2. 你对某道题点 Run。平台起一个 Linux 容器,把需求目录、验收测试挂进去,执行 python3 main.py <需求目录> --output-dir /workspace/template。
  3. main.py 下载 Octos 二进制(地址是 OCTOS_RELEASE_URL),以 octos serve --stdio --solo 启动,分三轮发提示词:骨架、逐个需求节点、终检。每轮内核循环「请求模型 → 执行工具 → 回填」。
  4. 适配包做收尾:检查 frontend/ 和 backend/ 是否存在,做一次构建与启动演练,提交 git,写 .arc/ 下的进度文件。
  5. 平台评测:npm install、npm run build、以 PORT=3000 启动 backend、跑 Playwright 测试,得到通过数;有效结果进入榜单。

榜单怎么算

赛道题量上榜条件排名看什么
Smoke(计数器、骰子)2 题各 1 条测试两题都跑完才计入通过率,再比费用
Ticket Booking(订票)1 题 10 条测试跑完就计入通过率 ≥ 80% 才比成本效率
ARC-Bench Web(6 个大系统)6 题 484 条测试6 题都跑完目前榜上没人

费用按平台记录的 Token 计:每次向模型发请求都按完整输入计费,所以迭代次数和上下文长度直接决定费用。

仓库目录

octos-arc/
├── crates/                    Octos 内核源码(路径二改这里)
├── arc-runtime-lock.json      固定的上游提交与发布约束
└── arc/
    ├── main.py                平台入口:读需求、驱动 Octos、收尾检查、上报进度
    ├── octos_stdio.py         通过 octos serve --stdio 驱动内核
    ├── arcbench_agent_runtime/ 平台协议库:事件、git、需求关联
    ├── requirements.txt       Python 依赖
    ├── public-tests/<题目>/   平台公开的 Playwright 验收测试
    ├── tasks/<题目>/          题目需求的离线副本(requirements.yaml)
    ├── run-task-local.py      本机做题
    ├── grade-local.py         本机评分(首次自动装 Playwright)
    └── pack.sh                打成提交 zip

五条命令走完全程

git clone --depth 1 https://github.com/octos-org/octos-arc.git && cd octos-arc
pip3 install -r arc/requirements.txt && export ARCBENCH_API_KEY=ak_你的key OCTOS_BIN=/path/to/octos
python3 arc/run-task-local.py arc/tasks/smoke--counter --name try1
python3 arc/grade-local.py arc/arc-output/try1 smoke--counter
sh arc/pack.sh        # 然后到 arc-bench.com 上传 zip、选题、Run

下面的第 1 到 8 步是这五条命令的展开,含每一步应该看到什么。

WHY OCTOS

为什么在 ARC-Bench 上用 Octos

在这场比赛的约束下,Octos 是能直接运行、运行即有名次、并且可以继续深入修改的选择。

说明
1. 满足平台约束ARC-Bench 只提供一个 OpenAI 兼容代理和指定模型(deepseek-v4-flash),不支持流式,agent 以 Python 包形式在无特权 Linux 容器内运行。Octos 模型无关、单文件二进制、可关闭流式,无需改代码即可在这个环境中运行。绑定单一模型厂商的编码 agent 无法接入平台的模型通道。
2. 平台契约已经封装交付目录结构、PORT 约定、进度事件文件、git 提交、模板完整性检查,以及容器内沙箱、npm 源、验收测试默认端口这些环境差异,都已在 arc/ 适配包中处理。使用者不需要重新摸索平台的运行契约。
3. 一小时内从零到上榜五条命令:克隆、安装依赖、本机做题、本机评分、打包上传。本机评分使用平台原版 Playwright 测试,上传前即可知道通过数。2026-09-12 按此流程取得:Ticket Booking 榜第 1(82 队),Smoke 榜第 20(33 队)。
4. 提示词之外的提分点在内核,内核可改会话加载哪些工具、上下文如何截断、空回合如何重试、实现后是否自动执行验收测试,这些决定通过率和费用的因素都在内核里。Octos 是开源 Rust 代码:修改、编译、发布 Release、更新下载地址,平台即运行你的版本。
5. 修改效果可以度量Octos 的 stdio 协议输出每次工具调用、每轮输入输出 Token 和累计费用。改前改后是两组数据,不是主观判断。榜单按费用排序,没有这些数据无法判断自己所在的档位。

如果你已经有成熟的 agent 循环,并愿意自行实现上面第 2 条的全部契约,可以不用 Octos。对课程学员和大多数参赛者,octos-arc 是最短路径。

STEP 01

安装 Octos 与本地工具

先把程序装上,再谈适配和上传。主线适用于 macOS Apple Silicon + zsh。

准备一个 ARC-Bench 账号及有余额的模型 API Key。模型 Key 与网站登录密码不是同一个东西。下面固定使用课堂已演示的官方 v2.0.2,不是承诺它永远是 latest。

在终端 A 执行。尚未安装 Homebrew?先按 Homebrew 官网安装,再回来。Intel Mac、Linux、Windows/WSL 用户应从 Release 页面选对应平台的包,不要照抄 arm64 包或 Homebrew 路径。

brew install node@24 python git
export PATH="$(brew --prefix node@24)/bin:$PATH"
node --version
npm --version
python3 --version
mkdir -p ~/octos-arc-workshop
cd ~/octos-arc-workshop
curl --fail --location --retry 3   https://github.com/octos-org/octos/releases/download/v2.0.2/octos-bundle-aarch64-apple-darwin.tar.gz   -o octos-v2.0.2-macos-arm64.tar.gz
echo '16faee4972e5e6b21d65e0aa46de7a54417bd3703dbed1c5e35cfa2a1da7425f  octos-v2.0.2-macos-arm64.tar.gz' | shasum -a 256 -c -

只有出现 OK 才继续解压。这是本次课堂下载包的校验记录。校验失败应重新下载或核对官方文件,不要跳过。

cd ~/octos-arc-workshop
mkdir -p runtime-v2.0.2
tar -xzf octos-v2.0.2-macos-arm64.tar.gz -C runtime-v2.0.2
./runtime-v2.0.2/octos --version

保留压缩包里的配套程序,不要只搬走 octos 一个文件。这里始终使用明确路径,避免意外运行 Homebrew 里另一版 Octos。

到这里应当看到

Node、npm、Python 均能显示版本;Octos 显示 2.0.2。安装步骤不会调用模型。

STEP 02

配置一次,重开终端也能找回来

把课堂配置和密钥留在自己的工作目录,不覆盖你原来的 Octos 配置。

cd ~/octos-arc-workshop
mkdir -p demo-config
test -e workshop.env || (umask 077; cat > workshop.env <<'ENV'
export WORKSHOP="$HOME/octos-arc-workshop"
export OCTOS_HOME="$WORKSHOP/demo-config"
export OCTOS_CONFIG_DIR="$WORKSHOP/demo-config"
export OCTOS_BIN="$WORKSHOP/runtime-v2.0.2/octos"
export ARCBENCH_API_KEY='把这里替换为你自己的模型 API Key'
export OPENAI_BASE_URL='https://api.arc-bench.com/v1'
export MODEL='deepseek-v4-flash'
export PATH="/opt/homebrew/opt/node@24/bin:$PATH"
ENV
)
chmod 600 workshop.env
open -e workshop.env

TextEdit 打开后,只替换 Key 的占位文字,保留英文单引号,按 ⌘S 保存。不要把这个文件上传到 GitHub 或打进 ZIP;屏幕共享时暂停展示密钥。文件不会因重跑上面的命令被覆盖。

source ~/octos-arc-workshop/workshop.env
"$OCTOS_BIN" init   --custom-base-url "$OPENAI_BASE_URL"   --custom-model "$MODEL"   --custom-api-type openai   --custom-api-key-env ARCBENCH_API_KEY
"$OCTOS_BIN" chat --config "$OCTOS_HOME/config.json"   --message '只回复:连接成功。不要调用任何工具。'   --sandbox read-only --max-iterations 1 --no-retry
到这里应当看到

模型返回“连接成功”。日志里配置路径应位于 octos-arc-workshop/demo-config;这只证明模型连通,不代表编程或评测成功。

STEP 03

让 Octos 真正写一个网页

先亲眼看到它写文件、构建、运行。这个练习不是要上传的 bundle。

source ~/octos-arc-workshop/workshop.env
mkdir -p "$WORKSHOP/counter"
cd "$WORKSHOP/counter"
"$OCTOS_BIN" chat --config "$OCTOS_HOME/config.json"   --cwd "$PWD" --sandbox workspace-write --max-iterations 20   --message '请直接创建可运行的 Counter 网页,不要只给代码示例。初始计数为 0;Increment 加 1,Decrement 减 1,允许负数;计数元素带 data-testid="count"。使用原生 HTML/CSS/JavaScript 与 Vite,提供 npm run dev 和 npm run build。创建文件并尝试安装依赖、执行构建;如安装网络不可达,请停止并报告,不要拆 npm 缓存或手工拼 node_modules。不要启动长期运行的服务器。'

这一步会调用模型并修改 counter 目录。若沙箱内安装失败,先确认 Octos 已返回终端,再在终端 A 正常安装构建;不要一边运行 agent 一边改它正在写的文件。

source ~/octos-arc-workshop/workshop.env
cd "$WORKSHOP/counter"
npm install
npm run build
npm run dev -- --host 127.0.0.1 --port 5173 --strictPort

打开 http://127.0.0.1:5173。先看 0,点两次 Increment 得到 2,再点三次 Decrement 得到 -1。演示结束在终端 A 按 Ctrl+C 停止服务,再继续。

到这里应当看到

目录里有真实项目文件,npm run build 通过,浏览器行为为 0 → 2 → -1。

STEP 04

从 GitHub 克隆 ARC 适配版仓库

一个仓库包含内核源码(crates/)和参赛外围(arc/)。本教程只用 arc/ 目录。

source ~/octos-arc-workshop/workshop.env
cd "$WORKSHOP"
git clone --depth 1 https://github.com/octos-org/octos-arc.git
cd octos-arc/arc
python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
./.venv/bin/python -c 'import yaml; from arcbench_agent_runtime import AgentRuntime; print("适配层依赖已就绪")'
./.venv/bin/python -c 'from main import find_octos; import subprocess; binary = find_octos(); print("运行时:", binary, flush=True); subprocess.run([binary, "--version"], check=True)'

仓库 main 分支固定在上游 Octos 提交 8558a3bf。arc/ 目录下除适配包外还有:public-tests/(平台公开的 Playwright 验收测试)、tasks/(题目需求副本)、run-task-local.py(本机做题)、grade-local.py(本机评分)、pack.sh(打包)。

文件负责什么
main.py读需求、安排生成、检查交付目录
octos_stdio.py通过 stdio / OUP 驱动 Octos 运行时
arcbench_agent_runtime/事件、需求关联、运行记录等协议辅助代码
requirements.txtPython 适配层依赖

上传的是这些适配代码;实际写项目的是被它启动的 Octos。适配包不是完整内核源码,也不是刚才做好的网页。

到这里应当看到

Python 依赖检查通过,选中的运行时路径指向 runtime-v2.0.2/octos,版本为 2.0.2。

STEP 05

拿 ARC 原题,不另编一道题

从平台下载 Counter 的需求,并在网页上读它的验收测试。

source ~/octos-arc-workshop/workshop.env
cd "$WORKSHOP/octos-arc/arc"
mkdir -p ../arc-counter-task
curl --fail --silent --show-error --location   'https://arc-bench.com/api/requirements/smoke--counter?catalog=competition'   -o ../arc-counter-task/task.json
./.venv/bin/python - <<'PY'
import json
from pathlib import Path
folder = Path('../arc-counter-task')
task = json.loads((folder / 'task.json').read_text())
(folder / 'requirements.yaml').write_text(task['requirements_yaml'], encoding='utf-8')
print('题目:', task['title'])
print('需求文件:', (folder / 'requirements.yaml').resolve())
PY
  1. 打开 ARC-Bench 并登录。
  2. 点击顶部 Competition,进入 Smoke Competition。
  3. 点击 ARC Counter Smoke Test,先看 README.md,再看 tests。
  4. 把测试要求与 requirements.yaml 对照,解释“自然语言需求 → 结构化需求与场景 → 代码 → 自动验收”。下载接口给的是已编译需求,不是我们在本地另实现了需求编译器。
历史实拍:Counter 任务的 tests 标签与右侧运行栏
历史真实截图:①左上 tests 查看验收;②右侧选择运行。点击图片查看原图。截图中的提交名与运行状态不代表本次成绩。
到这里应当看到

下载结果标题是 ARC Counter Smoke Test,能在任务页找到对应测试。题目与测试以后可能变化,以当次下载和任务页为准。

STEP 06

让适配包在本地跑完整任务

这里直接调用仓库的 main.py,不再使用讲师私有的 run-arc-local.py。

source ~/octos-arc-workshop/workshop.env
cd "$WORKSHOP/octos-arc/arc"
export OPENAI_API_KEY="$ARCBENCH_API_KEY"
export OCTOS_PROVIDER=custom
export OCTOS_MODEL="$MODEL"
export OCTOS_MAX_ITERATIONS=40
export OCTOS_NODE_TIMEOUT=600
export OCTOS_TIME_BUDGET=900
export OCTOS_SMOKE_PORT=43101
unset ARCBENCH_TEMPLATE_DIR ARCBENCH_TASK_DIR OCTOS_INSTANCE_DATA_DIR OCTOS_DANGER_FULL_ACCESS
unset OCTOS_HOME OCTOS_CONFIG_DIR
./.venv/bin/python - <<'PY'
import os
import socket
import subprocess
import uuid
from pathlib import Path
root = Path(os.environ['WORKSHOP'])
(root / 'last-output.txt').unlink(missing_ok=True)
for port in (43100, 43101):
    with socket.socket() as listener:
        listener.bind(('127.0.0.1', port))
output = root / 'arc-output' / ('counter-' + uuid.uuid4().hex[:8])
print('交付目录:', output, flush=True)
result = subprocess.run([
    str(root / 'arc-adapter/.venv/bin/python'), 'main.py',
    str(root / 'arc-counter-task'), '--output-dir', str(output),
    '--type', 'web', '--web-port', '43100'
])
if result.returncode == 0 and (output / 'frontend/package.json').is_file() and (output / 'backend/package.json').is_file():
    (root / 'last-output.txt').write_text(str(output), encoding='utf-8')
else:
    raise SystemExit('未记录交付目录:请查看日志,不要进入下一步。')
PY

预检报端口占用就停下,先检查自己的服务。不要盲目杀进程。日志中看到重复的同一行,可能是 stdout/stderr 重复展示,不表示一定跑了两次。

启动生成的交付物

source ~/octos-arc-workshop/workshop.env
OUTPUT="$(cat "$WORKSHOP/last-output.txt")"
cd "$OUTPUT/frontend"
npm install
npm run build
cd "$OUTPUT/backend"
npm install
PORT=43100 npm run start

打开 http://127.0.0.1:43100,再次验收 0 → 2 → -1。此时启动的是 arc-output 里的项目,不是第 3 步 counter 目录的 Vite 网页。完成后 Ctrl+C 停止。

到这里应当看到

frontend/ 与 backend/ 存在,构建和启动通过,手动行为验收通过。退出码 0 或 rehearsal 通过仍不等于平台测试通过。

STEP 07

写清 bundle 内容,再打包

交的是能现场做题的 agent 适配包,不是答案项目或你的本地配置。

先把默认云端下载地址从 latest 改成 v2.0.2。这个修改只固定下载回退地址:若云端设置 OCTOS_BIN 或命中已有运行时/缓存,仍需以云端日志里的版本为准,不能声称所有运行时来源都已锁定。

source ~/octos-arc-workshop/workshop.env
cd "$WORKSHOP/octos-arc/arc"
./.venv/bin/python - <<'PY'
from pathlib import Path
path = Path('main.py')
source = path.read_text()
old = 'https://github.com/octos-org/octos/releases/latest/download/'
new = 'https://github.com/octos-org/octos/releases/download/v2.0.2/'
if old not in source and new not in source:
    raise SystemExit('下载逻辑已改变,请读源码后再改。')
path.write_text(source.replace(old, new))
PY
git diff -- main.py
./.venv/bin/python - <<'PY'
from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED
root = Path.cwd()
bundle = root.parent / 'octos-official-v2.0.2-bundle.zip'
files = [root / name for name in ('main.py', 'octos_stdio.py', 'requirements.txt')]
files += sorted(path for path in (root / 'arcbench_agent_runtime').rglob('*.py') if '__pycache__' not in path.parts)
with ZipFile(bundle, 'w', compression=ZIP_DEFLATED) as archive:
    for path in files:
        archive.write(path, path.relative_to(root))
with ZipFile(bundle) as archive:
    assert archive.testzip() is None
    print('
'.join(archive.namelist()))
print('提交包:', bundle)
PY

这里按白名单重新创建 ZIP,避免重复 zip -r 时留下旧文件。根目录必须直接看到 main.py,不能外面多套一层 arc/。

应该包含不要包含
main.py、octos_stdio.py、requirements.txt、协议库 Python 源码workshop.env、demo-config、账号密码、.venv、node_modules、counter、arc-output、macOS 二进制
我想自己写 bundle:入口契约是什么?

从克隆的 main.py 改起,不要重造全部协议。它接受需求目录,以及 --output-dir、--type web、--web-port;使用模型环境变量驱动 Octos,最后把 frontend/ 和 backend/ 写到指定交付目录。前端需要 build 脚本,后端需要 start 脚本并读取 PORT。上传语言选 Python,描述的是适配层,不是说 Octos 内核是 Python。

只改需求提示、拆分策略或工具配置时,保留需求关联与运行事件。不要访问隐藏测试或写死测试答案。固定魔改内核属于后续路线,需要 Linux 构建、版本与校验值、实际云端运行证据;不混入本课官方版。

到这里应当看到

ZIP 根目录包含入口与依赖库,未包含密钥;清楚适配层、运行时、生成项目三者的区别。

STEP 08

网页上传、启动评测、解释结果

保存快照只是登记。真正运行要进入具体任务,再点击 Run。

  1. 登录 → Competition → Smoke Competition。先确认赛道,不要选成 Ticket Booking。
  2. New submission → Save an agent snapshot。把第 7 步 ZIP 拖入 Drop your agent code here,等待上传完成。
  3. 语言选 Python。提交名用“Octos 官方 v2.0.2 · 我的名字”。
  4. 填写模型通道。Base URL 为 https://api.arc-bench.com/v1,Model 为 deepseek-v4-flash,API Key 用你自己的模型密钥。此为本次实操配置,不保证平台永久提供该模型。
  5. 点击 Save submission。确认 History 中出现新快照;到这一步还没有新分数。
  6. 进入 ARC Counter Smoke Test。右侧 Latest saved submission 应显示刚才的提交名,确认无误才点 Run latest submission。
  7. 打开本次 Run details。记录 run ID,按 Preparing environment → Running agent → Evaluating result 看进度。发起运行可能消耗额度;不要连续点击重复启动。
  8. 看实际测试条目,再看榜单。记录通过数/总数、失败原因、用时、模型、版本、赛道和任务。Counter 的成绩不能直接等同整条赛道或 ARC-Bench 大任务榜单成绩。
历史真实截图:Smoke Competition 右侧上方任务列表,下方新建提交表单
历史真实截图:①右上选择 Counter;②右下 New submission 上传 ZIP;③提交后仍需回任务页启动。截图按原比例展示,不拉伸。表单下半部需继续滚动。
你看到的状态能得出什么结论
上传成功 / 保存成功有了快照;尚无评测成绩
本地 build 与按钮测试通过本地作品可运行;不是云端分数
Preparing environment 报 agent.zip 不存在包准备失败,Octos 尚未开始执行;记录 run ID 和报错交给平台排查
Running agent正在生成,查看 stdout 与文件,不靠等待时长判断成绩
有实际测试报告按通过条目与平台分数解释;失败状态也要区分发生阶段
到这里应当看到

有可追踪的快照和 run ID;如果评测完成,有真实测试报告。未开始测试就没有可比较的新成绩,不要把占位 0.0 当成零分。

TROUBLESHOOTING

卡住时,先看停在哪一步

现象下一步操作
node / npm: command not found回第 1 步安装,再 source workshop.env。换终端不会自动继承之前的 export。
Key not set / 读到 ~/.config/octos重新 source;chat 必须带 --config;不要截图或粘贴真实密钥排错。
401 / 402 / 429分别检查认证、余额、限流或账号状态;看接口实际错误体,不要只增加迭代次数。
npm 下载失败等 agent 结束后在普通终端执行 npm install;普通终端也失败则先排查网络。不要手拆缓存。
超出 20 次迭代区分代码、依赖、构建哪步未完成;检查已有产物,不盲目重做整题。
43100 / 43101 已占用在你自己启动服务的终端按 Ctrl+C;不确定归属时先检查,不要直接 kill。
template is incomplete检查指定 output-dir 下 frontend/ 和 backend/;不要把项目生成到适配包目录。
保存之后没分数去具体任务点 Run;再确认评测是否真正执行了测试。
本机全过,平台全部 ERR_CONNECTION_REFUSED验收测试默认连 3301 端口而平台以 PORT=3000 启动。适配版已让后端同时监听两个端口;自己改适配包时保留这段逻辑。
平台上一道小题跑十几分钟、Token 数百万容器内 Octos 内置沙箱阻止 node 执行,模型在未执行测试的情况下自行推断。适配版已在容器内以 --danger-full-access 启动;不要去掉。
PART 2 / MODIFY

怎么改进,怎么刷榜

榜单只看两个数:通过率和费用。方法只有一个:定位问题、只修改一处、重新度量。下面是全部会用到的命令。

A. 环境准备(各平台)

macOS Apple Silicon:

brew install node@24 python git
export PATH="$(brew --prefix node@24)/bin:$PATH"
mkdir -p ~/octos-arc-workshop && cd ~/octos-arc-workshop
curl -fL --retry 3 https://github.com/octos-org/octos/releases/download/v2.0.2/octos-bundle-aarch64-apple-darwin.tar.gz -o octos.tar.gz
mkdir -p runtime-v2.0.2 && tar -xzf octos.tar.gz -C runtime-v2.0.2
./runtime-v2.0.2/octos --version        # 应显示 octos 2.0.2

Linux x86_64(平台评测容器就是这个架构):

sudo apt-get install -y nodejs npm python3 python3-pip git unzip
mkdir -p ~/octos-arc-workshop && cd ~/octos-arc-workshop
curl -fL --retry 3 https://github.com/octos-org/octos/releases/download/v2.0.2/octos-bundle-x86_64-unknown-linux-gnu.tar.gz -o octos.tar.gz
mkdir -p runtime-v2.0.2 && tar -xzf octos.tar.gz -C runtime-v2.0.2
./runtime-v2.0.2/octos --version

拿代码、装依赖、设环境变量(每开一个新终端都要重新 export):

cd ~/octos-arc-workshop
git clone --depth 1 https://github.com/octos-org/octos-arc.git
cd octos-arc
python3 -m pip install -r arc/requirements.txt
export ARCBENCH_API_KEY=ak_你的key                      # arc-bench.com 个人页 → API key
export OCTOS_BIN=$HOME/octos-arc-workshop/runtime-v2.0.2/octos
export OPENAI_BASE_URL=https://api.arc-bench.com/v1      # 默认值,可不设
export MODEL=deepseek-v4-flash                           # 默认值,可不设
export NODE_BIN=/opt/homebrew/opt/node@24/bin            # 仅 macOS Homebrew 需要;Linux 不设

B. 本机做题

# 五道题任选;输出在 arc/arc-output/<name>/
python3 arc/run-task-local.py arc/tasks/smoke--counter --name try1
python3 arc/run-task-local.py arc/tasks/smoke--dice --name dice1
python3 arc/run-task-local.py arc/tasks/ticket-booking--ticket-booking --name tb1
python3 arc/run-task-local.py arc/tasks/smoke-evolution--counter --name evo1
python3 arc/run-task-local.py arc/tasks/smoke-evolution--dice --name evo2

# 只检查配置、不花钱
python3 arc/run-task-local.py arc/tasks/smoke--counter --check

# 调预算(秒 / 次数)
OCTOS_TIME_BUDGET=1200 OCTOS_NODE_TIMEOUT=600 OCTOS_MAX_ITERATIONS=40 python3 arc/run-task-local.py arc/tasks/smoke--counter --name fast

日志里要看的行:[tests] using acceptance specs at …(验收测试已交给模型)、[flow] skeleton turn attempt 1 ok in N s(骨架轮耗时)、[flow] node REQ-1 ok in N s(需求节点耗时)、[rehearsal] app builds and starts cleanly(构建与启动演练通过)。

C. 本机评分

python3 arc/grade-local.py arc/arc-output/try1 smoke--counter
python3 arc/grade-local.py arc/arc-output/tb1 ticket-booking--ticket-booking
# 第三个参数可指定端口,默认 43300
python3 arc/grade-local.py arc/arc-output/tb1 ticket-booking--ticket-booking 43310

首次运行会在 arc/local-grader/ 自动安装 @playwright/test 和 Chromium,需要几分钟。输出每条测试 PASS/FAIL,最后一行是 x/y passed。评分脚本会把 E2E_BASE_URL 和 Playwright baseURL 都指向实际端口,与平台用同一套测试文件。

D. 看运行数据(改前改后对比用)

# 每轮的输入/输出 Token 和累计费用
python3 - <<'PY'
import json
turns=[]; cost=None
for line in open('arc/arc-output/try1/.arc/octos-events.jsonl'):
    try: e=json.loads(line)
    except: continue
    p=e.get('params',{})
    if e.get('method')=='turn/completed': turns.append((p.get('tokens_in'),p.get('tokens_out')))
    if e.get('method')=='progress/updated' and p.get('metadata',{}).get('kind')=='token_cost_update': cost=p['metadata']['token_cost']
print('turns:',turns); print('cost:',cost)
PY
# 平台上报的进度事件
tail -20 arc/arc-output/try1/.arc/runner-events.jsonl

E. 路径一:改适配包(不编译)

想改什么改哪里
给模型的指令(骨架 / 需求节点 / 终检)arc/main.py:APP_SKELETON_PROMPT、NODE_PROMPT_TEMPLATE、FINAL_CHECK_PROMPT、UI_CONTRACT_PROMPT
验收测试怎么喂给模型arc/main.py:ACCEPTANCE_TESTS_PROMPT、locate_acceptance_tests、spec_base_ports
需求节点的处理顺序arc/main.py:flatten_atomic(目前按树顺序,不看 dependencies)
Octos 启动参数、沙箱、环境变量arc/main.py:build_octos_env;arc/octos_stdio.py:OctosStdioSession.__init__
模型参数(max_output_tokens、reasoning_effort)arc/main.py:build_octos_env 里的 config 字典
时间与迭代预算环境变量 OCTOS_TIME_BUDGET、OCTOS_NODE_TIMEOUT、OCTOS_MAX_ITERATIONS
# 改完先看差异,再重跑同一道题
git diff arc/
python3 arc/run-task-local.py arc/tasks/smoke--counter --name try2
python3 arc/grade-local.py arc/arc-output/try2 smoke--counter
# 改坏了恢复
git checkout arc/main.py

F. 路径二:改内核(要编译)

# 需要 Rust 工具链:https://rustup.rs
cargo build --release -p octos-cli --no-default-features --features api
ls -la target/release/octos && target/release/octos --version
# 用自己编的二进制做同样的题
OCTOS_BIN=$PWD/target/release/octos python3 arc/run-task-local.py arc/tasks/smoke--counter --name mine
python3 arc/grade-local.py arc/arc-output/mine smoke--counter

改内核后要让平台用上,必须发一个 Linux x86_64 的二进制并把下载地址指过去:

# 在 Linux x86_64 机器(或 CI)上编译,打包成 tar.gz,包内有可执行文件 octos
tar -czf octos-bundle-x86_64-unknown-linux-gnu.tar.gz -C target/release octos
shasum -a 256 octos-bundle-x86_64-unknown-linux-gnu.tar.gz
# 在仓库发 Release(需要 gh 登录)
gh release create v2.0.2-arc.1 octos-bundle-x86_64-unknown-linux-gnu.tar.gz --title "octos-arc kernel" --notes "source commit: $(git rev-parse HEAD)"
# 把 arc/main.py 里的 OCTOS_RELEASE_URL 改成这个 Release 的下载地址,然后重新打包上传

不做这一步,平台运行的仍是 arc/main.py 当前指向的 Release。仓库已有现成工作流 .github/workflows/arc-linux-release.yml(手动 dispatch),产出 Linux x86_64 包并发 Release。常见改动位置:crates/octos-agent/src/sandbox/(沙箱)、crates/octos-agent/src/agent/llm_call.rs(模型调用与空回合处理)、crates/octos-agent/src/agent/loop_runner.rs(迭代循环)、crates/octos-cli/src/api/ui_protocol_transport.rs(serve 会话加载哪些工具和上下文)、crates/octos-agent/src/assets/profiles/coding.json(coding 工具集)。

G. 打包

sh arc/pack.sh
# 输出 octos-arc-bundle.zip 和 SHA-256;检查根目录直接是 main.py
unzip -l octos-arc-bundle.zip | head

H. 提交:网页方式

  1. 登录 arc-bench.com → Competition → 选比赛(Smoke / Ticket Booking)。
  2. 右侧 New submission:拖入 zip;Runtime 选 Python;模型 deepseek-v4-flash;Base URL https://api.arc-bench.com/v1;API key 填自己的。
  3. Save submission:只登记,不运行。
  4. 点具体任务 → Run latest submission:开始运行,计费。Smoke 要把计数器和骰子两题都 Run 一次才进榜。
  5. 运行详情页:三个阶段、stdout、Traceability(测试通过数);Competition 页左侧榜单下拉框切换赛道。

I. 提交:接口方式(同样的事用 curl 做)

BASE=https://arc-bench.com/api
JAR=$HOME/.arc-cookies
# 登录(账号密码是网站登录用的,不是模型 key)
curl -fsS -c $JAR -H 'Content-Type: application/json' -d '{"email":"你的邮箱","password":"你的密码"}' $BASE/auth/login
# 上传提交快照到 Smoke 比赛(换比赛改 competition_id)
SUB=$(curl -fsS -b $JAR -F requirement_id=smoke--__agent__ -F runtime=python -F catalog=competition -F competition_id=smoke -F agent_source=upload -F display_name="my octos" -F model_name=deepseek-v4-flash -F base_url=https://api.arc-bench.com/v1 -F api_key=$ARCBENCH_API_KEY -F file=@octos-arc-bundle.zip $BASE/submissions | python3 -c 'import sys,json;print(json.load(sys.stdin)["submission"]["id"])')
echo submission $SUB
# 对每道题创建运行并启动
for REQ in smoke--counter smoke--dice; do
  RUN=$(curl -fsS -b $JAR -F submission_id=$SUB -F requirement_id=$REQ -F catalog=competition -F competition_id=smoke $BASE/runs | python3 -c 'import sys,json;print(json.load(sys.stdin)["run"]["id"])')
  curl -fsS -b $JAR -X POST $BASE/runs/$RUN/start >/dev/null && echo "started $REQ run $RUN"
done
# 查询运行状态与结果
curl -fsS -b $JAR $BASE/runs/$RUN | python3 -m json.tool | head -40
# 运行日志(stdout 在 JSON 的 stdout 字段里)
curl -fsS -b $JAR "$BASE/runs/$RUN/logs?log_offset=0" | python3 -c 'import sys,json;print(json.load(sys.stdin)["stdout"][-3000:])'
# 我的全部运行
curl -fsS -b $JAR "$BASE/runs?limit=20" | python3 -m json.tool | head -60
# 榜单(无需登录)
curl -fsS "$BASE/competitions/leaderboard?track=all&competition_id=smoke" | python3 -m json.tool | head -40
curl -fsS "$BASE/competitions/leaderboard?track=all&competition_id=ticket-booking" | python3 -m json.tool | head -40
# 题目需求与公开验收测试(无需登录)
curl -fsS "$BASE/requirements/smoke--counter?catalog=competition" | python3 -c 'import sys,json;print(json.load(sys.stdin)["requirements_yaml"])'
curl -fsS "$BASE/requirements/smoke--counter/tests?catalog=competition" | python3 -m json.tool | head -30
# 比赛列表
curl -fsS $BASE/competitions | python3 -m json.tool

Ticket Booking 的 competition_id 是 ticket-booking,requirement_id 是 ticket-booking--ticket-booking;Evolution 赛道是 smoke-evolution,题目 smoke-evolution--counter、smoke-evolution--dice,需要指定上一轮 Smoke 的产物作为模板,目前只能在网页上选。

J. 提分最大的一处:验收测试脚本是公开的

每道题的 Playwright 验收测试在任务页公开,容器内 /workspace/tests 也有一份。适配版在骨架、需求节点、终检三段提示词里要求模型先读完这些脚本,按脚本里的路径、控件名、报错文字实现。这是订票题从凭感觉写到 8/10 的主要原因。对应代码:arc/main.py 的 ACCEPTANCE_TESTS_PROMPT。要给新题加测试,把任务页 tests 里的文件放进 arc/public-tests/<题目 id>/,并在 arc/public-tests/manifest.json 里登记题目 id 到题目标题的映射。

K. 费用为什么高

实验:让 Octos 不调用任何工具,只回复一句 OK。命令行方式(octos chat --profile coding)输入 5,277 Token、12 个工具;服务方式(octos serve,适配包用的)输入 17,205 Token、62 个工具,其中 14 个来自与编码无关的 app-skills。每次迭代都重新发送这部分上下文。让编码会话只加载 coding 工具集属于路径二,正在内核中修改。自己复现:

OCTOS_DISABLE_STREAMING=1 $OCTOS_BIN chat --profile coding --json --max-iterations 1 --no-retry --sandbox read-only -m "Reply with exactly OK. Do not call tools."
# 输出里的 input_tokens 只统计未命中缓存的部分,第二次运行会明显变小

L. 示例:改了一句提示词和内核中的一处之后

  1. 改。arc/main.py 里的一句提示词;crates/octos-agent/src/agent/loop_runner.rs 里的一处。
  2. 编。cargo build --release -p octos-cli --no-default-features --features api
  3. 本机做题。OCTOS_BIN=target/release/octos python3 arc/run-task-local.py arc/tasks/smoke--counter --name mine
  4. 本机评分。python3 arc/grade-local.py arc/arc-output/mine smoke--counter
  5. 发版并指过去。Linux 版 tar.gz 发 Release;改 arc/main.py 的 OCTOS_RELEASE_URL。
  6. 交。sh arc/pack.sh,网页或接口上传,选题,Run。

只改适配包的话,跳过第 2 步和第 5 步。

M. 排错

现象处理
clone 报 unable to read … repository corruptionGitHub 刚有新提交时的短暂状态,稍等重试;用 --depth 1
请设置 ARCBENCH_API_KEY / 找不到 octos 二进制本终端重新 export;OCTOS_BIN 指向解压后的 octos 可执行文件
[probe] HTTP 401 / 402key 错或余额不足,到 arc-bench.com 个人页核对
grade-local 报 Cannot navigate to invalid URL用仓库最新版 grade-local.py(已设置 baseURL)
端口 43100/43101/43300 已占用停掉自己起的服务;评分脚本第三个参数换端口
本机全过,平台 ERR_CONNECTION_REFUSED验收测试默认端口与平台 PORT 不一致;适配版已让后端同时监听,自己改时保留 spec_base_ports 逻辑
平台上一道小题十几分钟、Token 数百万容器内 Octos 内置沙箱阻止 node;适配版已在容器内以 --danger-full-access 启动,不要去掉
平台跑的还是官方版没发 Release 或没改 OCTOS_RELEASE_URL
Smoke 榜上没有我计数器和骰子两题都要有完成的运行
RESULTS · 2026-09-14 11:50 UTC

按以上方法得到的平台成绩

总榜前几名是费用 0 到 ¥0.004、耗时 0 到 4 秒的条目,其中一部分可能是提前准备好应用的提交,无法从榜单区分。魔改内核 Release v2.0.3-rc.11-arc.11;Web 赛道用适配层 main@032a57ac,小题用 main@6974ffcd(极小 spec 档位:只给模型 spec 的断言行,推理关闭,模型只输出一个 HTML)。Octos 有两个账号在榜:个人账号「李尧」与官方账号「octos」,同一套代码。平台按 API key 计量,同一把 key 并发运行会互相计入费用;榜单每题取最近一次完成的运行。

赛道我们的上榜运行运行编号总榜位置前面的条目
Smokecounter 1/1 ¥0.0028/23 秒(378 token);dice 1/1 ¥0.0023/23 秒(289 token);提交合计 ¥0.0051(李尧)、¥0.0052(octos)e123086d9c9d、ee470858da53第 4、第 5¥0.0001、¥0.0031、¥0.0037
Smoke Evolutioncounter 2/2 ¥0.0028/35 秒;dice 2/2 ¥0.0027/36 秒;提交合计 ¥0.0055(octos)、¥0.0086(李尧)bcf72deae878、207f40662651第 4、第 5¥0.0000、¥0.0001、¥0.0046
Ticket Booking9/10,¥0.134,100 秒(octos);9/10,¥0.251,198 秒(李尧)4c4146be7bbf、d24f1c3d1c84第 2、第 380%,¥0(预置);真实 agent 中我们第 1、第 2
ARC-Bench Webkeep 32/32,9,038 秒,¥16.58;bookstack 34/34,9,041 秒,¥22.99(含同一把 key 上其它本机运行约 ¥13)。评测容器 2 GiB / 1 核,评测阶段无 OOM。榜单要求六题全部完成才计分,其余四题串行进行中,之后官方账号再跑一遍六题2224a9013528、17fad96c6235未上榜(六题未全)无人

对照改进前(09-12):Smoke 单题 ¥1.24 → ¥0.0025,Evolution 单题 ¥0.55 → ¥0.0027,Ticket Booking ¥2.41 → ¥0.13、耗时 1259 秒 → 100 秒,keep 从评测阶段被 OOM 杀死(0/32,¥57)到 32/32、¥16.58。改动来自适配层的逐节点验收循环、按 spec 大小分档的单请求代码生成、先用验收测试探测已有应用再决定是否调模型、提示词与工具面裁剪、端口与 CommonJS 契约、按容器内存选 worker 数,以及内核的 solo 会话瘦身、工具输出裁剪、前缀缓存、输出上限修正;内核正在把这套 harness 逻辑收编为 octos arc run(策略文件 arc-policy.toml 与 prompts/ 目录,改策略不需要编译)。平台方在我们提供 OOM 证据后把评测容器从 0.5 GiB 放宽到 2 GiB。完整运行记录与归因在仓库 docs/results.md 与 evidence/。

进阶:让另一个 Agent 帮我操作

先理解上面的步骤,再使用 配套执行说明。自动化不能绕过账号配置、提交确认或实际测试证据。