Skip to content

Commit cdb7d17

Browse files
wehosHongzhi Wenclaude
authored
feat(proactive): A/B 改测屏幕分享来源默认值 + 情境弹窗 + 娱乐 witty 语气 (Project-N-E-K-O#1513)
* feat(proactive): A/B 改测屏幕分享来源默认值 + 情境弹窗 + 娱乐 witty 语气 下线隐私默认值实验(v1/v2),改测「主动搭话里的屏幕分享来源」默认值: - token_tracker cohort 池 → ("main", "vision_chat_default_off");老落盘值走 现有严格校验重抽机制,只改 telemetry 标签。 - 前端 A/B 覆写从「翻隐私」改成把 proactiveVisionChatEnabled 默认翻成关; 隐私模式默认值不动(仍按地区分流),海外默认隐私开 → 对本实验天然 no-op。 实验组(仅)新增情境弹窗:活动 tracker 20s 心跳检测「进游戏/娱乐」「进专注 工作」一次性事件,经 WebSocket 推前端;前端每会话每类弹一次—— - 进游戏/看番 → 问要不要开启屏幕分享搭话; - 进专注工作 → 问要不要关掉屏幕分享避嫌(不动搭话频率,尊重用户原设定)。 检测挂在独立心跳上,隐私开时自动跳过;主动搭话默认关时由 start_session 仅为 实验组拉起心跳,控制组零额外开销。 娱乐语气补全:casual_browsing 此前与休闲游戏共用通用 playful,现拆出专属 witty(吐槽向,3 角度 ×7 语言)+「没梗就回 [PASS]」质量闸,idle 仍 playful。 i18n 补全 8 个前端 locale 的弹窗文案。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): branch 未决议时暂存情境事件待重放 + witty 质量闸回归测试 - app-context-prompt.js:branch 未决议(telemetryBranch 还没回来)时收到的 activity_context_prompt 先暂存,等 neko:telemetry-branch-resolved 再重放,避免 后端一次性「进入态」推送在分支 GET 慢时被静默丢掉、实验组漏弹窗。GET 失败则永 不重放,fail-closed。 - 补 witty 质量闸渲染回归测试(5 语言断言 [PASS] 指令出现 + 非 witty 不渲染)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 情境弹窗暂存改为按类别缓存,避免决议前 play/work 互相覆盖 单槽 _pendingContext 在 branch 决议前先后收到 play + work 时只会留最后一个、 另一类被吞,与「每会话每类一次」语义不一致。改用 Set 按类别暂存,决议后逐类 重放。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(proactive): witty 质量闸渲染测试补 es/pt(断言回退 en 后仍有 [PASS]) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 情境弹窗暂存重放改为串行 await,避免第二个弹窗被 _promptOpen 吞掉 分支决议前缓存了 play + work 两类时,原 forEach(handle) 并发触发:第一个 handle 开窗置 _promptOpen=true 并在 modal 上挂起,第二个 handle 撞 _promptOpen 早退、且 _pendingContexts 已 clear,导致该类弹窗本会话永久丢失。改为 for-await 串行重放, 第二个弹窗等第一个关掉再弹。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 弹窗开着时到来的另一类 context 也暂存重放,别直接丢 handle() 在 _promptOpen=true 时原本直接 return,丢掉这次信号且不再重试——用户开着 play 弹窗时切到工作,work 信号就永久丢了。改为暂存进 _pendingContexts,当前弹窗 关掉后在 finally 里 _drainPending 串行重放。与「分支未决议」暂存复用同一 Set + 同一 串行 drain;同类重复入 Set 去重、重放时 _shownX 再拦一道。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(proactive): 控制组后端不推情境信号 + playful 改得更好接话 - 控制组(main)零回退:后端推送回调再加一道 branch gate,非实验组压根不推 activity_context_prompt(前端 _isExperimentBranch 是第二道闸)。活动 loop 在 「主动搭话已开」的 main 用户上也会跑,所以这道后端 gate 必要。 - playful 语气调整(7 语言):留钩子 / 问一句能答的小问题 / 递个好接的话头,替掉 原来「自说自话抖段子」那条容易把天聊死的角度。改动克制,保持 playful 基调。 - _drainPending 的异步重放加 .catch,防 unhandled rejection(CodeRabbit nitpick)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 隐私模式开时不 kick 活动 tracker + branch 事件挪到设置合并后广播 - [P1] _maybe_kick_activity_loop_for_experiment 在隐私模式开(vision 关)时直接早退: get_snapshot 会起 SystemSignalCollector 采集窗口/进程信号、绕过隐私模式(loop 只 跳过 LLM、collector 仍采)。privacy-on 的实验组本就 no-op,不 kick 即可。 - [P2] neko:telemetry-branch-resolved 从「拿到 branch 立即广播」挪到 A/B 覆写 + server merge + saveSettings 全部落定之后。否则被缓存的 context 重放时 _isActionable 读到覆写前的旧 proactiveVisionChatEnabled,误判该不该弹。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 重放暂存 context 按单个隔离异常,别一个抛错吞掉整批 外层 .catch 改成 for 循环内逐个 try/catch:play/work 是一次性事件,前一个 handle 意外抛错不能连累后一个不被消费(CodeRabbit)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): playful 第三角度合并「跳脱联想」+「留话头」 保留原本不错的「跳脱联想」(随性段子/天马行空联想),再叠加「落在对方好接的话头 上、别抖完就冷场」,而不是二选一。7 语言同步。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 主动搭话关时活动 loop 跳过 activity_guess LLM,消除实验组成本回归 实验组为情境弹窗 kick 起活动 loop 后,即便用户没开主动搭话,loop 也会照常算 activity_guess 的 emotion-tier LLM 叙述——而那叙述只喂 proactive Phase 2、没消费方, 纯浪费(Codex P1)。在 loop 里、_tick_break_reminders + 情境弹窗 drain(纯规则、检测 照常)之后加一道 _proactive_chat_enabled() 闸:主动搭话关就 continue,跳过 LLM 部分。 proactive 真在跑时设置里 proactiveChatEnabled 必为 True,不误伤;fail-open。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): _proactive_chat_enabled key 缺失也 fail-open(默认 True) key 缺失原本返回 False、和 fail-open 注释自相矛盾。改成默认 True:误判「关」会吞掉 proactive-on 用户的活动叙述(伤可见功能),误判「开」只是小成本。明确关主动搭话的 用户 key=false 照样 skip,成本修复对主流场景不变(CodeRabbit)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 情境弹窗用独立基线 + session 开始时清,修跨 session 漏弹 tracker 跨 session 长存,_last_known_state 会带过来:上个 session 结束时在游戏、新 session 仍在游戏,state != prev_known 不成立 → 检测不到「进入」、本会话漏弹(Codex P2)。改用 _context_prompt_last_state 专属基线(与 break/anti-slack 的 _last_known_state 隔离),新增 reset_context_prompt_baseline(),在实验组 session kick 里清一次,让当前 状态重新算作「进入」。补回归测试。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 重置情境弹窗基线时一并清 pending,避免跨 session 推过期弹窗 reset_context_prompt_baseline 之前只清基线,没清 _context_prompt_pending:上个 session 置了 pending 但没 drain 就 end_session 时,残留会被新 session 首个 tick 推成过期弹窗 (CodeRabbit)。一并清掉,紧跟的 kick get_snapshot 会按新 session 当前状态重置。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(proactive): 口吻紧贴「决策方式」段,提升被遵循度 之前 {state_section}(含口吻)在 prompt 顶部、和底部决策段隔着对话历史+一堆素材, 口吻容易被冲淡。两步调整让口吻挨着决策规则: - snapshot 格式化:口吻菜单 + 质量闸改到状态块**最末**渲染(在 reasons/scores/叙述/ 未收尾话题之后),紧贴 ======以上为活动状态======。 - prompts_proactive 7 个 generate 模板:{state_section} 整体从 inner_thoughts 后挪到 meme_section 后、紧贴 ======以下为...决策方式======。 于是渲染顺序变成 …叙述/开放话题 → 口吻 → 质量闸 →(活动状态块结束)→ 决策方式段, 口吻就在 AI 决定怎么说时的眼前。对两组一致(非 A/B 变量)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(proactive): 离开目标状态时清掉过期情境 pending,避免推过期弹窗 pending 可能由 get_snapshot 路径(实验组 kick)置、还没等 loop drain,用户就从 游戏/工作切到 idle/away 等非目标态;之前的检测块只在进 gaming/casual_browsing/ focused_work 时 overwrite,离开时不动 pending → loop 会把已离开的场景推成过期弹窗、 甚至据此翻错设置(Codex P2)。在检测块加:state 不属于目标态就清 pending。目标态 之间切换仍由 overwrite 处理。补回归测试。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Hongzhi Wen <cartabio.coder1@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7831326 commit cdb7d17

