本文档说明:开发者如何基于 Shipyard Neo 的现有能力,让 Agent 在运行时完成技能的采集、评估、发布与回滚。
Shipyard Neo 提供的是 self-update 基建,而不是固定训练框架:
- 运行时执行证据层:自动记录 Python/Shell 执行历史
- 浏览器证据层:browser exec/exec_batch 记录
execution_id、trace_ref、learn状态 - 技能控制面:Candidate -> Evaluation -> Release -> Rollback
- 多入口:REST API / Python SDK / MCP tools
是否在线学习、离线评估、A/B 发布策略,由上层 Agent 系统自定义。
- Agent 在 sandbox 中执行任务(
python/exec或shell/exec) - Bay 生成并返回
execution_id - Agent 通过 history API 查询并补充
description/tags/notes - Agent 选择一组
source_execution_ids创建 skill candidate - 评测系统写入 evaluate 结果(score/pass/report)
- 满足条件后 promote,生成版本化 release(canary/stable)
- 线上异常时可 rollback 到上一版本
- Agent 调用
POST /v1/sandboxes/{sandbox_id}/browser/exec或exec_batch,传入learn=true。 - 可选传入
include_trace=true,Bay 返回trace_ref并把 step 轨迹外置到payload_ref=blob:<id>。 - Bay 后台异步任务扫描
learn=true的 browser 证据,抽取连续可执行动作段(长度>=2,排除失败/只读动作)。 - 自动创建 browser candidate 并写入回放评测结果。
- 达到阈值时自动发 canary:
score>=0.85、replay_success>=95%、samples>=30。 - canary 健康窗口 24 小时达标后自动升 stable。
- 若
success_rate下降超过 3% 或error_rate升至 2x 以上,自动回滚并写审计日志。
GET /v1/sandboxes/{sandbox_id}/historyGET /v1/sandboxes/{sandbox_id}/history/lastGET /v1/sandboxes/{sandbox_id}/history/{execution_id}PATCH /v1/sandboxes/{sandbox_id}/history/{execution_id}
POST /v1/skills/payloads(推荐:先创建通用 payload,获取payload_ref)GET /v1/skills/payloads/{payload_ref}POST /v1/skills/candidatesGET /v1/skills/candidatesGET /v1/skills/candidates/{candidate_id}POST /v1/skills/candidates/{candidate_id}/evaluatePOST /v1/skills/candidates/{candidate_id}/promoteGET /v1/skills/releasesPOST /v1/skills/releases/{release_id}/rollbackGET /v1/skills/releases/{release_id}/health
POST /v1/sandboxes/{sandbox_id}/browser/execPOST /v1/sandboxes/{sandbox_id}/browser/exec_batchPOST /v1/sandboxes/{sandbox_id}/browser/skills/{skill_key}/runGET /v1/sandboxes/{sandbox_id}/browser/traces/{trace_ref}(兼容入口;推荐优先使用GET /v1/skills/payloads/{payload_ref})
from shipyard_neo import BayClient, SkillReleaseStage
async with BayClient(endpoint_url="http://localhost:8000", access_token="token") as client:
sandbox = await client.create_sandbox(ttl=600)
r1 = await sandbox.python.exec("print('step1')", tags="etl")
r2 = await sandbox.shell.exec("echo step2", tags="etl")
candidate = await client.skills.create_candidate(
skill_key="etl-loader",
source_execution_ids=[r1.execution_id, r2.execution_id],
scenario_key="csv-import",
payload_ref=(await client.skills.create_payload(
payload={"commands": ["open about:blank"]},
kind="candidate_payload",
)).payload_ref,
)
await client.skills.evaluate_candidate(
candidate.id,
passed=True,
score=0.95,
benchmark_id="bench-etl-001",
report="pass",
)
release = await client.skills.promote_candidate(
candidate.id,
stage=SkillReleaseStage.CANARY,
)
# 线上回滚
await client.skills.rollback_release(release.id)若 Agent 通过 MCP 集成,可直接调用:
get_execution_historyannotate_executioncreate_skill_payloadget_skill_payloadcreate_skill_candidateevaluate_skill_candidatepromote_skill_candidatelist_skill_releasesrollback_skill_release
适合“无代码 SDK 集成”场景。
- 标签规范化:统一 tags 词表(如
etl,planner,retrieval,stable)。 - 评测前置:禁止直接 promote 未通过评测的 candidate。
- 发布分级:先 canary,再 stable。
- 回滚自动化:将关键线上指标绑定 rollback 触发器。
- 证据可追溯:candidate 必须保留 source execution IDs。
- 渐进上线:生产首轮建议设置
BAY_BROWSER_AUTO_RELEASE_ENABLED=false,验证指标稳定后再打开。
- SDK 重试策略:
GET/PUT/DELETE自动重试,POST仅在带idempotency_key时重试。 - 错误语义保留:即使上游返回非 JSON 错误页,也会按 HTTP 状态码映射语义化异常(如
NotFoundError)。 - MCP 参数校验:缺少必填参数会返回可读的
Validation Error,而不是裸KeyError。 - MCP 输出截断:超长工具输出自动截断并标记,避免上下文爆炸。
- 缓存有界化:sandbox 缓存有上限并按 LRU 淘汰,避免长时运行内存线性增长。
建议按“单测先行,E2E 兜底”执行:
- Bay 单测(browser learning/service 分支覆盖)
cd pkgs/bay
uv run pytest -q \
tests/unit/managers/test_browser_learning_lifecycle.py \
tests/unit/managers/test_skill_lifecycle_service.py \
tests/unit/managers/test_browser_learning_scheduler.py \
tests/unit/api/test_capabilities_browser_payloads.py- SDK 单测(browser 参数透传与 health 解析)
cd shipyard-neo-sdk
uv run pytest -q tests/test_client.py tests/test_skills_and_history.py- MCP 单测(tool schema + handler 输出)
cd shipyard-neo-sdk
PYTHONPATH=../shipyard-neo-mcp/src uv run --with mcp pytest -q ../shipyard-neo-mcp/tests/test_server.py- Bay E2E(需 Bay/Ship/Gull 环境)
cd pkgs/bay
uv run pytest -q \
tests/integration/core/test_history_api.py \
tests/integration/core/test_skill_lifecycle_api.py \
tests/integration/core/test_browser_skill_e2e.pytest_browser_skill_e2e.py 会自动检查 browser profile 与 Docker 下 gull:latest,环境不满足时会 skip,不会污染单测结论。
其中包含 run_skill 的负例分支(无 active release、非法 payload_ref)回归。