跳转到内容
v0.8.4正式版

接入运行治理

运行治理解决三件事:把每次 Provider Attempt 归入一次 Run;在 Project 日预算之外执行 Run 生命周期预算;由独立验收方上报结构化 Outcome,让报表计算覆盖率、成功率和单位成功成本。

Halro 不拆任务、不编排 Agent,也不替业务判断成功。业务应用负责生命周期,Halro 保存费用与 归属权威;验收系统负责 Outcome,Halro 在查询时按 Work Unit 合并两边。

对象怎么划分
对象业务含义例子
Work Unit最终只应计算一次业务结果的工作对象工单 8472
Run完成该 Work Unit 的一次执行第一次 Agent 执行、失败后的第二次执行
Outcome Definition允许什么结果、哪些值算成功的版本化定义ticket_result v1
Outcome验收系统对 Work Unit 的一次声明或修订accepted

一个 Run 可以包含多个请求、Provider 重试和 fallback。整个 Agent 执行重新开始时,关闭旧 Run, 在同一 Work Unit 下创建新 Run;最终结果只计一次,成本包含所有 Run。

三种常见 Work Unit 划分
业务场景Work UnitRunOutcome Definition不应怎么划分
客服工单一张需要最终解决的工单一次 Agent 处理,人工退回后重跑是新 Runticket_result = accepted/rejected每次模型请求一个 Work Unit
文档抽取文件 ID + 不可变文件版本一次完整抽取流水线extraction_result = accepted/rejected文件被替换后仍沿用旧 Work Unit
代码修复Issue + 目标代码基线一次 Agent 修复执行review_result = mergeable/changes_requested每次 Provider fallback 创建新 Run

判断标准是“最终业务结果应该计算几次”。应该计算一次的对象放在同一个 Work Unit;完整执行重新 开始时创建新 Run;Halro 内部 Provider retry/fallback 仍属于原 Run。

Admin Console → Projects 编辑 Project,启用“运行治理”,设置默认/最大预算、默认/最大 TTL、active Run 上限和 open Work Unit 上限。控制台显示 USD 与小时;API 使用 micros USD 与秒,其中 1 USD = 1,000,000 micros USD

建议创建两把 Key:

准备权限和 Project
调用方Scope
Agent 编排inferencework_unit:createrun:createrun:attach,按需加 governance:read
业务验收outcome:write,按需加 governance:read

旧 Key 只保留 inference,不会自动得到治理权限。创建 Run 的 Key 也不会自动拥有 outcome:write

Admin Console → 运行治理 选择 Project,创建 Definition:

{
"name": "ticket_result",
"data_type": "CATEGORICAL",
"allowed_values": ["accepted", "rejected"],
"success_values": ["accepted"],
"description": "工单最终验收结果",
"enabled": true
}

