luckytri 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +7 -3
- package/README.md +7 -3
- package/docs/en/CHANGELOG.md +45 -24
- package/docs/en/guide.md +3 -1
- package/docs/zh/CHANGELOG.md +45 -24
- package/docs/zh/guide.md +3 -1
- package/package.json +1 -1
- package/public/guide.en.html +13 -5
- package/public/guide.html +12 -5
- package/public/tutorial.en.md +3 -1
- package/public/tutorial.md +3 -1
- package/server/core/context-builder.js +22 -3
- package/server/core/contribution-check.js +50 -0
- package/server/core/conversation-cues.js +29 -17
- package/server/core/conversation-grounding.js +377 -8
- package/server/core/dialogue-context.js +197 -2
- package/server/core/dialogue-contract.js +59 -0
- package/server/core/initiative-context.js +40 -18
- package/server/core/model-json.js +36 -3
- package/server/core/model-manager.js +7 -10
- package/server/core/model-presets.js +169 -24
- package/server/core/persona-manager.js +52 -12
- package/server/core/reader-check.js +166 -0
- package/server/core/reply-delivery.js +216 -10
- package/server/core/repository.js +33 -0
- package/server/core/response-generator.js +53 -10
- package/server/core/response-validator.js +42 -9
- package/server/core/turn-processor.js +26 -4
- package/server/core/turn.js +298 -51
- package/server/i18n/decisions.js +16 -0
- package/server/i18n/errors.js +4 -0
- package/server/i18n/labels.js +6 -5
- package/server/i18n/models.js +11 -2
- package/server/mind/expression-grounding.js +24 -0
- package/server/mind/own-voice.js +35 -0
- package/server/mind/reading.js +15 -3
- package/server/mind/time/activity-recall.js +65 -0
- package/server/mind/time/availability.js +23 -1
- package/server/mind/time/delivery-links.js +130 -130
- package/server/mind/time/executor.js +4 -2
- package/server/mind/time/games.js +13 -8
- package/server/mind/time/index.js +11 -3
- package/server/mind/time/kinds.js +29 -2
- package/server/mind/time/material-relevance.js +19 -0
- package/server/mind/time/reading-input.js +31 -0
- package/server/mind/time/sharing.js +10 -0
- package/server/mind/time/tasks.js +39 -3
- package/server/mind/time/works.js +105 -15
- package/server/mind/view.js +29 -9
package/README.en.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<p align="center"><strong>Let the days she lives count.</strong></p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<img alt="version" src="https://img.shields.io/
|
|
10
|
+
<a href="https://www.npmjs.com/package/luckytri"><img alt="npm version" src="https://img.shields.io/npm/v/luckytri?color=ff8fb1"></a>
|
|
11
11
|
<img alt="license" src="https://img.shields.io/badge/license-MIT-7fd6c2">
|
|
12
12
|
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A5%2024.5-8fb8ff">
|
|
13
13
|
<img alt="channels" src="https://img.shields.io/badge/QQ-OneBot%2011%20%7C%20official%20bot-ffd37f">
|
|
@@ -92,10 +92,14 @@ The full design is in [Her life](docs/en/her-life.md) and [Architecture and exte
|
|
|
92
92
|
|
|
93
93
|
## What she can do
|
|
94
94
|
|
|
95
|
+
Recent work focuses on continuity and clearer conversation. Account-based recognition links public encounters across groups and private chats. Relationships, forms of address, her own views and private promises retain their sources and visibility boundaries. An ordinary greeting need not bring back unfinished tasks or demonstrate how much she remembers.
|
|
96
|
+
|
|
97
|
+
**1.0.9 update:** Add a separate Volcengine Ark Agent Plan category with its auto-router and all current text-model presets, using the dedicated endpoint and Responses API. Remove the unavailable OpenCode Zen Space Bunny Free and Step 5 Free presets, and clear their saved profiles on upgrade. Conversation fixes continue to prioritize the current speaker's question, follow-ups and quotations, with plain explanations when someone cannot follow. See the [changelog](docs/en/CHANGELOG.md). These changes still need testing in everyday interaction; automated scores are not a guarantee of conversation quality.
|
|
98
|
+
|
|
95
99
|
| Area | What it does today |
|
|
96
100
|
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
97
101
|
| Time and solitude | Lives a day on her own rhythm; in quiet hours sorts her thoughts, reads, writes a diary; reviews every so often, rewrites her story and turns to a new chapter |
|
|
98
|
-
| Doing her own things | Carries out
|
|
102
|
+
| Doing her own things | Carries out her reading, writing and thinking plans; game activities primarily read and record reference material; works are saved under Lifetime and Time |
|
|
99
103
|
| Self and mood | Forms opinions, tastes, concerns and wishes from sourced experiences; changes can be looked back on and undone |
|
|
100
104
|
| Relationships and memory | One memory across groups and private chats; tells "public / private / confidential" apart; private things never surface in another room |
|
|
101
105
|
| Attention and choice | Understands multi-person talk, @-mentions and quotes, and decides to read closely, to speak or to stay silent; can also reach out from her own thoughts |
|
|
@@ -202,7 +206,7 @@ To continue an existing source instance, stop it first, then use `luckytri --hom
|
|
|
202
206
|
| `EMBEDDING_API_KEY` | Optional; a separate key for the knowledge embedding service |
|
|
203
207
|
| `BACKUP_INTERVAL_HOURS` / `BACKUP_KEEP` | Automatic backup interval (24 hours by default, `0` turns it off) and how many to keep (7 by default) |
|
|
204
208
|
|
|
205
|
-
|
|
209
|
+
The database, chat records, model keys and backups live locally in the ignored `data/` directory and are excluded from the repository and npm package. When you use a remote model, the context needed for a response is sent to your configured provider. While running, the server makes one integrity-checked backup a day; backups share a disk with the database, so copy important ones elsewhere. Never commit `.env`, the database or logs. See [Security](.github/SECURITY.md) and [Backup and recovery](docs/en/recovery.md).
|
|
206
210
|
|
|
207
211
|
## Documentation
|
|
208
212
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<p align="center"><strong>让她走过的日子算数。</strong></p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<img alt="version" src="https://img.shields.io/
|
|
10
|
+
<a href="https://www.npmjs.com/package/luckytri"><img alt="npm version" src="https://img.shields.io/npm/v/luckytri?color=ff8fb1"></a>
|
|
11
11
|
<img alt="license" src="https://img.shields.io/badge/license-MIT-7fd6c2">
|
|
12
12
|
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A5%2024.5-8fb8ff">
|
|
13
13
|
<img alt="channels" src="https://img.shields.io/badge/QQ-OneBot%2011%20%7C%20%E5%AE%98%E6%96%B9%E6%9C%BA%E5%99%A8%E4%BA%BA-ffd37f">
|
|
@@ -92,10 +92,14 @@ flowchart LR
|
|
|
92
92
|
|
|
93
93
|
## 能力一览
|
|
94
94
|
|
|
95
|
+
近期更新集中在让相处更连贯、说话更清楚。她按账号认出同一个人,在不同群与私聊间衔接公开经历;关系、称呼、自己的看法和私人约定分别保留来源与可见范围。普通问候不需要带出旧任务,每次开口也不需要证明自己记住了多少事。
|
|
96
|
+
|
|
97
|
+
**1.0.9 更新:** 新增独立的火山方舟 Agent Plan 模型分类,提供自动路由及全部当前文本模型预设,使用专属接口和 Responses API;移除已不可用的 OpenCode Zen Space Bunny Free 与 Step 5 Free 预设,并在升级时清理已有档案。对话修复继续优先理解当前说话人的问题、连续补充与引用;对方说没听懂,就换成能直接理解的话。完整变化见 [版本记录](docs/zh/CHANGELOG.md)。这些修复仍需真实相处检验,项目不把自动评分当作回复质量的保证。
|
|
98
|
+
|
|
95
99
|
| 方面 | 现在能做什么 |
|
|
96
100
|
| ------------ | --------------------------------------------------------------------------------------------------------- |
|
|
97
101
|
| 时间与独处 | 按自己的作息过一天;安静时整理想法、阅读资料、写日记;每隔一段时间回顾,改写自传、翻开新的一章 |
|
|
98
|
-
| 做自己的事 |
|
|
102
|
+
| 做自己的事 | 执行自己的阅读、写作与思考计划;游戏内容以参考资料阅读与记录为主;作品保存在「一生」「时间」中 |
|
|
99
103
|
| 自我与心境 | 从有来源的经历里形成看法、喜好、关注和想做的事;变化可以回看和撤销 |
|
|
100
104
|
| 关系与记忆 | 一份跨群、跨私聊的记忆;区分「公开 / 私下 / 保密」;私下的事不会出现在别的房间 |
|
|
101
105
|
| 注意力与选择 | 理解多人对话、@ 与引用关系,决定细看、开口或沉默;也能从自己的念头出发主动联系 |
|
|
@@ -202,7 +206,7 @@ npm start
|
|
|
202
206
|
| `EMBEDDING_API_KEY` | 可选;独立的知识向量服务密钥 |
|
|
203
207
|
| `BACKUP_INTERVAL_HOURS` / `BACKUP_KEEP` | 自动备份间隔(默认 24 小时,`0` 关闭)与保留份数(默认 7) |
|
|
204
208
|
|
|
205
|
-
|
|
209
|
+
数据库、聊天记录、模型密钥和备份保存在本机被忽略的 `data/` 目录,不随源码或 npm 包发布。使用远程模型时,回复所需的上下文会发送给你配置的模型服务。服务运行时每天自动做一份经过完整性检查的备份;备份和数据库在同一块磁盘上,重要的请自己复制到别处。不要提交 `.env`、数据库或日志。详见 [安全说明](.github/SECURITY.md) 与 [数据备份与恢复](docs/zh/recovery.md)。
|
|
206
210
|
|
|
207
211
|
## 文档
|
|
208
212
|
|
package/docs/en/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
1
|
<p align="right"><a href="../zh/CHANGELOG.md">中文</a> · <b>English</b></p>
|
|
2
2
|
|
|
3
|
-
# Changelog
|
|
4
|
-
|
|
3
|
+
# Changelog
|
|
4
|
+
|
|
5
|
+
## 1.0.9 — 2026-10-11
|
|
6
|
+
|
|
7
|
+
- In follow-ups, answer the new detail without repeating limitations already explained; answer a question about source or feelings directly.
|
|
8
|
+
- Discuss project proposals using the details actually given, without inventing the other person's existing game mechanics or assignment. If a first bot reply misses a newly delivered passage or question, retry once for that content; empty confirmations still stop.
|
|
9
|
+
- For a concrete story excerpt, describe the visible events before clarifying that the larger plot is unknown.
|
|
10
|
+
- Reject duplicate JSON fields so a later `bubbles` field cannot silently replace an answer. Queued messages can see replies already delivered before their turn starts, reducing repeated acknowledgments and corrections.
|
|
11
|
+
- Distinguish questions, proposals, feelings and corrections. Reviews retain the necessary original words and participants to check mistaken adaptations and unsupported apologies. When a follow-up omits a work's title, use the immediately delivered reply to that same person in the same conversation to find reading records, returning only the reading fact, not the reply's text. Select old summaries by the current topic while preserving address agreements separately.
|
|
12
|
+
- Check repeated bot confirmations before they produce emotional changes. Verify new actions claimed in proactive drafts against activity records; old wishes cannot prove execution. Preserve history and readable source dates during review.
|
|
13
|
+
- Retain earlier repair constraints. Keep a shortened original reply only after every check passes again. Historical evaluations exclude future memories and self-feedback, record code fingerprints, and fail explicitly when requested cases are missing.
|
|
14
|
+
- Remove the unavailable OpenCode Zen Space Bunny Free and Step 5 Preview Free presets. On startup, remove their saved profiles while preserving other models and the default.
|
|
15
|
+
- Add a separate Volcengine Ark Agent Plan category with its auto-router and all 14 current text model IDs/aliases. Use the dedicated `/api/plan/v3` Responses API, official context sizes and vision capabilities; exclude Coding Plan, models already being retired, and image, video, speech and embedding models.
|
|
16
|
+
|
|
17
|
+
## 1.0.8 — 2026-10-10
|
|
18
|
+
|
|
19
|
+
- Rework dialogue instructions and context around the current question, proposal or feeling. Old activity reports, room shorthand and self-summaries no longer dominate ordinary exchanges. Greeting images retain their immediate context and agreed forms of address remain available.
|
|
20
|
+
- Allow natural recurring affection and greetings without forcing invented counts, elapsed-time reports or lifestyle advice. Complete reactions are no longer mechanically rewritten to fit a twenty-character limit.
|
|
21
|
+
- Preserve the actual addressee and quoted evidence in group conversations. Later laughter does not erase a serious question, and another bot's interpretation is not the person's confirmation. Empty bot reports do not create confirmation chains or relationship growth.
|
|
22
|
+
- Add an independent comprehensibility check for explanation requests; revisions and factual review retain the current question. Validation respects the configured reasoning effort.
|
|
23
|
+
- Recall relevant historical work versions without denying earlier reading because recent records are incomplete or revealing unrelated private text. Exclude unrelated web material from game progress and sharing while retaining the archive.
|
|
24
|
+
- Distinguish someone else's writing from her own reading promise. Waiting for a manuscript does not execute as writing or substitute another or older book. New self-expressions check actions and participants rather than turning wishes into completed experiences.
|
|
25
|
+
- Update both READMEs, capability boundaries and the release badge; expand historical replay, sequential group scenarios and regression coverage. Transcripts and model reports remain local.
|
|
26
|
+
|
|
5
27
|
## 1.0.7 — 2026-10-09
|
|
6
|
-
|
|
7
|
-
- Ground understanding in the current messages, supplements, speakers and quote chains before choosing a response. Corrections address the actual question instead of substituting apologies or abstract monologues.
|
|
8
|
-
- Keep single topical remarks out of the enduring self's core and prevent extracted replies from becoming fixed scripts. Related recollections, cross-conversation continuity and disclosure boundaries remain available.
|
|
9
|
-
- Exclude known bots from human room-style statistics and end empty bot confirmation loops. An explicit addressed stop ends the current turn; a renewed question can still receive a reply.
|
|
10
|
-
- Preserve provenance and uncertainty in game-content presentation. Current activities and work fragments distinguish reference reading and model-generated material from client operation or completion.
|
|
11
|
-
- Rewrite the latest rejected draft, allow requested factual repetition, and keep contradiction repairs confined to relevant questions. Conversation endings no longer receive an unrelated confusion fallback.
|
|
12
|
-
- Add full-corpus review, historical replay and sequential conversation evaluation tools. Paid model checks run explicitly; private transcripts and reports stay local and are excluded from release artifacts.
|
|
13
|
-
|
|
14
|
-
## 1.0.5 — 2026-10-07
|
|
28
|
+
|
|
29
|
+
- Ground understanding in the current messages, supplements, speakers and quote chains before choosing a response. Corrections address the actual question instead of substituting apologies or abstract monologues.
|
|
30
|
+
- Keep single topical remarks out of the enduring self's core and prevent extracted replies from becoming fixed scripts. Related recollections, cross-conversation continuity and disclosure boundaries remain available.
|
|
31
|
+
- Exclude known bots from human room-style statistics and end empty bot confirmation loops. An explicit addressed stop ends the current turn; a renewed question can still receive a reply.
|
|
32
|
+
- Preserve provenance and uncertainty in game-content presentation. Current activities and work fragments distinguish reference reading and model-generated material from client operation or completion.
|
|
33
|
+
- Rewrite the latest rejected draft, allow requested factual repetition, and keep contradiction repairs confined to relevant questions. Conversation endings no longer receive an unrelated confusion fallback.
|
|
34
|
+
- Add full-corpus review, historical replay and sequential conversation evaluation tools. Paid model checks run explicitly; private transcripts and reports stay local and are excluded from release artifacts.
|
|
35
|
+
|
|
36
|
+
## 1.0.5 — 2026-10-07
|
|
15
37
|
|
|
16
38
|
- Fixed bound relationships being forgotten when the person was absent from the current conversation. Chat, initiative, solitude, diaries and reviews recall the same account-based ledger by name and role.
|
|
17
39
|
- Distinguished current relationship facts from past opinions and personal feelings. Historical denials and jokes remain in history; relationship-related replies are checked against current knowledge while preserving her choices about interaction and address.
|
|
@@ -25,19 +47,18 @@
|
|
|
25
47
|
- Update and restart stages and validates the official release before stopping, saves a verified data restore point, and switches programs. Failed startup attempts restoration of the previous code and data. Source/npm installs and instance configuration remain intact; repeated clicks coalesce and CLI launches retain managed updates.
|
|
26
48
|
- Added privacy, same-name identity, recovery, real installed-package switching and viewport regression checks. Archive checks verify bytes before parsing SQLite, so damaged files do not expose raw schema errors.
|
|
27
49
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
## 1.0.3 — 2026-10-06
|
|
51
|
+
|
|
52
|
+
- Group personas become thoughts about each place. She selectively adds, revises or lets go of impressions, wishes, preferences, questions and boundaries from local encounters, retaining reasons, sources and versions. Her overall personality remains shared; copied legacy personas stay only in history.
|
|
53
|
+
- Manual update checks in system runtime settings show the installed and latest npm versions and release notes. Checks cache and coalesce requests and recover from failures; they do not install or restart.
|
|
54
|
+
- Nature edit allowances come from the server. Audited, idempotent local extra opportunities preserve personality history and other instances' default limits.
|
|
55
|
+
- Added source isolation, selective updates, restart persistence, failed update recovery and responsive interface checks.
|
|
56
|
+
|
|
57
|
+
## 1.0.2 — 2026-10-06
|
|
58
|
+
|
|
59
|
+
- Streamed full SQLite data packages with validated import previews, retained recovery points and rollback on failure.
|
|
60
|
+
- Destination management sign-ins and connection settings are retained. Imported auto replies and plugin grants await review; cancelled, expired and interrupted temporary packages are reclaimed.
|
|
61
|
+
|
|
41
62
|
## 1.0.1 — 2026-10-05
|
|
42
63
|
|
|
43
64
|
- Global npm installation runs with `luckytri`, including the server, built WebUI, guides and bundled plugin. User data remains outside the package across updates and reinstalls.
|
package/docs/en/guide.md
CHANGED
|
@@ -63,12 +63,14 @@ Without a model key, simulated replies use local samples and call no model. Once
|
|
|
63
63
|
|
|
64
64
|
Open "System → Model library", click "+ Add model" and choose a preset.
|
|
65
65
|
|
|
66
|
-
- For the API address enter the root of the provider's compatible endpoint. The program appends `/chat/completions`
|
|
66
|
+
- For the API address enter the root of the provider's compatible endpoint. The program appends `/chat/completions` or `/responses` according to the preset; do not write the full path again.
|
|
67
67
|
- For the model name enter a model ID the provider accepts.
|
|
68
68
|
- Leaving the API key empty keeps the saved key.
|
|
69
69
|
|
|
70
70
|
A preset only fills in a common address and model name; the real models are whatever your provider's console shows. Speaking decisions and replies need the model to return a JSON object.
|
|
71
71
|
|
|
72
|
+
Volcengine Ark Agent Plan and Coding Plan use separate plans, keys and endpoints. The Agent Plan preset uses its dedicated `/api/plan/v3` address and the Responses API. Enter an Agent Plan API key; do not reuse a Coding Plan key or a regular Ark inference key.
|
|
73
|
+
|
|
72
74
|
After saving, click "Test this model's connection". The test carries no group chat text. Test again after changing the address, model or key.
|
|
73
75
|
|
|
74
76
|
You can also stay in simulation mode and trial-chat with TA under "Nature" to see how she speaks before letting her join real QQ.
|
package/docs/zh/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
1
|
<p align="right"><b>中文</b> · <a href="../en/CHANGELOG.md">English</a></p>
|
|
2
2
|
|
|
3
|
-
# 版本记录
|
|
4
|
-
|
|
3
|
+
# 版本记录
|
|
4
|
+
|
|
5
|
+
## 1.0.9 — 2026-10-11
|
|
6
|
+
|
|
7
|
+
- 连续追问只回答新问的细节,不反复重讲已经交代的限制;问来源就说来源,问感受就说感受。
|
|
8
|
+
- 聊别人提出的项目时只依据原话,不擅自补出对方正在做的玩法或作业背景。机器人交来新正文或提出新问题却被初稿漏接时,按新内容重答一次;单纯重复确认仍然收住。
|
|
9
|
+
- 对具体故事片段先讲清眼前发生了什么,再说明整部主线未知;不以等全文为由漏答。
|
|
10
|
+
- 拒绝模型输出中的重复 JSON 字段,避免后一个 `bubbles` 静默覆盖完整答案。排队中的消息可以看到本轮开始前已送达的回复,减少重复认错与确认。
|
|
11
|
+
- 区分提问、提议、感受和纠正;复核时保留必要的原话与参与者,核对新提议是否被误当成改编旧作、已经听懂的内容是否被再次认错。新问题省略作品名时,可用同一会话中刚送达给同一人的上一条回复找回阅读记录,只带回阅读事实,不带入回复正文。旧总结按当前话题召回,称呼约定独立保留。
|
|
12
|
+
- 机器人之间的重复报备与换词确认在形成情感变化前核对。主动草稿声称的新行动也先核实实际记录,旧愿望不能给自己作证;复审保留历史与可读的来源日期。
|
|
13
|
+
- 修订保留此前指出的约束;末尾气泡出错时,只有重新通过全部检查的完整前缀才可保留。历史评测隔离未来记忆与自我反馈,记录代码指纹,漏选指定场景时明确报错。
|
|
14
|
+
- 移除已不可用的 OpenCode Zen Space Bunny Free 与 Step 5 Preview Free 预设;实例启动时自动删除对应的旧档案,保留其他模型和默认项。
|
|
15
|
+
- 新增独立的火山方舟 Agent Plan 分类,提供自动路由与全部 14 个当前文本模型 ID/别名。按官方接口使用专属 `/api/plan/v3` Responses API、模型上下文与视觉能力;不混入 Coding Plan、已启动下线模型或图像、视频、语音和向量模型。
|
|
16
|
+
|
|
17
|
+
## 1.0.8 — 2026-10-10
|
|
18
|
+
|
|
19
|
+
- 重新整理对话提示与上下文:优先回答眼前的具体问题、提议和感受,不再让旧活动汇报、群内暗号和过去的自我总结主导普通交流。问候附图同样按当前语境处理,约定称呼仍然保留。
|
|
20
|
+
- 修复普通亲近表达被重复检查退回的问题;“我也想你”、晚安等自然回应可以再次使用,无须编出次数、时间间隔或生活建议。完整的一句反应不再因二十字限制被机械改写。
|
|
21
|
+
- 多人对话保留实际回应对象与引用证据,不因后面的笑声漏掉认真提问,也不把另一机器人的猜测当本人确认。没有新内容的机器人报备不再形成确认链或关系增长。
|
|
22
|
+
- 增加独立的可理解性检查:对方要求解释时,答案须让提问者读懂;修订与事实复核保留当前问题,校验阶段遵循配置的推理程度。
|
|
23
|
+
- 作品召回搜索相关历史版本;已有阅读可以核实,不再因近期记录缺失否认过去,也不披露无关私下正文。排除混入游戏资料的无关网页,保留原档案并阻止其成为进度证据或分享内容。
|
|
24
|
+
- 区分别人的写作与自己的阅读约定;等待正文时不执行成写作,不拿无关或旧书替代。新保存的念头核对行动与参与者,避免把愿望写成已完成经历。
|
|
25
|
+
- 更新中英文 README、能力边界与发布版本徽章;扩展历史回放、连续多人对话和回归测试。聊天记录与模型评测报告只留本地。
|
|
26
|
+
|
|
5
27
|
## 1.0.7 — 2026-10-09
|
|
6
|
-
|
|
7
|
-
- 调整理解与表达顺序:先核对本轮原话、连续补充、说话人和引用,再决定回应。被纠正时修正具体问题,不用道歉、内心独白或抽象比喻替代答案。
|
|
8
|
-
- 临时话题观点不再自动占据长期自我的核心位置;一次回复不形成固定话术习惯。相关旧想法仍可召回,跨群连续记忆、来源和私密范围保留。
|
|
9
|
-
- 已知机器人不再参与人类群聊口吻统计;无新内容的机器人确认循环会收住。明确要求停止时不再一边答应闭嘴一边继续建议,新的问题仍能重新回应。
|
|
10
|
-
- 修复游戏内容展示抹去来源与不确定性的错误。当前活动和作品片段带回参考阅读与材料来源,模型整理不再被展示层改写为客户端操作或通关。
|
|
11
|
-
- 重写针对最新被退回的稿子;重复确认事实不会因去重而被吞掉。旧话矛盾的修复只用于相关追问,不插入无关问答。收尾、未理解问题和危机场景分别处理。
|
|
12
|
-
- 增加全量会话分段审阅、历史场景回放与连续对话评测工具。调用模型的检查需显式运行,原始聊天和报告仅留本地,不随发布包分发。
|
|
13
|
-
|
|
14
|
-
## 1.0.5 — 2026-10-07
|
|
28
|
+
|
|
29
|
+
- 调整理解与表达顺序:先核对本轮原话、连续补充、说话人和引用,再决定回应。被纠正时修正具体问题,不用道歉、内心独白或抽象比喻替代答案。
|
|
30
|
+
- 临时话题观点不再自动占据长期自我的核心位置;一次回复不形成固定话术习惯。相关旧想法仍可召回,跨群连续记忆、来源和私密范围保留。
|
|
31
|
+
- 已知机器人不再参与人类群聊口吻统计;无新内容的机器人确认循环会收住。明确要求停止时不再一边答应闭嘴一边继续建议,新的问题仍能重新回应。
|
|
32
|
+
- 修复游戏内容展示抹去来源与不确定性的错误。当前活动和作品片段带回参考阅读与材料来源,模型整理不再被展示层改写为客户端操作或通关。
|
|
33
|
+
- 重写针对最新被退回的稿子;重复确认事实不会因去重而被吞掉。旧话矛盾的修复只用于相关追问,不插入无关问答。收尾、未理解问题和危机场景分别处理。
|
|
34
|
+
- 增加全量会话分段审阅、历史场景回放与连续对话评测工具。调用模型的检查需显式运行,原始聊天和报告仅留本地,不随发布包分发。
|
|
35
|
+
|
|
36
|
+
## 1.0.5 — 2026-10-07
|
|
15
37
|
|
|
16
38
|
- 修复人际关系已绑定却无法在另一段会话中认出对方的问题。聊天、主动表达、独处、日记和回顾从同一份关系记录按名字、账号与称呼召回,不要求关系对象正在说话。
|
|
17
39
|
- 区分当前关系、过去看法和自己的感受。旧的否认或玩笑保留在历史中,不能替代更新后的事实;关系相关回复发送前再次核对,保持自己的相处与称呼选择。
|
|
@@ -25,19 +47,18 @@
|
|
|
25
47
|
- 检查更新新增「更新并重启」:先安装校验,再保留完整数据恢复点并切换;启动失败尝试恢复旧程序和数据。源码、npm 安装、配置与生活数据保留,重复点击合并,启动命令接续已更新程序。
|
|
26
48
|
- 补充关系权限、同名对象、身份、失败恢复、真实安装切换与不同屏幕回归。校验清单先检查文件哈希,再解析数据库,损坏文件不会返回原始 SQLite 结构错误。
|
|
27
49
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
## 1.0.3 — 2026-10-06
|
|
51
|
+
|
|
52
|
+
- 群人格改为「在这里的想法」:她根据各处真实相处选择性新增、修改或放下印象、愿望、偏好、疑问和分寸,保留理由、来源和版本。整体人格仍统一,复制来的旧正文仅留在历史中。
|
|
53
|
+
- 系统运行设置新增手动检查更新,显示当前版本、npm 最新版本及发布说明;有缓存、并发合并和失败重试,不自动安装或重启。
|
|
54
|
+
- 天性修改额度由服务端统一提供,支持有记录、幂等的本地额外机会,不删除原人格版本,不改变其他实例默认限制。
|
|
55
|
+
- 补充跨会话来源、选择性更新、重启持久化、更新失败恢复,以及桌面、平板和手机界面的回归检查。
|
|
56
|
+
|
|
57
|
+
## 1.0.2 — 2026-10-06
|
|
58
|
+
|
|
59
|
+
- 数据导入导出:流式导出完整 SQLite 数据包,导入前校验并预览;替换前保留恢复点,失败可回滚。
|
|
60
|
+
- 保留目标实例的管理登录和连接设置;导入后先关闭自动回复与插件授权,供管理员重新确认。临时包支持取消、过期和重启回收。
|
|
61
|
+
|
|
41
62
|
## 1.0.1 — 2026-10-05
|
|
42
63
|
|
|
43
64
|
- 全局 npm 安装后直接运行 `luckytri`,服务端、WebUI、教程和内置插件一并安装;用户数据独立保存,更新和重装继续使用。
|
package/docs/zh/guide.md
CHANGED
|
@@ -63,12 +63,14 @@ LuckyTri 是「TA 的小世界」,左侧导航分三组、十个入口:
|
|
|
63
63
|
|
|
64
64
|
打开「系统 → 模型库」,点「+ 新增模型」选择一个预设。
|
|
65
65
|
|
|
66
|
-
- API
|
|
66
|
+
- API 地址填写服务商的兼容接口根路径。程序会按预设自动拼接 `/chat/completions` 或 `/responses`,不要把完整路径再写一遍。
|
|
67
67
|
- 模型名称填写服务商接受的模型 ID。
|
|
68
68
|
- API Key 留空表示保留已保存的密钥。
|
|
69
69
|
|
|
70
70
|
预设只填入常见地址和模型名,以服务商控制台里的实际模型为准。发言决策和回复生成需要模型返回 JSON 对象。
|
|
71
71
|
|
|
72
|
+
火山方舟 Agent Plan 与 Coding Plan 使用不同套餐、密钥和接口地址。Agent Plan 预设使用专属 `/api/plan/v3` 地址和 Responses API;请填入 Agent Plan 专属 API Key,不要与 Coding Plan 或普通方舟推理 API 的密钥混用。
|
|
73
|
+
|
|
72
74
|
保存后点「测试此模型连接」。测试不携带群聊原文。更换地址、模型或密钥后需要重新测试。
|
|
73
75
|
|
|
74
76
|
也可以先保持模拟模式,在「天性」里和 TA 试聊,确认 TA 说话的样子后再让 TA 参加真实 QQ。
|
package/package.json
CHANGED
package/public/guide.en.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
-
<title>LuckyTri v1.0.
|
|
6
|
+
<title>LuckyTri v1.0.9 · Getting Started</title>
|
|
7
7
|
<style>
|
|
8
8
|
* {
|
|
9
9
|
box-sizing: border-box;
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
<body>
|
|
270
270
|
<header>
|
|
271
271
|
<div>
|
|
272
|
-
<b>LuckyTri · Handbook</b><small>TIME · MEMORY · CHOICE / v1.0.
|
|
272
|
+
<b>LuckyTri · Handbook</b><small>TIME · MEMORY · CHOICE / v1.0.9</small>
|
|
273
273
|
</div>
|
|
274
274
|
<nav>
|
|
275
275
|
<a href="/#setup">Back to the studio</a
|
|
@@ -497,8 +497,9 @@ luckytri
|
|
|
497
497
|
<ul>
|
|
498
498
|
<li>
|
|
499
499
|
For the API address enter the root of the provider's compatible
|
|
500
|
-
endpoint. The program appends <code>/chat/completions</code>
|
|
501
|
-
do not write the
|
|
500
|
+
endpoint. The program appends <code>/chat/completions</code> or
|
|
501
|
+
<code>/responses</code> according to the preset; do not write the
|
|
502
|
+
full path again.
|
|
502
503
|
</li>
|
|
503
504
|
<li>For the model name enter a model ID the provider accepts.</li>
|
|
504
505
|
<li>Leaving the API key empty keeps the saved key.</li>
|
|
@@ -508,6 +509,13 @@ luckytri
|
|
|
508
509
|
models are whatever your provider's console shows. Speaking
|
|
509
510
|
decisions and replies need the model to return a JSON object.
|
|
510
511
|
</p>
|
|
512
|
+
<p>
|
|
513
|
+
Volcengine Ark Agent Plan and Coding Plan use separate plans, keys and
|
|
514
|
+
endpoints. The Agent Plan preset uses its dedicated
|
|
515
|
+
<code>/api/plan/v3</code> address and the Responses API. Enter an
|
|
516
|
+
Agent Plan API key; do not reuse a Coding Plan key or a regular Ark
|
|
517
|
+
inference key.
|
|
518
|
+
</p>
|
|
511
519
|
<p>
|
|
512
520
|
After saving, click "Test this model's connection". The
|
|
513
521
|
test carries no group chat text. Test again after changing the
|
|
@@ -1057,7 +1065,7 @@ npm start
|
|
|
1057
1065
|
</div>
|
|
1058
1066
|
<footer>
|
|
1059
1067
|
LuckyTri · so that experience and choice stay coherent. This guide matches
|
|
1060
|
-
the v1.0.
|
|
1068
|
+
the v1.0.9 interface.
|
|
1061
1069
|
</footer>
|
|
1062
1070
|
</body>
|
|
1063
1071
|
</html>
|
package/public/guide.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
-
<title>LuckyTri v1.0.
|
|
6
|
+
<title>LuckyTri v1.0.9 · 使用教程</title>
|
|
7
7
|
<style>
|
|
8
8
|
* {
|
|
9
9
|
box-sizing: border-box;
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
<body>
|
|
270
270
|
<header>
|
|
271
271
|
<div>
|
|
272
|
-
<b>LuckyTri · 上手手册</b><small>TIME · MEMORY · CHOICE / v1.0.
|
|
272
|
+
<b>LuckyTri · 上手手册</b><small>TIME · MEMORY · CHOICE / v1.0.9</small>
|
|
273
273
|
</div>
|
|
274
274
|
<nav>
|
|
275
275
|
<a href="/#setup">返回管理台</a
|
|
@@ -460,8 +460,9 @@ luckytri
|
|
|
460
460
|
<p>打开「系统 → 模型库」,点「+ 新增模型」选择一个预设。</p>
|
|
461
461
|
<ul>
|
|
462
462
|
<li>
|
|
463
|
-
API
|
|
464
|
-
<code>/chat/completions</code
|
|
463
|
+
API 地址填写服务商的兼容接口根路径。程序会按预设自动拼接
|
|
464
|
+
<code>/chat/completions</code> 或
|
|
465
|
+
<code>/responses</code>,不要把完整路径再写一遍。
|
|
465
466
|
</li>
|
|
466
467
|
<li>模型名称填写服务商接受的模型 ID。</li>
|
|
467
468
|
<li>API Key 留空表示保留已保存的密钥。</li>
|
|
@@ -470,6 +471,12 @@ luckytri
|
|
|
470
471
|
预设只填入常见地址和模型名,以服务商控制台里的实际模型为准。发言决策和回复生成需要模型返回
|
|
471
472
|
JSON 对象。
|
|
472
473
|
</p>
|
|
474
|
+
<p>
|
|
475
|
+
火山方舟 Agent Plan 与 Coding Plan 使用不同套餐、密钥和接口地址。Agent
|
|
476
|
+
Plan 预设使用专属 <code>/api/plan/v3</code> 地址和 Responses
|
|
477
|
+
API;请填入 Agent Plan 专属 API Key,不要与 Coding Plan 或普通方舟推理
|
|
478
|
+
API 的密钥混用。
|
|
479
|
+
</p>
|
|
473
480
|
<p>
|
|
474
481
|
保存后点「测试此模型连接」。测试不携带群聊原文。更换地址、模型或密钥后需要重新测试。
|
|
475
482
|
</p>
|
|
@@ -864,6 +871,6 @@ npm start
|
|
|
864
871
|
</p>
|
|
865
872
|
</article>
|
|
866
873
|
</div>
|
|
867
|
-
<footer>LuckyTri · 让经历和选择彼此连贯。教程与 v1.0.
|
|
874
|
+
<footer>LuckyTri · 让经历和选择彼此连贯。教程与 v1.0.9 界面同步。</footer>
|
|
868
875
|
</body>
|
|
869
876
|
</html>
|
package/public/tutorial.en.md
CHANGED
|
@@ -61,12 +61,14 @@ Without a model key, simulated replies use local samples and call no model. Once
|
|
|
61
61
|
|
|
62
62
|
Open "System → Model library", click "+ Add model" and choose a preset.
|
|
63
63
|
|
|
64
|
-
- For the API address enter the root of the provider's compatible endpoint. The program appends `/chat/completions`
|
|
64
|
+
- For the API address enter the root of the provider's compatible endpoint. The program appends `/chat/completions` or `/responses` according to the preset; do not write the full path again.
|
|
65
65
|
- For the model name enter a model ID the provider accepts.
|
|
66
66
|
- Leaving the API key empty keeps the saved key.
|
|
67
67
|
|
|
68
68
|
A preset only fills in a common address and model name; the real models are whatever your provider's console shows. Speaking decisions and replies need the model to return a JSON object.
|
|
69
69
|
|
|
70
|
+
Volcengine Ark Agent Plan and Coding Plan use separate plans, keys and endpoints. The Agent Plan preset uses its dedicated `/api/plan/v3` address and the Responses API. Enter an Agent Plan API key; do not reuse a Coding Plan key or a regular Ark inference key.
|
|
71
|
+
|
|
70
72
|
After saving, click "Test this model's connection". The test carries no group chat text. Test again after changing the address, model or key.
|
|
71
73
|
|
|
72
74
|
You can also stay in simulation mode and trial-chat with TA under "Nature" to see how she speaks before letting her join real QQ.
|
package/public/tutorial.md
CHANGED
|
@@ -61,12 +61,14 @@ LuckyTri 是「TA 的小世界」,左侧导航分三组、十个入口:
|
|
|
61
61
|
|
|
62
62
|
打开「系统 → 模型库」,点「+ 新增模型」选择一个预设。
|
|
63
63
|
|
|
64
|
-
- API
|
|
64
|
+
- API 地址填写服务商的兼容接口根路径。程序会按预设自动拼接 `/chat/completions` 或 `/responses`,不要把完整路径再写一遍。
|
|
65
65
|
- 模型名称填写服务商接受的模型 ID。
|
|
66
66
|
- API Key 留空表示保留已保存的密钥。
|
|
67
67
|
|
|
68
68
|
预设只填入常见地址和模型名,以服务商控制台里的实际模型为准。发言决策和回复生成需要模型返回 JSON 对象。
|
|
69
69
|
|
|
70
|
+
火山方舟 Agent Plan 与 Coding Plan 使用不同套餐、密钥和接口地址。Agent Plan 预设使用专属 `/api/plan/v3` 地址和 Responses API;请填入 Agent Plan 专属 API Key,不要与 Coding Plan 或普通方舟推理 API 的密钥混用。
|
|
71
|
+
|
|
70
72
|
保存后点「测试此模型连接」。测试不携带群聊原文。更换地址、模型或密钥后需要重新测试。
|
|
71
73
|
|
|
72
74
|
也可以先保持模拟模式,在「天性」里和 TA 试聊,确认 TA 说话的样子后再让 TA 参加真实 QQ。
|
|
@@ -24,11 +24,30 @@ function recallTerms(text) {
|
|
|
24
24
|
|
|
25
25
|
// Who said what to whom, up to the watermark: @, quotes, name calls and the
|
|
26
26
|
// reply chains they form.
|
|
27
|
-
export function perceive(
|
|
27
|
+
export function perceive(
|
|
28
|
+
repo,
|
|
29
|
+
session,
|
|
30
|
+
watermark,
|
|
31
|
+
simulated,
|
|
32
|
+
name,
|
|
33
|
+
{ resolved = null, sentBefore = 0 } = {},
|
|
34
|
+
) {
|
|
35
|
+
// A queued message may predate the reply to the preceding batch. She has
|
|
36
|
+
// already said those words by the time this turn starts and must see them.
|
|
37
|
+
// Keep later user messages and replay futures outside the batch boundary.
|
|
38
|
+
const delivered = sentBefore
|
|
39
|
+
? repo
|
|
40
|
+
.recentEvents(session, 8, { simulated, role: "assistant" })
|
|
41
|
+
.filter((m) => m.seq > watermark && m.time <= sentBefore)
|
|
42
|
+
: [];
|
|
43
|
+
if (resolved && !delivered.length) return resolved;
|
|
28
44
|
return resolveTargets(
|
|
29
45
|
[
|
|
30
|
-
...
|
|
31
|
-
|
|
46
|
+
...(resolved || [
|
|
47
|
+
...repo.references(session, { simulated }),
|
|
48
|
+
...repo.events(session, watermark, { simulated }),
|
|
49
|
+
]),
|
|
50
|
+
...delivered,
|
|
32
51
|
],
|
|
33
52
|
name,
|
|
34
53
|
identityAliases(name, repo.store.settings().aliases || ""),
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
conversationGrounding,
|
|
3
|
+
recentOwnMessages,
|
|
4
|
+
} from "./conversation-grounding.js";
|
|
5
|
+
|
|
6
|
+
export function botExchange(snapshot, decision = {}) {
|
|
7
|
+
if (!decision || typeof decision !== "object" || Array.isArray(decision))
|
|
8
|
+
return null;
|
|
9
|
+
if (
|
|
10
|
+
snapshot.initiative ||
|
|
11
|
+
decision.act ||
|
|
12
|
+
decision.share ||
|
|
13
|
+
["chat", "rest"].includes(decision.attention?.action)
|
|
14
|
+
)
|
|
15
|
+
return null;
|
|
16
|
+
const grounding = conversationGrounding(snapshot);
|
|
17
|
+
const current = (snapshot.messages || []).filter(
|
|
18
|
+
(m) => snapshot.batchIds?.includes(m.id) && m.role === "user",
|
|
19
|
+
);
|
|
20
|
+
if (
|
|
21
|
+
!current.length ||
|
|
22
|
+
!current.every((m) => grounding.botMessageIds.includes(m.id)) ||
|
|
23
|
+
grounding.botOnlyTail < 4
|
|
24
|
+
)
|
|
25
|
+
return null;
|
|
26
|
+
const own = recentOwnMessages(snapshot, 4);
|
|
27
|
+
if (!own.length) return null;
|
|
28
|
+
const speakers = new Set(current.map((m) => m.speaker));
|
|
29
|
+
return {
|
|
30
|
+
current: current.map(({ id, speaker, text }) => ({ id, speaker, text })),
|
|
31
|
+
previousOwn: own.map(({ id, text }) => ({ id, text })),
|
|
32
|
+
previousBots: (snapshot.messages || [])
|
|
33
|
+
.filter(
|
|
34
|
+
(m) =>
|
|
35
|
+
m.role === "user" &&
|
|
36
|
+
speakers.has(m.speaker) &&
|
|
37
|
+
!snapshot.batchIds.includes(m.id),
|
|
38
|
+
)
|
|
39
|
+
.slice(-4)
|
|
40
|
+
.map(({ id, text }) => ({ id, text })),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const CONTRIBUTION_CHECK = `判断一段机器人之间的接话是否有继续说的内容。只输出JSON,不扮演任何人。
|
|
45
|
+
botExchange是实际原话,reply是准备发出的话;plannedPoint只是草稿的自我描述,不能拿“接住、回应、强调、确认、收住”这些工作说明证明有内容。reply非空时只判断它实际说了什么。
|
|
46
|
+
对方提出新问题、分享新感受或实际段落,可以回应;具体的感受、疑问、不同看法、小联想也算内容,不要求新知识、完整故事或重大事件。尤其创作讨论,可以喜欢或不喜欢一处实际表达,不必强迫沉默。
|
|
47
|
+
但同一个边界、承诺、等待、归属或确认,换措辞、换比喻再认一遍,仍没有新意思。比如双方已经确认什么时候发由作者自己定,下一句“对,还是你决定”不用再发;只说“等稿、这笔记上、原样还你、谁也不欠、按你算”不能独自成为新内容。对方报备同一决定也不需要你再次许可。没有新内容就结束,不为了避免沉默另编一件事。
|
|
48
|
+
如果reply没有新内容,再判断current里是否有这轮刚出现、且draft没有回答的具体新段落、作品交付、问题或纠正。有则shouldRepair=true,表示需要根据这轮新内容重想一次;这不是要换词确认。若current只是旧决定的重复报备、同意或收尾,shouldRepair=false。输出 {"hasContribution":true或false,"newPoint":"reply里确有的新内容,没有则空","shouldRepair":true或false,"reason":"与先前原话相比,实际增加或重复了什么"}。`;
|
|
49
|
+
|
|
50
|
+
export const CONTRIBUTION_REPAIR = `上一稿被判为没有新内容。请重新读 context 和 exchange.current,判断这轮是否有还没答到的新问题、纠正、实际交付或具体片段。若有,就只回应那个新点:有人送来新作品或片段时,不只重复“我等全文/会按约定读”,先从本轮实际给出的文字里挑一处,给出具体而有限的反应;整部主线或人物动机未知时再说明未知。不要编造原文没有的情节,不必复盘整段历史。若眼前确实没有新点,可以继续沉默。仍输出完整的聊天判断 JSON。`;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { claimedPlay } from "../mind/guard.js";
|
|
2
|
+
import { readerQuestions } from "./reader-check.js";
|
|
3
|
+
import {
|
|
4
|
+
recentOwnMessages,
|
|
5
|
+
routineSocialReply,
|
|
6
|
+
} from "./conversation-grounding.js";
|
|
2
7
|
|
|
3
8
|
// Stable message timestamps stay with history; changing clock/style cues belong at the tail.
|
|
4
9
|
const clockFormats = new Map();
|
|
@@ -73,7 +78,11 @@ export function replyFocus(snapshot, decision) {
|
|
|
73
78
|
if (
|
|
74
79
|
/看不懂|没看懂|听不懂|太抽象|说人话|复读|别重复|好好说话|你在说什么|你在讲什么/.test(
|
|
75
80
|
latest,
|
|
76
|
-
)
|
|
81
|
+
) ||
|
|
82
|
+
(/^[??]+$/.test(latest) &&
|
|
83
|
+
readerQuestions(snapshot, decision).some((q) =>
|
|
84
|
+
targets.some((m) => m.id === q.id),
|
|
85
|
+
))
|
|
77
86
|
)
|
|
78
87
|
return {
|
|
79
88
|
kind: "readability_repair",
|
|
@@ -185,7 +194,7 @@ export function conversationCues(
|
|
|
185
194
|
now = Date.now(),
|
|
186
195
|
timeZone,
|
|
187
196
|
) {
|
|
188
|
-
const recent =
|
|
197
|
+
const recent = recentOwnMessages({ messages, batchIds }, 8);
|
|
189
198
|
const batch = messages.filter((m) => batchIds.includes(m.id));
|
|
190
199
|
const previous = messages
|
|
191
200
|
.filter(
|
|
@@ -207,7 +216,7 @@ export function conversationCues(
|
|
|
207
216
|
ellipsisCount: recent.filter((m) => ellipsis.test(m.text)).length,
|
|
208
217
|
recentReplies: recent.map((m) => ({ id: m.id, text: m.text })),
|
|
209
218
|
instruction:
|
|
210
|
-
"
|
|
219
|
+
"这是近期说过的话,不是风格示范。不继承模板或无意义第二句;新问候和亲近表达可以自然回应,晚安、我也想你、hh不必为避免重复而编花样。没有新意思的承诺和确认不用换词再发。",
|
|
211
220
|
},
|
|
212
221
|
};
|
|
213
222
|
}
|
|
@@ -218,10 +227,7 @@ export function conversationalIssues(result, snapshot, decision = {}) {
|
|
|
218
227
|
: (snapshot.messages || []).filter((m) =>
|
|
219
228
|
snapshot.batchIds?.includes(m.id),
|
|
220
229
|
);
|
|
221
|
-
const recent = snapshot.
|
|
222
|
-
.filter((m) => m.role === "assistant")
|
|
223
|
-
.slice(-8)
|
|
224
|
-
.map((m) => m.text);
|
|
230
|
+
const recent = recentOwnMessages(snapshot, 8).map((m) => m.text);
|
|
225
231
|
const issues = [];
|
|
226
232
|
if (
|
|
227
233
|
replyFocus(snapshot, decision).kind === "readability_repair" &&
|
|
@@ -327,9 +333,22 @@ export function conversationalIssues(result, snapshot, decision = {}) {
|
|
|
327
333
|
)
|
|
328
334
|
)
|
|
329
335
|
issues.push("不要为共情虚构自己同样上班或亲历;回应对方的事情即可");
|
|
330
|
-
if (
|
|
336
|
+
if (
|
|
337
|
+
texts.some(
|
|
338
|
+
(line) =>
|
|
339
|
+
claimedPlay(line) &&
|
|
340
|
+
!(
|
|
341
|
+
/通关后|通关才能|解锁|需要.{0,8}通关|二周目.{0,6}(?:设计|设定|模式)/.test(
|
|
342
|
+
line,
|
|
343
|
+
) &&
|
|
344
|
+
!/我.{0,10}(?:已经|之前|刚|早就|确实|全)?(?:玩过|通关|打完|拿到|达成)/.test(
|
|
345
|
+
line,
|
|
346
|
+
)
|
|
347
|
+
),
|
|
348
|
+
)
|
|
349
|
+
)
|
|
331
350
|
issues.push(
|
|
332
|
-
"
|
|
351
|
+
"不要把游戏资料阅读说成实际操控客户端、通关或拿到成就。有真实阅读和笔记时,直接谈读到的内容、进度和感受,不能反过来否认读过或写过;只想了解的作品才说想了解,不用旧的口头夸大当经历证据",
|
|
333
352
|
);
|
|
334
353
|
if (
|
|
335
354
|
texts.some((t) =>
|
|
@@ -341,20 +360,13 @@ export function conversationalIssues(result, snapshot, decision = {}) {
|
|
|
341
360
|
issues.push(
|
|
342
361
|
"不要为接话虚构自己有身体做过的日常经历;保留对眼前趣事的反应,不说自己也拿过、去过或做过",
|
|
343
362
|
);
|
|
344
|
-
if (
|
|
345
|
-
texts.some((t) =>
|
|
346
|
-
/^.{2,22}[啊呀][,,…。]*(?:那)?(?:确实|真的|有点)/.test(t),
|
|
347
|
-
)
|
|
348
|
-
)
|
|
349
|
-
issues.push(
|
|
350
|
-
"这是复述加感叹的模板,不要只改标点或换同义词;用一句自己的态度回应,也可以很短",
|
|
351
|
-
);
|
|
352
363
|
// A substantial shared beginning is a useful signal, unlike repeated brief reactions.
|
|
353
364
|
const clean = (t) => t.replace(/[\s\p{P}\p{S}]/gu, "");
|
|
354
365
|
for (const text of texts) {
|
|
355
366
|
const t = clean(text);
|
|
356
367
|
if (
|
|
357
368
|
t.length >= 8 &&
|
|
369
|
+
!routineSocialReply(text, snapshot) &&
|
|
358
370
|
recent.filter((r) => clean(r).startsWith(t.slice(0, 5))).length >= 2
|
|
359
371
|
)
|
|
360
372
|
issues.push(
|