可视化 Moment 发布助手
告别繁琐的终端交互,Moment 发布迎来了可视化 Web 升级。
本次开发引入了一个 24 小时运行的本地 Web 服务,结合 LLM 辅助发贴能力,让你随时通过浏览器发布高质量moment。
✨ 核心功能
- 24/7 本地服务: 基于 FastAPI + Uvicorn,开机自启,崩溃自动重启。
- LLM 智能辅助: 自动学习最近 3 条历史风格,生成 3 种不同风格的文案选项。
- 现代化 Web UI: Tailwind CSS 构建,支持表单输入、选项预览、一键发布。
- 容错解析引擎: 针对 LLM 输出不稳定的问题,实现了多层 JSON 解析与正则兜底策略。
🛠️ 开发步骤详解
1. FastAPI 后端架构
创建 scripts/server.py,提供完整的 RESTful API:
POST /api/generate: 接收用户诉求,调用 Ollama 生成选项。POST /api/publish: 将选中的内容保存为 Hugo 兼容的 Markdown 文件。GET /api/recent-moments: 获取历史记录,用于构建 Few-Shot 上下文。
2. Tailwind CSS 前端界面
编写 scripts/templates/index.html,实现单页应用体验:
- 表单区: 标题、图片链接、地点、心情、核心诉求输入。
- 选项展示: 动态渲染 LLM 生成的卡片,点击即可选中。
- 预览与发布: 选中后展示最终内容预览,确认后提交后端保存。
- 状态反馈: 完善的 Loading 动画、成功提示与错误拦截。
3. 攻克 LLM JSON 解析难题
模型经常返回非标准 JSON(如单引号、Markdown 代码块包裹、内容中含未转义引号)。为此实现了三层解析策略:
- 标准解析: 尝试
json.loads。 - 容错修复: 替换单引号为双引号后重试。
- Regex 兜底: 使用正则表达式直接提取
id,label,content字段,确保极端情况下也能成功解析。
4. Python 3.14 兼容性修复
在 Python 3.14 环境下,Jinja2Templates 出现 TypeError。通过将模板渲染改为 FileResponse 直接返回静态 HTML,彻底解决了依赖冲突,同时保持了前后端分离的简洁性。
5. macOS Launchd 守护进程
配置 cn.amebob.moment-server.plist 实现系统级管理:
RunAtLoad: 登录即启动服务。KeepAlive: 进程意外退出时自动拉起。- 环境隔离: 注入
NO_PROXY等变量,确保直连本地 Ollama 服务。
🚀 使用指南
- 访问服务: 打开浏览器访问
http://localhost:8765。 - 输入诉求: 填写标题、图片、地点等信息,核心是输入你的灵感或草稿。
- 生成与选择: 点击“生成选项”,AI 会提供 3 个不同风格的文案,点击满意的一项。
- 一键发布: 预览无误后点击“确认发布”,Moment 即刻生成到博客目录。
服务已在后台静默运行,无需手动开启终端,随时打开网页即可创作。
实际效果

