@contractspec/lib.ai-providers 2.9.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/legacy.js CHANGED
@@ -160,11 +160,23 @@ var MODELS = [
160
160
  },
161
161
  costPerMillion: { input: 2, output: 6 }
162
162
  },
163
+ {
164
+ id: "mistral-medium-latest",
165
+ name: "Mistral Medium",
166
+ provider: "mistral",
167
+ contextWindow: 128000,
168
+ capabilities: {
169
+ vision: false,
170
+ tools: true,
171
+ reasoning: false,
172
+ streaming: true
173
+ }
174
+ },
163
175
  {
164
176
  id: "codestral-latest",
165
177
  name: "Codestral",
166
178
  provider: "mistral",
167
- contextWindow: 32000,
179
+ contextWindow: 256000,
168
180
  capabilities: {
169
181
  vision: false,
170
182
  tools: true,
@@ -173,6 +185,42 @@ var MODELS = [
173
185
  },
174
186
  costPerMillion: { input: 0.2, output: 0.6 }
175
187
  },
188
+ {
189
+ id: "devstral-small-latest",
190
+ name: "Devstral Small",
191
+ provider: "mistral",
192
+ contextWindow: 128000,
193
+ capabilities: {
194
+ vision: false,
195
+ tools: true,
196
+ reasoning: true,
197
+ streaming: true
198
+ }
199
+ },
200
+ {
201
+ id: "magistral-medium-latest",
202
+ name: "Magistral Medium",
203
+ provider: "mistral",
204
+ contextWindow: 128000,
205
+ capabilities: {
206
+ vision: false,
207
+ tools: true,
208
+ reasoning: true,
209
+ streaming: true
210
+ }
211
+ },
212
+ {
213
+ id: "pixtral-large-latest",
214
+ name: "Pixtral Large",
215
+ provider: "mistral",
216
+ contextWindow: 128000,
217
+ capabilities: {
218
+ vision: true,
219
+ tools: true,
220
+ reasoning: false,
221
+ streaming: true
222
+ }
223
+ },
176
224
  {
177
225
  id: "mistral-small-latest",
178
226
  name: "Mistral Small",
@@ -241,22 +289,30 @@ function getDefaultModel(provider) {
241
289
  }
242
290
 
243
291
  // src/factory.ts
244
- import { anthropic } from "@ai-sdk/anthropic";
245
- import { google } from "@ai-sdk/google";
246
- import { mistral } from "@ai-sdk/mistral";
247
- import { openai } from "@ai-sdk/openai";
248
- import { ollama } from "ollama-ai-provider";
292
+ import { createAnthropic } from "@ai-sdk/anthropic";
293
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
294
+ import { createMistral } from "@ai-sdk/mistral";
295
+ import { createOpenAI } from "@ai-sdk/openai";
296
+ import { createOllama } from "ollama-ai-provider";
249
297
  class BaseProvider {
250
298
  name;
251
299
  model;
252
300
  mode;
253
301
  config;
302
+ transport;
303
+ authMethod;
304
+ apiVersion;
305
+ customHeaders;
254
306
  cachedModel = null;
255
307
  constructor(config) {
256
308
  this.name = config.provider;
257
309
  this.model = config.model ?? DEFAULT_MODELS[config.provider];
258
310
  this.mode = this.determineMode(config);
259
311
  this.config = config;
312
+ this.transport = config.transport;
313
+ this.authMethod = config.authMethod;
314
+ this.apiVersion = config.apiVersion;
315
+ this.customHeaders = config.customHeaders;
260
316
  }
261
317
  getModel() {
262
318
  if (!this.cachedModel) {
@@ -296,81 +352,33 @@ class BaseProvider {
296
352
  return "managed";
297
353
  }
298
354
  createModel() {
299
- const { baseUrl, proxyUrl } = this.config;
355
+ const { baseUrl, proxyUrl, apiKey } = this.config;
356
+ const headers = this.customHeaders;
357
+ if (this.name === "ollama") {
358
+ const provider = createOllama({ baseURL: baseUrl, headers });
359
+ return provider(this.model);
360
+ }
361
+ if (this.mode === "managed" && proxyUrl) {
362
+ const provider = createOpenAI({ baseURL: proxyUrl, apiKey, headers });
363
+ return provider(this.model);
364
+ }
300
365
  switch (this.name) {
301
- case "ollama": {
302
- const originalBaseUrl = process.env.OLLAMA_BASE_URL;
303
- if (baseUrl && baseUrl !== "http://localhost:11434") {
304
- process.env.OLLAMA_BASE_URL = baseUrl;
305
- }
306
- const ollamaModel = ollama(this.model);
307
- if (originalBaseUrl !== undefined) {
308
- process.env.OLLAMA_BASE_URL = originalBaseUrl;
309
- } else if (baseUrl && baseUrl !== "http://localhost:11434") {
310
- delete process.env.OLLAMA_BASE_URL;
311
- }
312
- return ollamaModel;
366
+ case "openai": {
367
+ const provider = createOpenAI({ apiKey, headers });
368
+ return provider(this.model);
369
+ }
370
+ case "anthropic": {
371
+ const provider = createAnthropic({ apiKey, headers });
372
+ return provider(this.model);
373
+ }
374
+ case "mistral": {
375
+ const provider = createMistral({ apiKey, headers });
376
+ return provider(this.model);
377
+ }
378
+ case "gemini": {
379
+ const provider = createGoogleGenerativeAI({ apiKey, headers });
380
+ return provider(this.model);
313
381
  }
314
- case "openai":
315
- if (this.mode === "managed") {
316
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
317
- if (proxyUrl) {
318
- process.env.OPENAI_BASE_URL = proxyUrl;
319
- }
320
- const model = openai(this.model);
321
- if (originalBaseUrl !== undefined) {
322
- process.env.OPENAI_BASE_URL = originalBaseUrl;
323
- } else if (proxyUrl) {
324
- delete process.env.OPENAI_BASE_URL;
325
- }
326
- return model;
327
- }
328
- return openai(this.model);
329
- case "anthropic":
330
- if (this.mode === "managed") {
331
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
332
- if (proxyUrl) {
333
- process.env.OPENAI_BASE_URL = proxyUrl;
334
- }
335
- const model = openai(this.model);
336
- if (originalBaseUrl !== undefined) {
337
- process.env.OPENAI_BASE_URL = originalBaseUrl;
338
- } else if (proxyUrl) {
339
- delete process.env.OPENAI_BASE_URL;
340
- }
341
- return model;
342
- }
343
- return anthropic(this.model);
344
- case "mistral":
345
- if (this.mode === "managed") {
346
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
347
- if (proxyUrl) {
348
- process.env.OPENAI_BASE_URL = proxyUrl;
349
- }
350
- const model = openai(this.model);
351
- if (originalBaseUrl !== undefined) {
352
- process.env.OPENAI_BASE_URL = originalBaseUrl;
353
- } else if (proxyUrl) {
354
- delete process.env.OPENAI_BASE_URL;
355
- }
356
- return model;
357
- }
358
- return mistral(this.model);
359
- case "gemini":
360
- if (this.mode === "managed") {
361
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
362
- if (proxyUrl) {
363
- process.env.OPENAI_BASE_URL = proxyUrl;
364
- }
365
- const model = openai(this.model);
366
- if (originalBaseUrl !== undefined) {
367
- process.env.OPENAI_BASE_URL = originalBaseUrl;
368
- } else if (proxyUrl) {
369
- delete process.env.OPENAI_BASE_URL;
370
- }
371
- return model;
372
- }
373
- return google(this.model);
374
382
  default:
375
383
  throw new Error(`Unknown provider: ${this.name}`);
376
384
  }
@@ -452,13 +460,17 @@ function createProviderFromEnv() {
452
460
  case "ollama":
453
461
  break;
454
462
  }
463
+ const transport = process.env.CONTRACTSPEC_AI_TRANSPORT;
464
+ const apiVersion = process.env.CONTRACTSPEC_AI_API_VERSION;
455
465
  return createProvider({
456
466
  provider,
457
467
  model,
458
468
  apiKey,
459
469
  baseUrl: process.env.OLLAMA_BASE_URL,
460
470
  proxyUrl: process.env.CONTRACTSPEC_AI_PROXY_URL,
461
- organizationId: process.env.CONTRACTSPEC_ORG_ID
471
+ organizationId: process.env.CONTRACTSPEC_ORG_ID,
472
+ transport,
473
+ apiVersion
462
474
  });
463
475
  }
464
476
  function getAvailableProviders() {
@@ -466,35 +478,45 @@ function getAvailableProviders() {
466
478
  providers.push({
467
479
  provider: "ollama",
468
480
  available: true,
469
- mode: "local"
481
+ mode: "local",
482
+ transports: ["rest", "sdk"],
483
+ authMethods: []
470
484
  });
471
485
  const openaiKey = process.env.OPENAI_API_KEY;
472
486
  providers.push({
473
487
  provider: "openai",
474
488
  available: Boolean(openaiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
475
489
  mode: openaiKey ? "byok" : "managed",
476
- reason: !openaiKey ? "Set OPENAI_API_KEY for BYOK mode" : undefined
490
+ reason: !openaiKey ? "Set OPENAI_API_KEY for BYOK mode" : undefined,
491
+ transports: ["rest", "sdk"],
492
+ authMethods: ["api-key"]
477
493
  });
478
494
  const anthropicKey = process.env.ANTHROPIC_API_KEY;
479
495
  providers.push({
480
496
  provider: "anthropic",
481
497
  available: Boolean(anthropicKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
482
498
  mode: anthropicKey ? "byok" : "managed",
483
- reason: !anthropicKey ? "Set ANTHROPIC_API_KEY for BYOK mode" : undefined
499
+ reason: !anthropicKey ? "Set ANTHROPIC_API_KEY for BYOK mode" : undefined,
500
+ transports: ["rest", "sdk"],
501
+ authMethods: ["api-key"]
484
502
  });
485
503
  const mistralKey = process.env.MISTRAL_API_KEY;
486
504
  providers.push({
487
505
  provider: "mistral",
488
506
  available: Boolean(mistralKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
489
507
  mode: mistralKey ? "byok" : "managed",
490
- reason: !mistralKey ? "Set MISTRAL_API_KEY for BYOK mode" : undefined
508
+ reason: !mistralKey ? "Set MISTRAL_API_KEY for BYOK mode" : undefined,
509
+ transports: ["rest", "sdk"],
510
+ authMethods: ["api-key"]
491
511
  });
492
512
  const geminiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;
493
513
  providers.push({
494
514
  provider: "gemini",
495
515
  available: Boolean(geminiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
496
516
  mode: geminiKey ? "byok" : "managed",
497
- reason: !geminiKey ? "Set GOOGLE_API_KEY for BYOK mode" : undefined
517
+ reason: !geminiKey ? "Set GOOGLE_API_KEY for BYOK mode" : undefined,
518
+ transports: ["rest", "sdk"],
519
+ authMethods: ["api-key"]
498
520
  });
499
521
  return providers;
500
522
  }
package/dist/models.js CHANGED
@@ -160,11 +160,23 @@ var MODELS = [
160
160
  },
161
161
  costPerMillion: { input: 2, output: 6 }
162
162
  },
163
+ {
164
+ id: "mistral-medium-latest",
165
+ name: "Mistral Medium",
166
+ provider: "mistral",
167
+ contextWindow: 128000,
168
+ capabilities: {
169
+ vision: false,
170
+ tools: true,
171
+ reasoning: false,
172
+ streaming: true
173
+ }
174
+ },
163
175
  {
164
176
  id: "codestral-latest",
165
177
  name: "Codestral",
166
178
  provider: "mistral",
167
- contextWindow: 32000,
179
+ contextWindow: 256000,
168
180
  capabilities: {
169
181
  vision: false,
170
182
  tools: true,
@@ -173,6 +185,42 @@ var MODELS = [
173
185
  },
174
186
  costPerMillion: { input: 0.2, output: 0.6 }
175
187
  },
188
+ {
189
+ id: "devstral-small-latest",
190
+ name: "Devstral Small",
191
+ provider: "mistral",
192
+ contextWindow: 128000,
193
+ capabilities: {
194
+ vision: false,
195
+ tools: true,
196
+ reasoning: true,
197
+ streaming: true
198
+ }
199
+ },
200
+ {
201
+ id: "magistral-medium-latest",
202
+ name: "Magistral Medium",
203
+ provider: "mistral",
204
+ contextWindow: 128000,
205
+ capabilities: {
206
+ vision: false,
207
+ tools: true,
208
+ reasoning: true,
209
+ streaming: true
210
+ }
211
+ },
212
+ {
213
+ id: "pixtral-large-latest",
214
+ name: "Pixtral Large",
215
+ provider: "mistral",
216
+ contextWindow: 128000,
217
+ capabilities: {
218
+ vision: true,
219
+ tools: true,
220
+ reasoning: false,
221
+ streaming: true
222
+ }
223
+ },
176
224
  {
177
225
  id: "mistral-small-latest",
178
226
  name: "Mistral Small",
@@ -0,0 +1 @@
1
+ export {};
@@ -159,11 +159,23 @@ var MODELS = [
159
159
  },
160
160
  costPerMillion: { input: 2, output: 6 }
161
161
  },
162
+ {
163
+ id: "mistral-medium-latest",
164
+ name: "Mistral Medium",
165
+ provider: "mistral",
166
+ contextWindow: 128000,
167
+ capabilities: {
168
+ vision: false,
169
+ tools: true,
170
+ reasoning: false,
171
+ streaming: true
172
+ }
173
+ },
162
174
  {
163
175
  id: "codestral-latest",
164
176
  name: "Codestral",
165
177
  provider: "mistral",
166
- contextWindow: 32000,
178
+ contextWindow: 256000,
167
179
  capabilities: {
168
180
  vision: false,
169
181
  tools: true,
@@ -172,6 +184,42 @@ var MODELS = [
172
184
  },
173
185
  costPerMillion: { input: 0.2, output: 0.6 }
174
186
  },
187
+ {
188
+ id: "devstral-small-latest",
189
+ name: "Devstral Small",
190
+ provider: "mistral",
191
+ contextWindow: 128000,
192
+ capabilities: {
193
+ vision: false,
194
+ tools: true,
195
+ reasoning: true,
196
+ streaming: true
197
+ }
198
+ },
199
+ {
200
+ id: "magistral-medium-latest",
201
+ name: "Magistral Medium",
202
+ provider: "mistral",
203
+ contextWindow: 128000,
204
+ capabilities: {
205
+ vision: false,
206
+ tools: true,
207
+ reasoning: true,
208
+ streaming: true
209
+ }
210
+ },
211
+ {
212
+ id: "pixtral-large-latest",
213
+ name: "Pixtral Large",
214
+ provider: "mistral",
215
+ contextWindow: 128000,
216
+ capabilities: {
217
+ vision: true,
218
+ tools: true,
219
+ reasoning: false,
220
+ streaming: true
221
+ }
222
+ },
175
223
  {
176
224
  id: "mistral-small-latest",
177
225
  name: "Mistral Small",
@@ -240,22 +288,30 @@ function getDefaultModel(provider) {
240
288
  }
241
289
 
242
290
  // src/factory.ts
243
- import { anthropic } from "@ai-sdk/anthropic";
244
- import { google } from "@ai-sdk/google";
245
- import { mistral } from "@ai-sdk/mistral";
246
- import { openai } from "@ai-sdk/openai";
247
- import { ollama } from "ollama-ai-provider";
291
+ import { createAnthropic } from "@ai-sdk/anthropic";
292
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
293
+ import { createMistral } from "@ai-sdk/mistral";
294
+ import { createOpenAI } from "@ai-sdk/openai";
295
+ import { createOllama } from "ollama-ai-provider";
248
296
  class BaseProvider {
249
297
  name;
250
298
  model;
251
299
  mode;
252
300
  config;
301
+ transport;
302
+ authMethod;
303
+ apiVersion;
304
+ customHeaders;
253
305
  cachedModel = null;
254
306
  constructor(config) {
255
307
  this.name = config.provider;
256
308
  this.model = config.model ?? DEFAULT_MODELS[config.provider];
257
309
  this.mode = this.determineMode(config);
258
310
  this.config = config;
311
+ this.transport = config.transport;
312
+ this.authMethod = config.authMethod;
313
+ this.apiVersion = config.apiVersion;
314
+ this.customHeaders = config.customHeaders;
259
315
  }
260
316
  getModel() {
261
317
  if (!this.cachedModel) {
@@ -295,81 +351,33 @@ class BaseProvider {
295
351
  return "managed";
296
352
  }
297
353
  createModel() {
298
- const { baseUrl, proxyUrl } = this.config;
354
+ const { baseUrl, proxyUrl, apiKey } = this.config;
355
+ const headers = this.customHeaders;
356
+ if (this.name === "ollama") {
357
+ const provider = createOllama({ baseURL: baseUrl, headers });
358
+ return provider(this.model);
359
+ }
360
+ if (this.mode === "managed" && proxyUrl) {
361
+ const provider = createOpenAI({ baseURL: proxyUrl, apiKey, headers });
362
+ return provider(this.model);
363
+ }
299
364
  switch (this.name) {
300
- case "ollama": {
301
- const originalBaseUrl = process.env.OLLAMA_BASE_URL;
302
- if (baseUrl && baseUrl !== "http://localhost:11434") {
303
- process.env.OLLAMA_BASE_URL = baseUrl;
304
- }
305
- const ollamaModel = ollama(this.model);
306
- if (originalBaseUrl !== undefined) {
307
- process.env.OLLAMA_BASE_URL = originalBaseUrl;
308
- } else if (baseUrl && baseUrl !== "http://localhost:11434") {
309
- delete process.env.OLLAMA_BASE_URL;
310
- }
311
- return ollamaModel;
365
+ case "openai": {
366
+ const provider = createOpenAI({ apiKey, headers });
367
+ return provider(this.model);
368
+ }
369
+ case "anthropic": {
370
+ const provider = createAnthropic({ apiKey, headers });
371
+ return provider(this.model);
372
+ }
373
+ case "mistral": {
374
+ const provider = createMistral({ apiKey, headers });
375
+ return provider(this.model);
376
+ }
377
+ case "gemini": {
378
+ const provider = createGoogleGenerativeAI({ apiKey, headers });
379
+ return provider(this.model);
312
380
  }
313
- case "openai":
314
- if (this.mode === "managed") {
315
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
316
- if (proxyUrl) {
317
- process.env.OPENAI_BASE_URL = proxyUrl;
318
- }
319
- const model = openai(this.model);
320
- if (originalBaseUrl !== undefined) {
321
- process.env.OPENAI_BASE_URL = originalBaseUrl;
322
- } else if (proxyUrl) {
323
- delete process.env.OPENAI_BASE_URL;
324
- }
325
- return model;
326
- }
327
- return openai(this.model);
328
- case "anthropic":
329
- if (this.mode === "managed") {
330
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
331
- if (proxyUrl) {
332
- process.env.OPENAI_BASE_URL = proxyUrl;
333
- }
334
- const model = openai(this.model);
335
- if (originalBaseUrl !== undefined) {
336
- process.env.OPENAI_BASE_URL = originalBaseUrl;
337
- } else if (proxyUrl) {
338
- delete process.env.OPENAI_BASE_URL;
339
- }
340
- return model;
341
- }
342
- return anthropic(this.model);
343
- case "mistral":
344
- if (this.mode === "managed") {
345
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
346
- if (proxyUrl) {
347
- process.env.OPENAI_BASE_URL = proxyUrl;
348
- }
349
- const model = openai(this.model);
350
- if (originalBaseUrl !== undefined) {
351
- process.env.OPENAI_BASE_URL = originalBaseUrl;
352
- } else if (proxyUrl) {
353
- delete process.env.OPENAI_BASE_URL;
354
- }
355
- return model;
356
- }
357
- return mistral(this.model);
358
- case "gemini":
359
- if (this.mode === "managed") {
360
- const originalBaseUrl = process.env.OPENAI_BASE_URL;
361
- if (proxyUrl) {
362
- process.env.OPENAI_BASE_URL = proxyUrl;
363
- }
364
- const model = openai(this.model);
365
- if (originalBaseUrl !== undefined) {
366
- process.env.OPENAI_BASE_URL = originalBaseUrl;
367
- } else if (proxyUrl) {
368
- delete process.env.OPENAI_BASE_URL;
369
- }
370
- return model;
371
- }
372
- return google(this.model);
373
381
  default:
374
382
  throw new Error(`Unknown provider: ${this.name}`);
375
383
  }
@@ -451,13 +459,17 @@ function createProviderFromEnv() {
451
459
  case "ollama":
452
460
  break;
453
461
  }
462
+ const transport = process.env.CONTRACTSPEC_AI_TRANSPORT;
463
+ const apiVersion = process.env.CONTRACTSPEC_AI_API_VERSION;
454
464
  return createProvider({
455
465
  provider,
456
466
  model,
457
467
  apiKey,
458
468
  baseUrl: process.env.OLLAMA_BASE_URL,
459
469
  proxyUrl: process.env.CONTRACTSPEC_AI_PROXY_URL,
460
- organizationId: process.env.CONTRACTSPEC_ORG_ID
470
+ organizationId: process.env.CONTRACTSPEC_ORG_ID,
471
+ transport,
472
+ apiVersion
461
473
  });
462
474
  }
463
475
  function getAvailableProviders() {
@@ -465,35 +477,45 @@ function getAvailableProviders() {
465
477
  providers.push({
466
478
  provider: "ollama",
467
479
  available: true,
468
- mode: "local"
480
+ mode: "local",
481
+ transports: ["rest", "sdk"],
482
+ authMethods: []
469
483
  });
470
484
  const openaiKey = process.env.OPENAI_API_KEY;
471
485
  providers.push({
472
486
  provider: "openai",
473
487
  available: Boolean(openaiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
474
488
  mode: openaiKey ? "byok" : "managed",
475
- reason: !openaiKey ? "Set OPENAI_API_KEY for BYOK mode" : undefined
489
+ reason: !openaiKey ? "Set OPENAI_API_KEY for BYOK mode" : undefined,
490
+ transports: ["rest", "sdk"],
491
+ authMethods: ["api-key"]
476
492
  });
477
493
  const anthropicKey = process.env.ANTHROPIC_API_KEY;
478
494
  providers.push({
479
495
  provider: "anthropic",
480
496
  available: Boolean(anthropicKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
481
497
  mode: anthropicKey ? "byok" : "managed",
482
- reason: !anthropicKey ? "Set ANTHROPIC_API_KEY for BYOK mode" : undefined
498
+ reason: !anthropicKey ? "Set ANTHROPIC_API_KEY for BYOK mode" : undefined,
499
+ transports: ["rest", "sdk"],
500
+ authMethods: ["api-key"]
483
501
  });
484
502
  const mistralKey = process.env.MISTRAL_API_KEY;
485
503
  providers.push({
486
504
  provider: "mistral",
487
505
  available: Boolean(mistralKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
488
506
  mode: mistralKey ? "byok" : "managed",
489
- reason: !mistralKey ? "Set MISTRAL_API_KEY for BYOK mode" : undefined
507
+ reason: !mistralKey ? "Set MISTRAL_API_KEY for BYOK mode" : undefined,
508
+ transports: ["rest", "sdk"],
509
+ authMethods: ["api-key"]
490
510
  });
491
511
  const geminiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;
492
512
  providers.push({
493
513
  provider: "gemini",
494
514
  available: Boolean(geminiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
495
515
  mode: geminiKey ? "byok" : "managed",
496
- reason: !geminiKey ? "Set GOOGLE_API_KEY for BYOK mode" : undefined
516
+ reason: !geminiKey ? "Set GOOGLE_API_KEY for BYOK mode" : undefined,
517
+ transports: ["rest", "sdk"],
518
+ authMethods: ["api-key"]
497
519
  });
498
520
  return providers;
499
521
  }