每日故事
根据金山词霸每日一句,调用 7+ AI 模型并行生成故事,Markdown 保存,VitePress 展示。
00 · 展示
站点一览
从首页到故事正文,再到词云分析,一步步感受每日故事的魅力。
01 · 特性
核心能力
-
多模型并行各有所长,同题异构
ThreadPoolExecutor 同时调用 7+ AI 模型生成故事,DeepSeek、智谱、Kimi、豆包、通义千问、Gemini 等各展所长,同一句每日一句产出风格各异的故事。
-
插件式配置即插即用,不改核心
每个模型一个
_config.py文件,导出 6 个标准化符号(API_KEY、CLIENT_PARAMS、CHAT_PARAMS、PREPROCESSORS、POSTPROCESSORS、POSTPROCESSOR_FILES)即可注册,无需修改任何核心代码。 -
惰性加载导入即静,按需请求
import 时不发起任何 HTTP 请求。金山词霸每日句和网络搜索结果通过
_shared.py惰性获取,只在首次使用时加载,避免导入时的网络等待。 -
流水线架构预处理 · 对话 · 后处理 · 持久化
PREPROCESSORS → Chat API → POSTPROCESSORS → 文件持久化,每个环节可独立插拔。纯函数式链保证了可测试性和可组合性。
-
词云洞察从故事中发现主题脉络
每周自动对全量故事做分词、词频统计,生成词云图 + 分析报告。从视觉上感知故事的主题变迁和趋势演化。
-
自动运维零人工介入,持续运转
GitHub Actions 每日 23:00 UTC 自动运行,Cloudflare Pages 自动构建部署。超大日志自动归档,全链路无需人工干预。
02 · 原则
设计哲学
-
01
简单稳定 优先选择简单、成熟、易维护的实现。不引入不必要的依赖,不做过度设计。复杂度不是价值,可维护性才是。
-
02
零侵入扩展 新增一个 AI 模型只需一个文件,不改一行核心代码。ModelRegistry 自动发现,流水线自动编排,真正即插即用。
-
03
纯函数式 全局无 class(Registry 例外),无副作用链。处理器是纯函数,流水线是函数组合。可测试、可追溯、可推理。
-
04
全链路可观测 JSON Lines 日志追加写入,元数据追踪每次 API 调用的模型、耗时、token 消耗。兼容旧 JSON 数组格式,O(1) 持久化。
-
05
零配置开发体验
pip install -r requirements.txt+ 填写.env+python main.py三步上手。没有 Docker 依赖,没有复杂的编排。 -
06
自动化优先 定时触发 · 自动生成 · 自动归档 · 自动部署。GitHub Actions 每日运行,Cloudflare Pages 实时上线。项目常年无人值守运转。
03 · 关于
项目哲学
everyday 始于一个简单的想法:让 AI 为每一天写一个故事。 金山词霸的每日一句是灵感种子,7 个不同的 AI 模型是七种不同的叙事眼睛。 同一个句子,在 DeepSeek 笔下是余华般的冷峻,在 Kimi 那里是刘慈欣式的宏大, 在智谱和豆包那里又各有各的温度。我们不挑模型阵营,不做独家绑定—— 只要模型开口说话,我们就让它讲故事。 2,700 篇故事之后,这个项目活成了它自己的样子:一个每天自动运转的 AI 故事工厂, 零人工介入,却从未间断。
04 · 常见问题
FAQ
- 如何快速上手?
- 克隆仓库,创建
conda环境,安装依赖,复制.env.example为.env并填入 API 密钥,然后运行python main.py。详见项目 README 的「快速开始」。 - 如何添加新的 AI 模型?
- 在
.env中添加API_KEY_XXX,创建model_configs/xxx_config.py并导出 6 个标准化符号,ModelRegistry 会自动发现并注册。无需修改 core 目录的任何文件。 - 生成的故事存储在哪里?
- 以 Markdown 格式保存在
story/故事/目录下,按日期嵌套(年/月/日)。story/index.md为 VitePress 首页,由save_to_md_file自动更新链接。 - 如何本地预览站点?
- 在项目根目录运行
npm install && npm run docs:dev,VitePress 开发服务器会启动并实时预览。所有故事内容、词云报告均可本地访问。 - 代码质量如何保证?
- 使用
ruff做代码检查,pytest运行单元测试。chat_ai()有指数退避重试逻辑,image_utils.py有内存缓存避免重复下载。Markdown 文件写入使用原子os.replace()防止半写。
更多问题?欢迎在 GitHub Issues 提出。