ARTICLE DETAIL

资讯详情

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

三天用 Claude + Kimi 完成一个微信小程序,完整流程全记录(TaoToken 统一 Key 接入版)

三天用 Claude + Kimi 完成一个微信小程序,完整流程全记录(TaoToken 统一 Key 接入版) 1. 三天上线微信小程序为什么我选了 Claude Kimi 双模型个人开发者做微信小程序最卡人的从来不是写页面而是三件事需求想不清楚、接口调不通、报错看不懂。我这次要做的是一款「AI 记账本」小程序——用户输入一句「昨天中午和同事吃火锅花了 280」小程序自动解析出金额、类别、时间并入库。功能不复杂但涉及云开发、云函数、外部模型调用、前端联调一个人三天做完靠单个模型很容易在某个环节卡死。我的做法是把 Claude 和 Kimi 当成两个不同工种的搭档Claude 负责需求拆解、架构设计、页面骨架生成它长上下文理解强能把整个项目结构一次讲清楚Kimi 负责接口对接、JSON 结构化输出、联调排错它在 API 调用和格式约束上更稳。两个模型都通过 TaoToken 统一 Key 接入省去分别管理多套密钥、多套计费、多套配置的麻烦。TaoToken 是一个模型聚合接入平台你用一个 Key 就能调用包括 Claude、Kimi 在内的多种模型对个人开发者来说配置成本直接砍半。这篇文章交付的是可复制的完整流程TaoToken 统一 Key 的配置骨架、Claude 与 Kimi 在三天里各自的分工提示词模板、小程序端到端验证清单以及我实际踩过的坑。你按同样节奏走三天交付是能复现的。2. TaoToken 前置统一 Key 与配置骨架2.1 为什么用统一 Key 而不是分别申请如果你同时用 Claude 和 Kimi传统做法是去两家分别注册、分别拿 Key、分别充值、分别写配置。项目里就会出现两套环境变量、两套请求封装、两套错误处理。三天工期里光是维护这些就够烦的。TaoToken 的思路是你只拿一个 Key请求发到同一个入口通过 model 参数切换模型。这样云函数里只需要维护一份请求逻辑切换模型只改一个字符串。官网入口在这里注册后到控制台创建 API Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 base_url 使用。2.2 settings.json 配置片段如果你用 Claude Code 这类工具做本地开发配置写在 settings.json 里。下面是我实际用的骨架把 base_url 指向 TaoTokenKey 用环境变量注入避免硬编码进仓库{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [Read, Write, Bash] } }这里的关键是 ANTHROPIC_BASE_URL 指向 TaoToken 的 API 地址工具就会把请求发到统一入口。ANTHROPIC_MODEL 填你要用的 Claude 模型名需要切 Kimi 时改成对应的模型标识即可。2.3 config.toml 配置片段如果你用的是另一类支持 TOML 配置的编码工具写法如下[model] provider taotoken base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 model claude-sonnet-4-20250514 max_tokens 8192 temperature 0.3 [model.fallback] model moonshot-v1-8kfallback 段是我特意加的当 Claude 在某个环节响应慢或超时可以手动切到 Kimi 继续不用改请求代码。统一 Key 的好处在这里体现得很明显——换模型只是换一个 model 字段。注意API Key 不要写进小程序前端代码也不要提交到 Git。云函数里用环境变量本地配置用 .gitignore 排除。3. 可复制配置三天分工与提示词模板3.1 Day 1 需求拆解与架构Claude 主导第一天不要写业务代码先把架构定死。我把需求原话丢给 Claude让它输出架构图和项目结构。提示词模板如下你是资深微信小程序架构师。我要做一个 AI 记账本小程序核心功能 1. 用户输入自然语言如昨天中午和同事吃火锅花了280 2. 自动解析金额、类别、时间 3. 存入云数据库并展示列表和总额 请输出 - 整体架构分层前端/云函数/AI解析层/数据库 - 项目目录结构 - 数据库集合字段设计 - 每个云函数的职责说明 约束AI 解析必须放在云函数不能放前端避免 Key 泄露。Claude 给出的架构是四层小程序原生前端 → 云函数Node.js→ AI 解析层 → 云数据库。关键决策是把 AI 解析放云函数既保护 Key 又避免小程序包体积膨胀。数据库集合 records 的字段设计// records 集合结构 // { // _id: 自动生成, // openid: 用户唯一标识, // amount: 280.00, // category: 餐饮, // description: 和同事吃火锅, // createdAt: Date.now() // }写入云函数时用 wx-server-sdk 关联用户 openid并做金额校验const cloud require(wx-server-sdk) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db cloud.database() exports.main async (event, context) { const wxContext cloud.getWXContext() const { parsedData } event if (typeof parsedData.amount ! number || parsedData.amount 0) { return { code: 400, msg: 金额格式错误 } } const result await db.collection(records).add({ data: { ...parsedData, openid: wxContext.OPENID, createdAt: db.serverDate() } }) return { code: 200, id: result._id } }3.2 Day 2 AI 解析模块Kimi 主导第二天的核心是把自然语言变成结构化 JSON。这里我切到 Kimi因为它对 JSON 模式的支持更稳。提示词模板你是记账助手。从用户输入中提取金额、类别、时间。 类别限定为餐饮、交通、购物、居住、娱乐、其他。 只输出 JSON不要任何前后缀文字。 字段amount(数字)、category(字符串)、description(字符串)。云函数里调用时关键是开启 JSON 模式并压低 temperatureconst axios require(axios) async function callModel(rawText) { const response await axios.post( https://taotoken.net/api/v1/chat/completions, { model: moonshot-v1-8k, messages: [ { role: system, content: 你是记账助手只输出JSON。类别限定餐饮、交通、购物、居住、娱乐、其他。 }, { role: user, content: rawText } ], response_format: { type: json_object }, temperature: 0.3 }, { headers: { Authorization: Bearer ${process.env.TAOTOKEN_KEY} } } ) return JSON.parse(response.data.choices[0].message.content) }我最初只用提示词要求返回 JSON偶尔会带前后缀文字导致 JSON.parse 失败。加上 response_format 强制 JSON 模式后成功率明显提升。同时一定要写降级方案模型不稳定时用正则兜底exports.main async (event) { const { text } event if (!text) return { code: 400, msg: 缺少文本 } try { const aiResult await callModel(text) return { code: 200, parsedData: { amount: parseFloat(aiResult.amount), category: aiResult.category || 其他, description: aiResult.description || text } } } catch (err) { console.error(解析失败, err) const fallback text.match(/(\d(\.\d)?)/) return { code: 200, parsedData: { amount: fallback ? parseFloat(fallback[0]) : 0, category: 其他, description: text } } } }3.3 Day 3 前端与联调双模型协同第三天 Claude 生成页面骨架Kimi 帮忙看报错。首页逻辑Page({ data: { inputText: , loading: false, records: [], totalAmount: 0 }, onInput(e) { this.setData({ inputText: e.detail.value }) }, async submit() { const text this.data.inputText.trim() if (!text) return wx.showToast({ title: 请输入内容, icon: none }) this.setData({ loading: true }) try { const parseRes await wx.cloud.callFunction({ name: parseExpense, data: { text } }) const addRes await wx.cloud.callFunction({ name: addRecord, data: { parsedData: parseRes.result.parsedData } }) if (addRes.result.code 200) { wx.showToast({ title: 记账成功, icon: success }) this.setData({ inputText: }) this.loadRecords() } } catch (err) { console.error(完整错误栈, err) wx.showModal({ title: 出错了, content: JSON.stringify(err) }) } finally { this.setData({ loading: false }) } }, async loadRecords() { const db wx.cloud.database() const res await db.collection(records) .orderBy(createdAt, desc).limit(50).get() const total res.data.reduce((acc, cur) { return Math.round((acc cur.amount) * 100) / 100 }, 0) this.setData({ records: res.data, totalAmount: total }) } })4. 验证请求与成功结果配置完不要急着写业务先用一条 curl 验证 TaoToken 通路是否正常curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_KEY \ -H Content-Type: application/json \ -d { model: moonshot-v1-8k, messages: [{role: user, content: 昨天中午和同事吃火锅花了280}], response_format: {type: json_object} }返回里 choices[0].message.content 应该是一段合法 JSON包含 amount、category、description 三个字段。如果这一步通了说明 Key、base_url、模型名都对。小程序端到端验证清单按顺序走一遍步骤动作预期结果1云函数本地调试 parseExpense返回 code 200 和 parsedData2云函数本地调试 addRecord数据库新增一条记录3小程序真机输入一句话Toast 显示「记账成功」4下拉刷新列表新记录出现在顶部5查看总额金额累加正确无浮点误差6连续快速提交两次只写入一条防抖生效实测下来第 5 步最容易出问题。JavaScript 浮点运算会让 0.1 0.2 变成 0.30000000000000004所以总额计算统一用 Math.round(x * 100) / 100 处理。5. 本篇常见错排查5.1 云函数调用模型超时首次调用外部模型经常超过默认 3 秒超时。解决办法是在云函数配置里把超时时间改到 10 秒并启用固定 IP 出口。如果还是慢检查是不是模型选得太大换成更轻量的模型先跑通链路。5.2 JSON.parse 报错报错信息通常是 Unexpected token说明模型返回里带了前后缀文字。两个动作一是确认 response_format 设成了 json_object二是把 temperature 压到 0.3 以下。还不行就在解析前用正则截取第一个 { 到最后一个 } 之间的内容。5.3 数据库写入重复用户快速连点提交云函数可能被调用多次。前端加 500ms 防抖云函数侧可以用 openid 时间戳做幂等判断。我试过只在前端防抖极端情况下仍会重复后来在云函数里也加了一层校验才彻底解决。5.4 金额精度异常前面提过浮点运算会累积误差。所有涉及金额的加减都走 Math.round(x * 100) / 100存储时也统一保留两位小数。5.5 模型切换后请求失败从 Claude 切到 Kimi 时如果报模型不存在检查 model 字段拼写。TaoToken 的模型标识和官方一致不要自己造名字。另外确认 base_url 没有多加路径正确写法就是 https://taotoken.net/api 。6. 按你的角色选下一步三天流程走完核心经验就三条让 Claude 做架构、Kimi 做接口分工明确效率最高模型不稳定时必须有本地降级兜底用统一 Key 把多模型配置收敛成一份省下的时间全花在业务上。如果你现在卡在接入环节先去创建 Key 并对照接入文档把 base_url 和 model 字段配好API Keys 管理页 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你想先验证模型输出质量再动手写代码直接开模型对话页试几句自然语言解析https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你打算长期用这套组合做编码和 Agent 开发Coding Plan 比按次调用更划算配置方式也更适合日常开发节奏https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。
返回列表