Replies: 1 comment
-
补档:关于"保留现有 inline 路径作为 availability fallback、NyxID downstream 作为另一来源"的评估线下讨论了一个变体:保留现在 Lark bot 的 inline YAML 调用方式作为 fallback,让 NyxID downstream 作为另一个 workflow 来源。结论补档如下。 结论:「NyxID downstream 作为另一个 workflow 来源」成立(本 RFC 即此定位);「现有 inline 路径作为可用性 fallback」不建议——那不是稳健,是把脱轨制度化成运行时行为。可取形式 = 双来源、显式选择。 两个来源不是同一事实的两个副本,而是不同版本 + 不同治理面。fallback 只有在副本等价时才带来稳健(如读多副本);版本可能不同时,fallback 带来的是不确定性:
另外两点支撑:
方向性原则一句话:not-found → 发现引导(去 NyxID 找)✅;失败 → 换版本跑(降级)❌。 两者方向相反,不可互换。 最小落地切片(已开 issue,进 milestone "Workflow Week of 2026-06-08")
这组就是"双来源显式选择"的最小骨架:来源由声明与目录事实决定,失败诚实失败,不做静默降级。 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
[RFC] 收敛 workflow 执行双轨:skill inline YAML 与 scope service / NyxID downstream
1. 现状:同一个 workflow 有两条互不知晓的执行链
链路 A — Lark/chat 默认路径:Ornn skill → inline YAML 临时执行
关键事实:
aevatar_start_workflowwith this inline workflow bundle before treating workflow YAMLs as ordinary reference files."mount_workflows参数存在(mount 进 scope catalog,走IScopeWorkflowCommandPort.UpsertAsync,有 RevisionId),但默认 false 且 opt-in(UseSkillTool.cs schema:"Default false"),mount 还触发 approval(RequiresApproval => MountWorkflows)。事实源 = Ornn skill assets 里的 YAML,在拉取瞬间冻结的快照。
链路 B — 生产暴露面:scope catalog → service binding → NyxID downstream
事实源 = scope catalog 里的注册 workflow(committed actor state + revision),并有完整治理面(scope guard、NyxID 凭证注入、approval)。
脱轨点
aevatar_start_workflow双重语义:workflow_id(名称查找)+workflow_yamls(inline 内容)2. 设计目标(从仓库不变量直接推导)
{run_id, status, stream_topic},见 ADR-0026 D3)与跨边界代理调用(任意 HTTP 响应 + approval pending)契约不同,不得混在一个结果壳里假装一样。3. 候选方案对比
方案 1:
aevatar_start_workflow内嵌 NyxID downstream 解析(最初提议)workflow_id 本地 catalog 未命中时,工具内部去 NyxID 发现 downstream service 并经 proxy 调用。
方案 2:纯 prompt 收敛
只改 Handoff / 系统提示,让 LLM "先查 catalog,再用 nyxid_proxy 发现"。
方案 3(推荐):分层收敛 —— mount-first + reference-only + typed exposure
把两条链路收敛成一条主干上的四个生命周期阶段:
4. 推荐方案落地(三阶段)
Phase 1 — 止血:mount-first + reference-only Handoff(最小 diff)
use_skill对含 workflow 的 skill 默认 mount(幂等:content-hash 相同 → 复用现 revision;不同 →UpsertAsync新 revision,ScopeWorkflowUpsertRequest已支持 RevisionId,src/platform/Aevatar.GAgentService.Abstractions/ScopeWorkflows/ScopeWorkflowModels.cs:5-12)。workflow_id(+ 本次 mount 得到的 revision),LLM 走CatalogWorkflow分支。aevatar_start_workflow的 not-found 错误 actionable 化:"workflow '' 不在本 scope catalog;若它已发布为服务,用 nyxid_proxy(不带 slug)发现 downstream service 后调用"。错误时刻的引导比系统提示更确定(这是对方案 1 诉求的承接:LLM 确实会去 NyxID 找,但通过既有工具、在明确失败的时机)。Phase 2 — 收窄契约:撤掉 LLM-facing 的 inline 语义
aevatar_start_workflow的 LLM-facing schema 移除workflow_yamls(aevatar_invocation_tools.proto:54-60 中 field 5),消除脱轨点 4 的双重语义;draft/dev 场景与 SkillRunner cron 内部路径改走"先 mount 后引用"或保留独立的内部契约(不暴露给 LLM)。Phase 3 — typed exposure:让"生产部署"成为可查询事实
ServiceBindingSpec(或 service definition)增加 typed 字段记录 NyxID 注册信息(slug、注册时间);ops 在 NyxID 注册后通过 binding API 写回。NyxID 侧零改动,纯 aevatar 侧状态。(可选)Phase 4 — 重新评估方案 1 的 typed 变体
Phase 3 之后,同 cluster 内 dispatcher 可以 typed 解析 workflow_id → binding → slug,不再需要模糊匹配。若届时确有"单工具入口"需求,可给
aevatar_start_workflow加显式的跨边界结果壳(明确区分local_runvsproxied_invocation,各自诚实的 ACK 语义)。在那之前不做。5. 兼容性
nyxid_proxy面。6. Open Questions
mount_workflows=true触发 approval。mount-first 后建议:首次 mount / revision 变更需 approval,同 revision 幂等重放免审批——是否接受?欢迎拍砖,尤其是 Phase 1 的 mount-first 默认值变更(行为面最大)和 Open Question 2 的 revision 选择规则。
Beta Was this translation helpful? Give feedback.
All reactions