准备工作
在您使用 Food Ordering AI Agent API 注入和管理菜单之前,请先执行以下操作:
启用 Food Ordering AI Agent API:
gcloud services enable foodorderingaiagent.googleapis.com --project=PROJECT确保您拥有必要的 IAM 权限。向与该 API 互动的用户或服务账号授予以下 Identity and Access Management (IAM) 角色:
- Food Ordering Agent Admin (
roles/foodorderingaiagent.admin):此角色提供对所有 Food Ordering AI Agent 资源的完全访问权限,包括品牌、商店和菜单,可用于创建、读取、更新和删除这些资源。
您可以使用 Google Cloud 控制台、
gcloud命令行工具或 IAM API 授予 IAM 角色。如需了解详情,请参阅授予 IAM 角色。如需使用 Google Cloud 控制台授予角色,请执行以下操作:
- 在 Google Cloud 控制台中,前往 IAM 页面。
- 点击 Add(添加)。
- 输入主账号(用户或服务账号电子邮件地址)。
- 选择 Food Ordering AI Agent Admin 角色。
- 点击保存。
如果没有适当的权限,则创建或修改品牌、商店或菜单的 API 调用会被拒绝。
Food Ordering Agent Viewer角色仅授予只读权限,因此不足以完成本指南中所述的任务。- Food Ordering Agent Admin (
概览
Food Ordering AI Agent Menu API 旨在实现灵活性,可适应各种菜单结构,从简短的单点菜品列表到包含嵌套修饰符和套餐的复杂菜单。该 API 围绕以下几个关键概念构建而成:
- 菜单:所有可订购实体的顶级容器。
- 商品:表示菜单中可订购的顶级商品,例如餐点、主菜或任何可单独订购的商品。
Item可以引用ModifierGroup。 - ModifierGroup:一组可应用于
Item或另一个Modifier的Modifier选项(允许嵌套)。例如“选择配菜”“添加配料”或“选择饮料口味”。 - 加料项:
ModifierGroup中的单个选项,例如“薯条”“加奶酪”或“可乐”。修饰符可以调整价格,还可以拥有自己的嵌套ModifierGroup。 - MenuCategory:用于将
Item整理成多个部分,以便显示和理解(例如,“开胃菜”“汉堡”“饮料”)。
主要概念和结构
本部分详细介绍了 Food Ordering AI Agent Menu API 架构的核心组件及其结构。了解这些概念对于正确建模菜单数据至关重要。
内容
菜单上的每个不同项都应定义为 Item。关键字段包括:
id:菜单中的唯一标识符。display_name:面向客户的名称。base_price:商品的底价。modifier_groups:可应用于相应商品的ModifierGroup的引用。category_ids:相应商品所属的MenuCategoryID 的引用。availability:指定商品何时可供购买(例如按状态或时段)。如果未指定,则默认值为STATUS_AVAILABLE。
修饰符和 ModifierGroups
借助修饰符,您可以自定义项。
ModifierGroup定义了一组选项,包括选择次数下限或上限等限制。必须包含至少一个Modifier。Modifier表示实际的选项。它们可以具有price_adjustment,并且可以递归引用其他ModifierGroup以实现嵌套自定义(例如,“套餐”Item可能具有“选择饮料”ModifierGroup,而该组中的“苏打水”Modifier可能具有“选择口味”ModifierGroup)。
示例 1:配料
“培根芝士汉堡”Item 可能会引用“配料”ModifierGroup。此 ModifierGroup 将包含“加奶酪”“不加洋葱”等 Modifier。
示例 2:套餐
有些菜单的结构很复杂,包含多个嵌套选项,例如套餐或“组合”。组合可以建模为 Item,其中包含多个表示组合组成部分的 ModifierGroup。例如,一个“汉堡套餐”Item,包含一份固定主菜,搭配多种可选的配菜和饮料,可以用以下方式建模:
- 侧面
ModifierGroup(例如“侧面选择”)。- 每个侧面选项都以
Modifier(例如“薯条”“沙拉”)。- 每个饮料选项都可以引用嵌套的
ModifierGroup(例如“冰块选项”“饮料大小”),这些变量又会引用Modifier(例如“不加冰”“大杯饮料”)。
- 每个饮料选项都可以引用嵌套的
- 每个侧面选项都以
- 饮料的
ModifierGroup(例如,“饮料”)。- 每种饮料选项都以
Modifier为模型。- 每个饮料选项都可以引用嵌套的
ModifierGroup(例如“冰块选项”“饮料大小”),而这些属性又会引用Modifier(例如“不加冰”“大杯饮料”)。
- 每个饮料选项都可以引用嵌套的
- 每种饮料选项都以
- 主菜的配料的
ModifierGroup。(例如,“Extra Cheese”“Bacon”)。
可用性
Item 和 Modifier 上的 Availability 消息可让您指定:
status:STATUS_AVAILABLE、STATUS_OUT_OF_STOCK等daypart_availability:如果商品仅在特定时段提供,则链接到特定时段 ID(例如 “早餐菜单”)。
集成属性
Item、Modifier 和 ModifierGroup 消息包含 integration_attributes 字段。此字段(ItemIntegrationAttributes、ModifierIntegrationAttributes 等)包含一个名为 custom_integration_attributes 的 google.protobuf.Struct。您可以使用此方法存储任意键值数据,例如:
- 销售终端 (POS) 系统中的 ID。
- SKU 或其他内部代码。
- 下游订单处理或 POS 集成所需的任何其他元数据。
此数据由 AI 代理以不透明方式传递。
标签
您可以使用 Menu 资源中的 labels 字段将元数据附加到菜单,以帮助进行集成和调试。
标签是一项便利功能,不会影响 AI 代理的行为。
创建菜单
菜单通过 MenuService 中的 CreateMenu RPC 调用进行提取。
步骤
- 转换数据:将现有菜单数据(来自 POS、API 或其他来源)转换为
google.cloud.foodorderingaiagent.v1beta.Menu消息定义的结构。这包括将您的商品、加项、类别和价格映射到相应的 API 消息类型。 - 构建
CreateMenuRequest:- 设置
parent字段(例如,projects/PROJECT/locations/LOCATION)。 - 使用转换后的
Menu对象填充menu字段。 - 可以选择提供
menu_id。
- 设置
- 调用 API:将
CreateMenuRequest发送到MenuService.CreateMenu端点。API 会先清理菜单,然后验证菜单,并返回最终的Menu对象。 - 处理菜单更新:每次更新菜单源数据(例如,推出新产品或产品变为不可用)时,都应创建一个新的
Menu来反映更新后的源数据,并按照处理菜单更新中的说明进行操作。
数据转换指南
转换菜单数据的具体逻辑将取决于源系统的格式和结构(例如,POS API、数据库架构)。以下是一般方法:
- 导出数据:获取菜单数据的完整导出内容,包括所有商品、加项、价格和关系。
- 映射实体:
- 针对源数据中的每个元素,确定 Food Ordering AI Agent API 架构中的相应实体。例如,您的 POS“菜单项”可能会映射到
Item对象。“订购选项”或“加购项”将映射到Modifier和ModifierGroup。 - 使用 ID 建立关系。例如,使用
modifier_groups引用字段将Item关联到适用的ModifierGroup。
- 针对源数据中的每个元素,确定 Food Ordering AI Agent API 架构中的相应实体。例如,您的 POS“菜单项”可能会映射到
- 处理嵌套结构:如果您的菜单包含嵌套的加项(例如,为套餐中的苏打选择饮料口味),请通过让
Modifier引用其他ModifierGroup来对此进行建模。 - 填充属性:根据源数据填写
display_name、base_price、price_adjustment和availability等字段。 - 包含销售终端 (POS) ID:至关重要的是,在
custom_integration_attributes字段中存储每个商品、修饰符和组的内部销售终端 (POS) 或系统 ID。这样一来,您就可以将代理生成的Order翻译回应用中最终订单或正在进行中的购物车的表示形式。 - 编写脚本:您可能需要编写一个脚本(例如使用 Python、Node.js、Go),用于从来源提取数据、执行转换,并调用
CreateMenu方法。此脚本将使用 Google Cloud 客户端库进行身份验证和 API 交互。
概念性转换工作流程:
此工作流概述了将菜单数据从源系统转换为 Food Ordering AI Agent API 格式的过程:
- 提取和映射类别:
- 确定源数据中的类别或部分(例如 “开胃菜”“主菜”)。
- 将每个元素转换为具有唯一
id和display_name的MenuCategory对象。
- 提取和映射项:
- 识别源数据中的可售商品。
- 将每个对象转换为
Item对象,并填充id、display_name、base_price和availability。 - 使用
category_ids字段将每个Item映射到其类别。 - 在
item.integration_attributes.custom_integration_attributes中存储源系统标识符(例如 PLU 或 SKU)。
- 提取和映射修饰符:
- 确定来源数据中的商品定制、选项或加购项。
- 相关选项组(例如,“配菜选项”“饮料选项”“额外配料”)转换为
ModifierGroup对象。在每个ModifierGroup上定义最小和最大选择规则。 - 转换每个单独的选项(例如,将“薯条”“可乐”“加奶酪”等字符串转换为相应
ModifierGroup中的Modifier对象。如果适用,请填充price_adjustment。 - 在
modifier_group.integration_attributes.custom_integration_attributes和modifier.integration_attributes.custom_integration_attributes中存储源系统标识符。
- 建立关系:
- 对于每个
Item,使用适用于它的ModifierGroup的id的引用填充其modifier_groups字段。 - 如果
Modifier允许进一步自定义(例如,为“苏打水”修饰符选择口味),请填充其modifier_groups字段以创建嵌套修饰符。
- 对于每个
- 组装和提取:
- 将所有
MenuCategory、Item、ModifierGroup和Modifier对象合并到单个Menu消息中的列表中。 - 使用完全组装的
Menu消息作为输入来调用CreateMenuRPC。
- 将所有
处理菜单更新
菜单是不可变的。使用 CreateMenu RPC 调用创建菜单后,便无法修改。如需将菜单更新(例如更改商品价格、修改选项或调整供应情况)传播到菜单中,您必须通过再次调用 CreateMenu 来创建新的菜单资源。您菜单的每个版本都应作为新的 Menu 资源进行提取,并具有唯一的 menu_id。
植入新版菜单的过程与首次植入菜单的过程相同,并且会经历相同的清理和验证步骤。在处理订单时,代理的行为将始终反映与会话配置中引用的 Store 相关联的最近创建的 Menu。
自动菜单清理
CreateMenu API 会自动执行多项清理步骤,以修正常见问题并确保菜单内容在整个 API 中保持一致。在进行这些清理后,系统会应用验证,以简化客户端的菜单集成:
- 默认可用性:未明确指定
Availability.Status的Item和Modifier设置为STATUS_AVAILABLE。 - 舍弃未被引用的实体:未被任何
Item传递性引用的Modifier和ModifierGroup会从菜单中移除,因为它们无法排序。 - 舍弃空的修饰符组:舍弃不包含
modifier_ids的ModifierGroup,并移除对它们的任何引用。
菜单验证
清理完成后,API 会根据一组严格的规则验证菜单,以确保其格式正确,并且可以被 AI 代理可靠地使用。如果验证失败,CreateMenu 调用将返回一条详细说明问题的错误消息。主要验证包括:
- 必填字段:确保所有必填字段(例如
id、display_name和availability.status)都存在。 - 唯一 ID:所有
Item、Modifier和ModifierGroup都必须在菜单中具有唯一 ID。 - 唯一显示名称:
- 所有
Item都必须具有唯一的display_name。 - 在任何给定的
ModifierGroup中,所有包含的Modifier都必须具有唯一的display_name。
- 所有
- 参考完整性:
Item或Modifier引用的所有modifier_group_ids都必须存在于菜单中。ModifierGroup引用的所有modifier_ids都必须存在于菜单中。ModifierGroupReference中指定的默认修饰符必须存在于所引用的ModifierGroup中。- 如果
Modifier使用item_id引用Item,则该Item必须存在。
- 修饰符组限制:
ModifierGroup不得为空。- 系统会检查
ModifierGroup内的最小或最大选择次数是否在逻辑上保持一致。 Item或Modifier级modifier_constraints会根据所引用ModifierGroup的选择计数限制进行验证,以确保它们是可满足的。
- 嵌套深度:嵌套修饰符的深度受到限制(例如,
Item->ModifierGroup->Modifier->ModifierGroup->Modifier...),最多 5 个级别。 - 时段验证:如果
Availability中使用了时段,则必须在关联的Store资源中定义这些时段。 - 修饰符商品引用:使用
item_id引用Item的Modifier不得设置display_name或availability等字段,因为这些字段是从所引用的Item继承的。
如果违反了上述任何验证规则,系统将无法创建或更新菜单。错误消息会详细说明哪些实体导致了违规。
API 参考文档
如需详细了解所有消息和字段,请参阅 Food Ordering AI Agent API RPC 参考文档。
最佳做法
- 唯一 ID:确保
Menu范围(针对Item、Modifier、ModifierGroup、MenuCategory)内的所有id字段都是唯一的。 - 清晰的名称:使用清晰且便于客户理解的
display_name。为语义不同的产品提供不同的display_name,以引导代理正确消除歧义。 - 有效组合模型:将套餐视为
Item,其中ModifierGroup表示配菜、饮料和其他选项,如套餐中所述。这样可确保客服人员能够正确引导客户选择套餐。 - 使用集成属性:在
custom_integration_attributes中存储任何必要的 POS 或内部系统标识符,以实现无缝订单集成。 - 管理库存状况:及时更新
Availability状态。 - 全面测试:在提取数据后,通过各种订单组合测试代理对菜单的理解程度。