@juspay/neurolink 2.1.0 → 3.0.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 (39) hide show
  1. package/CHANGELOG.md +29 -9
  2. package/README.md +17 -39
  3. package/dist/cli/index.js +28 -16
  4. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +1 -1
  5. package/dist/lib/providers/agent-enhanced-provider.js +61 -53
  6. package/dist/lib/providers/amazonBedrock.js +11 -7
  7. package/dist/lib/providers/anthropic.js +13 -11
  8. package/dist/lib/providers/azureOpenAI.js +10 -10
  9. package/dist/lib/providers/googleAIStudio.js +14 -7
  10. package/dist/lib/providers/googleVertexAI.js +14 -7
  11. package/dist/lib/providers/huggingFace.js +11 -7
  12. package/dist/lib/providers/mistralAI.js +11 -7
  13. package/dist/lib/providers/ollama.js +12 -4
  14. package/dist/lib/providers/openAI.js +11 -7
  15. package/dist/lib/providers/timeout-wrapper.d.ts +2 -2
  16. package/dist/lib/providers/timeout-wrapper.js +3 -3
  17. package/dist/lib/proxy/proxy-fetch.d.ts +18 -0
  18. package/dist/lib/proxy/proxy-fetch.js +64 -0
  19. package/dist/lib/utils/timeout.d.ts +4 -4
  20. package/dist/lib/utils/timeout.js +42 -34
  21. package/dist/mcp/plugins/filesystem-mcp.d.ts +1 -1
  22. package/dist/mcp/plugins/filesystem-mcp.js +1 -1
  23. package/dist/providers/agent-enhanced-provider.js +61 -53
  24. package/dist/providers/amazonBedrock.js +11 -7
  25. package/dist/providers/anthropic.js +13 -11
  26. package/dist/providers/azureOpenAI.js +10 -10
  27. package/dist/providers/googleAIStudio.js +14 -7
  28. package/dist/providers/googleVertexAI.js +14 -7
  29. package/dist/providers/huggingFace.js +11 -7
  30. package/dist/providers/mistralAI.js +11 -7
  31. package/dist/providers/ollama.js +12 -4
  32. package/dist/providers/openAI.js +11 -7
  33. package/dist/providers/timeout-wrapper.d.ts +2 -2
  34. package/dist/providers/timeout-wrapper.js +3 -3
  35. package/dist/proxy/proxy-fetch.d.ts +18 -0
  36. package/dist/proxy/proxy-fetch.js +64 -0
  37. package/dist/utils/timeout.d.ts +4 -4
  38. package/dist/utils/timeout.js +42 -34
  39. package/package.json +2 -1
@@ -6,7 +6,8 @@
6
6
  */
7
7
  import { AIProviderName } from "../core/types.js";
8
8
  import { logger } from "../utils/logger.js";
