ObjectOS
构建

Agents

面向终端用户的 AI 助手 —— Agent → Skill → Tool —— 由你的数据和操作连接而成。

Agents

Agents 是供你的终端用户对话的 AI 助手 —— 服务台副驾、销售 BDR、内部 HR 问答机器人。它们构建在你已经定义好的数据和操作之上;你无需编写新代码,只需将现有的基本要素组合成一个角色。

三层架构,与 Salesforce Agentforce、Microsoft Copilot Studio 和 ServiceNow Now Assist 保持一致:

Agent  ──→  Skill  ──→  Tool
(persona)   (capability)  (callable function)
层级它是什么示例
Tool单个可调用函数(操作、查询、知识搜索、MCP 方法)create_ticketget_order_statussearch_kb
Skill一组相关 tool 的命名集合,带有共享的 LLM 指令ticket_management = create + update + close + escalate
Agent一个角色,具有职责、系统提示、所附 skill 和知识tier1_support = 富有同理心、会验证身份、拥有 ticket_management + kb_search

定义一个 Agent(单个文件)

// src/agents/tier1_support.agent.ts
import { defineAgent } from '@objectstack/spec/ai';

export const tier1Support = defineAgent({
  name: 'tier1_support',
  label: 'First Line Support',
  role: 'Help Desk Assistant',
  instructions: `
    You are a friendly first-line support agent.
    Always verify the user's identity before discussing account specifics.
    Escalate to tier 2 if the issue involves billing or security.
  `,
  skills: ['ticket_management', 'knowledge_search'],
  knowledge: {
    topics:  ['faq', 'policies'],
    indexes: ['support_docs'],
  },
  model: { provider: 'openai', model: 'gpt-4o', temperature: 0.3 },
  memory: { shortTerm: { maxMessages: 30 } },
});

或者在 Console 中:Console → Agents → New Agent

又或者 —— 这才是重点 —— 对 AI Builder 说:

"创建一个一线支持 agent,处理工单管理并搜索 FAQ。在讨论账户细节之前,它应当先验证身份。"

定义一个 Skill

// src/skills/ticket_management.skill.ts
import { defineSkill } from '@objectstack/spec/ai';

export const ticketManagement = defineSkill({
  name: 'ticket_management',
  label: 'Ticket Management',
  instructions: `
    Always confirm the ticket subject and priority before creating one.
    Use 'urgent' priority sparingly — only for outages or security incidents.
  `,
  tools: [
    'create_ticket',
    'update_ticket',
    'close_ticket',
    'escalate_ticket',
    'action_*',         // wildcard: pick up any future actions on the active object
  ],
});

Skill 是最适合复用的单元。一个 skill 可以服务多个 agent。

Tool 来自你声明的元数据

你声明的每个 *.action.ts 都会自动具现为一个 action_<name> tool —— 无需另外连接。因此,如果你已经在 support_ticket 对象上将 escalate_ticket 定义为一个 Action,那么 AI Builder 和你的 Agents 都能调用它。权限仍然生效:agent 以用户身份调用该操作,因此能否成功由该用户的权限集决定。

你还可以暴露:

Tool 类型来源
Action已安装的任何包中的任意 *.action.ts
Flow任意手动 flow(type: 'manual'
Query已保存的 ObjectQL 查询(*.query.ts
Knowledge search附加到 agent 的任意知识索引
MCP method接入的 MCP 服务器所暴露的任意内容
内置元数据 toolcreate_objectadd_field…… —— 但仅对管理员 agent 开放

环境助手模式

如果你想要整个应用只有一个聊天框(Claude Code / Agentforce 风格),而不是强迫用户去挑选某个 agent,那就在 App 元数据上声明一个 defaultAgent,并带上 app 上下文调用环境聊天端点:

POST /api/v1/ai/chat   { context: { appName: 'crm' }, ... }

context.appName 解析到一个声明了 defaultAgent 的 app 时,运行时会自动选择该 agent —— 用户永远无需从列表中挑选。Console 内置的 AI 面板正是这样工作的。运行时会解析:

  1. 当前 app 的默认 agent(即 app 的 defaultAgent),或用户有权访问的第一个 agent。
  2. 激活的 skill —— 从 Skill Registry 加载的 agent skills: 列表,并按用户权限集以及当前对象/记录上下文进行过滤。
  3. 附加到该 agent 的知识

你不必去连接哪个 agent 显示在哪里。声明一个 app,设置它的 defaultAgent,它便会出现。

权限

能力权限
与 agent 对话ai:chat(以及对该 agent 各 skill 所含 tool 的访问权)
审批元数据变更ai:approve
定义 / 编辑 agent 和 skillai:author(通常是 Setup Administrator)
读取 AI 对话(审计)ai:read

对话以用户为范围 —— 除非有委派授权,否则一个用户无法看到另一个用户的聊天记录。

记忆与会话状态

agent 的 memory 块有两个层级:

字段作用
shortTerm.maxMessages保留在工作记忆中的近期消息数(默认 50
shortTerm.maxTokens短期上下文窗口的可选 token 预算
longTerm.enabled跨会话持久化记忆(默认 false
longTerm.store持久化记忆的后端:vector(默认)、databaseredis
reflectionInterval每 N 次交互反思一次,以优化行为

实时上下文窗口的裁剪由会话的 token 预算策略决定 —— sliding_window(默认)、fifoimportancesemanticsummary

会话记录存于 ai_conversations。Tool 调用结果与待执行的操作都会反向引用其原始会话以便审计。

可观测性

每次 agent 运行都会发出:

  • audit:ai:chat 事件(每轮一条)
  • audit:ai:tool 事件(每次 tool 调用,含输入 + 输出)
  • audit:ai:pending_action 事件(变更入队时)
  • token 计数指标(按模型、按 provider)进入审计日志,用于成本分摊

你可以把这些接入你常用的可观测性技术栈 —— 见 Observability

多租户说明

Agents 是按 Environment 划分的。租户 A 的 tier1_support agent 永远看不到租户 B 的数据、对话或知识 —— 即便你在某个 marketplace 包里分发的是同一份 agent 定义。

下一步去哪里

  • AI Builder —— 构建期助手
  • IDE Skills —— npx skills add objectstack-ai/framework,让你的 IDE agent 正确地编写元数据
  • Actions —— 声明你的 agent 将使用的 tool
  • AI Service —— provider、embedder、MCP 设置
  • @objectstack/spec/ai —— 完整 schema

On this page