用途:在 NeMo Relay 中新增一种中间件类型,包括护栏(validate/gate)与拦截器(transform),并覆盖暴露该契约的每一层。适用于引入新的中间件注册接口,或把中间件行为接入新的流水线阶段;不用于修改已有中间件实现。
设计先行:编码前需确定作用对象(工具、LLM、mark、scope 事件或组合)、类型(条件护栏、净化护栏、请求拦截、执行拦截)、运行时机(请求输入、内部可调用执行、流式分块或最终响应)、回调是否可失败及失败传播方式、是否需要全局与作用域本地注册,以及订阅者与导出器在中间件运行后应观察到的事件负载。若为事件净化器,还需明确 data、category_profile、metadata 中哪些可变,事件是否仅作不可变上下文。
流水线顺序:工具执行与 LLM 执行均为条件护栏 → 请求拦截 → 请求净化(事件)→ 执行拦截链(callable)→ 响应净化;mark 与 scope 事件为专用工具/LLM 净化器(适用时)→ mark 或 scope 事件净化器 → 订阅者与导出器分发。工具执行回调与每个执行拦截的 next 续体返回规范 ToolExecutionResult { result, annotation },转发型拦截须在 ToolExecutionInterceptOutcome 中保留两者,Relay 单独保留 pending_marks;工具响应净化护栏只接收 result;scope 结束事件净化器在 Relay 投影到 category_profile.tool_result_annotation 后管理 annotation。
核心步骤:在 crates/core/src/api/runtime/callbacks.rs 定义或复用回调类型别名;在 crates/core/src/api/runtime/state.rs 的 NemoRelayContextState 增加注册表字段(SortedRegistry<GuardrailEntry<MyNewFn>> 或 SortedRegistry<Intercept<MyNewFn>>);在 crates/core/src/api/ 增加注册与注销 API,沿用 crates/core/src/api/registry.rs 的 global_registry_api! 与 scope_registry_api! 宏模式,除设计明确排除外需同时提供全局与作用域本地变体;在 state.rs 增加链式执行辅助方法,参照 tool_sanitize_request_chain 或 tool_request_intercepts_chain;将链接入执行路径,工具与 LLM 路径位于 crates/core/src/api/tool.rs 与 llm.rs,共享 mark 与 scope 事件净化位于 shared.rs 并由 scope.rs 调用;在每个受影响的绑定中暴露新中间件接口,先实现 Rust 真源,再更新绑定、FFI、包装、文档与测试。
必需测试:注册与重名行为、注销与缺失名无操作、按优先级排序、回调失败策略(含必要的 fail-open)、作用域本地注册/继承/pop 清理、中间件变更后的事件负载语义、工具执行结果与 annotation 的保留/替换/移除、mark 与 scope 事件字段语义(含不可变身份字段)、每个受影响绑定的对等覆盖。
关键参考:流水线逻辑 tool.rs、llm.rs;类型别名 callbacks.rs;运行时状态与链构建 state.rs;作用域本地注册表合并 context/registries.rs;注册表 registry.rs;流水线文档 docs/about-nemo-relay/concepts/middleware.mdx;架构文档 docs/about-nemo-relay/architecture.mdx;注册示例 docs/instrument-applications/advanced-guide.mdx。
限制:资料未提供具体安装命令、收费方式、支持平台与效果数据。