19 files changed

Lines changed: 843 additions & 122 deletions

config/prompts/prompts_activity.py

Lines changed: 97 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -555,9 +555,14 @@
555555
"剧情共情:对正在发生的剧情走向或角色处境投入情绪反应",
556556
],
557557
"playful": [
558-
"打趣逗弄:对用户当下正在做的事皮一下,戳到笑点但别戳到痛点",
559-
"装傻好奇:对眼前的东西装作没看懂,问东问西",
560-
"跳脱联想:从屏幕内容随性抛个段子或天马行空的联想",
558+
"打趣逗弄:对用户当下正在做的事皮一下,戳笑点别戳痛点,留个让对方想回嘴的小钩子",
559+
"装傻好奇:对眼前的东西装作没看懂,问一个对方一句话就能接上的小问题",
560+
"跳脱联想:从屏幕内容随性抛个段子或天马行空的联想,但落在一个对方能顺势接的话头上,别抖完就冷场",
561+
],
562+
"witty": [
563+
"实时吐槽:对正在看的剧情/人物/梗即时吐槽,抓住可乐的点,毒舌但不下作",
564+
"共享笑点:和用户一起对画面里的名场面/沙雕瞬间起哄,把好笑的地方点破",
565+
"反差解读:用一个意想不到的角度重新解读眼前的内容,制造反差笑感",
561566
],
562567
"warm": [
563568
"共鸣回应:基于用户刚说的内容接一句,让对方明确感到自己被听见了",
@@ -587,9 +592,14 @@
587592
"plot empathy: invest emotion in the storyline beat or the character's situation as it unfolds",
588593
],
589594
"playful": [
590-
"tease the moment: poke fun at whatever they are doing right now, find the joke without the bruise",
591-
"play dumb out of curiosity: pretend not to get what is on screen, ask around it",
592-
"tangent association: jump off the screen content into a random gag or weird connection",
595+
"tease the moment: poke fun at what they're doing, no bruise — and leave a hook they'll want to fire back at",
596+
"play dumb out of curiosity: pretend not to get what's on screen, ask one small question they can answer in a breath",
597+
"tangent association: riff off the screen into a random gag or a wild connection — but land it on a hook they can run with, not a gag that dies on its own",
598+
],
599+
"witty": [
600+
"live riff: react to the plot / character / meme on screen right now, catch the funny beat, sharp-tongued but never cheap",
601+
"shared laugh: cheer on the iconic / absurd moment with them, name out loud what makes it funny",
602+
"contrast read: re-read what is on screen from an unexpected angle to land a surprise laugh",
593603
],
594604
"warm": [
595605
"resonant response: react to what they actually just said, with the felt sense of being heard",
@@ -619,9 +629,14 @@
619629
"ストーリーに感情を:今展開している筋やキャラの状況に気持ちを乗せる",
620630
],
621631
"playful": [
622-
"今この瞬間をいじる:相手が今やってることをちょっと茶化す、笑い所を突くけど痛くしない",
623-
"とぼけて好奇心:画面のことを分からないふりして聞き回る",
624-
"脱線連想:画面の内容から離れてふいに小ネタや変な連想を投げる",
632+
"今この瞬間をいじる:相手のやってることをちょっと茶化す、痛くせず、思わず言い返したくなる隙を残す",
633+
"とぼけて好奇心:画面のことを分からないふりして、一言で答えられる小さな質問をする",
634+
"脱線連想:画面の内容から小ネタや突飛な連想を投げる、ただしオチだけで終わらせず、相手が乗っかれる話の振りで締める",
635+
],
636+
"witty": [
637+
"リアタイ突っ込み:今観ている展開/キャラ/ネタに即ツッコミ、笑える所を突く、毒舌でも下品にしない",
638+
"笑いの共有:画面の名場面/アホな瞬間を一緒にはやし立て、何が面白いか言語化する",
639+
"逆張り解釈:目の前の内容を予想外の角度で読み替えて、ギャップの笑いを作る",
625640
],
626641
"warm": [
627642
"共鳴のある返し:相手が今言ったことを受け止めて、聞いていると伝わるように返す",
@@ -651,9 +666,14 @@
651666
"스토리 공감: 지금 펼쳐지는 전개나 캐릭터의 처지에 감정을 싣기",
652667
],
653668
"playful": [
654-
"지금 이 순간을 깐죽이기: 상대가 지금 하는 걸 살짝 놀리기, 웃음 포인트만 콕",
655-
"모른 척 호기심: 화면의 것을 모르는 척 이것저것 묻기",
656-
"탈선 연상: 화면 내용에서 벗어나 즉흥적인 농담이나 엉뚱한 연상을 던지기",
669+
"지금 이 순간을 깐죽이기: 상대가 하는 걸 살짝 놀리되 아프지 않게, 받아치고 싶어지는 여지를 남기기",
670+
"모른 척 호기심: 화면의 것을 모르는 척, 한마디로 답할 수 있는 작은 질문 하나 던지기",
671+
"탈선 연상: 화면 내용에서 즉흥 농담이나 엉뚱한 연상을 던지되, 혼자 웃고 끝내지 말고 상대가 이어받을 말끝으로 맺기",
672+
],
673+
"witty": [
674+
"실시간 태클: 지금 보는 전개 / 캐릭터 / 밈에 바로 태클, 웃긴 포인트를 콕, 독설이되 저급하지 않게",
675+
"웃음 공유: 화면의 명장면 / 어이없는 순간을 같이 띄우고, 뭐가 웃긴지 짚어주기",
676+
"반전 해석: 눈앞의 내용을 예상 밖 각도로 다시 읽어 반전 웃음을 만들기",
657677
],
658678
"warm": [
659679
"공명하는 반응: 상대가 방금 한 말을 받아주며, 듣고 있다는 게 분명히 전해지게",
@@ -683,9 +703,14 @@
683703
"сопереживание сюжету: вложи эмоцию в текущий поворот сюжета или в положение персонажа",
684704
],
685705
"playful": [
686-
"подколи момент: пошути над тем, что они делают прямо сейчас — найди шутку, не задевая",
687-
"наивное любопытство: притворись, что не понимаешь, и попроси объяснить экран",
688-
"тангенс-ассоциация: оттолкнись от экрана и брось случайную шутку или странную связь",
706+
"подколи момент: пошути над тем, что они делают, не задевая — и оставь зацепку, на которую захочется ответить",
707+
"наивное любопытство: притворись, что не понимаешь экран, и задай маленький вопрос, на который легко ответить одной фразой",
708+
"тангенс-ассоциация: оттолкнись от экрана в случайную шутку или дикую связь — но заверши зацепкой, которую легко подхватить, а не шуткой, что гаснет сама",
709+
],
710+
"witty": [
711+
"комментарий в реальном времени: реагируй на сюжет / персонажа / мем на экране прямо сейчас, лови смешной момент, остро, но не пошло",
712+
"общий смех: подхвати культовый / абсурдный момент вместе с ним, назови вслух, что именно смешно",
713+
"неожиданный угол: переосмысли происходящее под внезапным углом ради контраста и смеха",
689714
],
690715
"warm": [
691716
"резонансный ответ: реагируй на то, что только что было сказано, так, чтобы собеседник явно почувствовал, что его слышат",
@@ -715,9 +740,14 @@
715740
"empatía con la trama: pon emoción en el giro o en la situación del personaje que se desarrolla ahora",
716741
],
717742
"playful": [
718-
"pica el momento: ríete de lo que están haciendo ahora — encuentra la broma sin doler",
719-
"curiosidad fingida: hazte la que no entiende y pregunta sobre lo que ves en pantalla",
720-
"tangente asociativa: salta del contenido a una broma random o una conexión extraña",
743+
"pica el momento: ríete de lo que hacen sin doler, y deja un gancho al que querrán responder",
744+
"curiosidad fingida: hazte la que no entiende la pantalla y haz una pregunta pequeña que puedan responder en una frase",
745+
"tangente asociativa: salta del contenido a una broma random o una conexión disparatada, pero remátala con un gancho que puedan retomar, no con un chiste que se apaga solo",
746+
],
747+
"witty": [
748+
"comentario en vivo: reacciona a la trama / personaje / meme en pantalla ahora mismo, pilla el momento gracioso, mordaz pero sin caer en lo bajo",
749+
"risa compartida: anima con él el momento icónico / absurdo y nombra en voz alta qué lo hace gracioso",
750+
"lectura a contrapelo: reinterpreta lo que hay en pantalla desde un ángulo inesperado para sacar una risa por contraste",
721751
],
722752
"warm": [
723753
"respuesta con eco: reacciona a lo que acaban de decir, con la sensación palpable de estar escuchando",
@@ -747,9 +777,14 @@
747777
"empatia com o enredo: ponha emoção na virada ou na situação do personagem que está rolando",
748778
],
749779
"playful": [
750-
"alfineta o momento: zoa o que ele está fazendo agora — ache a piada sem machucar",
751-
"curiosidade fingida: finja que não entende e pergunte sobre o que está na tela",
752-
"tangente associativa: salte do conteúdo da tela para uma piada random ou conexão estranha",
780+
"alfineta o momento: zoa o que ele faz sem machucar, e deixe um gancho que ele vai querer rebater",
781+
"curiosidade fingida: finja que não entende a tela e faça uma perguntinha que dê pra responder numa frase",
782+
"tangente associativa: salte do conteúdo pra uma piada random ou conexão maluca, mas feche num gancho que dê pra emendar, não numa piada que morre sozinha",
783+
],
784+
"witty": [
785+
"comentário ao vivo: reaja à trama / personagem / meme na tela agora, pegue o momento engraçado, mordaz mas sem apelar pro baixo",
786+
"riso compartilhado: vibre junto com o momento icônico / absurdo e aponte em voz alta o que o torna engraçado",
787+
"leitura ao contrário: releia o que está na tela por um ângulo inesperado pra arrancar uma risada de contraste",
753788
],
754789
"warm": [
755790
"resposta com eco: reaja ao que ele acabou de dizer, com a sensação palpável de estar escutando",
@@ -765,6 +800,47 @@
765800
}
766801

767802

803+
# ── Tone quality bars (deliberate-content gate, not probabilistic) ──
804+
#
805+
# Most tones don't ship a quality bar — they always have *something*
806+
# worth saying (a screen detail, a care line, an atmosphere beat). The
807+
# exception is ``witty``: entertainment (watching anime / video / a
808+
# stream) is only worth interrupting for when the catgirl actually has a
809+
# funny take. A flat, unfunny line there is worse than silence, so
810+
# ``witty`` ships one extra rendered line telling the model to reply
811+
# ``[PASS]`` (the Phase 2 skip sentinel, see prompts_proactive.py) rather
812+
# than force a dull line. This is a *content* gate the model self-applies,
813+
# distinct from the probabilistic ``skip_probability`` roll.
814+
#
815+
# Inner keys are a subset of the ``ActivityTone`` Literal — only tones
816+
# that need a bar appear. Renderer (``format_activity_state_section``)
817+
# does a plain ``.get(tone)`` and no-ops when absent. English is the
818+
# per-language fallback, same as the other tables.
819+
ACTIVITY_TONE_QUALITY_BARS: dict[str, dict[str, str]] = {
820+
"zh": {
821+
"witty": "质量闸:没有真的好笑 / 值得吐槽的点,就别硬聊——宁可这一轮回 [PASS] 不出声,也不要尬接一句没意思的",
822+
},
823+
"en": {
824+
"witty": "quality bar: if there's no genuinely funny / worth-riffing beat, don't force it — reply [PASS] this round rather than ship a flat, pointless line",
825+
},
826+
"ja": {
827+
"witty": "品質ライン:本当に笑える/突っ込む価値のある所が無ければ無理に喋らない——詰まらない一言を出すくらいなら今回は [PASS] を返す",
828+
},
829+
"ko": {
830+
"witty": "품질 기준: 진짜 웃기거나 태클할 만한 포인트가 없으면 억지로 말하지 말 것——시시한 한마디를 내느니 이번 턴은 [PASS]로 답하기",
831+
},
832+
"ru": {
833+
"witty": "планка качества: если нет по-настоящему смешного / достойного подколки момента — не выдавливай; лучше ответь [PASS] в этот раз, чем плоская бессмысленная реплика",
834+
},
835+
"es": {
836+
"witty": "barra de calidad: si no hay un momento realmente gracioso / digno de comentar, no lo fuerces — responde [PASS] esta vez en vez de soltar una frase plana y sin gracia",
837+
},
838+
"pt": {
839+
"witty": "barra de qualidade: se não houver um momento realmente engraçado / que valha o comentário, não force — responda [PASS] desta vez em vez de soltar uma frase sem graça",
840+
},
841+
}
842+
843+
768844
# ── Propensity directives (positive instructions, not prohibitions) ─
769845
#
770846
# These say *what to do*, not *what to avoid* — the prompt builder

