braintrust-lite 0.1.9 → 0.1.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braintrust-lite",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Multi-model AI consultation MCP for Claude Code — runs Claude, Codex, and Gemini in parallel for Judge-style synthesis",
5
5
  "bin": {
6
6
  "braintrust-lite": "src/server.js",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: consult
3
- version: 1.4.0
3
+ version: 1.5.1
4
4
  description: 在处理规划/设计/架构/调研类任务时,并发调用 codex + gemini + claude 获取多视角,主 Claude 担任 Judge 盲评综合输出。支持渐进式多轮对话和自动更新。
5
5
  ---
6
6
 
@@ -71,14 +71,23 @@ curl -fsSL "https://raw.githubusercontent.com/HongjieRen/braintrust/main/skills/
71
71
 
72
72
  ### Judge 输出格式(必须分节,供多轮渐进加载)
73
73
 
74
- 每轮 Judge 输出**强制使用以下四节**,不可合并:
74
+ 每轮 Judge 输出**强制使用以下五节**,不可合并、不可省略:
75
75
 
76
76
  ```
77
+ ### PERSPECTIVES
78
+ 每个模型的核心立场,**逐模型列出**,不可合并,不可说"各模型均认为":
79
+ - **Model A**:[该模型最核心的2-3个主张 / 独特视角,用具体措辞引用原文观点]
80
+ - **Model B**:[同上]
81
+ - **Model C**:[同上]
82
+
77
83
  ### VERDICT
78
- <核心结论,1-3句,永远保留进历史>
84
+ <核心结论,1-3句。必须说明你采纳了哪个模型的哪个观点,以及理由>
79
85
 
80
86
  ### REASONING
81
- <关键推理和裁决依据,有追问才加载>
87
+ <深度推理。强制要求:
88
+ 1. 至少引用2处模型间的具体分歧或差异("Model A 认为X,Model B 认为Y,两者差异在于...")
89
+ 2. 对每个关键判断说明为什么选A而不选B/C(不允许只说"综合来看")
90
+ 3. 如果三模型观点一致,必须挖掘细节差异,或标注"三模型在X点上高度一致,其共同理由是...">
82
91
 
83
92
  ### TRADEOFFS
84
93
  <权衡分析、已排除方案及理由,用户问"有没有其他方案"时加载>
@@ -87,6 +96,8 @@ curl -fsSL "https://raw.githubusercontent.com/HongjieRen/braintrust/main/skills/
87
96
  <未解决的分歧或待确认的假设,用户问"还有什么不确定"时加载>
88
97
  ```
89
98
 
99
+ **PERSPECTIVES 的写法原则**:逐字从模型原文中提炼,不要意译或合并。如果 Model A 说"用 Redis 做 session",就写"用 Redis 做 session",不要写"推荐缓存方案"。
100
+
90
101
  ---
91
102
 
92
103
  ## 工作流:多轮对话(会话模式)
@@ -166,7 +177,10 @@ Current best: <当前推荐方案一句话>
166
177
  !deep 切换到完整记忆(带最近1轮 REASONING + TRADEOFFS,适合复杂设计)
167
178
  /done 退出 Consult 会话模式(!stop 同效)
168
179
  !deltas 展开本轮三模型核心主张各一句(不显示原文全文)
169
- !raw 展开本轮三模型完整原始回答
180
+ !raw 旁路展示本轮三模型原文(使用 REVEAL 映射表替换为真实模型名)。
181
+ 约束:① 不重新调用 consult,仅复用主 Claude 已持有的本轮回答;
182
+ ② 不推进 R{N},不更新 Session State,不写入 Decisions/Open;
183
+ ③ 展示完即结束本次响应,下一轮 follow-up 仍按原 Session State 继续。
170
184
  ```
171
185
 
172
186
  ---
@@ -179,9 +193,13 @@ only (可选) "codex" | "gemini" | "claude" — 只调用一个
179
193
  skip (可选) ["codex"] | ["gemini"] | ["claude"] — 跳过某个
180
194
  timeout_sec (可选) 每个模型超时秒数,默认 90;传 0 = 不限时等待完成
181
195
  blind (可选) 默认 true;传 false 可直接看真实模型名称
196
+ show_raw (可选) 默认 false;传 true = 直接展示三模型原始回答,跳过 Judge 融合
182
197
  cwd (可选) 子进程工作目录
183
198
  ```
184
199
 
200
+ **`show_raw: true` 使用场景**:终端 CLI 或独立一次性查询。
201
+ **注**:主 Claude 在 `/consult` 多轮场景中**不要**主动设置 `show_raw: true`;用户想看原文时用 `!raw` 控制命令(旁路展示、不污染会话)。
202
+
185
203
  ## timeout 选择策略
186
204
 
187
205
  **你(主 Claude)负责决定 timeout_sec:**
package/src/server.js CHANGED
@@ -95,6 +95,11 @@ const CONSULT_TOOL = {
95
95
  description: '匿名化模型名称为 A/B/C,防止位置偏置(默认 true)',
96
96
  default: true,
97
97
  },
98
+ show_raw: {
99
+ type: 'boolean',
100
+ description: '直接返回三模型原始回答,不经过 Judge 融合(默认 false)。适合想自己阅读原文的场景。',
101
+ default: false,
102
+ },
98
103
  cwd: {
99
104
  type: 'string',
100
105
  description: '子进程工作目录(默认:当前进程 cwd)',
@@ -127,6 +132,7 @@ async function handleConsult(args) {
127
132
  only,
128
133
  timeout_sec = DEFAULT_TIMEOUT_S,
129
134
  blind = true,
135
+ show_raw = false,
130
136
  cwd,
131
137
  } = args;
132
138
 
@@ -170,7 +176,22 @@ async function handleConsult(args) {
170
176
 
171
177
  const successCount = results.filter(r => !r.error).length;
172
178
 
173
- // Build labeled pairs
179
+ // show_raw mode: reveal model names, skip blind labeling, skip REVEAL footer
180
+ if (show_raw) {
181
+ const parts = [];
182
+ for (const r of results) {
183
+ const timing = r.error
184
+ ? ` ⚠ ${r.error_type || r.error}`
185
+ : ` (${(r.duration_ms / 1000).toFixed(1)}s)`;
186
+ parts.push(`## ${r.provider.toUpperCase()}${timing}\n\n${r.content || '[no output]'}`);
187
+ }
188
+ if (successCount < activeProviders.length) {
189
+ parts.push(`> ⚠ **DEGRADED**: Only ${successCount}/${activeProviders.length} models responded.`);
190
+ }
191
+ return { content: [{ type: 'text', text: parts.join('\n\n---\n\n') }] };
192
+ }
193
+
194
+ // Build labeled pairs (blind mode for Judge workflow)
174
195
  const labeled = blind
175
196
  ? assignBlindLabels(results)
176
197
  : results.map(r => ({ label: r.provider, result: r }));