@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.
- package/CHANGELOG.md +29 -9
- package/README.md +17 -39
- package/dist/cli/index.js +28 -16
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +1 -1
- package/dist/lib/providers/agent-enhanced-provider.js +61 -53
- package/dist/lib/providers/amazonBedrock.js +11 -7
- package/dist/lib/providers/anthropic.js +13 -11
- package/dist/lib/providers/azureOpenAI.js +10 -10
- package/dist/lib/providers/googleAIStudio.js +14 -7
- package/dist/lib/providers/googleVertexAI.js +14 -7
- package/dist/lib/providers/huggingFace.js +11 -7
- package/dist/lib/providers/mistralAI.js +11 -7
- package/dist/lib/providers/ollama.js +12 -4
- package/dist/lib/providers/openAI.js +11 -7
- package/dist/lib/providers/timeout-wrapper.d.ts +2 -2
- package/dist/lib/providers/timeout-wrapper.js +3 -3
- package/dist/lib/proxy/proxy-fetch.d.ts +18 -0
- package/dist/lib/proxy/proxy-fetch.js +64 -0
- package/dist/lib/utils/timeout.d.ts +4 -4
- package/dist/lib/utils/timeout.js +42 -34
- package/dist/mcp/plugins/filesystem-mcp.d.ts +1 -1
- package/dist/mcp/plugins/filesystem-mcp.js +1 -1
- package/dist/providers/agent-enhanced-provider.js +61 -53
- package/dist/providers/amazonBedrock.js +11 -7
- package/dist/providers/anthropic.js +13 -11
- package/dist/providers/azureOpenAI.js +10 -10
- package/dist/providers/googleAIStudio.js +14 -7
- package/dist/providers/googleVertexAI.js +14 -7
- package/dist/providers/huggingFace.js +11 -7
- package/dist/providers/mistralAI.js +11 -7
- package/dist/providers/ollama.js +12 -4
- package/dist/providers/openAI.js +11 -7
- package/dist/providers/timeout-wrapper.d.ts +2 -2
- package/dist/providers/timeout-wrapper.js +3 -3
- package/dist/proxy/proxy-fetch.d.ts +18 -0
- package/dist/proxy/proxy-fetch.js +64 -0
- package/dist/utils/timeout.d.ts +4 -4
- package/dist/utils/timeout.js +42 -34
- 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
|
|
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,
|
|
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,
|
|
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 ===
|
|
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,
|
|
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,
|
|
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,
|
|
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 ===
|
|
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,
|
|
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(
|
|
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,
|
|
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,
|
|
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 ===
|
|
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,
|
|
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,
|
|
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,
|
|
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 ===
|
|
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,
|
|
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(
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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
|
|
285
|
-
|
|
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
|
-
?
|
|
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
|
-
?
|
|
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,
|
|
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,
|
|
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 && {
|
|
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,
|
|
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,
|
|
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 && {
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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(
|
|
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
|
+
};
|