Local Agent
Agent 构造参数
详细说明本地 Agent 的 id、path、instruction、model、env、tools 和 plugins 参数
Agent 构造参数
本地 Agent 的构造方式:
new Agent({
id,
path,
model,
env,
instruction,
tools,
plugins,
Session,
})id
agent 的稳定标识。
它会影响 SDK session 落盘路径:
<projectRoot>/.downcity/agents/<agentId>/...推荐:
- 稳定
- 可 URL 编码
- 不要随便改
因为它直接决定了 session 落盘目录分区。
path
当前 agent 绑定的项目根目录。
SDK 会基于它:
- 读取项目配置
- 组织会话落盘目录
如果 path 给错,后面很多行为都会变得不符合预期,因为 Agent 会在错误上下文里读取配置和写数据。
instruction
调用方传入的本地 SDK Agent 静态基础指令。
new Agent({
id: "repo-helper",
path: "/path/to/project",
instruction: [
"你是一个简洁的代码助手。",
"解释代码时优先给出明确文件引用。",
],
});关键点:
instruction是静态的,应该保持缓存友好- SDK 不会对它做动态变量渲染
- SDK 不会自己读取
PROFILE.md或SOUL.md - 如果省略
instruction,SDK 会使用包内最小 core instruction 作为 fallback
如果 city 这类宿主希望项目 markdown 文件影响 agent,应由宿主自己读取文件,并把最终文本通过 instruction 传入。
model
这个 agent 下新建 session 的默认 LanguageModel 实例。
new Agent({
id: "repo-helper",
path: "/path/to/project",
model: openai.responses("gpt-5"),
});关键点:
- SDK 不负责帮你解析 provider 或 model ID
- 宿主仍然需要先自己创建
LanguageModel实例 - 它会成为这个 agent 的 session 默认执行模型
- 你仍然可以对某个 session 单独调用
session.set({ model })做覆写
env
这个 agent 可见的环境变量快照。
new Agent({
id: "repo-helper",
path: "/path/to/project",
env: {
OPENAI_API_KEY: process.env.OPENAI_API_KEY ?? "",
},
});关键点:
- SDK 只消费你显式传入的环境变量集合
- SDK 不再区分 global env 和 agent env
- 如果宿主需要合并多层 env,应先在外部合并,再把最终结果传给
env - 这些值会参与配置解析与运行时上下文装配,但不会自动回写系统环境变量
tools
agent 级默认工具集合。
关键点:
- 它属于 agent 级,不是 session 级
- 当前 agent 创建出来的 session 会直接复用这份工具集合
这很适合“多个 session 共用一套默认工具能力”的场景。
plugins
这里接收的是已经实例化好的 BasePlugin 对象。
例如:
import { Agent } from "@downcity/agent";
import { SkillPlugin, WebPlugin } from "@downcity/plugins";
const agent = new Agent({
id: "repo-helper",
path: "/path/to/project",
tools: {},
plugins: [new SkillPlugin(), new WebPlugin()],
});SDK 会为当前 Agent 创建独立的 plugin registry。
关键点:
- 应该传
new SkillPlugin()这类实例,而不是原始 plugin 定义对象 - 它不会默认注册全部内建 plugin
- 它不会复用全局 runtime 的 plugin manager
- 同名 plugin 被重复注册时会直接报错
agent.plugins与AgentContext.plugins会使用这份 registry- 如果你想一次性注入整套内建 plugin,可以从
@downcity/plugins传入plugins: createBuiltinPlugins()
Session
本地 session 的高级自定义类。
当你希望替换本地 session 实现,或者在 Session 层注入自定义 Composer 时使用它。Agent 只负责用这个类创建和恢复 session,不理解 Composer 的具体策略。
import {
Agent,
Session,
type SessionOptions,
type SessionSystemComposer,
} from "@downcity/agent";
const systemComposer: SessionSystemComposer = {
name: "custom_system",
async resolve() {
return [{ role: "system", content: "始终简洁回答。" }];
},
};
class CustomSession extends Session {
constructor(options: SessionOptions) {
super({
...options,
composers: {
systemComposer,
},
});
}
}
const agent = new Agent({
id: "repo-helper",
path: "/path/to/project",
Session: CustomSession,
});关键点:
- 传入的是 class,不是已经创建好的 session 实例
- 这样
Agent可以按不同sessionId创建多个 session - Composer 自定义留在自定义 Session 类内部
RemoteAgent不支持本地 Session 类,因为它只是远程 runtime 的访问器