前言
一、整体背景:行业热度与微信的底层态度
1.1 市场现状:开发者普遍观望,热度偏理性
1.2 微信核心态度:自愿接入,打消开发者顾虑
接入收益:完成接入的小程序,可被微信 AI 主动推荐、对话调用,获得全新对话式流量入口;
无强制约束:不接入、不授权,小程序原有功能、流量、权限完全不受影响。
二、核心技术架构:双模式并行,两套 AI Agent 范式
2.1 自动模式:零代码改造,GUI Agent + 源码解析双能力
2.1.1 技术本质:模仿人类操作(GUI Agent)
读屏(页面交互授权)微信 AI 模拟真人操作小程序:读取页面视图、识别按钮 / 输入框、代替用户完成点击、搜索、下单、授权等操作,属于典型的GUI Agent(图形界面智能体)。微信配套自研了POINTS-GUI-G、UI-Oceanus两大 GUI 识别技术,优化读屏准确率,解决传统 GUI Agent 识别慢、误触率高、Token 消耗大的痛点。
读码(源码解析授权)平台在小程序提审环节,自动读取、解析小程序源码,提取页面结构、业务逻辑、API、交互流程,自动生成标准化 Skill(技能),让 AI 理解小程序的功能逻辑,弥补纯读屏的效率短板。
2.1.2 自动模式的隐性代价(开发 & 运营必看)
页面展示被重构AI 会在后端运行小程序,跳过首页、Banner、运营位、品牌门面,仅保留核心交互界面。传统视觉运营、广告位、活动弹窗在 AI 对话场景下完全失效。微信折中方案:支持原子卡片渲染,商家可在 AI 对话流中展示带品牌的交互卡片,卡片强制保留「跳转小程序入口」,挽回品牌曝光。
AI 操作视同用户行为条款明确:AI 在用户授权后的所有操作,法律层面等同于用户本人操作,开发者无正当理由不得拦截、屏蔽 AI 指令。前端在做接口拦截、风控校验时,需要兼容 AI 调用场景,避免误拦截正常请求。
适配建议(代码视角)
2.2 开发模式(Beta 内测):深度定制,工业级 AI 服务方案
2.2.1 三大核心概念(开发核心:原子接口、原子组件、SKILL)
2.2.2 小程序 MCP 协议(通信核心)
作用:作为桥梁,让微信 AI 精准发现、推理、调用开发者封装的原子接口;
开发要求:开发者只需完整实现 SKILL,无需额外适配协议底层,降低接入成本;
定位:整个开发模式的通信基石,所有接口调用、数据传输都基于此协议。
2.2.3 运行环境隔离(前端重点,避坑核心)
JS 执行环境原子接口、原子组件、动态组件分属三个独立 JS 上下文,不共享全局变量。代码避坑:不要依赖全局变量传参、共享状态,所有数据通过接口入参 / 出参传递;禁止在原子接口中使用小程序全局App()、Page()实例。
渲染环境原子组件基于glass-easel卡片引擎,WXSS 样式、组件能力和原生小程序(Skyline/WebView 引擎)存在差异:
半屏页面补充方案当卡片无法承载复杂操作时,可跳转半屏页面,其运行环境和原生小程序一致,但禁止跳转到外部公众号、视频号、其他小程序,仅承载详情展示。
2.3 完整流程演示:以 “AI 对话点咖啡” 为例(端到端链路)



