HTTP API
Vyane dashboard(Beacon)和 daemon 暴露的 HTTP 端点,含认证规则、写操作入口与工作流远程执行面。
Vyane 除了 CLI 和 MCP,还起了几个 HTTP 服务。它们不是一个统一的大 server,而是三张各管一摊的「脸」:
- Dashboard / Beacon 服务——最主要的一张脸,跑在
vyane dashboard(默认127.0.0.1:41521)。所有/api/*端点都在这里:看板状态、历史、成本、审查、任务、会话,以及两个关键写入口——看板写和工作流运行。/api/*全部需要 Bearer token。 - Daemon webhook 服务——常驻 daemon 起的健康检查 + webhook 接收面,提供
/health。 - A2A HTTP 服务——Agent-to-Agent 协议对外面(
vyane a2a-server),提供/health和 agent card。
下面按服务分别列端点,以源码为准(src/vyane/dashboard.py、src/vyane/daemon/webhook.py、src/vyane/a2a/http_server.py)。
/api/* 一律要 Bearer token
Dashboard 的安全中间件(DashboardApiSecurityMiddleware)拦所有以 /api/ 开头的路径。开启认证时(默认开),请求必须带 Authorization: Bearer <token>,否则返回 401(响应头 WWW-Authenticate: Bearer)。根路径 /(看板 HTML 页面)不算 API 路径,不拦。
Dashboard / Beacon 服务
用 vyane dashboard --host 127.0.0.1 --port 41521 启动。技术栈是 Starlette。想了解它服务什么、怎么调,看下面。
认证怎么走
安全中间件的判定顺序(src/vyane/dashboard.py):
- 路径不以
/api/开头 → 直接放行(例如/)。 - 校验请求来源
Origin(跨域白名单),不在白名单返回403。 OPTIONS预检 → 返回204+ CORS 头。- 取
Authorization: Bearer <token>,和配置的 token 逐一比对(用hmac.compare_digest常量时间比较,防时序侧信道)。 - 开了
auth_required(默认开)而没带有效 token →401。
token 从环境变量读,也可以启动时传入:
| 环境变量 | 作用 |
|---|---|
VYANE_DASHBOARD_API_TOKEN | 主 API token(单一共享 token) |
VYANE_DASHBOARD_OWNER_TOKENS | 多 owner 绑定 token(一个 token 对一个 owner 身份) |
VYANE_DASHBOARD_API_TOKEN_OWNER | 主 token 绑定到哪个 owner |
VYANE_DASHBOARD_AUTH_REQUIRED | 是否强制认证,默认 true |
VYANE_DASHBOARD_REQUIRE_OWNER | 是否强制 token 必须绑定 owner,默认 false |
VYANE_DASHBOARD_ALLOWED_ORIGINS | 允许的跨域来源(逗号分隔) |
VYANE_DASHBOARD_BOARD_DIR | 看板写入口的固定目录(写操作用) |
调用示例:
# 读看板状态
curl -H "Authorization: Bearer $VYANE_DASHBOARD_API_TOKEN" \
http://127.0.0.1:41521/api/status
# 提交一次看板写(见下方「看板写」)
curl -X POST http://127.0.0.1:41521/api/board/write \
-H "Authorization: Bearer $VYANE_DASHBOARD_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"action":"log","issue_id":"ISSUE-42","message":"进展说明","mode":"apply"}'owner 绑定是什么
一个 owner 大致对应「谁在用这个系统」——token 可以绑定到具体 owner 身份,这样写操作和工作流运行会记在那个 owner 名下,避免一个人冒充另一个人提交。开 require_owner 后,没绑 owner 的裸 token 会被 403 拦下。
关键端点
页面 + 两个写入口(最需要知道的):
| 方法 | 路径 | 作用 | 认证 |
|---|---|---|---|
| GET | / | 看板 HTML 页面 | 无(非 API 路径) |
| POST | /api/dispatch | 远程发起一次 dispatch(异步,返回 task_id) | Bearer |
| GET | /api/dispatch/{task_id} | 查这次 dispatch 的状态 | Bearer |
| POST | /api/dispatch/{task_id}/cancel | 取消(幂等) | Bearer |
| GET | /api/dispatch/{task_id}/events | dispatch 状态级 SSE 流 | Bearer |
| POST | /api/board/write | 看板写入口(log / take / done / new 等落到 LedgerService) | Bearer |
| POST | /api/workflow/run | 启动一次 workflow v2 运行,返回 run_id(异步) | Bearer |
| GET | /api/workflow/{run_id} | 查这次运行的状态 + journal 摘要(owner 隔离) | Bearer |
| GET | /api/workflow/{run_id}/events | SSE 进度事件流 | Bearer |
只读数据端点(都走同一套 Bearer 认证,节选):
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /api/status | daemon / kernel / scheduler 总体状态 |
| GET | /api/history | dispatch 历史 |
| GET | /api/stats | 汇总统计 |
| GET | /api/providers | provider 列表与可用性 |
| GET | /api/costs | 成本记账 |
| GET | /api/usage/summary | 用量汇总 |
| GET | /api/events | 事件流 |
| GET | /api/reviews · /api/reviews/{run_id} | 审查运行列表 / 详情 |
| GET | /api/tasks · /api/tasks/{task_id} | 任务列表 / 详情 |
| POST | /api/tasks/{task_id}/{action} | 对任务执行动作 |
| GET | /api/sessions · /api/sessions/{session_id} | 会话列表 / 详情 |
| POST | /api/sessions | 新建会话 |
| GET | /api/collaborations | A2A 协作记录 |
| GET | /api/approvals | 审批队列 |
| GET | /api/memory/search | 记忆检索 |
端点全表以源码为准
以上是一份代表性清单,不是全集。Dashboard 还有一整组给上层前端用的端点(自动化排程、通知、pulse、能力探测、DAG 等)。完整、最新的路由表在 src/vyane/dashboard.py 的 Starlette(routes=[...]) 定义处;写集成前请对着源码核对,别照文档记路径。
看板写:POST /api/board/write
这是看板三个写入口之一(另两个是 CLI 直读写文件、MCP vyane_board_write),三者最终都经 LedgerService。请求体是 JSON。
action——写动作:log/take/done/drop/cancel/new。mode——dry_run(默认,只预演不落盘)或apply(真正写入)。issue_id——目标卡号(如ISSUE-42);new时留空。title——新建卡标题(new用)。- 其它可选字段:
project/priority/desc/labels/message/next/by(默认sui)/codename/evidence等。
board_dir 由服务端固定
请求体里不能塞 board_dir——写入目录由 dashboard 启动配置(VYANE_DASHBOARD_BOARD_DIR)钉死。传了会被 403 拒绝。这是防止远程调用者把写操作导到任意路径。
出错时返回 API 形态的错误对象(带对应 HTTP 状态码),而不是抛裸异常。
工作流运行:POST /api/workflow/run
启动一次 workflow v2 脚本运行,立即返回 run_id(异步执行)。这是工作流的远程、不可信脚本执行面,护栏比 CLI 更严:
- 必须带有效 dashboard Bearer token。
- 运行的 owner 从认证 token 绑定——请求体或 query 里的
owner_user_id会被忽略,防止一个人以别人身份提交运行。 - 启动后用
GET /api/workflow/{run_id}轮询状态,或GET /api/workflow/{run_id}/events订阅 SSE 进度流。
这跟 MCP 的 vyane_workflow 和 CLI 的 vyane workflow run <script.js> 是同一套 v2 引擎的三个入口,只是 HTTP 这一路作为公网面加了最严的身份护栏。
Daemon webhook 服务:/health
常驻 daemon(src/vyane/daemon/webhook.py,aiohttp)起一个健康检查面:
| 方法 | 路径 | 作用 | 认证 |
|---|---|---|---|
| GET | /health | daemon 健康快照(含 kernel / scheduler 模式等),JSON | 无 |
CLI 的 vyane daemon 相关命令会读这个 /health(默认 http://127.0.0.1:<port>/health)来采样 daemon 的实时状态。它返回一个 JSON 对象,健康时 200,异常时可能带非 200 状态码。
A2A HTTP 服务:/health 与 agent card
Agent-to-Agent 协议的对外面(vyane a2a-server,src/vyane/a2a/http_server.py,Starlette):
| 方法 | 路径 | 作用 | 认证 |
|---|---|---|---|
| GET | /health | 负载均衡用健康检查,返回 {"status":"ok","version":...} | 无 |
| GET | /.well-known/agent.json | A2A agent card(自我描述) | 无 |
健康检查为什么不设认证
/health 端点(webhook 和 A2A 两处)是给负载均衡器和运维探针用的存活探测,只暴露非敏感的状态信息,所以不挂 Bearer token。真正的数据和写操作都在 dashboard 的 /api/* 后面,那一层才是认证边界。