From 4f59524d2ab177ab9cd9f7f83b25eccf1fa7a3ad Mon Sep 17 00:00:00 2001 From: zh Date: Mon, 28 Sep 2026 20:30:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20=E6=B5=8B=E8=AF=95=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E4=BD=BF=E7=94=A8=E5=81=87=E5=BC=95=E6=93=8E=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E8=AF=BB=E6=9C=AC=E6=9C=BA=E7=9C=9F=E5=AE=9E=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 真引擎点亮后自动化测试开始真调模型(测试通过 startServer 默认读到 ~/.aps/config.json 里的密钥),verify 从 6 秒变成挂住。现在 StartOptions 支持显式 engine 覆盖,六个测试文件统一传 engine: 'fake';CI 再加 APS_ENGINE=fake 双保险。verify 恢复到 6 秒、60 条测试(59 通过 + 1 跳过)。 --- .github/workflows/ci.yml | 3 +++ scripts/core-invoke.test.mjs | 2 +- scripts/internal-tool-call.test.mjs | 2 +- scripts/m1-loop.test.mjs | 2 +- scripts/serve-client.test.mjs | 2 +- scripts/server-smoke.test.mjs | 2 +- scripts/storage.test.mjs | 2 +- server/index.ts | 9 ++++++--- 8 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d43bc6..ce4a784 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,9 @@ on: jobs: platform: runs-on: ubuntu-latest + env: + # 双保险:CI 里永远不走真引擎(测试自己也注入 fake,见 startServer 的 engine 参数) + APS_ENGINE: fake steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 diff --git a/scripts/core-invoke.test.mjs b/scripts/core-invoke.test.mjs index b474776..6eb5ab6 100644 --- a/scripts/core-invoke.test.mjs +++ b/scripts/core-invoke.test.mjs @@ -17,7 +17,7 @@ async function startPlatform(devProvider = true) { if (devProvider) process.env.APS_DEV_PROVIDER = '1'; else delete process.env.APS_DEV_PROVIDER; const { startServer } = await import('../server/dist/index.js'); - const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:' }); + const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', engine: 'fake' }); return server; } diff --git a/scripts/internal-tool-call.test.mjs b/scripts/internal-tool-call.test.mjs index cb77942..eb6de0b 100644 --- a/scripts/internal-tool-call.test.mjs +++ b/scripts/internal-tool-call.test.mjs @@ -10,7 +10,7 @@ import { test } from 'node:test'; async function startWithProvider() { process.env.APS_DEV_PROVIDER = '1'; const { startServer } = await import('../server/dist/index.js'); - const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:' }); + const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', engine: 'fake' }); const created = await fetch(`${server.url}/v1/sessions`, { method: 'POST', headers: { 'content-type': 'application/json' }, diff --git a/scripts/m1-loop.test.mjs b/scripts/m1-loop.test.mjs index bf718ec..f622423 100644 --- a/scripts/m1-loop.test.mjs +++ b/scripts/m1-loop.test.mjs @@ -23,7 +23,7 @@ test('假引擎发起工具调用,经 Core.invoke 到假 Provider 并把回执 ], }); - const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', runtime }); + const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', engine: 'fake', runtime }); try { const created = await fetch(`${server.url}/v1/sessions`, { method: 'POST', diff --git a/scripts/serve-client.test.mjs b/scripts/serve-client.test.mjs index 2237dbb..faf830d 100644 --- a/scripts/serve-client.test.mjs +++ b/scripts/serve-client.test.mjs @@ -16,7 +16,7 @@ test('平台服务托管客户端产物,且 API 不受影响', async () => { execFileSync('pnpm', ['--filter', '@aps/client-app', 'run', 'build'], { cwd: ROOT, stdio: 'pipe', shell: isWindows }); const { startServer } = await import('../server/dist/index.js'); - const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:' }); + const server = await startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', engine: 'fake' }); try { const page = await fetch(`${server.url}/`); assert.equal(page.status, 200, 'GET / 应返回客户端页面'); diff --git a/scripts/server-smoke.test.mjs b/scripts/server-smoke.test.mjs index 3b3eed9..dbf157e 100644 --- a/scripts/server-smoke.test.mjs +++ b/scripts/server-smoke.test.mjs @@ -31,7 +31,7 @@ async function validator() { async function startServer(options = {}) { const { startServer: start } = await import('../server/dist/index.js'); - return start({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', ...options }); + return start({ host: '127.0.0.1', port: 0, version: 'test', databasePath: ':memory:', engine: 'fake', ...options }); } const json = (method, body) => ({ method, headers: { 'content-type': 'application/json' }, body: JSON.stringify(body) }); diff --git a/scripts/storage.test.mjs b/scripts/storage.test.mjs index 5b763d2..533ee97 100644 --- a/scripts/storage.test.mjs +++ b/scripts/storage.test.mjs @@ -11,7 +11,7 @@ import { test } from 'node:test'; async function startWithDatabase(dbPath) { const { startServer } = await import('../server/dist/index.js'); - return startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: dbPath }); + return startServer({ host: '127.0.0.1', port: 0, version: 'test', databasePath: dbPath, engine: 'fake' }); } const postJson = (base, path, body) => diff --git a/server/index.ts b/server/index.ts index eb309b7..1e5495a 100644 --- a/server/index.ts +++ b/server/index.ts @@ -26,6 +26,8 @@ export interface StartOptions { runtime?: AgentRuntime; /** 数据库路径:默认取配置;测试传 ':memory:' 以隔离 */ databasePath?: string; + /** 引擎覆盖:测试必须传 'fake',避免读到本机的真实模型配置 */ + engine?: 'fake' | 'pi'; } export interface RunningServer { @@ -41,7 +43,7 @@ export async function startServer(options: StartOptions = {}): Promise 配置里的 engine.kind;选 pi 但没密钥时明确回退到假引擎 */ -async function selectRuntime(config: ReturnType): Promise { - if (config.engine.kind !== 'pi') { +async function selectRuntime(config: ReturnType, override?: 'fake' | 'pi'): Promise { + const kind = override ?? config.engine.kind; + if (kind !== 'pi') { const { createFakeRuntime } = await import('./agent/fake-runtime.js'); const { createRulePlanner, plannerToFakeTurn } = await import('./agent/rule-planner.js'); return createFakeRuntime({ name: 'fake', planner: plannerToFakeTurn(createRulePlanner()) });