Console Web AI Teams 需求与现有代码 Gap #663
jason-aelf
started this conversation in
Ideas
Replies: 0 comments
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.
Uh oh!
There was an error while loading. Please reload this page.
背景
Console Web 的目标是 AI Team Workbench,不是后端对象浏览器。
本讨论用于对齐 AI Teams 产品需求与当前 aevatar 代码能力之间的 Gap,并决定哪些进入 P0 实现、哪些保留为后续阶段。
关联本地文档:
对齐基准
Scope、StudioTeam、StudioMember、Service Governance、Workflow、ServiceInvoke、Connector Binding、Event Topology 相关的口径,以现有实现语义为约束。核心结论
当前实现约束
StepCompletedEvent.Output不会自动跨 Service 变成ServiceInvocationRequest.Payload。list_services + invoke_service;目标 Agent 必须先作为 Service 暴露,调用默认还会经过 approval。Caller.ServiceKey;如果目标 Service 使用InvokeAllowedCallerServiceKeys做 allowlist 保护,当前invoke_service不能安全通过该门禁。binding_id / connector_type / connector_id -> runtime connector client的桥接。TopologyAudience、流转方向、publisher、target、route type、envelope id 和对应 observation / projection readmodel。Team 模型对齐
Scope = Team和多团队需求不一致。当前后端里的scopeId更接近认证后的用户工作区 / 租户隔离键,而不是用户可自由创建的 Team 资源;认证开启时,请求路径里的scopeId会被校验为必须等于登录身份里的scope_id,所以一个用户通常只能访问自己的当前 scope,不能把“创建多个团队”理解成“创建多个 scope”。dev 分支已有
StudioTeam和StudioMember后,产品语义更自然地变成:因此多团队能力应基于
StudioTeam实现,而不是继续沿用旧文档里的Scope = Team映射。统一口径应为:Scope 不是 Team,Scope 是认证后的工作区 / 租户隔离边界;Team 是 Scope 内的业务资源,由 StudioTeam 表达;一个 Scope 下可以有多个 StudioTeam,每个 StudioTeam 管理自己的 StudioMember。对产品层来说仍然展示“我的 AI 团队”,但实现上应理解为“当前工作区下的 StudioTeam 列表”。进入团队详情时使用
teamId表示用户选择的团队,scopeId只作为当前认证上下文和访问边界。Member / Service / Workflow 对齐
需求中“一个 Team Member(SaaS 层)= Governance 下的一个 Service(Platform 层)= 底层的 workflow / scripting / GAgent”应理解为成员发布、服务发现、治理和运行时绑定关系,不应理解为同步执行结果关系。Aevatar 当前最快实现 Agent 协作的方式是 Workflow 编排 Service 协作,但这条路径需要正视两个语义限制。
第一,调用 Service 返回的是 receipt,不是执行结果。
IServiceInvocationPort.InvokeAsync(...)返回的ServiceInvocationAcceptedReceipt只表示调用已被接受、已解析到目标 Service / endpoint,并进入投递或启动流程;它不代表目标 workflow / script / GAgent 已完成处理,也不包含业务输出。因此 workflow 不能把 Service invoke 当同步函数调用。如果本轮要求“调用成员后拿到目标结果并继续当前 workflow”,需要新增异步 continuation 方案:当前 workflow step 先持久化 pending invocation,再等待正式 result / failure event 或事件化 timeout signal,由 workflow actor 对账后恢复当前 step。第二,跨 Service 时必须显式构造 payload。
StepCompletedEvent.Output只在当前 workflow run actor 内部被 workflow kernel 写入 variables,并作为下一步本地 step 的 input;它不会自动变成另一个 Service 的ServiceInvocationRequest.Payload。调用其他 Service 时,必须从当前 workflow state / variables 显式映射出目标 endpoint 需要的 typed payload,再放进ServiceInvocationRequest.Payload,不能依赖StepCompletedEvent.Output自动跨 Service 传递。因此 P0 如果要做“成员协作”,应把它定位成“workflow 里显式调用已发布 Service,并通过事件 / read model / audit 观察结果”,而不是“成员函数同步返回另一个成员的最终输出”。如果不补齐 pending continuation / result event / timeout 对账机制,P0 只能承诺 accepted / running / audit 可见,不能承诺当前 workflow 自动拿到目标成员输出并继续执行。
AgentTool ServiceInvoke 对齐
需求中“一个 Agent 调用另一个 Agent”,除了 Workflow 编排 Service,在当前 C# 代码中还可以通过
IAgentTool的 ServiceInvoke 工具实现。也就是说,接待员 Agent 可以通过工具调用订单员 Agent 或售后专员 Agent,订单员 Agent 也可以继续调用跟进员 Agent。这个能力的运行时基础已经存在,但它更接近“Service 调用能力”,还不是一个完整产品化的 Team Member 协作模型。当前核心调用路径是
list_services + invoke_service。list_services用于查询当前 scope 下有哪些可调用的 Service 以及对应 endpoint;它不按StudioTeam/teamId过滤,也不能直接表达“当前 Team 的成员列表”。Team 维度成员选择应来自StudioTeam/StudioMember,而不是 ServiceInvoke 的list_services。invoke_service用于调用指定的service_id + endpoint_id,并把任务投递给目标 GAgent Service。对 Agent 协作来说,Agent B 需要先作为 Service 暴露出来,Agent A 才能通过 ServiceInvoke 工具调用它。需要注意的是,
invoke_service返回的是 accepted receipt,不是目标 Agent 的最终处理结果。它只表示调用请求已经被接受、目标 Service 已解析并进入后续投递或执行流程;它不代表订单员 Agent、售后 Agent 或跟进员 Agent 已经完成业务处理。另外,当前
invoke_service的ApprovalMode是AlwaysRequire,所以 Agent 调用另一个 Agent 默认需要 approve。也就是说,接待员 Agent 想调用订单员 Agent 时,系统会先产生工具调用审批,审批通过后才会真正调用目标 Service。还需要单独对齐 Service 调用安全语义。
InvokeAllowedCallerServiceKeys可以作为 Service invoke 的安全门禁,但它依赖一个前提:调用请求里必须有可信的 caller service key。当前 admission 链路会检查ServiceInvocationRequest.Caller.ServiceKey;如果策略里配置了InvokeAllowedCallerServiceKeys,而 caller service key 为空或不在 allowlist 中,调用会被拒绝。当前
AgentTool ServiceInvoke不满足这个前提。invoke_service构造请求时会把Caller.ServiceKey设为空,只携带当前 scope 的 tenant / app 信息;scope invoke HTTP 入口也是空 caller service key。因此它可以调用未配置 caller allowlist 的 Service,但不能代表“Agent A 作为 Service A”去安全调用受保护的 Service B。也不能简单让前端、LLM 或工具参数传入 caller service key,因为那只是调用方自报,不能作为安全边界。要让
ServiceInvoke真正支持InvokeAllowedCallerServiceKeys,需要先建立可验证的 caller service identity 来源,例如来自当前运行中的 Service actor / run context、dispatch envelope、绑定凭证或治理签发的 capability token。只有系统能证明“这次调用确实来自某个已授权 Service”时,才能填充Caller.ServiceKey并通过 allowlist 校验。因此当前 P0 口径应是:
ServiceInvoke具备基础调用能力,但还不是完整的 Service-to-Service 安全协作模型。短期可以定位为“受审批的工具调用 / 非 allowlist 保护 endpoint 调用”;凡是依赖InvokeAllowedCallerServiceKeys保护的 Service,不应通过当前invoke_service暴露或调用,除非后续补齐可信 caller service identity。Connector Binding 对齐
按需求文档本身看,C# 对“Team 详情的连接器 Tab 可展示当前绑定配置”已经有基础:Governance binding API 能保存、查询、展示 connector ref。这个部分大体满足“可见性”。
但对“Scope 下所有 GAgent 共享外部连接器 / secrets”和“先用已有 Telegram connector 跑通”的执行层语义,目前只满足了一半:旧 workflow connector 系统可以跑“启动时注册的 named connector”,Governance Binding Connector 可以记录
connector_type + connector_id,但两者没有桥接。因此现在的状态更像:因此 P0 需要明确边界:如果目标只是 Team 详情展示当前绑定配置,则现有能力大体可用;如果目标是“Team 成员运行时直接使用绑定的 Telegram / external connector”,则需要新增 Governance binding 到 workflow runtime connector client 的桥接设计,不能只靠前端配置页完成。
Telegram 入口对齐
Aevatar 目前有 Telegram 入站 / 读取能力,但没有 Team 级自动入口。
现有两种能力分别是:
适合 workflow 主动问 Telegram / 发 Telegram。
缺失的是:
事件拓扑与事件流对齐
当前实际能支持的是 Workflow 运行观察,不是完整的 EventEnvelope 观察系统。事件拓扑图目前拿到的是
getActorGraphEnriched(actorId)返回的 Workflow 投影图,包含 actor / workflow run / workflow step 节点,以及OWNS、CONTAINS_STEP、CHILD_OF这类结构关系;它可以画出一次 Workflow run 的执行结构,但不是逐条 EventEnvelope 的真实路由链路。事件流目前拿到的是
getServiceRunAudit()返回的 Workflow audit timeline,包含 run summary、steps、role replies、timeline、final output / error 等数据。timeline 里有workflow.start、step.request、step.completed、step.failed、role.reply、tool.call、workflow.completed等阶段信息,可以做运行审计列表,但它不是原始 EventEnvelope 流,也不是所有 agent 间消息的逐跳流水。和需求的主要差距是:现在没有 EventEnvelope 级的
TopologyAudience、流转方向、publisher、target、route type、envelope id,也没有 Telegram / LLM 这类外部服务节点和实时流动动画数据。结合当前实现语义,更适合先落地为“Team Member / Service 的 Workflow 运行观察页”;如果要严格满足“事件拓扑 + EventEnvelope 瀑布流”,还需要新增 EventEnvelope observation / projection readmodel。P0 因此应避免把 Workflow audit topology 命名成“完整事件拓扑”。更诚实的命名是“运行审计”“Workflow run topology”或“成员协作轨迹”;EventEnvelope 级实时拓扑可作为后续 Harness / observation 能力。
Gap Matrix
StudioTeam已存在,scopeId是认证工作区 / 租户边界Scope = Team口径需要修正Scope -> StudioTeam[],Team 详情使用teamIdStudioMember + binding已存在StepCompletedEvent.Output只在当前 workflow run 内写入 variableslist_services + invoke_service基础存在invoke_service当前ApprovalMode = AlwaysRequireCaller.ServiceKey与InvokeAllowedCallerServiceKeys;当前invoke_servicecaller service key 为空getServiceRunAudit()有 timeline / steps / role replies / tool calls建议的 P0 最小闭环
Call Team Member需要驱动后续 workflow step,必须补齐 pending continuation、result/failure event、eventized timeout 和 actor 内对账恢复;否则 P0 只展示 accepted / running / audit。InvokeAllowedCallerServiceKeys保护的 endpoint。P0 后端 Gap
scopeId是认证上下文,teamId是业务资源 ID。Call Team Member要等待目标成员结果并恢复当前 workflow,需要新增异步 continuation 方案:invocationId / correlationId、pending step 状态、result/failure event contract、eventized timeout signal、workflow actor 内对账恢复,以及对应 run audit / readmodel。InvokeAllowedCallerServiceKeys,需要新增可信 caller service identity 来源;不能依赖前端、LLM 或工具参数自报 caller service key。候选方案:Call Team Member Workflow Step
本节对应后文“
Call Team Member是否进入本轮,还是先用 ServiceInvoke 做高级能力?”这个团队决策项,用于描述如果Call Team Member进入本轮,应采用的方案边界。Call Team Member是在 Workflow 基础上做的能力,更准确地说,它应该是一个 Workflow extension / workflow step,不是新的 runtime,也不是新的 Multi-Agent 平台 primitive。简单描述是:
Call Team Member是 Workflow 中的一个成员调用节点。它运行在当前 workflow run 里,由当前步骤根据memberId和 action 找到目标团队成员,再通过 member binding 解析到目标成员背后的 Service / Workflow / Script / GAgent,最终走 Service Invocation + EventEnvelope 投递。需要注意的是,投递完成后只能立即得到 accepted receipt;如果要让当前 workflow 等待目标成员结果并继续执行,必须新增 pending continuation / result event / timeout 对账方案。核心链路:
其中
accepted receipt不是当前 workflow step 的完成信号。若本轮只实现到 accepted receipt,则该 step 的产品语义应是 fire-and-observe:Console 可以展示调用已接受、运行中、审计轨迹,但不能把目标成员输出作为后续 step 的输入。若本轮要支持“等待目标输出后继续”,至少需要补齐:workflowRunId、stepId、invocationId / correlationId、目标memberId、目标serviceId / endpointId、timeout deadline 和 expected result contract。invocationId / correlationId和强类型输出或错误,供当前 workflow actor 对账消费。它能解决的问题:
service_id + endpoint_id + payload + actorId包装成“调用某个成员的某个能力”。memberId + action + input mapping。actor_send/SendToAsync(actorId, proto),而是走IServiceInvocationPort,保留 endpoint contract、policy、revision、admission 和 ServiceRun 记录。caller_service_key。不建议做
callerServiceKey来绕过InvokeAllowedCallerServiceKeys。ServiceInvocationAcceptedReceipt当成目标成员完成结果,也不通过 query-time 读取 run audit / readmodel 来临时拼装 workflow 恢复。需要团队决策的问题
P0 是否明确采用 Scope -> StudioTeam[] -> StudioMember[] 模型?
需要确认:Scope 只作为认证工作区 / 租户边界,StudioTeam 才是用户可创建的 AI Team。
决策结果会影响 Console 路由、API 入参、权限模型、文案和旧文档里的 Scope = Team 是否需要统一修正。
Workflow 协作是否作为 P0 的默认成员协作路径?
需要团队在“Workflow 编排 Service 协作”和“AgentTool ServiceInvoke 协作”之间确定默认路径。
当前倾向:P0 用 workflow 编排 service 协作,因为它更适合表达显式步骤、状态、审计和结果观察。
Call Team Member 本轮是否需要等待目标成员结果并恢复当前 workflow?
需要决定:P0 是只支持 fire-and-observe,还是支持“调用成员 -> 等待目标输出 -> 写回当前 step output -> 继续后续节点”。
如果需要等待并恢复,必须新增 pending continuation、result/failure event、eventized timeout 和 workflow actor 内对账恢复方案。
Service invoke 的结果权威来源本轮采用哪一种?
需要决定:目标成员执行完成后的结果由正式 result/failure event 承载,还是只在 run audit / readmodel 中展示。
建议:驱动 workflow 恢复的只能是正式事件;run audit / readmodel 只做观察,不作为 query-time 恢复来源。
Call Team Member Workflow Step 是否进入本轮?
这是文档里最关键的产品化决策之一。
如果进入本轮,它应作为 workflow extension / workflow step:用 memberId + action + typed input mapping 解析到目标 Service / endpoint,再走 IServiceInvocationPort。
如果不进入本轮,则 P0 可以先暴露底层 ServiceInvoke 或 workflow service step,但用户理解成本会更高。
InvokeAllowedCallerServiceKeys 保护下的 Service 协作是否进入 P0?
当前 ServiceInvoke 构造请求时 Caller.ServiceKey 为空,scope invoke HTTP 入口也是空 caller service key。
需要决定:P0 是否支持调用配置了 InvokeAllowedCallerServiceKeys 的受保护 endpoint。
如果进入 P0,必须先设计可信 caller service identity / capability token,不能让前端、LLM 或工具参数自报 caller service key。
Connector Binding 本轮只展示治理事实,还是必须驱动运行时执行?
当前 Governance binding 可以保存、查询、展示 connector ref;但 binding_id / connector_type / connector_id -> runtime connector client 的桥接还不存在。
需要明确 P0 边界:只做 Team 详情 Connector Tab 的配置可见性,还是要求成员运行时真的使用这些绑定。
Event topology 本轮是否明确降级为 Workflow run audit topology?
当前实际可用的是 workflow graph / run audit,不是完整 EventEnvelope 观察系统。
需要决定:P0 页面是否命名为“运行审计”“Workflow run topology”或“成员协作轨迹”,而不是“完整事件拓扑”。
是否需要新增 topology / message ledger readmodel?
如果产品坚持要“事件拓扑 + EventEnvelope 瀑布流”,团队需要决定是否本轮新增 observation / projection readmodel。
该 readmodel 至少需要表达 publisher、target、route type、envelope id、audience、方向、时间、水位和外部服务节点。
如果不新增,P0 只能做 workflow run audit timeline。
All reactions