ARTICLE DETAIL

资讯详情

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

Vue+Vite+TS 项目里把 API Base URL 改到 TaoToken 的完整配置与验证

Vue+Vite+TS 项目里把 API Base URL 改到 TaoToken 的完整配置与验证 1. 为什么要在 VueViteTS 里统一 API 出口前端项目做久了你会发现一个规律接口地址散落在各个组件里改一次域名要全局搜索替换还容易漏。VueViteTS 这套组合本身对环境的支持很成熟import.meta.env配合.env文件就能把 Base URL 抽出来但很多人只做到「抽出来」没做到「统一出口」。我这次要解决的就是这个把项目里所有请求的 Base URL 指向 TaoToken 的统一 API 通道本地开发走.env.development构建产物走.env.production中间用 axios 封装层兜住最后跑一次真实请求确认命中。先说清楚 TaoToken 是什么、能做什么、适合谁。它是一个统一的大模型 API 接入通道把不同模型的调用收敛到一套 Base URL 和 Key 上。对前端来说你不需要为每个模型单独配地址只要把请求出口指向https://taotoken.net/api用统一的 Key 鉴权就能在 Vue 项目里调模型对话、代码补全这类能力。适合谁适合正在做 AI 功能的前端团队尤其是用 Vue3 Vite TS 技术栈、希望请求层干净可控的开发者。为什么强调「统一出口」因为前端调模型和调普通业务接口不一样。模型接口的响应结构、超时时间、错误码都更特殊如果每个组件自己fetch拦截器、重试、鉴权全乱套。正确做法是.env管地址request.ts管实例业务层只管调方法。这一篇的路径是先配.env再写 axios 封装然后跑验证最后把常见报错过一遍。全程可复制你跟着改就行。2. TaoToken 前置准备Key、Base URL 与模型 ID在动前端代码之前有三样东西要先拿到手不然配置写了也跑不通。这三样就是 Base URL、API Key、Model ID我习惯叫它们「三件套」。Base URL 固定是https://taotoken.net/api注意这里不带任何路径后缀具体端点由请求时拼。API Key 需要你去控制台生成入口在 API Keys 页面。生成后复制出来它只会完整显示一次丢了就得重新建。Model ID 是你打算调用的模型标识比如对话类、代码类各有对应的 ID。这个 ID 要和你实际请求的端点匹配写错了会返回模型不存在的错误。注意Key 不要硬编码进.env.production然后提交到仓库。生产环境的 Key 应该走构建时注入或者后端代理前端.env里放的应该是占位或通过 CI 变量替换。拿到三件套后建议先在命令行验证一次确认 Key 本身可用再去改前端。这样能把「Key 问题」和「前端配置问题」分开排查。验证方式很简单用 curl 发一个最小请求curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的Key \ -d { model: 你的ModelID, messages: [{role: user, content: ping}] }如果返回里有choices字段说明 Key 和模型 ID 都没问题可以进入前端配置。如果返回 401那是 Key 的问题如果返回模型相关错误那是 Model ID 的问题。这一步花两分钟能省后面半小时。另外提一句 Coding Plan。如果你这个 Vue 项目是要长期接模型做编码辅助或者 Agent 类功能可以了解下 Coding Plan它在调用额度和通道稳定性上更适合持续开发场景。短期验证用按量就行长期跑再考虑。3. 可复制配置.env 变量与 axios 封装层这一节是核心所有片段都能直接抄。先建两个环境文件放在项目根目录和vite.config.ts同级。.env.developmentVITE_MODE_ENV development VITE_API_BASE_URL https://taotoken.net/api VITE_API_KEY sk-你的开发Key VITE_MODEL_ID 你的ModelID.env.productionVITE_MODE_ENV production VITE_API_BASE_URL https://taotoken.net/api VITE_API_KEY __INJECT_AT_BUILD__ VITE_MODEL_ID 你的ModelIDVite 只暴露VITE_前缀的变量给客户端这点要记住写成API_KEY是读不到的。然后在src下建utils/request.ts这是统一出口import axios, { AxiosInstance, AxiosRequestConfig } from axios const baseURL import.meta.env.VITE_API_BASE_URL const apiKey import.meta.env.VITE_API_KEY const request: AxiosInstance axios.create({ baseURL, timeout: 60000, headers: { Content-Type: application/json, }, }) request.interceptors.request.use( (config) { if (apiKey config.headers) { config.headers[Authorization] Bearer ${apiKey} } return config }, (error) Promise.reject(error) ) request.interceptors.response.use( (response) response.data, (error) { if (error.response) { const { status } error.response if (status 401) { console.error(鉴权失败检查 VITE_API_KEY) } } return Promise.reject(error) } ) export default request注意超时我设了 60 秒模型接口比普通接口慢3 秒那种设置必超时。响应拦截器里直接返回response.data业务层拿到的就是干净的数据。再建一个src/api/chat.ts把模型调用收口import request from /utils/request export interface ChatMessage { role: user | assistant | system content: string } export function chatCompletion(messages: ChatMessage[]) { return request.post(/v1/chat/completions, { model: import.meta.env.VITE_MODEL_ID, messages, }) }这里baseURL是https://taotoken.net/apipost的路径是/v1/chat/completions拼起来就是完整端点。这样业务组件只 importchatCompletion完全不关心地址和 Key。如果你用 Cline 或者 Claude Code 这类工具做辅助开发它们的配置逻辑是一样的三件套。以 Cline 的 MCP 配置为例Base URL 填https://taotoken.net/apiKey 填你的Model ID 填对应模型。Codex 的auth.json也是同样三个字段。CC Switch 切换配置时确保这三项一致不然会出现「Key 对但模型不对」的隐性错误。4. 验证请求从本地 dev 到构建产物配置写完必须验证而且要分两种场景本地开发服务器和构建后的产物。很多人只测了npm run dev上线才发现.env.production没生效。先看本地。在package.json里确认脚本带了 modescripts: { dev: vite --mode development, build: vue-tsc --noEmit vite build --mode production, preview: vite preview }启动npm run dev在任意组件里调一次import { chatCompletion } from /api/chat async function testApi() { try { const res await chatCompletion([ { role: user, content: 你好返回一句话 } ]) console.log(命中成功, res) } catch (e) { console.error(请求失败, e) } }打开浏览器 Network 面板找到那条请求确认三件事Request URL 是https://taotoken.net/api/v1/chat/completionsRequest Headers 里有Authorization: Bearer sk-...Response 里有choices数组。三个都对本地就算通了。再看构建产物。执行npm run build然后npm run preview。这里有个坑preview默认不带 mode读的是.env.production但如果你 Key 写的是占位符请求会 401。所以验证构建产物时要么临时把真实 Key 填进.env.production本地测要么用 CI 注入。实测下来构建产物验证最直接的方式是看打包后的 JS 里 Base URL 有没有被替换。在dist/assets里搜taotoken.net能搜到说明环境变量注入成功。搜不到就是.env.production没被读取检查文件名拼写和 mode 参数。提示Vite 的环境变量是在构建时静态替换的不是运行时读取。所以改了.env必须重启 dev server 或重新 build热更新不会生效。两种场景都验证通过说明你的统一出口是可靠的。这时候再去写业务功能心里就有底了。5. 常见报错排查401、proxy failed 与 choices 读取失败配置过程中最容易撞的几个错我按真实报错信息列出来对照着查。401 Unauthorized。这个最常见原因就三类Key 没读到、Key 格式不对、Key 失效。先在浏览器控制台打console.log(import.meta.env.VITE_API_KEY)如果是undefined说明变量名没加VITE_前缀或者.env文件没放对位置。如果打出来是__INJECT_AT_BUILD__说明你用的是生产占位符但没注入。如果 Key 正常还 401去控制台确认 Key 是否被禁用。local proxy failed / ECONNREFUSED。这个错通常出现在你还在用 Vite 的server.proxy转发旧接口。既然已经直连 TaoToken就不需要代理了。检查vite.config.ts里有没有残留的proxy配置指向本地后端有的话删掉或者改条件。另外确认baseURL是完整的https://开头写成相对路径/api会走本地代理自然失败。Cannot read properties of undefined (reading choices)。这个错说明请求发出去了但响应结构不对。两种可能一是响应拦截器返回了response.data但你的业务代码又取了一次.data导致undefined.choices二是接口返回的是错误对象没有choices字段。先console.log完整响应确认结构再取值。拦截器里返回response.data的话业务层直接用res.choices。OAuth / 鉴权头冲突。如果你项目里同时有登录态的Authorization和 TaoToken 的 Key会互相覆盖。解决办法是给模型请求单独一个 axios 实例或者用自定义 header 名区分。别在同一个实例上混用两套鉴权。模型不存在 / model not found。检查VITE_MODEL_ID是否和端点匹配。对话端点和补全端点的模型 ID 可能不同别混用。这个错和 Key 无关纯粹是 ID 写错。排查顺序建议先看 Network 里的 Request URL 和 Headers再看 Response body最后看控制台报错。大部分问题在第一步就能定位。6. 把请求出口固定下来后续才好扩展走到这里你的 VueViteTS 项目已经有一套干净的请求出口了。.env管地址和 Keyrequest.ts管实例和拦截api/chat.ts管业务方法三层各司其职。以后要加新模型只改 Model ID要换通道只改 Base URL要加鉴权逻辑只动拦截器。如果你后面要接更多模型能力或者做流式输出建议在request.ts里加一个responseType: stream的配置分支别和普通 JSON 请求混在一起。流式响应的处理方式和普通响应差别很大提前分开能少踩坑。需要生成 Key 或者查接入细节可以从 API Keys 页面进接入文档在 doc 里。模型对话的在线验证入口在模型对话长期做编码辅助的话 Coding Plan 更合适。这几个入口按你的场景选别只停在首页。最后留一个实用习惯每次改完.env先跑一次第 4 节的验证请求确认命中再继续写业务。这个动作花不了一分钟但能挡住 90% 的配置类问题。
返回列表