/** * v0.3.0 冒烟:模型目录 / API key login-logout / setModel / 系统提示词 * 不打真实 LLM 请求;key 用假值(仅验证凭据写入与模型切换逻辑)。 */ import { createAgentSessionServices, createAgentSessionRuntime, createAgentSessionFromServices, getAgentDir, SessionManager } from '@earendil-works/pi-coding-agent' import { homedir } from 'node:os' import { readFileSync, writeFileSync, mkdtempSync } from 'node:fs' import { join } from 'node:path' import { tmpdir } from 'node:os' const cwd = homedir() const agentDir = getAgentDir() const services = await createAgentSessionServices({ cwd, agentDir }) const factory = async ({ cwd: nc, agentDir: na, sessionManager }) => { const svc = nc === services.cwd && na === services.agentDir ? services : await createAgentSessionServices({ cwd: nc, agentDir: na }) const result = await createAgentSessionFromServices({ services: svc, sessionManager }) return { ...result, services: svc, diagnostics: svc.diagnostics } } const runtime = await createAgentSessionRuntime(factory, { cwd, agentDir, sessionManager: SessionManager.continueRecent(cwd) }) const mr = runtime.session.modelRuntime // 1) 模型目录 const providers = mr.getProviders() console.log('[smoke3] providers:', providers.map((p) => p.id).join(', ')) const anthropic = providers.find((p) => p.id === 'anthropic') if (anthropic) { const models = mr.getModels('anthropic') console.log('[smoke3] anthropic models: %d (first: %s)', models.length, models[0]?.id) // 2) login(假 key)→ listCredentials const before = await mr.listCredentials() await mr.login('anthropic', 'api_key', { prompt: async () => 'sk-smoke-fake-key', notify: async () => undefined }) const after = await mr.listCredentials() console.log('[smoke3] credentials before=%d after=%d (anthropic=%s)', before.length, after.length, after.some((c) => c.providerId === 'anthropic' && c.type === 'api_key')) // auth.json 应包含 anthropic 条目 const auth = JSON.parse(readFileSync(join(agentDir, 'auth.json'), 'utf8')) console.log('[smoke3] auth.json has anthropic:', Boolean(auth.anthropic)) // 3) setModel(有凭据时允许) const target = models[0] await runtime.session.setModel(target, { persist: false }) console.log('[smoke3] setModel ok -> %s/%s', runtime.session.model?.provider, runtime.session.model?.id) // 4) logout await mr.logout('anthropic') const finalCreds = await mr.listCredentials() console.log('[smoke3] after logout, anthropic credential present:', finalCreds.some((c) => c.providerId === 'anthropic')) } else { console.log('[smoke3] anthropic not found in providers, skip key tests') } // 5) 系统提示词 override(独立 services,用 resourceLoaderOptions.systemPrompt) const tmp = mkdtempSync(join(tmpdir(), 'aso-smoke-')) const promptText = '你是冒烟测试助手。' const svc2 = await createAgentSessionServices({ cwd, agentDir, resourceLoaderOptions: { systemPrompt: promptText } }) console.log('[smoke3] systemPrompt applied:', svc2.resourceLoader ? 'services-created' : 'fail') const rt2 = await createAgentSessionFromServices({ services: svc2, sessionManager: SessionManager.inMemory(cwd) }) console.log('[smoke3] session systemPrompt startsWith expected:', rt2.session.systemPrompt.startsWith(promptText.slice(0, 8))) await runtime.dispose() writeFileSync(join(tmp, 'done'), '') console.log('[smoke3] done') process.exit(0)