diff --git a/server/src/modules/llm/providers/codex.provider.ts b/server/src/modules/llm/providers/codex.provider.ts index bbef1aef..f46c76e6 100644 --- a/server/src/modules/llm/providers/codex.provider.ts +++ b/server/src/modules/llm/providers/codex.provider.ts @@ -57,6 +57,8 @@ type CodexSdkModule = { * Codex SDK provider implementation. */ export class CodexProvider extends BaseSdkProvider { + private codexClientPromise: Promise | null = null; + constructor() { super('codex', { supportsRuntimePermissionRequests: false, @@ -111,8 +113,7 @@ export class CodexProvider extends BaseSdkProvider { stream: AsyncIterable; stop: () => Promise; }> { - const sdkModule = await this.loadCodexSdkModule(); - const client = new sdkModule.Codex(); + const client = await this.getCodexClient(); const threadOptions: Record = { model: input.model, @@ -139,6 +140,22 @@ export class CodexProvider extends BaseSdkProvider { }; } + /** + * Returns a shared Codex SDK client instance for this provider. + */ + private async getCodexClient(): Promise { + if (!this.codexClientPromise) { + this.codexClientPromise = this.loadCodexSdkModule() + .then((sdkModule) => new sdkModule.Codex()) + .catch((error) => { + this.codexClientPromise = null; + throw error; + }); + } + + return this.codexClientPromise; + } + /** * Builds Codex prompt items. Images are sent as `local_image` entries for SDK-native image support. */