From 021284b852fd799d62e6639ba27a0dd8d84ae166 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 14 Aug 2026 12:44:54 +0800 Subject: [PATCH] =?UTF-8?q?test(=E5=86=92=E7=85=99=E6=B8=AC=E8=A9=A6):=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20F/J=20=E7=BE=A4=E7=B5=84=E5=86=92=E7=85=99?= =?UTF-8?q?=E6=B8=AC=E8=A9=A6=E4=BB=A5=E6=B6=B5=E8=93=8B=20llm/=E8=A8=98?= =?UTF-8?q?=E6=86=B6=E5=BF=AB=E5=8F=96=E6=96=B0=E8=A1=8C=E7=82=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/smoke/F.mjs | 19 ++++++++++++------- scripts/smoke/J.mjs | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/scripts/smoke/F.mjs b/scripts/smoke/F.mjs index 44bb093..11b15a7 100644 --- a/scripts/smoke/F.mjs +++ b/scripts/smoke/F.mjs @@ -136,14 +136,18 @@ export default async function smokeF() { // 清理本次測試建立的 ProceduralRule,避免重複執行時累積髒資料 await prisma.proceduralRule.deleteMany({ where: { characterId: CHARACTER_ID, situation } }); - // F-2 Provider 切換:LLM_PROVIDER=claude 時啟動即以 ERR log 明確告知未實作,呼叫時拋出例外 - await verifyClaudeProviderStub(); + // R-3:ClaudeProvider 已經是真的呼叫,不再是空殼。這裡只驗證 Provider 切換的「配線」本身 + // (選對了 ClaudeProvider、缺金鑰時的錯誤處理正確),不對 CLIProxy 發真的請求——真正的 + // 回歸測試基準仍是 Mock 模板庫(同 R-3 驗收註記),自動化冒煙測試不應依賴外部服務目前是否可用。 + await verifyClaudeProviderWiring(); } -async function verifyClaudeProviderStub() { +async function verifyClaudeProviderWiring() { const port = "3091"; + const childEnv = { ...process.env, PORT: port, LLM_PROVIDER: "claude" }; + delete childEnv.CLAUDE_API_KEY; const child = spawn("node", ["apps/api/dist/main.js"], { - env: { ...process.env, PORT: port, LLM_PROVIDER: "claude" }, + env: childEnv, stdio: ["ignore", "pipe", "pipe"], }); @@ -156,8 +160,8 @@ async function verifyClaudeProviderStub() { while (!output.includes("啟動") && Date.now() < deadline) { await new Promise((resolve) => setTimeout(resolve, 200)); } - if (!output.includes("ClaudeProvider 尚未實作")) { - throw new Error("LLM_PROVIDER=claude 啟動時未輸出「尚未實作」的 ERR log"); + if (!output.includes("LLM_PROVIDER=claude")) { + throw new Error("LLM_PROVIDER=claude 啟動時未輸出對應的 INF log"); } let healthOk = false; @@ -182,8 +186,9 @@ async function verifyClaudeProviderStub() { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId: USER_ID, text: "今天發生了很多事情想跟你分享" }), }); + // 沒有金鑰應該在呼叫 generate() 時就快速、確定性地失敗(不對 CLIProxy 發任何請求)。 if (res.status < 500) { - throw new Error(`ClaudeProvider 空殼應在呼叫 generate() 時失敗,實際回傳 ${res.status}`); + throw new Error(`缺少 CLAUDE_API_KEY 時應該呼叫失敗,實際回傳 ${res.status}`); } } finally { child.kill("SIGKILL"); diff --git a/scripts/smoke/J.mjs b/scripts/smoke/J.mjs index d623003..e87dde1 100644 --- a/scripts/smoke/J.mjs +++ b/scripts/smoke/J.mjs @@ -225,7 +225,7 @@ export default async function smokeJ() { }); const { spawnSync } = await import("node:child_process"); - const restartResult = spawnSync("npm", ["run", "restart"], { cwd: process.cwd(), stdio: "pipe" }); + const restartResult = spawnSync("pnpm", ["run", "restart"], { cwd: process.cwd(), stdio: "pipe" }); if (restartResult.status !== 0) { throw new Error(`重啟服務失敗:${restartResult.stderr?.toString()}`); }