From daefc3f3fc6b7abe5d4bc00fbaf1165e2e5b93eb Mon Sep 17 00:00:00 2001 From: Ghislain LE MEUR Date: Mon, 11 May 2026 16:44:25 +0200 Subject: [PATCH] fix [name, options] syntax for transformers registered as instances When a config uses the array form `["TransformerName", { options }]`, ccr resolved the name then called `new` unconditionally. Built-in transformers without a `static TransformerName` (Anthropic, Gemini, OpenAI, Deepseek, ...) are registered as already-built instances, so the `new` threw `TypeError: o is not a constructor` and the provider silently failed to load. Detect whether the resolved transformer is a class (function) or an instance. For instances, build a fresh one via `.constructor` so the requested options take effect without mutating the shared instance. Applied to both `use` and model-specific `use` entries. --- packages/core/src/services/provider.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/core/src/services/provider.ts b/packages/core/src/services/provider.ts index aa08a2023..5da501191 100644 --- a/packages/core/src/services/provider.ts +++ b/packages/core/src/services/provider.ts @@ -45,9 +45,15 @@ export class ProviderService { if (Array.isArray(providerConfig.transformer.use)) { transformer.use = providerConfig.transformer.use.map((transformer) => { if (Array.isArray(transformer) && typeof transformer[0] === 'string') { - const Constructor = this.transformerService.getTransformer(transformer[0]); - if (Constructor) { - return new (Constructor as TransformerConstructor)(transformer[1]); + const resolved = this.transformerService.getTransformer(transformer[0]); + if (typeof resolved === 'function') { + return new (resolved as TransformerConstructor)(transformer[1]); + } + if (resolved) { + // Transformer was registered as an already-built instance + // (no `static TransformerName`). Re-instantiate via its + // constructor so the requested options take effect. + return new (resolved.constructor as TransformerConstructor)(transformer[1]); } } if (typeof transformer === 'string') { @@ -64,9 +70,12 @@ export class ProviderService { transformer[key] = { use: providerConfig.transformer[key].use.map((transformer) => { if (Array.isArray(transformer) && typeof transformer[0] === 'string') { - const Constructor = this.transformerService.getTransformer(transformer[0]); - if (Constructor) { - return new (Constructor as TransformerConstructor)(transformer[1]); + const resolved = this.transformerService.getTransformer(transformer[0]); + if (typeof resolved === 'function') { + return new (resolved as TransformerConstructor)(transformer[1]); + } + if (resolved) { + return new (resolved.constructor as TransformerConstructor)(transformer[1]); } } if (typeof transformer === 'string') {