用户对话:「帮我点一杯少糖拿铁」,消息上传至小程序 AI 后台;
AI 推理:通过 MCP 协议匹配对应 SKILL,调用「查询饮品 + 创建订单」原子接口;
先匹配Skills
# drink-skill WeStoreCafe 点单场景## 业务流程图```用户意图│├─ 模糊意图("想喝点什么")─→ getRecommendedDrinks → 推荐卡片│ │├─ 明确关键词("拿铁")───→ searchDrinks → 搜索结果卡片 ─┤│ ││ 用户点击卡片选择某款饮品 ││ ↓ ││ selectDrink → 饮品详情卡片│ ││ ┌───────────────┤│ ↓ ↓│ 用户在半屏选规格 Agent 使用默认规格│ ↓ ↓│ confirmSku ←───────────────┘│ ││ ↓│ 订单确认卡(order-confirm-card)│ ├─ 有地址:展示完整订单│ └─ 无地址:展示"添加收货地址"空态│ ↓│ 用户点击地址区域 → 半屏填写 → saveAddress│ ↓│ 订单确认卡更新(含地址)│ ↓│ 用户点击"确认下单" → payOrder → 支付成功卡片│└─ 门店查询("最近的店")──→ getStoreStatus → 门店状态卡片(实时刷新)```> **Agent 不能跳过 selectDrink 直接调 confirmSku**——必须先有 selectDrink 返回的有效 drinkId。> **Agent 不能跳过 confirmSku 直接调 payOrder**——必须先有 confirmed 状态的订单。> **payOrder 未返回成功前,禁止向用户宣布"已支付成功"。**## 原子接口依赖关系| 接口 | 作用 | 组件 | 前置条件 ||------|------|------|----------|| getRecommendedDrinks | 模糊意图时展示精选饮品 | recommended-drinks | — || searchDrinks | 按关键词搜索饮品 | recommended-drinks | 用户提供了关键词 || getAllDrinks | 半屏页面加载全量数据 | — | Agent 通常不直接调用 || selectDrink | 查看饮品详情与规格 | drink-detail-card | 已有 drinkId(来自推荐/搜索) || confirmSku | 确认规格生成订单 | order-confirm-card | 已调 selectDrink 获取规格信息 || getAddress | 查看默认地址 | address-card | — || saveAddress | 保存地址并续跑订单 | order-confirm-card | 用户提供了完整地址三要素 || confirmOrder | 重新展示订单确认 | order-confirm-card | 已有 orderId || payOrder | 发起支付 | pay-success-card | 订单 status=confirmed || getStoreStatus | 门店实时状态 | store-status-card | 用户询问门店信息 |## 业务约束(跨接口铁律)### 1. 输出形态- 所有成功返回的接口(isError=false)且绑定了组件的,**必须展示卡片**,禁止以纯文本列出卡片中的详情数据。- Agent 回复时可附加一句简短引导话术(如"为你推荐了 3 款,点击卡片选择"),但**禁止把商品名、价格、规格等以 markdown 列表形式展开**。### 2. 执行顺序- `payOrder` 必须在调用成功(isError=false)后才能向用户宣布"支付成功"。- `confirmSku` 必须在 `selectDrink` 成功后调用。- 禁止并发调用 `payOrder`;须等上一笔结束后再发起下一笔。### 3. 数据来源- `drinkId` 必须来自 `getRecommendedDrinks` / `searchDrinks` / `getAllDrinks` 返回的 `items[].drinkId` 原值,禁止编造。- `orderId` 必须来自 `confirmSku` / `saveAddress` / `confirmOrder` 返回的 `orderId` 原值,禁止编造。- 所有枚举类规格值必须使用英文枚举(如 `ice` / `hot`),禁止使用中文 label。### 4. 地址处理- `confirmSku` 无论有无地址都直接返回订单确认卡,地址空态由卡片组件自行展示入口。- Agent 无需主动调 `getAddress` 来判断是否有地址——这由 `confirmSku` 内部自动处理。- 用户在地址为空时点击"确认下单",`payOrder` 会返回 isError 提示缺少地址。## 用户意图分流### 直接意图(触发本 SKILL)- "想喝点什么"- "来杯咖啡"- "推荐一下饮品"- "有什么奶茶"- "帮我点杯拿铁"- "看看菜单"- "大杯热美式"- "最近的门店排队吗"### 意图分流规则- 用户只说"想喝/推荐"等模糊表达 → `getRecommendedDrinks`- 用户说出具体品名/品类 → `searchDrinks`- 用户从卡片点击选中某饮品 → `selectDrink`(drinkId 由卡片 sendFollowUpMessage 传入)- 用户问门店/排队 → `getStoreStatus`- 用户表达歧义短语(如"那个")→ 先反问澄清,禁止猜测
在 mcp.json 配置 相对路径 skills/drink-skill/mcp.json 确认订单的mcp 配置
{"apis": [{"name": "confirmSku","description": "确认饮品规格并生成订单(业务对象:订单确认卡片)。\n调用前置条件:已调用 selectDrink 成功获取到饮品详情(即上下文中有 selectDrink 返回的 drinkId 和 specOptions)。\n【严禁场景】禁止未经 selectDrink 直接调用本接口;禁止使用中文 label 作为 specs value(必须使用英文枚举值)。","inputSchema": {"type": "object","properties": {"drinkId": {"type": "number","description": "商品唯一标识,必须来自上一步 selectDrink 返回的 structuredContent.drinkId 原值。【禁止编造】禁止从用户语言推断。"},"specs": {"type": "object","description": "规格对象,key 为维度 key,value 必须使用英文枚举值。取值来源:selectDrink 返回的 specOptions 中各维度的 options[].value。【禁止编造】禁止使用中文 label 或不在枚举中的值。","properties": {"temperature": {"type": "string","description": "温度。仅允许:'ice'(冰)/ 'hot'(热)。用户说「热的」→ 'hot',用户说「冰的」或未指定 → 'ice'。","enum": ["ice", "hot"]},"sugar": {"type": "string","description": "糖度。仅允许:'none'(无糖)/ 'less'(少糖)/ 'normal'(标准)/ 'more'(多糖)。用户未指定时使用 'normal'。","enum": ["none", "less", "normal", "more"]},"cupSize": {"type": "string","description": "杯型。仅允许:'medium'(中杯)/ 'large'(大杯)/ 'xlarge'(超大杯,仅部分品类支持)。用户未指定时使用 'medium'。","enum": ["medium", "large", "xlarge"]},"toppings": {"type": "array","description": "加料(多选)。元素仅允许:'oatMilk'(燕麦奶)/ 'coconut'(椰浆)/ 'extraShot'(额外浓缩,仅奶咖)/ 'pearl'(珍珠)/ 'jelly'(椰果)。用户未指定时传空数组 []。","items": {"type": "string","enum": ["oatMilk", "coconut", "extraShot", "pearl", "jelly"]}}}}},"required": ["drinkId", "specs"]},"outputSchema": {"type": "object","properties": {"orderId": { "type": "string", "description": "订单 ID" },"drinkName": { "type": "string", "description": "饮品名称" },"specText": { "type": "string", "description": "规格文本描述" },"totalPrice": { "type": "number", "description": "订单总价(元)" },"needAddress": { "type": "boolean", "description": "true 表示用户需在卡片上补充收货地址" },"status": { "type": "string", "description": "订单状态:awaiting_address / confirmed" }}},"_meta": { "ui": { "componentPath": "components/order-confirm-card/index" } }},]}
环境初始化:微信客户端启动独立 JS 环境,下载分包,通过wx.login同步用户登录态;
接口调用:原子接口请求开发者服务端,创建订单并返回结构化数据;skills/drink-skill/apis/confirmSku.js
// 确认 SKU:校验规格 -> 生成订单草稿 -> 返回订单确认卡片// 规范(最佳实践):// - content:「事实陈述 + 业务动作」两段式// - structuredContent:供 Agent 理解订单状态(不含 imageUrl 等纯渲染字段)// - _meta:组件渲染用(含 imageUrl、价格明细、地址),Agent 不可见const { findDrink, getAddress, saveOrder, setPendingOrder } = require('../utils/storage.js')const { validateSpecs } = require('../utils/sku.js')const { genOrderId } = require('../utils/id.js')async function confirmSku({ drinkId, specs } = {}) {try {if (!drinkId) {return {isError: true,content: [{ type: 'text', text: '缺少 drinkId。禁止编造,应先调用 selectDrink。' }]}}const drink = findDrink(drinkId)if (!drink) {return {isError: true,content: [{ type: 'text', text: `未找到 drinkId=${drinkId} 的饮品。禁止编造 ID,应先调用 selectDrink 获取有效 drinkId。` }]}}const check = validateSpecs(drinkId, specs)if (!check.valid) {return {isError: true,content: [{ type: 'text', text: `规格不合法:${check.error}。禁止再次使用相同无效值重试。正确出口:引导用户通过饮品详情卡片上的"选规格"按钮打开半屏重新选择。` }]}}const orderId = genOrderId()const order = {orderId,drinkId: drink.id,drinkName: drink.name,basePrice: check.basePrice,extraPrice: check.extraPrice,totalPrice: check.totalPrice,specs: check.normalizedSpecs,specText: check.specText,imageUrl: drink.imageUrl,status: 'pending',createTime: new Date().toISOString()}saveOrder(order)const address = getAddress()if (!address) {setPendingOrder(orderId)return {isError: false,// content:事实陈述 + 业务动作content: [{type: 'text',text: `订单已生成(${drink.name}${check.specText},¥${check.totalPrice}),但用户尚未填写收货地址。接下来为用户展示订单确认卡片,卡片上有"添加收货地址"入口,用简短话术引导用户在卡片上补充地址,禁止以纯文本列出订单详情。`}],// structuredContent:Agent 理解订单状态structuredContent: {orderId,drinkName: drink.name,specText: check.specText,totalPrice: check.totalPrice,needAddress: true,status: 'awaiting_address'},// _meta:组件渲染用_meta: {imageUrl: drink.imageUrl,basePrice: check.basePrice,extraPrice: check.extraPrice,address: null,pendingOrderId: orderId}}}// 有地址:直接订单确认order.address = addressorder.status = 'confirmed'saveOrder(order)return {isError: false,// content:事实陈述 + 业务动作content: [{type: 'text',text: `订单已生成并确认(${drink.name}${check.specText},¥${check.totalPrice})。接下来为用户展示订单确认卡片,用简短话术引导用户点击卡片上的"确认下单"按钮,禁止以纯文本列出订单详情。`}],structuredContent: {orderId,drinkName: drink.name,specText: check.specText,totalPrice: check.totalPrice,needAddress: false,status: 'confirmed'},_meta: {imageUrl: drink.imageUrl,basePrice: check.basePrice,extraPrice: check.extraPrice,address}}} catch (err) {console.error('[confirmSku] error', err)return {isError: true,content: [{ type: 'text', text: `确认规格失败:${err.message || '未知错误'}。` }]}}}module.exports = confirmSku
上面已完成 Skill 如何找到 mcp 以及具体配置和服务端交互的代码。接下来就是渲染原子组件。(熟悉Agent开发的其实就是定义Tools)
卡片渲染:原子组件解析数据,在对话流生成订单确认卡片(带小程序跳转入口);
skills/drink-skill/components/order-confirm-card 下有四个文件,仅展示 UI 相关的代码
<viewclass="oc-card"><viewclass="oc-header"><viewclass="oc-title">订单确认</view><viewwx:if="{{orderId}}"class="oc-order-id">#{{orderId}}</view></view><!-- 地址行:有地址展示信息,无地址展示空态占位,都可点击 --><viewclass="oc-addr {{hasAddress ? '' : 'oc-addr-empty'}}"hover-class="row-hover"bind:tap="onTapAddress"><blockwx:if="{{hasAddress}}"><viewclass="oc-addr-body"><viewclass="oc-addr-top"><textclass="oc-addr-name">{{address.name}}</text><textclass="oc-addr-phone">{{address.phone}}</text></view><viewclass="oc-addr-detail">{{address.detail}}</view></view><viewclass="oc-edit-text">修改</view></block><blockwx:else><viewclass="oc-addr-body"><viewclass="oc-addr-empty-title">添加收货地址</view><viewclass="oc-addr-empty-sub">请先添加收货地址以便下单</view></view><viewclass="oc-edit-text">去添加</view></block></view><!-- 商品行 --><viewwx:if="{{drinkName}}"class="oc-item"><imagewx:if="{{imageUrl}}"class="oc-img"src="{{imageUrl}}"mode="aspectFill"></image><viewclass="oc-item-info"><viewclass="oc-item-name">{{drinkName}}</view><viewwx:if="{{specText}}"class="oc-item-spec">{{specText}}</view><viewclass="oc-item-price">¥{{totalPrice}} × 1</view></view></view><viewclass="oc-divider"></view><!-- 合计 --><viewclass="oc-summary"><viewclass="oc-summary-label">合计</view><viewclass="oc-summary-price">¥{{totalPrice}}</view></view><!-- 确认下单按钮 --><viewclass="oc-pay-btn"hover-class="btn-hover"bind:tap="onTapPay"><viewclass="oc-pay-text">确认下单 ¥{{totalPrice}}</view></view></view>
用户确认支付:点击卡片按钮,消息回传 AI,调用「发起支付」原子接口;
支付闭环:接口调用wx.requestPayment拉起微信支付,支付结果回传并渲染结果卡片。包含填地址,确认地址亦是如上面的交互一致,不再赘述,详看下面的配置文件。
{"apis": [{"name": "getRecommendedDrinks","description": "获取推荐饮品列表(业务对象:精选饮品卡片)。\n调用前置条件:用户表达想喝饮品但未指定具体商品名(如「想喝点什么」「推荐一下」「有什么好喝的」)。\n【严禁场景】用户已说出具体商品名(如「来杯拿铁」)时,禁止调用本接口,应调用 searchDrinks 或直接 selectDrink。","inputSchema": {"type": "object","properties": {"scenario": {"type": "string","description": "使用场景。仅允许以下取值:'default'(默认推荐)/ 'coffee'(咖啡类)/ 'tea'(茶饮类)/ 'warm'(暖饮)。用户未明确表达品类偏好时,留空走 default。","enum": ["default", "coffee", "tea", "warm"]}}},"outputSchema": {"type": "object","properties": {"items": {"type": "array","description": "推荐饮品列表","items": {"type": "object","properties": {"drinkId": { "type": "number", "description": "商品唯一 ID" },"name": { "type": "string", "description": "商品名称" },"price": { "type": "number", "description": "基础价格(元)" },"categoryName": { "type": "string", "description": "分类名" },"description": { "type": "string", "description": "商品简介" }}}},"total": { "type": "number", "description": "该场景下可选饮品总数" },"hasMore": { "type": "boolean", "description": "是否有更多商品可浏览" },"keyword": { "type": "string", "description": "搜索关键词(推荐场景为 null)" }}},"_meta": { "ui": { "componentPath": "components/recommended-drinks/index" } }},{"name": "searchDrinks","description": "按关键词检索饮品列表(业务对象:饮品搜索结果卡片)。\n调用前置条件:用户说出了具体的商品名或分类关键词(如「拿铁」「奶茶」「水果茶」)。\n【严禁场景】用户仅表达「想喝点东西」等模糊意图时,禁止调用本接口,应调用 getRecommendedDrinks。","inputSchema": {"type": "object","properties": {"keyword": {"type": "string","description": "商品名或分类关键词(用户原话中的饮品名/品类词)。取值来源:用户原话。【禁止编造】用户未说出任何饮品关键词时,禁止填写本字段,应改走 getRecommendedDrinks。"}},"required": ["keyword"]},"outputSchema": {"type": "object","properties": {"items": {"type": "array","description": "匹配的饮品列表","items": {"type": "object","properties": {"drinkId": { "type": "number", "description": "商品唯一 ID" },"name": { "type": "string", "description": "商品名称" },"price": { "type": "number", "description": "基础价格(元)" },"categoryName": { "type": "string", "description": "分类名" },"description": { "type": "string", "description": "商品简介" }}}},"total": { "type": "number", "description": "匹配总数" },"hasMore": { "type": "boolean", "description": "是否有更多结果" },"keyword": { "type": "string", "description": "用户搜索关键词" }}},"_meta": { "ui": { "componentPath": "components/recommended-drinks/index" } }},{"name": "selectDrink","description": "查看某款饮品详情及可选规格(业务对象:饮品详情卡片)。\n调用前置条件:已从 getRecommendedDrinks / searchDrinks 返回的 items 中获取到具体的 drinkId。\n【严禁场景】禁止在未获得有效 drinkId 的情况下调用本接口,禁止从用户自然语言推断 drinkId。\n【后续动作】展示饮品详情卡片后,等待用户在卡片上点击「直接下单」(组件会自动触发 confirmSku),禁止 Agent 主动调用 confirmSku 跳过卡片展示。","inputSchema": {"type": "object","properties": {"drinkId": {"type": "number","description": "商品唯一标识,必须来自上游接口 getRecommendedDrinks / searchDrinks / getAllDrinks 返回的 items[].drinkId 字段原值。【禁止编造】禁止从用户自然语言(如『那个 3 号』)推断或截取,禁止使用示例值。上下文中无可用 drinkId 时,应先调 getRecommendedDrinks 或 searchDrinks。"}},"required": ["drinkId"]},"outputSchema": {"type": "object","properties": {"drinkId": { "type": "number" },"name": { "type": "string" },"price": { "type": "number", "description": "基础价格(元)" },"description": { "type": "string" },"categoryName": { "type": "string" },"specOptions": {"type": "object","description": "可选规格维度,key 为维度 key(temperature/sugar/cupSize/toppings),每个维度含 options 数组"}}},"_meta": { "ui": { "componentPath": "components/drink-detail-card/index" } }},{"name": "confirmSku","description": "确认饮品规格并生成订单(业务对象:订单确认卡片)。\n调用前置条件:已调用 selectDrink 成功获取到饮品详情(即上下文中有 selectDrink 返回的 drinkId 和 specOptions)。\n【严禁场景】禁止未经 selectDrink 直接调用本接口;禁止使用中文 label 作为 specs value(必须使用英文枚举值)。","inputSchema": {"type": "object","properties": {"drinkId": {"type": "number","description": "商品唯一标识,必须来自上一步 selectDrink 返回的 structuredContent.drinkId 原值。【禁止编造】禁止从用户语言推断。"},"specs": {"type": "object","description": "规格对象,key 为维度 key,value 必须使用英文枚举值。取值来源:selectDrink 返回的 specOptions 中各维度的 options[].value。【禁止编造】禁止使用中文 label 或不在枚举中的值。","properties": {"temperature": {"type": "string","description": "温度。仅允许:'ice'(冰)/ 'hot'(热)。用户说「热的」→ 'hot',用户说「冰的」或未指定 → 'ice'。","enum": ["ice", "hot"]},"sugar": {"type": "string","description": "糖度。仅允许:'none'(无糖)/ 'less'(少糖)/ 'normal'(标准)/ 'more'(多糖)。用户未指定时使用 'normal'。","enum": ["none", "less", "normal", "more"]},"cupSize": {"type": "string","description": "杯型。仅允许:'medium'(中杯)/ 'large'(大杯)/ 'xlarge'(超大杯,仅部分品类支持)。用户未指定时使用 'medium'。","enum": ["medium", "large", "xlarge"]},"toppings": {"type": "array","description": "加料(多选)。元素仅允许:'oatMilk'(燕麦奶)/ 'coconut'(椰浆)/ 'extraShot'(额外浓缩,仅奶咖)/ 'pearl'(珍珠)/ 'jelly'(椰果)。用户未指定时传空数组 []。","items": {"type": "string","enum": ["oatMilk", "coconut", "extraShot", "pearl", "jelly"]}}}}},"required": ["drinkId", "specs"]},"outputSchema": {"type": "object","properties": {"orderId": { "type": "string", "description": "订单 ID" },"drinkName": { "type": "string", "description": "饮品名称" },"specText": { "type": "string", "description": "规格文本描述" },"totalPrice": { "type": "number", "description": "订单总价(元)" },"needAddress": { "type": "boolean", "description": "true 表示用户需在卡片上补充收货地址" },"status": { "type": "string", "description": "订单状态:awaiting_address / confirmed" }}},"_meta": { "ui": { "componentPath": "components/order-confirm-card/index" } }},{"name": "getAddress","description": "弹出系统地址选择器让用户选择收货地址(业务对象:地址卡片)。内部调用 wx.chooseAddress,用户选择后自动保存。用户取消时返回已存储的地址或空。\n调用前置条件:用户点击了订单确认卡上的地址区域,或 Agent 需要获取/更新收货地址时。\n【严禁场景】无特殊限制。","inputSchema": { "type": "object", "properties": {} },"outputSchema": {"type": "object","properties": {"hasAddress": { "type": "boolean", "description": "是否已有地址" },"address": {"type": "object","description": "收货地址信息(无地址时为 null)","properties": {"name": { "type": "string", "description": "收货人姓名" },"phone": { "type": "string", "description": "手机号" },"detail": { "type": "string", "description": "详细地址" }}}}}},{"name": "saveAddress","description": "保存用户收货地址(业务对象:订单确认卡片更新)。若存在未完成订单,接口会自动续跑订单确认流程并返回更新后的订单确认卡片。\n调用前置条件:用户已在半屏页面或对话中提供了完整地址信息(姓名+手机号+详细地址)。\n【严禁场景】三个必填字段任一缺失时禁止调用,应先反问用户补充缺失信息。","inputSchema": {"type": "object","properties": {"name": {"type": "string","description": "收货人姓名。取值来源:用户原话或半屏页面传入。【禁止编造】用户未提供时禁止填写,应反问用户。"},"phone": {"type": "string","description": "手机号,11 位数字。取值来源:用户原话或半屏页面传入。【禁止编造】用户未提供时禁止填写,应反问用户。"},"detail": {"type": "string","description": "详细地址。取值来源:用户原话或半屏页面传入。【禁止编造】用户未提供时禁止填写,应反问用户。"}},"required": ["name", "phone", "detail"]},"outputSchema": {"type": "object","properties": {"success": { "type": "boolean", "description": "是否保存成功" },"orderId": { "type": "string", "description": "续跑的订单 ID(无 pending 订单时不存在)" },"drinkName": { "type": "string", "description": "饮品名称" },"specText": { "type": "string", "description": "规格描述" },"totalPrice": { "type": "number", "description": "订单总价" },"needAddress": { "type": "boolean", "description": "是否仍缺地址" },"status": { "type": "string", "description": "订单状态" }}},"_meta": { "ui": { "componentPath": "components/order-confirm-card/index" } }},{"name": "confirmOrder","description": "展示订单确认信息卡片(业务对象:订单确认卡片,含商品+地址+金额)。\n调用前置条件:已通过 confirmSku 或 saveAddress 获取到有效的 orderId。\n【严禁场景】禁止在无 orderId 时调用;禁止从用户语言推断 orderId。","inputSchema": {"type": "object","properties": {"orderId": {"type": "string","description": "订单唯一标识,必须来自上游接口 confirmSku / saveAddress 返回的 orderId 字段原值。【禁止编造】禁止从用户自然语言推断,上下文中无可用 orderId 时应先引导用户完成选品下单流程。"}},"required": ["orderId"]},"outputSchema": {"type": "object","properties": {"orderId": { "type": "string" },"drinkName": { "type": "string" },"specText": { "type": "string" },"totalPrice": { "type": "number" },"needAddress": { "type": "boolean", "description": "是否需要补充地址" },"status": { "type": "string", "description": "订单状态" }}},"_meta": { "ui": { "componentPath": "components/order-confirm-card/index" } }},{"name": "payOrder","description": "发起订单支付(业务对象:支付成功卡片)。若微信支付环境不可用会自动降级为 mock 成功,确保流程跑通。\n调用前置条件:订单状态为 confirmed(已有地址 + 已确认商品规格),orderId 来自 confirmSku / saveAddress / confirmOrder 返回值。\n【严禁场景】订单缺少地址(status=awaiting_address)时禁止调用,应引导用户先补充地址;禁止在 payOrder 未返回成功前向用户宣布「已支付成功」。","inputSchema": {"type": "object","properties": {"orderId": {"type": "string","description": "订单唯一标识,必须来自上游接口 confirmSku / saveAddress / confirmOrder 返回的 orderId 字段原值。【禁止编造】禁止从用户语言推断。"},"address": {"type": "object","description": "可选,收货地址。由卡片组件自动传入,Agent 通常无需手动填写。","properties": {"name": { "type": "string" },"phone": { "type": "string" },"detail": { "type": "string" }}}},"required": ["orderId"]},"outputSchema": {"type": "object","properties": {"orderId": { "type": "string" },"paidAmount": { "type": "number", "description": "实付金额" },"payTime": { "type": "string", "description": "支付时间 ISO 格式" },"status": { "type": "string", "description": "订单状态:paid" },"drinkName": { "type": "string", "description": "饮品名称" },"specText": { "type": "string", "description": "规格描述" }}},"_meta": { "ui": { "componentPath": "components/pay-success-card/index" } }},{"name": "getStoreStatus","description": "获取最近门店基础信息(业务对象:门店状态卡片,含实时排队人数与预计出杯时间)。实时数据由卡片组件自身通过网络请求动态刷新,本接口仅返回静态门店信息。\n调用前置条件:用户询问门店相关信息(如「最近的店在哪」「现在排队吗」)。\n【严禁场景】用户未表达门店查询意图时禁止调用。","inputSchema": {"type": "object","properties": {"storeId": { "type": "string", "description": "可选,指定门店 id。用户未指定具体门店时留空,返回最近门店。" }}},"outputSchema": {"type": "object","properties": {"storeId": { "type": "string" },"storeName": { "type": "string" },"distance": { "type": "string" },"address": { "type": "string" }}},"_meta": { "ui": { "componentPath": "components/store-status-card/index" } }}],"components": [{ "path": "components/recommended-drinks/index", "relatedPage": "/packageDetail/pages/more-drinks" },{ "path": "components/drink-detail-card/index", "relatedPage": "/packageDetail/pages/sku-picker" },{ "path": "components/order-confirm-card/index", "relatedPage": "/packageDetail/pages/address-edit" },{ "path": "components/pay-success-card/index", "relatedPage": "/pages/home/home" },{ "path": "components/drink-not-found-card/index", "relatedPage": "/packageDetail/pages/more-drinks" },{"path": "components/store-status-card/index","relatedPage": "/pages/home/home","permissions": {"scope.dynamic": {"desc": "用于实时刷新门店排队人数与预计出杯时间,展示动态门店状态"}}}]}
三、开发规范与最佳实践
3.1 信息权重优先级(AI 决策逻辑,编码必遵循)

