@contractspec/lib.ai-providers 3.0.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/browser/factory.js +58 -84
- package/dist/browser/index.js +227 -84
- package/dist/browser/legacy.js +58 -84
- package/dist/browser/selector-types.js +0 -0
- package/dist/browser/selector.js +693 -0
- package/dist/browser/validation.js +58 -84
- package/dist/factory.js +58 -84
- package/dist/index.d.ts +3 -0
- package/dist/index.js +227 -84
- package/dist/legacy.js +58 -84
- package/dist/node/factory.js +58 -84
- package/dist/node/index.js +227 -84
- package/dist/node/legacy.js +58 -84
- package/dist/node/selector-types.js +0 -0
- package/dist/node/selector.js +693 -0
- package/dist/node/validation.js +58 -84
- package/dist/selector-types.d.ts +50 -0
- package/dist/selector-types.js +1 -0
- package/dist/selector.d.ts +16 -0
- package/dist/selector.js +694 -0
- package/dist/types.d.ts +12 -0
- package/dist/validation.js +58 -84
- package/package.json +37 -8
package/dist/validation.js
CHANGED
|
@@ -289,22 +289,30 @@ function getDefaultModel(provider) {
|
|
|
289
289
|
}
|
|
290
290
|
|
|
291
291
|
// src/factory.ts
|
|
292
|
-
import {
|
|
293
|
-
import {
|
|
294
|
-
import {
|
|
295
|
-
import {
|
|
296
|
-
import {
|
|
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";
|
|
297
297
|
class BaseProvider {
|
|
298
298
|
name;
|
|
299
299
|
model;
|
|
300
300
|
mode;
|
|
301
301
|
config;
|
|
302
|
+
transport;
|
|
303
|
+
authMethod;
|
|
304
|
+
apiVersion;
|
|
305
|
+
customHeaders;
|
|
302
306
|
cachedModel = null;
|
|
303
307
|
constructor(config) {
|
|
304
308
|
this.name = config.provider;
|
|
305
309
|
this.model = config.model ?? DEFAULT_MODELS[config.provider];
|
|
306
310
|
this.mode = this.determineMode(config);
|
|
307
311
|
this.config = config;
|
|
312
|
+
this.transport = config.transport;
|
|
313
|
+
this.authMethod = config.authMethod;
|
|
314
|
+
this.apiVersion = config.apiVersion;
|
|
315
|
+
this.customHeaders = config.customHeaders;
|
|
308
316
|
}
|
|
309
317
|
getModel() {
|
|
310
318
|
if (!this.cachedModel) {
|
|
@@ -344,81 +352,33 @@ class BaseProvider {
|
|
|
344
352
|
return "managed";
|
|
345
353
|
}
|
|
346
354
|
createModel() {
|
|
347
|
-
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
|
+
}
|
|
348
365
|
switch (this.name) {
|
|
349
|
-
case "
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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);
|
|
361
381
|
}
|
|
362
|
-
case "openai":
|
|
363
|
-
if (this.mode === "managed") {
|
|
364
|
-
const originalBaseUrl = process.env.OPENAI_BASE_URL;
|
|
365
|
-
if (proxyUrl) {
|
|
366
|
-
process.env.OPENAI_BASE_URL = proxyUrl;
|
|
367
|
-
}
|
|
368
|
-
const model = openai(this.model);
|
|
369
|
-
if (originalBaseUrl !== undefined) {
|
|
370
|
-
process.env.OPENAI_BASE_URL = originalBaseUrl;
|
|
371
|
-
} else if (proxyUrl) {
|
|
372
|
-
delete process.env.OPENAI_BASE_URL;
|
|
373
|
-
}
|
|
374
|
-
return model;
|
|
375
|
-
}
|
|
376
|
-
return openai(this.model);
|
|
377
|
-
case "anthropic":
|
|
378
|
-
if (this.mode === "managed") {
|
|
379
|
-
const originalBaseUrl = process.env.OPENAI_BASE_URL;
|
|
380
|
-
if (proxyUrl) {
|
|
381
|
-
process.env.OPENAI_BASE_URL = proxyUrl;
|
|
382
|
-
}
|
|
383
|
-
const model = openai(this.model);
|
|
384
|
-
if (originalBaseUrl !== undefined) {
|
|
385
|
-
process.env.OPENAI_BASE_URL = originalBaseUrl;
|
|
386
|
-
} else if (proxyUrl) {
|
|
387
|
-
delete process.env.OPENAI_BASE_URL;
|
|
388
|
-
}
|
|
389
|
-
return model;
|
|
390
|
-
}
|
|
391
|
-
return anthropic(this.model);
|
|
392
|
-
case "mistral":
|
|
393
|
-
if (this.mode === "managed") {
|
|
394
|
-
const originalBaseUrl = process.env.OPENAI_BASE_URL;
|
|
395
|
-
if (proxyUrl) {
|
|
396
|
-
process.env.OPENAI_BASE_URL = proxyUrl;
|
|
397
|
-
}
|
|
398
|
-
const model = openai(this.model);
|
|
399
|
-
if (originalBaseUrl !== undefined) {
|
|
400
|
-
process.env.OPENAI_BASE_URL = originalBaseUrl;
|
|
401
|
-
} else if (proxyUrl) {
|
|
402
|
-
delete process.env.OPENAI_BASE_URL;
|
|
403
|
-
}
|
|
404
|
-
return model;
|
|
405
|
-
}
|
|
406
|
-
return mistral(this.model);
|
|
407
|
-
case "gemini":
|
|
408
|
-
if (this.mode === "managed") {
|
|
409
|
-
const originalBaseUrl = process.env.OPENAI_BASE_URL;
|
|
410
|
-
if (proxyUrl) {
|
|
411
|
-
process.env.OPENAI_BASE_URL = proxyUrl;
|
|
412
|
-
}
|
|
413
|
-
const model = openai(this.model);
|
|
414
|
-
if (originalBaseUrl !== undefined) {
|
|
415
|
-
process.env.OPENAI_BASE_URL = originalBaseUrl;
|
|
416
|
-
} else if (proxyUrl) {
|
|
417
|
-
delete process.env.OPENAI_BASE_URL;
|
|
418
|
-
}
|
|
419
|
-
return model;
|
|
420
|
-
}
|
|
421
|
-
return google(this.model);
|
|
422
382
|
default:
|
|
423
383
|
throw new Error(`Unknown provider: ${this.name}`);
|
|
424
384
|
}
|
|
@@ -500,13 +460,17 @@ function createProviderFromEnv() {
|
|
|
500
460
|
case "ollama":
|
|
501
461
|
break;
|
|
502
462
|
}
|
|
463
|
+
const transport = process.env.CONTRACTSPEC_AI_TRANSPORT;
|
|
464
|
+
const apiVersion = process.env.CONTRACTSPEC_AI_API_VERSION;
|
|
503
465
|
return createProvider({
|
|
504
466
|
provider,
|
|
505
467
|
model,
|
|
506
468
|
apiKey,
|
|
507
469
|
baseUrl: process.env.OLLAMA_BASE_URL,
|
|
508
470
|
proxyUrl: process.env.CONTRACTSPEC_AI_PROXY_URL,
|
|
509
|
-
organizationId: process.env.CONTRACTSPEC_ORG_ID
|
|
471
|
+
organizationId: process.env.CONTRACTSPEC_ORG_ID,
|
|
472
|
+
transport,
|
|
473
|
+
apiVersion
|
|
510
474
|
});
|
|
511
475
|
}
|
|
512
476
|
function getAvailableProviders() {
|
|
@@ -514,35 +478,45 @@ function getAvailableProviders() {
|
|
|
514
478
|
providers.push({
|
|
515
479
|
provider: "ollama",
|
|
516
480
|
available: true,
|
|
517
|
-
mode: "local"
|
|
481
|
+
mode: "local",
|
|
482
|
+
transports: ["rest", "sdk"],
|
|
483
|
+
authMethods: []
|
|
518
484
|
});
|
|
519
485
|
const openaiKey = process.env.OPENAI_API_KEY;
|
|
520
486
|
providers.push({
|
|
521
487
|
provider: "openai",
|
|
522
488
|
available: Boolean(openaiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
|
|
523
489
|
mode: openaiKey ? "byok" : "managed",
|
|
524
|
-
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"]
|
|
525
493
|
});
|
|
526
494
|
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
527
495
|
providers.push({
|
|
528
496
|
provider: "anthropic",
|
|
529
497
|
available: Boolean(anthropicKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
|
|
530
498
|
mode: anthropicKey ? "byok" : "managed",
|
|
531
|
-
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"]
|
|
532
502
|
});
|
|
533
503
|
const mistralKey = process.env.MISTRAL_API_KEY;
|
|
534
504
|
providers.push({
|
|
535
505
|
provider: "mistral",
|
|
536
506
|
available: Boolean(mistralKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
|
|
537
507
|
mode: mistralKey ? "byok" : "managed",
|
|
538
|
-
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"]
|
|
539
511
|
});
|
|
540
512
|
const geminiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;
|
|
541
513
|
providers.push({
|
|
542
514
|
provider: "gemini",
|
|
543
515
|
available: Boolean(geminiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),
|
|
544
516
|
mode: geminiKey ? "byok" : "managed",
|
|
545
|
-
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"]
|
|
546
520
|
});
|
|
547
521
|
return providers;
|
|
548
522
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/lib.ai-providers",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Unified AI provider abstraction layer",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -33,18 +33,19 @@
|
|
|
33
33
|
"typecheck": "tsc --noEmit"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@ai-sdk/anthropic": "3.0.
|
|
37
|
-
"@ai-sdk/google": "3.0.
|
|
38
|
-
"@ai-sdk/mistral": "3.0.
|
|
39
|
-
"@ai-sdk/openai": "3.0.
|
|
40
|
-
"
|
|
36
|
+
"@ai-sdk/anthropic": "3.0.58",
|
|
37
|
+
"@ai-sdk/google": "3.0.43",
|
|
38
|
+
"@ai-sdk/mistral": "3.0.24",
|
|
39
|
+
"@ai-sdk/openai": "3.0.41",
|
|
40
|
+
"@contractspec/lib.provider-ranking": "0.1.1",
|
|
41
|
+
"ai": "6.0.116",
|
|
41
42
|
"ollama-ai-provider": "^1.2.0",
|
|
42
43
|
"zod": "^4.3.5"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
|
-
"@contractspec/tool.typescript": "3.
|
|
46
|
+
"@contractspec/tool.typescript": "3.1.0",
|
|
46
47
|
"typescript": "^5.9.3",
|
|
47
|
-
"@contractspec/tool.bun": "3.
|
|
48
|
+
"@contractspec/tool.bun": "3.1.0"
|
|
48
49
|
},
|
|
49
50
|
"exports": {
|
|
50
51
|
".": {
|
|
@@ -75,6 +76,20 @@
|
|
|
75
76
|
"browser": "./dist/browser/models.js",
|
|
76
77
|
"default": "./dist/models.js"
|
|
77
78
|
},
|
|
79
|
+
"./selector": {
|
|
80
|
+
"types": "./dist/selector.d.ts",
|
|
81
|
+
"bun": "./dist/selector.js",
|
|
82
|
+
"node": "./dist/node/selector.js",
|
|
83
|
+
"browser": "./dist/browser/selector.js",
|
|
84
|
+
"default": "./dist/selector.js"
|
|
85
|
+
},
|
|
86
|
+
"./selector-types": {
|
|
87
|
+
"types": "./dist/selector-types.d.ts",
|
|
88
|
+
"bun": "./dist/selector-types.js",
|
|
89
|
+
"node": "./dist/node/selector-types.js",
|
|
90
|
+
"browser": "./dist/browser/selector-types.js",
|
|
91
|
+
"default": "./dist/selector-types.js"
|
|
92
|
+
},
|
|
78
93
|
"./types": {
|
|
79
94
|
"types": "./dist/types.d.ts",
|
|
80
95
|
"bun": "./dist/types.js",
|
|
@@ -121,6 +136,20 @@
|
|
|
121
136
|
"browser": "./dist/browser/models.js",
|
|
122
137
|
"default": "./dist/models.js"
|
|
123
138
|
},
|
|
139
|
+
"./selector": {
|
|
140
|
+
"types": "./dist/selector.d.ts",
|
|
141
|
+
"bun": "./dist/selector.js",
|
|
142
|
+
"node": "./dist/node/selector.js",
|
|
143
|
+
"browser": "./dist/browser/selector.js",
|
|
144
|
+
"default": "./dist/selector.js"
|
|
145
|
+
},
|
|
146
|
+
"./selector-types": {
|
|
147
|
+
"types": "./dist/selector-types.d.ts",
|
|
148
|
+
"bun": "./dist/selector-types.js",
|
|
149
|
+
"node": "./dist/node/selector-types.js",
|
|
150
|
+
"browser": "./dist/browser/selector-types.js",
|
|
151
|
+
"default": "./dist/selector-types.js"
|
|
152
|
+
},
|
|
124
153
|
"./types": {
|
|
125
154
|
"types": "./dist/types.d.ts",
|
|
126
155
|
"bun": "./dist/types.js",
|