Skip to content

[Fix] 稳定 prompt pick 选择结果#878

Merged
dingyi222666 merged 5 commits into
ChatLunaLab:v1-devfrom
liuwanwan1:fix/stable-pick-renderer
May 25, 2026
Merged

[Fix] 稳定 prompt pick 选择结果#878
dingyi222666 merged 5 commits into
ChatLunaLab:v1-devfrom
liuwanwan1:fix/stable-pick-renderer

Conversation

@liuwanwan1
Copy link
Copy Markdown
Contributor

关联 Issue

Fixes #877

问题

{pick(...)} 之前和 {random(...)} 一样每次渲染都走 Math.random(),同一会话中的系统提示、作者注记或用户提示可能在连续请求里选到不同分支,导致角色语气、称呼或提示词约束漂移。

修复内容

  • selectFromList 增加稳定种子参数。
  • pick 使用会话/对话上下文和候选列表生成 SHA-1 哈希,稳定映射到同一个候选值。
  • 保持 random 原有随机行为不变。
  • 增加 selectFromList 的稳定选择测试。

验证

  • COREPACK_HOME=/tmp/corepack corepack yarn fast-build shared-prompt-renderer
  • COREPACK_HOME=/tmp/corepack corepack yarn fast-build core
  • COREPACK_HOME=/tmp/corepack corepack yarn mocha -r tsconfig-paths/register -r esbuild-register -r yml-register --exit packages/core/tests/conversation-utils.spec.ts
  • COREPACK_HOME=/tmp/corepack corepack yarn eslint packages/core/src/services/prompt_renderer.ts packages/core/src/utils/string.ts

补充说明:全量 COREPACK_HOME=/tmp/corepack corepack yarn test 当前有 10 个既有失败,失败点在归档、回滚、测试桩和缺失的 extension-agent 文件路径;本次新增的 selectFromList 用例在全量输出和单文件测试中均通过。

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 24, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: bff95e75-391e-4bf4-9891-e3fa0fb8b893

📥 Commits

Reviewing files that changed from the base of the PR and between ff6455b and b91e21a.

📒 Files selected for processing (1)
  • packages/core/src/utils/string.ts

Walkthrough

将 {pick(...)} 从每次随机选择改为会话/种子感知的稳定选择:在 selectFromList 中加入可选 seed 并用 SHA‑1 哈希产生确定性索引;在 Prompt renderer 中根据 cfg 的 conversationId 传入 seed;相关测试已补充。

Changes

Pick 函数稳定选择

Layer / File(s) Summary
SHA-1 哈希稳定选择算法
packages/core/src/utils/string.ts, packages/core/tests/conversation-utils.spec.ts
selectFromList 新增可选 seed 参数;当 isPick 为真时对 ${seed}:${args} 计算 SHA‑1,并用 hash.readUInt32BE(0) % items.length 确定选择索引,取代 Math.random();新增测试验证在相同 seed 下结果稳定、不同 seed 下结果可变。
Prompt renderer 会话上下文集成
packages/core/src/services/prompt_renderer.ts, packages/core/tests/conversation-utils.spec.ts
ChatLunaPromptRenderService 中的 pick 内置函数改为接收 (args, _variables, cfg),并将 cfg?.conversationId ?? '' 作为 seed 传入 selectFromList;新增渲染测试覆盖未提供可配置项与提供 configurable.conversationId 两种情形。

Sequence Diagram

sequenceDiagram
  participant PromptRenderer
  participant PickFunction
  participant SelectFromList
  participant SHA1
  PromptRenderer->>PickFunction: call pick(args, _variables, cfg)
  PickFunction->>SelectFromList: selectFromList(args.join(','), true, cfg?.conversationId ?? '')
  SelectFromList->>SHA1: compute SHA-1(`${seed}:${args}`)
  SHA1->>SelectFromList: return hash bytes
  SelectFromList->>SelectFromList: idx = readUInt32BE(0) % items.length
  SelectFromList->>PromptRenderer: return selected item
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 兔子说:欢呼吧,pick 变稳了!
种子拼接会话名,哈希敲定取哪一格。
同一对话,选择不再跑偏;
不同会话,仍各自为政。
胡萝卜稳固,我也安然。

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed PR标题准确概括了主要改动:为pick函数实现稳定选择而非随机选择,与代码变更内容高度相关。
Description check ✅ Passed PR描述详细说明了问题、修复内容、测试验证步骤,与changeset直接相关,信息量充分。
Linked Issues check ✅ Passed 代码变更完整满足issue #877的所有需求:pick使用稳定种子实现确定性选择,random保持随机,包含完整测试覆盖。
Out of Scope Changes check ✅ Passed 所有代码变更均直接针对issue #877中pick稳定性问题,包括selectFromList参数扩展、pick处理器调用修改、测试用例补充,无范围外修改。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements stable selection for the pick function provider by introducing a seed-based hashing mechanism in selectFromList. The seed is derived from session and conversation metadata to ensure deterministic output. A critical issue was identified in prompt_renderer.ts where accessing properties on an optional configuration object could lead to runtime crashes; using optional chaining was suggested to mitigate this risk.

