dayreel
DeepSeek Harness (dsh) 社区插件:把你一天流经 dsh 的工作轨迹,做成一份设计感日报 + 一段带旁白的总结视频。全 TypeScript/Node 栈,无 Python 依赖。
dsh plugin add github:peikuo/dayreel
装好后在 Web UI 里说「生成今天的日报」即可,详细步骤见安装。按 Harness 的组合包(bundle)规范分发(dsh plugin add github:peikuo/dayreel# 可锁定版本)。
组成
- 两个 runtime skill:
dayreel-content:调工具收集跨会话事实,写内容文档(工作主线 IR + 当日元数据),并从中确定性渲染出 HTML/Markdown 日报dayreel-render:把内容文档确定性投影成 typed 场景,渲染成 mp4,并持续播报进度
- 模型工具:
- 读日志:
fetch_today_recap(跨 workspace 当日会话摘要,含按各会话实际模型的费用估算)、fetch_session_detail(单会话按日钻取) - 产出:
dayreel_report(日报 HTML+MD,支持force修订重生成)、dayreel_render(异步启动视频渲染)、dayreel_status(轮询进度,完成后返回可播放 URL)
- 读日志:
数据来源分两层:默认读折叠表层(compaction 后的会话摘要,便宜);当摘要缺细节时按需钻取单会话。会话摘要方案只覆盖今天与昨天——更早的日期属于日志深挖(Tier 2:时间切片→子代理生成 IR→汇总),数据量和成本都很大,未实现;请求更早的日期会被工具直接拒绝。渲染产物通过同一 webServer 以 /dayreel/* 路由提供(Range 支持,可拖动进度条)。
GUI 内嵌播放器:客户端半区(随本 bundle 一起加载)为 dayreel_status 工具注册了内嵌 <video> 播放器卡片,渲染完成后视频直接出现在工具调用行里,无需复制 URL。
安装(bundle 方式)
# 本地路径安装(add 时 pnpm 会运行 prepare,构建 lib/)
dsh plugin --profile demo add ./dayreel
# 从 GitHub 安装(需要构建授权,见下)
dsh plugin --profile demo add github:peikuo/dayreel
首次使用会初始化 profile(@deepseek-ai/dsh-base 作为第一个组合包)。验证层再启动:
dsh --profile demo --dump-config # 应看到 "# == dayreel" 层
dsh --profile demo
从 GitHub 安装的构建授权
git 安装拉取的是源码,pnpm ≥10 默认拒绝运行 prepare。第一次 add 失败时,把 pnpm 打印的包键加进该 profile 的 pnpm-workspace.yaml:
allowBuilds:
dayreel: true
然后重新 add。只对源码可信的包授权,并锁定 commit(github:peikuo/dayreel#<sha>)。
省成本:生成模型选路与记忆
日报的撰写/渲染不需要旗舰模型。dayreel_author 工具由插件执行选路(不依赖模型自觉),菜单就是你环境里配置的 LLM 目录——运行时经 ctx.llm 枚举(listProviders × listModels,与 Web 模型选择器同源),dayreel 不维护任何路由副本,你增删模型无需改插件配置。插件侧只有两个引用型可选项:
- id: dayreel
name: dayreel
config:
fork: true # 可选:用 fork 后端(继承当前对话上下文);默认 spawn
defaultModel: deepseek-v4-flash # 可选:model id 或 provider/model,排菜单首位+无交互时兜底
选路规则:用户口头点名 → agent 参数(模型 id 或 provider/model,支持唯一前缀)直接路由;有记住的偏好 → 直接用,零打断;目录里只有一个模型 → 直接用,零打断;否则弹窗两问(选哪个模型 + 是否记住)。选"记住"后偏好写在插件输出目录的 preferences.json(存 {provider, model} 对;删掉该文件即遗忘)。headless/无交互服务时不弹窗,直接用 defaultModel(缺省用目录第一项)并在结果里注明。目录里已不存在的过期偏好会被忽略并重新询问。
fork: true 时子代理继承当前对话的完整历史(截至上一个完整 turn);spawn 则靠任务内嵌指引 + 自己调 fetch_today_recap 收集。两种 in-process 子代理共享本进程组合,都能调用 dayreel 的读取工具。注意:跨模型前缀缓存不会命中,fork 重放历史按目标模型空闲价计费;外部 CLI 子代理(codex 等)调不了这些工具,不做生成后端。GLM 等 OpenAI 兼容路由按 llm-pi-ai 的接法配好后会自动出现在菜单里。
使用
在 GUI 里对模型说:「生成今天的总结视频」。预期流程:
- 模型加载
dayreel-contentskill → 调fetch_today_recap拿跨会话当日摘要(当前对话自动排除)→ 需要细节时按需fetch_session_detail→ 写内容文档 →dayreel_report出日报(修订/换风格传force: true) - 用户要看视频 → 模型加载
dayreel-renderskill →dayreel_render(插件把内容文档确定性投影成场景) - 模型循环调用
dayreel_status播报进度(旁白 i/n → Remotion %),直到完成 - 完成后模型给出可播放 URL(
http://127.0.0.1:<port>/dayreel/<日期>/<序号>/recap.mp4)和本地路径 - 用户看完后的反馈(对话中回复)会被插件被动记录到
output/feedback/<jobId>.jsonl,并据此进入修订模式(force: true重生成)
依赖
| 依赖 | 用途 | 说明 |
|---|---|---|
| msedge-tts | 旁白 TTS(纯 Node,微软 Edge 语音,免费免 key) | 包自带依赖,pnpm install |
| Remotion + ffmpeg | 渲染视频 | cd remotion && pnpm install(ffmpeg 需在 PATH) |
assets/bgm/的背景音乐由 AI(Gemini)生成,项目持有使用与分发权利,随 bundle 一并提供。
remotion/渲染子项目的依赖不会随 bundle 安装;在已安装的 checkout 里首次渲染前,需手动cd remotion && pnpm install。
开发
pnpm install # 安装构建依赖(esbuild)
pnpm run build # esbuild 打包 src/ → lib/index.js(prepare 也会做)
快速迭代可直接用 --patch 加载 TS 入口(harness 源码环境支持):
pnpm dsh web --patch /abs/path/to/dayreel/src/index.ts
演示(占位数据)
不读任何真实会话,用一份**显式标注「演示占位」**的示例内容文档走完渲染链路(铁律 1/1.5:演示数据必须标注,不得冒充真实日报):
pnpm run build
pnpm demo # 三套版式日报各出一份,打印路径
pnpm demo report newspaper # 单出指定版式
pnpm demo video # 渲染演示视频(需 cd remotion && pnpm install,ffmpeg 在 PATH;TTS 走网络)
示例文档在 src/demo-doc.ts:标题与摘要带【演示占位】标注,日期固定 2000-01-01(产物与真实日报天然分目录),test/demo-doc.spec.ts 守卫标注不被移除。
输出示例
产物根目录:已安装进 DSH profile 时为 $DSH_HOME/dayreel/(dsh 启动时设置该环境变量);源码 checkout / 演示运行为包内 output/(gitignored,已设 DSH_HOME 时除外):
output/
2026-08-17/
01/
progress.json ← dayreel_status 轮询的进度文件
audio/scene-0.mp3 ← 每段旁白的 TTS 音频
props.json ← Remotion 渲染参数
recap.mp4 ← 成品视频(经 /dayreel/* 提供)
No comments yet. Be the first to write one.