Skip to content

feat(scheduler): QZone 日常发布多样性引擎 — 灵感种子 / 反重复 post-log / 多样性 tail / 发布抖动 (PR-B4)#155

Merged
sweetcornna merged 1 commit into
mainfrom
feat/qzone-diversity-engine
Jul 18, 2026
Merged

feat(scheduler): QZone 日常发布多样性引擎 — 灵感种子 / 反重复 post-log / 多样性 tail / 发布抖动 (PR-B4)#155
sweetcornna merged 1 commit into
mainfrom
feat/qzone-diversity-engine

Conversation

@sweetcornna

Copy link
Copy Markdown
Owner

目标

反死板改造主件(PR-B4):解决「QQ 空间日常说说不要每天都是那点东西」。基于最新 main(已含 #150 payload 转发的 audit text 字段 + #152 生活节奏信号)。

实现(主战场 scheduler/builtins/qzone_daily.py,每个成分 best-effort,失败即省略)

4a 灵感种子

  • 每次跑注入一次 persona_life_event_seed(kind=freeform) 抽取 → system prompt 加「## 今日灵感种子(至少换一个新切入点)」块。
  • lazy + try/except 的 server→agent import(dispatch_persona_life_event_seed),沿用 _life_signals / persona_life_advance 的先例;无存储 IO,便宜。

4b 反重复 post-log(新建轻量 sidecar)

  • 路径 <DATA_DIR>/qzone_post_log/<persona_id>.json;persona_id 过 slug 校验(防路径穿越,非法即跳过整个功能)。
  • Schema {version: 1, posts: [{ts, job, tid, qzone_url, text(截 500 字)}]},留最近 30 条,原子写(tmp .new + rename)。
  • 发布成功后追加一条(text 来自 audit dict,fix(scheduler): qzone 日常发布 tid/qzone_url 采集 — ToolResultEvent payload 转发 #150 提供);组 prompt 时读最近 N 条 → 「## 最近已发过的说说(禁止重复主题/场景/句式)」列正文摘录。
  • metadata 可选 recent_posts_n(1-14,默认 7)。
  • 有意不用 scheduler history(内存环、只有字符串)/ diary(模型可能不写)/ live feed(网络+鉴权依赖)。

4c 新 tail + 组装顺序

  • persona body → 生活块(含 feat(persona): 生活节奏信号 compute_life_signals — 外出逾期/同状态过久/在外过久三档 nudge #152 signals)→ 种子块(4a)→ 最近说说块(4b)→ 新 tail。
  • 新 tail:主题/场景/开头句式必须和最近任一条不同;种子至少换一个新切入点;出现 ⚠ 生活节奏提醒时优先并顺手 persona_life_set_state / persona_life_event_seed 推进 persona 状态。
  • metadata diversity(默认 true):false 时整体回退旧行为(无种子/最近说说块、旧 tail、post-log 也不写)。
  • 刻意用「生活节奏提醒」而非「生活节奏提示」以免与生活块 marker 撞串。

4d 发布时间抖动(默认关,runner 级)

  • runner.py::JobSpecjitter_secs: int = 0_run_job_loop 算完 wait_secs+= random.uniform(0, jitter_secs)(不做 builtin 级 sleep,避免卡住手动 trigger 的 HTTP 请求)。
  • _scheduler_lib.py:从 job metadata 的 jitter_minutes(0-180,非法忽略)换算 jitter_secs 传给 runtime_job_spec;不给 NewJobBody/EditJobBody/JobOut 加顶层字段(留给下个 PR)。

约束遵守

  • 不动 _harvest_envelope / _resolve_life_block 逻辑,仅在组装处衔接。
  • server→agent 新 import 一律 lazy + try/except;builtin 永不抛异常;新 metadata 字段可选带默认(渠道 duck-typed 契约教训)。

测试

  • post-log:写入/读回 round-trip、30 条封顶、text 截 500、坏 slug 跳过、无 data dir no-op、原子写无残留 .new
  • recent-posts 块:列摘录、honor N、空时 None。
  • 组装:diversity on 含种子块+最近说说块+反重复要求行且顺序正确;diversity off 三块全省略且不写 post-log;tail 全文要求。
  • jitter:JobSpec.jitter_secs 采样落在 [0, jitter_secs](patch random.uniform)+ 0 时不调用;jitter_minutes 非法值(负/超 180/非数字/None/bool)被忽略。

验证

  • ruff check(改动文件):clean(models.py 的 I001 是 main 上已存在的问题,非本 PR)
  • mypy python/packages/:Success(609 files)
  • lint-imports:2 kept / 0 broken
  • pytest tests/scheduler/ tests/test_admin_scheduler_qzone.py:152 passed

反死板改造主件(PR-B4):让 QQ 空间日常「说说」不再每天都是那点东西。

- 4a 灵感种子:每次跑注入一次 persona_life_event_seed(kind=freeform)
  抽取结果为「## 今日灵感种子」块;lazy+try/except 的 server→agent import,
  失败即省略(无存储 IO,便宜)。
- 4b 反重复 post-log:新建轻量 sidecar
  <DATA_DIR>/qzone_post_log/<persona_id>.json(slug 校验防穿越、原子写、
  留最近 30 条、text 截 500 字)。发布成功后追加一条;组 prompt 时读最近 N
  条列为「## 最近已发过的说说(禁止重复主题/场景/句式)」。metadata 可选
  recent_posts_n(1-14,默认 7)。有意不用 scheduler history/diary/live feed。
- 4c 多样性 tail + 组装顺序:persona body → 生活块 → 种子块 → 最近说说块 →
  新 tail(主题/场景/句式必须不同、至少换一个新切入点、⚠ 生活节奏提醒优先并
  用 persona_life_set_state/event_seed 推进)。metadata diversity(默认 true)
  为 false 时整体回退旧行为,post-log 也不写。
- 4d 发布时间抖动(默认关,runner 级):JobSpec.jitter_secs +
  _run_job_loop 算完 wait_secs 后 += random.uniform(0, jitter_secs);
  _scheduler_lib 从 job metadata 的 jitter_minutes(0-180,非法忽略)换算,
  不给 NewJobBody/EditJobBody/JobOut 加顶层字段。

不改 _harvest_envelope / _resolve_life_block 逻辑,仅在组装处衔接。所有新
metadata 字段可选带默认;server→agent import 一律 lazy + try/except;builtin
永不抛异常。mypy strict + ruff + import-linter 全绿。
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions github-actions Bot added codex:needs-review A Codex review is needed for the current PR head. codex:review-requested A Codex review was requested or should be running automatically. status: 🔁 re-review loop A fresh Codex review was requested after the latest change or comment. codex:reviewed Codex posted a review result or thumbs-up after the latest request. status: 👀 ready for maintainer look No automation blocker is known; a maintainer should inspect the current result. and removed codex:review-requested A Codex review was requested or should be running automatically. codex:needs-review A Codex review is needed for the current PR head. status: 🔁 re-review loop A fresh Codex review was requested after the latest change or comment. labels Jul 18, 2026
@sweetcornna
sweetcornna merged commit fe7b158 into main Jul 18, 2026
8 of 9 checks passed
@sweetcornna
sweetcornna deleted the feat/qzone-diversity-engine branch July 18, 2026 17:58
@github-actions github-actions Bot added the status: ✅ merge-ready Evidence and review are clear; normal merge gates may proceed. label Jul 18, 2026
sweetcornna added a commit that referenced this pull request Jul 18, 2026
…r_minutes 全链路 (#157)

NewJobBody/EditJobBody/JobOut 新增可选顶层字段 image_ref_labels / jitter_minutes;
_compose_metadata 用显式赋值让顶层字段权威覆盖 metadata 旧值(None 时不覆盖);
_validate_qzone_daily 校验 label 形状([a-z0-9_-]{1,64})+数量≤8、jitter 0-180 → 422;
JobOut 从 metadata 读回回显;PATCH 合并透传,jitter 变更经 _apply_enabled_state
重建 runner loop 的 jitter_secs(复用 #155 _jitter_secs_from_metadata)。

builtin 组 system prompt 时读 image_ref_labels,在普通/多样性两种 tail 后追加
参考图指令段(best-effort,形状不对即省略,永不抛)。

上传通道复用现有 persona-asset 路由(kind=reference),调度侧只存 label 字符串。

Co-authored-by: Cornna <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codex:reviewed Codex posted a review result or thumbs-up after the latest request. status: ✅ merge-ready Evidence and review are clear; normal merge gates may proceed. status: 👀 ready for maintainer look No automation blocker is known; a maintainer should inspect the current result.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant