ARTICLE DETAIL

资讯详情

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

AI 热点周报 20260702:用 TaoToken 统一 Key 跑通多模型新闻摘要流水线

AI 热点周报 20260702:用 TaoToken 统一 Key 跑通多模型新闻摘要流水线 1. 从多源新闻到结构化摘要一条流水线要解决什么每天打开十几个 AI 新闻源标题、链接、发布时间散落在不同页面手动复制粘贴再让模型总结半小时就没了。更麻烦的是不同模型对同一条新闻的摘要风格差异很大想横向对比就得反复切换平台、重新贴 Key。我试过用浏览器插件逐个调用结果 Key 管理混乱某个模型额度用完还得翻半天配置。这个场景的核心需求其实很明确把「抓取标题与链接」和「调用多模型生成结构化摘要」拆成两段中间用统一的 API 通道串起来。抓取部分可以用简单的 HTTP 请求或 RSS 解析完成真正需要统一的是模型调用层——不管后面接的是哪家模型前端脚本只认一个 Base URL、一个 Key、一套请求格式。TaoToken 在这里扮演的就是这个统一通道。它提供 OpenAI 兼容的接口意味着你原来写好的openaiSDK 代码、requests调用、甚至 Cline 这类工具的配置只需要改base_url和api_key两个字段就能切换模型。对于新闻摘要这种「同一批输入、多个模型对比输出」的任务省掉的是重复的鉴权和格式适配工作。适合谁跟做有基础 Python 能力、想搭自动化信息流的人需要定期产出 AI 周报的运营或内容同学以及想对比不同模型摘要质量、但不想维护多套 Key 的开发者。整条流水线跑通后你只需要维护一个新闻源列表和一个模型 ID 列表剩下的交给脚本。下面从环境准备开始一步步把配置、脚本、验证动作写清楚。所有代码都可以直接复制运行模型 ID 和路径按你实际使用的填。2. TaoToken 前置准备Key、Base URL 与模型 ID 三件套在写脚本之前先把三个东西拿到手API Key、Base URL、你要用的模型 ID。这三件套是后面所有配置的基础缺一个请求就会报错。获取 API Key访问 TaoToken 控制台的 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite创建一个新的 Key。建议按用途命名比如news-digest方便后面排查是哪个脚本在调用。创建后立即复制保存页面刷新后不会再完整显示。Base URLTaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数。在 OpenAI SDK 里填的时候通常需要带上/v1后缀也就是https://taotoken.net/api/v1。如果你用的是原生requests直接请求https://taotoken.net/api/v1/chat/completions即可。模型 ID这是最容易踩坑的地方。不同模型的 ID 命名规则不一样比如有些是gpt-4o、有些是claude-3-5-sonnet、有些带日期后缀。你可以在模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite先手动发一条消息确认模型可用然后在请求日志或文档里找到对应的 model 字段值。建议把候选模型 ID 写进一个列表后面脚本会遍历这个列表。环境变量配置建议放在项目根目录的.env文件里不要硬编码在脚本中。这样换 Key 或换模型时只改一处# .env TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1 TAOTOKEN_MODEL_LISTgpt-4o,claude-3-5-sonnet,deepseek-chat如果你用 Cline 或 Claude Code 这类工具配置方式略有不同。以 Cline 的 MCP 配置为例需要在 settings 里填 Base URL、API Key 和 Model ID 三项缺一不可。Claude Code 的settings.json里则是通过env字段注入后面第五节会给出具体片段。注意不要把 Key 提交到 Git 仓库。.env文件记得加进.gitignore。如果 Key 泄露立即在控制台删除并重建。3. 可复制配置环境变量、请求体与批量摘要脚本这一节给出完整的可运行配置。先看请求体的结构再写批量脚本。TaoToken 兼容 OpenAI 的 Chat Completions 格式所以请求体和你平时调 OpenAI 一样。关键字段是model、messages、temperature。对于新闻摘要建议temperature设 0.3 左右保证输出稳定、不跑偏。下面是一个最小请求示例{ model: gpt-4o, messages: [ { role: system, content: 你是一个 AI 新闻摘要助手。对每条新闻输出 JSON字段包括 title、summary、source、link。summary 控制在 80 字以内。 }, { role: user, content: 标题OpenAI 预览 GPT-5.6 Sol\n链接https://example.com/news/1\n请生成结构化摘要。 } ], temperature: 0.3, response_format: { type: json_object } }注意response_format设为json_object时system 提示里必须出现 JSON 字样否则部分模型会报错。这是 OpenAI 兼容接口的常见约束。接下来是批量摘要脚本。它做三件事读取新闻列表、遍历模型列表、把结果写入 JSON 文件。新闻列表先用一个本地 JSON 模拟实际使用时替换成你的抓取结果即可。# digest_pipeline.py import os import json import time from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) MODELS os.getenv(TAOTOKEN_MODEL_LIST, gpt-4o).split(,) SYSTEM_PROMPT 你是一个 AI 新闻摘要助手。 对每条新闻输出 JSON字段包括 title、summary、source、link。 summary 控制在 80 字以内保留关键数字和机构名。 只输出 JSON不要额外解释。 def load_news(pathnews.json): with open(path, r, encodingutf-8) as f: return json.load(f) def summarize_one(model, news_item): user_content ( f标题{news_item[title]}\n f链接{news_item[link]}\n f来源{news_item.get(source, 未知)}\n 请生成结构化摘要。 ) resp client.chat.completions.create( modelmodel, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_content}, ], temperature0.3, response_format{type: json_object}, ) return resp.choices[0].message.content def run(): news_list load_news() results {} for model in MODELS: model model.strip() results[model] [] for item in news_list: try: raw summarize_one(model, item) parsed json.loads(raw) results[model].append(parsed) print(f[{model}] OK: {item[title][:30]}) except Exception as e: results[model].append({error: str(e), title: item[title]}) print(f[{model}] FAIL: {item[title][:30]} - {e}) time.sleep(0.5) with open(digest_result.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(done - digest_result.json) if __name__ __main__: run()配套的news.json样例[ { title: OpenAI 预览 GPT-5.6 Sol, link: https://example.com/news/1, source: OpenAI 官方博客 }, { title: Anthropic 恢复 Fable 5 全球访问, link: https://example.com/news/2, source: Anthropic 官方公告 }, { title: DeepSeek 启动首轮融资, link: https://example.com/news/3, source: Reuters } ]依赖安装pip install openai python-dotenv运行python digest_pipeline.py脚本里的time.sleep(0.5)是防止请求过于密集触发限流。如果你用的模型响应快、额度充足可以调小如果遇到 429 错误就调大。输出文件digest_result.json会按模型分组方便你直接对比同一新闻在不同模型下的摘要差异。如果你更习惯用 TOML 管理配置可以把模型列表和提示词放到config.toml[api] base_url https://taotoken.net/api/v1 model_list [gpt-4o, claude-3-5-sonnet, deepseek-chat] [prompt] system 你是一个 AI 新闻摘要助手。对每条新闻输出 JSON字段包括 title、summary、source、link。summary 控制在 80 字以内。只输出 JSON。 temperature 0.3然后在脚本里用tomllibPython 3.11读取。这样配置和代码分离改提示词不用动脚本。4. 验证请求与成功结果固定样例对比输出一致性配置写完后先别急着跑全量。用一条固定新闻做单次请求确认通道通了、返回格式对。这一步能帮你快速定位是 Key 问题、模型 ID 问题还是请求体问题。单次验证脚本# verify_one.py import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), ) resp client.chat.completions.create( modelgpt-4o, messages[ {role: system, content: 输出 JSON字段 title、summary。只输出 JSON。}, {role: user, content: 标题OpenAI 预览 GPT-5.6 Sol。生成摘要。}, ], temperature0.3, response_format{type: json_object}, ) print(resp.choices[0].message.content)预期输出类似{title: OpenAI 预览 GPT-5.6 Sol, summary: OpenAI 开启 GPT-5.6 系列有限预览推出 Sol、Terra、Luna 三档模型主打编程、生物和网络安全能力。}如果这一步成功说明三件套配置正确。接下来做一致性验证用同一条新闻、同一组参数连续请求三次看输出是否稳定。因为temperature设了 0.3输出应该高度相似但不会完全逐字相同。如果三次差异极大说明模型对提示词理解不稳定需要把 system 提示写得更具体比如明确「summary 必须包含机构名和日期」。多模型对比验证把verify_one.py里的model换成列表里的其他模型各跑一次把结果并排看。你会发现不同模型的摘要风格差异有的偏简洁、有的保留更多细节、有的会把链接也复述一遍。这个对比结果直接决定你最终用哪个模型做日常摘要。成功跑通全量脚本后digest_result.json的结构应该是{ gpt-4o: [ {title: ..., summary: ..., source: ..., link: ...} ], claude-3-5-sonnet: [ {title: ..., summary: ..., source: ..., link: ...} ] }如果某个模型下出现{error: ...}说明那条请求失败了错误信息会告诉你原因。常见的是模型 ID 写错或额度不足。提示验证阶段建议只放 2 到 3 条新闻确认流程无误后再扩到全量。全量跑之前先估算一下 token 消耗避免额度突然用完。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth跑脚本时最容易撞上的几类报错这里按现象、原因、解法列清楚。401 Unauthorized最常见。原因通常是 Key 没读到、Key 写错、或者.env没被加载。先检查os.getenv(TAOTOKEN_API_KEY)是否返回了值可以在脚本开头加一行print(os.getenv(TAOTOKEN_API_KEY)[:8])看前几位。如果返回None说明load_dotenv()没找到.env文件确认文件在脚本同级目录。如果 Key 有值但仍 401去控制台确认这个 Key 是否被删除或过期。local proxy failed / connection error这类报错通常和网络环境有关。先确认base_url拼写正确https://taotoken.net/api/v1不要漏掉/v1。如果本机设置了系统级网络配置可能会干扰请求建议在干净的网络环境下测试。另外检查是否误把base_url写成了带路径的完整接口地址SDK 会自动拼接/chat/completions你只需要给到/v1。reading choices 报错 / KeyError: choices说明返回体里没有choices字段通常是请求被拒绝或返回了错误结构。先打印完整resp看内容。常见原因是response_format设了json_object但 system 提示里没有 JSON 字样部分模型会直接返回错误。另一个原因是模型 ID 不存在接口返回了错误信息而不是正常补全结果。把model换成确认可用的 ID 再试。OAuth 相关报错如果你用 Claude Code 或类似工具可能会遇到 OAuth token 过期或未授权的提示。这类工具不走 API Key而是走 OAuth 流程。检查工具内的登录状态重新授权一次。如果你同时配了 API Key 和 OAuth确认工具当前用的是哪套鉴权方式避免混用。模型 ID 报错 model not found不同平台的模型 ID 命名不统一。去模型对话页面手动选一次模型发一条消息然后在请求记录里看实际用的 model 值。把它复制到脚本里不要凭记忆写。返回内容不是合法 JSON即使设了response_format模型偶尔也会在 JSON 前后加解释文字。脚本里用json.loads会直接抛异常。稳妥做法是先做一次清洗去掉首尾的非 JSON 字符或者用正则提取第一个{到最后一个}之间的内容。更简单的方式是在 system 提示里强调「只输出 JSON不要任何前后缀」。批量跑到一半中断可能是限流或单条超时。脚本里已经用try/except包住每条请求失败会记录 error 并继续。如果大面积失败把time.sleep调大或者减少单次批量条数分批次跑。排查顺序建议先跑单次验证脚本确认通道通再跑两条新闻的批量确认循环逻辑对最后扩到全量。每一步都看输出文件不要等全跑完才发现问题。6. 长期跑这条流水线把 Key 和模型管理固定下来流水线跑通一次不难难的是每天稳定跑。这里给几个实际维护建议。把新闻源列表和模型列表都外置成配置文件不要写死在脚本里。新闻源可以是一个sources.json模型列表放在.env或config.toml。这样调整时不用改代码逻辑降低出错概率。Key 的轮换要有预案。TaoToken 控制台可以创建多个 Key建议给不同用途分配不同 Key比如news-digest、coding-agent、test。某个 Key 出问题时只替换对应的环境变量不影响其他任务。如果要做长期编码或 Agent 类任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite它针对持续调用场景做了额度规划比按次调用更适合高频流水线。模型 ID 会更新建议每月检查一次。把候选模型在模型对话页面各跑一条固定新闻对比摘要质量决定是否切换默认模型。不要盲目追新稳定输出比偶尔惊艳更重要。日志要留。脚本每次运行把结果写入带日期的文件比如digest_20260702.json。这样回溯时能看到某天的摘要用了哪个模型、输出是什么。如果某天摘要质量突然下降翻日志就能定位是模型变了还是新闻源变了。最后接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里有完整的接口说明和参数列表遇到不确定的字段先去查文档比在脚本里反复试错快得多。整条流水线的核心就是三件套配置加一个循环把这两块固定下来后面换新闻源、换模型都是改配置的事。
返回列表