Agent

Agent SDK

在 Node 应用中嵌入 Downcity Agent 运行时

Agent SDK

@downcity/agent 用于在同一进程中创建 Agent、管理 Session 并执行模型调用。完整 API 参考在 Agent SDK 文档

import { Agent } from "@downcity/agent";

const agent = new Agent({
  id: "repo-helper",
  path: process.cwd(),
  prepare_session: async (session) => await session.set({ model }),
  tools: { search: search_tool },
  plugins: [plugin],
  env: { API_KEY: process.env.API_KEY ?? "" },
});

const session = await agent.sessions.create();
const turn = await session.prompt({ query: "检查当前项目" });
const result = await turn.finished;

await agent.dispose();

Agent 在构造时启动 plugin 生命周期与后台任务;需要明确等待就绪时使用 await agent.ready(),关闭时使用 await agent.dispose()。HTTP 与 RPC 由独立包 @downcity/serverAgentHTTPAgentRPC 提供。

流式消息

subscribe() 返回统一的实时 Session Mutation:

const unsubscribe = session.subscribe((mutation) => {
  if (mutation.variant === "delta" && mutation.type === "text") {
    process.stdout.write(mutation.delta);
  }
});

Tool 生命周期统一使用 variant: "part"type: "tool"。等待用户决定的 unrestricted 请求会在 mutation.part.approval 中携带完整审批信息;审批决定通过独立的 Session 命令提交,不通过事件回调回复:

const unsubscribe = session.subscribe((mutation) => {
  if (
    mutation.variant === "part" &&
    mutation.type === "tool" &&
    mutation.part.state === "approval-required" &&
    mutation.part.approval
  ) {
    const { approval_id, command, cwd, reason } = mutation.part.approval;
    show_approval({ approval_id, command, cwd, reason });
  }
});

async function decide_approval(approval_id: string, decision: "approved" | "denied") {
  await session.resolve_approval({ approval_id, decision });
}

历史快照使用 session.messages();连接断开后重新读取快照并建立新的订阅。

继续阅读:完整 Agent SDK 文档