ARTICLE DETAIL

资讯详情

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

AI 资讯日报 2026年5月28日(星期四):用 TaoToken 统一 Key 跑通每日摘要流水线

AI 资讯日报 2026年5月28日(星期四):用 TaoToken 统一 Key 跑通每日摘要流水线 1. 从「手动整理日报」到一条能跑的流水线每天手动翻十几个信息源、复制粘贴、再让模型总结这件事我干过一阵子最大的问题不是累而是不可复现——今天记得抓这五个站明天漏了两个格式还每次都不一样。AI 资讯日报这种场景本质是「多来源抓取 → 清洗去重 → 模型摘要 → 按日期落盘/推送」四步只要把它固化成一条流水线每天到点自动产出你只需要扫一眼。这篇就围绕「AI 资讯日报 2026年5月28日星期四」这类每日摘要需求给出一套可复现的本地流水线用一份config.toml管信息源和运行参数用一份settings.json管模型通道和输出格式模型侧统一走 TaoToken 的 Key/API 通道避免每个模型单独配一套鉴权。适合谁想给自己或团队做每日 AI 简报的开发者、需要把摘要接进内部群或知识库的运营同学、以及想练手「抓取摘要」编排的初学者。整套东西不依赖特定框架Python 标准库加一个 HTTP 客户端就能跑重点是配置骨架和验证动作你照着改信息源即可。我试过把抓取和摘要拆成两个进程结果日期对不上、重复条目一堆后来统一成「一次运行产出一份带日期的 Markdown」问题就没了。下面按这个思路展开。2. TaoToken 前置统一 Key 与 API 通道流水线里最容易被忽略、又最容易出问题的是模型接入层。日报要摘要可能今天用这个模型、明天换那个如果每个都单独申请 Key、单独记 base_url配置会迅速失控。TaoToken 在这里的角色是「统一入口」一个 Key、一个 API 地址模型名作为参数切换配置里只维护一处鉴权。你需要先拿到 Key。登录官网后进入控制台在 API Keys 页面创建一个密钥复制保存好——它只在创建时完整显示一次。地址方面官网入口是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址是https://taotoken.net/api注意 API 地址不带查询参数。控制台和密钥管理分别在控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite注意Key 不要写进会提交到 Git 的文件。下面配置里我用环境变量占位运行时注入这是最省心的做法。如果你只是想先验证模型通不通可以直接用模型对话页面手动发一条消息确认返回正常再写进流水线模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite长期跑编码类或 Agent 类任务、需要更稳定的额度与并发可以看 Coding PlanCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite3. 可复制配置config.toml 与 settings.json 骨架配置分两层是有意的config.toml管「业务」——抓哪些源、日报标题模板、输出目录、时区settings.json管「通道」——API 基址、模型名、超时、重试。这样换模型不动业务加信息源不动通道。先看config.toml# config.toml —— 日报业务配置 [report] title_template AI 资讯日报 {date}{weekday} output_dir ./reports timezone Asia/Shanghai max_items_per_source 8 dedup true [sources] # 每个源name 用于日志url 为抓取地址enabled 控制开关 [[sources.list]] name official-blog url https://example.com/ai-blog/feed enabled true [[sources.list]] name dev-community url https://example.com/community/ai enabled true [[sources.list]] name release-notes url https://example.com/releases enabled false [summary] # 摘要风格与长度约束 style 要点式每条不超过 60 字 max_bullets 12 language zh再看settings.json模型通道集中在这里{ api: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 60, max_retries: 3 }, models: { summarizer: claude-sonnet-4, fallback: gemini-2.5-flash }, request: { temperature: 0.3, max_tokens: 2048 }, output: { format: markdown, filename_pattern: {date}-ai-daily.md } }关键点说明api_key_env指向环境变量名而不是明文 Key运行时用export TAOTOKEN_API_KEY你的Key注入base_url固定为https://taotoken.net/api不要在后面拼多余路径summarizer和fallback两个模型名主模型失败时自动降级日报不会因为单次抖动而中断。filename_pattern里的{date}会在运行时替换成2026-05-28这种格式保证每天一份、不覆盖。4. 抓取与摘要把四步串成一次运行有了配置主流程就是一个 Python 脚本。下面这段是骨架重点看它怎么读配置、怎么调模型、怎么按日期落盘。# daily_pipeline.py import os, json, tomllib, datetime, pathlib, urllib.request def load_config(): with open(config.toml, rb) as f: cfg tomllib.load(f) with open(settings.json, r, encodingutf-8) as f: st json.load(f) return cfg, st def fetch(url, timeout20): req urllib.request.Request(url, headers{User-Agent: daily-bot/1.0}) with urllib.request.urlopen(req, timeouttimeout) as r: return r.read().decode(utf-8, errorsignore) def summarize(text, st): key os.environ[st[api][api_key_env]] payload { model: st[models][summarizer], messages: [ {role: system, content: 你是资讯编辑输出要点式中文摘要。}, {role: user, content: text[:12000]}, ], temperature: st[request][temperature], max_tokens: st[request][max_tokens], } req urllib.request.Request( st[api][base_url] /v1/chat/completions, datajson.dumps(payload).encode(), headers{ Authorization: fBearer {key}, Content-Type: application/json, }, ) with urllib.request.urlopen(req, timeoutst[api][timeout_seconds]) as r: data json.loads(r.read().decode()) return data[choices][0][message][content] def run(): cfg, st load_config() today datetime.datetime.now().strftime(%Y-%m-%d) weekday [星期一,星期二,星期三,星期四,星期五,星期六,星期日][ datetime.datetime.now().weekday()] chunks [] for s in cfg[sources][list]: if not s[enabled]: continue try: raw fetch(s[url]) chunks.append(f## 来源{s[name]}\n{raw[:4000]}) except Exception as e: print(f[warn] {s[name]} 抓取失败: {e}) merged \n\n.join(chunks) digest summarize(merged, st) title cfg[report][title_template].format(datetoday, weekdayweekday) out_dir pathlib.Path(cfg[report][output_dir]) out_dir.mkdir(parentsTrue, exist_okTrue) fname st[output][filename_pattern].format(datetoday) (out_dir / fname).write_text(f# {title}\n\n{digest}\n, encodingutf-8) print(f[ok] 已生成 {out_dir / fname}) if __name__ __main__: run()几个设计取舍值得说抓取失败只打警告不中断保证日报「尽量有」而不是「全有才发」text[:12000]做了截断避免超长输入把 token 打满摘要请求走的是 OpenAI 兼容的/v1/chat/completions路径base_url后面拼这一截即可。如果你更习惯用现成 SDK把summarize换成对应客户端、base_url指向https://taotoken.net/api就行其余逻辑不变。5. 验证请求确认日报按日期自动生成配置写完别急着上定时任务先手动跑一次确认三件事模型通、文件生成、日期正确。第一步注入 Key 并运行export TAOTOKEN_API_KEY你的Key python daily_pipeline.py预期输出类似[warn] release-notes 抓取失败: HTTP Error 404 [ok] 已生成 reports/2026-05-28-ai-daily.md第二步检查文件内容与命名ls reports/ # 2026-05-28-ai-daily.md head -n 20 reports/2026-05-28-ai-daily.md你应该看到第一行是# AI 资讯日报 2026-05-28星期四下面是模型产出的要点式摘要。如果标题里的星期不对检查系统时区如果文件名日期不对检查filename_pattern里的{date}是否被正确替换。第三步单独验证模型通道是否真的走通绕开抓取逻辑curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:claude-sonnet-4,messages:[{role:user,content:用一句话说明今天日期}]}返回里能看到choices字段和内容就说明 Key 和通道都没问题。这一步能快速区分「是模型接入挂了」还是「是抓取源挂了」。第四步接定时。Linux 下用 cron每天早八点跑0 8 * * * cd /path/to/project /usr/bin/python3 daily_pipeline.py run.log 21到这里一条「按日期自动生成日报」的流水线就闭环了。6. 本篇常见错排查报 401 或鉴权失败九成是环境变量没生效。export只在当前 shell 有效cron 里不会继承。解决办法是在脚本里显式读取或在 crontab 顶部加一行TAOTOKEN_API_KEY你的Key。另外确认base_url是https://taotoken.net/api不要多写或少写斜杠。报 404分两种。抓取源 404 是信息源地址变了去config.toml里改url模型请求 404 通常是路径拼错确认是base_url /v1/chat/completions而不是/api/chat之类。摘要为空或截断输入太长被截断、或max_tokens太小。把text[:12000]调小、max_tokens调到 2048 以上试试。如果模型返回了内容但落盘为空检查choices[0].message.content的取值路径是否和实际返回结构一致。同一天生成多份、互相覆盖filename_pattern里必须带{date}且run()里用write_text覆盖写是预期行为——同一天重跑就更新当天那份不会产生副本。如果你想要保留历史版本把文件名加上时间戳即可。星期显示错误datetime.now()用的是系统时区服务器如果是 UTC早上八点跑出来的日期可能差一天。在脚本里显式设置时区或把 cron 时间按本地时区换算。抓取被限流给fetch加个time.sleep(1)或在config.toml里给每个源加独立的间隔参数。别一次性并发打十几个源容易被挡。排障时如果怀疑是接入层问题优先用第 5 节的 curl 单独验证模型通道确认通道没问题再回头查抓取和解析。接入相关的细节可以对照接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite需要新建或轮换 Key 时去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite。如果你打算把这条流水线扩展成每天自动跑编码任务或 Agent 工作流Coding Plan 会更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。
返回列表