ai.matey.backend 0.2.0
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/LICENSE +21 -0
- package/dist/cjs/index.js +60 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/providers/ai21.js +331 -0
- package/dist/cjs/providers/ai21.js.map +1 -0
- package/dist/cjs/providers/anthropic.js +664 -0
- package/dist/cjs/providers/anthropic.js.map +1 -0
- package/dist/cjs/providers/anyscale.js +338 -0
- package/dist/cjs/providers/anyscale.js.map +1 -0
- package/dist/cjs/providers/aws-bedrock.js +374 -0
- package/dist/cjs/providers/aws-bedrock.js.map +1 -0
- package/dist/cjs/providers/azure-openai.js +406 -0
- package/dist/cjs/providers/azure-openai.js.map +1 -0
- package/dist/cjs/providers/cerebras.js +356 -0
- package/dist/cjs/providers/cerebras.js.map +1 -0
- package/dist/cjs/providers/cloudflare.js +359 -0
- package/dist/cjs/providers/cloudflare.js.map +1 -0
- package/dist/cjs/providers/cohere.js +368 -0
- package/dist/cjs/providers/cohere.js.map +1 -0
- package/dist/cjs/providers/deepinfra.js +343 -0
- package/dist/cjs/providers/deepinfra.js.map +1 -0
- package/dist/cjs/providers/deepseek.js +104 -0
- package/dist/cjs/providers/deepseek.js.map +1 -0
- package/dist/cjs/providers/fireworks.js +363 -0
- package/dist/cjs/providers/fireworks.js.map +1 -0
- package/dist/cjs/providers/gemini.js +292 -0
- package/dist/cjs/providers/gemini.js.map +1 -0
- package/dist/cjs/providers/groq.js +143 -0
- package/dist/cjs/providers/groq.js.map +1 -0
- package/dist/cjs/providers/huggingface.js +392 -0
- package/dist/cjs/providers/huggingface.js.map +1 -0
- package/dist/cjs/providers/lmstudio.js +144 -0
- package/dist/cjs/providers/lmstudio.js.map +1 -0
- package/dist/cjs/providers/mistral.js +288 -0
- package/dist/cjs/providers/mistral.js.map +1 -0
- package/dist/cjs/providers/nvidia.js +167 -0
- package/dist/cjs/providers/nvidia.js.map +1 -0
- package/dist/cjs/providers/ollama.js +257 -0
- package/dist/cjs/providers/ollama.js.map +1 -0
- package/dist/cjs/providers/openai.js +640 -0
- package/dist/cjs/providers/openai.js.map +1 -0
- package/dist/cjs/providers/openrouter.js +379 -0
- package/dist/cjs/providers/openrouter.js.map +1 -0
- package/dist/cjs/providers/perplexity.js +372 -0
- package/dist/cjs/providers/perplexity.js.map +1 -0
- package/dist/cjs/providers/replicate.js +340 -0
- package/dist/cjs/providers/replicate.js.map +1 -0
- package/dist/cjs/providers/together-ai.js +341 -0
- package/dist/cjs/providers/together-ai.js.map +1 -0
- package/dist/cjs/providers/xai.js +339 -0
- package/dist/cjs/providers/xai.js.map +1 -0
- package/dist/cjs/shared.js +279 -0
- package/dist/cjs/shared.js.map +1 -0
- package/dist/esm/index.js +44 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/providers/ai21.js +327 -0
- package/dist/esm/providers/ai21.js.map +1 -0
- package/dist/esm/providers/anthropic.js +660 -0
- package/dist/esm/providers/anthropic.js.map +1 -0
- package/dist/esm/providers/anyscale.js +334 -0
- package/dist/esm/providers/anyscale.js.map +1 -0
- package/dist/esm/providers/aws-bedrock.js +370 -0
- package/dist/esm/providers/aws-bedrock.js.map +1 -0
- package/dist/esm/providers/azure-openai.js +402 -0
- package/dist/esm/providers/azure-openai.js.map +1 -0
- package/dist/esm/providers/cerebras.js +352 -0
- package/dist/esm/providers/cerebras.js.map +1 -0
- package/dist/esm/providers/cloudflare.js +355 -0
- package/dist/esm/providers/cloudflare.js.map +1 -0
- package/dist/esm/providers/cohere.js +364 -0
- package/dist/esm/providers/cohere.js.map +1 -0
- package/dist/esm/providers/deepinfra.js +339 -0
- package/dist/esm/providers/deepinfra.js.map +1 -0
- package/dist/esm/providers/deepseek.js +99 -0
- package/dist/esm/providers/deepseek.js.map +1 -0
- package/dist/esm/providers/fireworks.js +359 -0
- package/dist/esm/providers/fireworks.js.map +1 -0
- package/dist/esm/providers/gemini.js +288 -0
- package/dist/esm/providers/gemini.js.map +1 -0
- package/dist/esm/providers/groq.js +138 -0
- package/dist/esm/providers/groq.js.map +1 -0
- package/dist/esm/providers/huggingface.js +387 -0
- package/dist/esm/providers/huggingface.js.map +1 -0
- package/dist/esm/providers/lmstudio.js +139 -0
- package/dist/esm/providers/lmstudio.js.map +1 -0
- package/dist/esm/providers/mistral.js +284 -0
- package/dist/esm/providers/mistral.js.map +1 -0
- package/dist/esm/providers/nvidia.js +162 -0
- package/dist/esm/providers/nvidia.js.map +1 -0
- package/dist/esm/providers/ollama.js +253 -0
- package/dist/esm/providers/ollama.js.map +1 -0
- package/dist/esm/providers/openai.js +636 -0
- package/dist/esm/providers/openai.js.map +1 -0
- package/dist/esm/providers/openrouter.js +375 -0
- package/dist/esm/providers/openrouter.js.map +1 -0
- package/dist/esm/providers/perplexity.js +368 -0
- package/dist/esm/providers/perplexity.js.map +1 -0
- package/dist/esm/providers/replicate.js +336 -0
- package/dist/esm/providers/replicate.js.map +1 -0
- package/dist/esm/providers/together-ai.js +337 -0
- package/dist/esm/providers/together-ai.js.map +1 -0
- package/dist/esm/providers/xai.js +335 -0
- package/dist/esm/providers/xai.js.map +1 -0
- package/dist/esm/shared.js +272 -0
- package/dist/esm/shared.js.map +1 -0
- package/dist/types/index.d.ts +38 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/providers/ai21.d.ts +106 -0
- package/dist/types/providers/ai21.d.ts.map +1 -0
- package/dist/types/providers/anthropic.d.ts +194 -0
- package/dist/types/providers/anthropic.d.ts.map +1 -0
- package/dist/types/providers/anyscale.d.ts +109 -0
- package/dist/types/providers/anyscale.d.ts.map +1 -0
- package/dist/types/providers/aws-bedrock.d.ts +152 -0
- package/dist/types/providers/aws-bedrock.d.ts.map +1 -0
- package/dist/types/providers/azure-openai.d.ts +142 -0
- package/dist/types/providers/azure-openai.d.ts.map +1 -0
- package/dist/types/providers/cerebras.d.ts +130 -0
- package/dist/types/providers/cerebras.d.ts.map +1 -0
- package/dist/types/providers/cloudflare.d.ts +125 -0
- package/dist/types/providers/cloudflare.d.ts.map +1 -0
- package/dist/types/providers/cohere.d.ts +114 -0
- package/dist/types/providers/cohere.d.ts.map +1 -0
- package/dist/types/providers/deepinfra.d.ts +118 -0
- package/dist/types/providers/deepinfra.d.ts.map +1 -0
- package/dist/types/providers/deepseek.d.ts +68 -0
- package/dist/types/providers/deepseek.d.ts.map +1 -0
- package/dist/types/providers/fireworks.d.ts +127 -0
- package/dist/types/providers/fireworks.d.ts.map +1 -0
- package/dist/types/providers/gemini.d.ts +71 -0
- package/dist/types/providers/gemini.d.ts.map +1 -0
- package/dist/types/providers/groq.d.ts +83 -0
- package/dist/types/providers/groq.d.ts.map +1 -0
- package/dist/types/providers/huggingface.d.ts +154 -0
- package/dist/types/providers/huggingface.d.ts.map +1 -0
- package/dist/types/providers/lmstudio.d.ts +88 -0
- package/dist/types/providers/lmstudio.d.ts.map +1 -0
- package/dist/types/providers/mistral.d.ts +65 -0
- package/dist/types/providers/mistral.d.ts.map +1 -0
- package/dist/types/providers/nvidia.d.ts +100 -0
- package/dist/types/providers/nvidia.d.ts.map +1 -0
- package/dist/types/providers/ollama.d.ts +59 -0
- package/dist/types/providers/ollama.d.ts.map +1 -0
- package/dist/types/providers/openai.d.ts +205 -0
- package/dist/types/providers/openai.d.ts.map +1 -0
- package/dist/types/providers/openrouter.d.ts +135 -0
- package/dist/types/providers/openrouter.d.ts.map +1 -0
- package/dist/types/providers/perplexity.d.ts +116 -0
- package/dist/types/providers/perplexity.d.ts.map +1 -0
- package/dist/types/providers/replicate.d.ts +91 -0
- package/dist/types/providers/replicate.d.ts.map +1 -0
- package/dist/types/providers/together-ai.d.ts +118 -0
- package/dist/types/providers/together-ai.d.ts.map +1 -0
- package/dist/types/providers/xai.d.ts +119 -0
- package/dist/types/providers/xai.d.ts.map +1 -0
- package/dist/types/shared.d.ts +116 -0
- package/dist/types/shared.d.ts.map +1 -0
- package/package.json +327 -0
- package/readme.md +86 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LM Studio Backend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Universal IR to LM Studio local API (OpenAI-compatible).
|
|
5
|
+
* LM Studio runs models locally on your machine with zero cost.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { OpenAIBackendAdapter } from './openai.js';
|
|
10
|
+
/**
|
|
11
|
+
* Backend adapter for LM Studio local API.
|
|
12
|
+
*
|
|
13
|
+
* LM Studio provides a local OpenAI-compatible API server for running
|
|
14
|
+
* models on your own hardware. Perfect for privacy, development, and cost savings.
|
|
15
|
+
*
|
|
16
|
+
* @example Basic Usage
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { LMStudioBackendAdapter } from 'ai.matey';
|
|
19
|
+
*
|
|
20
|
+
* const adapter = new LMStudioBackendAdapter({
|
|
21
|
+
* baseURL: 'http://localhost:1234/v1', // Default LM Studio port
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example With Custom Model
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const adapter = new LMStudioBackendAdapter({
|
|
28
|
+
* baseURL: 'http://localhost:1234/v1',
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* const response = await adapter.execute({
|
|
32
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
33
|
+
* parameters: {
|
|
34
|
+
* model: 'local-model', // Use whatever model is loaded in LM Studio
|
|
35
|
+
* },
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example Privacy-Focused Local Inference
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import { createBridge } from 'ai.matey';
|
|
42
|
+
*
|
|
43
|
+
* const bridge = createBridge({
|
|
44
|
+
* backend: new LMStudioBackendAdapter({
|
|
45
|
+
* baseURL: 'http://localhost:1234/v1',
|
|
46
|
+
* }),
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* // All requests stay on your local machine
|
|
50
|
+
* const response = await bridge.chat({
|
|
51
|
+
* messages: [{ role: 'user', content: 'Sensitive data here' }],
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export class LMStudioBackendAdapter extends OpenAIBackendAdapter {
|
|
56
|
+
constructor(config) {
|
|
57
|
+
// LM Studio default endpoint
|
|
58
|
+
const lmstudioConfig = {
|
|
59
|
+
...config,
|
|
60
|
+
baseURL: config.baseURL || 'http://localhost:1234/v1',
|
|
61
|
+
// LM Studio doesn't require API key for local usage
|
|
62
|
+
apiKey: config.apiKey || 'not-needed',
|
|
63
|
+
};
|
|
64
|
+
// Pass LM Studio-specific metadata to parent constructor
|
|
65
|
+
super(lmstudioConfig, {
|
|
66
|
+
name: 'lmstudio-backend',
|
|
67
|
+
version: '1.0.0',
|
|
68
|
+
provider: 'LM Studio',
|
|
69
|
+
capabilities: {
|
|
70
|
+
streaming: true,
|
|
71
|
+
multiModal: false, // Depends on loaded model
|
|
72
|
+
tools: true, // Depends on loaded model
|
|
73
|
+
maxContextTokens: 32000, // Varies by loaded model
|
|
74
|
+
systemMessageStrategy: 'in-messages',
|
|
75
|
+
supportsMultipleSystemMessages: false,
|
|
76
|
+
supportsTemperature: true,
|
|
77
|
+
supportsTopP: true,
|
|
78
|
+
supportsTopK: false,
|
|
79
|
+
supportsSeed: true,
|
|
80
|
+
supportsFrequencyPenalty: true,
|
|
81
|
+
supportsPresencePenalty: true,
|
|
82
|
+
maxStopSequences: 4,
|
|
83
|
+
},
|
|
84
|
+
config: {
|
|
85
|
+
baseURL: lmstudioConfig.baseURL,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Health check for LM Studio.
|
|
91
|
+
*/
|
|
92
|
+
async healthCheck() {
|
|
93
|
+
try {
|
|
94
|
+
// LM Studio doesn't require auth for local requests
|
|
95
|
+
const response = await fetch(`${this.baseURL}/models`, {
|
|
96
|
+
method: 'GET',
|
|
97
|
+
headers: {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
},
|
|
100
|
+
signal: AbortSignal.timeout(5000),
|
|
101
|
+
});
|
|
102
|
+
return response.ok;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Estimate cost for LM Studio (always $0 - local inference).
|
|
110
|
+
*/
|
|
111
|
+
estimateCost(_request) {
|
|
112
|
+
// LM Studio is free - runs locally
|
|
113
|
+
return Promise.resolve(0);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create an LM Studio backend adapter.
|
|
118
|
+
*
|
|
119
|
+
* @param config - Adapter configuration
|
|
120
|
+
* @returns LM Studio backend adapter
|
|
121
|
+
*
|
|
122
|
+
* @example Default Configuration
|
|
123
|
+
* ```typescript
|
|
124
|
+
* import { createLMStudioAdapter } from 'ai.matey';
|
|
125
|
+
*
|
|
126
|
+
* const adapter = createLMStudioAdapter({});
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* @example Custom Port
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const adapter = createLMStudioAdapter({
|
|
132
|
+
* baseURL: 'http://localhost:8080/v1',
|
|
133
|
+
* });
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
export function createLMStudioAdapter(config = {}) {
|
|
137
|
+
return new LMStudioBackendAdapter(config);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=lmstudio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lmstudio.js","sourceRoot":"","sources":["../../../src/providers/lmstudio.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAA2C,MAAM,aAAa,CAAC;AAG5F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,OAAO,sBACX,SAAQ,oBAAoB;IAG5B,YAAY,MAA4B;QACtC,6BAA6B;QAC7B,MAAM,cAAc,GAAyB;YAC3C,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,0BAA0B;YACrD,oDAAoD;YACpD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,YAAY;SACtC,CAAC;QAEF,yDAAyD;QACzD,KAAK,CAAC,cAAc,EAAE;YACpB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,WAAW;YACrB,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,KAAK,EAAE,0BAA0B;gBAC7C,KAAK,EAAE,IAAI,EAAE,0BAA0B;gBACvC,gBAAgB,EAAE,KAAK,EAAE,yBAAyB;gBAClD,qBAAqB,EAAE,aAAa;gBACpC,8BAA8B,EAAE,KAAK;gBACrC,mBAAmB,EAAE,IAAI;gBACzB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAE,IAAI;gBAClB,wBAAwB,EAAE,IAAI;gBAC9B,uBAAuB,EAAE,IAAI;gBAC7B,gBAAgB,EAAE,CAAC;aACpB;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,cAAc,CAAC,OAAO;aAChC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,oDAAoD;YACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;gBACrD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAuB;QAClC,mCAAmC;QACnC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAA+B,EAA0B;IAEzD,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mistral Backend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Universal IR to Mistral API.
|
|
5
|
+
* Mistral uses OpenAI-compatible format with minor differences.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { AdapterConversionError, NetworkError, ProviderError, StreamError, ErrorCode, createErrorFromHttpResponse, } from 'ai.matey.errors';
|
|
10
|
+
import { normalizeSystemMessages } from 'ai.matey.utils';
|
|
11
|
+
import { getEffectiveStreamMode, mergeStreamingConfig } from 'ai.matey.utils';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Mistral Backend Adapter
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export class MistralBackendAdapter {
|
|
16
|
+
metadata;
|
|
17
|
+
config;
|
|
18
|
+
baseURL;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.baseURL = config.baseURL || 'https://api.mistral.ai/v1';
|
|
22
|
+
this.metadata = {
|
|
23
|
+
name: 'mistral-backend',
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
provider: 'Mistral',
|
|
26
|
+
capabilities: {
|
|
27
|
+
streaming: true,
|
|
28
|
+
multiModal: false,
|
|
29
|
+
tools: true,
|
|
30
|
+
maxContextTokens: 32000,
|
|
31
|
+
systemMessageStrategy: 'in-messages',
|
|
32
|
+
supportsMultipleSystemMessages: false,
|
|
33
|
+
supportsTemperature: true,
|
|
34
|
+
supportsTopP: true,
|
|
35
|
+
supportsTopK: false,
|
|
36
|
+
supportsSeed: true,
|
|
37
|
+
supportsFrequencyPenalty: false,
|
|
38
|
+
supportsPresencePenalty: false,
|
|
39
|
+
maxStopSequences: 0,
|
|
40
|
+
},
|
|
41
|
+
config: { baseURL: this.baseURL },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async execute(request, signal) {
|
|
45
|
+
try {
|
|
46
|
+
const mistralRequest = this.fromIR(request);
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: {
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
53
|
+
...this.config.headers,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify(mistralRequest),
|
|
56
|
+
signal,
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errorBody = await response.text();
|
|
60
|
+
throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
|
|
61
|
+
backend: this.metadata.name,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const data = (await response.json());
|
|
65
|
+
return this.toIR(data, request, Date.now() - startTime);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof NetworkError || error instanceof ProviderError) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
throw new ProviderError({
|
|
72
|
+
code: ErrorCode.PROVIDER_ERROR,
|
|
73
|
+
message: `Mistral request failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
74
|
+
isRetryable: true,
|
|
75
|
+
provenance: { backend: this.metadata.name },
|
|
76
|
+
cause: error instanceof Error ? error : undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async *executeStream(request, signal) {
|
|
81
|
+
try {
|
|
82
|
+
const mistralRequest = this.fromIR(request);
|
|
83
|
+
mistralRequest.stream = true;
|
|
84
|
+
// Get effective streaming configuration
|
|
85
|
+
const streamingConfig = mergeStreamingConfig(this.config.streaming);
|
|
86
|
+
const effectiveMode = getEffectiveStreamMode(request.streamMode, undefined, streamingConfig);
|
|
87
|
+
const includeBoth = streamingConfig.includeBoth || effectiveMode === 'accumulated';
|
|
88
|
+
const response = await fetch(`${this.baseURL}/chat/completions`, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
93
|
+
...this.config.headers,
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify(mistralRequest),
|
|
96
|
+
signal,
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
const errorBody = await response.text();
|
|
100
|
+
throw createErrorFromHttpResponse(response.status, response.statusText, errorBody, {
|
|
101
|
+
backend: this.metadata.name,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (!response.body) {
|
|
105
|
+
throw new StreamError({
|
|
106
|
+
code: ErrorCode.STREAM_ERROR,
|
|
107
|
+
message: 'No response body',
|
|
108
|
+
provenance: { backend: this.metadata.name },
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
let sequence = 0;
|
|
112
|
+
yield {
|
|
113
|
+
type: 'start',
|
|
114
|
+
sequence: sequence++,
|
|
115
|
+
metadata: {
|
|
116
|
+
...request.metadata,
|
|
117
|
+
provenance: { ...request.metadata.provenance, backend: this.metadata.name },
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
const reader = response.body.getReader();
|
|
121
|
+
const decoder = new TextDecoder();
|
|
122
|
+
let buffer = '';
|
|
123
|
+
let contentBuffer = '';
|
|
124
|
+
try {
|
|
125
|
+
while (true) {
|
|
126
|
+
const { done, value } = await reader.read();
|
|
127
|
+
if (done) {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
buffer += decoder.decode(value, { stream: true });
|
|
131
|
+
const lines = buffer.split('\n');
|
|
132
|
+
buffer = lines.pop() || '';
|
|
133
|
+
for (const line of lines) {
|
|
134
|
+
if (!line.trim() || !line.startsWith('data: ')) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const data = line.slice(6).trim();
|
|
138
|
+
if (data === '[DONE]') {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const chunk = JSON.parse(data);
|
|
143
|
+
const delta = chunk.choices?.[0]?.delta?.content;
|
|
144
|
+
const finishReason = chunk.choices?.[0]?.finish_reason;
|
|
145
|
+
if (delta) {
|
|
146
|
+
contentBuffer += delta;
|
|
147
|
+
// Build content chunk with optional accumulated field
|
|
148
|
+
const contentChunk = {
|
|
149
|
+
type: 'content',
|
|
150
|
+
sequence: sequence++,
|
|
151
|
+
delta,
|
|
152
|
+
role: 'assistant',
|
|
153
|
+
};
|
|
154
|
+
// Add accumulated field if configured
|
|
155
|
+
if (includeBoth) {
|
|
156
|
+
contentChunk.accumulated = contentBuffer;
|
|
157
|
+
}
|
|
158
|
+
yield contentChunk;
|
|
159
|
+
}
|
|
160
|
+
if (finishReason) {
|
|
161
|
+
const message = { role: 'assistant', content: contentBuffer };
|
|
162
|
+
yield {
|
|
163
|
+
type: 'done',
|
|
164
|
+
sequence: sequence++,
|
|
165
|
+
finishReason: this.mapFinishReason(finishReason),
|
|
166
|
+
message,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (parseError) {
|
|
171
|
+
console.warn('Failed to parse Mistral SSE chunk:', data, parseError);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
reader.releaseLock();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
yield {
|
|
182
|
+
type: 'error',
|
|
183
|
+
sequence: 0,
|
|
184
|
+
error: {
|
|
185
|
+
code: error instanceof Error ? error.name : 'UNKNOWN_ERROR',
|
|
186
|
+
message: error instanceof Error ? error.message : String(error),
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async healthCheck() {
|
|
192
|
+
try {
|
|
193
|
+
const response = await fetch(`${this.baseURL}/models`, {
|
|
194
|
+
method: 'GET',
|
|
195
|
+
headers: { Authorization: `Bearer ${this.config.apiKey}` },
|
|
196
|
+
signal: AbortSignal.timeout(5000),
|
|
197
|
+
});
|
|
198
|
+
return response.ok;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
estimateCost(request) {
|
|
205
|
+
const estimatedTokens = this.estimateTokens(request);
|
|
206
|
+
return Promise.resolve((estimatedTokens / 1000) * 0.002); // Rough estimate: $0.002 per 1K tokens
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Convert IR request to Mistral format.
|
|
210
|
+
*
|
|
211
|
+
* Public method for testing and debugging - see what will be sent to Mistral.
|
|
212
|
+
*/
|
|
213
|
+
fromIR(request) {
|
|
214
|
+
const { messages } = normalizeSystemMessages(request.messages, this.metadata.capabilities.systemMessageStrategy, this.metadata.capabilities.supportsMultipleSystemMessages);
|
|
215
|
+
const mistralMessages = messages.map((msg) => ({
|
|
216
|
+
role: msg.role,
|
|
217
|
+
content: typeof msg.content === 'string'
|
|
218
|
+
? msg.content
|
|
219
|
+
: msg.content.map((c) => (c.type === 'text' ? c.text : JSON.stringify(c))).join(''),
|
|
220
|
+
}));
|
|
221
|
+
return {
|
|
222
|
+
model: request.parameters?.model || 'mistral-small',
|
|
223
|
+
messages: mistralMessages,
|
|
224
|
+
temperature: request.parameters?.temperature,
|
|
225
|
+
max_tokens: request.parameters?.maxTokens,
|
|
226
|
+
top_p: request.parameters?.topP,
|
|
227
|
+
stream: request.stream,
|
|
228
|
+
random_seed: request.parameters?.seed,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convert Mistral response to IR format.
|
|
233
|
+
*
|
|
234
|
+
* Public method for testing and debugging - parse Mistral responses manually.
|
|
235
|
+
*/
|
|
236
|
+
toIR(response, originalRequest, latencyMs) {
|
|
237
|
+
const choice = response.choices[0];
|
|
238
|
+
if (!choice) {
|
|
239
|
+
throw new AdapterConversionError({
|
|
240
|
+
code: ErrorCode.ADAPTER_CONVERSION_ERROR,
|
|
241
|
+
message: 'No choices in Mistral response',
|
|
242
|
+
provenance: { backend: this.metadata.name },
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const message = { role: 'assistant', content: choice.message.content };
|
|
246
|
+
return {
|
|
247
|
+
message,
|
|
248
|
+
finishReason: this.mapFinishReason(choice.finish_reason || 'stop'),
|
|
249
|
+
usage: {
|
|
250
|
+
promptTokens: response.usage.prompt_tokens,
|
|
251
|
+
completionTokens: response.usage.completion_tokens,
|
|
252
|
+
totalTokens: response.usage.total_tokens,
|
|
253
|
+
},
|
|
254
|
+
metadata: {
|
|
255
|
+
...originalRequest.metadata,
|
|
256
|
+
providerResponseId: response.id,
|
|
257
|
+
provenance: { ...originalRequest.metadata.provenance, backend: this.metadata.name },
|
|
258
|
+
custom: { ...originalRequest.metadata.custom, mistralResponseId: response.id, latencyMs },
|
|
259
|
+
},
|
|
260
|
+
raw: response,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
mapFinishReason(reason) {
|
|
264
|
+
switch (reason) {
|
|
265
|
+
case 'stop':
|
|
266
|
+
return 'stop';
|
|
267
|
+
case 'length':
|
|
268
|
+
case 'model_length':
|
|
269
|
+
return 'length';
|
|
270
|
+
default:
|
|
271
|
+
return 'stop';
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
estimateTokens(request) {
|
|
275
|
+
let totalChars = 0;
|
|
276
|
+
for (const message of request.messages) {
|
|
277
|
+
if (typeof message.content === 'string') {
|
|
278
|
+
totalChars += message.content.length;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return Math.ceil(totalChars / 4);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=mistral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral.js","sourceRoot":"","sources":["../../../src/providers/mistral.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NVIDIA Backend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Universal IR to NVIDIA NIM (NVIDIA Inference Microservices) API.
|
|
5
|
+
* NVIDIA NIM provides optimized inference for various models with OpenAI-compatible endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { OpenAIBackendAdapter } from './openai.js';
|
|
10
|
+
/**
|
|
11
|
+
* Backend adapter for NVIDIA NIM API.
|
|
12
|
+
*
|
|
13
|
+
* NVIDIA NIM (NVIDIA Inference Microservices) provides optimized inference
|
|
14
|
+
* with OpenAI-compatible API. Supports various models including Llama,
|
|
15
|
+
* Mistral, and other popular open-source models.
|
|
16
|
+
*
|
|
17
|
+
* @example Basic Usage
|
|
18
|
+
* ```typescript
|
|
19
|
+
* import { NVIDIABackendAdapter } from 'ai.matey';
|
|
20
|
+
*
|
|
21
|
+
* const adapter = new NVIDIABackendAdapter({
|
|
22
|
+
* apiKey: process.env.NVIDIA_API_KEY,
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example With Specific Model
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const adapter = new NVIDIABackendAdapter({
|
|
29
|
+
* apiKey: process.env.NVIDIA_API_KEY,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* const response = await adapter.execute({
|
|
33
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
34
|
+
* parameters: {
|
|
35
|
+
* model: 'meta/llama-3.1-405b-instruct',
|
|
36
|
+
* },
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example With Custom NIM Endpoint
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const adapter = new NVIDIABackendAdapter({
|
|
43
|
+
* apiKey: process.env.NVIDIA_API_KEY,
|
|
44
|
+
* baseURL: 'https://your-nim-endpoint.nvidia.com/v1',
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example Streaming with NVIDIA NIM
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const stream = adapter.executeStream({
|
|
51
|
+
* messages: [{ role: 'user', content: 'Tell me a story' }],
|
|
52
|
+
* parameters: {
|
|
53
|
+
* model: 'nvidia/llama-3.1-nemotron-70b-instruct',
|
|
54
|
+
* },
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* for await (const chunk of stream) {
|
|
58
|
+
* if (chunk.type === 'content') {
|
|
59
|
+
* console.log(chunk.delta);
|
|
60
|
+
* }
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export class NVIDIABackendAdapter extends OpenAIBackendAdapter {
|
|
65
|
+
constructor(config) {
|
|
66
|
+
// NVIDIA NIM API endpoint
|
|
67
|
+
const nvidiaConfig = {
|
|
68
|
+
...config,
|
|
69
|
+
baseURL: config.baseURL || 'https://integrate.api.nvidia.com/v1',
|
|
70
|
+
};
|
|
71
|
+
// Pass NVIDIA-specific metadata to parent constructor
|
|
72
|
+
super(nvidiaConfig, {
|
|
73
|
+
name: 'nvidia-backend',
|
|
74
|
+
version: '1.0.0',
|
|
75
|
+
provider: 'NVIDIA',
|
|
76
|
+
capabilities: {
|
|
77
|
+
streaming: true,
|
|
78
|
+
multiModal: false, // Most NIM models are text-only
|
|
79
|
+
tools: true,
|
|
80
|
+
maxContextTokens: 128000, // Varies by model
|
|
81
|
+
systemMessageStrategy: 'in-messages',
|
|
82
|
+
supportsMultipleSystemMessages: false,
|
|
83
|
+
supportsTemperature: true,
|
|
84
|
+
supportsTopP: true,
|
|
85
|
+
supportsTopK: false,
|
|
86
|
+
supportsSeed: true,
|
|
87
|
+
supportsFrequencyPenalty: true,
|
|
88
|
+
supportsPresencePenalty: true,
|
|
89
|
+
maxStopSequences: 4,
|
|
90
|
+
},
|
|
91
|
+
config: {
|
|
92
|
+
baseURL: nvidiaConfig.baseURL,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Health check for NVIDIA NIM API.
|
|
98
|
+
*/
|
|
99
|
+
async healthCheck() {
|
|
100
|
+
try {
|
|
101
|
+
const response = await fetch(`${this.baseURL}/models`, {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': 'application/json',
|
|
105
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
106
|
+
...this.config.headers,
|
|
107
|
+
},
|
|
108
|
+
signal: AbortSignal.timeout(5000),
|
|
109
|
+
});
|
|
110
|
+
return response.ok;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Estimate cost for NVIDIA NIM.
|
|
118
|
+
*/
|
|
119
|
+
async estimateCost(request) {
|
|
120
|
+
// NVIDIA NIM pricing varies by model and deployment
|
|
121
|
+
// For cloud API, estimate based on token usage
|
|
122
|
+
const estimatedInputTokens = (await super.estimateCost(request)) || 0;
|
|
123
|
+
const estimatedOutputTokens = Math.min(request.parameters?.maxTokens || 1000, 4000);
|
|
124
|
+
// Rough estimate for NVIDIA cloud API (varies by model)
|
|
125
|
+
// Self-hosted NIM is free (just compute costs)
|
|
126
|
+
const baseURL = this.metadata.config.baseURL;
|
|
127
|
+
if (baseURL.includes('integrate.api.nvidia.com')) {
|
|
128
|
+
const inputCost = (estimatedInputTokens * 1000 * 0.2) / 1_000_000; // Rough estimate
|
|
129
|
+
const outputCost = (estimatedOutputTokens / 1_000_000) * 0.2;
|
|
130
|
+
return inputCost + outputCost;
|
|
131
|
+
}
|
|
132
|
+
// Self-hosted or custom endpoint
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create an NVIDIA NIM backend adapter.
|
|
138
|
+
*
|
|
139
|
+
* @param config - Adapter configuration
|
|
140
|
+
* @returns NVIDIA backend adapter
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* import { createNVIDIAAdapter } from 'ai.matey';
|
|
145
|
+
*
|
|
146
|
+
* const adapter = createNVIDIAAdapter({
|
|
147
|
+
* apiKey: process.env.NVIDIA_API_KEY,
|
|
148
|
+
* });
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* @example Self-Hosted NIM
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const adapter = createNVIDIAAdapter({
|
|
154
|
+
* baseURL: 'http://localhost:8000/v1',
|
|
155
|
+
* apiKey: 'not-needed', // Self-hosted may not need API key
|
|
156
|
+
* });
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export function createNVIDIAAdapter(config) {
|
|
160
|
+
return new NVIDIABackendAdapter(config);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=nvidia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvidia.js","sourceRoot":"","sources":["../../../src/providers/nvidia.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAA2C,MAAM,aAAa,CAAC;AAG5F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,OAAO,oBACX,SAAQ,oBAAoB;IAG5B,YAAY,MAA4B;QACtC,0BAA0B;QAC1B,MAAM,YAAY,GAAyB;YACzC,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,qCAAqC;SACjE,CAAC;QAEF,sDAAsD;QACtD,KAAK,CAAC,YAAY,EAAE;YAClB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,KAAK,EAAE,gCAAgC;gBACnD,KAAK,EAAE,IAAI;gBACX,gBAAgB,EAAE,MAAM,EAAE,kBAAkB;gBAC5C,qBAAqB,EAAE,aAAa;gBACpC,8BAA8B,EAAE,KAAK;gBACrC,mBAAmB,EAAE,IAAI;gBACzB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAE,IAAI;gBAClB,wBAAwB,EAAE,IAAI;gBAC9B,uBAAuB,EAAE,IAAI;gBAC7B,gBAAgB,EAAE,CAAC;aACpB;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,YAAY,CAAC,OAAO;aAC9B;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;gBACrD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;oBAC7C,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;iBACvB;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAsB;QACvC,oDAAoD;QACpD,+CAA+C;QAC/C,MAAM,oBAAoB,GAAG,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;QAEpF,wDAAwD;QACxD,+CAA+C;QAC/C,MAAM,OAAO,GAAI,IAAI,CAAC,QAAQ,CAAC,MAA8B,CAAC,OAAO,CAAC;QACtE,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,iBAAiB;YACpF,MAAM,UAAU,GAAG,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;YAC7D,OAAO,SAAS,GAAG,UAAU,CAAC;QAChC,CAAC;QAED,iCAAiC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA4B;IAC9D,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|