正在统计访客…
浏览全部文档
开始 · 9找到适合你的 Runifold 学习路径45 分钟掌握 Runifold理解完整的 Runifold 平台第一次可信运行选择正确的执行 API选择 Crate 与 Cargo Feature构建常见 Runifold 应用Runifold 常见问题排查 Runifold 应用故障
执行内核 · 7理解 RunContext安全协调外部副作用使用预算与取消限制工作安全地处理错误与重试事件、Journal 与执行证据设计 Capability 安全执行从 Checkpoint 安全恢复
模型与服务商 · 7在避免重复输出的前提下路由模型选择并配置模型服务商使用服务商中立的模型协议基于 Provider Runtime 契约构建使用 OpenAI 控制面与 Realtime API测试与 Benchmark Provider Adapter配置 OpenAI、Anthropic、Gemini 与 Ollama
Agent · 7构建并配置 Agent为 Agent 添加类型化工具加入会话与语义记忆安全地委派给子 Agent返回结构化 Rust 值在不丢失语义的前提下流式输出使用检索为 Agent 提供事实依据
持久工作流 · 7组合确定性工作流让工作流持久化运行持久工作流 Worker协调 Timer、Signal 与持久等待运行多租户工作流基础设施运行并行 Branch 与安全 Race对持久 Workflow 进行版本管理
集成 · 7通过 MCP 连接外部能力选择存储与持久化边界通过 MCP Tasks 暴露持久工作构建并评估检索流水线使用 MCP Resources、Prompts 与 Sampling在不跨越权限的前提下缓存 MCP 响应在 Rust Web Service 中部署 Runifold
质量与运维 · 10在没有网络的情况下测试评估质量并阻止回归观测完整运行树在浏览器与边缘环境安全运行准确理解可靠性声明在 CI 中运行可复现评测使用 SLO 运维 Runifold治理 Task 保留与删除把审计证据归档到 S3-Compatible WORM 存储管理兼容性与可信发布
文档/执行内核
第一次使用?通过 45 分钟核心课程建立完整心智模型
执行内核

事件、Journal 与执行证据

区分模型流事件与语义 Run 事件,持久化审计证据,并重建具有因果关系的执行树。

实践指南·12 min

两类事件流

Runifold 刻意区分模型协议事件与 Run 事件。ModelStreamEvent 用于重建服务商响应: 内容块、Reasoning、Tool Call、用量、Warning、服务商扩展与终止完成。 RunEventKind 记录执行系统做了什么:生命周期变化、预算更新、Callable 边界、 Effect、子节点、取消、失败与完成。

模型事件可以成为 Prompt 可见内容;Run 事件是控制与审计证据,不能被意外注入模型 会话。

Run 事件模型

每个语义事件都具有稳定身份和因果位置。根 Run 可以为模型调用、Tool、委派 Agent 或 Workflow Step 创建子 Run。共享记账与取消不会抹去子节点自己的身份。

运维人员或恢复代码必须理解的事实,应该使用 Domain Event;尚未规范化但需要无损保存 的传输信息,应该使用 Provider Event。不要只用日志字符串表达关键状态跳转。

Journal 契约

Journal 是追加语义证据的边界。InMemoryJournal 适合测试;持久 Store 可以让证据 跨越进程丢失。RunRecorder 把结构化事件连接到当前 RunContext

如果审计或恢复依赖 Journal,写入失败就不只是“日志失败”。应用必须明确决定继续、 关闭式失败,还是带着显式降级信号运行。

重建一次 Run

一次有用的重建应该回答:

  1. 哪个根请求启动了工作;
  2. 创建了哪些子节点,因果顺序是什么;
  3. 消耗了什么权限与预算;
  4. 请求并完成了哪些外部 Effect;
  5. 取消或失败源自哪里;
  6. 是否已经提交终止 Outcome。

OpenTelemetry 回答跨服务运维问题,Journal 回答单次执行的语义问题。通过 Run 与 Invocation 身份关联它们,不要互相替代。

采集策略

记录身份、规范状态、模型身份、用量、时间、错误种类与安全扩展元数据。Prompt、输出、 Tool 参数、凭证、原始文档与服务商 Body 默认保持脱敏。

Metric Label 必须保持低基数。Run ID 与请求专属事实应该进入 Trace 或 Journal,绝不能 成为 Prometheus Label。采集策略是一项安全和数据保留决策,而不只是调试偏好。

记录并检查语义 Event

use std::sync::Arc;
 
let journal = Arc::new(InMemoryJournal::new());
let run = RunContext::root(
    BudgetTracker::new(Budget::default()),
    CapabilitySet::new(),
)
.with_journal(journal.clone());
 
run.record(RunEventKind::Domain(DomainEvent {
    namespace: "acme.orders".into(),
    name: "order.validated".into(),
    payload: json!({ "order_id": "ord_42" }),
}), None)?;
 
for event in journal.events() {
    println!("{} {:?}", event.meta.sequence, event.kind);
}

使用稳定、低 Cardinality 的 Event Name 和安全 Payload。如果 Payload 包含客户正文、 Credential、原始 Tool 参数或 Provider Body,应改为脱敏引用。Durable Store 按 Sequence 读取 Event;Consumer 必须幂等,因为 Delivery 或 Projection 可能重复。