@juspay/neurolink 7.7.1 → 7.9.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 (95) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/README.md +34 -2
  3. package/dist/cli/commands/config.d.ts +3 -3
  4. package/dist/cli/commands/sagemaker.d.ts +11 -0
  5. package/dist/cli/commands/sagemaker.js +778 -0
  6. package/dist/cli/factories/commandFactory.js +7 -2
  7. package/dist/cli/index.js +3 -0
  8. package/dist/cli/utils/interactiveSetup.js +28 -0
  9. package/dist/core/baseProvider.d.ts +2 -2
  10. package/dist/core/types.d.ts +16 -4
  11. package/dist/core/types.js +24 -3
  12. package/dist/factories/providerFactory.js +10 -1
  13. package/dist/factories/providerRegistry.js +6 -1
  14. package/dist/lib/core/baseProvider.d.ts +2 -2
  15. package/dist/lib/core/types.d.ts +16 -4
  16. package/dist/lib/core/types.js +24 -3
  17. package/dist/lib/factories/providerFactory.js +10 -1
  18. package/dist/lib/factories/providerRegistry.js +6 -1
  19. package/dist/lib/neurolink.d.ts +15 -0
  20. package/dist/lib/neurolink.js +73 -1
  21. package/dist/lib/providers/amazonSagemaker.d.ts +67 -0
  22. package/dist/lib/providers/amazonSagemaker.js +149 -0
  23. package/dist/lib/providers/googleVertex.d.ts +4 -0
  24. package/dist/lib/providers/googleVertex.js +44 -3
  25. package/dist/lib/providers/index.d.ts +4 -0
  26. package/dist/lib/providers/index.js +4 -0
  27. package/dist/lib/providers/sagemaker/adaptive-semaphore.d.ts +86 -0
  28. package/dist/lib/providers/sagemaker/adaptive-semaphore.js +212 -0
  29. package/dist/lib/providers/sagemaker/client.d.ts +156 -0
  30. package/dist/lib/providers/sagemaker/client.js +462 -0
  31. package/dist/lib/providers/sagemaker/config.d.ts +73 -0
  32. package/dist/lib/providers/sagemaker/config.js +308 -0
  33. package/dist/lib/providers/sagemaker/detection.d.ts +176 -0
  34. package/dist/lib/providers/sagemaker/detection.js +596 -0
  35. package/dist/lib/providers/sagemaker/diagnostics.d.ts +37 -0
  36. package/dist/lib/providers/sagemaker/diagnostics.js +137 -0
  37. package/dist/lib/providers/sagemaker/error-constants.d.ts +78 -0
  38. package/dist/lib/providers/sagemaker/error-constants.js +227 -0
  39. package/dist/lib/providers/sagemaker/errors.d.ts +83 -0
  40. package/dist/lib/providers/sagemaker/errors.js +216 -0
  41. package/dist/lib/providers/sagemaker/index.d.ts +35 -0
  42. package/dist/lib/providers/sagemaker/index.js +67 -0
  43. package/dist/lib/providers/sagemaker/language-model.d.ts +182 -0
  44. package/dist/lib/providers/sagemaker/language-model.js +755 -0
  45. package/dist/lib/providers/sagemaker/parsers.d.ts +136 -0
  46. package/dist/lib/providers/sagemaker/parsers.js +625 -0
  47. package/dist/lib/providers/sagemaker/streaming.d.ts +39 -0
  48. package/dist/lib/providers/sagemaker/streaming.js +320 -0
  49. package/dist/lib/providers/sagemaker/structured-parser.d.ts +117 -0
  50. package/dist/lib/providers/sagemaker/structured-parser.js +625 -0
  51. package/dist/lib/providers/sagemaker/types.d.ts +456 -0
  52. package/dist/lib/providers/sagemaker/types.js +7 -0
  53. package/dist/lib/sdk/toolRegistration.d.ts +1 -1
  54. package/dist/lib/sdk/toolRegistration.js +13 -5
  55. package/dist/lib/types/cli.d.ts +36 -1
  56. package/dist/lib/utils/providerHealth.js +19 -4
  57. package/dist/neurolink.d.ts +15 -0
  58. package/dist/neurolink.js +73 -1
  59. package/dist/providers/amazonSagemaker.d.ts +67 -0
  60. package/dist/providers/amazonSagemaker.js +149 -0
  61. package/dist/providers/googleVertex.d.ts +4 -0
  62. package/dist/providers/googleVertex.js +44 -3
  63. package/dist/providers/index.d.ts +4 -0
  64. package/dist/providers/index.js +4 -0
  65. package/dist/providers/sagemaker/adaptive-semaphore.d.ts +86 -0
  66. package/dist/providers/sagemaker/adaptive-semaphore.js +212 -0
  67. package/dist/providers/sagemaker/client.d.ts +156 -0
  68. package/dist/providers/sagemaker/client.js +462 -0
  69. package/dist/providers/sagemaker/config.d.ts +73 -0
  70. package/dist/providers/sagemaker/config.js +308 -0
  71. package/dist/providers/sagemaker/detection.d.ts +176 -0
  72. package/dist/providers/sagemaker/detection.js +596 -0
  73. package/dist/providers/sagemaker/diagnostics.d.ts +37 -0
  74. package/dist/providers/sagemaker/diagnostics.js +137 -0
  75. package/dist/providers/sagemaker/error-constants.d.ts +78 -0
  76. package/dist/providers/sagemaker/error-constants.js +227 -0
  77. package/dist/providers/sagemaker/errors.d.ts +83 -0
  78. package/dist/providers/sagemaker/errors.js +216 -0
  79. package/dist/providers/sagemaker/index.d.ts +35 -0
  80. package/dist/providers/sagemaker/index.js +67 -0
  81. package/dist/providers/sagemaker/language-model.d.ts +182 -0
  82. package/dist/providers/sagemaker/language-model.js +755 -0
  83. package/dist/providers/sagemaker/parsers.d.ts +136 -0
  84. package/dist/providers/sagemaker/parsers.js +625 -0
  85. package/dist/providers/sagemaker/streaming.d.ts +39 -0
  86. package/dist/providers/sagemaker/streaming.js +320 -0
  87. package/dist/providers/sagemaker/structured-parser.d.ts +117 -0
  88. package/dist/providers/sagemaker/structured-parser.js +625 -0
  89. package/dist/providers/sagemaker/types.d.ts +456 -0
  90. package/dist/providers/sagemaker/types.js +7 -0
  91. package/dist/sdk/toolRegistration.d.ts +1 -1
  92. package/dist/sdk/toolRegistration.js +13 -5
  93. package/dist/types/cli.d.ts +36 -1
  94. package/dist/utils/providerHealth.js +19 -4
  95. package/package.json +8 -2
