@juspay/neurolink 5.0.0 → 5.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 (214) hide show
  1. package/CHANGELOG.md +20 -7
  2. package/README.md +160 -172
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/sse-handler.js +5 -4
  5. package/dist/chat/websocket-chat-handler.js +9 -9
  6. package/dist/cli/commands/config.d.ts +3 -3
  7. package/dist/cli/commands/mcp.js +9 -8
  8. package/dist/cli/commands/ollama.js +3 -3
  9. package/dist/cli/factories/command-factory.d.ts +18 -0
  10. package/dist/cli/factories/command-factory.js +183 -0
  11. package/dist/cli/index.js +105 -157
  12. package/dist/cli/utils/interactive-setup.js +2 -2
  13. package/dist/core/base-provider.d.ts +423 -0
  14. package/dist/core/base-provider.js +365 -0
  15. package/dist/core/constants.d.ts +1 -1
  16. package/dist/core/constants.js +1 -1
  17. package/dist/core/dynamic-models.d.ts +6 -6
  18. package/dist/core/evaluation.d.ts +19 -80
  19. package/dist/core/evaluation.js +185 -484
  20. package/dist/core/factory.d.ts +3 -3
  21. package/dist/core/factory.js +31 -91
  22. package/dist/core/service-registry.d.ts +47 -0
  23. package/dist/core/service-registry.js +112 -0
  24. package/dist/core/types.d.ts +49 -49
  25. package/dist/core/types.js +1 -0
  26. package/dist/factories/compatibility-factory.d.ts +20 -0
  27. package/dist/factories/compatibility-factory.js +69 -0
  28. package/dist/factories/provider-factory.d.ts +72 -0
  29. package/dist/factories/provider-factory.js +144 -0
  30. package/dist/factories/provider-generate-factory.d.ts +20 -0
  31. package/dist/factories/provider-generate-factory.js +87 -0
  32. package/dist/factories/provider-registry.d.ts +38 -0
  33. package/dist/factories/provider-registry.js +107 -0
  34. package/dist/index.d.ts +8 -5
  35. package/dist/index.js +5 -5
  36. package/dist/lib/agent/direct-tools.d.ts +6 -6
  37. package/dist/lib/chat/sse-handler.js +5 -4
  38. package/dist/lib/chat/websocket-chat-handler.js +9 -9
  39. package/dist/lib/core/base-provider.d.ts +423 -0
  40. package/dist/lib/core/base-provider.js +365 -0
  41. package/dist/lib/core/constants.d.ts +1 -1
  42. package/dist/lib/core/constants.js +1 -1
  43. package/dist/lib/core/dynamic-models.d.ts +6 -6
  44. package/dist/lib/core/evaluation.d.ts +19 -80
  45. package/dist/lib/core/evaluation.js +185 -484
  46. package/dist/lib/core/factory.d.ts +3 -3
  47. package/dist/lib/core/factory.js +30 -91
  48. package/dist/lib/core/service-registry.d.ts +47 -0
  49. package/dist/lib/core/service-registry.js +112 -0
  50. package/dist/lib/core/types.d.ts +49 -49
  51. package/dist/lib/core/types.js +1 -0
  52. package/dist/lib/factories/compatibility-factory.d.ts +20 -0
  53. package/dist/lib/factories/compatibility-factory.js +69 -0
  54. package/dist/lib/factories/provider-factory.d.ts +72 -0
  55. package/dist/lib/factories/provider-factory.js +144 -0
  56. package/dist/lib/factories/provider-generate-factory.d.ts +20 -0
  57. package/dist/lib/factories/provider-generate-factory.js +87 -0
  58. package/dist/lib/factories/provider-registry.d.ts +38 -0
  59. package/dist/lib/factories/provider-registry.js +107 -0
  60. package/dist/lib/index.d.ts +8 -5
  61. package/dist/lib/index.js +5 -5
  62. package/dist/lib/mcp/client.js +5 -5
  63. package/dist/lib/mcp/config.js +28 -3
  64. package/dist/lib/mcp/dynamic-orchestrator.js +8 -8
  65. package/dist/lib/mcp/external-client.js +2 -2
  66. package/dist/lib/mcp/factory.d.ts +1 -1
  67. package/dist/lib/mcp/factory.js +1 -1
  68. package/dist/lib/mcp/function-calling.js +1 -1
  69. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  70. package/dist/lib/mcp/initialize-tools.js +45 -1
  71. package/dist/lib/mcp/initialize.js +16 -6
  72. package/dist/lib/mcp/neurolink-mcp-client.js +10 -10
  73. package/dist/lib/mcp/orchestrator.js +4 -4
  74. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  75. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  76. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  77. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +8 -6
  78. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  79. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  80. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  81. package/dist/lib/mcp/unified-registry.js +42 -9
  82. package/dist/lib/neurolink.d.ts +161 -174
  83. package/dist/lib/neurolink.js +723 -397
  84. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  85. package/dist/lib/providers/amazon-bedrock.js +143 -0
  86. package/dist/lib/providers/analytics-helper.js +7 -4
  87. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  88. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  89. package/dist/lib/providers/anthropic.d.ts +19 -39
  90. package/dist/lib/providers/anthropic.js +84 -378
  91. package/dist/lib/providers/azure-openai.d.ts +20 -0
  92. package/dist/lib/providers/azure-openai.js +89 -0
  93. package/dist/lib/providers/function-calling-provider.d.ts +14 -12
  94. package/dist/lib/providers/function-calling-provider.js +114 -64
  95. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  96. package/dist/lib/providers/google-ai-studio.js +107 -0
  97. package/dist/lib/providers/google-vertex.d.ts +47 -0
  98. package/dist/lib/providers/google-vertex.js +205 -0
  99. package/dist/lib/providers/huggingFace.d.ts +33 -27
  100. package/dist/lib/providers/huggingFace.js +103 -400
  101. package/dist/lib/providers/index.d.ts +9 -9
  102. package/dist/lib/providers/index.js +9 -9
  103. package/dist/lib/providers/mcp-provider.d.ts +13 -8
  104. package/dist/lib/providers/mcp-provider.js +63 -18
  105. package/dist/lib/providers/mistral.d.ts +42 -0
  106. package/dist/lib/providers/mistral.js +160 -0
  107. package/dist/lib/providers/ollama.d.ts +52 -35
  108. package/dist/lib/providers/ollama.js +297 -477
  109. package/dist/lib/providers/openAI.d.ts +21 -21
  110. package/dist/lib/providers/openAI.js +81 -245
  111. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  112. package/dist/lib/sdk/tool-extension.js +283 -0
  113. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  114. package/dist/lib/sdk/tool-registration.js +167 -0
  115. package/dist/lib/types/generate-types.d.ts +80 -0
  116. package/dist/lib/types/generate-types.js +1 -0
  117. package/dist/lib/types/mcp-types.d.ts +116 -0
  118. package/dist/lib/types/mcp-types.js +5 -0
  119. package/dist/lib/types/stream-types.d.ts +95 -0
  120. package/dist/lib/types/stream-types.js +1 -0
  121. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  122. package/dist/lib/types/universal-provider-options.js +53 -0
  123. package/dist/lib/utils/providerUtils-fixed.js +1 -1
  124. package/dist/lib/utils/streaming-utils.d.ts +14 -2
  125. package/dist/lib/utils/streaming-utils.js +0 -3
  126. package/dist/mcp/client.js +5 -5
  127. package/dist/mcp/config.js +28 -3
  128. package/dist/mcp/dynamic-orchestrator.js +8 -8
  129. package/dist/mcp/external-client.js +2 -2
  130. package/dist/mcp/factory.d.ts +1 -1
  131. package/dist/mcp/factory.js +1 -1
  132. package/dist/mcp/function-calling.js +1 -1
  133. package/dist/mcp/initialize-tools.d.ts +1 -1
  134. package/dist/mcp/initialize-tools.js +45 -1
  135. package/dist/mcp/initialize.js +16 -6
  136. package/dist/mcp/neurolink-mcp-client.js +10 -10
  137. package/dist/mcp/orchestrator.js +4 -4
  138. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  139. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  140. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  141. package/dist/mcp/servers/ai-providers/ai-core-server.js +8 -6
  142. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  143. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  144. package/dist/mcp/unified-registry.d.ts +4 -0
  145. package/dist/mcp/unified-registry.js +42 -9
  146. package/dist/neurolink.d.ts +161 -174
  147. package/dist/neurolink.js +723 -397
  148. package/dist/providers/amazon-bedrock.d.ts +32 -0
  149. package/dist/providers/amazon-bedrock.js +143 -0
  150. package/dist/providers/analytics-helper.js +7 -4
  151. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  152. package/dist/providers/anthropic-baseprovider.js +114 -0
  153. package/dist/providers/anthropic.d.ts +19 -39
  154. package/dist/providers/anthropic.js +83 -377
  155. package/dist/providers/azure-openai.d.ts +20 -0
  156. package/dist/providers/azure-openai.js +89 -0
  157. package/dist/providers/function-calling-provider.d.ts +14 -12
  158. package/dist/providers/function-calling-provider.js +114 -64
  159. package/dist/providers/google-ai-studio.d.ts +23 -0
  160. package/dist/providers/google-ai-studio.js +108 -0
  161. package/dist/providers/google-vertex.d.ts +47 -0
  162. package/dist/providers/google-vertex.js +205 -0
  163. package/dist/providers/huggingFace.d.ts +33 -27
  164. package/dist/providers/huggingFace.js +102 -399
  165. package/dist/providers/index.d.ts +9 -9
  166. package/dist/providers/index.js +9 -9
  167. package/dist/providers/mcp-provider.d.ts +13 -8
  168. package/dist/providers/mcp-provider.js +63 -18
  169. package/dist/providers/mistral.d.ts +42 -0
  170. package/dist/providers/mistral.js +160 -0
  171. package/dist/providers/ollama.d.ts +52 -35
  172. package/dist/providers/ollama.js +297 -476
  173. package/dist/providers/openAI.d.ts +21 -21
  174. package/dist/providers/openAI.js +81 -246
  175. package/dist/sdk/tool-extension.d.ts +181 -0
  176. package/dist/sdk/tool-extension.js +283 -0
  177. package/dist/sdk/tool-registration.d.ts +95 -0
  178. package/dist/sdk/tool-registration.js +168 -0
  179. package/dist/types/generate-types.d.ts +80 -0
  180. package/dist/types/generate-types.js +1 -0
  181. package/dist/types/mcp-types.d.ts +116 -0
  182. package/dist/types/mcp-types.js +5 -0
  183. package/dist/types/stream-types.d.ts +95 -0
  184. package/dist/types/stream-types.js +1 -0
  185. package/dist/types/universal-provider-options.d.ts +87 -0
  186. package/dist/types/universal-provider-options.js +53 -0
  187. package/dist/utils/providerUtils-fixed.js +1 -1
  188. package/dist/utils/streaming-utils.d.ts +14 -2
  189. package/dist/utils/streaming-utils.js +0 -3
  190. package/package.json +15 -10
  191. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -89
  192. package/dist/lib/providers/agent-enhanced-provider.js +0 -614
  193. package/dist/lib/providers/amazonBedrock.d.ts +0 -19
  194. package/dist/lib/providers/amazonBedrock.js +0 -334
  195. package/dist/lib/providers/azureOpenAI.d.ts +0 -39
  196. package/dist/lib/providers/azureOpenAI.js +0 -436
  197. package/dist/lib/providers/googleAIStudio.d.ts +0 -49
  198. package/dist/lib/providers/googleAIStudio.js +0 -333
  199. package/dist/lib/providers/googleVertexAI.d.ts +0 -38
  200. package/dist/lib/providers/googleVertexAI.js +0 -519
  201. package/dist/lib/providers/mistralAI.d.ts +0 -34
  202. package/dist/lib/providers/mistralAI.js +0 -294
  203. package/dist/providers/agent-enhanced-provider.d.ts +0 -89
  204. package/dist/providers/agent-enhanced-provider.js +0 -614
  205. package/dist/providers/amazonBedrock.d.ts +0 -19
  206. package/dist/providers/amazonBedrock.js +0 -334
  207. package/dist/providers/azureOpenAI.d.ts +0 -39
  208. package/dist/providers/azureOpenAI.js +0 -437
  209. package/dist/providers/googleAIStudio.d.ts +0 -49
  210. package/dist/providers/googleAIStudio.js +0 -333
  211. package/dist/providers/googleVertexAI.d.ts +0 -38
  212. package/dist/providers/googleVertexAI.js +0 -519
  213. package/dist/providers/mistralAI.d.ts +0 -34
  214. package/dist/providers/mistralAI.js +0 -294
