news 2026/5/16 6:19:11

使用 Node.js 和 Taotoken API 批量处理网站内容生成任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Node.js 和 Taotoken API 批量处理网站内容生成任务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

使用 Node.js 和 Taotoken API 批量处理网站内容生成任务

基础教程类,面向 Node.js 开发者,讲解如何构建一个后台服务,该服务从数据库或文件中获取原始内容,通过调用 Taotoken 的多模型聚合端点进行批量改写或扩写,教程将涵盖使用 openai 包进行异步调用,设置重试机制以应对网络波动,以及将处理后的结果保存或推送的完整流程。

1. 项目初始化与环境配置

首先,创建一个新的 Node.js 项目并安装必要的依赖。我们将使用openai官方 SDK 来调用 Taotoken 的 OpenAI 兼容 API,同时使用dotenv管理环境变量。

在项目根目录下,执行以下命令:

npm init -y npm install openai dotenv

接下来,创建一个.env文件来存储你的 Taotoken API Key。你可以在 Taotoken 控制台创建并获取 API Key。

# .env TAOTOKEN_API_KEY=你的_API_Key

2. 构建基础 API 客户端

创建一个名为taotokenClient.js的文件,用于初始化与 Taotoken 服务通信的客户端。关键在于正确设置baseURL参数。

// taotokenClient.js import OpenAI from 'openai'; import dotenv from 'dotenv'; dotenv.config(); // 初始化 OpenAI 客户端,指向 Taotoken 的 OpenAI 兼容端点 const taotokenClient = new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: 'https://taotoken.net/api', // 注意:baseURL 末尾不带 /v1 }); export default taotokenClient;

这里需要特别注意baseURL的配置。对于使用 OpenAI SDK 的场景,baseURL应设置为https://taotoken.net/api,SDK 会自动在内部拼接/v1/chat/completions等具体路径。这是与直接使用 curl 命令或某些工具配置不同的地方。

3. 设计批量处理流程

批量处理的核心是异步并发控制,既要提高效率,又要避免因请求过快导致速率限制。我们将设计一个从模拟数据源读取、处理、到写入结果的主流程。

首先,创建一个模拟的数据源函数。在实际应用中,这里可以替换为从数据库(如 MongoDB、MySQL)或文件系统读取数据的逻辑。

// dataSource.js /** * 模拟从数据源获取待处理的内容列表 * @param {number} count - 需要获取的内容条数 * @returns {Promise<Array<{id: string, rawContent: string}>>} */ export async function fetchContentsFromSource(count = 10) { // 这里模拟返回一些原始内容 const mockContents = []; for (let i = 0; i < count; i++) { mockContents.push({ id: `content_${i + 1}`, rawContent: `这是第${i + 1}条需要被改写或扩写的原始文本内容。它的主题是关于技术教程的。`, }); } // 模拟异步延迟 await new Promise(resolve => setTimeout(resolve, 100)); return mockContents; }

接着,创建核心的内容处理函数。这个函数将调用 Taotoken API,并指定需要使用的模型。你可以在 Taotoken 模型广场查看所有可用的模型 ID。

// contentProcessor.js import taotokenClient from './taotokenClient.js'; /** * 调用 Taotoken API 处理单条内容 * @param {string} rawContent - 原始内容 * @param {string} modelId - 模型 ID,例如 'claude-sonnet-4-6', 'gpt-4o-mini' * @param {string} instruction - 处理指令,如“改写”、“扩写” * @returns {Promise<string>} - 处理后的内容 */ export async function processSingleContent(rawContent, modelId = 'claude-sonnet-4-6', instruction = '请将以下内容进行专业且流畅的改写:') { try { const completion = await taotokenClient.chat.completions.create({ model: modelId, messages: [ { role: 'system', content: '你是一个专业的文本编辑助手。' }, { role: 'user', content: `${instruction}\n${rawContent}` }, ], temperature: 0.7, // 可根据需要调整 max_tokens 等参数 }); return completion.choices[0]?.message?.content || ''; } catch (error) { console.error(`处理内容时发生错误:`, error.message); throw error; // 将错误向上抛,由调用方决定重试或记录 } }