Comment thread packages/core/src/services/prompt_renderer.ts Outdated
@liuwanwan1
Copy link
Copy Markdown
Contributor Author

已根据 Gemini Code Assist 的建议补充处理:

  • pick 回调改为通过可选链读取 cfgvariables.built,避免无 render options 时运行时报错
  • 增加 prompt pick renders without configurable options 回归测试

本地验证:

  • COREPACK_HOME=/tmp/corepack corepack yarn mocha -r tsconfig-paths/register -r esbuild-register -r yml-register --exit packages/core/tests/conversation-utils.spec.ts(11 passing)
  • COREPACK_HOME=/tmp/corepack corepack yarn eslint packages/core/src/services/prompt_renderer.ts packages/core/src/utils/string.ts
  • COREPACK_HOME=/tmp/corepack corepack yarn fast-build core

Comment thread packages/core/src/services/prompt_renderer.ts Outdated
Comment thread packages/core/src/services/prompt_renderer.ts Outdated
@liuwanwan1
Copy link
Copy Markdown
Contributor Author

确实,这里原来的实现想得太宽了。

我已经把 seed 收敛到 configurable.conversationId,不再拼 session 上的一堆字段;那两个 as 也一起去掉了。现在逻辑会简单一些:有 conversationId 时按会话稳定选择,没有的话就按空 seed 稳定选择。

另外补了两个用例,覆盖无 configurable 和有 conversationId 的情况。本地单文件测试是 12 passing,fast-build core 和相关 eslint 也过了。

Comment thread packages/core/src/services/prompt_renderer.ts Outdated
@liuwanwan1
Copy link
Copy Markdown
Contributor Author

这个也改掉了:调用处不再 String(...),直接把 cfg?.conversationId ?? "" 传进去;selectFromList 这边接收 seed 后用模板字符串参与 hash。相关测试和 core build 也重新跑过了。

@liuwanwan1
Copy link
Copy Markdown
Contributor Author

大佬我先睡啦,早点休息

@dingyi222666
Copy link
Copy Markdown
Member

A conversation must be resolved before this pull request can be merged.
Commits must have verified signatures. 你让 codex 给你配个 git 签名,重新 rebase 全部签名,push -f

@liuwanwan1
Copy link
Copy Markdown
Contributor Author

A conversation must be resolved before this pull request can be merged.
Commits must have verified signatures. 你让 codex 给你配个 git 签名,重新 rebase 全部签名,push -f

好的佬,我明天中午做

@liuwanwan1 liuwanwan1 force-pushed the fix/stable-pick-renderer branch from 83bc1f9 to ff6455b Compare May 25, 2026 05:01
@liuwanwan1
Copy link
Copy Markdown
Contributor Author

已处理:

  • 配置了 SSH git 签名,并把签名公钥加到了 GitHub signing keys
  • 基于最新 upstream/v1-dev 重新 rebase 了 PR 的 4 个提交,全部已带 verified signature
  • 已 force push 到 fix/stable-pick-renderer
  • 之前的 3 个 review conversations 也已 resolve

当前 GitHub API 显示 4 个 commit verification 都是 valid

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/utils/string.ts`:
- Around line 320-324: Change the selectFromList signature to require seed be a
string (not unknown) so the function contract matches actual usage; update the
parameter in the export of selectFromList (the seed parameter default can remain
''), and adjust any callers or tests if they were passing non-strings so they
cast/convert to string before calling; this makes the template literal
`${seed}:${args}` type-safe and clearer in the selectFromList function.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5b54039d-5459-4904-8a21-85b2ac605bb1

📥 Commits

Reviewing files that changed from the base of the PR and between add62ba and ff6455b.

📒 Files selected for processing (3)
  • packages/core/src/services/prompt_renderer.ts
  • packages/core/src/utils/string.ts
  • packages/core/tests/conversation-utils.spec.ts

Comment thread packages/core/src/utils/string.ts
@dingyi222666 dingyi222666 merged commit 5d23e50 into ChatLunaLab:v1-dev May 25, 2026
2 checks passed
@dingyi222666
Copy link
Copy Markdown
Member

等下次版本发布的时候会跟着一起发的!建议多测一下 1.4 alpha 的 bug,稳定了我们直接发正式版了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] {pick(...)} 在同一会话内每次渲染都会随机变化

2 participants