mcpField
M
multi-turn-ordering

multi-turn-ordering

github.com/happy-technologies-llc开发4141 次安装2 天前更新
代码仓库

关于 multi-turn-ordering

用于构建 ServiceNow 虚拟 Agent 多轮目录订购对话的技能,面向希望员工通过聊天浏览、选择和提交目录订单的团队。涵盖商品消歧、逐步收集变量以及购物车提交。

主要功能

  1. 01配置虚拟 Agent 目录订购主题
  2. 02搜索并消歧目录商品
  3. 03逐轮收集必填变量
  4. 04管理购物车并提交订单
  5. 05维护跨轮次对话上下文

适用场景

  1. 01在聊天中订购硬件或软件
  2. 02为复杂目录表单设计引导式提问
  3. 03为多个匹配商品提供选择流程

MCP 相关

说明如何使用 ServiceNow MCP 工具查询目录、创建和更新虚拟 Agent 主题及节点,并执行脚本测试对话流程。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill multi-turn-ordering

安装后在 Claude Code 中输入/multi-turn-ordering确认已加载。

详细介绍

多轮目录订购

概述

此技能可配置对话式多轮订购流程,让用户通过引导式对话浏览、选择和订购目录项目。内容包括:

  • 使用 sys_cb_topic 设置用于目录订购对话的 Virtual Agent 主题
  • 配置从 sc_cat_item 和 sc_category 中查找并选择项目的对话流程
  • 设计多轮变量收集流程,逐步收集 item_option_new 的值
  • 通过 Service Catalog API 实现购物车管理和下单
  • 处理用户请求匹配到多个项目时的消歧
  • 管理复杂订购场景中的跨轮对话上下文

适用场景: 组织希望员工通过基于聊天的界面(Virtual Agent、Slack、Teams)订购目录项目,而不是访问传统目录门户;或者项目需要通过引导式的分步流程收集变量。

价值主张: 多轮订购可降低目录放弃率,通过引导用户填写复杂表单来改善申请者体验,并支持用户在无法访问门户时通过消息平台订购。

前提条件

  • 插件: com.glide.cs.chatbot(Virtual Agent)、com.glideapp.servicecatalog(Service Catalog)
  • 角色: admin、virtual_agent_admin 或 catalog_admin
  • 访问权限: 对 sc_cat_item、sc_category、item_option_new、sys_cb_topic 和 sys_cb_topic_detail 的读写权限
  • 知识: 了解 Virtual Agent 主题设计、NLU 模型和 Service Catalog API

操作步骤

步骤 1:确定适合对话式订购的目录项目

确定适合多轮订购的项目。包含 3-8 个变量且选择路径清晰的项目效果最佳。

