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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index.js +60 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/providers/ai21.js +331 -0
  5. package/dist/cjs/providers/ai21.js.map +1 -0
  6. package/dist/cjs/providers/anthropic.js +664 -0
  7. package/dist/cjs/providers/anthropic.js.map +1 -0
  8. package/dist/cjs/providers/anyscale.js +338 -0
  9. package/dist/cjs/providers/anyscale.js.map +1 -0
  10. package/dist/cjs/providers/aws-bedrock.js +374 -0
  11. package/dist/cjs/providers/aws-bedrock.js.map +1 -0
  12. package/dist/cjs/providers/azure-openai.js +406 -0
  13. package/dist/cjs/providers/azure-openai.js.map +1 -0
  14. package/dist/cjs/providers/cerebras.js +356 -0
  15. package/dist/cjs/providers/cerebras.js.map +1 -0
  16. package/dist/cjs/providers/cloudflare.js +359 -0
  17. package/dist/cjs/providers/cloudflare.js.map +1 -0
  18. package/dist/cjs/providers/cohere.js +368 -0
  19. package/dist/cjs/providers/cohere.js.map +1 -0
  20. package/dist/cjs/providers/deepinfra.js +343 -0
  21. package/dist/cjs/providers/deepinfra.js.map +1 -0
  22. package/dist/cjs/providers/deepseek.js +104 -0
  23. package/dist/cjs/providers/deepseek.js.map +1 -0
  24. package/dist/cjs/providers/fireworks.js +363 -0
  25. package/dist/cjs/providers/fireworks.js.map +1 -0
  26. package/dist/cjs/providers/gemini.js +292 -0
  27. package/dist/cjs/providers/gemini.js.map +1 -0
  28. package/dist/cjs/providers/groq.js +143 -0
  29. package/dist/cjs/providers/groq.js.map +1 -0
  30. package/dist/cjs/providers/huggingface.js +392 -0
  31. package/dist/cjs/providers/huggingface.js.map +1 -0
  32. package/dist/cjs/providers/lmstudio.js +144 -0
  33. package/dist/cjs/providers/lmstudio.js.map +1 -0
  34. package/dist/cjs/providers/mistral.js +288 -0
  35. package/dist/cjs/providers/mistral.js.map +1 -0
  36. package/dist/cjs/providers/nvidia.js +167 -0
  37. package/dist/cjs/providers/nvidia.js.map +1 -0
  38. package/dist/cjs/providers/ollama.js +257 -0
  39. package/dist/cjs/providers/ollama.js.map +1 -0
  40. package/dist/cjs/providers/openai.js +640 -0
  41. package/dist/cjs/providers/openai.js.map +1 -0
  42. package/dist/cjs/providers/openrouter.js +379 -0
  43. package/dist/cjs/providers/openrouter.js.map +1 -0
  44. package/dist/cjs/providers/perplexity.js +372 -0
  45. package/dist/cjs/providers/perplexity.js.map +1 -0
  46. package/dist/cjs/providers/replicate.js +340 -0
  47. package/dist/cjs/providers/replicate.js.map +1 -0
  48. package/dist/cjs/providers/together-ai.js +341 -0
  49. package/dist/cjs/providers/together-ai.js.map +1 -0
  50. package/dist/cjs/providers/xai.js +339 -0
  51. package/dist/cjs/providers/xai.js.map +1 -0
  52. package/dist/cjs/shared.js +279 -0
  53. package/dist/cjs/shared.js.map +1 -0
  54. package/dist/esm/index.js +44 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/providers/ai21.js +327 -0
  57. package/dist/esm/providers/ai21.js.map +1 -0
  58. package/dist/esm/providers/anthropic.js +660 -0
  59. package/dist/esm/providers/anthropic.js.map +1 -0
  60. package/dist/esm/providers/anyscale.js +334 -0
  61. package/dist/esm/providers/anyscale.js.map +1 -0
  62. package/dist/esm/providers/aws-bedrock.js +370 -0
  63. package/dist/esm/providers/aws-bedrock.js.map +1 -0
  64. package/dist/esm/providers/azure-openai.js +402 -0
  65. package/dist/esm/providers/azure-openai.js.map +1 -0
  66. package/dist/esm/providers/cerebras.js +352 -0
  67. package/dist/esm/providers/cerebras.js.map +1 -0
  68. package/dist/esm/providers/cloudflare.js +355 -0
  69. package/dist/esm/providers/cloudflare.js.map +1 -0
  70. package/dist/esm/providers/cohere.js +364 -0
  71. package/dist/esm/providers/cohere.js.map +1 -0
  72. package/dist/esm/providers/deepinfra.js +339 -0
  73. package/dist/esm/providers/deepinfra.js.map +1 -0
  74. package/dist/esm/providers/deepseek.js +99 -0
  75. package/dist/esm/providers/deepseek.js.map +1 -0
  76. package/dist/esm/providers/fireworks.js +359 -0
  77. package/dist/esm/providers/fireworks.js.map +1 -0
  78. package/dist/esm/providers/gemini.js +288 -0
  79. package/dist/esm/providers/gemini.js.map +1 -0
  80. package/dist/esm/providers/groq.js +138 -0
  81. package/dist/esm/providers/groq.js.map +1 -0
  82. package/dist/esm/providers/huggingface.js +387 -0
  83. package/dist/esm/providers/huggingface.js.map +1 -0
  84. package/dist/esm/providers/lmstudio.js +139 -0
  85. package/dist/esm/providers/lmstudio.js.map +1 -0
  86. package/dist/esm/providers/mistral.js +284 -0
  87. package/dist/esm/providers/mistral.js.map +1 -0
  88. package/dist/esm/providers/nvidia.js +162 -0
  89. package/dist/esm/providers/nvidia.js.map +1 -0
  90. package/dist/esm/providers/ollama.js +253 -0
  91. package/dist/esm/providers/ollama.js.map +1 -0
  92. package/dist/esm/providers/openai.js +636 -0
  93. package/dist/esm/providers/openai.js.map +1 -0
  94. package/dist/esm/providers/openrouter.js +375 -0
  95. package/dist/esm/providers/openrouter.js.map +1 -0
  96. package/dist/esm/providers/perplexity.js +368 -0
  97. package/dist/esm/providers/perplexity.js.map +1 -0
  98. package/dist/esm/providers/replicate.js +336 -0
  99. package/dist/esm/providers/replicate.js.map +1 -0
  100. package/dist/esm/providers/together-ai.js +337 -0
  101. package/dist/esm/providers/together-ai.js.map +1 -0
  102. package/dist/esm/providers/xai.js +335 -0
  103. package/dist/esm/providers/xai.js.map +1 -0
  104. package/dist/esm/shared.js +272 -0
  105. package/dist/esm/shared.js.map +1 -0
  106. package/dist/types/index.d.ts +38 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/providers/ai21.d.ts +106 -0
  109. package/dist/types/providers/ai21.d.ts.map +1 -0
  110. package/dist/types/providers/anthropic.d.ts +194 -0
  111. package/dist/types/providers/anthropic.d.ts.map +1 -0
  112. package/dist/types/providers/anyscale.d.ts +109 -0
  113. package/dist/types/providers/anyscale.d.ts.map +1 -0
  114. package/dist/types/providers/aws-bedrock.d.ts +152 -0
  115. package/dist/types/providers/aws-bedrock.d.ts.map +1 -0
  116. package/dist/types/providers/azure-openai.d.ts +142 -0
  117. package/dist/types/providers/azure-openai.d.ts.map +1 -0
  118. package/dist/types/providers/cerebras.d.ts +130 -0
  119. package/dist/types/providers/cerebras.d.ts.map +1 -0
  120. package/dist/types/providers/cloudflare.d.ts +125 -0
  121. package/dist/types/providers/cloudflare.d.ts.map +1 -0
  122. package/dist/types/providers/cohere.d.ts +114 -0
  123. package/dist/types/providers/cohere.d.ts.map +1 -0
  124. package/dist/types/providers/deepinfra.d.ts +118 -0
  125. package/dist/types/providers/deepinfra.d.ts.map +1 -0
  126. package/dist/types/providers/deepseek.d.ts +68 -0
  127. package/dist/types/providers/deepseek.d.ts.map +1 -0
  128. package/dist/types/providers/fireworks.d.ts +127 -0
  129. package/dist/types/providers/fireworks.d.ts.map +1 -0
  130. package/dist/types/providers/gemini.d.ts +71 -0
  131. package/dist/types/providers/gemini.d.ts.map +1 -0
  132. package/dist/types/providers/groq.d.ts +83 -0
  133. package/dist/types/providers/groq.d.ts.map +1 -0
  134. package/dist/types/providers/huggingface.d.ts +154 -0
  135. package/dist/types/providers/huggingface.d.ts.map +1 -0
  136. package/dist/types/providers/lmstudio.d.ts +88 -0
  137. package/dist/types/providers/lmstudio.d.ts.map +1 -0
  138. package/dist/types/providers/mistral.d.ts +65 -0
  139. package/dist/types/providers/mistral.d.ts.map +1 -0
  140. package/dist/types/providers/nvidia.d.ts +100 -0
  141. package/dist/types/providers/nvidia.d.ts.map +1 -0
  142. package/dist/types/providers/ollama.d.ts +59 -0
  143. package/dist/types/providers/ollama.d.ts.map +1 -0
  144. package/dist/types/providers/openai.d.ts +205 -0
  145. package/dist/types/providers/openai.d.ts.map +1 -0
  146. package/dist/types/providers/openrouter.d.ts +135 -0
  147. package/dist/types/providers/openrouter.d.ts.map +1 -0
  148. package/dist/types/providers/perplexity.d.ts +116 -0
  149. package/dist/types/providers/perplexity.d.ts.map +1 -0
  150. package/dist/types/providers/replicate.d.ts +91 -0
  151. package/dist/types/providers/replicate.d.ts.map +1 -0
  152. package/dist/types/providers/together-ai.d.ts +118 -0
  153. package/dist/types/providers/together-ai.d.ts.map +1 -0
  154. package/dist/types/providers/xai.d.ts +119 -0
  155. package/dist/types/providers/xai.d.ts.map +1 -0
  156. package/dist/types/shared.d.ts +116 -0
  157. package/dist/types/shared.d.ts.map +1 -0
  158. package/package.json +327 -0
  159. 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"}