| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Aevatar 是一个 多 Agent 协作系统(Multi-Agent Collaboration System):以 Actor + Event 为运行内核,让多个角色 Agent 在同一任务中分工、并行、协商与收敛。
Workflow YAML 是 Aevatar 的默认编排方式:用 YAML 定义角色、步骤、路由与策略(如 llm_call、parallel、vote_consensus、connector_call),再通过 HTTP Chat 接口(SSE / WebSocket) 触发并流式观察整个协作过程。
Aevatar = 多 Agent 协作运行时 + Workflow YAML 编排层。
不熟悉 .NET 也没关系:日常使用只需配置 + 启动 API + 发 HTTP 请求;涉及「仓库结构」「模块列表」时,按需查阅即可。
任选一种方式,让框架能调用 LLM(如 DeepSeek / OpenAI):
| 方式 | 做法 |
|---|---|
| 环境变量 | 终端里执行:export DEEPSEEK_API_KEY="sk-..." 或 export OPENAI_API_KEY="sk-..."。 |
| 配置文件 | 在 ~/.aevatar/secrets.json 里写 Provider 与 API Key,详见 配置说明。 |
在仓库根目录执行:
dotnet run --project src/workflow/Aevatar.Workflow.Host.Api服务会加载应用目录与 ~/.aevatar 中的配置与工作流。 生产/统一入口推荐直接启动 Mainnet:
dotnet run --project src/Aevatar.Mainnet.Host.ApiMainnet 仍保留旧 /api/scopes/{scopeId}/streaming-proxy/... route 以兼容既有客户端,但该 route 已软废弃并声明 Sunset: Wed, 25 Nov 2026 00:00:00 GMT。新的直接模型 streaming / tool / continuation 接入请使用 /v1/responses;StreamingProxy 的 room/fan-out/participant 语义不等价于 /v1/responses,不要为新客户端继续接入旧 route。
{ "prompt": "你的问题或长文本", "workflow": "simple_qa" }请求头带上 Accept: text/event-stream,响应为 SSE 流(运行开始、步骤完成、消息片段、运行结束等)。
示例(命令行):
curl -X POST http://localhost:5100/api/chat \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"prompt": "什么是 MAKER 模式?", "workflow": "simple_qa"}'运行结束后,仓库根目录的 artifacts/workflow-executions/ 下会生成本次运行的 JSON 与 HTML 报告。 (可通过 WorkflowExecutionProjection 配置开关控制)
Mainnet 部署必须配置 NyxID 的两类公开地址:Aevatar:NyxId:Authority 只用于公开 OIDC issuer/discovery,Aevatar:NyxId:ApiBaseUrl 用于控制面 REST、LLM gateway、浏览器和 webhook 地址。Aevatar:NyxId:InternalApiBaseUrl 只用于 /api/v1/proxy/s/* 与 /api/v1/ssh/* 执行流量;Mainnet 默认使用公网,只有同时显式设置 Aevatar:NyxId:EnableInternalApiTransport=true 和合法的 internal URL 才启用内网 transport。控制面请求(包括 /user-services、/keys 和 /api-keys/scope-plan)始终走 ApiBaseUrl。执行请求在内网目标明确尚未建立连接时会改走 ApiBaseUrl 重试一次;此外,仅 GET/HEAD/OPTIONS 在内网响应头等待超过 Aevatar:NyxId:InternalApiFallbackTimeoutSeconds(默认 5 秒)时可向公网重放一次。mutation 超时、TLS、连接重置、调用方取消、重定向、任意 HTTP 响应,以及已收到响应头后的 body 读取失败都不会触发重放。完整配置与降级语义见 NyxID LLM Provider 集成指南。
Workflow 的 code_execute 是一个明确的例外:它的 durable /executions submit、status、result 和 cancel 请求始终使用 Aevatar:NyxId:ApiBaseUrl,不读取 InternalApiBaseUrl,也不使用 internal-to-public mutation fallback。一次 workflow step 不再持有长时间 HTTP 请求,而是持久化 operation receipt 后由 actor durable callback 发起有界的状态查询。timeout_secs 默认 180 秒、允许 1 到 600 秒,并由 Aevatar 在 submit 时显式发送。Workflow stop 会持久化一个不会被重投递延长的绝对取消截止时间;截止后不再启动新的 admission-ledger/provider 操作,但仍以有界 backoff 完成冻结的 terminal audit。已经到期的 callback 使用至少 1 ms 的正延迟进入 durable scheduler,只有审计事实可靠落库后才释放 stop。当前 Chrono Sandbox 部署使用单副本 ephemeral operation store:可以解除单次 HTTP 的 125 秒限制,但进程重启会丢失 operation/result,尚不提供跨副本读取。完整状态机和上线门槛见 Sandbox Execution。
2026-08-17 UTC 的生产验收确认了这条边界:Ready 的 Aevatar 镜像 9af2a379680cad37759e0628fae9712b12283e67 通过 public NyxID route 使用异步 Chrono Sandbox;130 秒脚本在 timeout_secs=180 下以 exit_code=0 完成,provider 记录的执行时间为 131124 ms,所有 submit/status/result 交换的观测最大值不超过 1 秒,same-key submit 收敛且没有 524。独立的 HR-01 webhook canary 只有一次基线后 delivery,Aevatar committed read model 以 102/102 steps、success=true 完成,Lark Approval API 回读的真实 PENDING 实例与合成记录一致。公开证据只保留 operation/run/approval/delivery 的 12 位 SHA-256 指纹:2231f328b39d、9c6531877445、043342b4a7c0、35362f37942c。这证明了 edge-timeout 解耦和已部署 adapter 路径,不把 ephemeral backend 描述成重启或跨副本 durable;运维约束见 chrono-sandbox#11,持久化替换目标见 chrono-sandbox#12。
| 主题 | 当前实现(2026-02-22) | 目标态(生产分布式) |
|---|---|---|
| Actor Runtime | 默认 ActorRuntime:Provider=InMemory,适合开发/测试。 | 使用非 InMemory Provider(Redis/数据库等)与分布式 Actor Runtime。 |
| Orleans Transport | ActorRuntime:Provider=Orleans 默认仍走内置链路;可选 ActorRuntime:Transport=Kafka 启用 MassTransit/Kafka 传输插件。 | 生产按部署拓扑启用可插拔 transport,并统一由 stream/queue 层承载跨节点转发。 |
| Projection 启动并发(Ensure/Release) | 已由 projection:{rootActorId} 投影协调 Actor 串行裁决,不再依赖进程内 SemaphoreSlim。 | 分布式 Runtime 下继续依赖“同一 actorId 单激活 + 邮箱串行”保证并发互斥。 |
| LiveSink 绑定(Attach/Detach) | 已通过 workflow-run:{actorId}:{commandId} 事件流订阅/退订;不再依赖 ProjectionContext 内存 sink 列表。 | 在分布式 stream provider 下天然支持跨节点推送;生产需保障 provider 可用性与顺序语义。 |
| ReadModel 存储 | 默认通过 Aevatar.CQRS.Projection.Providers.InMemory 注册通用 InMemory Store,可按 Provider 机制替换。 | 生产默认切换到持久化读模型 Provider,实现跨节点一致读。 |
| 审计评分口径 | 以“当前已落地代码”为准评分。 | 目标态能力上线后,评分按实现结果重新审计。 |
下面这张图概括了「宿主(API + 运行时 + LLM + Connector)」与「多 Agent 协作树 + Workflow 编排步骤」的关系。
%%{init: {"maxTextSize": 100000, "flowchart": {"useMaxWidth": false, "nodeSpacing": 10, "rankSpacing": 50}, "themeVariables": {"fontSize": "10px"}}}%%
flowchart TB
subgraph host["宿主"]
Runtime["运行时\n事件路由 / 存储 / 流"]
Factory["步骤工厂\n步骤类型 → 执行模块"]
LLM["LLM"]
Connectors["Connector\nHTTP·CLI·MCP"]
end
subgraph agents["Agent 树"]
Workflow["工作流 Agent"]
RoleA["角色 A"]
RoleB["角色 B"]
end
subgraph steps["工作流步骤"]
M1["workflow_loop"]
M2["llm_call"]
M3["connector_call"]
M4["parallel / vote"]
end
host --> agents
Factory --> steps
steps --> Workflow
Workflow --> RoleA
Workflow --> RoleB
LLM --> M2
Connectors --> M3
下面这张图从 POST /api/chat 开始,展示通用工作流执行路径:Cognitive 加载 YAML、创建 roles、步骤执行、role 通过 connector 调外部服务、最后 SSE 返回结果。
%%{init: {"maxTextSize": 100000, "flowchart": {"useMaxWidth": false, "nodeSpacing": 10, "rankSpacing": 50}, "themeVariables": {"fontSize": "10px"}}}%%
sequenceDiagram
participant User
participant API as ChatAPI
participant App as WorkflowApp
participant Registry as WorkflowRegistry
participant Runtime as IActorRuntime
participant Projection as ProjectionService
participant Workflow as WorkflowGAgent
participant Engine as workflow_loop
participant LlmStep as llm_call
participant ConnStep as connector_call
participant Role as RoleGAgent
participant LLM
participant External
User->>API: POST /api/chat
API->>App: ExecuteAsync(request)
App->>Registry: resolve workflow yaml
App->>Runtime: create or reuse workflow agent
App->>Projection: StartAsync(actorId, workflowName, input)
App->>Workflow: set yaml and activate
Workflow->>Runtime: create role agents from workflow roles
App->>Workflow: ChatRequestEvent
Workflow->>Engine: StartWorkflowEvent
rect rgb(240, 248, 255)
Engine->>Engine: dispatch StepRequestEvent
alt llm_call
Engine->>LlmStep: step request
LlmStep->>Role: send ChatRequestEvent to role
Role->>LLM: call model
LLM-->>Role: text tokens and final output
Role-->>Engine: StepCompletedEvent
else connector_call
Engine->>ConnStep: step request
Note over ConnStep: check role connector allowlist
ConnStep->>External: invoke connector
External-->>ConnStep: output or error
ConnStep-->>Engine: StepCompletedEvent
else other steps
Engine-->>Engine: conditional parallel vote while
end
Note right of Engine: repeat for each step
end
Engine-->>Workflow: WorkflowCompletedEvent
Workflow-->>App: completion events
App->>Projection: wait + complete
App-->>API: output frames + run report
API-->>User: SSE stream to client
下面这张图是 maker sample 的同类流程:在通用 pipeline 上叠加 maker_recursive / maker_vote,并可在末尾通过 connector 做外部后处理。
%%{init: {"maxTextSize": 100000, "flowchart": {"useMaxWidth": false, "nodeSpacing": 10, "rankSpacing": 50}, "themeVariables": {"fontSize": "10px"}}}%%
sequenceDiagram
participant User
participant API as ChatAPI
participant App as WorkflowApp
participant Runtime as IActorRuntime
participant Workflow as WorkflowGAgent
participant Engine as workflow_loop
participant Recursive as maker_recursive
participant Parallel as parallel_fanout
participant Vote as maker_vote
participant Workers as WorkerRoleGAgents
participant LLM
participant Post as connector_call
participant External
User->>API: POST /api/chat maker_analysis
API->>App: ExecuteAsync(request)
App->>Runtime: create workflow agent
App->>Workflow: set maker yaml and activate
Workflow->>Runtime: create coordinator and worker roles
App->>Workflow: ChatRequestEvent
Workflow->>Engine: StartWorkflowEvent
rect rgb(255, 248, 240)
Engine->>Recursive: enter recursive stage
Recursive->>Parallel: fan out subtasks
Parallel->>Workers: llm_call for workers
Workers->>LLM: generate candidates
LLM-->>Workers: candidate outputs
Workers-->>Parallel: StepCompletedEvent
Parallel-->>Vote: aggregate candidates
Vote-->>Engine: select winner
alt needs deeper decomposition
Engine->>Recursive: recurse on sub tasks
else solved
Engine-->>Engine: continue to next stage
end
Note right of Engine: repeat until all tasks solved
end
Engine->>Post: optional connector call by coordinator
Post->>External: post process output
External-->>Post: processed result
Post-->>Engine: StepCompletedEvent
Engine-->>Workflow: WorkflowCompletedEvent
Workflow-->>App: final output events
App-->>API: final output events
API-->>User: SSE stream and final result
在 YAML 里给步骤填 type: xxx 即可。下面按用途分类,不必全记,用到时查即可。
| 用途 | 步骤类型 | 说明 |
|---|---|---|
| 流程 | workflow_loop | 工作流引擎,按顺序推进步骤。 |
| conditional | 条件分支。 | |
| while / loop | 循环。 | |
| workflow_call / sub_workflow | 调用子工作流。 | |
| assign | 变量赋值。 | |
| 并行与共识 | parallel / fan_out | 多路并行,可指定不同角色。 |
| vote_consensus | 投票共识。 | |
| 执行 | llm_call | 把当前内容发给指定角色的 LLM,回复作为本步输出。 |
| tool_call | 调用已注册工具(如 MCP、Skills)。 | |
| connector_call | 按名称调用 Connector(在 ~/.aevatar/connectors.json 配置)。 | |
| 数据 | transform | 对输入做变换或按模板生成。 |
| retrieve_facts | 从上下文/存储检索事实。 |
更多细节与 Connector 配置见 Aevatar.Configuration。
| 层 | 主要项目 | 职责 | 边界约束 |
|---|---|---|---|
| Domain / Core | Aevatar.Foundation.Abstractions / Aevatar.Foundation.Core / Aevatar.AI.Abstractions / Aevatar.AI.Core / workflow/Aevatar.Workflow.Core / workflow/Aevatar.Workflow.Abstractions | 领域语义、执行原语、事件与状态模型、工作流步骤模块 | 不放协议适配与宿主编排;Workflow.Core 不反向依赖 AI.Core |
| Application | workflow/Aevatar.Workflow.Application.Abstractions / workflow/Aevatar.Workflow.Application / Aevatar.CQRS.Core* | 命令执行编排、查询服务、应用层端口 | 通过抽象依赖 Domain/Projection,不直接耦合 Host 细节 |
| Projection / Read Side | Aevatar.CQRS.Projection.* / Aevatar.Foundation.Projection / Aevatar.AI.Projection / workflow/Aevatar.Workflow.Projection | 统一事件投影、ReadModel 更新、查询输入 | CQRS 与 AGUI 共享同一投影输入链路,避免双轨 |
| Infrastructure | workflow/Aevatar.Workflow.Infrastructure / workflow/Aevatar.Workflow.Presentation.AGUIAdapter / Aevatar.Configuration / Aevatar.Foundation.Runtime.* | 持久化、外部 I/O 适配、运行时实现、AGUI 映射 | 不承载业务编排事实态(run/session/actor 映射) |
| Host / Composition | Aevatar.Mainnet.Host.Api / workflow/Aevatar.Workflow.Host.Api / Aevatar.Capabilities / Aevatar.Bootstrap* | 协议适配(HTTP/SSE/WS)、DI 组合、能力边界支持 | Host 只做宿主与组合,不承载核心业务流程 |
你主要会接触:src/Aevatar.Mainnet.Host.Api 或 src/workflow/Aevatar.Workflow.Host.Api(启动服务)、apps/aevatar-console-web(前端控制台)、~/.aevatar/(配置、Connector 与工作流)。其余目录在二次开发或排查问题时按上面模块地图定位即可。
| Back | FazBrowse Home | New Git URL |