@@ -28,6 +28,7 @@ export class CLICommandFactory {
28
28
  "ollama",
29
29
  "mistral",
30
30
  "litellm",
31
+ "sagemaker",
31
32
  ],
32
33
  default: "auto",
33
34
  description: "AI provider to use (auto-selects best available)",
@@ -287,8 +288,12 @@ export class CLICommandFactory {
287
288
  let analyticsText = "\n\n📊 Analytics:\n";
288
289
  // Provider and model info
289
290
  analyticsText += ` Provider: ${analytics.provider}`;
290
- if (result.model) {
291
- analyticsText += ` (${result.model})`;
291
+ // Check for model in multiple locations: result.model, analytics.model, or any model property
292
+ const modelName = result.model ||
293
+ analytics.model ||
294
+ analytics.modelName;
295
+ if (modelName) {
296
+ analyticsText += ` (${modelName})`;
292
297
  }
293
298
  analyticsText += "\n";
294
299
  // Token usage
package/dist/cli/index.js CHANGED
@@ -9,6 +9,7 @@ import yargs from "yargs";
9
9
  import { hideBin } from "yargs/helpers";
10
10
  import chalk from "chalk";
11
11
  import { addOllamaCommands } from "./commands/ollama.js";
12
+ import { addSageMakerCommands } from "./commands/sagemaker.js";
12
13
  import { CLICommandFactory } from "./factories/commandFactory.js";
13
14
  import { logger } from "../lib/utils/logger.js";
14
15
  // Load environment variables from .env file
@@ -228,6 +229,8 @@ const cli = yargs(args)
228
229
  .command(CLICommandFactory.createCompletionCommand());
229
230
  // Add Ollama Commands
230
231
  addOllamaCommands(cli);
232
+ // Add SageMaker Commands
233
+ addSageMakerCommands(cli);
231
234
  // Execute CLI
232
235
  (async () => {
233
236
  try {
@@ -176,6 +176,34 @@ export const PROVIDER_CONFIGS = [
176
176
  },
177
177
  ],
178
178
  },
179
+ {
180
+ id: AIProviderName.SAGEMAKER,
181
+ name: "Amazon SageMaker",
182
+ description: "Custom models deployed on Amazon SageMaker endpoints",
183
+ envVars: [
184
+ {
185
+ key: "AWS_ACCESS_KEY_ID",
186
+ prompt: "AWS Access Key ID",
187
+ secure: true,
188
+ },
189
+ {
190
+ key: "AWS_SECRET_ACCESS_KEY",
191
+ prompt: "AWS Secret Access Key",
192
+ secure: true,
193
+ },
194
+ {
195
+ key: "AWS_REGION",
196
+ prompt: "AWS Region",
197
+ default: "us-east-1",
198
+ secure: false,
199
+ },
200
+ {
201
+ key: "SAGEMAKER_DEFAULT_ENDPOINT",
202
+ prompt: "SageMaker Endpoint Name",
203
+ secure: false,
204
+ },
205
+ ],
206
+ },
179
207
  ];
180
208
  /**
181
209
  * Run the interactive setup wizard
@@ -1,6 +1,6 @@
1
1
  import type { ZodType, ZodTypeDef } from "zod";
2
2
  import type { Schema } from "ai";
3
- import type { Tool, LanguageModel } from "ai";
3
+ import type { Tool, LanguageModelV1 } from "ai";
4
4
  import type { AIProvider, TextGenerationOptions, EnhancedGenerateResult, AnalyticsData, AIProviderName, EvaluationData } from "../core/types.js";
5
5
  import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
6
6
  import type { JsonValue, UnknownRecord } from "../types/common.js";
@@ -419,7 +419,7 @@ export declare abstract class BaseProvider implements AIProvider {
419
419
  * REQUIRED: Every provider MUST implement this method
420
420
  * Returns the Vercel AI SDK model instance for this provider
421
421
  */
422
- protected abstract getAISDKModel(): LanguageModel | Promise<LanguageModel>;
422
+ protected abstract getAISDKModel(): LanguageModelV1 | Promise<LanguageModelV1>;
423
423
  /**
424
424
  * Get all available tools - direct tools are ALWAYS available
425
425
  * MCP tools are added when available (without blocking)
@@ -51,6 +51,7 @@ export declare enum AIProviderName {
51
51
  OLLAMA = "ollama",
52
52
  MISTRAL = "mistral",
53
53
  LITELLM = "litellm",
54
+ SAGEMAKER = "sagemaker",
54
55
  AUTO = "auto"
55
56
  }
56
57
  /**
@@ -77,19 +78,30 @@ export declare enum OpenAIModels {
77
78
  */
78
79
  export declare enum VertexModels {
79
80
  CLAUDE_4_0_SONNET = "claude-sonnet-4@20250514",
80
- GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
81
+ CLAUDE_4_0_OPUS = "claude-opus-4@20250514",
82
+ CLAUDE_3_5_SONNET = "claude-3-5-sonnet-20241022",
83
+ CLAUDE_3_5_HAIKU = "claude-3-5-haiku-20241022",
84
+ CLAUDE_3_SONNET = "claude-3-sonnet-20240229",
85
+ CLAUDE_3_OPUS = "claude-3-opus-20240229",
86
+ CLAUDE_3_HAIKU = "claude-3-haiku-20240307",
81
87
  GEMINI_2_5_PRO = "gemini-2.5-pro",
82
88
  GEMINI_2_5_FLASH = "gemini-2.5-flash",
83
- GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite"
89
+ GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite",
90
+ GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
91
+ GEMINI_1_5_PRO = "gemini-1.5-pro",
92
+ GEMINI_1_5_FLASH = "gemini-1.5-flash"
84
93
  }
85
94
  /**
86
95
  * Supported Models for Google AI Studio
87
96
  */
88
97
  export declare enum GoogleAIModels {
89
- GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
90
98
  GEMINI_2_5_PRO = "gemini-2.5-pro",
91
99
  GEMINI_2_5_FLASH = "gemini-2.5-flash",
92
- GEMINI_1_5_FLASH_LITE = "gemini-2.5-flash-lite"
100
+ GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite",
101
+ GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
102
+ GEMINI_1_5_PRO = "gemini-1.5-pro",
103
+ GEMINI_1_5_FLASH = "gemini-1.5-flash",
104
+ GEMINI_1_5_FLASH_LITE = "gemini-1.5-flash-lite"
93
105
  }
94
106
  /**
95
107
  * Union type of all supported model names
@@ -14,6 +14,7 @@ export var AIProviderName;
14
14
  AIProviderName["OLLAMA"] = "ollama";
15
15
  AIProviderName["MISTRAL"] = "mistral";
16
16
  AIProviderName["LITELLM"] = "litellm";
17
+ AIProviderName["SAGEMAKER"] = "sagemaker";
17
18
  AIProviderName["AUTO"] = "auto";
18
19
  })(AIProviderName || (AIProviderName = {}));
19
20
  /**
@@ -42,21 +43,41 @@ export var OpenAIModels;
42
43
  */
43
44
  export var VertexModels;
44
45
  (function (VertexModels) {
46
+ // Claude 4 Series (Latest - May 2025)
45
47
  VertexModels["CLAUDE_4_0_SONNET"] = "claude-sonnet-4@20250514";
46
- VertexModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
48
+ VertexModels["CLAUDE_4_0_OPUS"] = "claude-opus-4@20250514";
49
+ // Claude 3.5 Series (Still supported)
50
+ VertexModels["CLAUDE_3_5_SONNET"] = "claude-3-5-sonnet-20241022";
51
+ VertexModels["CLAUDE_3_5_HAIKU"] = "claude-3-5-haiku-20241022";
52
+ // Claude 3 Series (Legacy support)
53
+ VertexModels["CLAUDE_3_SONNET"] = "claude-3-sonnet-20240229";
54
+ VertexModels["CLAUDE_3_OPUS"] = "claude-3-opus-20240229";
55
+ VertexModels["CLAUDE_3_HAIKU"] = "claude-3-haiku-20240307";
56
+ // Gemini 2.5 Series (Latest - 2025)
47
57
  VertexModels["GEMINI_2_5_PRO"] = "gemini-2.5-pro";
48
58
  VertexModels["GEMINI_2_5_FLASH"] = "gemini-2.5-flash";
49
59
  VertexModels["GEMINI_2_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
60
+ // Gemini 2.0 Series
61
+ VertexModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
62
+ // Gemini 1.5 Series (Legacy support)
63
+ VertexModels["GEMINI_1_5_PRO"] = "gemini-1.5-pro";
64
+ VertexModels["GEMINI_1_5_FLASH"] = "gemini-1.5-flash";
50
65
  })(VertexModels || (VertexModels = {}));
51
66
  /**
52
67
  * Supported Models for Google AI Studio
53
68
  */
54
69
  export var GoogleAIModels;
55
70
  (function (GoogleAIModels) {
56
- GoogleAIModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
71
+ // Gemini 2.5 Series (Latest - 2025)
57
72
  GoogleAIModels["GEMINI_2_5_PRO"] = "gemini-2.5-pro";
58
73
  GoogleAIModels["GEMINI_2_5_FLASH"] = "gemini-2.5-flash";
59
- GoogleAIModels["GEMINI_1_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
74
+ GoogleAIModels["GEMINI_2_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
75
+ // Gemini 2.0 Series
76
+ GoogleAIModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
77
+ // Gemini 1.5 Series (Legacy support)
78
+ GoogleAIModels["GEMINI_1_5_PRO"] = "gemini-1.5-pro";
79
+ GoogleAIModels["GEMINI_1_5_FLASH"] = "gemini-1.5-flash";
80
+ GoogleAIModels["GEMINI_1_5_FLASH_LITE"] = "gemini-1.5-flash-lite";
60
81
  })(GoogleAIModels || (GoogleAIModels = {}));
61
82
  /**
62
83
  * Default provider configurations
@@ -35,7 +35,16 @@ export class ProviderFactory {
35
35
  if (!registration) {
36
36
  throw new Error(`Unknown provider: ${providerName}. Available providers: ${this.getAvailableProviders().join(", ")}`);
37
37
  }
38
- const model = modelName || registration.defaultModel;
38
+ // Respect environment variables before falling back to registry default
39
+ let model = modelName;
40
+ if (!model) {
41
+ // Check for provider-specific environment variables
42
+ if (providerName.toLowerCase().includes("vertex")) {
43
+ model = process.env.VERTEX_MODEL;
44
+ }
45
+ // Fallback to registry default if no env var
46
+ model = model || registration.defaultModel;
47
+ }
39
48
  try {
40
49
  // Try calling as factory function first, then fallback to constructor
41
50
  let result;
@@ -55,7 +55,7 @@ export class ProviderRegistry {
55
55
  ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName) => {
56
56
  const { GoogleVertexProvider } = await import("../providers/googleVertex.js");
57
57
  return new GoogleVertexProvider(modelName);
58
- }, "gemini-2.5-flash", ["vertex", "googleVertex"]);
58
+ }, "claude-sonnet-4@20250514", ["vertex", "googleVertex"]);
59
59
  // Register Hugging Face provider (Unified Router implementation)
60
60
  ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
61
61
  const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
@@ -82,6 +82,11 @@ export class ProviderRegistry {
82
82
  return new OpenAICompatibleProvider(modelName, sdk);
83
83
  }, process.env.OPENAI_COMPATIBLE_MODEL || undefined, // Enable auto-discovery when no model specified
84
84
  ["openai-compatible", "openrouter", "vllm", "compatible"]);
85
+ // Register Amazon SageMaker provider
86
+ ProviderFactory.registerProvider(AIProviderName.SAGEMAKER, async (modelName, providerName, sdk) => {
87
+ const { AmazonSageMakerProvider } = await import("../providers/amazonSagemaker.js");
88
+ return new AmazonSageMakerProvider(modelName);
89
+ }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"]);
85
90
  logger.debug("All providers registered successfully");
86
91
  this.registered = true;
87
92
  }
@@ -1,6 +1,6 @@
1
1
  import type { ZodType, ZodTypeDef } from "zod";
2
2
  import type { Schema } from "ai";
3
- import type { Tool, LanguageModel } from "ai";
3
+ import type { Tool, LanguageModelV1 } from "ai";
4
4
  import type { AIProvider, TextGenerationOptions, EnhancedGenerateResult, AnalyticsData, AIProviderName, EvaluationData } from "../core/types.js";
5
5
  import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
6
6
  import type { JsonValue, UnknownRecord } from "../types/common.js";
@@ -419,7 +419,7 @@ export declare abstract class BaseProvider implements AIProvider {
419
419
  * REQUIRED: Every provider MUST implement this method
420
420
  * Returns the Vercel AI SDK model instance for this provider
421
421
  */
422
- protected abstract getAISDKModel(): LanguageModel | Promise<LanguageModel>;
422
+ protected abstract getAISDKModel(): LanguageModelV1 | Promise<LanguageModelV1>;
423
423
  /**
424
424
  * Get all available tools - direct tools are ALWAYS available
425
425
  * MCP tools are added when available (without blocking)
@@ -51,6 +51,7 @@ export declare enum AIProviderName {
51
51
  OLLAMA = "ollama",
52
52
  MISTRAL = "mistral",
53
53
  LITELLM = "litellm",
54
+ SAGEMAKER = "sagemaker",
54
55
  AUTO = "auto"
55
56
  }
56
57
  /**
@@ -77,19 +78,30 @@ export declare enum OpenAIModels {
77
78
  */
78
79
  export declare enum VertexModels {
79
80
  CLAUDE_4_0_SONNET = "claude-sonnet-4@20250514",
80
- GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
81
+ CLAUDE_4_0_OPUS = "claude-opus-4@20250514",
82
+ CLAUDE_3_5_SONNET = "claude-3-5-sonnet-20241022",
83
+ CLAUDE_3_5_HAIKU = "claude-3-5-haiku-20241022",
84
+ CLAUDE_3_SONNET = "claude-3-sonnet-20240229",
85
+ CLAUDE_3_OPUS = "claude-3-opus-20240229",
86
+ CLAUDE_3_HAIKU = "claude-3-haiku-20240307",
81
87
  GEMINI_2_5_PRO = "gemini-2.5-pro",
82
88
  GEMINI_2_5_FLASH = "gemini-2.5-flash",
83
- GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite"
89
+ GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite",
90
+ GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
91
+ GEMINI_1_5_PRO = "gemini-1.5-pro",
92
+ GEMINI_1_5_FLASH = "gemini-1.5-flash"
84
93
  }
85
94
  /**
86
95
  * Supported Models for Google AI Studio
87
96
  */
88
97
  export declare enum GoogleAIModels {
89
- GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
90
98
  GEMINI_2_5_PRO = "gemini-2.5-pro",
91
99
  GEMINI_2_5_FLASH = "gemini-2.5-flash",
92
- GEMINI_1_5_FLASH_LITE = "gemini-2.5-flash-lite"
100
+ GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite",
101
+ GEMINI_2_0_FLASH_001 = "gemini-2.0-flash-001",
102
+ GEMINI_1_5_PRO = "gemini-1.5-pro",
103
+ GEMINI_1_5_FLASH = "gemini-1.5-flash",
104
+ GEMINI_1_5_FLASH_LITE = "gemini-1.5-flash-lite"
93
105
  }
94
106
  /**
95
107
  * Union type of all supported model names
@@ -14,6 +14,7 @@ export var AIProviderName;
14
14
  AIProviderName["OLLAMA"] = "ollama";
15
15
  AIProviderName["MISTRAL"] = "mistral";
16
16
  AIProviderName["LITELLM"] = "litellm";
17
+ AIProviderName["SAGEMAKER"] = "sagemaker";
17
18
  AIProviderName["AUTO"] = "auto";
18
19
  })(AIProviderName || (AIProviderName = {}));
19
20
  /**
@@ -42,21 +43,41 @@ export var OpenAIModels;
42
43
  */
43
44
  export var VertexModels;
44
45
  (function (VertexModels) {
46
+ // Claude 4 Series (Latest - May 2025)
45
47
  VertexModels["CLAUDE_4_0_SONNET"] = "claude-sonnet-4@20250514";
46
- VertexModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
48
+ VertexModels["CLAUDE_4_0_OPUS"] = "claude-opus-4@20250514";
49
+ // Claude 3.5 Series (Still supported)
50
+ VertexModels["CLAUDE_3_5_SONNET"] = "claude-3-5-sonnet-20241022";
51
+ VertexModels["CLAUDE_3_5_HAIKU"] = "claude-3-5-haiku-20241022";
52
+ // Claude 3 Series (Legacy support)
53
+ VertexModels["CLAUDE_3_SONNET"] = "claude-3-sonnet-20240229";
54
+ VertexModels["CLAUDE_3_OPUS"] = "claude-3-opus-20240229";
55
+ VertexModels["CLAUDE_3_HAIKU"] = "claude-3-haiku-20240307";
56
+ // Gemini 2.5 Series (Latest - 2025)
47
57
  VertexModels["GEMINI_2_5_PRO"] = "gemini-2.5-pro";
48
58
  VertexModels["GEMINI_2_5_FLASH"] = "gemini-2.5-flash";
49
59
  VertexModels["GEMINI_2_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
60
+ // Gemini 2.0 Series
61
+ VertexModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
62
+ // Gemini 1.5 Series (Legacy support)
63
+ VertexModels["GEMINI_1_5_PRO"] = "gemini-1.5-pro";
64
+ VertexModels["GEMINI_1_5_FLASH"] = "gemini-1.5-flash";
50
65
  })(VertexModels || (VertexModels = {}));
51
66
  /**
52
67
  * Supported Models for Google AI Studio
53
68
  */
54
69
  export var GoogleAIModels;
55
70
  (function (GoogleAIModels) {
56
- GoogleAIModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
71
+ // Gemini 2.5 Series (Latest - 2025)
57
72
  GoogleAIModels["GEMINI_2_5_PRO"] = "gemini-2.5-pro";
58
73
  GoogleAIModels["GEMINI_2_5_FLASH"] = "gemini-2.5-flash";
59
- GoogleAIModels["GEMINI_1_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
74
+ GoogleAIModels["GEMINI_2_5_FLASH_LITE"] = "gemini-2.5-flash-lite";
75
+ // Gemini 2.0 Series
76
+ GoogleAIModels["GEMINI_2_0_FLASH_001"] = "gemini-2.0-flash-001";
77
+ // Gemini 1.5 Series (Legacy support)
78
+ GoogleAIModels["GEMINI_1_5_PRO"] = "gemini-1.5-pro";
79
+ GoogleAIModels["GEMINI_1_5_FLASH"] = "gemini-1.5-flash";
80
+ GoogleAIModels["GEMINI_1_5_FLASH_LITE"] = "gemini-1.5-flash-lite";
60
81
  })(GoogleAIModels || (GoogleAIModels = {}));
61
82
  /**
62
83
  * Default provider configurations
@@ -35,7 +35,16 @@ export class ProviderFactory {
35
35
  if (!registration) {
36
36
  throw new Error(`Unknown provider: ${providerName}. Available providers: ${this.getAvailableProviders().join(", ")}`);
37
37
  }
38
- const model = modelName || registration.defaultModel;
38
+ // Respect environment variables before falling back to registry default
39
+ let model = modelName;
40
+ if (!model) {
41
+ // Check for provider-specific environment variables
42
+ if (providerName.toLowerCase().includes("vertex")) {
43
+ model = process.env.VERTEX_MODEL;
44
+ }
45
+ // Fallback to registry default if no env var
46
+ model = model || registration.defaultModel;
47
+ }
39
48
  try {
40
49
  // Try calling as factory function first, then fallback to constructor
41
50
  let result;
@@ -55,7 +55,7 @@ export class ProviderRegistry {
55
55
  ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName) => {
56
56
  const { GoogleVertexProvider } = await import("../providers/googleVertex.js");
57
57
  return new GoogleVertexProvider(modelName);
58
- }, "gemini-2.5-flash", ["vertex", "googleVertex"]);
58
+ }, "claude-sonnet-4@20250514", ["vertex", "googleVertex"]);
59
59
  // Register Hugging Face provider (Unified Router implementation)
60
60
  ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
61
61
  const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
@@ -82,6 +82,11 @@ export class ProviderRegistry {
82
82
  return new OpenAICompatibleProvider(modelName, sdk);
83
83
  }, process.env.OPENAI_COMPATIBLE_MODEL || undefined, // Enable auto-discovery when no model specified
84
84
  ["openai-compatible", "openrouter", "vllm", "compatible"]);
85
+ // Register Amazon SageMaker provider
86
+ ProviderFactory.registerProvider(AIProviderName.SAGEMAKER, async (modelName, providerName, sdk) => {
87
+ const { AmazonSageMakerProvider } = await import("../providers/amazonSagemaker.js");
88
+ return new AmazonSageMakerProvider(modelName);
89
+ }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"]);
85
90
  logger.debug("All providers registered successfully");
86
91
  this.registered = true;
87
92
  }
@@ -10,6 +10,7 @@ import type { GenerateOptions, GenerateResult } from "./types/generateTypes.js";
10
10
  import type { StreamOptions, StreamResult } from "./types/streamTypes.js";
11
11
  import type { SimpleTool } from "./sdk/toolRegistration.js";
12
12
  import type { InMemoryMCPServerConfig } from "./types/mcpTypes.js";
13
+ import { EventEmitter } from "events";
13
14
  export interface ProviderStatus {
14
15
  provider: string;
15
16
  status: "working" | "failed" | "not-configured";
@@ -41,10 +42,19 @@ export interface MCPServerInfo {
41
42
  }
42
43
  export declare class NeuroLink {
43
44
  private mcpInitialized;
45
+ private emitter;
44
46
  private customTools;
45
47
  private inMemoryServers;
46
48
  private toolCircuitBreakers;
47
49
  private toolExecutionMetrics;
50
+ /**
51
+ * Helper method to emit tool end event in a consistent way
52
+ * Used by executeTool in both success and error paths
53
+ * @param toolName - Name of the tool
54
+ * @param startTime - Timestamp when tool execution started
55
+ * @param success - Whether the tool execution was successful
56
+ */
57
+ private emitToolEndEvent;
48
58
  constructor();
49
59
  /**
50
60
  * Initialize MCP registry with enhanced error handling and resource cleanup
@@ -101,6 +111,11 @@ export declare class NeuroLink {
101
111
  * Future-ready for multi-modal capabilities with current text focus
102
112
  */
103
113
  stream(options: StreamOptions): Promise<StreamResult>;
114
+ /**
115
+ * Get the EventEmitter to listen to NeuroLink events
116
+ * @returns EventEmitter instance
117
+ */
118
+ getEventEmitter(): EventEmitter<[never]>;
104
119
  /**
105
120
  * Register a custom tool that will be available to all AI providers
106
121
  * @param name - Unique name for the tool
@@ -26,15 +26,32 @@ import { validateTool, createMCPServerFromTools, } from "./sdk/toolRegistration.
26
26
  import { processFactoryOptions, enhanceTextGenerationOptions, validateFactoryConfig, processStreamingFactoryOptions, createCleanStreamOptions, } from "./utils/factoryProcessing.js";
27
27
  // Enhanced error handling imports
28
28
  import { ErrorFactory, NeuroLinkError, withTimeout, withRetry, isRetriableError, logStructuredError, CircuitBreaker, } from "./utils/errorHandling.js";
29
+ import { EventEmitter } from "events";
29
30
  // Core types imported from core/types.js
30
31
  export class NeuroLink {
31
32
  mcpInitialized = false;
33
+ emitter = new EventEmitter();
32
34
  // Tool registration support
33
35
  customTools = new Map();
34
36
  inMemoryServers = new Map();
35
37
  // Enhanced error handling support
36
38
  toolCircuitBreakers = new Map();
37
39
  toolExecutionMetrics = new Map();
40
+ /**
41
+ * Helper method to emit tool end event in a consistent way
42
+ * Used by executeTool in both success and error paths
43
+ * @param toolName - Name of the tool
44
+ * @param startTime - Timestamp when tool execution started
45
+ * @param success - Whether the tool execution was successful
46
+ */
47
+ emitToolEndEvent(toolName, startTime, success) {
48
+ this.emitter.emit("tool:end", {
49
+ toolName,
50
+ responseTime: Date.now() - startTime,
51
+ success,
52
+ timestamp: Date.now(),
53
+ });
54
+ }
38
55
  constructor() {
39
56
  // SDK always disables manual MCP config for security
40
57
  ProviderRegistry.setOptions({
@@ -91,7 +108,6 @@ export class NeuroLink {
91
108
  * Replaces both generateText and legacy methods
92
109
  */
93
110
  async generate(optionsOrPrompt) {
94
- const startTime = Date.now();
95
111
  // Convert string prompt to full options
96
112
  const options = typeof optionsOrPrompt === "string"
97
113
  ? { input: { text: optionsOrPrompt } }
@@ -100,6 +116,12 @@ export class NeuroLink {
100
116
  if (!options.input?.text || typeof options.input.text !== "string") {
101
117
  throw new Error("Input text is required and must be a non-empty string");
102
118
  }
119
+ const startTime = Date.now();
120
+ // Emit generation start event
121
+ this.emitter.emit("generation:start", {
122
+ provider: options.provider || "auto",
123
+ timestamp: startTime,
124
+ });
103
125
  // Process factory configuration
104
126
  const factoryResult = processFactoryOptions(options);
105
127
  // Validate factory configuration if present
@@ -142,6 +164,13 @@ export class NeuroLink {
142
164
  }
143
165
  // Use redesigned generation logic
144
166
  const textResult = await this.generateTextInternal(textOptions);
167
+ // Emit generation completion event
168
+ this.emitter.emit("generation:end", {
169
+ provider: textResult.provider,
170
+ responseTime: Date.now() - startTime,
171
+ toolsUsed: textResult.toolsUsed,
172
+ timestamp: Date.now(),
173
+ });
145
174
  // Convert back to GenerateResult
146
175
  const generateResult = {
147
176
  content: textResult.content,
@@ -509,6 +538,11 @@ export class NeuroLink {
509
538
  options.input.text.trim() === "") {
510
539
  throw new Error("Stream options must include input.text as a non-empty string");
511
540
  }
541
+ // Emit stream start event
542
+ this.emitter.emit("stream:start", {
543
+ provider: options.provider || "auto",
544
+ timestamp: startTime,
545
+ });
512
546
  // Process factory configuration for streaming
513
547
  const factoryResult = processFactoryOptions(options);
514
548
  const streamingResult = processStreamingFactoryOptions(options);
@@ -576,6 +610,11 @@ export class NeuroLink {
576
610
  responseTime,
577
611
  provider: providerName,
578
612
  });
613
+ // Emit stream completion event
614
+ this.emitter.emit("stream:end", {
615
+ provider: providerName,
616
+ responseTime,
617
+ });
579
618
  // Convert to StreamResult format - Include analytics and evaluation from provider
580
619
  return {
581
620
  stream,
@@ -615,6 +654,12 @@ export class NeuroLink {
615
654
  const cleanOptions = createCleanStreamOptions(enhancedOptions);
616
655
  const streamResult = await provider.stream(cleanOptions);
617
656
  const responseTime = Date.now() - startTime;
657
+ // Emit stream completion event for fallback
658
+ this.emitter.emit("stream:end", {
659
+ provider: providerName,
660
+ responseTime,
661
+ fallback: true,
662
+ });
618
663
  return {
619
664
  stream: streamResult.stream,
620
665
  provider: providerName,
@@ -643,6 +688,13 @@ export class NeuroLink {
643
688
  };
644
689
  }
645
690
  }
691
+ /**
692
+ * Get the EventEmitter to listen to NeuroLink events
693
+ * @returns EventEmitter instance
694
+ */
695
+ getEventEmitter() {
696
+ return this.emitter;
697
+ }
646
698
  // ========================================
647
699
  // Tool Registration API
648
700
  // ========================================
@@ -652,6 +704,11 @@ export class NeuroLink {
652
704
  * @param tool - Tool configuration
653
705
  */
654
706
  registerTool(name, tool) {
707
+ // Emit tool registration start event
708
+ this.emitter.emit("tools-register:start", {
709
+ toolName: name,
710
+ timestamp: Date.now(),
711
+ });
655
712
  try {
656
713
  // Validate tool configuration
657
714
  validateTool(name, tool);
@@ -666,6 +723,12 @@ export class NeuroLink {
666
723
  // Store as in-memory server
667
724
  this.inMemoryServers.set(serverId, mcpServer);
668
725
  logger.info(`Registered custom tool: ${name}`);
726
+ // Emit tool registration success event
727
+ this.emitter.emit("tools-register:end", {
728
+ toolName: name,
729
+ success: true,
730
+ timestamp: Date.now(),
731
+ });
669
732
  }
670
733
  catch (error) {
671
734
  logger.error(`Failed to register tool ${name}:`, error);
@@ -758,6 +821,11 @@ export class NeuroLink {
758
821
  async executeTool(toolName, params = {}, options) {
759
822
  const functionTag = "NeuroLink.executeTool";
760
823
  const executionStartTime = Date.now();
824
+ // Emit tool start event
825
+ this.emitter.emit("tool:start", {
826
+ toolName,
827
+ timestamp: executionStartTime,
828
+ });
761
829
  // Set default options
762
830
  const finalOptions = {
763
831
  timeout: options?.timeout || 30000, // 30 second default timeout
@@ -832,6 +900,8 @@ export class NeuroLink {
832
900
  memoryDelta,
833
901
  circuitBreakerState: circuitBreaker.getState(),
834
902
  });
903
+ // Emit tool end event using the helper method
904
+ this.emitToolEndEvent(toolName, executionStartTime, true);
835
905
  return result;
836
906
  }
837
907
  catch (error) {
@@ -867,6 +937,8 @@ export class NeuroLink {
867
937
  else {
868
938
  structuredError = ErrorFactory.toolExecutionFailed(toolName, new Error(String(error)));
869
939
  }
940
+ // Emit tool end event using the helper method
941
+ this.emitToolEndEvent(toolName, executionStartTime, false);
870
942
  // Add execution context to structured error
871
943
  structuredError = new NeuroLinkError({
872
944
  ...structuredError,
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Amazon SageMaker Provider Implementation (Simplified)
3
+ *
4
+ * This module provides a simplified SageMaker provider that extends BaseProvider
5
+ * and integrates with the NeuroLink ecosystem using existing patterns.
6
+ */
7
+ import type { ZodType, ZodTypeDef } from "zod";
8
+ import type { Schema, LanguageModelV1 } from "ai";
9
+ import type { AIProviderName } from "../core/types.js";
10
+ import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
11
+ import { BaseProvider } from "../core/baseProvider.js";
12
+ /**
13
+ * Amazon SageMaker Provider extending BaseProvider
14
+ */
15
+ export declare class AmazonSageMakerProvider extends BaseProvider {
16
+ private sagemakerModel;
17
+ private sagemakerConfig;
18
+ private modelConfig;
19
+ constructor(modelName?: string, endpointName?: string);
20
+ protected getProviderName(): AIProviderName;
21
+ protected getDefaultModel(): string;
22
+ protected getAISDKModel(): LanguageModelV1;
23
+ protected executeStream(options: StreamOptions, analysisSchema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>): Promise<StreamResult>;
24
+ protected handleProviderError(error: unknown): Error;
25
+ /**
26
+ * Get SageMaker-specific provider information
27
+ */
28
+ getSageMakerInfo(): {
29
+ endpointName: string;
30
+ modelType: string;
31
+ region: string;
32
+ configured: boolean;
33
+ };
34
+ /**
35
+ * Test basic configuration
36
+ */
37
+ testConnection(): Promise<{
38
+ connected: boolean;
39
+ error?: string;
40
+ }>;
41
+ /**
42
+ * Public method to get the AI SDK model for CLI and external usage
43
+ */
44
+ getModel(): Promise<LanguageModelV1>;
45
+ /**
46
+ * Test connectivity to the SageMaker endpoint
47
+ */
48
+ testConnectivity(): Promise<{
49
+ success: boolean;
50
+ error?: string;
51
+ }>;
52
+ /**
53
+ * Get model capabilities and information
54
+ */
55
+ getModelCapabilities(): {
56
+ capabilities: {
57
+ streaming: boolean;
58
+ toolCalling: boolean;
59
+ structuredOutput: boolean;
60
+ batchInference: boolean;
61
+ supportedResponseFormats: string[];
62
+ supportedToolTypes: string[];
63
+ maxBatchSize: number;
64
+ };
65
+ };
66
+ }
67
+ export default AmazonSageMakerProvider;