Просмотр исходного кода

test(b56): 189 派发通道根因定位(缺 LLM 凭证)+ 客户端触发流程修复(_dispatch_189.cjs)

E2E Test Bot 4 дней назад
Родитель
Сommit
736d7f9a17
2 измененных файлов с 75 добавлено и 0 удалено
  1. 75 0
      _dispatch_189.cjs
  2. 0 0
      docs/tdd/test/blockers.md

+ 75 - 0
_dispatch_189.cjs

@@ -0,0 +1,75 @@
+// 189 派发客户端(修正版)—— 修复 B-56 客户端侧缺陷,使 189 通道在凭证就绪后即可用
+//
+// 根因之一(客户端):旧脚本(_dispatch_r91.cjs 等)在 POST /api/session 时把 prompt 嵌进 body
+//   并假设 opencode 建会话后自动运行 agent。实测 189 的 opencode 不会自动运行(session 创建后
+//   outcome 停在初始态,无 assistant 产出)。正确触发流程是:
+//     ① POST /api/session            建会话(返回 data.id)
+//     ② POST /api/session/{id}/prompt 经 {text:"..."} 触发 agent 运行(注意字段是 text,不是 prompt)
+//     ③ 轮询 GET /api/session/{id}   取 outcome(success / failed)
+//
+// 用法:
+//   OPENCODE_SERVER_PASSWORD='IwinTrue@123' node _dispatch_189.cjs "在此写要执行的命令/任务"
+//
+// 注意:189 当前(R93 实测)opencode 所有模型调用均 outcome=failed,根因是 189 节点
+//   C:\Users\Administrator\.config\opencode\opencode.json 中 agnes/sensenova/axon 均无 apiKey,
+//   且 opencode-free 模型需账号授权 —— 即无任一可用 LLM 后端。该问题需运维在 189 本机
+//   配置 API Key 并重启 opencode 后方可解决(SSH 22 当前 refused,无法远程处置)。
+//   本客户端只负责把「触发流程」修对;凭证就绪后本文件即可直接派发 admin 浏览器套件。
+
+const BASE = process.env.OPENCODE_189_BASE || 'http://192.168.16.189:4090';
+const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || '')).toString('base64');
+const MODEL = {
+  id: process.env.OPENCODE_MODEL || 'deepseek3.2',
+  providerID: process.env.OPENCODE_PROVIDER || 'axon',
+};
+const PROJECT_ID = '527b7036bd8d16188784528603a9b79a1d95c9fb';
+
+async function dispatch(promptText, timeoutMs = 4 * 60 * 1000) {
+  // ① 建会话
+  const cr = await fetch(BASE + '/api/session', {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json', 'Authorization': AUTH },
+    body: JSON.stringify({ title: 'dispatch-' + Date.now(), model: MODEL, projectID: PROJECT_ID }),
+  });
+  const cj = await cr.json().catch(() => ({}));
+  const sid = (cj.data && cj.data.id) || cj.id;
+  if (!sid) throw new Error('create session failed: ' + JSON.stringify(cj).slice(0, 200));
+  console.log('SESSION_ID', sid);
+
+  // ② 正确触发 agent:POST /prompt,body 字段是 text
+  const pr = await fetch(BASE + '/api/session/' + sid + '/prompt', {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json', 'Authorization': AUTH },
+    body: JSON.stringify({ text: promptText }),
+  });
+  console.log('PROMPT', pr.status, (await pr.text()).slice(0, 200));
+
+  // ③ 轮询 outcome
+  const start = Date.now();
+  let last = '?';
+  while (Date.now() - start < timeoutMs) {
+    await new Promise(r => setTimeout(r, 5000));
+    const q = await fetch(BASE + '/api/session/' + sid, { headers: { 'Authorization': AUTH } });
+    const j = await q.json().catch(() => null);
+    const outcome = (j && (j.data && j.data.outcome || j.outcome)) || '?';
+    if (outcome !== last) { console.log('OUTCOME', outcome); last = outcome; }
+    if (outcome === 'success') return { sid, outcome: 'success' };
+    if (outcome === 'failed') return { sid, outcome: 'failed' };
+  }
+  return { sid, outcome: 'timeout' };
+}
+
+(async () => {
+  const prompt = process.argv[2] || '请只执行命令 `node -v` 并把 stdout 原样返回。';
+  if (!process.env.OPENCODE_SERVER_PASSWORD) {
+    console.error('ERROR: 需设置环境变量 OPENCODE_SERVER_PASSWORD');
+    process.exit(2);
+  }
+  try {
+    const r = await dispatch(prompt);
+    console.log('RESULT', JSON.stringify(r));
+  } catch (e) {
+    console.error('DISPATCH_ERROR', e.message);
+    process.exit(1);
+  }
+})();

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
docs/tdd/test/blockers.md


Некоторые файлы не были показаны из-за большого количества измененных файлов