关于 ai-model-wechat
ai-model-wechat 是面向微信小程序开发者的技能,指导通过 `wx.cloud.extend.AI` 调用 AI 模型。内容重点说明 provider 与模型 ID 的区别,并要求调用前依次检查计费资格和模型组配置。
主要功能
- 01指导小程序调用 AI 文本模型
- 02说明流式响应回调
- 03区分 provider 与模型 ID
- 04规定调用前的资格检查
- 05指导模型组查询与启用
适用场景
- 01为小程序接入文本生成
- 02实现带回调的流式响应
- 03调用 Hunyuan 模型
- 04排查模型未启用导致的错误
MCP 相关
技能流程要求使用 MCP 工具 `queryEnv action=info` 获取环境信息;输入还提及通过 Cloud API 检查资格与模型配置。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tencentcloudbase/ skills --skill ai-model-wechat安装后在 Claude Code 中输入/ai-model-wechat确认已加载。
附带文件LICENSE.md
详细介绍
同级技能(仅限本地)
同级 CloudBase 技能会与此技能一同提供。请使用 ../auth-tool-cloudbase/SKILL.md 这样的本地相对路径。
如果此环境中缺少引用的同级技能文件,请让用户安装完整的 CloudBase 插件(或缺失的技能)。不要通过 HTTP 将远程技能或协议 Markdown 获取到 Agent 上下文中。
何时使用此技能
在微信小程序中使用 wx.cloud.extend.AI 调用 AI 模型时,请使用此技能。
适用于以下场景:
- 在小程序中集成 AI 文本生成
- 通过回调支持流式传输 AI 响应
- 在微信环境中调用 Hunyuan 模型
不适用于以下场景:
- 浏览器/Web 应用 → 使用
ai-model-web技能 - Node.js 后端或云函数 → 使用
ai-model-nodejs技能 - 图像生成 → 使用
ai-model-nodejs技能(小程序中不可用) - 没有 CloudBase SDK 的运行环境(原生应用、Python 等)→ 使用
http-api-cloudbase技能(其中现已包含可用于直接 HTTP 调用的ai_modelOpenAPI 规范)
⛔ 停止 — wx.cloud.extend.AI.createModel(provider) 的参数不是供应商或模型名称
在编写任何 createModel(...) 代码行之前,请先阅读此处。Agent 经常会臆造此参数。合法形式恰好只有四种。其他任何形式都是错误。
✅ 合法的 createModel(provider) 参数 | 使用场景 |
|---|---|
"cloudbase" | 默认选项,包括小程序成长计划。 主托管分组(由 TokenHub 支持的多供应商池)。成长计划额度由 cloudbase + hy3 共同提供,需先启用 hy3。供应商和具体模型应填写在 model 字段中,例如 { model: "deepseek-v4-flash" }。 |
"hunyuan-v3" | 即将退役的旧版套餐分组。 仅提供 hy3,且不会添加新模型。已加入此套餐的现有代码仍可运行;新代码应使用 cloudbase + hy3。 |
"hunyuan-exp" | 较早的旧版内置分组 — 仅当 DescribeAIModels 仍返回此分组时使用。其默认模型 hunyuan-2.0-instruct-20251111 已于 2026-05-31 下线;切勿指定此 ID。 |
"custom-<your-name>" | 通过 CreateAIModel 接入的用户自定义 GroupName。必须以 custom- 开头(例如 custom-kimi、custom-openai-compat)。 |
❌ 不要编写以下任何内容 — 它们都不正确
wx.cloud.extend.AI.createModel("deepseek") // wrong — vendor, not GroupName
wx.cloud.extend.AI.createModel("deepseek-v4-flash") // wrong — model id goes in `model`
wx.cloud.extend.AI.createModel("hunyuan") // wrong — vendor family
wx.cloud.extend.AI.createModel("hunyuan-2.0-instruct-20251111") // wrong — model name
wx.cloud.extend.AI.createModel("glm") / "kimi" / "minimax" // wrong — vendor names
wx.cloud.extend.AI.createModel("custom") // wrong — placeholder
wx.cloud.extend.AI.createModel(modelName) // wrong — do not reuse the model-id variable
✅ 正确模式 — provider 和 model 是两个不同的字段
// Growth Plan branch (enable hy3 in the console first)
const model = wx.cloud.extend.AI.createModel("cloudbase"); // ← provider / GroupName
await model.streamText({
data: { model: "hy3", messages: [...] } // ← concrete model id
});
// Token Credits branch
const model = wx.cloud.extend.AI.createModel("cloudbase");
await model.streamText({
data: { model: "deepseek-v4-flash", messages: [...] }
});
决策流程(用户指定具体模型时)
- 用户说“使用 DeepSeek v3.2”/“使用 hunyuan thinking”/“使用 Kimi k2.6”/……
- 首先运行下方的资格判定流程 — 几乎所有情况下 provider 都是
"cloudbase",包括成长计划环境(cloudbase+hy3)。只有在现有代码已使用"hunyuan-v3"时才会出现该值;只有当DescribeAIModels仍返回较早的分组时才使用"hunyuan-exp"。 - 将模型 ID 填入
data中的model字段:{ model: "deepseek-v3.2" }、{ model: "hy3" }、{ model: "kimi-k2.6" }、…… - 使用模型 ID 前,请确认它包含在
DescribeAIModels({ GroupName: "cloudbase" }).Models[]中。如果不包含,请通过UpdateAIModel启用它。
如果你正准备输入
wx.cloud.extend.AI.createModel(,且括号内是供应商名称或模型 ID — 请停下。它几乎肯定不是上述四种合法值之一。
强制两步预检
禁止直接开始调用 wx.cloud.extend.AI.createModel(...)。编写任何业务代码之前,必须按以下固定顺序确认计费资格和分组就绪状态:① 资格 → ② 分组就绪状态。不要调换顺序。
预检 ① · 计费资格(两条并行计费路径)
小程序侧有两种计费路径:小程序成长计划(优先检查)和 Token Credits 资源包(通用回退)。两者都通过 cloudbase 主托管分组结算——使用成长计划时,模型为 hy3,优先扣除计划额度;hunyuan-v3 是旧版计划分组,仅扣除计划额度,现正逐步停用。
-
通过 MCP 工具
queryEnv action=info获取envId。 -
根据用户意图选择分支:
| 用户意图 | 优先检查的资格 | 命中时的 createModel provider | 模型选择 | 未命中时的指引 |
|---|---|---|---|---|
| 未指定模型/默认调用 | 先检查是否已加入 小程序成长计划;如果未加入,再检查 Token Credits 资源包 | 两种情况下均为 "cloudbase" | 已加入:hy3(成长计划文本模型——先在 "cloudbase" 分组中启用)。否则:与用户选择文本模型,然后通过 DescribeAIModels → DescribeManagedAIModelList → UpdateAIModel 在 "cloudbase" 分组中验证并启用 | 未加入计划 → 指引至 https://docs.cloudbase.net/ai/ai-inspire-plan;缺少资源包 → 提供购买链接 |
用户请求 hunyuan-* 模型 | 小程序成长计划资格 | "cloudbase"(计划额度使用 hy3) | 在 DescribeAIModels({ GroupName: "cloudbase" }).Models[] 中验证准确的 Model;如果缺失,则通过 UpdateAIModel 启用 | 已加入但模型缺失 → 启用模型;未加入 → 指引至计划页面,或使用 "cloudbase" + 资源包 |
用户请求 deepseek-* / glm-* / kimi-* / minimax-* / 其他非 hunyuan 托管模型 | Token Credits 资源包激活状态 | "cloudbase" | 不要假设模型已启用。调用 DescribeAIModels → 如果缺失,调用 DescribeManagedAIModelList 获取规范的 Model 字符串 → 使用 Status: 1 调用 UpdateAIModel(完整替换 Models[]) | 资源包未激活 → 提供购买链接 |
| 用户请求第三方/可自托管(非托管)模型 | 跳过计费资格检查,转到“自定义接入” | 自定义 GroupName(必须以 custom- 开头) | 通过 CreateAIModel.Models[] 注册 | 同时提供控制台和 CreateAIModel 两种方式 |
- 检查是否已加入小程序成长计划:
callCloudApi({
service: "tcb",
action: "DescribeActivityInfo",
params: {
ActivityNames: ["ai_miniprogram_inspire_plan"], // PascalCase preferred; switch to camelCase if InvalidParameter is returned
},
})
**命中条件:**响应的 attendRecords 中至少有一项满足 activityName === "ai_miniprogram_inspire_plan",且 envId 与当前环境匹配。命中后,使用 createModel("cloudbase") + model: "hy3"(先在分组中启用 hy3);调用时会扣除计划的免费额度。旧代码使用 createModel("hunyuan-v3") + hy3 仍可运行,但该分组正逐步停用——请将其迁移到 cloudbase。
⚠️ 赠送的 Token 仅适用于特定来源。它仅适用于小程序客户端调用和管理员身份调用(控制台 Playground、云函数内部发起的调用)。来自其他来源的调用不会扣除该 Token,而是使用环境的资源点池结算——用户会因此反馈“Token 资源包未生效,扣了资源点”。遇到此类反馈时,应先检查调用来源,再修改代码或模型配置。下方 Token Credits 资源包路径也遵循同一规则。
**未命中时:**不要静默回退。告知用户“当前环境未加入小程序成长计划”,提供加入入口 https://docs.cloudbase.net/ai/ai-inspire-plan,并询问用户是要加入计划后重试,还是切换到使用非 hunyuan 模型的 Token Credits 资源包路径。
- 检查 Token Credits 资源包(当路径指向
"cloudbase"主托管分组时):
callCloudApi({
service: "tcb",
action: "DescribeEnvPostpayPackage",
params: {
EnvId: "<current envId>",
},
})
命中条件:envPostpayPackageInfoList 中有一项的 postpayPackageId 以 pkg_tcb_tokencredits_ 开头,status ∉ [3, 4](未过期、未停用),且 versionSwitchStatus 不处于阻止状态。
**未命中时:**提供购买链接(将 {envId} 替换为真实 ID,绝不能保留占位符):
https://buy.cloud.tencent.com/lowcode?buyType=resPack&envId={envId}&resourceType=token
预检 ② · 分组就绪状态(每次小程序 AI 调用前都必须执行)
符合资格并不代表可以调用目标模型。"cloudbase" 主托管分组中默认不启用任何模型——你必须先调用 DescribeAIModels 查看已启用的模型,然后(如果缺少目标模型)调用 DescribeManagedAIModelList 查询权威的受支持模型目录,并通过 UpdateAIModel 设置 Status: 1 启用模型。加入成长计划也不能跳过此检查:hy3 仍必须存在于 cloudbase 分组中并处于启用状态。旧版 "hunyuan-v3" 仅提供 hy3,且正在退役——应将其视为只读兼容选项,而非默认选项。
- 查询环境中当前配置的分组和开关(
tcbActionDescribeAIModels,Version2018-06-08):
callCloudApi({
service: "tcb",
action: "DescribeAIModels",
params: { EnvId: "<envId>" },
})
返回 AIModelGroups: AIModelGroup[]。每个 AIModelGroup 都包含 GroupName(例如 cloudbase / hunyuan-exp / 自定义分组)、Type(builtin / custom)、Models: [{ Model, EnableMCP, Tags }] 和 Status(1=开启 / 2=关闭)。分组就绪需同时满足以下三项:存在 GroupName + Status === 1 + 目标 Model 存在于 Models[] 中。
- 如果
DescribeAIModels的响应中没有目标模型,则通过DescribeManagedAIModelList查询平台目录和定价——该接口会返回ManagedAIModelGroup[],其中包含ModelSpec(上下文长度等)和ModelChargingInfo(Uniform/Tiered定价)。选择目标模型,然后通过UpdateAIModel启用它:
callCloudApi({
service: "tcb",
action: "UpdateAIModel",
params: {
EnvId: "<envId>",
GroupName: "cloudbase",
Status: 1, // 1=on, 2=off
Models: [
{ Model: "deepseek-v4-flash", EnableMCP: false },
{ Model: "deepseek-v3.2", EnableMCP: false }, // append the new model to enable
],
// ⚠️ `Models` is a FULL REPLACEMENT, not incremental; merge the old list + new entries before passing.
},
})
- 两个步骤都通过后,才在小程序代码中编写
wx.cloud.extend.AI.createModel("<GroupName>"),并传入该分组Models[]中存在的model值。
顺序固定。 未满足资格条件时,不会有已启用模型产生费用;未就绪分组时,即使符合资格,也会收到
ModelNotEnabled类错误。两项都必须在编写业务代码前完成。API 大小写提示:
tcb公共服务的 Action 正式使用 PascalCase(EnvId、GroupName、ActivityNames);部分文档使用 camelCase。首次调用时,如果遇到InvalidParameter,请切换大小写后重试,然后在项目封装中固定使用成功的形式。
可用的提供方和模型
wx.cloud.extend.AI.createModel(provider) 的 provider 参数等于 DescribeAIModels 返回的 GroupName。只有以下四种值合法。选择前请先执行决策树。
A. 小程序成长计划(加入计划时的默认选项)—— provider 为 cloudbase,model 为 hy3
| createModel provider | 默认模型 | 其他可用模型 | 备注 |
|---|---|---|---|
"cloudbase" | hy3 | 环境在 DescribeAIModels({ GroupName: "cloudbase" }).Models[] 中启用的其他模型——运行时查询,切勿硬编码 | 当调用来源允许时,优先使用计划额度;首次调用前通过 UpdateAIModel 启用 hy3 |
"hunyuan-v3" | hy3 | 无——此分组仅提供 hy3 | 旧版计划分组,正在退役。现有代码仍可运行;请迁移到 cloudbase + hy3 |
"hunyuan-exp" | — | 环境当前仍返回的模型 | 较早的旧版内置分组。其原默认模型 hunyuan-2.0-instruct-20251111 已下线(2026-05-31)——不要使用它 |
B. 主要托管组(Token Credits 套餐场景,推荐默认使用)
"cloudbase" GroupName 由 Tencent Cloud TokenHub 支持,这是一个统一的托管池,涵盖多个腾讯自研和第三方供应商,包括 Hunyuan 系列(HY 2.0 Instruct、HY 2.0 Think、Hunyuan-role、Hy3 preview,……)、DeepSeek 系列(DeepSeek-V4-Pro、DeepSeek-V4-Flash、Deepseek-v3.2、Deepseek-v3.1、Deepseek-r1-0528、Deepseek-v3-0324,……)、Zhipu GLM(GLM-5、GLM-5-Turbo、GLM-5.1、GLM-5V-Turbo)、Kimi(K2.5、K2.6)、MiniMax(M2.5、M2.7)等。模型列表会随时间变化,因此不要在应用代码中硬编码列表——务必在运行时查询。
| createModel provider | 模型就绪状态 | 如何启用模型 | 备注 |
|---|---|---|---|
"cloudbase" | 默认情况下不会启用任何模型——务必先检查 DescribeAIModels({ GroupName: "cloudbase" }).Models[] | 1) 通过 DescribeManagedAIModelList 获取权威目录和定价(不要猜测 Model 字符串)。2) 调用 UpdateAIModel,设置 Status: 1,并传入包含目标模型的完整替换 Models[] | 统一托管组(Type=builtin),备注为 "腾讯云开发",依赖 pkg_tcb_tokencredits_* 资源包 |
⚠️ 常见的小程序错误:编写
createModel("deepseek")/createModel("hunyuan")/createModel("glm")/createModel("kimi")/createModel("minimax")/createModel("custom")。这些都不正确——它们是供应商/模型名称,不是 provider/GroupName。provider 必须是DescribeAIModels返回的GroupName值之一。新项目一律使用统一的"cloudbase"托管组,并通过model字段选择具体的供应商模型。
C. 不在托管目录中 → 自定义接入
涉及第三方/自托管/兼容 OpenAI 的端点的模型(未出现在 A/B 中的任何模型)不走上述计费路径。必须先通过“自定义接入”注册 Type=custom 的 GroupName。请参阅下一节。
自定义接入(模型不在托管目录中时)
当用户指定的模型不在主要托管组(cloudbase)目录中时(例如,企业托管的兼容 OpenAI 端点、第三方模型服务),请从以下两种路径中选择一种。使用“第三方/自托管/兼容 OpenAI 的端点”等中性措辞——不要点名具体的竞品品牌。
路径 1 · 在控制台注册
引导用户前往 CloudBase 控制台的 AI 模型页面:
https://tcb.cloud.tencent.com/dev?envId={envId}#/ai
将 {envId} 替换为实际的环境 ID,并让用户填写模型名称、端点、API 密钥等信息。
路径 2 · 通过 callCloudApi + CreateAIModel 注册
tcb Action CreateAIModel(版本 2018-06-08)会在当前环境中创建一个 Type=custom 的 AI 模型组:
callCloudApi({
service: "tcb",
action: "CreateAIModel",
params: {
EnvId: "<current envId>",
GroupName: "custom-openai-compat", // ⚠️ MUST start with "custom-" (e.g. custom-kimi, custom-moonshot) to avoid colliding with built-in / vendor GroupNames; this becomes the value passed to createModel(provider)
BaseUrl: "https://api.example.com/v1",
Models: [
{ Model: "gpt-4o-mini", EnableMCP: false },
{ Model: "gpt-4o", EnableMCP: false },
],
Remark: "Internal OpenAI-compatible endpoint",
Status: 1, // 1=on, 2=off
Secret: {
// Key / ApiKey: pick one; OpenAI-compatible endpoints usually use ApiKey
ApiKey: "<vendor-api-key>",
},
},
})
注册后:
- 运行
DescribeAIModels,确认存在GroupName,且其Status=1,目标Model出现在Models[]中。 - 在小程序中,调用
wx.cloud.extend.AI.createModel("custom-openai-compat"),并将已注册的模型名称(例如"gpt-4o-mini")作为model字段传入。 - 后续添加或修改模型时,使用
UpdateAIModel(请记住,Models是完整替换;Status用 1/2 表示开/关)。要删除整个自定义组,请使用DeleteAIModel(仅限自定义组;通过GroupNames.N批量操作)。 - 所有调用仍会走环境的计费路径。如果此类自定义模型也需要 Token 结算,必须先确认是否符合条件。
前提条件
- 微信基础库 3.7.1+
- 无需安装额外的 SDK
初始化
// app.js
App({
onLaunch: function() {
wx.cloud.init({ env: "<YOUR_ENV_ID>" });
}
})
generateText() - 非流式
⚠️ **与 JS/Node SDK 不同:**返回值是原始模型响应。
**前提条件:**已完成“Mandatory Two-Step Preflight”,并且已通过
DescribeAIModels确认目标模型已启用(如果模型未启用,则通过UpdateAIModel启用)。以下示例假定当前环境已加入小程序成长计划,并使用createModel("cloudbase")+hy3。如果目标是其他托管模型,请保留提供方,并将model设置为用户选择且刚刚通过UpdateAIModel启用的模型——切勿假定deepseek-v4-flash已经启用。
const model = wx.cloud.extend.AI.createModel("cloudbase");
const res = await model.generateText({
model: "hy3", // plan-enrolled default
messages: [{ role: "user", content: "hi" }],
});
// ⚠️ Return value is the RAW model response, NOT wrapped like JS/Node SDK
console.log(res.choices[0].message.content); // access via choices array
console.log(res.usage); // token usage
streamText() - 流式
⚠️ **与 JS/Node SDK 不同:**参数必须封装在 data 对象中;支持回调。
**前提条件:**已完成“Mandatory Two-Step Preflight”,并且已启用目标模型。以下示例使用成长计划分支(
cloudbase+hy3);对于其他托管模型,请保留提供方,并将model设置为用户选择且刚刚通过UpdateAIModel启用的模型(默认情况下不会启用任何模型)。
const model = wx.cloud.extend.AI.createModel("cloudbase");
// ⚠️ Parameters MUST be wrapped in a `data` object
const res = await model.streamText({
data: { // ⚠️ Required wrapper
model: "hy3", // plan-enrolled default
messages: [{ role: "user", content: "hi" }]
},
onText: (text) => { // Optional: incremental text callback
console.log("New text:", text);
},
onEvent: ({ data }) => { // Optional: raw event callback
console.log("Event:", data);
},
onFinish: (fullText) => { // Optional: completion callback
console.log("Done:", fullText);
}
});
// Async iteration is also available
for await (let str of res.textStream) {
console.log(str);
}
// Check for completion via eventStream
for await (let event of res.eventStream) {
console.log(event);
if (event.data === "[DONE]") { // ⚠️ Check for [DONE] to stop
break;
}
}
错误处理模式
**前提条件:**已完成“Mandatory Two-Step Preflight”。对于资源包分支,请使用
"cloudbase"+ 刚刚通过DescribeAIModels/UpdateAIModel验证或启用的特定文本模型——默认情况下不会启用任何模型。
const model = wx.cloud.extend.AI.createModel("cloudbase");
try {
const res = await model.generateText({
model: "deepseek-v4-flash",
messages: [{ role: "user", content: "Write a welcome message" }],
});
console.log(res.choices[0].message.content);
} catch (error) {
console.error("Mini Program AI request failed", error);
}
API 对比:JS/Node SDK 与微信小程序
| 特性 | JS/Node SDK | 微信小程序 |
|---|---|---|
| 命名空间 | app.ai() | wx.cloud.extend.AI |
| generateText 参数 | 直接对象 | 直接对象 |
| generateText 返回值 | { text, usage, messages } | 原始值:{ choices, usage } |
| streamText 参数 | 直接对象 | ⚠️ 封装在 data: {...} 中 |
| streamText 返回值 | { textStream, dataStream } | { textStream, eventStream } |
| 回调 | 不支持 | onText、onEvent、onFinish |
| 图像生成 | 仅 Node SDK 支持 | 不可用 |
类型定义
streamText() 输入
interface WxStreamTextInput {
data: { // ⚠️ Required wrapper object
model: string;
messages: Array<{
role: "user" | "system" | "assistant";
content: string;
}>;
};
onText?: (text: string) => void; // incremental text callback
onEvent?: (prop: { data: string }) => void; // raw event callback
onFinish?: (text: string) => void; // completion callback
}
streamText() 返回值
interface WxStreamTextResult {
textStream: AsyncIterable<string>; // incremental text stream
eventStream: AsyncIterable<{ // raw event stream
event?: unknown;
id?: unknown;
data: string; // "[DONE]" when complete
}>;
}
generateText() 返回值
// Raw model response (OpenAI-compatible format)
interface WxGenerateTextResponse {
id: string;
object: "chat.completion";
created: number;
model: string;
choices: Array<{
index: number;
message: {
role: "assistant";
content: string;
};
finish_reason: string;
}>;
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
}
最佳实践
- 编写业务代码前,先完成两步预检。 固定顺序:①
DescribeActivityInfo/DescribeEnvPostpayPackage,检查计费资格 → ②DescribeAIModels,检查分组是否就绪(如有需要,先调用DescribeManagedAIModelList查看目录和价格,再调用UpdateAIModel启用目标模型)。两步都通过后,才能编写wx.cloud.extend.AI.createModel(...)。 createModel(provider)只接受四类值——"cloudbase"(主要托管分组,新项目和成长计划的默认值)、"hunyuan-v3"(旧版计划分组,仅限hy3,正在退役)、"hunyuan-exp"(更早的旧版内置分组),或自定义接入的GroupName(必须以custom-开头,例如custom-kimi、custom-openai-compat,以避免与内置名称或厂商名称冲突)。切勿编写createModel("deepseek")(除非DescribeAIModels确实返回名为deepseek的旧版内置分组)、createModel("hunyuan")、createModel("kimi")或createModel("custom")——这些是模型/厂商名称或占位符,并非 GroupName。model字段必须来自DescribeAIModels。 传入的值必须实际存在于所选分组的Models[].Model列表中。主要托管分组默认只启用了deepseek-v4-flash;如需使用其他模型,请先调用UpdateAIModel。- 计划配额与成长计划绑定,而非与分组名称绑定。 已加入计划的环境通过
cloudbase+hy3使用免费配额;hunyuan-v3(仅限hy3)也仍可使用该配额,但正在退役。尚未加入计划时,请引导用户访问https://docs.cloudbase.net/ai/ai-inspire-plan,或使用资源包下的"cloudbase"+ 托管模型。 - 启用更多模型前,先检查价格。
DescribeManagedAIModelList会返回ModelChargingInfo(Uniform表示统一定价,Tiered表示阶梯定价)以及ModelSpec.ContextLength。调用UpdateAIModel前请确认价格。Models是全量替换——传入前请合并旧列表和新条目。 - 检查基础库版本。 需要 3.7.1 或更高版本;在较旧版本中,
wx.cloud.extend.AI为undefined——请勿将此问题当作模型问题来排查。 - 使用回调更新 UI。
onText非常适合逐步刷新聊天气泡;手动拼接eventStream中的内容容易丢失分隔符。 - 检查
[DONE]。 遍历eventStream时,仅在event.data === "[DONE]"时停止,否则流会一直等待下一帧。 - 别忘了
data包装层。streamText参数必须包装在data: { ... }中——这与 JS/Node SDK 不同。忘记包装会导致参数错误。 - 区分“不符合资格/分组未就绪”和“调用失败”。 前者应引导用户完成加入计划/购买/调用
UpdateAIModel等流程;后者则需要排查提示词、参数或网络。两者的错误消息和后续操作完全不同。 - 不要在小程序中硬编码第三方模型 API 密钥。 对于托管目录之外的模型,请使用
CreateAIModel(Secret.ApiKey),将密钥存储在 CloudBase 侧;小程序中只保留GroupName。 - TypeScript:不要使用
any来规避类型错误。 如果wx.cloud.extend.AI接口缺少类型声明,请为实际使用的部分声明精确的interface,或通过本地.d.ts扩展类型。切勿使用: any、as any、@ts-ignore或@ts-nocheck。 - 声称完成前,先自行验证。 构建小程序,在微信开发者工具模拟器中打开,并端到端测试真实的
streamText/generateText流程,确认:(a) 文本块通过onText到达;(b)[DONE]能终止流;(c) 控制台没有新增错误。未经实际运行,仅凭“应该能用”不能作为有效证据。