Skip to content

架构总览

DotCraft 是使用 .NET 10 / C# 构建的 Agent Runtime。它按程序集划分职责:与模型提供商无关的 Agent 基础、产品内核、可复用的宿主能力、对外协议,以及官方应用的组合根。本页为集成方和贡献者定义这些边界。

DotCraft 运行时架构拓扑图

程序集边界

上层组件只依赖其下方的基础层:

text
DotCraft.App(官方组合根)
  |-- DotCraft.Runtime
  |     `-- DotCraft.Core
  |           `-- DotCraft.Agents
  |-- DotCraft.AppServer
  |     |-- DotCraft.Core
  |     `-- DotCraft.Protocol
  |-- 模型提供商
  `-- 可选功能
组件职责
DotCraft.Agents与模型提供商无关的 Agent API、提供商契约、公共中间件、工具循环与提示缓存选择
DotCraft.Core产品内核,负责会话、Agent 编排、工具、上下文、记忆、技能、插件、安全、配置、模块与工作区语义
DotCraft.Runtime面向工作区的可复用依赖注入注册与 Generic Host 生命周期
DotCraft.ProtocolAppServer 与协议客户端共用的传输契约
DotCraft.AppServerJSON-RPC 请求处理、契约映射、连接状态,以及 stdio 和 WebSocket 传输
DotCraft.App官方组合根,负责进程入口、模型提供商、可选功能、日志与进程策略
功能程序集基于 Core 契约实现 Automations、Dynamic Workflows、渠道等功能行为

Core 构建在与模型提供商无关的 Agents 基础之上。Runtime 与功能程序集构建在 Core 之上。AppServer 把 Core 的领域能力映射为 Protocol 契约。官方 App 挑选这些组件,并在组合边界接上各功能专用的协议适配器。Runtime 与 AppServer 共用宿主持有的同一个 ISessionService

模块发现与能力接口

DotCraft.Generators 在编译期发现实现 IDotCraftModule 的模块。基础契约定义模块标识、配置检查与依赖注入注册。模块按自己提供的能力实现对应的接口:

能力接口提供的能力
IToolSourceModule向 Agent Runtime 提供工具源
IChannelServiceModule提供托管的渠道服务
ISessionChannelModule提供渠道所暴露的会话来源

DotCraft.App 负责宿主选择与进程组合。宿主工厂通过 IModuleHostComposition 决定每个官方宿主的服务图包含哪些模块。

Session Core

Session Core 定义 Thread → Turn → Item 模型。ISessionService 是进程内的中心 API,负责 Thread 生命周期、输入提交、事件、审批和用户输入请求。

CLI、ACP、Automations 与渠道适配器使用同一个 Session Core 和持久化 Thread 模型。传输边界只投影该模型,不改变其领域语义。模型与生命周期详见统一会话核心

AppServer

AppServer 是 Session Core 之上可选的协议与传输边界,由宿主持有。它通过 stdio 和 WebSocket 上的 JSON-RPC 2.0 投影 ISessionService,把 Core 领域模型映射为 DotCraft.Protocol 契约,并管理连接级资源。

Desktop、CLI、ACP、外部渠道适配器和 SDK 客户端都可以使用这个进程外边界。详见 AppServer 协议AppServer 模式

Hub

每个用户在本机有一个 Hub。Hub 为每个工作区启动或复用一个 AppServer,并在 ~/.craft/hub/ 下维护发现信息与锁。Desktop 与 CLI 默认使用 Hub。远程、CI、机器人和协议调试场景可以直接管理 AppServer。

官方宿主中的配置

官方 DotCraft.App 宿主默认加载以下配置层:

层级路径作用
全局~/.craft/config.json模型提供商凭据、端点与个人偏好
工作区<workspace>/.craft/config.json模型选择、入口开关、自动化与安全策略

配置策略由宿主负责。DotCraft.App 合并全局与工作区两层,在组合 Runtime 时提供最终的 AppConfig,Core 与 Runtime 都使用这份配置。模块用 [ConfigSection("Key")] 声明自己的配置节,源生成器把这些配置节纳入合并后的配置模式。

字段说明见配置参考,配置何时生效见设置生效层级