第一版只接受 BOOLEAN 和 2–16 项的 CATEGORICAL。Definition 名称和历史版本不可变; 修改会创建新版本。Work Unit 创建时冻结当时启用的版本,之后升级 Definition 不追溯改变旧任务。

  1. 创建 Work Unit

    Terminal window
    curl https://halro.example.com/halro/v1/work-units \
    -H "Authorization: Bearer $HALRO_ORCHESTRATOR_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: 8472-work-unit-v1" \
    -d '{"outcome_definition_ids":["odef_xxx"]}'

    保存响应中的 wku_...。每个写操作都要使用稳定且属于该逻辑操作的 Idempotency-Key;超时后 用相同 Key 和相同请求体重试。

  2. 创建 Run

    Terminal window
    curl https://halro.example.com/halro/v1/runs \
    -H "Authorization: Bearer $HALRO_ORCHESTRATOR_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: 8472-run-1-v1" \
    -d '{"work_unit_id":"wku_xxx","budget_micros_usd":500000,"ttl_seconds":3600}'

    省略预算或 TTL 时使用 Project 默认值。保存响应中的 run_...

  3. 把模型调用归入 Run

    Terminal window
    curl https://halro.example.com/v1/chat/completions \
    -H "Authorization: Bearer $HALRO_ORCHESTRATOR_KEY" \
    -H "Content-Type: application/json" \
    -H "X-Halro-Run-ID: run_xxx" \
    -d '{"model":"chat","messages":[{"role":"user","content":"处理工单 8472"}]}'

    不需要传 Work Unit ID,Run 已经绑定它。Halro 在 Provider I/O 前原子检查 Project 日预算和 Run 的 committed + reserved + pending。预算不足返回 403 run_budget_exceeded,不会调用 Provider。OpenAI、Anthropic 和延迟 Responses 使用同一个 Run 请求头。

  4. 结束执行和工作对象

    Terminal window
    curl https://halro.example.com/halro/v1/runs/run_xxx/close \
    -H "Authorization: Bearer $HALRO_ORCHESTRATOR_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: 8472-run-1-close" \
    -d '{"reason":"completed"}'
    curl https://halro.example.com/halro/v1/work-units/wku_xxx/close \
    -H "Authorization: Bearer $HALRO_ORCHESTRATOR_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: 8472-work-unit-close" \
    -d '{}'

    关闭全部 Run,并确定不再重启整项工作后再关闭 Work Unit。

  5. 由验收系统上报 Outcome

    Terminal window
    curl https://halro.example.com/halro/v1/work-units/wku_xxx/outcomes \
    -H "Authorization: Bearer $HALRO_ACCEPTANCE_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: 8472-outcome-v1" \
    -d '{
    "definition_id":"odef_xxx",
    "value":"accepted",
    "observed_at":"2026-09-04T08:30:00Z",
    "evidence_ref":"ticket_8472_acceptance_3",
    "evidence_sha256":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    }'

Outcome 只发送 Definition ID、结构化值、观察时间和可选的脱敏证据引用/摘要。不要发送 Prompt、 Response、验收意见全文、URL、Token 或密码。evidence_ref 是最长 128 字符的不透明内部编号, 不能包含 URL 或凭据形状;SHA-256 必须是 64 位小写十六进制。

修订结果时重新 POST,并增加:

{
"definition_id": "odef_xxx",
"value": "rejected",
"observed_at": "2026-09-04T09:00:00Z",
"supersedes_outcome_id": "out_previous"
}

必须指向当前 Outcome 并使用新的 Idempotency-Key。每个结果最多 20 个 revision;Work Unit 关闭 30 天后停止写入。Work Unit 仍开放或仍有 pending/inflight Attempt 时,Outcome 标记为 provisional,不能当作已经成熟的最终结果。

Admin Console → 运行治理 可以从 Work Unit 下钻到 Run 和 Attempt,并查看 Outcome、覆盖率、 成功率、已知/估算/进行中/未知费用以及单位成功成本。

  • Outcome coverage = 有结果的 Work Unit / eligible Work Unit;
  • Success rate = 成功结果 / 已评估结果;
  • Cost per success = 成熟 Work Unit 的已知模型成本 / 成功 Work Unit;
  • partialunknown 不是零,表示结果缺失、工作仍在进行或成本不完整。

内置 cohort 最多 90 天或 100,000 个 Work Unit;更大的分析使用 Governance Export。导出在 Halro 数据目录生成规范化 NDJSON 和带双 watermark、SHA-256、记录数的 manifest,不会主动 上传到外部 FinOps 服务。当前触发权限、本地目录、Usage 交接和水位边界见 Usage 与 Governance 数据交接 FinOps

首次打开新版本会迁移 metadata schema,并启用新的 Ledger feature epoch。上线前必须创建并 验证升级前备份;升级后如需回退,应恢复这份备份,不能让旧二进制直接打开已经升级的数据目录。

当前阶段仍需完成真实业务试点,验证 Work Unit 边界、Definition、验收方、观察窗口和决策用途。

更多跨功能组合方式见最佳实践案例库