ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微信AI调用个人小程序,云函数耗 Token 的接口地址怎么填?TaoToken 给 Key 与地址

微信AI调用个人小程序,云函数耗 Token 的接口地址怎么填?TaoToken 给 Key 与地址 1. 先把链路画清楚微信 AI 调小程序时Token 到底在哪一层被消耗在微信云开发的云函数里接大模型卡住人的从来不是业务代码而是那两行配置API Key填什么、请求地址填哪个。我见过最常见的两种翻车方式——把 Key 直接写进小程序前端app.js或者把baseURL写成某个国外官方域名结果云函数调用时直接 401 或超时。这篇从接口配置视角把整条链路拆开先在 TaoToken 官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcloud_fn_env_intro 拿到 Key 和请求地址请求地址统一写成https://taotoken.net/api然后回到微信云开发控制台填环境变量。整篇产出三样可复现的东西环境变量键值表、接口地址的填法对照、以及一张 Token 消耗归属表。先把链路讲明白否则后面填什么都是猜。微信生态里「AI 调用个人小程序」这件事落到工程上其实是一条单向数据流微信侧 AI 意图 / 用户在小程序内触发 │ ▼ 小程序前端wxml / js ← 这里绝对不能放 Key │ wx.cloud.callFunction ▼ 微信云函数Node.js运行在腾讯云侧 │ HTTPS POST ▼ https://taotoken.net/api → 模型 │ ▼ 返回 usageprompt_tokens / completion_tokens→ 云函数日志关键判断点有三个第一Token 消耗发生在云函数发出的那一次 HTTPS 请求上不在小程序前端也不在微信 AI 的意图识别环节。所以「谁的 Key」决定了「谁扣费」这直接引出后面的 Token 消耗归属表。第二云函数是服务端环境它拿不到小程序前端的wx.request环境必须走 Node.js 的https或axios。这一点决定了配置文件的写法和你本地调试的方式完全不同。第三请求地址是一个整体不是两段。很多人把它拆成「域名 路径」分别填填着填着就多出一个/v1或者少一个/v1于是 404。正确做法是环境变量里只存BASE_URL https://taotoken.net/api路径在代码里拼接永远不在配置文件里硬编码完整 endpoint。搞清楚这三点下面的配置才有意义。2. 填环境变量之前先去 TaoToken 拿 Key 与请求地址顺序很重要。原文里那种「先写代码再想办法找 Key」的流程会在联调阶段浪费大量时间。正确顺序是打开https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentkey_and_base_url进入控制台体系在API Keys页面创建一个 Key命名建议带上用途例如wx-cloudfn-prod、wx-cloudfn-dev在模型列表里复制你要用的模型 ID它是字符串不是显示名称记下请求地址https://taotoken.net/api。创建 Key 的直达入口在这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentkey_create_inline这里有三个工程习惯值得养按环境拆 Key。本地调试用wx-cloudfn-dev线上云函数用wx-cloudfn-prod。一旦线上出现异常调用量你可以直接把线上那个 Key 停掉而不影响本地。按云函数拆 Key。如果你不止一个云函数在调模型比如aiChat、aiSummary、ocrHelper给每个云函数单独建 Key。这是后面 Token 消耗归属表能对上账的前提。Key 只出现在两个地方云开发控制台的环境变量里以及你本地.env且.env必须在.gitignore里。它不应该出现在小程序代码包、Git 提交历史、截图、聊天记录里。Key 拿到后先做一次握手验证别等云函数部署完再排查。本地开个终端export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api curl -sS -X POST $TAOTOKEN_BASE_URL/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: YOUR_MODEL_ID, messages: [{role: user, content: ping}], max_tokens: 16 }返回体里如果能看到choices和usage说明 Key 与地址这一对组合是对的。这一步必须在填云函数环境变量之前完成——否则云函数报错时你无法区分是 Key 错、地址错还是云函数网络出不去。3. 微信云函数的环境变量与最小可运行代码微信云开发的环境变量实际生效位置是云开发控制台 → 云函数 → 选中函数 → 配置 → 环境变量。云函数目录下的config.json在不同版本控制台里对字段支持不完全一致所以这里的原则是环境变量以控制台配置为准config.json只放权限与触发器。控制台里需要填的键值表如下键名值说明TAOTOKEN_API_KEYYOUR_API_KEY从 API Keys 页面创建按云函数独立TAOTOKEN_BASE_URLhttps://taotoken.net/api末尾不要带/不要带/v1TAOTOKEN_MODELYOUR_MODEL_ID模型 ID 字符串TAOTOKEN_TIMEOUT_MS20000云函数侧超时兜底云函数目录下的config.json可以这样写用于声明权限和触发方式{ permissions: { openapi: [] }, triggers: [] }真正干活的是index.js。下面这份代码是可直接跑的最小实现用 Node 内置https模块不依赖额外 npm 包避免云函数依赖安装失败// cloudfunctions/aiChat/index.js const https require(https); const { URL } require(url); const cloud require(wx-server-sdk); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); const BASE_URL (process.env.TAOTOKEN_BASE_URL || https://taotoken.net/api) .replace(/\/$/, ); const API_KEY process.env.TAOTOKEN_API_KEY; const MODEL process.env.TAOTOKEN_MODEL || YOUR_MODEL_ID; const TIMEOUT_MS Number(process.env.TAOTOKEN_TIMEOUT_MS || 20000); function postJson(pathname, payload) { return new Promise((resolve, reject) { const target new URL(BASE_URL pathname); const body JSON.stringify(payload); const req https.request( { hostname: target.hostname, port: 443, path: target.pathname target.search, method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${API_KEY}, Content-Length: Buffer.byteLength(body) }, timeout: TIMEOUT_MS }, (res) { let raw ; res.setEncoding(utf8); res.on(data, (chunk) { raw chunk; }); res.on(end, () { if (res.statusCode 200 || res.statusCode 300) { return reject( Object.assign(new Error(UPSTREAM_ res.statusCode), { raw }) ); } try { resolve(JSON.parse(raw)); } catch (e) { reject(Object.assign(new Error(BAD_JSON), { raw })); } }); } ); req.on(timeout, () req.destroy(new Error(UPSTREAM_TIMEOUT))); req.on(error, reject); req.write(body); req.end(); }); } exports.main async (event) { const prompt (event event.prompt) || ; if (!API_KEY) return { ok: false, code: MISSING_KEY }; if (!prompt) return { ok: false, code: EMPTY_PROMPT }; const startedAt Date.now(); try { const data await postJson(/v1/chat/completions, { model: MODEL, messages: [ { role: system, content: 你是小程序内的助手回答简短、直接。 }, { role: user, content: prompt } ], max_tokens: 512, temperature: 0.6 }); const choice data.choices data.choices[0]; const text choice choice.message ? choice.message.content : ; // 关键把用量写进日志后面归属表靠它对账 console.log([TAOTOKEN_USAGE], JSON.stringify({ requestId: data.id || null, model: data.model || MODEL, usage: data.usage || null, latencyMs: Date.now() - startedAt })); return { ok: true, text, usage: data.usage || null, requestId: data.id || null }; } catch (err) { console.error([TAOTOKEN_ERROR], err.message, String(err.raw || ).slice(0, 500)); return { ok: false, code: err.message, detail: String(err.raw || ).slice(0, 500) }; } };小程序端这样调注意参数只有业务数据没有任何密钥// pages/chat/chat.js Page({ data: { answer: }, async onAsk() { const res await wx.cloud.callFunction({ name: aiChat, data: { prompt: 帮我用一句话解释云函数是什么 } }); const payload res.result || {}; this.setData({ answer: payload.ok ? payload.text : 调用失败${payload.code} }); } });部署时还有两件容易漏的事一是云函数的超时时间要在控制台调大默认值对模型调用往往不够建议 20 秒起二是Node 版本要选支持你所写语法的版本别用太老的运行时。4. 接口地址的三种正确写法和三种必错写法「接口地址怎么填」这个问题90% 的答案取决于你在写哪一种兼容协议。TaoToken 的请求地址是https://taotoken.net/api但拼到不同端点上形式不一样。正确写法一OpenAI 兼容云函数最常用BASE_URL https://taotoken.net/api ENDPOINT BASE_URL /v1/chat/completions 最终请求 https://taotoken.net/api/v1/chat/completions正确写法二Anthropic 兼容Claude Code 用ANTHROPIC_BASE_URL https://taotoken.net/api注意这里不加/v1客户端会自己在后面拼/v1/messages。你手动加上去就会变成/api/v1/v1/messages直接 404。正确写法三Codex 供应商配置base_url https://taotoken.net/api/v1Codex 的model_providers里要带/v1这一点和 Claude Code 恰好相反。这就是为什么「不要把一个工具的 base_url 直接抄给另一个工具」是一条硬规矩。必错写法一把 Key 拼到 URL 里。https://taotoken.net/api?keyYOUR_API_KEY ← 错误Key 一律走Authorization: Bearer YOUR_API_KEY请求头。必错写法二把 endpoint 塞进环境变量。TAOTOKEN_BASE_URL https://taotoken.net/api/v1/chat/completions ← 错误这样后面再拼路径就重复了。环境变量只存到/api这一层。必错写法三混用不同工具的地址习惯。把 Claude Code 的https://taotoken.net/api直接粘进 Codex 的base_url或者反过来给 Claude Code 加上/v1都是典型症状配置看着没问题请求全是 404。为了少踩坑建议在代码里加一个启动自检把最终拼出来的地址打印一次console.log([TAOTOKEN_ENDPOINT], ${BASE_URL}/v1/chat/completions);云函数日志里出现的那一行就是排障时第一个要看的东西。5. Token 消耗归属表把每一笔调用对上账线上跑起来之后真正难的不是「能不能调通」而是「这个月的消耗是谁花的」。个人小程序往往同时存在多个触发入口用户主动提问、微信侧 AI 意图触发、定时任务预生成、后台管理页测试。如果没有 Key 隔离和日志字段这些消耗会全糊在一起。先按入口拆 Key再按 Key 记账。这张表建议直接抄进你的项目文档调用入口载体建议 Key 名请求地址Token 归属必须记录的日志字段用户小程序内提问aiChat云函数wx-cloudfn-prod-chathttps://taotoken.net/api线上用户交互消耗requestId/usage/openid微信 AI 意图触发aiChat云函数同函数分流wx-cloudfn-prod-chathttps://taotoken.net/api线上用户交互消耗requestId/usage/scene定时预生成内容aiCron云函数wx-cloudfn-prod-cronhttps://taotoken.net/api运营成本单独核算requestId/usage/taskName本地调试本地 Node 脚本wx-cloudfn-devhttps://taotoken.net/api开发成本不计入线上requestId/usage/envdev后台管理测试aiAdmin云函数wx-cloudfn-adminhttps://taotoken.net/api管理成本单独核算requestId/usage/operator落地这张表只需要三件事第一每一个云函数的前 20 行里把 Key 从环境变量读出来不要有兜底默认值。缺 Key 就返回MISSING_KEY让它明确失败而不是偷偷用别的 Key 跑起来。第二每一次调用都打一行结构化日志形如console.log([TAOTOKEN_USAGE], JSON.stringify({ fn: aiChat, env: prod, scene: event.scene || direct, openid: (wxContext wxContext.OPENID) || anonymous, requestId: data.id, usage: data.usage }));第三按月做一次对账。把云函数日志里[TAOTOKEN_USAGE]的行捞出来按fn聚合usage.total_tokens与控制台上的用量记录比对。差值大的一栏通常就是某个漏了日志的分支或者某个还在用旧 Key 的历史版本。这套做法在个人小程序阶段看起来有点重但它的收益很直接当某天发现消耗异常上涨时你能在两分钟内定位到是哪个入口而不是从零开始加日志。6. 排障手册401、404、超时、串号401 / 403Key 的问题。先确认云函数里读到的TAOTOKEN_API_KEY不是空字符串。控制台的环境变量有个隐蔽坑——改完环境变量必须重新部署/重启云函数才会生效。另外检查是不是复制 Key 时带上了首尾空格Authorization头里多一个空格就会鉴权失败。404地址的问题。把最终请求地址完整打出来看一遍。常见三种多了一层/v1、少了一层/v1、BASE_URL末尾带了/导致出现//v1。前两种在上一节已经列过第三种在代码里用.replace(/\/$/, )兜住。超时分两段排查。第一段是云函数本身的超时时间默认值偏短要在控制台调大。第二段是模型响应的耗时max_tokens给得太大、prompt 太长都会拉长响应。建议在代码里显式设置timeout并在超时时主动destroy同时把max_tokens压到一个你业务真正需要的量级。结果串号并发场景下的上下文污染。如果你的云函数把对话历史存在模块级变量里let history []并发请求会互相污染。云函数实例是复用的必须把历史存在数据库或每次请求显式传入不要把状态挂在模块作用域上。日志里看不到 usage有些返回路径没有usage字段比如流式响应的中间分片。如果你用的是流式需要在最后一个 chunk 里取用量或者干脆用非流式做主链路、流式只做体验优化。这里有一个通用的排查顺序建议固化下来① 本地 curl 通不通 → 不通Key 或地址问题 ② curl 通、云函数不通 → 云开发网络/环境变量未生效问题 ③ 云函数通、返回慢 → 超时配置 / max_tokens 问题 ④ 返回通、结果乱 → 并发状态污染问题按这个顺序走基本不会在错误的方向上浪费时间。7. 本机 AI 工具同步改供应商Claude Code、Codex 与 CC Switch 三件套云函数跑通之后很多人的下一步是把本机的开发工具也切到同一个供应商这样 Key 管理、用量查看都在一处。这里要特别强调不同工具用不同配置文件字段不能互相套用。Claude Code 用settings.json走ANTHROPIC_*系列变量{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID } }注意ANTHROPIC_BASE_URL保持到/api不要加/v1。Codex 用config.toml走model_providers配置块model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api/v1 env_key TAOTOKEN_API_KEY wire_api chat注意这里的base_url是带/v1的和 Claude Code 的写法正好相反。把ANTHROPIC_*那套变量名抄进 Codex 配置里是完全没有效果的——Codex 不读这些变量名。CC Switch 三件套所谓三件套指的是同时维护三份配置——Claude Code 的settings.json、Codex 的config.toml、以及一份通用的环境变量文件系统环境变量或.env。用 CC Switch 这类工具在多个供应商之间切换时三份都要一起指向同一家否则会出现「Claude Code 切过去了、Codex 还在用旧的」这种半切换状态。切换后做一次验证别只看工具启动成功# 通用环境变量Codex 侧读取 export TAOTOKEN_API_KEYYOUR_API_KEY # 快速验证地址与 Key 是否配对 curl -sS -o /dev/null -w %{http_code}\n \ -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:YOUR_MODEL_ID,messages:[{role:user,content:ping}],max_tokens:8}返回200就说明这一侧的配对是对的。Claude Code 的具体字段与常见问题官方文档里写得更细https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_code_doc_inline8. 上线前 Checklist 与下一步把上面所有内容压成一张上线前自查表逐条打勾[ ] 云函数环境变量只有 4 个键TAOTOKEN_API_KEY、TAOTOKEN_BASE_URL、TAOTOKEN_MODEL、TAOTOKEN_TIMEOUT_MS[ ]TAOTOKEN_BASE_URL的值是https://taotoken.net/api无尾斜杠、无/v1[ ] 小程序前端代码包里搜不到YOUR_API_KEY、sk-、Bearer[ ].env已加入.gitignoreGit 历史里没有 Key[ ] 每个云函数使用独立 Key命名带环境与用途[ ] 每次调用都打[TAOTOKEN_USAGE]结构化日志[ ] 云函数超时时间已从默认值调大[ ] 已用本地 curl 完成一次握手验证[ ] Token 消耗归属表已落进项目文档按月对账完成这些之后链路的稳定性就不再依赖运气了。真正剩下的变量只有两个模型选型和 prompt 质量。如果你的下一步是把本机开发工作流也统一过来建议按这个顺序推进先在模型对话页面直接试几个模型确认哪个在中文短回答和长上下文两个场景下都稳https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentcta_chat 确定模型后看Coding Plan的额度结构是否符合你的日常调用量https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcta_coding_plan 然后按第 2 节的做法为云函数和本机工具分别创建 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcta_create_key 最后照着文档把本机 AI 工具的供应商配置改过来https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentcta_claude_code_doc 。回到最开始那个问题——云函数耗 Token 的接口地址怎么填答案就一句话环境变量存到https://taotoken.net/api这一层路径在代码里拼Key 走请求头工具之间不互相抄地址。剩下的都是把日志和对账做扎实。
返回列表