通过Taotoken聚合接口实现一个支持多模型切换的简单聊天演示页面
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
通过Taotoken聚合接口实现一个支持多模型切换的简单聊天演示页面
本文面向希望快速构建一个可交互演示页面的前端或全栈开发者。我们将使用纯JavaScript(ES6+)调用Taotoken提供的OpenAI兼容HTTP API,创建一个简洁的Web聊天界面。该页面的核心功能是允许用户从下拉菜单中选择不同的AI模型,发送消息并实时获取回复。文中将重点说明如何在前端安全地处理API Key,并确保接口调用符合Taotoken的配置规范。
1. 项目概述与准备工作
我们的目标是构建一个单页应用,它包含一个模型选择下拉框、一个消息输入区域、一个发送按钮以及一个展示对话历史的区域。整个应用将通过JavaScript直接与https://taotoken.net/api/v1/chat/completions端点进行通信。
在开始编码前,你需要准备两样东西:一个有效的Taotoken API Key和你想调用的模型ID。请登录Taotoken控制台创建API Key,并在模型广场查看可供使用的模型及其对应的ID,例如claude-sonnet-4-6或gpt-4o-mini等。
重要安全提示:在前端代码中直接硬编码API Key是极不安全的,任何访问你页面的人都可以通过浏览器开发者工具看到它。对于演示或原型项目,我们采用一种相对安全的临时方案:使用一个简单的后端代理或环境变量来注入密钥。但在本文的纯前端示例中,我们将先展示直接调用的逻辑结构,并立即指出其安全隐患与改进方案。
2. 构建基础的HTML与CSS界面
首先,我们创建页面的基本结构。这里提供一个极简的HTML骨架和样式,确保功能清晰可见。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Taotoken 多模型聊天演示</title> <style> body { font-family: sans-serif; max-width: 800px; margin: 2rem auto; padding: 0 1rem; } #chat-container { border: 1px solid #ccc; border-radius: 8px; padding: 1rem; margin-bottom: 1rem; height: 400px; overflow-y: auto; } .message { margin-bottom: 0.8rem; } .user { text-align: right; color: #0066cc; } .assistant { text-align: left; color: #333; } #input-area { display: flex; gap: 0.5rem; } #message-input { flex-grow: 1; padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px; } #send-btn { padding: 0.5rem 1.5rem; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } #model-select { padding: 0.5rem; margin-bottom: 1rem; border: 1px solid #ccc; border-radius: 4px; } .warning { background-color: #fff3cd; border: 1px solid #ffeaa7; padding: 1rem; border-radius: 4px; margin-bottom: 1rem; } </style> </head> <body> <h1>Taotoken 多模型聊天演示</h1> <div class="warning"> <strong>注意:</strong>此演示页面将API Key直接暴露在前端代码中,仅用于本地开发或临时演示。在生产环境中,你必须通过后端服务器代理API请求以保护密钥安全。 </div> <label for="model-select">选择模型:</label> <select id="model-select"> <option value="claude-sonnet-4-6">Claude 3.5 Sonnet</option> <option value="gpt-4o-mini">GPT-4o Mini</option> <!-- 更多模型选项可以从Taotoken模型广场获取并添加 --> </select> <div id="chat-container"></div> <div id="input-area"> <input type="text" id="message-input" placeholder="输入你的消息..." /> <button id="send-btn">发送</button> </div> <script src="app.js"></script> </body> </html>3. 实现JavaScript交互逻辑
接下来,我们创建app.js文件,编写与Taotoken API交互的核心逻辑。代码将包含发送请求、处理响应以及更新UI的函数。
// app.js // 注意:在生产环境中,API_KEY不应硬编码在此处,而应由后端环境变量提供或通过安全接口获取。 const TAOTOKEN_API_BASE = 'https://taotoken.net/api/v1'; // !!! 安全警告:请勿在公开仓库或生产环境前端代码中提交真实的API Key !!! // 此处仅为演示,实际使用时应在本地开发环境临时设置,或通过后端代理。 const TAOTOKEN_API_KEY = 'YOUR_TAOTOKEN_API_KEY_HERE'; // 替换为你的真实Key const chatContainer = document.getElementById('chat-container'); const messageInput = document.getElementById('message-input'); const sendBtn = document.getElementById('send-btn'); const modelSelect = document.getElementById('model-select'); let conversationHistory = []; function addMessageToUI(role, content) { const messageDiv = document.createElement('div'); messageDiv.classList.add('message', role); messageDiv.textContent = `${role === 'user' ? '你' : '助手'}: ${content}`; chatContainer.appendChild(messageDiv); chatContainer.scrollTop = chatContainer.scrollHeight; // 滚动到底部 } async function sendMessageToTaotoken(userMessage, selectedModel) { // 将用户消息加入历史并显示 conversationHistory.push({ role: 'user', content: userMessage }); addMessageToUI('user', userMessage); // 显示“思考中”状态 const thinkingDiv = document.createElement('div'); thinkingDiv.classList.add('message', 'assistant'); thinkingDiv.textContent = '助手: 思考中...'; chatContainer.appendChild(thinkingDiv); chatContainer.scrollTop = chatContainer.scrollHeight; try { const response = await fetch(`${TAOTOKEN_API_BASE}/chat/completions`, { method: 'POST', headers: { 'Authorization': `Bearer ${TAOTOKEN_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ model: selectedModel, messages: conversationHistory, stream: false, // 为简化演示,使用非流式响应 }), }); if (!response.ok) { throw new Error(`API请求失败: ${response.status} ${response.statusText}`); } const data = await response.json(); const assistantReply = data.choices[0]?.message?.content; if (assistantReply) { // 移除“思考中”提示,添加真实回复 chatContainer.removeChild(thinkingDiv); conversationHistory.push({ role: 'assistant', content: assistantReply }); addMessageToUI('assistant', assistantReply); } else { throw new Error('未收到有效回复'); } } catch (error) { console.error('调用Taotoken API时出错:', error); chatContainer.removeChild(thinkingDiv); const errorDiv = document.createElement('div'); errorDiv.classList.add('message', 'assistant'); errorDiv.textContent = `助手: 抱歉,请求出错。(${error.message})`; chatContainer.appendChild(errorDiv); } } // 事件监听 sendBtn.addEventListener('click', async () => { const userMessage = messageInput.value.trim(); const selectedModel = modelSelect.value; if (!userMessage) return; messageInput.value = ''; // 清空输入框 await sendMessageToTaotoken(userMessage, selectedModel); }); messageInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { sendBtn.click(); } }); // 初始化:可选,发送一个欢迎消息 window.onload = () => { addMessageToUI('assistant', '你好!请从上方选择模型,然后开始对话。'); };4. 关键配置说明与安全进阶
上面的代码可以直接运行,但其中存在明显的安全风险:API Key完全暴露���对于任何计划部署或分享的演示,你必须采取安全措施。
正确的API Key处理方式是构建一个简单的后端服务。这个服务持有API Key,前端只与你的后端通信。例如,你可以使用Node.js + Express、Python + Flask或任何你熟悉的后端框架快速搭建一个代理端点。
以下是一个使用Node.js和Express的极简后端示例,展示如何安全地转发请求:
// server.js (后端示例) const express = require('express'); const axios = require('axios'); require('dotenv').config(); // 用于从.env文件加载环境变量 const app = express(); const port = 3000; app.use(express.json()); app.use(express.static('public')); // 假设前端HTML/JS放在public目录 // 代理聊天请求的端点 app.post('/api/chat', async (req, res) => { try { const { model, messages } = req.body; const response = await axios.post( 'https://taotoken.net/api/v1/chat/completions', { model, messages, stream: false }, { headers: { 'Authorization': `Bearer ${process.env.TAOTOKEN_API_KEY}`, // Key从环境变量读取 'Content-Type': 'application/json', }, } ); res.json(response.data); } catch (error) { console.error('代理请求出错:', error.response?.data || error.message); res.status(500).json({ error: '请求上游API失败' }); } }); app.listen(port, () => { console.log(`安全代理服务器运行在 http://localhost:${port}`); });对应的前端JavaScript代码则需要修改,将请求发送到你自己的后端端点(例如/api/chat),并且完全移除硬编码的API Key。这样,你的Taotoken API Key就安全地存储在后端服务器的环境变量中,不会泄露给前端用户。
5. 运行与扩展
将HTML、CSS、JavaScript文件放在同一目录,并在浏览器中打开HTML文件,即可运行这个基础演示。请确保已将代码中的YOUR_TAOTOKEN_API_KEY_HERE替换为你在控制台获取的真实Key(仅限本地测试)。
你可以轻松扩展此演示:
- 在
<select>下拉框中添加更多从Taotoken模型广场获取的模型ID。 - 实现流式响应(
stream: true)以获得更实时的打字机输出效果。 - 美化UI,增加对话历史持久化(如使用
localStorage)。 - 按照前述安全建议,集成后端代理服务。
这个演示页面清晰地展示了如何利用Taotoken统一的OpenAI兼容接口,以前端技术快速构建一个可切换多模型的原型应用。所有模型调用都通过同一个端点https://taotoken.net/api/v1/chat/completions完成,只需更改model参数即可,极大简化了开发流程。
希望本教程能帮助你快速上手。要获取API Key和探索更多可用模型,请访问 Taotoken。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
