Agent
Agent SDK 是什么,以及如何运行 Agent 工作
Agent SDK (@downcity/agent) 是执行 Agent 工作的核心运行时。Agent 负责身份、模型、指令、
Tool 与唯一的 AgentSessions 集合;每个 Session 可以接收一个 Workspace。City 持有 Workspace、
Power 唯一实例、Agent/Group 集合与 transport。
Agent 做什么
- 读取项目配置(构造参数或项目目录)
- 维护会话和对话历史
- 在执行过程中调用工具
- 使用 City 投影到当前作用域的 Power 能力
- 绑定到模型进行推理
创建 Agent
在 Desktop 中点击“创建 Agent”会进入独立创建页面。你可以用自然语言描述想要的角色,让系统默认模型自动生成名称、简介、角色指令和推荐 Powers;也可以选择“手动配置”,从空白草稿开始填写。AI 只负责生成可编辑草稿,确认后才会真正创建 Agent。
创建时不需要手动设计内部 ID。Desktop 会根据名称生成稳定 ID;例如“研究助手”会生成 yan_jiu_zhu_shou。
AI 生成和 Agent 运行模型都默认选中 Desktop 设置中的系统默认文本模型,也可以分别调整;仅当默认模型不可用时才回退到第一个可用文本模型。Desktop 页面统一展示 Agent 名称,稳定 ID 只用于内部路由和存储。
名称和简介用于联系人列表与对话中的身份展示。内部 ID 继续用于本地目录、API 引用和运行时身份;如果名称生成的 ID 已存在,Desktop 会要求换一个名称,不会隐式追加随机后缀。
创建后可以在 Agent 配置中继续修改名称和简介。修改名称不会改变稳定 Agent ID,因此已有 Session、Group 引用和 Power 数据路径保持不变。
Agent 配置中的“删除 Agent”会永久删除该 Agent 的定义、头像、Session、日志、Schedule 与 Agent 作用域的 Power 数据。正在执行任务或仍属于 Group 的 Agent 不能删除,需要先结束执行或将它移出相关 Group。
Desktop 完成提醒
当 Agent Session 在后台完成一次 Turn 时,Desktop 会在 Chat Sidebar 的 Agent 和下方对话列表的对应 Session 上显示蓝色未读圆点,并在系统应用图标上显示未读 Session 数量。正在前台查看该 Session 时不会产生未读;打开对应 Session 后,圆点和系统角标会同步清除。多次完成同一个 Session 只计为一个未读项。
创建 Group
点击“创建 Group”会进入独立创建页面。你可以描述团队目标,让所选模型根据当前已有 Agent 生成 Group 名称、协作目标和推荐成员;也可以从空白配置手动选择模型与成员。AI 结果在确认前始终只是可编辑草稿。
创建 Group 时只填写用户可见名称,内部 group_id 由 Desktop 根据名称自动生成。创建后可以修改名称、协作目标、模型与成员,但稳定 group_id 不会改变。Group 头像由成员 Agent 的头像组合展示。
import { Agent } from "@downcity/agent";
import { City } from "@downcity/city";
import { create_builtin_power_registrations } from "@downcity/powers";
import { Workspace } from "@downcity/city";
import { Shell } from "@downcity/city";
import { MicrosandboxProvider } from "@downcity/sandbox-microsandbox";
const agent = new Agent({
id: "repo-helper",
model: myModel,
tools: { my_tool: myTool },
});
const workspace = new Workspace({
id: "project",
path: "/path/to/project",
shell: new Shell({
sandbox_provider: new MicrosandboxProvider(),
}),
});
const city = new City({
workspaces: [workspace],
powers: create_builtin_power_registrations(),
});
city.agents.add(agent);从历史消息创建 Session 分支
session.fork() 默认保留锚点消息。编辑并重新发送历史消息时,可以排除原消息,让新 Session 从修改后的内容继续:
const forked_session = await session.fork({
message_id,
include_message: false,
});需要在当前对话中替换历史时,传入 replace: true:
await session.fork({ message_id, include_message: false, replace: true });这会原地移除锚点及后续消息,保留当前 Session ID 与配置,不创建分支、不归档、不添加操作提示。当前 Session 必须空闲;省略 message_id 时不改变历史。Desktop 的“替换当前对话”使用该方式。
设置 Desktop Agent 头像
Desktop 会从用户级 Agent 目录读取头像。将图片放在对应 Agent ID 目录下即可:
~/.downcity/agents/<agent_id>/avatar.png也支持 avatar.jpg、avatar.jpeg 和 avatar.webp,头像文件大小限制为 2 MiB。未配置头像时,Desktop 使用默认图标。
新建 Agent 时,Desktop 会从内置像素头像池随机选择一张并保存为该 Agent 的独立头像。在 Agent 详情页点击头像,可以再次随机选择内置头像或上传自定义图片。
关键概念
- City — 持有 Workspace、Power 唯一实例、Agent/Group 集合与统一 transport。
- Session — 一个执行线程。Agent 按需创建会话,并通过它们路由消息。
- Tool — Agent 在执行过程中可调用的函数。直接传给构造函数。
- Power — 由 City 提供和维护,并自动投影给全部 Agent 的扩展能力。
- Model — 推理后端。Agent 持有默认实例,Session 可设置自己的实例并优先使用。
Agent 不做什么
- 不管理多个项目(那是 CLI / 控制台层)。
- 不拥有模型目录(那是 City / Federation)。
- 不持久化全局凭证(那是 City)。
保持这些边界清晰,你很容易回答:模型应该在哪配置?机器人凭证应该放在哪?这是控制平面故障还是项目运行时故障?
执行模型
Agent 执行模型很简单:
- 接收消息或任务
- 加载会话上下文(历史、工具、Power、提示词)
- 调用模型
- 如果模型要求调用工具,执行它并继续
- 返回结果
继续阅读: