Agent SDK

理解 @downcity/agent 提供的本地 Agent、远程 Agent、Session,以及它与 City AIService 的关系

Agent SDK

@downcity/agent 当前提供两类主要 SDK 入口:

  • Agent:本地嵌入式 agent
  • RemoteAgent:远程 agent 客户端

这套 SDK 的核心是 session。无论本地还是远程,真正承载执行的都是 session,而不是 Agent 本身。

两条常见使用路径

1. 纯 SDK 嵌入模式

这种模式下,宿主自己持有模型实例:

  • new Agent({ model })
  • await session.set({ model })

适合:

  • Node 服务内直接嵌入
  • 本地脚本或内部工具
  • 你已经自己管理模型实例

2. Downcity / Town / City 集成模式

这种模式下,Agent 项目不直接持有 provider、API key 或模型实例。

模型目录和 provider 细节由 City AIService 持有,Agent 项目只绑定:

{
  "execution": {
    "type": "api",
    "modelId": "quality"
  }
}

适合:

  • 正常的 Downcity Agent 项目
  • 多个 Agent 共享同一套模型池
  • 希望把 provider、key、模型目录统一收口到 City

什么时候用 Agent

当你的应用和 agent 运行在同一进程,或者至少在同一个本地运行环境里,适合直接用:

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

你可以显式传入:

  • id
  • path
  • tools
  • instruction
  • model
  • plugins

它更像本地嵌入式执行壳。

什么时候用 RemoteAgent

当另一个进程已经把 agent 暴露出来时,适合用:

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

然后通过:

new RemoteAgent({ url: "http://127.0.0.1:15314" })

去连接它。

RemoteAgent 当前支持:

  • http://...
  • https://...
  • rpc://...

它更像配套的远程客户端,而不是模型宿主。

共同的核心对象:Session

无论是本地还是远程,SDK 的核心使用面都围绕 session:

  • createSession()
  • getSession()
  • listSessions()
  • getInfo()
  • prompt()
  • subscribe()
  • history()
  • system()
  • fork()

现在统一的交互模型是:

  • const turn = await session.prompt(...)
  • session.subscribe(...)
  • await turn.finished

大多数 SDK 使用问题,最终都会落到“session 应该怎么创建、配置和消费”。

一个重要差异

纯本地 SDK session

本地 SDK session 的模型可以来自:

new Agent({ model })

或者:

await session.set({ model })

Downcity Agent 项目

项目 runtime 的模型来自:

  • downcity.json.execution.modelId
  • 已连接的 City AIService 模型目录

也就是说,在 Downcity 集成模式里:

  • Agent 项目只保存 modelId
  • Town 负责去 City AIService 解析这个 modelId
  • provider、key、baseURL 都不放在 Agent 项目里

远程 SDK session

远程 session 当前不支持直接传本地模型实例。

这是因为远程模式下,模型实例应该留在服务端本地持有,而不是由客户端携带。

推荐阅读顺序

  1. 本地 Agent
  2. Agent 与 City AIService
  3. Session
  4. Plugin 总览
  5. 远程 Agent
  6. SDK Surface
  7. API 参考

相关文档