4. 实现并发控制与重试机制

直接并发大量请求可能导致问题。我们需要一个队列来控制并发数,并为每个请求添加简单的重试逻辑以增强鲁棒性。

// batchProcessor.js import { processSingleContent } from './contentProcessor.js'; /** * 带重试的单个内容处理包装函数 * @param {Object} contentItem - 内容项,包含 id 和 rawContent * @param {string} modelId - 模型 ID * @param {string} instruction - 指令 * @param {number} maxRetries - 最大重试次数 * @returns {Promise<Object>} - 包含 id, rawContent, processedContent, status 的对象 */ async function processWithRetry(contentItem, modelId, instruction, maxRetries = 3) { let lastError; for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const processedContent = await processSingleContent(contentItem.rawContent, modelId, instruction); return { id: contentItem.id, rawContent: contentItem.rawContent, processedContent, status: 'success', }; } catch (error) { lastError = error; console.warn(`[${contentItem.id}] 第 ${attempt} 次尝试失败:`, error.message); if (attempt < maxRetries) { // 指数退避等待 const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000); await new Promise(resolve => setTimeout(resolve, delay)); } } } // 所有重试都失败 return { id: contentItem.id, rawContent: contentItem.rawContent, processedContent: null, status: 'failed', error: lastError?.message, }; } /** * 批量处理内容的主函数,控制并发 * @param {Array} contentList - 内容列表 * @param {string} modelId - 模型 ID * @param {string} instruction - 处理指令 * @param {number} concurrency - 并发数,默认 3 * @returns {Promise<Array>} - 所有内容处理结果的数组 */ export async function batchProcessContents(contentList, modelId, instruction, concurrency = 3) { const results = []; const queue = [...contentList]; // 并发执行 worker 函数 const workers = Array(concurrency).fill().map(async () => { while (queue.length > 0) { const item = queue.shift(); if (!item) break; console.log(`开始处理: ${item.id}`); const result = await processWithRetry(item, modelId, instruction); results.push(result); console.log(`处理完成: ${item.id}, 状态: ${result.status}`); } }); // 等待所有 worker 完成 await Promise.all(workers); return results; }

5. 结果保存与主程序入口

最后,我们将处理结果保存到文件(或推送到数据库),并编写主函数串联整个流程。

// saveResults.js import fs from 'fs/promises'; import path from 'path'; /** * 将处理结果保存为 JSON 文件 * @param {Array} results - 处理结果数组 * @param {string} outputDir - 输出目录 */ export async function saveResultsToFile(results, outputDir = './output') { try { await fs.mkdir(outputDir, { recursive: true }); const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const filePath = path.join(outputDir, `processed_contents_${timestamp}.json`); const outputData = { generatedAt: new Date().toISOString(), total: results.length, success: results.filter(r => r.status === 'success').length, failed: results.filter(r => r.status === 'failed').length, results, }; await fs.writeFile(filePath, JSON.stringify(outputData, null, 2), 'utf-8'); console.log(`结果已保存至: ${filePath}`); return filePath; } catch (error) { console.error('保存结果时发生错误:', error); throw error; } }

现在,创建一个main.js文件作为程序的入口点。

// main.js import { fetchContentsFromSource } from './dataSource.js'; import { batchProcessContents } from './batchProcessor.js'; import { saveResultsToFile } from './saveResults.js'; async function main() { console.log('开始批量内容处理任务...'); // 1. 从数据源获取原始内容 const rawContents = await fetchContentsFromSource(5); // 示例处理5条 console.log(`从数据源获取到 ${rawContents.length} 条内容。`); // 2. 批量处理内容 // 模型 ID 请根据 Taotoken 模型广场的实际可用模型进行替换 const modelId = 'claude-sonnet-4-6'; const processingInstruction = '请将以下内容进行专业、口语化改写,使其更适合博客发布:'; const processedResults = await batchProcessContents( rawContents, modelId, processingInstruction, 2 // 并发数设为2,避免请求过快 ); // 3. 保存结果 const outputPath = await saveResultsToFile(processedResults); // 4. 打印摘要 const successCount = processedResults.filter(r => r.status === 'success').length; console.log(`\n任务完成摘要:`); console.log(` 总计处理: ${processedResults.length}`); console.log(` 成功: ${successCount}`); console.log(` 失败: ${processedResults.length - successCount}`); console.log(` 结果文件: ${outputPath}`); // 在实际应用中,这里可以添加将结果推送回数据库或CMS的代码 // await pushResultsToDatabase(processedResults); } main().catch(error => { console.error('主程序运行失败:', error); process.exit(1); });

