注册 AI 员工

AI 员工的 TypeScript 定义负责稳定身份、展示信息、默认角色设定以及 Skill 和 Tool 的初始绑定。管理后台可以在此基础上调整启用状态和用户可编辑配置,不过 username 和源码拥有的基础定义仍应保持稳定。

创建员工定义

在 server/ai/employees/customer-success/index.ts 中默认导出 defineAIEmployee() 的结果:

import { defineAIEmployee } from '@nocobase/ai-employee';

export default defineAIEmployee({
  username: 'customer-success',
  category: 'business',
  nickname: 'Customer Success',
  position: 'Customer success specialist',
  description: 'Reviews customer context and prepares follow-up actions.',
  bio: 'I help account teams understand customer needs and plan the next step.',
  greeting: 'Share a customer record or ask me to prepare a follow-up.',
  systemPrompt: `You are a customer success specialist.
Use only the business context and Tools available in the current conversation.
Never invent customer facts, commitments, or dates.
Ask one precise question when required information is missing.`,
  // `find-customer` 由这个 Skill 点名,加载 Skill 时一并激活,不用再列进 tools
  skills: ['customer-follow-up'],
  chatSettings: {
    systemPromptMode: 'default',
    enableSkills: true,
    enableTools: true,
  },
  sort: 100,
});

username 会被会话、任务、快捷入口和服务端调用保存下来。员工投入使用后,不要通过修改 username 来改名;只修改 nickname 或其他展示字段。

字段说明

字段是否必填说明
username是员工的稳定唯一标识
category否员工分类,业务员工通常使用 business
description否员工用途的简短说明
avatar否头像键或应用支持的 URL
nickname否界面显示名称
position否职位或角色标签
bio否员工介绍
greeting否新会话空状态中的问候语
systemPrompt否基础角色设定,可以是字符串、null 或省略
skills否已注册 Skill 的名称数组
tools否{ name, autoCall? } 数组,名称必须已经注册
chatSettings否控制系统提示词模式以及 Skill、Tool 是否参与对话
sort否列表排序值

skills 和 tools 不是同一件事的两种写法。只要有任何已注册的 Skill 点名了某个 Tool,这个 Tool 对所有员工都不再是基础 Tool,要等会话加载那个 Skill 之后才可用;把它列进员工的 tools 也不会让它提前出现。所以 tools 只用来列没有被任何 Skill 点名的 Tool。

autoCall 只对 CUSTOM Tool 生效,SPECIFIED 和 GENERAL Tool 是否自动执行只看 defaultPermission === 'ALLOW'。对列进 tools 的 CUSTOM Tool,autoCall 会完全取代 defaultPermission:autoCall: true 会跳过确认,即使 Tool 声明的是 ASK;不写 autoCall 则需要确认,即使 Tool 声明的是 ALLOW。另外,员工第一次注册时 autoCall 会写入数据库,之后以数据库里保存的值为准,再改代码里的 autoCall 不会影响已部署的员工,需要管理员在设置页修改。

chatSettings.systemPromptMode 支持 default、raw 和 none。默认使用 default 就够了;只有需要完整替换或关闭默认系统提示词拼装时,才使用另外两种模式。

注册员工

从 server/ai/index.ts 静态 import 这个定义,并在 registerAIEmployees() 中调用:

protected override async registerAIEmployees(
  manager: AIEmployeeManager,
): Promise<void> {
  await manager.registerEmployee(customerSuccess);
}

这里没有 Employee 文件系统扫描。目录名也不会自动成为 username,实际注册值只来自 defineAIEmployee()。

相关链接