diff --git a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts index 90ebc3f8b..1c834b7c9 100644 --- a/src/backend/drivers/ai-chat/ChatCompletionDriver.ts +++ b/src/backend/drivers/ai-chat/ChatCompletionDriver.ts @@ -216,10 +216,22 @@ export class ChatCompletionDriver extends PuterDriver { #providers: Record = {}; #modelIdMap: Record = {}; + #modelMapReady: Promise = Promise.resolve(); override onServerStart() { this.#registerProviders(); - this.#buildModelMap(); + // Not awaited — providers fetch model lists over the network and + // boot must not block on their latency. Shutdown awaits the + // tracked promise so provider I/O (and its error logging) never + // outlives the server; a rejection here must not become an + // unhandled one. + this.#modelMapReady = this.#buildModelMap().catch((e) => { + console.error('Failed to build ai-chat model map:', e); + }); + } + + override async onServerShutdown() { + await this.#modelMapReady; } // -- Interface methods ------------------------------------------- diff --git a/src/backend/testUtil.ts b/src/backend/testUtil.ts index a6cf752f2..7373e488d 100644 --- a/src/backend/testUtil.ts +++ b/src/backend/testUtil.ts @@ -153,6 +153,9 @@ export const setupTestServer = async ( no_devwatch: true, no_browser_launch: true, import_ts_extensions: true, + // No local-Ollama auto-discovery: every test server would + // otherwise fire a doomed model-list fetch at localhost. + providers: { ollama: { enabled: false } }, }), configOverrides ?? {}, ) as IConfig;