@@ -1,28 +1,28 @@
1
1
  import type { ZodType, ZodTypeDef } from "zod";
2
- import { type StreamTextResult, type ToolSet, type Schema, type GenerateTextResult, type LanguageModelV1 } from "ai";
3
- import type { AIProvider, TextGenerationOptions, StreamTextOptions, EnhancedGenerateTextResult } from "../core/types.js";
4
- export declare class OpenAI implements AIProvider {
5
- private modelName;
2
+ import { type Schema, type LanguageModelV1 } from "ai";
3
+ import { AIProviderName } from "../core/types.js";
4
+ import type { StreamOptions, StreamResult } from "../types/stream-types.js";
5
+ import { BaseProvider } from "../core/base-provider.js";
6
+ /**
7
+ * OpenAI Provider v2 - BaseProvider Implementation
8
+ * Migrated to use factory pattern with exact Google AI provider pattern
9
+ */
10
+ export declare class OpenAIProvider extends BaseProvider {
6
11
  private model;
7
- constructor(modelName?: string | null);
12
+ constructor(modelName?: string);
13
+ protected getProviderName(): AIProviderName;
14
+ protected getDefaultModel(): string;
8
15
  /**
9
- * Get the underlying model for function calling
16
+ * Returns the Vercel AI SDK model instance for OpenAI
10
17
  */
11
- getModel(): LanguageModelV1;
12
- streamText(optionsOrPrompt: StreamTextOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<StreamTextResult<ToolSet, unknown> | null>;
13
- generateText(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<GenerateTextResult<ToolSet, unknown> | null>;
18
+ protected getAISDKModel(): LanguageModelV1;
19
+ protected handleProviderError(error: any): Error;
14
20
  /**
15
- * Alias for generateText() - CLI-SDK consistency
16
- * @param optionsOrPrompt - TextGenerationOptions object or prompt string
17
- * @param analysisSchema - Optional schema for output validation
18
- * @returns Promise resolving to GenerateTextResult or null
21
+ * executeGenerate method removed - generation is now handled by BaseProvider.
22
+ * For details on the changes and migration steps, refer to the BaseProvider documentation
23
+ * and the migration guide in the project repository.
19
24
  */
20
- generate(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<EnhancedGenerateTextResult | null>;
21
- /**
22
- * Short alias for generateText() - CLI-SDK consistency
23
- * @param optionsOrPrompt - TextGenerationOptions object or prompt string
24
- * @param analysisSchema - Optional schema for output validation
25
- * @returns Promise resolving to GenerateTextResult or null
26
- */
27
- gen(optionsOrPrompt: TextGenerationOptions | string, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<EnhancedGenerateTextResult | null>;
25
+ protected executeStream(options: StreamOptions, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<StreamResult>;
26
+ private validateStreamOptions;
28
27
  }
28
+ export default OpenAIProvider;
@@ -1,276 +1,112 @@
1
1
  import { openai } from "@ai-sdk/openai";
2
- import { streamText, generateText, Output, } from "ai";
2
+ import { streamText } from "ai";
3
+ import { AIProviderName } from "../core/types.js";
4
+ import { BaseProvider } from "../core/base-provider.js";
3
5
  import { logger } from "../utils/logger.js";
4
- import { createTimeoutController, getDefaultTimeout, TimeoutError, } from "../utils/timeout.js";
6
+ import { createTimeoutController, TimeoutError, } from "../utils/timeout.js";
5
7
  import { DEFAULT_MAX_TOKENS } from "../core/constants.js";
6
- import { evaluateResponse } from "../core/evaluation.js";
7
- // Default system context
8
- const DEFAULT_SYSTEM_CONTEXT = {
9
- systemPrompt: "You are a helpful AI assistant.",
10
- };
11
8
  // Configuration helpers
12
9
  const getOpenAIApiKey = () => {
13
10
  const apiKey = process.env.OPENAI_API_KEY;
14
11
  if (!apiKey) {
15
- // 🔧 FIX: Enhanced error message with setup instructions
16
- throw new Error(`❌ OPENAI Provider Configuration Error
17
-
18
- Missing required environment variables: OPENAI_API_KEY
19
-
20
- 🔧 Step 1: Get Credentials
21
- Get your API key from https://platform.openai.com/api-keys
22
-
23
- 💡 Step 2: Add to your .env file (or export in CLI):
24
- OPENAI_API_KEY="sk-proj-your-openai-api-key"
25
- # Optional:
26
- OPENAI_MODEL="gpt-4o"
27
- OPENAI_BASE_URL="https://api.openai.com"
28
-
29
- 🚀 Step 3: Test the setup:
30
- npx neurolink generate "Hello" --provider openai
31
-
32
- 📖 Full setup guide: https://docs.neurolink.ai/providers/openai`);
12
+ throw new Error(`❌ OPENAI Provider Configuration Error\n\nMissing required environment variables: OPENAI_API_KEY\n\n🔧 Step 1: Get Credentials\n1. Visit: https://platform.openai.com/api-keys\n2. Create new API key\n3. Copy the key\n\n🔧 Step 2: Set Environment Variable\nAdd to your .env file:\nOPENAI_API_KEY=your_api_key_here\n\n🔧 Step 3: Restart Application\nRestart your application to load the new environment variables.`);
33
13
  }
34
14
  return apiKey;
35
15
  };
36
16
  const getOpenAIModel = () => {
37
17
  return process.env.OPENAI_MODEL || "gpt-4o";
38
18
  };
39
- // OpenAI class with enhanced error handling
40
- export class OpenAI {
41
- modelName;
19
+ /**
20
+ * OpenAI Provider v2 - BaseProvider Implementation
21
+ * Migrated to use factory pattern with exact Google AI provider pattern
22
+ */
23
+ export class OpenAIProvider extends BaseProvider {
42
24
  model;
43
25
  constructor(modelName) {
44
- const functionTag = "OpenAI.constructor";
45
- this.modelName = modelName || getOpenAIModel();
46
- try {
47
- logger.debug(`[${functionTag}] Function called`, {
48
- modelName: this.modelName,
49
- });
50
- // Set OpenAI API key as environment variable
51
- process.env.OPENAI_API_KEY = getOpenAIApiKey();
52
- this.model = openai(this.modelName);
53
- logger.debug(`[${functionTag}] Function result`, {
54
- modelName: this.modelName,
55
- success: true,
56
- });
57
- }
58
- catch (err) {
59
- logger.debug(`[${functionTag}] Exception`, {
60
- message: "Error in initializing OpenAI",
61
- modelName: this.modelName,
62
- err: String(err),
63
- });
64
- throw err;
65
- }
26
+ super(modelName, AIProviderName.OPENAI);
27
+ // Set OpenAI API key as environment variable (required by @ai-sdk/openai)
28
+ process.env.OPENAI_API_KEY = getOpenAIApiKey();
29
+ // Initialize model
30
+ this.model = openai(this.modelName);
31
+ logger.debug("OpenAIProviderV2 initialized", {
32
+ model: this.modelName,
33
+ provider: this.providerName,
34
+ });
35
+ }
36
+ // ===================
37
+ // ABSTRACT METHOD IMPLEMENTATIONS
38
+ // ===================
39
+ getProviderName() {
40
+ return AIProviderName.OPENAI;
41
+ }
42
+ getDefaultModel() {
43
+ return getOpenAIModel();
66
44
  }
67
45
  /**
68
- * Get the underlying model for function calling
46
+ * Returns the Vercel AI SDK model instance for OpenAI
69
47
  */
70
- getModel() {
48
+ getAISDKModel() {
71
49
  return this.model;
72
50
  }
73
- async streamText(optionsOrPrompt, analysisSchema) {
74
- const functionTag = "OpenAI.streamText";
75
- const provider = "openai";
76
- let chunkCount = 0;
77
- try {
78
- // Parse parameters - support both string and options object
79
- const options = typeof optionsOrPrompt === "string"
80
- ? { prompt: optionsOrPrompt }
81
- : optionsOrPrompt;
82
- const { prompt, temperature = 0.7, maxTokens = DEFAULT_MAX_TOKENS, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "stream"), } = options;
83
- // Use schema from options or fallback parameter
84
- const finalSchema = schema || analysisSchema;
85
- logger.debug(`[${functionTag}] Stream text started`, {
86
- provider,
87
- modelName: this.modelName,
88
- promptLength: prompt.length,
89
- temperature,
90
- maxTokens,
91
- timeout,
92
- });
93
- // Create timeout controller if timeout is specified
94
- const timeoutController = createTimeoutController(timeout, provider, "stream");
95
- const streamOptions = {
96
- model: this.model,
97
- prompt: prompt,
98
- system: systemPrompt,
99
- temperature,
100
- maxTokens,
101
- // Add abort signal if available
102
- ...(timeoutController && {
103
- abortSignal: timeoutController.controller.signal,
104
- }),
105
- onError: (event) => {
106
- const error = event.error;
107
- const errorMessage = error instanceof Error ? error.message : String(error);
108
- const errorStack = error instanceof Error ? error.stack : undefined;
109
- logger.debug(`[${functionTag}] Stream text error`, {
110
- provider,
111
- modelName: this.modelName,
112
- error: errorMessage,
113
- stack: errorStack,
114
- promptLength: prompt.length,
115
- chunkCount,
116
- });
117
- },
118
- onFinish: (event) => {
119
- logger.debug(`[${functionTag}] Stream text finished`, {
120
- provider,
121
- modelName: this.modelName,
122
- finishReason: event.finishReason,
123
- usage: event.usage,
124
- totalChunks: chunkCount,
125
- promptLength: prompt.length,
126
- responseLength: event.text?.length || 0,
127
- });
128
- },
129
- onChunk: (event) => {
130
- chunkCount++;
131
- logger.debug(`[${functionTag}] Stream text chunk`, {
132
- provider,
133
- modelName: this.modelName,
134
- chunkNumber: chunkCount,
135
- chunkLength: event.chunk.text?.length || 0,
136
- chunkType: event.chunk.type,
137
- });
138
- },
139
- };
140
- if (finalSchema) {
141
- streamOptions.experimental_output = Output.object({
142
- schema: finalSchema,
143
- });
144
- }
145
- const result = streamText(streamOptions);
146
- // For streaming, we can't clean up immediately, but the timeout will auto-clean
147
- // The user should handle the stream and any timeout errors
148
- return result;
51
+ handleProviderError(error) {
52
+ if (error instanceof TimeoutError) {
53
+ return new Error(`OpenAI request timed out: ${error.message}`);
54
+ }
55
+ if (error?.message?.includes("API_KEY_INVALID") ||
56
+ error?.message?.includes("Invalid API key")) {
57
+ return new Error("Invalid OpenAI API key. Please check your OPENAI_API_KEY environment variable.");
149
58
  }
150
- catch (err) {
151
- // Log timeout errors specifically
152
- if (err instanceof TimeoutError) {
153
- logger.debug(`[${functionTag}] Timeout error`, {
154
- provider,
155
- modelName: this.modelName,
156
- timeout: err.timeout,
157
- message: err.message,
158
- });
159
- }
160
- else {
161
- logger.debug(`[${functionTag}] Exception`, {
162
- provider,
163
- modelName: this.modelName,
164
- message: "Error in streaming text",
165
- err: String(err),
166
- });
167
- }
168
- throw err; // Re-throw error to trigger fallback
59
+ if (error?.message?.includes("rate limit")) {
60
+ return new Error("OpenAI rate limit exceeded. Please try again later.");
169
61
  }
62
+ return new Error(`OpenAI error: ${error?.message || "Unknown error"}`);
170
63
  }
171
- async generateText(optionsOrPrompt, analysisSchema) {
172
- const functionTag = "OpenAI.generateText";
173
- const provider = "openai";
174
- const startTime = Date.now();
64
+ /**
65
+ * executeGenerate method removed - generation is now handled by BaseProvider.
66
+ * For details on the changes and migration steps, refer to the BaseProvider documentation
67
+ * and the migration guide in the project repository.
68
+ */
69
+ async executeStream(options, analysisSchema) {
70
+ this.validateStreamOptions(options);
71
+ const timeout = this.getTimeout(options);
72
+ const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
175
73
  try {
176
- // Parse parameters - support both string and options object
177
- const options = typeof optionsOrPrompt === "string"
178
- ? { prompt: optionsOrPrompt }
179
- : optionsOrPrompt;
180
- const { prompt, temperature = 0.7, maxTokens = DEFAULT_MAX_TOKENS, systemPrompt = DEFAULT_SYSTEM_CONTEXT.systemPrompt, schema, timeout = getDefaultTimeout(provider, "generate"), } = options;
181
- // Use schema from options or fallback parameter
182
- const finalSchema = schema || analysisSchema;
183
- logger.debug(`[${functionTag}] Generate text started`, {
184
- provider,
185
- modelName: this.modelName,
186
- promptLength: prompt.length,
187
- temperature,
188
- maxTokens,
189
- timeout,
190
- });
191
- // Create timeout controller if timeout is specified
192
- const timeoutController = createTimeoutController(timeout, provider, "generate");
193
- const generateOptions = {
74
+ const result = await streamText({
194
75
  model: this.model,
195
- prompt: prompt,
196
- system: systemPrompt,
197
- temperature,
198
- maxTokens,
199
- // Add abort signal if available
200
- ...(timeoutController && {
201
- abortSignal: timeoutController.controller.signal,
202
- }),
203
- };
204
- if (finalSchema) {
205
- generateOptions.experimental_output = Output.object({
206
- schema: finalSchema,
207
- });
208
- }
209
- try {
210
- const result = await generateText(generateOptions);
211
- // Clean up timeout if successful
212
- timeoutController?.cleanup();
213
- logger.debug(`[${functionTag}] Generate text completed`, {
214
- provider,
215
- modelName: this.modelName,
216
- usage: result.usage,
217
- finishReason: result.finishReason,
218
- responseLength: result.text?.length || 0,
219
- timeout,
220
- });
221
- // Add analytics if enabled
222
- if (options.enableAnalytics) {
223
- const { createAnalytics } = await import("./analytics-helper.js");
224
- result.analytics = createAnalytics(provider, this.modelName, result, Date.now() - startTime, options.context);
225
- }
226
- // Add evaluation if enabled
227
- if (options.enableEvaluation) {
228
- result.evaluation = await evaluateResponse(prompt, result.text, options.context, options.evaluationDomain, options.toolUsageContext, options.conversationHistory);
76
+ prompt: options.input.text,
77
+ system: options.systemPrompt,
78
+ temperature: options.temperature,
79
+ maxTokens: options.maxTokens || DEFAULT_MAX_TOKENS,
80
+ tools: options.tools,
81
+ toolChoice: "auto",
82
+ abortSignal: timeoutController?.controller.signal,
83
+ });
84
+ timeoutController?.cleanup();
85
+ // Transform stream to match StreamResult interface
86
+ const transformedStream = async function* () {
87
+ for await (const chunk of result.textStream) {
88
+ yield { content: chunk };
229
89
  }
230
- return result;
231
- }
232
- finally {
233
- // Always cleanup timeout
234
- timeoutController?.cleanup();
235
- }
90
+ };
91
+ return {
92
+ stream: transformedStream(),
93
+ provider: this.providerName,
94
+ model: this.modelName,
95
+ };
236
96
  }
237
- catch (err) {
238
- // Log timeout errors specifically
239
- if (err instanceof TimeoutError) {
240
- logger.debug(`[${functionTag}] Timeout error`, {
241
- provider,
242
- modelName: this.modelName,
243
- timeout: err.timeout,
244
- message: err.message,
245
- });
246
- }
247
- else {
248
- logger.debug(`[${functionTag}] Exception`, {
249
- provider,
250
- modelName: this.modelName,
251
- message: "Error in generating text",
252
- err: String(err),
253
- });
254
- }
255
- throw err; // Re-throw error to trigger fallback
97
+ catch (error) {
98
+ timeoutController?.cleanup();
99
+ throw this.handleProviderError(error);
256
100
  }
257
101
  }
258
- /**
259
- * Alias for generateText() - CLI-SDK consistency
260
- * @param optionsOrPrompt - TextGenerationOptions object or prompt string
261
- * @param analysisSchema - Optional schema for output validation
262
- * @returns Promise resolving to GenerateTextResult or null
263
- */
264
- async generate(optionsOrPrompt, analysisSchema) {
265
- return this.generateText(optionsOrPrompt, analysisSchema);
266
- }
267
- /**
268
- * Short alias for generateText() - CLI-SDK consistency
269
- * @param optionsOrPrompt - TextGenerationOptions object or prompt string
270
- * @param analysisSchema - Optional schema for output validation
271
- * @returns Promise resolving to GenerateTextResult or null
272
- */
273
- async gen(optionsOrPrompt, analysisSchema) {
274
- return this.generateText(optionsOrPrompt, analysisSchema);
102
+ // ===================
103
+ // PRIVATE VALIDATION METHODS
104
+ // ===================
105
+ validateStreamOptions(options) {
106
+ if (!options.input?.text || options.input.text.trim().length === 0) {
107
+ throw new Error("Input text is required and cannot be empty");
108
+ }
275
109
  }
276
110
  }
111
+ // Export for factory registration
112
+ export default OpenAIProvider;
@@ -0,0 +1,181 @@
1
+ /**
2
+ * NeuroLink SDK Tool Extension System
3
+ * Allows developers to register custom tools that integrate with AI providers
4
+ */
5
+ import { z } from "zod";
6
+ import type { Tool } from "ai";
7
+ import { logger } from "../utils/logger.js";
8
+ /**
9
+ * Custom tool interface for SDK users
10
+ */
11
+ export interface CustomTool {
12
+ /**
13
+ * Tool description that helps AI understand when to use it
14
+ */
15
+ description: string;
16
+ /**
17
+ * Parameters schema using Zod or JSON Schema
18
+ */
19
+ parameters?: z.ZodSchema | Record<string, any>;
20
+ /**
21
+ * Tool execution function
22
+ */
23
+ execute: (args: any, context?: ToolContext) => Promise<any> | any;
24
+ /**
25
+ * Optional metadata
26
+ */
27
+ category?: string;
28
+ version?: string;
29
+ author?: string;
30
+ /**
31
+ * Optional configuration
32
+ */
33
+ config?: {
34
+ timeout?: number;
35
+ retries?: number;
36
+ rateLimit?: {
37
+ requests: number;
38
+ window: number;
39
+ };
40
+ };
41
+ }
42
+ /**
43
+ * Context provided to tools during execution
44
+ */
45
+ export interface ToolContext {
46
+ /**
47
+ * Call another tool
48
+ */
49
+ callTool: (name: string, args: any) => Promise<any>;
50
+ /**
51
+ * Current session information
52
+ */
53
+ session: {
54
+ id: string;
55
+ userId?: string;
56
+ provider?: string;
57
+ model?: string;
58
+ };
59
+ /**
60
+ * Logger instance
61
+ */
62
+ logger: typeof logger;
63
+ }
64
+ /**
65
+ * Tool middleware function
66
+ */
67
+ export type ToolMiddleware = (toolName: string, args: any, next: () => Promise<any>, context: ToolContext) => Promise<any>;
68
+ /**
69
+ * Tool permission configuration
70
+ */
71
+ export interface ToolPermissions {
72
+ allowlist?: string[];
73
+ denylist?: string[];
74
+ requireApproval?: string[];
75
+ customValidator?: (toolName: string, args: any) => boolean | Promise<boolean>;
76
+ }
77
+ /**
78
+ * Converts a custom tool to Vercel AI SDK format
79
+ */
80
+ export declare function convertToAISDKTool(name: string, customTool: CustomTool): Tool;
81
+ /**
82
+ * Tool registry for managing custom tools
83
+ */
84
+ export declare class ToolRegistry {
85
+ private tools;
86
+ private middleware;
87
+ private permissions;
88
+ private rateLimits;
89
+ /**
90
+ * Simple rate limiting check with automatic cleanup
91
+ */
92
+ private checkRateLimit;
93
+ /**
94
+ * Register a custom tool
95
+ */
96
+ register(name: string, tool: CustomTool): void;
97
+ /**
98
+ * Register multiple tools at once
99
+ */
100
+ registerMany(tools: Record<string, CustomTool>): void;
101
+ /**
102
+ * Unregister a tool
103
+ */
104
+ unregister(name: string): boolean;
105
+ /**
106
+ * Get a tool by name
107
+ */
108
+ get(name: string): CustomTool | undefined;
109
+ /**
110
+ * Get all registered tools
111
+ */
112
+ getAll(): Map<string, CustomTool>;
113
+ /**
114
+ * Convert all tools to AI SDK format
115
+ */
116
+ toAISDKTools(): Record<string, Tool>;
117
+ /**
118
+ * Add middleware
119
+ */
120
+ use(middleware: ToolMiddleware): void;
121
+ /**
122
+ * Set permissions
123
+ */
124
+ setPermissions(permissions: ToolPermissions): void;
125
+ /**
126
+ * Check if a tool is allowed
127
+ */
128
+ private isToolAllowed;
129
+ /**
130
+ * Execute a tool with middleware
131
+ */
132
+ execute(name: string, args: any, context: ToolContext): Promise<any>;
133
+ }
134
+ /**
135
+ * Create a simple tool helper
136
+ */
137
+ export declare function createTool(config: CustomTool): CustomTool;
138
+ /**
139
+ * Create an async tool helper
140
+ */
141
+ export declare function createAsyncTool(config: Omit<CustomTool, "execute"> & {
142
+ execute: (args: any, context?: ToolContext) => Promise<any>;
143
+ }): CustomTool;
144
+ /**
145
+ * Create a batch tool that processes multiple items
146
+ */
147
+ export declare function createBatchTool<T, R>(config: Omit<CustomTool, "execute" | "parameters"> & {
148
+ parameters: z.ZodSchema<{
149
+ items: T[];
150
+ }>;
151
+ processItem: (item: T, context?: ToolContext) => Promise<R> | R;
152
+ batchSize?: number;
153
+ }): CustomTool;
154
+ /**
155
+ * Tool testing utilities
156
+ */
157
+ export declare const TestUtils: {
158
+ /**
159
+ * Create a mock tool context
160
+ */
161
+ mockContext(overrides?: Partial<ToolContext>): ToolContext;
162
+ /**
163
+ * Test a tool with mock data
164
+ */
165
+ testTool(tool: CustomTool, testCases: Array<{
166
+ input: any;
167
+ expected?: any;
168
+ }>): Promise<({
169
+ input: any;
170
+ output: any;
171
+ success: boolean;
172
+ matches: boolean | undefined;
173
+ error?: undefined;
174
+ } | {
175
+ input: any;
176
+ error: string;
177
+ success: boolean;
178
+ output?: undefined;
179
+ matches?: undefined;
180
+ })[]>;
181
+ };