关于 automation-architecture
automation-architecture 是将客户用例转化为具体 Nexor 配置的技能。它围绕明确的数据字段、工作流状态、Agent 边界和平台原语组织需求,并优先选择配置而非代码。
主要功能
- 01将信息映射到字段和元数据
- 02以工作流状态表示状态变化
- 03在转移边界拆分 Agent 模式
- 04从 Nexor 配置原语中选择方案
- 05优先使用配置而非自定义代码
适用场景
- 01设计线索采集与资格判断工作流
- 02规划不同 Agent 意图之间的交接
- 03为提醒和集成选择配置原语
- 04检查工作流门控是否可读取所需数据
MCP 相关
该技能涉及 Nexor MCP 工具,包括 `create_workflow`、`update_workflow_structure` 和 `review_agent_system_plan`,并说明其配置约定。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ getnexor-ai/ skills --skill automation-architecture安装后在 Claude Code 中输入/automation-architecture确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/booking-agent.mdconfiguration-reference.mdmcp-tool-surface.mdrecipes.md详细介绍
自动化架构
目标
将客户用例转化为精确、最精简的 Nexor 配置:为各个原语命名,填写具体字段值,并将它们端到端连接起来。交付成果是配置,而非建议。
分解三定律
选择任何原语之前,先应用以下定律。它们不是风格偏好:每条都定义了平台唯一能够门控、触发、模板化或验证的结构。即使演示效果正确,违反其中任何一条的设计也不可靠,因为平台无法识别以文字描述存在的部分。
定律 1——系统所需的每条信息都必须是变量
如果构建依赖于某项信息,就必须将其设为命名的工作流字段或 lead metadata。绝不能只将它写在提示词中,也不能指望“Agent 会从对话中记住”。
- Agent 必须获取的信息 → 工作流字段,设置
required: true,并提供extraction_hints。 - 外部工具(CRM、表单或客户自己的后端)提供 lead 身份/联系信息 → 通过标准 lead 创建/更新约定写入
first_name、last_name、email和phone。绝不能将这些值隐藏在 metadata 中;metadata 不会更改 Nexor 的联系人目标地址。 - 外部工具提供其他上下文信息 → 直接放入 lead 的
metadataJSON 对象中。键可以存放字符串、数字、布尔值、null、数组或嵌套对象;完整的 metadata 对象会注入下一个运行时 Agent 提示词,因此 Agent 无需为每个键设置单独字段,就能访问每个参数和值。 - Agent 必须询问、验证、规范化外部提供的信息,或以此为门控条件 → 添加带有
metadata_key的工作流字段(必要时还要添加intake_value_map),这样 metadata 会预填字段,而无需再询问。metadata_key、options、extraction_hints和validation只能在初始的create_workflow调用中写入——update_workflow_structure仅接受key、label、type、required、sort_order。创建 Agent 前,先完成变量清单。 - 工具生成的信息 → 使用
llm_response_fields将其保留在本轮对话中;如果后续步骤需要,则由后置工具钩子将其写入 metadata。 - 门控条件仅读取字段。
required_field_keys、requires_all_fields和transition_rules无法读取 metadata。 - **确定性发送器仅读取 metadata。**状态自动化的
args_template、webhook 的payload_template和 HTTP 工具模板会读取{{lead.<path>}}/{{lead.metadata.<key>}},无法读取已收集的字段值。自动化必须传输的任何内容,都必须在 lead 到达触发状态之前镜像到 metadata 中(通过后置工具钩子或patch_metadata)。完整的读取器/存储位置矩阵见 references/configuration-reference.md。
对于设计中使用的每条信息,都要注明其键和存储位置。若某条信息只存在于对话历史中,就无法用于门控状态、路由 lead、填充请求正文或筛选任务。
Law 2 — Agent 内部的每次状态变化都是一个状态
如果 Agent 的行为、权限或义务在某个时刻发生变化,那么该时刻就是 Agent 工作流中的一个状态。绝不能将其描述为提示词中的“阶段”,也不能将其作为布尔值存放在元数据中。
状态是平台其余部分唯一可以操作的对象。不是状态的阶段,对 workflow_tools.available_in_statuses、status_automations.on_status_key、基于 to_status.key 的 webhook 筛选器、timeout_config、transition_rules / required_field_keys、后台任务的 workflow_filters.status_keys、再联系的 trigger_status_key 以及 assignment_config 都不可见。
为每个阶段设置 key、label、entry_hint(根据 Law 1 变量说明进入条件),以及明确的门槛。当字段值足以完全决定下一步时,添加 transition_rules.rule_groups 并设置 auto_evaluate: true,让平台推进潜在客户,而不是依赖 Agent 调用 set_lead_status。
每个门槛都要通过 required_field_keys(或 requires_all_fields)加上 transition_rules 来表示。无法通过 MCP 写入 variable_refs——它只是仪表板的显示提示,因此依赖它的设计根本没有设置门槛。review_agent_system_plan 会替你执行此规则:任何既没有 entry_hint 也没有 transition_rules 的非初始状态,都会返回一个澄清问题。
重新排序现有工作流时,必须完整保留其语义核心:Lead created (core_new)、Contacted (core_contacted) 和 Engaged (core_engaged) 始终依次位列第一、第二、第三。调用 get_workflow,将其余每个已持久化的状态 key 原样传递给 reorder_workflow_statuses,然后再次调用 get_workflow,并在报告成功前比较完整顺序。绝不能通过发送原始 sort_order 值来重新排序、添加虚构的 Discarded 列,或根据可编辑标签推断核心状态。有关分组行为,请阅读 references/configuration-reference.md;有关写入约定,请阅读 references/mcp-tool-surface.md。
规则 3 — 每次 Agent 身份切换都发生在一个会移交的边界状态
改变语气、角色、目标、提示词内容、工具集、渠道组合或联系频率,意味着这是一个不同的 Agent。切换绝不会在提示词内部进行,而是通过线索退出的边界状态完成:
- 终止式移交(默认):
is_terminal: true加上transfer_config: { "target_workflow_id": "<real id>" }。这是唯一会自动触发移交的形式。每条 Agent 路径都会先检查is_terminal,再读取transfer_config,所以非终止状态即使带有transfer_config也不会触发移交——该配置会被正常保存,但不会产生任何效果。 - 边界状态绝不可命名为
future_*、contact_later或colder。 这些键会被视为软终止状态,并在读取transfer_config之前从终止状态副作用路径中排除,因此即使状态正确标记为终止状态,移交也会被跳过。这是整个系统中最隐蔽的故障。 - 暂停边界: 在系统外执行移交时,使用
pause_bot: true,例如通过后台任务的workflow_transfer/force_transfer操作、一次性移交 API 或人工操作。暂停边界必须指定执行者,否则线索会永远保持静默。这种做法是安全的:pause_bot是一个状态标记,不会设置workflow_runs.is_paused,因此使用标准exclusions.skip_paused: true的任务仍会处理这些线索。
无论采用哪种形式,源 Agent 的所有权都会在边界处结束:每条线索恰好只有一个 Agent 处于活动状态。目标 Agent 始终从自己的初始状态开始,重新启动其联系节奏,而源 Agent 收集的字段则会作为只读的移交链快照一同传递。
禁止的形式:提示词中写着“满足条件后,切换为成交语气”;以更改 Agent 角色为目的的工具;同一条线索上有两个 Agent 同时处于活动状态;移交目标指向目标 Agent 内部的某个特定状态。
规则 2 还是规则 3?
目标相同、角色相同、工具集相同、联系节奏相同,只是对线索的了解更多 → 状态。目标、提示词、工具、渠道或联系频率不同 → 通过边界状态进入新模式。~80% 测试只在同一个意图内进行:两个候选模式具有相同意图和表达风格,且提示词、工具和日程约有 ~80% 相同,则合并为一个具有更多状态的模式。它绝不会合并两个不同的意图。
默认方案:按意图拆分为 2–3 种模式
运营人员看到并命名的是智能体(主工作流)。你在其中构建的是模式(工作流):每种意图对应一种模式。默认应拆分,而不是编写一个宽泛的提示词。除非运营人员明确且毫不含糊地表示他们只想要一种模式(“我绝对只想要一种模式”),否则应进行拆分:
- 意图变化时创建新模式——也就是对话希望引导线索采取的行动:销售、跟进、提供折扣、预约、收款、留存。
- 沟通风格变化时创建新模式——即使在“同一笔销售”中,语气、强度、节奏、人设或渠道组合发生变化,也应创建新模式:热情且提供信息的开场、坚持不懈的提醒,以及单次让步,属于三种不同的沟通风格。
- 典型需求拆分为 2–3 种模式。“在我们的电商平台销售门票,并通过折扣进行跟进”应拆分为两到三种模式(销售 → 跟进未付款用户 → 提供折扣),而不是一种或五种。references/recipes.md 中的配方 25 展示了完整流程。
- 仅在明确要求时使用一种模式。 在
plan.decomposition中引用运营人员的原话,设置single_mode_explicitly_requested: true和operator_instruction;如果缺少这些内容,review_agent_system_plan会阻止单模式方案。 - 绝不超过 5 种。 超过四种模式会割裂一段对话(每次切换都会重置节奏并重新触发首次联系);除非
large_system_explicitly_requested包含运营人员的原话,否则审核会阻止该方案。合并意图和沟通风格都相同的模式。 - 确保每种模式都可到达。 列出的第一种模式是入口点(或将其他模式标记为
entry_point: true);每种其他模式都必须是某种模式的终止转接目标,否则审核会询问线索如何到达该模式。
describe_agent_configuration 会通过 mode_split 返回这项约定;在方案中说明每种模式的意图和沟通风格,并向运营人员复述审核给出的 decomposition 摘要。
基础机制
客户提出的需求都归入以下一项或多项:
| # | 基础机制 | 触发条件 | 需要编写代码? | 范围 |
|---|---|---|---|---|
| 1 | Agent 配置(状态 + 接入字段) | 潜在客户发送消息,或对话进行中 | 否 | 单个潜在客户,当前轮次内 |
| 2 | 工作流 HTTP/MCP 工具 | Agent 在当前轮次中需要外部信息或执行操作 | 否 | 单个潜在客户,同步执行 |
| 3 | 规则(提醒 / 主持人通知 / 重新联系) | 会议生命周期、长时间无活动 | 否 | 单个潜在客户 |
| 4 | 出站 Webhook | 平台事件(状态变更、会议生命周期) | 否 | 通知外部 API(CRM、ERP、自有后端),每次发生事件时通知 |
| 5 | 状态自动化 | 潜在客户达到特定状态 | 否 | 调用一个 HTTP/MCP 工具,每个潜在客户恰好一次 |
| 6 | 后台任务 | cron 或标签事件 | 否 | 经过筛选的群组,使用声明式步骤 |
| 7 | 云函数 | lead.* / workflow.* / meeting.* 事件 | JS | 每个事件对应一个潜在客户 |
| 8 | 定时函数 | Cron + 时区 | JS | 根据查询获取群组 |
| 9 | 工作流转接 | 终止状态,且带有 transfer_config | 否 | 单个潜在客户,Agent 之间交接 |
| 10 | 接入 API / 入站 Webhook | 外部工具(CRM、表单、Zapier、自有后端)推送潜在客户 | 否 | 创建潜在客户 + 纳入工作流 |
| 11 | 节奏配置(联系时段 + 每日配置) | 外联排期:时间窗口、各渠道的联系频率、热点联系 | 否 | 工作流的整个出站计划 |
| 12 | 知识库分配 | Agent 运行时需要选定的账户自有知识 | 否 | 精确指定每个 Agent 的子集,并按检索优先级排序 |
| 13 | 执行前钩子(带有 mode: "on_entry" 的工具) | 潜在客户进入工作流,在 Agent 发送第一条消息之前 | 否 | 单个潜在客户,确定性执行,不能按阶段设置门槛 |
| 14 | 预处理器 | 入站潜在客户到达,在任何 Agent 接手之前 | 否 | 按顺序执行条件规则,选择入口工作流 |
| 15 | 阶段超时(timeout_config) | 潜在客户进入某个状态后经过一段时间(“48 小时未回复”) | 否 | 单个潜在客户;将其移至同一 Agent 的另一个状态——这是平台唯一的延迟机制。若目标为带有 transfer_config 的终止状态,则会延迟交接 |
决策阶梯——配置优先于代码
配置对运营人员可见,可在 UI 中编辑,且不会导致崩溃;代码对运营人员不可见,而且需要你永久维护。按从上到下的顺序检查阶梯,在第一个能满足需求的层级停止。
- 原生对话配置能否表达? 状态、收集字段、提示词规则或确定性分支 → Agent 配置。“询问 X 并根据回答分支”属于状态和字段,而非代码。第 1 条和第 2 条通常已将大部分需求归入这一层。
- 这是等待吗?“如果他们 N 小时内没有回复……”“3 天后将他们移至……”“48 小时后转交给跟进 Agent” → 在等待状态上配置
timeout_config(使用set_status_timeout_rule,或在create_workflow/update_workflow_status中内联配置),并指向下一个状态——或者指向一个带有transfer_config的终止状态,以实现延迟转交。多步等待时使用状态链;计时从进入状态时开始,收到回复不会重置计时。这对应控制面板中的“如果潜在客户未回复 → N 小时后 → 移至”控件。对于单个潜在客户的等待,计划函数、后台作业、云函数或重新联系on_exhausted绝不是正确方案(配方 23)。 - 这是标准的生命周期提醒吗? 预约确认、会前提醒、通知主持人、重新联系长期未跟进的潜在客户 → 使用规则。配置好后即可停止。
- 状态变化能否准确定义触发时机? 优先选择确定性执行,而非让模型决定是否调用工具。状态变更 → 如果接收方能根据事件采取行动,则使用筛选后的出站 Webhook;如果需要 Nexor 调用配置好的端点一次并发送自定义请求体,则使用状态自动化。字段/变量或其他潜在客户事件 → 触发云函数(
information.collected、information.updated、lead.updated,或支持范围最窄的事件),并通过相关键/变更进行限制。 - 结果是否必须在 Agent 发送首条消息之前就绪? → 使用预执行钩子:
set_workflow_tool_execution({ mode: "on_entry" })。潜在客户进入工作流时,平台会立即运行工具,在 Agent 发言前完成,且无需模型作出决定。这适用于信息补全、资格查询和账户上下文,也适用于需要在转交目标处就绪的数据。此模式不能按阶段进行限制(两种模式互斥),因此只有在“进入时”确实是合适时机时才使用。 - 如果没有状态事件能先行触发,Agent 是否确实需要外部结果才能继续当前轮对话? 将客户端端点作为工作流 HTTP/MCP 工具,以
mode: "agent_decides"暴露。这是可靠性最低的一层,因为必须由模型选择并调用工具。将特定于客户端的逻辑保留在客户端系统中,收紧接口范围,并在工具仅适用于某个阶段之后(例如qualified)时,通过available_in_statuses限制其可用状态。 - 这是“筛选潜在客户 → 判断条件 → 执行动作”吗? → 使用带声明式步骤和操作的后台作业。始终设置
max_leads_per_cycle和cooldown_minutes;凡是会向真人发送消息的操作,都先进行试运行。 - 异步工作是否需要作业所用词汇无法表达的自定义逻辑或外部 API? 根据触发语义选择:“当某个潜在客户……” → 云函数(事件,单个潜在客户)。“每天早上/每周一……” → 计划函数(Cron,潜在客户群体)。如果某个“当”触发可容忍数小时延迟,且涉及多个潜在客户 → 优先使用计划扫描(其试运行会先显示整个群体)。如果“当”仅表示在某个阶段经过一段时间,则属于第 2 层,而非这一层。
- 潜在客户是否需要完全不同的对话方式或触达频率? 目标、角色设定、节奏、渠道组合或工具集发生变化 → 从边界状态转交到其他工作流(第 3 条)。资格判定 Agent 可以通过
qualified_now和qualified_later等终止状态分流,每个状态都配置自己的transfer_config;接收工作流分别负责高频销售或低频培育。如果只提出“培育”需求,默认应采用独立的低频、仅限电子邮件工作流,大约每 2-4 周联系一次——绝不能仅仅放慢销售节奏,也不能让同一个 Agent 使用更多渠道。如果两个目标的意图和语气相同,且提示词、工具和日程有 80% 相同,则保留一种模式并增加状态;但绝不能将两种不同意图合并到一个提示词中:默认结构为 2–3 种模式(见上文“默认结构”)。
集成指南
当需求涉及集成——在 Nexor 与外部工具(CRM、ERP 或客户自己的后端)之间传输数据时,应根据方向和频率选择合适的原语。Functions 是最灵活的方式:可编辑的 JavaScript,并提供 axios,因此可以双向访问任何外部 API。
Nexor API 的标准来源
当配置、示例或客户集成需要直接调用 Nexor 时,请使用以下确切的 API 来源:
| 环境 | API 来源 |
|---|---|
| Staging | https://api-staging.getnexor.ai |
| Production | https://api.getnexor.ai |
在来源后附加文档中列出的路由,例如 /api/public/leads。请勿替换为仪表板来源、MCP 来源、staging-api.getnexor.ai 或旧版 onrender.com 后端。凭证和 API 来源必须属于同一环境;执行任何会产生副作用的调用前,先确定目标环境,不要默默选择 Production。
这些来源适用于确实需要调用 Nexor 的集成。它们不是 Nexor Functions 内部的默认数据路径。应优先使用运行时原生访问方式:
- 在事件 Cloud Function 中,从
ctx.lead或lead读取触发事件的潜在客户;切勿通过/api/public/leads重新获取。 - 在 Scheduled Function 中,将 get/list/search/filter-leads 需求转换为
lookup_config,预览该人群,并在代码中使用已解析的ctx.leads数组。不要为同一人群查询/api/public/leads。Leads 没有workflow_id列:当前 Agent/工作流范围应在支持关系查询的查询中使用workflow_runs.workflow_id = <id>和workflow_runs.is_active = true这一对条件。 - 对 Nexor 支持的变更操作,使用
updateLead/updateMetadata和effects.*。只有在确实需要执行不受支持的原子操作时,才直接调用 Nexor API,例如在同一次运行中需要新 ID 时,同时执行 create/upsert、工作流注册和首次联系;不要为了重复读取而调用。
选择接口前先明确同步方向
在方向明确之前,不要把“同步这些信息”视为完整需求。提出建议或配置任何内容前,先确定数据是流入 Nexor还是流出 Nexor。如果请求未明确方向,请列出这两个互斥选项并等待答复;不要根据“同步”一词猜测。
对于流入 Nexor的数据,映射前先对每个传入键进行分类:
- 将线索身份信息和联系信息放入标准线索列:
first_name、last_name、email和phone。通过常规的线索创建/更新契约更新这些字段,绝不要通过元数据更新。元数据不会改变 Nexor 用来联系线索的地址或号码。 - 将 Agent 应了解的所有其他可复用客户信息放入
lead.metadata。创建/更新插入时使用metadata对象,或通过PATCH/PUT /api/public/leads/:id对其进行浅合并;批量合并请使用PATCH /api/public/leads/metadata。下次 Agent 执行时会加载完整的元数据对象,因此现在写入的值会在下一轮/次运行中可用,无需将其复制到提示词正文中。 - 仅当同一个值必须预填 intake 问题或参与仅基于字段的状态门控时,才添加带有
metadata_key的工作流字段。元数据仍是入站上下文的来源;字段则是结构性桥梁。
对于流出 Nexor的数据,请根据下表选择出站触发方式。元数据可以作为载荷中包含的源值,但写入元数据并不是出站同步机制,本身不会发送任何内容。
| 方向 | 频率 | 用途 | 原因 |
|---|---|---|---|
| Nexor → 外部 | 状态变更 | 出站 Webhook 或状态自动化 | 平台状态可确定性地触发;不依赖模型决定选择哪个工具 |
| Nexor → 外部 | 字段/变量或线索事件 | 云函数 | 事件可确定性地触发;自定义代码可以检查发生变更的键并调用任意端点 |
| Nexor ↔ 外部 | 在 Agent 轮次期间,没有可用的状态触发器 | 工作流 HTTP/MCP 工具 | 仅在 Agent 需要立即获得响应时使用;客户端的端点仍是事实来源,但由模型选择调用的可靠性较低 |
| Nexor → 外部 | 批量 | 定时函数扫描 | 使用 ctx.leads[] 中的群组,按线索分别推送或聚合后推送 |
| 外部 → Nexor | 推送(对方调用你) | 公共线索 API / 入站钩子 | 一次请求即可完成更新插入、元数据写入和加入工作流,无需编写代码 |
| 外部 → Nexor | 拉取(Nexor 调用对方) | 定时函数 | 使用 Supabase 风格的链式筛选器查询整个线索对象,通过 axios 调用外部 API,然后通过 effects 或公共 API 使用自定义元数据创建/编辑线索 |
| 外部 → Nexor | 结果在其他地方发生(已付款、已签署、已激活) | 转化事件:POST /api/public/conversions,附带线索标识符(+ amount、currency、description、metadata) | 确定性触发;Nexor 会将线索转到该类型所配置的 Agent/状态、Agent 或其群组 |
若能表达所需时机,应优先采用确定性机制:规则、Webhook、状态自动化和事件触发的云函数都不依赖模型记得或决定调用工具。若客户端的端点已经负责其轮询分配、CRM 归属、定价或资格判定逻辑,就不要将这些逻辑复制到提示词或函数中。仅当当前对话确实需要 Agent 可调用工具的响应才能继续时,才使用这类工具。
客户端负责的能力与确定性执行
将客户端的端点视为能力所在之处,将 Nexor 视为编排器:
- 确定状态、字段、变量、潜在客户、会议或工作流事件是否定义了执行时机。如果是,则将该事件接入 webhook、状态自动化或云函数;不要要求 Agent 调用端点。
- 将权威业务决策保留在端点中。Nexor 传递事实;Agent 和函数都不应重复客户端的算法。
- 只有当 Agent 必须在当前轮次内获取结果,且确定性触发无法先行执行时,才使用对话式 HTTP/MCP 工具。
- 对其余可由 Agent 调用的工具,将
available_in_statuses设为准确的有效状态键。将qualified门槛与requires_all_fields/required_field_keys配合使用,确保资格审核完成前无法查询可用时间或预约。 - 对每次工作流运行中必须执行一次的不可逆对话操作,使用
call_once;对可能需要合理刷新只读工具,则关闭此选项。 - 定义成功、失败、持久化和重试行为。调用失败后,绝不能让 Agent 编造负责人、时间段、价格或外部结果。
请阅读 references/configuration-reference.md 中关于工作流工具和阶段门控的约定;如果请求与销售代表分配类似,请使用 references/recipes.md 中的轮询映射。
会议主持人选择
会议主持人选择决定了由预约 Agent 所分配的哪位高管提供向潜在客户展示的时间段。这不涉及潜在客户归属、销售管道分配或外部 CRM 轮询。
- 在提出更改前,针对确切的工作流调用
list_meeting_types和list_executives。Agent 必须且只能使用一个现有会议类型。如果存在多个会议类型,则停止操作并帮助操作人员将其合并为一个;绝不要创建或悄悄选择另一个类型。 - 将零位或一位已分配高管视为无需进行路由决策。若有两位或更多高管且没有选择标准,请说明可用时间段会通过轮询平均分配。添加第二位高管后,主动询问对方希望采用默认方式还是明确的主持人选择规则。
- 仅根据预约 Agent 实际可知的事实构建规则:标准潜在客户属性、潜在客户元数据或
get_workflow返回的工作流字段。通过list_executives返回的user_id引用已分配的高管。如果规则中提到未知或未分配的人员,应先与操作人员解决这一不匹配(invite_user,然后add_executive),再进行任何写入。 - 根据必须满足的条件选择层级。由字段驱动或加权拆分(“renta 超过 50000 分配给 Ana,其余在 Bruno 和 Carla 之间按 2:1 分配,不符合条件者取消资格”;“严格交替”)应通过
set_meeting_type_routing({ workflow_id, agent_selection_rules })强制执行 — 使用field和min指定层级、用agents(用户 ID)指定人员、用mode指定round_robin/cycle、并配置weights、pattern和action: "disqualify";该规则会在提供选项和预约时应用。以文字表达的软性偏好应通过update_meeting_type设置agent_selection_criteria:保持简短且有序,绝不要声称此规则由服务端强制执行 — 预约 Agent 会在选择返回的时间段时读取该字段。 - 读取规则或条件(
list_meeting_types/set_meeting_type_routing响应)并逐项核对。只有在同一会议类型中确认包含请求的值后,才报告成功;否则应说明不匹配,不要暗示路由已更改。
不要使用旧版会议选择工具、直接访问数据库,也不要通过第二种会议类型来表达路由。如果由客户端自己的端点决定主持人,请改用 set_host_assigner — 参见 references/booking-agent.md。
预约 Agent
创建预约 Agent 时,它尚不可预约。在 set_workflow_active 生成能够提供时段的 Agent 之前,必须按依赖顺序满足六项前置条件;get_account_readiness 会将每项缺失条件报告为预约阻塞项,并列出解决它们的工具。完整的参数约定见 references/booking-agent.md;顺序如下:
create_workflow({ goal_type: "appointment", timezone, … })— 显式传入 IANAtimezone:所有提供的时段都以此时区为基准显示。三个核心阶段和虚拟的 Discarded 列始终存在;请在它们之后设计预约阶段。create_meeting_type({ workflow_id, name, duration_minutes, location_type })— 或复用list_meeting_types返回的唯一类型。一个工作流对应一种会议类型;location_type: "in_person"需要提供location_details。创建后即为 active;有可用时间的主持人就绪后即可预约。- 为每位负责主持会议的人员调用
add_executive({ workflow_id, user_id })(通过list_team获取 id;不在团队中的人员需先调用invite_user)。仅有一位符合条件的成员时 →auto_assign_solo_host。 set_host_schedule({ user_id, timezone, slots: [{ weekday, start, end }] })— 提供完整的每周日程,时区使用主持人的时区;休假日使用set_host_blocks。connect_calendar({ user_id, provider: "google" | "outlook" })→ 返回connect_url,只能由主持人在浏览器中完成连接。发送该链接,说明谁必须打开它,并轮询get_calendar_connections({ user_id }),直到status: "active"。轮询确认前,绝不可报告日历已连接。Calendly 可替代步骤 4–5(connect_calendly→map_calendly_hosts→set_calendly_binding)。get_reminder_catalog({ workflow_id }),然后对每条规则调用set_reminder_rule,并提供完整参数约定 —trigger_event(event_created、event_cancelled、call_analyzed、event_enrolled;不存在重新安排的触发事件,新的时间会再次触发event_created)、channel(只能使用该目录标记为此账户可用的渠道)、template_name(已批准的 WhatsApp 模板,或retell/sms/email的变体键)、有符号的delay_minutes、delay_referencetrigger或event_start。set_host_reminder_rule仅支持电子邮件,且仅在event_created时触发。- 有两位或更多主持人时,调用
set_meeting_type_routing(参见上文“会议主持人选择”)。 review_agent_system_plan({ plan })— 预约 Agent 必须包含meeting_type、hosts[]和calendar_plan(或booking_provider);缺少这些内容的预约计划会被拒绝。每次执行步骤 1–7 中的变更之前,都必须先对摘要计划(“看起来可以吗?请告诉我,我会着手构建。”)表示同意。- 读取所有配置并核实 —
get_account_readiness显示没有预约阻塞项,且get_workflow_slots返回时段 — 然后调用set_workflow_active,并单独确认。
之后操作 Agent 属于不同的工具系列:使用 list_meetings / get_meeting_stats 查看预约,使用 book_meeting / reschedule_meeting / change_meeting_host / cancel_meeting 进行运营人员驱动的变更(每项操作在未设置 confirm: true 时都会先预览),使用 set_meeting_status({ status: "no_show" | "completed" }) 记录结果。**get_available_slots、confirm_and_book、create_event、reschedule_event、cancel_event、request_channel_swap 和 schedule_followup 是 Agent 在对话过程中使用的运行时工具 — 不能通过 MCP 调用。**它们只会作为配置中的名称出现,用于设置阶段门控或为外部预约者停用这些工具。
当客户端自己的端点拥有日历时,set_external_booking 需要四种操作全部齐备——slots、create(tool)、reschedule_tool、cancel_tool,因为缺少某种操作时,系统会静默地不再同步:出现虚假会议,提醒仍会持续触发。唯一的例外是,运营人员在对话中以书面形式明确接受这一限制;请将这句话记录在规范中。参见 references/booking-agent.md。
工作流
- 将需求重述为触发条件 → 条件 → 操作,并在选择配置界面前先确定同步方向是流入 Nexor / 流出 Nexor,再将时机分类为轮次内 / 事件 / 批处理 / 入站,并区分 Agent 必须询问的内容(接入字段)、客户系统发送的内容(标准线索身份列与元数据),以及必须执行的操作(工具调用或自动化)。
- 选择任何原语前,先应用三条法则起草骨架:将设计所需的每项事实列为带名称的变量,并注明其存储位置和读取者(法则 1);将每个 Agent 内部阶段列为状态键,并注明其进入标准和门控条件(法则 2);将每次身份切换列为边界状态,并注明其形态、目标 Agent,以及——对于暂停边界——其执行者(法则 3)。然后确定系统规模:每个意图和每个寄存器各一种模式,默认 2–3 种模式;仅当操作人员明确要求恰好一种模式时才使用单一模式;绝不使用 5 种或更多模式(参见“默认结构”)。凡无法归入这三份清单的内容,都还没有设计完成;先将其列入,再继续。
- 在提出任何非平凡或多 Agent 构建方案之前,调用
describe_agent_configuration,并通过list_workflows/get_workflow/list_workflow_tools/list_webhooks读取当前状态。平台提供了自身要求的流程和界面映射;应遵循该映射,而不是依赖记忆中的映射。编辑的 Agent 若属于 Agent 组(master_workflow_id),默认读取单位是整个组:其同级 Agent、流入和流出被编辑 Agent 的状态,以及共享的渠道绑定;绝不能只读取这一个 Agent。 - 沿阶梯逐级推进。注明跳过的每一级及原因——这部分推理也属于交付内容。
- 优先使用确定性的状态触发器。状态变更优先选择 webhook/状态自动化;字段/变量或其他线索事件优先选择云函数。只有当 Agent 必须在继续前收到结果时,才使用轮次内工具,并将其限制在有效状态范围内。
- 阅读 references/recipes.md,从最接近的已完成映射开始;阅读 references/configuration-reference.md,补全所选原语的确切字段名称和值;首次写入前阅读 references/mcp-tool-surface.md。
- 规划前先读取账户信息:调用
get_account_readiness,以及list_whatsapp_numbers、list_email_senders和list_phone_numbers(若 Agent 需要预约,还需对calendars[]/booking_providers[]调用get_integration_status)。将sms_enabled: true的活跃电话号码行视为短信渠道。账户事实是证据,不是澄清问题:绝不询问客户是否已经有 WhatsApp 号码、邮件发件人、呼叫号码、短信渠道或已保存的时区。**任何 Agent 都不得询问渠道和联系时段——也不得将它们混入其他问题中。**创建 Agent 时,它会自动获得账户中每种有已验证资源的渠道(get_account_readiness.inventory.channels);在create_workflow时,每种模式都会继承所属 Agent 的渠道、联系时段和人物名称(见第 10 步)。规划模式时不要包含channels键(命名渠道只能作为意图写入描述和提示词,绝不能作为绑定或问题),并根据操作人员已提供的信息确定contact_schedule;若没有提示,则采用周一至周五 09:00–18:00 的默认时段,并在摘要中用一行说明 Agent 创建时获得了什么。review_agent_system_plan绝不会询问要启用哪些渠道,并会返回birth_defaults(每个新 Agent 都会获得的渠道)。只有当操作人员明确要求此模式使用特定资源或更窄的渠道组合,或者create_workflow报告了channel_bindings结果而需要修复时,才运行第 8 步的资源流程。 - 仅在操作人员明确要求时(指定某个号码或发件人、为某个模式指定更窄的渠道组合,或
create_workflow结果报告owned_by_other_agent/channel_binding_failed):为该 Agent 编写预期渠道清单:注明启用的渠道,并列出 WhatsApp、邮件、呼叫和短信各自选定的确切资源 ID。注明每项资源的当前所有者。邮件发件人可共享;一个 WhatsApp 号码只能有一个直接所有者,一个呼叫号码只能有一个workflow_id,一条短信路由只能有一个sms_workflow_id。呼叫和短信可以合法地将同一个实际号码路由到不同 Agent。在进行任何变更前,先解决整个计划中的重复独占声明。对于真正需要配置的渠道(WhatsApp、邮件、呼叫):如果恰好只有一个可用资源,则提供该已观察到的资源,或配置新资源的选项;如果有多个资源,则在有限选项选择器中列出所有已观察到的资源,并提供配置新资源的路径;如果没有资源,则说明情况,并提供配置资源或在没有该渠道的情况下继续的选项。短信不属于上述需要配置的渠道——短信不是“设置”出来的,而是在账户已有的电话号码上按 Agent 激活。只要存在活跃的 Twilio 号码,就不要启动购买号码流程:唯一需要确认的问题是哪些 Agent 应接收短信,然后使用set_number_sms({ number_id, enabled: true, sms_workflow_id })激活。短信必须使用 Twilio 运营商号码(Telnyx 号码不支持短信);没有国家/地区限制。只有账户完全没有电话号码时,短信配置才进入对话,并转为与呼叫相同的号码设置流程。绝不要把这些有限选项变成开放式文本问题。 - 在进行任何变更前,使用
review_agent_system_plan({ plan })预检整个系统,并通过计划本地 Agent 引用之间的transfer_to_agent_ref表达交接,每种模式对应一个计划 Agent。除非plan.decomposition包含single_mode_explicitly_requested: true和操作人员的原话operator_instruction,否则单模式计划会被阻止;除非large_system_explicitly_requested包含相应内容,否则 5 种或更多模式会被阻止;若某模式没有任何流入交接,则会触发澄清问题,除非该模式为entry_point: true。解决所有blocking_issue和clarification_question,直到ready_for_signoff为 true,然后展示返回的摘要并原样询问signoff_prompt中的问题。在用户批准plan_fingerprint前,不得调用任何创建/更新/运行工具。 - 始终先创建 Agent,再创建其模式。 每个工作流都是 Agent(主工作流)内部的一种模式;工作流绝不能独立存在,无论请求看起来是“创建 Agent”“创建工作流”“添加模式”,还是创建一个或多个。
create_workflow需要master_workflow_id,没有此参数时会拒绝调用;API 也绝不会让模式脱离 Agent 存在。因此,任何构建的首次写入都必须是创建 Agent:调用create_agent_group({ description })(如果操作人员指的是已有 Agent,则使用list_agent_groups返回的 ID;如果当前对话已属于某个 Agent,也使用该 Agent),然后每次调用create_workflow时都传入该 ID。**创建时操作人员绝不会指定 Agent 名称,你也绝不询问名称:**Nexor 会从候选名称库中选取一个常见人名(跳过账户中已有的 Agent 名称)并返回;name参数会被忽略,并回显为requested_name_ignored。使用返回的名称介绍 Agent;只有操作人员明确要求时,才稍后通过update_agent_group重命名。在计划中将位置写为plan.agent_group = { id }或{ description? },以便review_agent_system_plan检查。Agent 创建时会获得账户渠道,且每种模式都会继承这些渠道:create_workflow会在创建前,根据 Agent 的其他现存模式解析该模式的渠道、联系时段、人物名称(agent_name= Agent 名称)、语言和时区;若是第一个模式,则根据账户信息解析(每种拥有已验证资源的渠道、后端的默认时段或操作人员提供的时段提示)。随后绑定资源(一个 WhatsApp 号码和一条短信路由由该 Agent 的各模式共享;呼叫使用账户级号码;每个模式都绑定该 Agent 的邮件发件人),并返回inheritance和channel_bindings。因此,除非操作人员明确要求该模式使用不同设置,否则在create_workflow中省略channels、contact_schedule和agent_name,绝不询问这些内容。没有模式的 Agent 尚未完成:绝不要以空 Agent 结束构建,也绝不要让模式脱离所有 Agent(update_workflow.master_workflow_id: null会被拒绝——应将其移至另一个 Agent)。 - 按依赖顺序进行变更,确保所有引用的 ID 或键都已存在:
create_agent_group(除非 Agent 已存在)→create_workflow(完整的漏斗——状态应包含完整的阶段配置,包括门控条件、提示、超时和标志,以及完整的字段数组;大多数字段属性之后无法添加)→ 检查返回的pipeline_reconciliation报告,并在进行下一步前解决所有遗留的预置状态、缺失键和警告 → 工作流工具 → 用于状态自动化的update_workflow_config→ webhooks 和规则 → 对预约 Agent,依次配置会议类型 → 主持人 → 可用时段 → 日历(人工步骤)→ 提醒(参见“预约 Agent”)→ 仅在明确要求特定资源或报告了绑定结果时配置渠道绑定(create_workflow已绑定继承的渠道)→ 交接(目标拥有真实 ID 后,使用transfer_config调用update_workflow_status)→ 知识库附件。Agent 创建后处于暂停状态;整个构建期间都应保持暂停。各步骤对应的确切工具以及每次写入会覆盖的内容,请参阅 references/mcp-tool-surface.md。 - 对于每个 Agent 构建,使用不带
workflow_id的list_knowledge_bases清点账户知识库目录,然后编写预期知识库清单:每个 Agent 一行,列出其应使用的确切账户所属知识库 ID/名称及检索顺序。账户所有权意味着可用,不代表已分配。只有当知识库描述和 Agent 职责明确表明相关性时,才推断其相关性;否则应在变更前确定选择。除非操作人员明确要求每个 Agent 使用所有知识库,否则绝不要默认附加账户中的全部知识库。 - 对于多 Agent 设计,在进行任何变更前编写预期连接清单:每次交接一行,包含
source_agent_ref、source_status_key、boundary_shape(终止交接,或暂停 + 执行者)和target_agent_ref。此清单应独立于创建顺序。 - 所有涉及的 Agent 都取得真实 ID 后,对照三份清单进行核对。对于渠道,读取每个
create_workflow结果中的inheritance(该模式创建时获得的内容及其来源)和channel_bindings(每个渠道的状态:bound、already_bound_in_group、client_scoped_available、owned_by_other_agent、no_resource、inventory_unavailable);bound/already_bound_in_group/client_scoped_available无需进一步处理。owned_by_other_agent表示工具拒绝占用另一个 Agent 的资源:在移用前询问操作人员(说明资源、原所有者、新所有者及路由影响),绝不要暗中移用。no_resource表示账户没有该渠道的资源:用一行说明情况,并提供连接资源的选项;绝不要通过将first_contact_channel指向账户尚未连接的渠道来“修复”。仅当操作人员明确要求时,才自行写入选定的真实 ID(config.email_sender_id、assign_whatsapp_to_workflow、assign_number_to_workflow和set_number_sms),同步更新config.disabled_channels,然后重新清点。绝不要悄悄挪用已分配给另一个 Agent 的号码:批准必须明确说明资源、能力、原所有者、新所有者和路由影响。将所有受影响的 Agent 纳入回读,并禁用其失去的能力,或应用已单独确认的替代资源。对于交接,使用目标的真实 ID 更新每个源状态;如果源 Agent 是先创建的,还要在稍后创建目标后返回更新该源。对于知识库,将缺少的预期知识库附加到每个 Agent,并移除意外附加的知识库,但不得删除客户拥有的知识库。读取并回读每个相关 Agent、其渠道清单及其已附加的知识库列表。持续修复并重新读取,直到渠道、连接和分配均不存在缺失、未解决、指向错误或多余项。只要有任何清单尚未完成,就不得完成、报告成功或激活。 - 生成配置规范(参见“输出”)。
- 说明验证路径:激活前要执行哪些预览/试运行、渠道/连接/知识库回读以及被阻止/允许的工具测试,并说明这些检查必须显示什么。
决定设计的事实
这些是客户(以及考虑不周的设计)最常误解的语义:
create_workflow的状态就是完整的漏斗——后端会填充默认阶段,填充的阶段不得保留。 创建端点会填充默认流程(New、Contacted、In conversation、系统阶段),再将你的状态追加到其中;MCP 工具会自动协调,并返回pipeline_reconciliation报告。只有当结果顶层的status为"created"时,漏斗才正确(即unrequested_statuses_remaining、missing_requested_statuses、duplicate_labels和warnings均为空)——用get_pipeline_impact+delete_workflow_status解决残留项,用update_workflow_structure补齐缺失键,然后再配置任何引用状态的内容。遗留的填充阶段对你的设计门槛、提示和转接不可见;重复阶段(例如,在你的send_link旁边多出一个payment_sent)会把潜在客户误导入无效阶段。- Agent 根据
entry_hint而非description进行路由。 状态的description永远不会进入提示词。放置规则(“年收入低于 800,000 时,将潜在客户放在此处”)应写入entry_hint;用variable_refs/required_field_keys控制阶段推进。当分支完全由已保存的字段值决定时,将其编码为transition_rules.rule_groups(由服务器评估field/operator/value条件),并设置auto_evaluate: true,这样平台会在字段保存后立即路由潜在客户,而不必依赖 Agent 调用set_lead_status。 is_qualified用于标记,门槛用于强制执行。 资格阶段类型只是报表/UI 标记。服务器端门槛是required_field_keys(优先级更高)/requires_all_fields加上transition_rules.rule_groups;门槛只会阻止进入非终止状态和won类终止状态;进入lost/ 转接终止状态由entry_hint引导,而非由门槛阻止。- 渠道时段由一个标志控制,而非按渠道分别设置。 呼叫始终受节奏时段限制(硬编码,绝不会全天候开放);WhatsApp/电子邮件/SMS 全天候运行,除非设置
config.gate_outbound_to_hours: true,将它们统一限制在时段内。入站回复完全绕过排程。任何渠道都没有每周频率上限——要表达“每周最多 N 次”,请使用每个区块的强度、disabled_channels,或带有cooldown_minutes的后台任务,并说明你选择了哪种近似方案。 - 丢弃规则属于状态,而非自动化——
lost会停止主动联系,但不会停止回复。 “如果潜在客户不符合条件,就停止联系”应设为终止category: "lost"状态,并将规则写入其entry_hint和transition_rules,在 Agent 中明确配置并于对话期间处理。进入该状态后,所有主动外发都会停止,且该运行无法重新激活——但如果潜在客户发来消息,Agent 仍会简短回复(内置的流失潜在客户行为:不推销、不提供预约)。只有pause_bot会完全静默,不再回复;futurology_queue会延后联系;只有终止lost状态会丢弃潜在客户。 - 元数据是自定义上下文的默认途径,而非信息采集配置。 每当客户询问如何向 Agent 提供潜在客户的任意信息时,首先推荐潜在客户的
metadataJSON 对象。其值可采用任意 JSON 结构,整个对象都会进入运行时提示词。workflow_fields仅用于定义 Agent 要询问、验证或用于控制状态推进的内容;只有在这些用途需要时,才用metadata_key映射特定的入站键(单向映射:metadata → 字段预填)。元数据更新会浅合并顶层键,因此只修改嵌套对象的一部分时,也要重新发送完整的嵌套对象。 - “同步”先确定方向,再选择实现方式。 先确认信息是流入 Nexor 还是从 Nexor 流出。对于入站数据,将
first_name、last_name、email和phone映射到标准潜在客户列,并将 Agent 可读取的其他信息放入 metadata;这些 metadata 值会在 Agent 下一次执行时生效。对于出站数据,请使用出站触发器——写入 metadata 不会传输任何内容。 - 确定性触发器优于由模型选择的工具。 如果“何时”可以表示为状态、字段、变量、潜在客户、会议或工作流事件,就让平台触发集成。工具描述和提示词指令仍可能被模型幻觉生成或忽略;事件订阅和触发器则不依赖模型选择。
- 工具描述用于引导,阶段门槛用于强制执行。 在工具描述和提示词中提供调用指导,但使用
workflow_tools.available_in_statuses阻止工具在无效状态下执行。null/ 空列表表示不受限制。将门槛与资格状态上的必填字段搭配使用;切换到该状态后,同一轮对话中即可解锁工具。 - 自定义逻辑应留在端点之后。 如果 HubSpot 或客户端服务已经执行轮询分配、区域路由、资格判断或定价,确定性触发器应尽可能调用它;只有需要在当前轮对话中获得响应时,才由 Agent 工具调用它。Nexor 不应维护第二份相同逻辑。
- “通知我”有两种形式。 按
to_status.key筛选的 webhook 订阅会在每次匹配的状态变更时触发(由你的端点去重);状态自动化则对每条规则、每个潜在客户恰好触发一次,并可根据潜在客户数据模板化请求正文。 - 转接只会从硬终止状态触发。 系统会先检查
is_terminal,然后才会读取transfer_config;软终止键(future_*、contact_later、colder)还会被提前过滤掉——犯任一错误都能正常保存,但永远不会触发。潜在客户处于人工支持状态(in_support)时,也会跳过自动转接。转接始终会在目标 Agent 上以其初始状态创建新的运行——无法通过转接进入另一 Agent 中指定的状态(唯一的状态→状态指针是timeout_config.target_status_key,且仅限同一工作流)。源 Agent 的联系节奏会取消,目标 Agent 的联系节奏会重新开始;已收集字段会作为只读的转接链快照传递,不会复制到目标 Agent 的字段中。如果所谓的“转接”只是同一对话的一个阶段,那它就是状态,而不是转接。 - Agent 创建顺序无法建立连接。 只有读取回源 Agent 的终止状态,并确认其
transfer_config.target_workflow_id等于目标的真实 ID,交接才算建立。整个构建过程中都要保留预期连接清单,等所有引用的 ID 都存在后,再协调每个源 Agent。先创建 A 再创建 B,意味着 B 创建后还要返回 A;先创建 B 再创建 A 不会改变这一点。多 Agent 构建只有在每条预期连线都通过此回读检查后才算完成。 - 账户知识不等于 Agent 知识。
knowledge_bases是客户端拥有的目录;workflow_knowledge_bases是按 Agent 分配的知识库。一个知识库可供多个 Agent 共享,每个 Agent 也可获得不同顺序的子集。列出账户目录只能证明知识库存在。只有在目标 Agent 上通过list_knowledge_bases({ workflow_id })读回该知识库后,Agent 才能访问它。先创建或复用账户知识库,再通过其真实 ID 关联;移除访问权限时只解除关联,切勿为更改某个 Agent 的分配而删除共享内容。 - Agent 创建时已有名称和账户渠道,其模式会继承所有设置。 Nexor 会在
create_agent_group时为 Agent 选定一个人类名字(永远不要询问,也不要传入;只有用户明确要求时才可之后改名)。Agent 会拥有账户中所有具备已验证资源的渠道;每个create_workflow都会继承 Agent 的渠道、联系时段、角色名称、语言和时区——优先取自该 Agent 的其他模式,否则取自账户——并自行绑定资源(结果中的inheritance+channel_bindings)。对于任何 Agent,渠道和联系时段都不是要询问的问题:不要提供渠道选择器,不要问“使用这个号码还是连接另一个号码?”,不要问“营业时间还是全天候?”,不要提供“渠道与时段”表单,也不要在计划中加入channels键。只有操作员明确要求特定资源或更精简的组合,或需要解决owned_by_other_agent结果时,才进入资源流程——工具绝不会静默解决此问题。 - 创建时的联系时段应根据操作员的表述确定。 如果 Agent 已有模式,新模式会继承其时段;只有在没人提及联系时段时,第一个模式才使用周一至周五 09:00–18:00。任何暗示——非工作时间、通宵、全天候、周末、具体时间,或只会在办公时间以外出现的使用场景——都意味着要在计划和
create_workflow中为该模式明确设置contact_schedule({mode:"always"}或{mode:"windows", windows:[{start,end,days_of_week}]});如果模式本身的描述暗示了联系时段,却没有设置排程,review_agent_system_plan会阻止签核。对话已经暗示的时段,绝不要再询问;适用默认值时,用一句话说明(“联系时段为周一至周五 09:00–18:00;可更改”)。现有 Agent 使用set_workflow_cadence更改时段。 - 账户渠道不是要询问的问题。 账户已保存时区、已连接的 WhatsApp 号码、支持发送的电子邮件发件人、启用的呼叫号码,以及哪些启用号码当前已启用 SMS。规划前先读取这些信息;每个新 Agent 创建时都会拥有所有这些资源,
create_workflow会负责绑定。下方的选择规则仅适用于操作员明确要求特定资源的情况:只有一个资源时,表示“使用此确切资源或配置另一个”;有多个资源时,提供真正的资源选择器;没有资源时,用一句话说明并提供设置选项。不要询问“你已经有 WhatsApp 号码吗?”也不要索取平台可以列出的电子邮件或电话号码。当电子邮件的can_send明确为 false 时,仅有verification_status: "verified"并不足够。SMS 不需要单独开通,也不是独立的“已设置”渠道——它依托账户已有的电话号码。只要存在启用中的 Twilio 号码,就不要开始购买号码流程:读取电话资源清单,唯一需要询问的是哪些 Agent 应接收 SMS,然后通过set_number_sms({ number_id, enabled: true, sms_workflow_id })按 Agent 启用。SMS 需要 Twilio 运营商的号码(Telnyx 号码无法承载 SMS);不限制国家/地区。启用中的 Twilio 条目sms_enabled: false表示 SMS 只是尚未启用,并不表示缺少渠道。只有账户完全没有任何号码时,才进入开通 SMS 的对话。 - 源 Agent 选择强度,目标 Agent 负责落实。 在源 Agent 的各个
entry_hint中放入互斥的路由条件,并在每个终止分支上配置一个transfer_config。销售紧迫度、预约工具、培育语气、启用渠道和联系频率应设置在对应的目标工作流中——绝不要放在源状态上。 - 源 Agent 不会说交接话术,目标 Agent 的首条消息才是专门设计的。 转接时,平台会让目标 Agent 下一步发言——若消息窗口开放,就根据目标 Agent 自身的提示词生成上下文衔接内容;否则使用其开场模板。因此,源提示词应将潜在客户推进到边界状态,并在该轮结束时不说交接话术(不要说“我把你转给我的同事”“链接马上发出”或告别);目标提示词则应包含明确的到达规则。对于付款链接 Agent,到达消息应仅用一句话确认已接受的内容并附上付款链接,同时预先配置
set_payment_link(配方 22)。 - Agent 组中的 Agent 绝不能脱离整体单独编辑。 如果要编辑的 Agent 有
master_workflow_id,默认先读取整个组:使用list_workflows查看同组 Agent,对待编辑的 Agent,以及所有状态会向该 Agent 转入或从该 Agent 转出的同组 Agent 执行get_workflow,并读取共享渠道绑定(WhatsApp 和 iMessage 号码在组内共享)。在修改提示词、状态、首条消息或转接之前,先确认谁会把潜在客户转入、通过哪个状态和上下文转入,以及谁会接收它——修改一个 Agent 会影响相邻 Agent 应该说什么、不应该说什么。 - 函数效果会缓冲处理且不返回任何内容,因此定时函数无法在同一次运行中创建潜在客户并让其加入流程。要同步潜在客户并开始对话,可在函数中调用公共潜在客户 API(它会在一个请求中执行 upsert、合并 metadata、加入流程并开始首次联系),或使用两阶段扫描。
- 一次性发送依赖状态,不可想当然。 群组消息若没有
then_status_key(或冷却时间),每个周期都会重新发送。 - Nexor 只能看到对话中发生的转化。 Agent 预订的会议或 Nexor 付款链接会自动计入;任何在 CRM、ERP、POS、商店或账单系统中完成的交易,都需要转化事件 webhook(
POST /api/public/conversions,或通过 MCP 调用create_conversion)。转化类型可选;仅提供潜在客户标识符(lead_id、lead_email或lead_phone)就足够。所有转化信息(交易 ID、产品、销售人员、分支机构、方案)都应放入事件的自由格式metadata,绝不要放在 description 中——metadata 会进入潜在客户、conversion.detected云函数事件和列表筛选条件。目标优先级:类型 > Agent(set_conversion_destination)> 组。积分遵循相同逻辑:传入workflow_id可为一个 Agent 计入积分;仅传入master_workflow_id则记录组级转化(不为 Agent 计入积分,使用组的目标);明确指定的目标 > 类型范围 > 潜在客户当前所属的 Agent。 - 工具可以运行而不由模型选择。
set_workflow_tool_execution({ mode: "on_entry" })会将工具设为预执行钩子,在潜在客户进入工作流时、Agent 发出首条消息之前触发。on_entry和agent_decides互斥;on-entry 钩子不能按阶段设置门槛——如果传入available_in_statuses,调用会被拒绝。提出对话工具之前,先确认“进入时”是否正是需要执行的时机;如果是,模型便没有机会跳过调用。 - 状态自动化没有专属工具。 它们存放在工作流的
config对象中,并通过update_workflow_config({ config: { status_automations: [...] } })写入。该对象会在顶层合并,但数组会整体替换,因此每次都要读取get_workflow并发送完整数组。enabled !== false的规则会在on_status_key匹配时触发;每个 (workflow, lead, rule key) 仅触发一次,且通过账本永久记录,并自动重试一次。如果缺少args_template所需值,规则会中止,而不是发送不完整正文——这也是为什么潜在客户到达前就必须将该值写入 metadata。 - 有三种互不相关的“暂停”。
workflows.is_paused(Agent 已关闭——每个新 Agent 都从此状态开始)、workflow_runs.is_paused(单个潜在客户的运行,由stop_automation设置,也是作业exclusions.skip_paused的筛选条件)以及状态pause_bot(潜在客户停留在该状态时 Agent 保持安静)。它们互不代表对方。 - 平台会在你构建计划前验证它。
review_agent_system_plan会阻止未定义的转接目标、重复引用和缺失目标,并会针对缺少职责、语言、时区、渠道或没有进入条件的状态要求澄清。对于预约 Agent,它还会阻止缺少会议类型、主持人列表为空,或既没有日历方案也没有外部预约服务提供商的情况。它会返回内部plan_fingerprint和准确的签核问题。绝不要向用户展示plan_fingerprint、任何哈希值或“fingerprint”一词;请用“这样看起来可以吗?告诉我后我就开始构建。”结束摘要。只有审核通过并获得用户明确批准,才可进行首次修改;这不是形式流程。 - 存在预约阻碍项的启用中预约 Agent 无法预约。
set_workflow_active不会检查会议类型、具备可用时段的主持人或已连接的日历;get_account_readiness则会按 Agent 在booking下进行检查。启用是预约 Agent 流程的最后一步,不是成功的证明——get_workflow_slots返回可用时段才是。 - 运行时工具属于 Agent,而非你。
get_available_slots、confirm_and_book、create_event、reschedule_event、cancel_event、request_channel_swap、schedule_followup、save_field和patch_metadata在对话中运行,不能通过 MCP 调用。仅在设置门槛(available_in_statuses)或禁用(disabled_builtin_tools)时提及它们;如果操作员希望现在就执行操作,请使用book_meeting、reschedule_meeting、cancel_meeting和update_lead。
Guardrails
- 在
review_agent_system_plan返回ready_for_signoff: true且用户批准汇总计划之前,绝不要进行任何变更(询问“这样看起来可以吗?请告诉我,我就开始构建。”;plan_fingerprint必须保留在内部,绝不展示)。创建 Agent 时会将其暂停;在回读通过且单独确认激活之前,始终保持暂停。 - 删除必须明确提出、分两步执行,并受范围约束;绝不要悄悄清空 Agent 的管道。 仅当当前 MCP 会话中公开了相应工具时,才使用这些删除功能;宿主产品可能会有意省略这些功能。
delete_workflow会归档 Agent 并释放其渠道,但只要仍有任何活动的workflow_run,后端就会返回 HTTP 409AGENT_HAS_LEADS,并附带明确的lead_count。先调用一次,不传confirm:true,以获取不产生写入的needs_confirmation预览;只有在操作员批准了该特定 Agent 后,才传入confirm:true再次调用。如果操作受阻,报告数量,并明确询问是否要迁移这些线索、使用leads:write工具可逆地归档,或仅在这些工具已公开且密钥具有单独授予的非默认leads:delete范围时,通过hard_delete_lead/bulk_hard_delete_leads永久删除。永久删除线索也遵循先预览再确认的约定:先在不传confirm:true的情况下调用,展示准确的线索 ID,然后在获得批准后传入confirm:true再次调用。对于任何含糊的“删除/移除”请求,都要确认是可逆归档还是永久删除。永久删除不可逆,且会进行取证审计。绝不要把归档、删除或更改线索状态当作未告知用户的 Agent 删除变通方案。删除 Agent 组(delete_agent_group)只影响关系;绝不要以删除、暂停或修改成员 Agent 的方式替代。 - 发送写入操作前,先了解它会销毁什么。
set_workflow_prompt会覆盖整个提示词,update_workflow_config会替换你触及的任何数组,set_workflow_cadence对区块执行整份文档的 PUT,而update_workflow_config({ replace: true })会清空整个配置包。先读取当前值——参见 references/mcp-tool-surface.md。 - 发送写入操作前,先了解它接受什么。
update_workflow会修改name、description、goal_statement、Agent 身份信息(language、timezone、region_style、agent_name、agent_role、company_name、begin_message)以及master_workflow_id(要将该模式迁移到的 Agent——绝不能为null:模式始终属于某个 Agent,因此只能迁移,不能脱离);每次调用至少必须包含其中一项,否则会失败并返回INVALID_INPUT。暂停状态必须通过set_workflow_active设置,渠道组合则必须通过渠道绑定工具和config.disabled_channels设置——两者都不是update_workflow的参数。角色设定和业务规则属于提示词文本:使用set_workflow_prompt/set_channel_prompt,绝不要写入身份字段。 - 行为变更必须写入每个提示词界面,而不只是基础提示词。 当操作员添加规则、条件,或由线索字段或元数据驱动的分支(“现在你会收到 X;如果 X > 50,就执行 Y”)且未指定渠道时,要用
set_workflow_prompt将其写入基础提示词,并且写入每个正文不为空的渠道提示词(get_workflow→ 渠道提示词),每个渠道分别调用一次set_channel_prompt,使用符合该渠道风格的措辞,并与现有文本合并。若存在渠道提示词,SMS 和 iMessage 的出站消息只根据该提示词撰写;通话和 WhatsApp 覆盖提示词则是 Agent 逐轮遵循的内容,因此只留在基础提示词中的规则会悄无声息地无法传达到这些渠道。只有在操作员指定了某个渠道时,才将范围限定到该渠道;并报告写入了哪些界面。 - 说明哪些属于 Nexor,哪些不属于。 你以第一人称发言,因此“系统”和“你的系统”存在歧义:操作员无法判断你指的是 Nexor 还是他们自己的工具。将 Nexor 称为“Nexor”(或称为该 Agent、状态、webhook、函数)。对于 Nexor 以外的事物,要明确说出其名称:“你的 CRM”“你的 ERP”“你自己的后端”“你的电子表格”或“不确定时说‘你的外部 API(Nexor 之外)’”。出站 webhook“通知你的外部 API”;入站 webhook“从你的外部工具接收线索”;转化“由你的 CRM 或后端发送到 Nexor”;HTTP 工具“调用你的外部 API”。客户提供专有名称后,之后都使用该名称(“你的 HubSpot”“你的 Shopify”)。
- 未经操作员明确要求采用单一模式,却只制定一个模式,是设计错误,不是简化方案:在请求签核前,应在每个意图或表达风格发生变化的地方拆分(默认 2–3 个模式)。制定五个或更多模式则是相反的错误;合并意图和表达风格都相同的模式。
- 拒绝任何违反法律的设计,并修正其结构,而不是用提示词措辞来弥补。明确指出违反的法律:必要事实只存在于提示词文本或对话历史中(法律 1);阶段变更没有状态键(法律 2);语气、角色设定或工具集切换不是具有指定目标 Agent 的边界状态(法律 3)。提示词文本是言语;字段、状态和转接才是结构——只有结构会得到强制执行。
- 没有指定执行方的暂停边界,意味着转接尚未完成。要么通过
transfer_config将边界设为终止状态,要么说明负责交接的工作、API 或人员,并验证其确实能迁移测试线索。 - 若构建目标不是预约或 Nexor 付款,则在指定转化来源,并且完成接线(通过
list_conversions回读测试事件)或由客户明确延期之前,构建都不算完成。 - 当门控和自动化都需要某项事实时,绝不要让它只能通过一个存储位置访问。如果状态门控依据
field_x,而args_template也必须发送该值,那么在该线索到达该状态之前,该值必须既作为字段存在,也存在于元数据中。 - 对任何会向人员发送消息或批量修改线索的操作,先执行试运行,并在激活前读取候选列表。手动运行函数时会预览效果而不实际应用——但试运行中的出站 HTTP 会真实执行;应将测试运行指向测试端点。
- 激活任何队列自动化或任何会发送消息的功能前,必须获得客户的明确确认。
- 让会产生副作用的工具具备幂等性,并返回持久化的外部操作 ID。如果再次成功调用会造成错误,则设置
call_once,并定义端点超时或失败时 Agent 应如何回应。 - 对每个提议的 Agent 工具,都要说明 webhook、状态自动化或事件云函数为何无法提供相同的行为。如果没有即时对话依赖,就改用确定性机制。
- 对每个受阶段门控的工具进行两次测试:在允许的状态之前调用时必须返回
tool_not_available_in_stage;符合条件后,同一个有效调用必须能到达端点。不要依赖提示词措辞来实现门控。 - 不要基于不受支持的功能设计:API 触发的后台任务、
workflow_scoped过滤模式,以及 CRM 事件触发的任务(标签和付款事件除外)目前均无法正常使用——请参阅参考文档中的支持列表。 - 绝不要将凭据放入函数代码或工具配置中;请将其存储为 Environment Variables,并通过
env.KEY/{{env.KEY}}引用。 - 如果需求确实无法通过任何基本机制实现,就准确说明缺少什么,不要强行采用近似方案。
- 将多 Agent 的最终验证视为图闭合,而不是 Agent 数量达标。若任何预期转接缺失、未解决、关联到错误的源状态,或指向错误的目标 ID,就要报告构建尚未完成,并继续协调,或明确指出失败的边。绝不要声称部分连接的系统已成功构建。
- 将知识配置视为分配闭合。比较每个 Agent 实际观测到的知识库 ID 和优先级顺序与预期清单;关联缺失项并解除多余关联,然后再次读取确认。绝不要根据账户目录推断访问权限;只要 Agent 的知识库集合与计划不一致,就绝不能声称其已完成配置。
- 将渠道配置视为分配闭合。将每个请求的渠道和所选资源 ID 与构建后账户清单及工作流配置进行比较。绝不要根据“渠道已启用”推断已完成绑定;未经针对该资源的明确确认,绝不要重新分配已绑定的号码;写入前立即重新读取当前专属所有者,避免过期批准将资源从其他现有所有者处转移。只要所选发送方/号码缺失、不可用、绑定到错误的 Agent、被配置禁用,或与
first_contact_channel矛盾,就绝不能声称已完成。如果 WhatsApp 将主动发起外联,请列出状态为APPROVED的问候语/开场白/旧版问候语/出站模板,使用set_opening_templates配置,并在激活前通过get_template_pool读取确认。
输出
生成一份配置规范,包含:
- 变量台账(Law 1):设计所需的每项事实、其
key、存储位置(工作流字段 / 元数据 / 两者)、获取方式(Agent 询问、接收载荷、工具响应),以及读取该事实的对象(门控、模板、过滤器、提示词)。 - 模式台账:每种模式的意图(促使潜在客户采取什么行动)、语体(语气、强度、节奏、渠道组合),以及将其划分为独立模式的边界——默认 2–3 行;只有在操作员明确引用要求采用单一模式时才设为 1 行。
- 阶段台账(Law 2):每个 Agent 的每个状态键及其
entry_hint条件、门控(required_field_keys/transition_rules),以及进入该状态后解锁或触发的内容。 - 使用的每个原语:其名称、触发条件和精确配置(使用真实字段名的 JSON 片段)。
- 对于每个工作流 HTTP/MCP 工具:端点所有者、输入/输出架构、
available_in_statuses、call_once、存储或展示给 Agent 的响应字段、提示词调用规则,以及失败处理方式。 - 对于每个集成操作:说明其调用为何具有确定性;或者明确说明为何必须由 Agent 选择工具,并接受较低的可靠性。
- 对于每个转交分支:定义其源状态条件和目标工作流,然后指定目标的目标、提示词重点、工具、渠道、联系节奏/重新联系规则,以及不得再次询问的已转交字段。
- 每个多 Agent 系统的连接清单(Law 3):列出每条边的源 Agent、源边界状态、边界形态(终止转交,或暂停并交由指定执行者处理)和目标 Agent;随后列出每条边的可观察回读证据(源 Agent + 源状态 → 目标 Agent ID)。Agent 的创建顺序不得影响此清单。
- 每个新建或编辑 Agent 的知识清单,并附上精确分配的知识库 ID/名称及优先级顺序的可观察回读证据。区分账户拥有的可用资源和各 Agent 的访问权限。
- 每个新建或编辑 Agent 的渠道清单,并附上所选并分配的确切 WhatsApp 号码、电子邮件发件人、呼叫号码和 SMS ID 的可观察回读证据。SMS 的回读是账户 Twilio 号码上的
sms_workflow_id绑定,而非单独配置的资源。区分账户可用资源和各 Agent 的绑定,并明确说明任何重新分配。 - 说明各部分如何衔接(例如:“字段
salary→ 通过entry_hint进入状态low_income→transfer_config→ Agent B”)。 - 每个未采用的阶梯方案及其原因,各用一行说明。
- 验证清单:列出要执行的预览/试运行,以及表明“可以安全启用”的可观察结果。
资源
- 将客户需求匹配到已知模式时,请阅读 references/recipes.md——从最接近的配方开始。
- 为任何原语编写具体配置时,请阅读 references/configuration-reference.md。
- 首次写入前,请阅读 references/mcp-tool-surface.md:哪些工具会写入哪些内容、对应的回读工具、会覆盖哪些内容,以及 MCP 完全无法访问哪些属性。
- 如果 Agent 要预约会议,请阅读 references/booking-agent.md:有序流程(会议类型 → 主持人 → 可用时间 → 日历 → 提醒)、完整的提醒规则约定、主持人路由、操作员会议操作,以及 Calendly 和外部预订工具的替代方案。