6. 运行与后续扩展

在终端运行node main.js即可启动批量处理任务。这个基础框架为你提供了一个可工作的起点,你可以根据实际业务需求进行扩展:

  1. 真实数据源:替换fetchContentsFromSource函数,连接你的 MySQL、PostgreSQL 或 MongoDB 数据库。
  2. 复杂指令与模型选择:可以根据内容类型(如技术文章、产品描述)动态选择不同的处理指令和 Taotoken 平台上的不同模型。
  3. 结果推送:在saveResultsToFile之后,添加函数将处理成功的内容自动发布到你的网站内容管理系统(CMS)。
  4. 监控与日志:集成更完善的日志系统(如 Winston),并添加性能监控,记录每次 API 调用的耗时和 Token 使用量。Taotoken 控制台提供了用量看板,可以帮助你进行成本分析。

通过以上步骤,你便构建了一个基于 Node.js 和 Taotoken API 的、具备基本容错能力的自动化内容批量处理服务。整个流程的关键在于正确配置 API 客户端,并合理设计异步任务队列与错误处理逻辑,以稳定高效地利用大模型能力。

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 6:15:49

朋友学过都说好的家电清洗培训 行业前景与培训内容科普解读

家电清洗培训行业前景随着人们生活水平的提高&#xff0c;家电的普及率越来越高&#xff0c;对家电清洗的需求也日益增长。据相关数据显示&#xff0c;近年来家电清洗市场规模呈现逐年上升的趋势。在城市中&#xff0c;越来越多的家庭开始重视家电的清洁与保养&#xff0c;以延…

作者头像 李华
网站建设 2026/5/16 6:15:15

AI Agent Harness Engineering 的安全攻防:你的智能体如何被欺骗、劫持与利用

AI Agent Harness Engineering 安全攻防深度解析:你的智能体如何被欺骗、劫持与利用 关键词 AI Agent安全、Harness工程、Prompt注入、工具劫持、智能体攻防、LLM安全、权限逃逸 摘要 随着AI Agent从概念验证走向大规模产业落地,作为智能体控制平面的Harness层已成为攻防…

作者头像 李华
网站建设 2026/5/16 6:10:29

ARM Cortex-A32/A34架构参数配置与事件追踪实战指南

1. ARM Cortex-A32/A34架构深度解析在嵌入式系统和移动计算领域&#xff0c;ARM架构凭借其出色的能效比和可扩展性占据了主导地位。作为该架构的重要成员&#xff0c;Cortex-A32和A34处理器广泛应用于从物联网终端到高性能嵌入式设备的各类场景。这些处理器不仅继承了ARMv8-A架…

作者头像 李华
网站建设 2026/5/16 6:01:34

Proxima向量检索库:硬件优化与量化技术实战解析

1. 项目概述&#xff1a;一个为现代开发者打造的“近邻”代码库 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Zen4-bit/Proxima”。乍一看这个标题&#xff0c;可能会有点摸不着头脑。“Zen4-bit”像是一个用户名或者某种架构的代号&#xff0c;而“Proxima”则让人联…

作者头像 李华
网站建设 2026/5/16 5:48:04

Ultimaker Cura:3D打印新手快速上手的终极切片软件完整教程

Ultimaker Cura&#xff1a;3D打印新手快速上手的终极切片软件完整教程 【免费下载链接】Cura 3D printer / slicing GUI built on top of the Uranium framework 项目地址: https://gitcode.com/gh_mirrors/cu/Cura 你是否刚入手3D打印机&#xff0c;面对复杂的切片软件…

作者头像 李华