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()) });