AgentOverview

Agent 执行模型

理解 Agent 如何绑定模型、创建会话,并复用统一执行内核

Agent 执行模型

当前版本的项目 agent 只有一种项目执行绑定方式:api

当前支持的执行绑定

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

含义是:

  • 当前项目使用已连接 City AIService 中的某个模型
  • 项目本身只保存 modelId
  • 模型的 provider、密钥和模型名由 City 侧模型目录管理

这一点和过去一些“项目内直接写 provider 配置”的做法很不一样。当前实现里,项目只声明执行目标,不重复保存完整模型定义。

运行时如何工作

agent 启动后,大致会做这些事情:

  1. 读取项目配置
  2. 解析 execution.modelId
  3. 从 City AIService 解析出最终模型
  4. 创建 session 执行器
  5. 把系统提示词、历史消息、工具和模型一起送入执行链

从心智模型上看,一次执行大致可以理解成:

项目配置 + 静态提示词 + 会话历史 + 工具集合 + 当前模型

被组合成一轮执行上下文。

为什么项目只保存 modelId

这样做有几个好处:

  • 多个项目可以共用同一个模型配置
  • API key 不需要重复保存在每个项目里
  • 切换项目模型时,只改一个绑定字段

这也让权限和运维边界更清楚:

  • 模型目录归City runtime 维护
  • 项目只负责“我选哪个模型”

普通聊天和 SDK 会复用同一套内核吗

是的。

无论你从哪里进入:

  • town agent chat
  • 聊天渠道消息
  • task 执行
  • SDK Agent / RemoteAgent

底层都会回到统一的 session 和 executor 体系。

这对用户的直接影响是:

  • 你在 CLI 里观察到的很多行为,在 SDK 里也能找到对应形态
  • 你对“会话、历史、工具调用、输出流”的理解可以在多个入口复用

SDK 本地 Agent 的区别

SDK 本地 Agent 允许你在应用代码里显式传入:

  • tools
  • plugins
  • model
  • session 级 model

这和项目 runtime 有一点不同:

  • 项目 runtime 的模型来自 downcity.json.execution.modelId
  • SDK 本地执行可以来自 new Agent({ model }),也可以对单个 session 调 session.set({ model })

这也是本地 SDK 最常见的踩坑点之一:你以为 SDK 会自动从项目配置里帮你把运行中的模型实例准备好,但当前实现不是这样。

也就是说,如果你既没有:

  • new Agent({ model }) 里提供默认模型

也没有:

  • 对某个 session 显式 set({ model })

那么本地 SDK 执行会因为缺少模型而失败。

继续阅读