关于 multi-turn-ordering
用于构建 ServiceNow 虚拟 Agent 多轮目录订购对话的技能,面向希望员工通过聊天浏览、选择和提交目录订单的团队。涵盖商品消歧、逐步收集变量以及购物车提交。
主要功能
- 01配置虚拟 Agent 目录订购主题
- 02搜索并消歧目录商品
- 03逐轮收集必填变量
- 04管理购物车并提交订单
- 05维护跨轮次对话上下文
适用场景
- 01在聊天中订购硬件或软件
- 02为复杂目录表单设计引导式提问
- 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_item | GET | 查询可订购的目录项 |
/api/now/table/item_option_new | GET | 获取用于收集信息的项目变量 |
/api/now/table/sc_category | GET | 浏览目录类别 |
/api/now/table/sys_cb_topic | GET/POST/PATCH | 管理 Virtual Agent 主题 |
/api/now/table/sys_cb_topic_detail | GET/POST | 配置对话流程节点 |
/api/sn_sc/servicecatalog/items | GET | 获取项目详情的 Service Catalog API |
/api/sn_sc/servicecatalog/cart | POST | 管理购物车并提交订单 |
最佳实践
- 保持对话简短: 最多限制为 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