使用 MCP(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sc_cat_item
  query: active=true^type=item^sc_catalogs.titleLIKEService Catalog
  fields: sys_id,name,short_description,category,sc_catalogs,price,order,availability
  limit: 50
  order_by: category,name

使用 REST API:

GET /api/now/table/sc_cat_item?sysparm_query=active=true^type=item&sysparm_fields=sys_id,name,short_description,category,sc_catalogs,price,order&sysparm_limit=50&sysparm_display_value=true

检查每个项目的变量数量以评估复杂度:

Tool: SN-Execute-Background-Script
Parameters:
  description: Count variables per catalog item for ordering suitability
  script: |
    var items = new GlideRecord('sc_cat_item');
    items.addQuery('active', true);
    items.addQuery('type', 'item');
    items.orderBy('category');
    items.query();

    var results = [];
    while (items.next()) {
      var vars = new GlideAggregate('item_option_new');
      vars.addQuery('cat_item', items.sys_id);
      vars.addQuery('active', true);
      vars.addAggregate('COUNT');
      vars.query();

      var varCount = 0;
      if (vars.next()) varCount = parseInt(vars.getAggregate('COUNT'));

      var mandatoryVars = new GlideAggregate('item_option_new');
      mandatoryVars.addQuery('cat_item', items.sys_id);
      mandatoryVars.addQuery('active', true);
      mandatoryVars.addQuery('mandatory', true);
      mandatoryVars.addAggregate('COUNT');
      mandatoryVars.query();

      var mandCount = 0;
      if (mandatoryVars.next()) mandCount = parseInt(mandatoryVars.getAggregate('COUNT'));

      if (varCount > 0) {
        results.push({
          name: items.name.toString(),
          category: items.category.getDisplayValue(),
          total_variables: varCount,
          mandatory_variables: mandCount,
          suitability: varCount <= 8 ? 'Good' : 'Complex'
        });
      }
    }

    gs.info(JSON.stringify(results, null, 2));
步骤 2:设计对话流程

将订购流程拆解为多个对话轮次:

轮次机器人操作用户回复捕获的数据
1“您想订购什么?”“我需要一台新笔记本电脑”意图:catalog_order,关键词:laptop
2“我找到了以下选项:[列表]”“性能款”项目选择
3“您需要多大容量的 RAM?”“16GB”变量:ram_size
4“您需要多大存储容量?”“512GB SSD”变量:storage_size
5“请说明业务理由。”“当前笔记本电脑出现故障”变量:justification
6“确认订单:[摘要]”“是,提交”提交购物车
步骤 3:创建 Virtual Agent 主题

配置用于目录订购的 Virtual Agent 主题。

使用 MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cb_topic
  fields:
    name: "Order Catalog Item"
    description: "Conversational flow for browsing and ordering service catalog items with guided variable collection"
    category: service_catalog
    active: true
    enabled: true
    nlu_intent: catalog_order
    greeting_message: "I can help you order from the service catalog. What are you looking for?"
    fallback_message: "I couldn't find a matching item. Could you describe what you need differently?"
    end_message: "Your order has been submitted! You'll receive a confirmation email shortly."
    topic_type: standard

使用 REST API:

POST /api/now/table/sys_cb_topic
Content-Type: application/json

{
  "name": "Order Catalog Item",
  "description": "Conversational flow for browsing and ordering service catalog items",
  "category": "service_catalog",
  "active": "true",
  "enabled": "true",
  "nlu_intent": "catalog_order",
  "greeting_message": "I can help you order from the service catalog. What are you looking for?",
  "topic_type": "standard"
}
步骤 4:配置用于项目查找的主题详情

添加处理项目搜索和选择的主题详情节点。

创建搜索节点:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cb_topic_detail
  fields:
    topic: [topic_sys_id]
    name: "Search Catalog Items"
    node_type: script
    order: 100
    script: |
      (function() {
        var keyword = vaSystem.getLastUserMessage();
        var items = [];

        var gr = new GlideRecord('sc_cat_item');
        gr.addQuery('active', true);
        gr.addQuery('type', 'item');
        gr.addQuery('nameLIKE' + keyword)
          .addOrCondition('short_descriptionLIKE' + keyword);
        gr.setLimit(5);
        gr.query();

        while (gr.next()) {
          items.push({
            sys_id: gr.sys_id.toString(),
            name: gr.name.toString(),
            description: gr.short_description.toString(),
            price: gr.price.toString()
          });
        }

        vaVars.items = JSON.stringify(items);
        return items.length > 0 ? 'found' : 'not_found';
      })();

为多个匹配项创建消歧节点:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cb_topic_detail
  fields:
    topic: [topic_sys_id]
    name: "Disambiguate Items"
    node_type: user_input
    order: 200
    prompt_message: "I found multiple items matching your request. Which one did you mean?"
    input_type: picker
    picker_source_variable: items
步骤 5:配置变量收集节点

创建用于收集每个必需变量的对话节点。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Create variable collection nodes for catalog item ordering
  script: |
    var topicId = '[topic_sys_id]';
    var itemId = '[cat_item_sys_id]';

    // Get mandatory variables for the item
    var vars = new GlideRecord('item_option_new');
    vars.addQuery('cat_item', itemId);
    vars.addQuery('active', true);
    vars.addQuery('mandatory', true);
    vars.orderBy('order');
    vars.query();

    var nodeOrder = 300;
    while (vars.next()) {
      var detail = new GlideRecord('sys_cb_topic_detail');
      detail.initialize();
      detail.topic = topicId;
      detail.name = 'Collect: ' + vars.question_text.toString();
      detail.node_type = 'user_input';
      detail.order = nodeOrder;
      detail.prompt_message = vars.question_text.toString();

      // Map variable type to input type
      var varType = parseInt(vars.type);
      if (varType === 3) {
        detail.input_type = 'picker';
      } else if (varType === 9) {
        detail.input_type = 'date';
      } else if (varType === 2) {
        detail.input_type = 'text_area';
      } else {
        detail.input_type = 'text';
      }

      detail.mapped_variable = vars.name.toString();
      detail.insert();
      nodeOrder += 100;
    }

    gs.info('Created ' + ((nodeOrder - 300) / 100) + ' variable collection nodes');
步骤 6:添加订单确认和提交功能

创建确认节点和购物车提交节点。

创建确认节点:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cb_topic_detail
  fields:
    topic: [topic_sys_id]
    name: "Confirm Order"
    node_type: user_input
    order: 900
    prompt_message: "Here's your order summary:\n\nItem: {{selected_item_name}}\n{{variable_summary}}\n\nWould you like to submit this order?"
    input_type: yes_no

使用 Service Catalog API 创建提交节点:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cb_topic_detail
  fields:
    topic: [topic_sys_id]
    name: "Submit Order"
    node_type: script
    order: 1000
    script: |
      (function() {
        var itemId = vaVars.selected_item_id;
        var variables = JSON.parse(vaVars.collected_variables || '{}');

        // Create cart item
        var cart = new sn_sc.CatalogOrderHelper();
        cart.setRequestedFor(vaSystem.getUserSysId());

        var cartItem = cart.addToCart(itemId);
        for (var key in variables) {
          cartItem.setVariable(key, variables[key]);
        }

        var request = cart.submitOrder();
        vaVars.request_number = request.number;

        return 'submitted';
      })();
步骤 7:测试并发布对话流程

端到端验证多轮流程。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sys_cb_topic_detail
  query: topic=[topic_sys_id]
  fields: sys_id,name,node_type,order,prompt_message,input_type,mapped_variable
  limit: 20
  order_by: order

使用 REST API:

GET /api/now/table/sys_cb_topic_detail?sysparm_query=topic=[topic_sys_id]^ORDERBYorder&sysparm_fields=sys_id,name,node_type,order,prompt_message,input_type,mapped_variable&sysparm_limit=20&sysparm_display_value=true

激活主题:

Tool: SN-Update-Record
Parameters:
  table_name: sys_cb_topic
  sys_id: [topic_sys_id]
  fields:
    active: true
    enabled: true
    published: true

工具用法

MCP 工具参考
工具适用场景
SN-Query-Table查询目录项、变量、类别和主题
SN-Create-Record创建主题、主题详情和目录配置
SN-Update-Record激活并发布主题、更新项目设置
SN-Natural-Language-Search查找与自然语言查询匹配的目录项
SN-Execute-Background-Script批量创建对话节点并测试流程
SN-Discover-Table-Schema探索 Virtual Agent 和目录表架构
REST API 参考
端点方法用途
/api/now/table/sc_cat_itemGET查询可订购的目录项
/api/now/table/item_option_newGET获取用于收集信息的项目变量
/api/now/table/sc_categoryGET浏览目录类别
/api/now/table/sys_cb_topicGET/POST/PATCH管理 Virtual Agent 主题
/api/now/table/sys_cb_topic_detailGET/POST配置对话流程节点
/api/sn_sc/servicecatalog/itemsGET获取项目详情的 Service Catalog API
/api/sn_sc/servicecatalog/cartPOST管理购物车并提交订单

最佳实践

  • 保持对话简短: 最多限制为 5-7 轮;尽可能将相关变量合并到单个提示词中
  • 提供快捷选项: 在搜索完整目录前,先展示最热门的 3-5 个项目
  • 在每轮对话中提供上下文: 提醒用户正在订购什么,以及还需要哪些信息
  • 支持返回修改: 允许用户说“返回”或“更改我的选择”来修改之前的回答
  • 使用丰富消息: 使用卡片式回复展示项目图片、价格和描述
  • 优先收集必填变量: 先询问必填字段,再询问可选字段,以尽量减少用户放弃
  • 提交前确认: 始终显示完整订单摘要,并要求用户明确确认
  • 妥善处理错误: 当搜索不到匹配项目时,建议按类别浏览或重新表述查询

故障排除

Virtual Agent 无法识别目录意图

原因: NLU 模型未使用足够的表达方式训练目录订购意图 解决方案: 为 catalog_order 意图添加训练表达,例如“I need to order”“request a new”“can I get a”“I want to buy”。添加表达后重新训练 NLU 模型。

变量无法在轮次之间保存

原因: 对话变量(vaVars)未正确映射到目录变量 解决方案: 验证每个主题详情节点上的 mapped_variable 是否与 item_option_new 中的 name 字段匹配。检查提交脚本中的变量名称是否完全一致。

购物车提交失败

原因: 缺少必填变量、变量值无效或用户会话存在问题 解决方案: 在提交节点之前验证是否已收集所有必填变量。添加一个提交前脚本节点,检查是否有缺失值,并在需要时循环返回。确认实例中存在 CatalogOrderHelper。

项目搜索结果有误

原因: 搜索查询范围过广,或目录项缺少描述性名称和关键词 解决方案: 在项目的 short_description 和 description 字段中添加便于搜索的关键词。考虑添加目录关键词字段,或使用 NLU 实体提取来优化搜索。

示例

示例 1:简单硬件订购对话
Bot: "What would you like to order?"
User: "I need a new monitor"
Bot: "I found 2 monitors available:
      1. Standard Monitor (24" Dell) - $350
      2. Ultra-Wide Monitor (34" LG) - $750
      Which one would you like?"
User: "The ultra-wide"
Bot: "What is your desk location?"
User: "Building A, Floor 3, Desk 312"
Bot: "Do you need any mounting accessories? (desk mount, wall mount, or none)"
User: "Desk mount please"
Bot: "Order Summary:
      Ultra-Wide Monitor (34" LG) - $750
      Location: Building A, Floor 3, Desk 312
      Mounting: Desk mount
      Shall I submit this order?"
User: "Yes"
Bot: "Order submitted! Request REQ0045123 created. Expected delivery: 5-7 business days."
示例 2:带有消歧功能的软件申请
Bot: "What would you like to order?"
User: "I need Adobe"
Bot: "I found several Adobe products:
      1. Adobe Creative Cloud (Full Suite) - $55/mo
      2. Adobe Acrobat Pro - $15/mo
      3. Adobe Photoshop (Single App) - $22/mo
      Which one do you need?"
User: "Just Acrobat"
Bot: "How many licenses do you need?"
User: "3"
Bot: "Business justification for the licenses?"
User: "Legal team needs PDF editing for contract reviews"
Bot: "I'll submit this for approval since it's 3+ licenses. Confirm?
      Adobe Acrobat Pro x3 - $45/mo
      Justification: Legal team PDF editing for contract reviews"
User: "Confirm"
Bot: "Submitted! REQ0045124 is pending manager approval."

相关技能

  • catalog/catalog-item-generation - 根据描述生成目录项
  • catalog/variable-management - 高级变量配置
  • catalog/item-creation - 标准目录项设置
  • catalog/request-fulfillment - 订单提交后的履行工作流
  • catalog/approval-workflows - 订单审批路由
  • genai/playbook-generation - 生成 Virtual Agent Playbook

评论

支持 Markdown