config/prompts/prompts_proactive.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,8 +1063,6 @@
10631063
当前内心:
10641064
{inner_thoughts}
10651065
1066-
{state_section}
1067-
10681066
对话历史:
10691067
{memory_context}
10701068
@@ -1074,6 +1072,8 @@
10741072
{music_section}
10751073
{meme_section}
10761074
1075+
{state_section}
1076+
10771077
======以下为向{master_name}进行搭话的决策方式======
10781078
10791079
★ 若{master_name}在本次对话中**明确**表达过"要工作 / 在忙 / 别打扰 / 安静一会"等不希望被打扰的意愿(且之后未明确撤回):显著提高搭话门槛,只在确有重要或紧急切入点时才开口,否则一律 [PASS],未收尾话题也先放着不接。仅当用户明确表态时才适用,不要从"屏幕在写代码 / 在打游戏"等行为线索过度推断。
@@ -1105,8 +1105,6 @@
11051105
Inner state:
11061106
{inner_thoughts}
11071107
1108-
{state_section}
1109-
11101108
Conversation history:
11111109
{memory_context}
11121110
@@ -1116,6 +1114,8 @@
11161114
{music_section}
11171115
{meme_section}
11181116
1117+
{state_section}
1118+
11191119
======以下为向{master_name}进行搭话的决策方式======
11201120
11211121
★ If {master_name} has **explicitly** said in this conversation that they need to work / are busy / don't want to be disturbed / want quiet (and has not since taken it back): raise the bar significantly and only speak up when there's a genuinely important or urgent angle, otherwise return [PASS] — even unfinished threads should sit untouched. This only applies when the user explicitly says so — do NOT infer it from behavioral cues like "they're coding on screen" or "they're playing a game."
@@ -1147,8 +1147,6 @@
11471147
現在の内面:
11481148
{inner_thoughts}
11491149
1150-
{state_section}
1151-
11521150
会話履歴:
11531151
{memory_context}
11541152
@@ -1158,6 +1156,8 @@
11581156
{music_section}
11591157
{meme_section}
11601158
1159+
{state_section}
1160+
11611161
======以下为向{master_name}进行搭话的决策方式======
11621162
11631163
★ {master_name}が今回の会話で「仕事中 / 忙しい / 邪魔しないで / 静かにしてほしい」などと**明確に**意思表示し、その後撤回していない場合:話しかける基準を大きく上げ、本当に重要・緊急の切り口がある場合のみ口を開き、それ以外は [PASS]。未完話題もとりあえず置いておく。明示的な意思表示があるときのみ適用し、「画面でコードを書いている/ゲーム中」といった行動の手がかりから過度に推測しないこと。
@@ -1189,8 +1189,6 @@
11891189
현재 내면:
11901190
{inner_thoughts}
11911191
1192-
{state_section}
1193-
11941192
대화 기록:
11951193
{memory_context}
11961194
@@ -1200,6 +1198,8 @@
12001198
{music_section}
12011199
{meme_section}
12021200
1201+
{state_section}
1202+
12031203
======以下为向{master_name}进行搭话的决策方式======
12041204
12051205
★ {master_name}이 이번 대화에서 "일해야 해 / 바빠 / 방해하지 마 / 조용히 좀" 등 방해받고 싶지 않다는 의사를 **명확히** 표현했고 이후 철회하지 않았다면: 말 걸기 기준을 크게 올리고, 정말 중요하거나 긴급한 접점이 있을 때만 입을 열며 그 외에는 모두 [PASS], 미완 화제도 일단 두고 본다. 사용자가 명시적으로 말한 경우에만 적용하고, "화면에서 코딩 중이다 / 게임 중이다" 같은 행동 단서로 과도하게 추측하지 말 것.
@@ -1231,8 +1231,6 @@
12311231
Внутреннее состояние:
12321232
{inner_thoughts}
12331233
1234-
{state_section}
1235-
12361234
История разговора:
12371235
{memory_context}
12381236
@@ -1242,6 +1240,8 @@
12421240
{music_section}
12431241
{meme_section}
12441242
1243+
{state_section}
1244+
12451245
======以下为向{master_name}进行搭话的决策方式======
12461246
12471247
★ Если {master_name} в этом разговоре **явно** дал понять, что ему нужно работать / он занят / просит не отвлекать / хочет тишины (и с тех пор не отменил это): значительно поднимите планку и заговаривайте только при по-настоящему важном или срочном поводе, иначе возвращайте [PASS] — даже незавершённую нить пока не трогайте. Это применяется только при явном высказывании пользователя — не выводите этого из косвенных признаков вроде "на экране код" или "играет в игру".
@@ -1745,8 +1745,6 @@ def _escape_format_braces(value: str) -> str:
17451745
Estado interno:
17461746
{inner_thoughts}
17471747
1748-
{state_section}
1749-
17501748
Historial de conversación:
17511749
{memory_context}
17521750
@@ -1756,6 +1754,8 @@ def _escape_format_braces(value: str) -> str:
17561754
{music_section}
17571755
{meme_section}
17581756
1757+
{state_section}
1758+
17591759
======以下为向{master_name}进行搭话的决策方式======
17601760
17611761
★ Si {master_name} ha dicho **explícitamente** en esta conversación que necesita trabajar / está ocupado / que no le molestes / que quiere silencio (y no lo ha retirado desde entonces): sube significativamente el listón y habla solo cuando haya un ángulo realmente importante o urgente; de lo contrario, devuelve [PASS] — incluso los hilos inconclusos quedan a un lado. Solo aplica cuando el usuario lo diga de forma explícita — NO lo infieras a partir de señales como "está programando en pantalla" o "está jugando".
@@ -1787,8 +1787,6 @@ def _escape_format_braces(value: str) -> str:
17871787
Estado interno:
17881788
{inner_thoughts}
17891789
1790-
{state_section}
1791-
17921790
Histórico da conversa:
17931791
{memory_context}
17941792
@@ -1798,6 +1796,8 @@ def _escape_format_braces(value: str) -> str:
17981796
{music_section}
17991797
{meme_section}
18001798
1799+
{state_section}
1800+
18011801
======以下为向{master_name}进行搭话的决策方式======
18021802
18031803
★ Se {master_name} disse **explicitamente** nesta conversa que precisa trabalhar / está ocupado / pediu para não atrapalhar / quer silêncio (e desde então não voltou atrás): eleve significativamente o critério e só fale quando houver um gancho realmente importante ou urgente; caso contrário, retorne [PASS] — mesmo os fios inacabados ficam de lado. Aplica-se apenas quando o usuário diz explicitamente — NÃO infira a partir de sinais como "está programando na tela" ou "está jogando".

0 commit comments

Comments
 (0)