@downcity/agent 是 Downcity 的单 Agent 运行时包。
它负责把一个 agent 项目目录装配成可执行运行时,包括:
- 本地 SDK:
Agent、Session、RemoteAgent - 会话执行内核:history、system、tool loop、增量输出
- Service 框架:生命周期、action、调度
- Plugin 框架:hook、action、内建插件
- 运行时实现:HTTP/RPC server、transport、sandbox、host
@downcity/city 负责多 Agent 管理、控制面网关、平台 CLI、模型池与 daemon 进程管理;@downcity/agent 只负责单 Agent 执行内核。
- 面向单个 Agent 项目的执行面
- 对外通过
@downcity/agent根入口暴露公共 API - 负责 session、service、plugin、sandbox、HTTP/RPC server、SDK 本地 Agent
- 不负责多 Agent registry、control plane daemon、console UI 聚合和平台级编排
@downcity/agent- 单 Agent runtime
- 单 Agent HTTP/RPC server
- session 执行、service 框架、plugin 框架、sandbox
- 本地 SDK facade
@downcity/city- 多 Agent registry
- control plane / gateway
- 平台 CLI、模型池、模型工厂、全局 env、channel account store
- agent daemon 进程管理
@downcity/ui- React UI 组件与展示层
packages/agent
├── bin/ # 构建输出目录
├── scripts/ # 构建辅助脚本
├── src/ # 源码目录
├── package.json # 包信息、导出面、脚本
├── README.md # 包结构说明
└── tsconfig.json # TypeScript 配置
src/
├── index.ts # 包公开入口,集中导出外部可依赖的 API 与协议类型
├── config/ # 配置与项目初始化,负责 downcity.json、默认配置、execution binding 与脚手架
│ └── project/ # Agent 项目初始化与项目初始化类型
├── core/ # 单 Agent 运行时装配中心,负责 AgentCore / AgentContext
├── plugin/ # 插件系统,负责插件注册、hook、action、内建插件与插件类型
├── runtime/ # 运行时实现细节层,统一收纳 host / sandbox / server / transport
│ ├── host/ # 宿主注入能力与 daemon 协议
│ ├── sandbox/ # 命令沙箱与沙箱协议
│ ├── server/ # HTTP / RPC 服务端实现
│ └── transport/ # 调用端 transport 协议与 RPC client
├── sdk/ # 本地 SDK facade,提供 Agent / RemoteAgent / Session 等高层 API
│ └── session/ # SDK session 的 metadata、落盘路径、持久化与 service 端口适配
├── service/ # Service 系统,负责内建服务、生命周期、调度与 service 类型
│ └── core/ # Service 核心控制层,包含 schedule 基础设施
├── session/ # 会话执行内核,负责历史、system、tool loop、增量输出与消息持久化
├── types/ # 跨模块共享协议类型,集中放置 common / config / runtime 等稳定契约
└── utils/ # 低层工具,负责 CLI、日志、存储与模板辅助
-
src/config/- 项目配置、项目级路径解析与项目初始化
project/收口 agent 项目脚手架与初始化结果类型- 负责
downcity.json、项目 env、.downcity/*路径规则与 execution binding
-
src/core/- 单 Agent 装配中心
AgentCore负责把 config、session、service、plugin、runtime 组装成一个实例级执行内核AgentContext提供统一能力面,供 session / service / plugin 复用
-
src/sdk/- 本地 SDK facade
- 包括
Agent、RemoteAgent、Session与sdk/session/* Agent.ts通过start()/stop()统一收口长期运行生命周期sdk/session/*负责 SDK session metadata、落盘路径、持久化与 service 端口适配
-
src/runtime/- 单 Agent 的运行时实现细节层
host/放宿主注入能力与 daemon 协议sandbox/放命令执行隔离与沙箱协议server/放 HTTP / RPC 服务端实现transport/放 agent client 侧 transport 协议与 RPC client- 模型实例解析不在
agent包内完成,而由宿主先创建LanguageModel,再通过new Agent({ model })或session.set({ model })注入
-
src/plugin/- 插件框架与内建插件
core/负责注册、启用态、hook 调度、本地 actionbuiltins/放auth、skill、web、asr、tts、voice、workboard等内建插件types/放插件公共协议类型
-
src/service/- 单 Agent service 域
core/负责 service class 注册、状态控制、action 调度与系统提示core/schedule/负责持久化 service action 调度基础设施builtins/放chat、contact、task、memory、shell等内建 servicetypes/放 service 公共协议类型
-
src/session/- 会话执行内核
Session是 SDK 用户面对的会话整体,Executor是内部单轮执行引擎- Store 负责 history 事实源落盘,Composer 是纯 interface 协议,负责组装 system / history / context / compaction
Executor.prepareExecuteInput()串起四类 Composer,Executor.runCoreEngine()负责进入模型 tool loop- 负责 history、system、context、CoreEngine、增量输出与消息持久化
-
src/types/- 跨模块、跨包共享协议类型
common/放 JSON、模板等无领域依赖的基础类型config/放downcity.json、LLM、execution binding、start options 等配置契约runtime/放 auth、daemon、host、http、platform、rpc 等运行时与控制面共享协议- 领域内部类型仍保留在对应领域目录,例如
service/types/、plugin/types/、session/types/
-
src/utils/- 包内通用工具、日志、CLI 输出与存储辅助
@downcity/agent 的核心是一条单 Agent 执行链:
入口协议 -> AgentCore -> AgentContext -> Session / Service / Plugin -> Runtime 子系统 -> History / Reply
其中:
sdk是用户 API 面core是实例级装配中心session / service / plugin是三大领域子系统runtime是 server / transport / sandbox / host 这类实现细节的统一容器types / utils提供横向公共支撑
本地嵌入时:
import { Agent } from "@downcity/agent";
import { createOpenAI } from "@ai-sdk/openai";
const openai = createOpenAI({
apiKey: process.env.OPENAI_API_KEY!,
});
const agent = new Agent({
id: "demo",
path: process.cwd(),
tools: {},
model: openai.responses("gpt-5"),
});
const session = await agent.session();
const turn = await session.prompt({
query: "总结一下当前仓库结构",
});
const result = await turn.finished;如果要把它暴露成长期运行实例:
const started = await agent.start({
http: {
host: "127.0.0.1",
port: 15314,
},
rpc: true,
});
console.log(started.http?.baseUrl);也就是说:
- 不调用
start():library mode - 调用
start():long-lived runtime mode - 模型由调用方创建并通过
new Agent({ model })或session.set({ model })注入,SDK 不提供默认模型策略 new Agent({ model })适合给这个 Agent 的 session 提供统一默认模型;session.set({ model })适合做单个 session 的覆写