9
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
9
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
10
+ import { createProxyFetch } from "../proxy/proxy-fetch.js";
10
11
  export class AnthropicProvider {
11
12
  name = AIProviderName.ANTHROPIC;
12
13
  apiKey;
@@ -40,7 +41,8 @@ export class AnthropicProvider {
40
41
  };
41
42
  logger.debug(`[AnthropicProvider.makeRequest] ${stream ? "Streaming" : "Non-streaming"} request to ${url}`);
42
43
  logger.debug(`[AnthropicProvider.makeRequest] Model: ${body.model}, Max tokens: ${body.max_tokens}`);
43
- const response = await fetch(url, {
44
+ const proxyFetch = createProxyFetch();
45
+ const response = await proxyFetch(url, {
44
46
  method: "POST",
45
47
  headers,
46
48
  body: JSON.stringify(body),
@@ -61,7 +63,7 @@ export class AnthropicProvider {
61
63
  const options = typeof optionsOrPrompt === "string"
62
64
  ? { prompt: optionsOrPrompt }
63
65
  : optionsOrPrompt;
64
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", timeout = getDefaultTimeout(provider, 'generate'), } = options;
66
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", timeout = getDefaultTimeout(provider, "generate"), } = options;
65
67
  logger.debug(`[${functionTag}] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}, Timeout: ${timeout}`);
66
68
  const requestBody = {
67
69
  model: this.getModel(),
@@ -76,7 +78,7 @@ export class AnthropicProvider {
76
78
  system: systemPrompt,
77
79
  };
78
80
  // Create timeout controller if timeout is specified
79
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
81
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
80
82
  try {
81
83
  const response = await this.makeRequest("messages", requestBody, false, timeoutController?.controller.signal);
82
84
  const data = await response.json();
@@ -107,9 +109,9 @@ export class AnthropicProvider {
107
109
  message: error.message,
108
110
  });
109
111
  }
110
- else if (error?.name === 'AbortError') {
112
+ else if (error?.name === "AbortError") {
111
113
  // Convert AbortError to TimeoutError
112
- const timeoutError = new TimeoutError(`${provider} generate operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, 'generate');
114
+ const timeoutError = new TimeoutError(`${provider} generate operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, "generate");
113
115
  logger.error(`[${functionTag}] Timeout error`, {
114
116
  provider,
115
117
  timeout: timeoutController?.timeoutMs,
@@ -131,7 +133,7 @@ export class AnthropicProvider {
131
133
  const options = typeof optionsOrPrompt === "string"
132
134
  ? { prompt: optionsOrPrompt }
133
135
  : optionsOrPrompt;
134
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", timeout = getDefaultTimeout(provider, 'stream'), } = options;
136
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are Claude, an AI assistant created by Anthropic. You are helpful, harmless, and honest.", timeout = getDefaultTimeout(provider, "stream"), } = options;
135
137
  logger.debug(`[${functionTag}] Streaming prompt: "${prompt.substring(0, 100)}...", Timeout: ${timeout}`);
136
138
  const requestBody = {
137
139
  model: this.getModel(),
@@ -147,7 +149,7 @@ export class AnthropicProvider {
147
149
  stream: true,
148
150
  };
149
151
  // Create timeout controller if timeout is specified
150
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
152
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
151
153
  try {
152
154
  const response = await this.makeRequest("messages", requestBody, true, timeoutController?.controller.signal);
153
155
  if (!response.body) {
@@ -174,9 +176,9 @@ export class AnthropicProvider {
174
176
  message: error.message,
175
177
  });
176
178
  }
177
- else if (error?.name === 'AbortError') {
179
+ else if (error?.name === "AbortError") {
178
180
  // Convert AbortError to TimeoutError
179
- const timeoutError = new TimeoutError(`${provider} stream operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, 'stream');
181
+ const timeoutError = new TimeoutError(`${provider} stream operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, "stream");
180
182
  logger.error(`[${functionTag}] Timeout error`, {
181
183
  provider,
182
184
  timeout: timeoutController?.timeoutMs,
@@ -198,7 +200,7 @@ export class AnthropicProvider {
198
200
  while (true) {
199
201
  // Check if aborted
200
202
  if (signal?.aborted) {
201
- throw new Error('AbortError');
203
+ throw new Error("AbortError");
202
204
  }
203
205
  const { done, value } = await reader.read();
204
206
  if (done) {
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { AIProviderName } from "../core/types.js";
8
8
  import { logger } from "../utils/logger.js";
9
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
9
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
10
10
  export class AzureOpenAIProvider {
11
11
  name = AIProviderName.AZURE;
12
12
  apiKey;
@@ -74,7 +74,7 @@ export class AzureOpenAIProvider {
74
74
  const options = typeof optionsOrPrompt === "string"
75
75
  ? { prompt: optionsOrPrompt }
76
76
  : optionsOrPrompt;
77
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", timeout = getDefaultTimeout(provider, 'generate'), } = options;
77
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", timeout = getDefaultTimeout(provider, "generate"), } = options;
78
78
  logger.debug(`[${functionTag}] Prompt: "${prompt.substring(0, 100)}...", Temperature: ${temperature}, Max tokens: ${maxTokens}, Timeout: ${timeout}`);
79
79
  const messages = [];
80
80
  if (systemPrompt) {
@@ -93,7 +93,7 @@ export class AzureOpenAIProvider {
93
93
  max_tokens: maxTokens,
94
94
  };
95
95
  // Create timeout controller if timeout is specified
96
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
96
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
97
97
  try {
98
98
  const response = await this.makeRequest(requestBody, false, timeoutController?.controller.signal);
99
99
  const data = await response.json();
@@ -124,9 +124,9 @@ export class AzureOpenAIProvider {
124
124
  message: error.message,
125
125
  });
126
126
  }
127
- else if (error?.name === 'AbortError') {
127
+ else if (error?.name === "AbortError") {
128
128
  // Convert AbortError to TimeoutError
129
- const timeoutError = new TimeoutError(`${provider} generate operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, 'generate');
129
+ const timeoutError = new TimeoutError(`${provider} generate operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, "generate");
130
130
  logger.error(`[${functionTag}] Timeout error`, {
131
131
  provider,
132
132
  timeout: timeoutController?.timeoutMs,
@@ -148,7 +148,7 @@ export class AzureOpenAIProvider {
148
148
  const options = typeof optionsOrPrompt === "string"
149
149
  ? { prompt: optionsOrPrompt }
150
150
  : optionsOrPrompt;
151
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", timeout = getDefaultTimeout(provider, 'stream'), } = options;
151
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = "You are a helpful AI assistant.", timeout = getDefaultTimeout(provider, "stream"), } = options;
152
152
  logger.debug(`[${functionTag}] Streaming prompt: "${prompt.substring(0, 100)}...", Timeout: ${timeout}`);
153
153
  const messages = [];
154
154
  if (systemPrompt) {
@@ -168,7 +168,7 @@ export class AzureOpenAIProvider {
168
168
  stream: true,
169
169
  };
170
170
  // Create timeout controller if timeout is specified
171
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
171
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
172
172
  try {
173
173
  const response = await this.makeRequest(requestBody, true, timeoutController?.controller.signal);
174
174
  if (!response.body) {
@@ -195,9 +195,9 @@ export class AzureOpenAIProvider {
195
195
  message: error.message,
196
196
  });
197
197
  }
198
- else if (error?.name === 'AbortError') {
198
+ else if (error?.name === "AbortError") {
199
199
  // Convert AbortError to TimeoutError
200
- const timeoutError = new TimeoutError(`${provider} stream operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, 'stream');
200
+ const timeoutError = new TimeoutError(`${provider} stream operation timed out after ${timeout}`, timeoutController?.timeoutMs || 0, provider, "stream");
201
201
  logger.error(`[${functionTag}] Timeout error`, {
202
202
  provider,
203
203
  timeout: timeoutController?.timeoutMs,
@@ -219,7 +219,7 @@ export class AzureOpenAIProvider {
219
219
  while (true) {
220
220
  // Check if aborted
221
221
  if (signal?.aborted) {
222
- throw new Error('AbortError');
222
+ throw new Error("AbortError");
223
223
  }
224
224
  const { done, value } = await reader.read();
225
225
  if (done) {
@@ -1,7 +1,8 @@
1
1
  import { createGoogleGenerativeAI } from "@ai-sdk/google";
2
2
  import { streamText, generateText, Output, } from "ai";
3
3
  import { logger } from "../utils/logger.js";
4
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
4
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
5
+ import { createProxyFetch } from "../proxy/proxy-fetch.js";
5
6
  // CRITICAL: Setup environment variables early for AI SDK compatibility
6
7
  // The AI SDK specifically looks for GOOGLE_GENERATIVE_AI_API_KEY
7
8
  // We need to ensure this is set before any AI SDK operations
@@ -39,8 +40,10 @@ let _google = null;
39
40
  function getGoogleInstance() {
40
41
  if (!_google) {
41
42
  const apiKey = getGoogleAIApiKey();
43
+ const proxyFetch = createProxyFetch();
42
44
  _google = createGoogleGenerativeAI({
43
45
  apiKey: apiKey,
46
+ fetch: proxyFetch,
44
47
  headers: {
45
48
  "X-Powered-By": "NeuroLink",
46
49
  },
@@ -110,7 +113,7 @@ export class GoogleAIStudio {
110
113
  const options = typeof optionsOrPrompt === "string"
111
114
  ? { prompt: optionsOrPrompt }
112
115
  : optionsOrPrompt;
113
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, timeout = getDefaultTimeout(provider, 'stream'), } = options;
116
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, timeout = getDefaultTimeout(provider, "stream"), } = options;
114
117
  // Use schema from options or fallback parameter
115
118
  const finalSchema = schema || analysisSchema;
116
119
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -126,7 +129,7 @@ export class GoogleAIStudio {
126
129
  });
127
130
  const model = this.getModel();
128
131
  // Create timeout controller if timeout is specified
129
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
132
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
130
133
  const streamOptions = {
131
134
  model: model,
132
135
  prompt: prompt,
@@ -135,7 +138,9 @@ export class GoogleAIStudio {
135
138
  maxTokens,
136
139
  ...(tools && { tools }), // Add tools if provided
137
140
  // Add abort signal if available
138
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
141
+ ...(timeoutController && {
142
+ abortSignal: timeoutController.controller.signal,
143
+ }),
139
144
  onError: (event) => {
140
145
  const error = event.error;
141
146
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -219,7 +224,7 @@ export class GoogleAIStudio {
219
224
  const options = typeof optionsOrPrompt === "string"
220
225
  ? { prompt: optionsOrPrompt }
221
226
  : optionsOrPrompt;
222
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, timeout = getDefaultTimeout(provider, 'generate'), } = options;
227
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, tools, timeout = getDefaultTimeout(provider, "generate"), } = options;
223
228
  // Use schema from options or fallback parameter
224
229
  const finalSchema = schema || analysisSchema;
225
230
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -234,7 +239,7 @@ export class GoogleAIStudio {
234
239
  });
235
240
  const model = this.getModel();
236
241
  // Create timeout controller if timeout is specified
237
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
242
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
238
243
  const generateOptions = {
239
244
  model: model,
240
245
  prompt: prompt,
@@ -246,7 +251,9 @@ export class GoogleAIStudio {
246
251
  maxSteps: 5, // Allow multiple steps for tool execution and response generation
247
252
  }), // Add tools if provided
248
253
  // Add abort signal if available
249
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
254
+ ...(timeoutController && {
255
+ abortSignal: timeoutController.controller.signal,
256
+ }),
250
257
  };
251
258
  if (finalSchema) {
252
259
  generateOptions.experimental_output = Output.object({
@@ -23,7 +23,8 @@ async function getCreateVertexAnthropic() {
23
23
  }
24
24
  import { streamText, generateText, Output, } from "ai";
25
25
  import { logger } from "../utils/logger.js";
26
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
26
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
27
+ import { createProxyFetch } from "../proxy/proxy-fetch.js";
27
28
  // Default system context
28
29
  const DEFAULT_SYSTEM_CONTEXT = {
29
30
  systemPrompt: "You are a helpful AI assistant.",
@@ -146,9 +147,11 @@ const createVertexSettings = async () => {
146
147
  const functionTag = "createVertexSettings";
147
148
  // Setup authentication first
148
149
  await setupGoogleAuth();
150
+ const proxyFetch = createProxyFetch();
149
151
  const baseSettings = {
150
152
  project: getGCPVertexBreezeProjectId(),
151
153
  location: getGCPVertexBreezeLocation(),
154
+ fetch: proxyFetch,
152
155
  };
153
156
  // Method 1: Principal Account Authentication (file path) - Recommended for production
154
157
  if (hasPrincipalAccountAuth()) {
@@ -286,7 +289,7 @@ export class GoogleVertexAI {
286
289
  const options = typeof optionsOrPrompt === "string"
287
290
  ? { prompt: optionsOrPrompt }
288
291
  : optionsOrPrompt;
289
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'stream'), } = options;
292
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "stream"), } = options;
290
293
  // Use schema from options or fallback parameter
291
294
  const finalSchema = schema || analysisSchema;
292
295
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -301,7 +304,7 @@ export class GoogleVertexAI {
301
304
  });
302
305
  const model = await this.getModel();
303
306
  // Create timeout controller if timeout is specified
304
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
307
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
305
308
  const streamOptions = {
306
309
  model: model,
307
310
  prompt: prompt,
@@ -309,7 +312,9 @@ export class GoogleVertexAI {
309
312
  temperature,
310
313
  maxTokens,
311
314
  // Add abort signal if available
312
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
315
+ ...(timeoutController && {
316
+ abortSignal: timeoutController.controller.signal,
317
+ }),
313
318
  onError: (event) => {
314
319
  const error = event.error;
315
320
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -392,7 +397,7 @@ export class GoogleVertexAI {
392
397
  const options = typeof optionsOrPrompt === "string"
393
398
  ? { prompt: optionsOrPrompt }
394
399
  : optionsOrPrompt;
395
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'generate'), } = options;
400
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "generate"), } = options;
396
401
  // Use schema from options or fallback parameter
397
402
  const finalSchema = schema || analysisSchema;
398
403
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -406,7 +411,7 @@ export class GoogleVertexAI {
406
411
  });
407
412
  const model = await this.getModel();
408
413
  // Create timeout controller if timeout is specified
409
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
414
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
410
415
  const generateOptions = {
411
416
  model: model,
412
417
  prompt: prompt,
@@ -414,7 +419,9 @@ export class GoogleVertexAI {
414
419
  temperature,
415
420
  maxTokens,
416
421
  // Add abort signal if available
417
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
422
+ ...(timeoutController && {
423
+ abortSignal: timeoutController.controller.signal,
424
+ }),
418
425
  };
419
426
  if (finalSchema) {
420
427
  generateOptions.experimental_output = Output.object({
@@ -1,7 +1,7 @@
1
1
  import { HfInference } from "@huggingface/inference";
2
2
  import { streamText, generateText, Output, } from "ai";
3
3
  import { logger } from "../utils/logger.js";
4
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
4
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
5
5
  // Default system context
6
6
  const DEFAULT_SYSTEM_CONTEXT = {
7
7
  systemPrompt: "You are a helpful AI assistant.",
@@ -229,7 +229,7 @@ export class HuggingFace {
229
229
  const options = typeof optionsOrPrompt === "string"
230
230
  ? { prompt: optionsOrPrompt }
231
231
  : optionsOrPrompt;
232
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'stream'), } = options;
232
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "stream"), } = options;
233
233
  // Use schema from options or fallback parameter
234
234
  const finalSchema = schema || analysisSchema;
235
235
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -243,7 +243,7 @@ export class HuggingFace {
243
243
  });
244
244
  const model = this.getModel();
245
245
  // Create timeout controller if timeout is specified
246
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
246
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
247
247
  const streamOptions = {
248
248
  model: model,
249
249
  prompt: prompt,
@@ -251,7 +251,9 @@ export class HuggingFace {
251
251
  temperature,
252
252
  maxTokens,
253
253
  // Add abort signal if available
254
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
254
+ ...(timeoutController && {
255
+ abortSignal: timeoutController.controller.signal,
256
+ }),
255
257
  onError: (event) => {
256
258
  const error = event.error;
257
259
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -335,7 +337,7 @@ export class HuggingFace {
335
337
  const options = typeof optionsOrPrompt === "string"
336
338
  ? { prompt: optionsOrPrompt }
337
339
  : optionsOrPrompt;
338
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'generate'), } = options;
340
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "generate"), } = options;
339
341
  // Use schema from options or fallback parameter
340
342
  const finalSchema = schema || analysisSchema;
341
343
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -348,7 +350,7 @@ export class HuggingFace {
348
350
  });
349
351
  const model = this.getModel();
350
352
  // Create timeout controller if timeout is specified
351
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
353
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
352
354
  const generateOptions = {
353
355
  model: model,
354
356
  prompt: prompt,
@@ -356,7 +358,9 @@ export class HuggingFace {
356
358
  temperature,
357
359
  maxTokens,
358
360
  // Add abort signal if available
359
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
361
+ ...(timeoutController && {
362
+ abortSignal: timeoutController.controller.signal,
363
+ }),
360
364
  };
361
365
  if (finalSchema) {
362
366
  generateOptions.experimental_output = Output.object({
@@ -1,7 +1,7 @@
1
1
  import { createMistral } from "@ai-sdk/mistral";
2
2
  import { streamText, generateText, Output, } from "ai";
3
3
  import { logger } from "../utils/logger.js";
4
- import { createTimeoutController, TimeoutError, getDefaultTimeout } from "../utils/timeout.js";
4
+ import { createTimeoutController, TimeoutError, getDefaultTimeout, } from "../utils/timeout.js";
5
5
  // Default system context
6
6
  const DEFAULT_SYSTEM_CONTEXT = {
7
7
  systemPrompt: "You are a helpful AI assistant.",
@@ -89,7 +89,7 @@ export class MistralAI {
89
89
  const options = typeof optionsOrPrompt === "string"
90
90
  ? { prompt: optionsOrPrompt }
91
91
  : optionsOrPrompt;
92
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'stream'), } = options;
92
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "stream"), } = options;
93
93
  // Use schema from options or fallback parameter
94
94
  const finalSchema = schema || analysisSchema;
95
95
  logger.debug(`[${functionTag}] Stream request started`, {
@@ -103,7 +103,7 @@ export class MistralAI {
103
103
  });
104
104
  const model = this.getModel();
105
105
  // Create timeout controller if timeout is specified
106
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
106
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
107
107
  const streamOptions = {
108
108
  model: model,
109
109
  prompt: prompt,
@@ -111,7 +111,9 @@ export class MistralAI {
111
111
  temperature,
112
112
  maxTokens,
113
113
  // Add abort signal if available
114
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
114
+ ...(timeoutController && {
115
+ abortSignal: timeoutController.controller.signal,
116
+ }),
115
117
  onError: (event) => {
116
118
  const error = event.error;
117
119
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -195,7 +197,7 @@ export class MistralAI {
195
197
  const options = typeof optionsOrPrompt === "string"
196
198
  ? { prompt: optionsOrPrompt }
197
199
  : optionsOrPrompt;
198
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'generate'), } = options;
200
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "generate"), } = options;
199
201
  // Use schema from options or fallback parameter
200
202
  const finalSchema = schema || analysisSchema;
201
203
  logger.debug(`[${functionTag}] Generate request started`, {
@@ -208,7 +210,7 @@ export class MistralAI {
208
210
  });
209
211
  const model = this.getModel();
210
212
  // Create timeout controller if timeout is specified
211
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
213
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
212
214
  const generateOptions = {
213
215
  model: model,
214
216
  prompt: prompt,
@@ -216,7 +218,9 @@ export class MistralAI {
216
218
  temperature,
217
219
  maxTokens,
218
220
  // Add abort signal if available
219
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
221
+ ...(timeoutController && {
222
+ abortSignal: timeoutController.controller.signal,
223
+ }),
220
224
  };
221
225
  if (finalSchema) {
222
226
  generateOptions.experimental_output = Output.object({
@@ -281,8 +281,12 @@ export class Ollama {
281
281
  this.baseUrl = process.env.OLLAMA_BASE_URL || "http://localhost:11434";
282
282
  this.modelName = modelName || process.env.OLLAMA_MODEL || "llama2";
283
283
  // Use environment variable for backward compatibility, but convert to format used by other providers
284
- const envTimeout = process.env.OLLAMA_TIMEOUT ? parseInt(process.env.OLLAMA_TIMEOUT) : undefined;
285
- this.defaultTimeout = envTimeout || parseInt(getDefaultTimeout('ollama', 'generate').replace(/[^\d]/g, ''));
284
+ const envTimeout = process.env.OLLAMA_TIMEOUT
285
+ ? parseInt(process.env.OLLAMA_TIMEOUT)
286
+ : undefined;
287
+ this.defaultTimeout =
288
+ envTimeout ||
289
+ parseInt(getDefaultTimeout("ollama", "generate").replace(/[^\d]/g, ""));
286
290
  logger.debug("[Ollama] Initialized", {
287
291
  baseUrl: this.baseUrl,
288
292
  modelName: this.modelName,
@@ -397,7 +401,9 @@ export class Ollama {
397
401
  const finalSchema = schema || analysisSchema;
398
402
  // Convert timeout to milliseconds if provided as string
399
403
  const timeoutMs = timeout
400
- ? (typeof timeout === 'string' ? parseInt(getDefaultTimeout('ollama', 'generate').replace(/[^\d]/g, '')) : timeout)
404
+ ? typeof timeout === "string"
405
+ ? parseInt(getDefaultTimeout("ollama", "generate").replace(/[^\d]/g, ""))
406
+ : timeout
401
407
  : this.defaultTimeout;
402
408
  logger.debug(`[${functionTag}] Generate request started`, {
403
409
  provider,
@@ -460,7 +466,9 @@ export class Ollama {
460
466
  const finalSchema = schema || analysisSchema;
461
467
  // Convert timeout to milliseconds if provided as string
462
468
  const timeoutMs = timeout
463
- ? (typeof timeout === 'string' ? parseInt(getDefaultTimeout('ollama', 'stream').replace(/[^\d]/g, '')) : timeout)
469
+ ? typeof timeout === "string"
470
+ ? parseInt(getDefaultTimeout("ollama", "stream").replace(/[^\d]/g, ""))
471
+ : timeout
464
472
  : this.defaultTimeout;
465
473
  logger.debug(`[${functionTag}] Stream request started`, {
466
474
  provider,
@@ -1,7 +1,7 @@
1
1
  import { openai } from "@ai-sdk/openai";
2
2
  import { streamText, generateText, Output, } from "ai";
3
3
  import { logger } from "../utils/logger.js";
4
- import { createTimeoutController, getDefaultTimeout, TimeoutError } from "../utils/timeout.js";
4
+ import { createTimeoutController, getDefaultTimeout, TimeoutError, } from "../utils/timeout.js";
5
5
  // Default system context
6
6
  const DEFAULT_SYSTEM_CONTEXT = {
7
7
  systemPrompt: "You are a helpful AI assistant.",
@@ -60,7 +60,7 @@ export class OpenAI {
60
60
  const options = typeof optionsOrPrompt === "string"
61
61
  ? { prompt: optionsOrPrompt }
62
62
  : optionsOrPrompt;
63
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'stream'), } = options;
63
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "stream"), } = options;
64
64
  // Use schema from options or fallback parameter
65
65
  const finalSchema = schema || analysisSchema;
66
66
  logger.debug(`[${functionTag}] Stream text started`, {
@@ -72,7 +72,7 @@ export class OpenAI {
72
72
  timeout,
73
73
  });
74
74
  // Create timeout controller if timeout is specified
75
- const timeoutController = createTimeoutController(timeout, provider, 'stream');
75
+ const timeoutController = createTimeoutController(timeout, provider, "stream");
76
76
  const streamOptions = {
77
77
  model: this.model,
78
78
  prompt: prompt,
@@ -80,7 +80,9 @@ export class OpenAI {
80
80
  temperature,
81
81
  maxTokens,
82
82
  // Add abort signal if available
83
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
83
+ ...(timeoutController && {
84
+ abortSignal: timeoutController.controller.signal,
85
+ }),
84
86
  onError: (event) => {
85
87
  const error = event.error;
86
88
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -155,7 +157,7 @@ export class OpenAI {
155
157
  const options = typeof optionsOrPrompt === "string"
156
158
  ? { prompt: optionsOrPrompt }
157
159
  : optionsOrPrompt;
158
- const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, 'generate'), } = options;
160
+ const { prompt, temperature = 0.7, maxTokens = 1000, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "generate"), } = options;
159
161
  // Use schema from options or fallback parameter
160
162
  const finalSchema = schema || analysisSchema;
161
163
  logger.debug(`[${functionTag}] Generate text started`, {
@@ -167,7 +169,7 @@ export class OpenAI {
167
169
  timeout,
168
170
  });
169
171
  // Create timeout controller if timeout is specified
170
- const timeoutController = createTimeoutController(timeout, provider, 'generate');
172
+ const timeoutController = createTimeoutController(timeout, provider, "generate");
171
173
  const generateOptions = {
172
174
  model: this.model,
173
175
  prompt: prompt,
@@ -175,7 +177,9 @@ export class OpenAI {
175
177
  temperature,
176
178
  maxTokens,
177
179
  // Add abort signal if available
178
- ...(timeoutController && { abortSignal: timeoutController.controller.signal }),
180
+ ...(timeoutController && {
181
+ abortSignal: timeoutController.controller.signal,
182
+ }),
179
183
  };
180
184
  if (finalSchema) {
181
185
  generateOptions.experimental_output = Output.object({
@@ -11,7 +11,7 @@
11
11
  * @param operation - Operation type (generate or stream)
12
12
  * @returns The result of the promise or throws TimeoutError
13
13
  */
14
- export declare function withTimeout<T>(promise: Promise<T>, timeout: number | string | undefined, provider: string, operation: 'generate' | 'stream'): Promise<T>;
14
+ export declare function withTimeout<T>(promise: Promise<T>, timeout: number | string | undefined, provider: string, operation: "generate" | "stream"): Promise<T>;
15
15
  /**
16
16
  * Wrap a streaming async generator with timeout
17
17
  * @param generator - The async generator to wrap
@@ -27,7 +27,7 @@ export declare function withStreamingTimeout<T>(generator: AsyncGenerator<T>, ti
27
27
  * @param operation - Operation type
28
28
  * @returns AbortController and cleanup function
29
29
  */
30
- export declare function createTimeoutController(timeout: number | string | undefined, provider: string, operation: 'generate' | 'stream'): {
30
+ export declare function createTimeoutController(timeout: number | string | undefined, provider: string, operation: "generate" | "stream"): {
31
31
  controller: AbortController;
32
32
  cleanup: () => void;
33
33
  timeoutMs: number;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Provides a consistent way to add timeout functionality to any async operation.
5
5
  */
6
- import { parseTimeout, TimeoutError, createTimeoutPromise } from '../utils/timeout.js';
6
+ import { parseTimeout, TimeoutError, createTimeoutPromise, } from "../utils/timeout.js";
7
7
  /**
8
8
  * Wrap an async operation with a timeout
9
9
  * @param promise - The promise to wrap
@@ -40,7 +40,7 @@ export async function* withStreamingTimeout(generator, timeout, provider) {
40
40
  for await (const chunk of generator) {
41
41
  // Check if we've exceeded the timeout
42
42
  if (Date.now() - startTime > timeoutMs) {
43
- throw new TimeoutError(`${provider} streaming operation timed out after ${timeout}`, timeoutMs, provider, 'stream');
43
+ throw new TimeoutError(`${provider} streaming operation timed out after ${timeout}`, timeoutMs, provider, "stream");
44
44
  }
45
45
  yield chunk;
46
46
  }
@@ -84,7 +84,7 @@ export function mergeAbortSignals(signals) {
84
84
  // Listen to all signals and abort when any fires
85
85
  for (const signal of signals) {
86
86
  if (signal && !signal.aborted) {
87
- signal.addEventListener('abort', () => {
87
+ signal.addEventListener("abort", () => {
88
88
  if (!controller.signal.aborted) {
89
89
  controller.abort(signal.reason);
90
90
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Proxy-aware fetch implementation for AI SDK providers
3
+ * Implements the proven Vercel AI SDK proxy pattern using undici
4
+ */
5
+ /**
6
+ * Create a proxy-aware fetch function
7
+ * This implements the community-validated approach for Vercel AI SDK
8
+ */
9
+ export declare function createProxyFetch(): typeof fetch;
10
+ /**
11
+ * Get proxy status information
12
+ */
13
+ export declare function getProxyStatus(): {
14
+ enabled: boolean;
15
+ httpProxy: string | null;
16
+ httpsProxy: string | null;
17
+ method: string;
18
+ };