可视化 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 代码块包裹、内容中含未转义引号)。为此实现了三层解析策略

  1. 标准解析: 尝试 json.loads
  2. 容错修复: 替换单引号为双引号后重试。
  3. 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 服务。

🚀 使用指南

  1. 访问服务: 打开浏览器访问 http://localhost:8765
  2. 输入诉求: 填写标题、图片、地点等信息,核心是输入你的灵感或草稿。
  3. 生成与选择: 点击“生成选项”,AI 会提供 3 个不同风格的文案,点击满意的一项。
  4. 一键发布: 预览无误后点击“确认发布”,Moment 即刻生成到博客目录。

服务已在后台静默运行,无需手动开启终端,随时打开网页即可创作。

实际效果