3.2 入参字段编码规范(高频踩坑点)
优先传递 ID,拒绝自然语言场景:门店、商品、品类等数据,传唯一 ID(storeId/goodsId),而非文字描述。原因:大模型对自然语言解析易产生歧义,ID 可保证参数精准、推理更快。
description 书写:以下给出两类典型字段的写法示例。
普通字段:举例时给多个不同样本(避免被当默认值),并配明确的缺省处理。单一举例容易被模型当作"标准答案"——用户只说“想喝点什么”时,可能直接照搬该例子填入。
// 反例:只举一个例子,且未说明缺省处理"keyword": { "description": "饮品关键词,如『拿铁』" }// 推荐:多样化举例 + 缺省处理"keyword": {"description": "饮品关键词,例如『拿铁』『美式』『奶茶』。用户未说出具体饮品时,不要填写本字段,应改走饮品推荐接口。"}
ID 类字段:声明取值来源接口。业务 ID 容易被按格式凑出,需在 description 中显式声明来源。
// 反例"drinkId": { "description": "饮品 ID" }// 推荐"drinkId": {"description": "饮品唯一标识,取自上游接口 searchDrinks 或 getRecommendedDrinks 返回的 drinkId 原值。不要从用户自然语言(如『那个拿铁』)推断,也不要使用示例值。上下文无可用 drinkId 时,应先调 searchDrinks。"}
3.3 原子组件 UI & 交互约束(前端样式编码)
尺寸:宽高比区间 4:1(最小)~1:1(最大),初始化后高度不可动态修改;
交互:仅支持点击、图片加载 / 报错事件,不支持滑动、长按、动画;
网络:默认禁止网络请求、定时器,动态数据需声明为「实时动态原子组件」;
硬性规则:卡片右上角必须配置小程序跳转入口,这是官方强制规范。
四、微信 AI 的核心护城河:登录态与生态能力
4.1 登录态无缝继承
数据互通:通过小程序原生storage共享登录凭证,也可复用wx.login、wx.getPhoneNumber完成登录;
体验优势:AI 代用户操作时,自动同步会员、优惠券、收货地址、历史订单,无需重复授权;
代码适配:原有登录逻辑完全复用,无需单独为 AI 场景开发登录体系,改造成本极低。
4.2 生态壁垒:百万级服务 + 支付闭环
底层底座:微信坐拥 14.32 亿月活,数百万小程序覆盖点餐、打车、挂号、缴费等全民生服务,且深度绑定微信支付、社交体系;
对比外部 AI:ChatGPT 等外部 Agent 接入电商、外卖服务时,面临登录、支付、数据归因、Session 追踪等一系列问题,而微信从底层打通全链路;
流量规则变化:未来小程序流量不再只争夺首页、搜索、最近使用,SKILL 描述、接口注释、页面元数据成为新的流量资产,AI 会根据文本描述匹配服务。
4.3 兜底能力:AI 短链拉起小程序
五、生态变革与未来思考
5.1 小程序的形态进化
2017 年:小程序诞生,解决「App 下载、分发」问题,定位轻应用,核心理念「用完即走」;
2026 年:小程序接入微信 AI,解决「服务查找、手动操作」问题,定位可调度服务,核心理念「不用来访,直接完成」;
本质变化:对话成为新 UI,小程序从 “给人点击的页面” 变成 “给 AI 调用的能力”,是小程序诞生以来最大的形态变革。
5.2 当下挑战(客观分析,增加内容深度)
开发者冷启动难题
鸡生蛋蛋生鸡 —— 用户量依赖开发者接入,开发者接入动力依赖 AI 流量,目前仅头部商家(美团、携程)率先试水,长尾开发者观望情绪浓厚;
AI 调度难题
数百万小程序同台竞争,AI 如何精准匹配用户需求(如 “喝咖啡” 匹配瑞幸 / 星巴克),排序、推荐、风控体系仍需打磨;
用户习惯培养
用户是否愿意用对话替代传统点击操作?对话式交互是否为全行业最优解,仍需要长期市场验证。
5.3 给不同角色的建议
中小开发者
优先开启自动模式(零成本),提前适配 AI 流量埋点、风控规则,布局新流量入口;暂不急于深度开发 SKILL,等待内测放开提审;
前端 / 全栈开发者
吃透原子接口、原子组件、MCP 协议规范,重点练习环境隔离、结构化出参、ID 传参等编码规则,提前储备 AI 小程序开发技能;
产品 / 运营
重构运营思路,弱化首页 Banner、弹窗运营,重点优化 SKILL 描述、接口注释、卡片视觉,适配对话式场景的品牌曝光与转化。
夜雨聆风