拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
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_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite),创建一个新的 Key。建议按用途命名,比如news-digest,方便后面排查是哪个脚本在调用。创建后立即复制保存,页面刷新后不会再完整显示。

Base URL:TaoToken 的 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_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite)先手动发一条消息,确认模型可用,然后在请求日志或文档里找到对应的 model 字段值。建议把候选模型 ID 写进一个列表,后面脚本会遍历这个列表。

环境变量配置建议放在项目根目录的.env文件里,不要硬编码在脚本中。这样换 Key 或换模型时只改一处:

# .env TAOTOKEN_API_KEY=sk-你的实际Key TAOTOKEN_BASE_URL=https://taotoken.net/api/v1 TAOTOKEN_MODEL_LIST=gpt-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_key=os.getenv("TAOTOKEN_API_KEY"), base_url=os.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(path="news.json"): with open(path, "r", encoding="utf-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( model=model, messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_content}, ], temperature=0.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", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2) 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

然后在脚本里用tomllib(Python 3.11+)读取。这样配置和代码分离,改提示词不用动脚本。

4. 验证请求与成功结果:固定样例对比输出一致性

配置写完后,先别急着跑全量。用一条固定新闻做单次请求,确认通道通了、返回格式对。这一步能帮你快速定位是 Key 问题、模型 ID 问题还是请求体问题。

单次验证脚本:

# verify_one.py import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client = OpenAI( api_key=os.getenv("TAOTOKEN_API_KEY"), base_url=os.getenv("TAOTOKEN_BASE_URL"), ) resp = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "输出 JSON,字段 title、summary。只输出 JSON。"}, {"role": "user", "content": "标题:OpenAI 预览 GPT-5.6 Sol。生成摘要。"}, ], temperature=0.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 Plan(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite),它针对持续调用场景做了额度规划,比按次调用更适合高频流水线。

模型 ID 会更新,建议每月检查一次。把候选模型在模型对话页面各跑一条固定新闻,对比摘要质量,决定是否切换默认模型。不要盲目追新,稳定输出比偶尔惊艳更重要。

日志要留。脚本每次运行把结果写入带日期的文件,比如digest_20260702.json。这样回溯时能看到某天的摘要用了哪个模型、输出是什么。如果某天摘要质量突然下降,翻日志就能定位是模型变了还是新闻源变了。

最后,接入文档(https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite)里有完整的接口说明和参数列表,遇到不确定的字段先去查文档,比在脚本里反复试错快得多。整条流水线的核心就是三件套配置加一个循环,把这两块固定下来,后面换新闻源、换模型都是改配置的事。

返回列表