@juspay/neurolink 9.41.0 → 9.42.1

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 (212) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +7 -1
  3. package/dist/auth/anthropicOAuth.d.ts +18 -3
  4. package/dist/auth/anthropicOAuth.js +149 -4
  5. package/dist/auth/providers/firebase.js +5 -1
  6. package/dist/auth/providers/jwt.js +5 -1
  7. package/dist/auth/providers/workos.js +5 -1
  8. package/dist/auth/sessionManager.d.ts +1 -1
  9. package/dist/auth/sessionManager.js +58 -27
  10. package/dist/browser/neurolink.min.js +354 -334
  11. package/dist/cli/commands/mcp.d.ts +6 -0
  12. package/dist/cli/commands/mcp.js +188 -181
  13. package/dist/cli/commands/proxy.d.ts +2 -1
  14. package/dist/cli/commands/proxy.js +713 -431
  15. package/dist/cli/commands/task.js +3 -0
  16. package/dist/cli/factories/commandFactory.d.ts +2 -0
  17. package/dist/cli/factories/commandFactory.js +38 -0
  18. package/dist/cli/parser.js +4 -3
  19. package/dist/client/aiSdkAdapter.js +3 -0
  20. package/dist/client/streamingClient.js +30 -10
  21. package/dist/core/baseProvider.d.ts +6 -1
  22. package/dist/core/baseProvider.js +208 -230
  23. package/dist/core/factory.d.ts +3 -0
  24. package/dist/core/factory.js +138 -188
  25. package/dist/core/modules/GenerationHandler.js +3 -2
  26. package/dist/core/redisConversationMemoryManager.js +7 -3
  27. package/dist/evaluation/BatchEvaluator.js +4 -1
  28. package/dist/evaluation/hooks/observabilityHooks.js +5 -3
  29. package/dist/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  30. package/dist/evaluation/pipeline/evaluationPipeline.js +24 -9
  31. package/dist/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  32. package/dist/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  33. package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
  34. package/dist/evaluation/scorers/scorerRegistry.js +353 -282
  35. package/dist/lib/auth/anthropicOAuth.d.ts +18 -3
  36. package/dist/lib/auth/anthropicOAuth.js +149 -4
  37. package/dist/lib/auth/providers/firebase.js +5 -1
  38. package/dist/lib/auth/providers/jwt.js +5 -1
  39. package/dist/lib/auth/providers/workos.js +5 -1
  40. package/dist/lib/auth/sessionManager.d.ts +1 -1
  41. package/dist/lib/auth/sessionManager.js +58 -27
  42. package/dist/lib/client/aiSdkAdapter.js +3 -0
  43. package/dist/lib/client/streamingClient.js +30 -10
  44. package/dist/lib/core/baseProvider.d.ts +6 -1
  45. package/dist/lib/core/baseProvider.js +208 -230
  46. package/dist/lib/core/factory.d.ts +3 -0
  47. package/dist/lib/core/factory.js +138 -188
  48. package/dist/lib/core/modules/GenerationHandler.js +3 -2
  49. package/dist/lib/core/redisConversationMemoryManager.js +7 -3
  50. package/dist/lib/evaluation/BatchEvaluator.js +4 -1
  51. package/dist/lib/evaluation/hooks/observabilityHooks.js +5 -3
  52. package/dist/lib/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  53. package/dist/lib/evaluation/pipeline/evaluationPipeline.js +24 -9
  54. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  55. package/dist/lib/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  56. package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
  57. package/dist/lib/evaluation/scorers/scorerRegistry.js +353 -282
  58. package/dist/lib/mcp/toolRegistry.d.ts +2 -0
  59. package/dist/lib/mcp/toolRegistry.js +32 -31
  60. package/dist/lib/neurolink.d.ts +41 -2
  61. package/dist/lib/neurolink.js +1616 -1681
  62. package/dist/lib/observability/otelBridge.d.ts +2 -2
  63. package/dist/lib/observability/otelBridge.js +12 -3
  64. package/dist/lib/providers/amazonBedrock.js +2 -4
  65. package/dist/lib/providers/anthropic.d.ts +9 -5
  66. package/dist/lib/providers/anthropic.js +19 -14
  67. package/dist/lib/providers/anthropicBaseProvider.d.ts +3 -3
  68. package/dist/lib/providers/anthropicBaseProvider.js +5 -4
  69. package/dist/lib/providers/azureOpenai.d.ts +1 -1
  70. package/dist/lib/providers/azureOpenai.js +5 -4
  71. package/dist/lib/providers/googleAiStudio.js +30 -6
  72. package/dist/lib/providers/googleVertex.d.ts +10 -0
  73. package/dist/lib/providers/googleVertex.js +437 -423
  74. package/dist/lib/providers/huggingFace.d.ts +3 -3
  75. package/dist/lib/providers/huggingFace.js +6 -8
  76. package/dist/lib/providers/litellm.d.ts +1 -0
  77. package/dist/lib/providers/litellm.js +76 -55
  78. package/dist/lib/providers/mistral.js +2 -1
  79. package/dist/lib/providers/ollama.js +93 -23
  80. package/dist/lib/providers/openAI.d.ts +2 -0
  81. package/dist/lib/providers/openAI.js +141 -141
  82. package/dist/lib/providers/openRouter.js +2 -1
  83. package/dist/lib/providers/openaiCompatible.d.ts +4 -4
  84. package/dist/lib/providers/openaiCompatible.js +4 -4
  85. package/dist/lib/proxy/claudeFormat.d.ts +3 -2
  86. package/dist/lib/proxy/claudeFormat.js +27 -14
  87. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  88. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  89. package/dist/lib/proxy/modelRouter.js +3 -0
  90. package/dist/lib/proxy/oauthFetch.d.ts +1 -1
  91. package/dist/lib/proxy/oauthFetch.js +289 -316
  92. package/dist/lib/proxy/proxyConfig.js +46 -24
  93. package/dist/lib/proxy/proxyEnv.d.ts +19 -0
  94. package/dist/lib/proxy/proxyEnv.js +73 -0
  95. package/dist/lib/proxy/proxyFetch.js +291 -217
  96. package/dist/lib/proxy/proxyTracer.d.ts +133 -0
  97. package/dist/lib/proxy/proxyTracer.js +645 -0
  98. package/dist/lib/proxy/rawStreamCapture.d.ts +10 -0
  99. package/dist/lib/proxy/rawStreamCapture.js +83 -0
  100. package/dist/lib/proxy/requestLogger.d.ts +32 -5
  101. package/dist/lib/proxy/requestLogger.js +503 -47
  102. package/dist/lib/proxy/sseInterceptor.d.ts +97 -0
  103. package/dist/lib/proxy/sseInterceptor.js +427 -0
  104. package/dist/lib/proxy/usageStats.d.ts +4 -3
  105. package/dist/lib/proxy/usageStats.js +25 -12
  106. package/dist/lib/rag/chunkers/MarkdownChunker.js +13 -5
  107. package/dist/lib/rag/chunking/markdownChunker.js +15 -6
  108. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +17 -3
  109. package/dist/lib/server/routes/claudeProxyRoutes.js +3032 -1349
  110. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +7 -1
  111. package/dist/lib/services/server/ai/observability/instrumentation.js +337 -161
  112. package/dist/lib/tasks/backends/bullmqBackend.d.ts +1 -0
  113. package/dist/lib/tasks/backends/bullmqBackend.js +35 -22
  114. package/dist/lib/tasks/store/redisTaskStore.d.ts +1 -0
  115. package/dist/lib/tasks/store/redisTaskStore.js +54 -39
  116. package/dist/lib/tasks/taskManager.d.ts +5 -0
  117. package/dist/lib/tasks/taskManager.js +158 -30
  118. package/dist/lib/telemetry/index.d.ts +2 -1
  119. package/dist/lib/telemetry/index.js +2 -1
  120. package/dist/lib/telemetry/telemetryService.d.ts +3 -0
  121. package/dist/lib/telemetry/telemetryService.js +69 -5
  122. package/dist/lib/types/cli.d.ts +10 -0
  123. package/dist/lib/types/proxyTypes.d.ts +160 -5
  124. package/dist/lib/types/streamTypes.d.ts +25 -3
  125. package/dist/lib/utils/messageBuilder.js +3 -2
  126. package/dist/lib/utils/providerHealth.d.ts +19 -0
  127. package/dist/lib/utils/providerHealth.js +279 -33
  128. package/dist/lib/utils/providerUtils.js +17 -22
  129. package/dist/lib/utils/toolChoice.d.ts +4 -0
  130. package/dist/lib/utils/toolChoice.js +7 -0
  131. package/dist/mcp/toolRegistry.d.ts +2 -0
  132. package/dist/mcp/toolRegistry.js +32 -31
  133. package/dist/neurolink.d.ts +41 -2
  134. package/dist/neurolink.js +1616 -1681
  135. package/dist/observability/otelBridge.d.ts +2 -2
  136. package/dist/observability/otelBridge.js +12 -3
  137. package/dist/providers/amazonBedrock.js +2 -4
  138. package/dist/providers/anthropic.d.ts +9 -5
  139. package/dist/providers/anthropic.js +19 -14
  140. package/dist/providers/anthropicBaseProvider.d.ts +3 -3
  141. package/dist/providers/anthropicBaseProvider.js +5 -4
  142. package/dist/providers/azureOpenai.d.ts +1 -1
  143. package/dist/providers/azureOpenai.js +5 -4
  144. package/dist/providers/googleAiStudio.js +30 -6
  145. package/dist/providers/googleVertex.d.ts +10 -0
  146. package/dist/providers/googleVertex.js +437 -423
  147. package/dist/providers/huggingFace.d.ts +3 -3
  148. package/dist/providers/huggingFace.js +6 -7
  149. package/dist/providers/litellm.d.ts +1 -0
  150. package/dist/providers/litellm.js +76 -55
  151. package/dist/providers/mistral.js +2 -1
  152. package/dist/providers/ollama.js +93 -23
  153. package/dist/providers/openAI.d.ts +2 -0
  154. package/dist/providers/openAI.js +141 -141
  155. package/dist/providers/openRouter.js +2 -1
  156. package/dist/providers/openaiCompatible.d.ts +4 -4
  157. package/dist/providers/openaiCompatible.js +4 -3
  158. package/dist/proxy/claudeFormat.d.ts +3 -2
  159. package/dist/proxy/claudeFormat.js +27 -14
  160. package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  161. package/dist/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  162. package/dist/proxy/modelRouter.js +3 -0
  163. package/dist/proxy/oauthFetch.d.ts +1 -1
  164. package/dist/proxy/oauthFetch.js +289 -316
  165. package/dist/proxy/proxyConfig.js +46 -24
  166. package/dist/proxy/proxyEnv.d.ts +19 -0
  167. package/dist/proxy/proxyEnv.js +72 -0
  168. package/dist/proxy/proxyFetch.js +291 -217
  169. package/dist/proxy/proxyTracer.d.ts +133 -0
  170. package/dist/proxy/proxyTracer.js +644 -0
  171. package/dist/proxy/rawStreamCapture.d.ts +10 -0
  172. package/dist/proxy/rawStreamCapture.js +82 -0
  173. package/dist/proxy/requestLogger.d.ts +32 -5
  174. package/dist/proxy/requestLogger.js +503 -47
  175. package/dist/proxy/sseInterceptor.d.ts +97 -0
  176. package/dist/proxy/sseInterceptor.js +426 -0
  177. package/dist/proxy/usageStats.d.ts +4 -3
  178. package/dist/proxy/usageStats.js +25 -12
  179. package/dist/rag/chunkers/MarkdownChunker.js +13 -5
  180. package/dist/rag/chunking/markdownChunker.js +15 -6
  181. package/dist/server/routes/claudeProxyRoutes.d.ts +17 -3
  182. package/dist/server/routes/claudeProxyRoutes.js +3032 -1349
  183. package/dist/services/server/ai/observability/instrumentation.d.ts +7 -1
  184. package/dist/services/server/ai/observability/instrumentation.js +337 -161
  185. package/dist/tasks/backends/bullmqBackend.d.ts +1 -0
  186. package/dist/tasks/backends/bullmqBackend.js +35 -22
  187. package/dist/tasks/store/redisTaskStore.d.ts +1 -0
  188. package/dist/tasks/store/redisTaskStore.js +54 -39
  189. package/dist/tasks/taskManager.d.ts +5 -0
  190. package/dist/tasks/taskManager.js +158 -30
  191. package/dist/telemetry/index.d.ts +2 -1
  192. package/dist/telemetry/index.js +2 -1
  193. package/dist/telemetry/telemetryService.d.ts +3 -0
  194. package/dist/telemetry/telemetryService.js +69 -5
  195. package/dist/types/cli.d.ts +10 -0
  196. package/dist/types/proxyTypes.d.ts +160 -5
  197. package/dist/types/streamTypes.d.ts +25 -3
  198. package/dist/utils/messageBuilder.js +3 -2
  199. package/dist/utils/providerHealth.d.ts +19 -0
  200. package/dist/utils/providerHealth.js +279 -33
  201. package/dist/utils/providerUtils.js +18 -22
  202. package/dist/utils/toolChoice.d.ts +4 -0
  203. package/dist/utils/toolChoice.js +6 -0
  204. package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +6609 -0
  205. package/docs/changelog.md +252 -0
  206. package/package.json +19 -2
  207. package/scripts/observability/check-proxy-telemetry.mjs +235 -0
  208. package/scripts/observability/docker-compose.proxy-observability.yaml +55 -0
  209. package/scripts/observability/import-openobserve-dashboard.mjs +240 -0
  210. package/scripts/observability/manage-local-openobserve.sh +215 -0
  211. package/scripts/observability/otel-collector.proxy-observability.yaml +78 -0
  212. package/scripts/observability/proxy-observability.env.example +23 -0
@@ -2,7 +2,7 @@
2
2
  * OpenTelemetry Bridge
3
3
  * Bidirectional context propagation between NeuroLink and OpenTelemetry
4
4
  */
5
- import { type SpanContext } from "@opentelemetry/api";
5
+ import { type Context, type SpanContext } from "@opentelemetry/api";
6
6
  import type { SpanData } from "./types/spanTypes.js";
7
7
  import { type SpanType } from "./types/spanTypes.js";
8
8
  /**
@@ -18,7 +18,7 @@ export declare class OtelBridge {
18
18
  /**
19
19
  * Inject trace context into outgoing request headers
20
20
  */
21
- injectContext(headers: Record<string, string>): Record<string, string>;
21
+ injectContext(headers: Record<string, string>, otelContext?: Context): Record<string, string>;
22
22
  /**
23
23
  * Create a NeuroLink span from OpenTelemetry context
24
24
  */
@@ -15,15 +15,24 @@ export class OtelBridge {
15
15
  * Extract trace context from incoming request headers
16
16
  */
17
17
  extractContext(headers) {
18
- const extractedContext = propagation.extract(context.active(), headers);
18
+ // Normalize traceparent: OTel HTTP auto-instrumentation may inject a second traceparent
19
+ // on top of the SDK's manually injected one, producing "val1, val2". The W3C spec rejects
20
+ // multiple values, causing extraction to silently return null. Take the first value only.
21
+ const normalizedHeaders = { ...headers };
22
+ if (typeof normalizedHeaders["traceparent"] === "string" &&
23
+ normalizedHeaders["traceparent"].includes(", ")) {
24
+ normalizedHeaders["traceparent"] =
25
+ normalizedHeaders["traceparent"].split(", ")[0];
26
+ }
27
+ const extractedContext = propagation.extract(context.active(), normalizedHeaders);
19
28
  const spanContext = trace.getSpanContext(extractedContext);
20
29
  return spanContext ?? null;
21
30
  }
22
31
  /**
23
32
  * Inject trace context into outgoing request headers
24
33
  */
25
- injectContext(headers) {
26
- propagation.inject(context.active(), headers);
34
+ injectContext(headers, otelContext = context.active()) {
35
+ propagation.inject(otelContext, headers);
27
36
  return headers;
28
37
  }
29
38
  /**
@@ -1002,8 +1002,7 @@ export class AmazonBedrockProvider extends BaseProvider {
1002
1002
  });
1003
1003
  if (firstStopReason === "tool_use") {
1004
1004
  const toolNames = firstMessageContent
1005
- .filter((b) => b.toolUse?.name)
1006
- .map((b) => b.toolUse.name)
1005
+ .flatMap((b) => (b.toolUse?.name ? [b.toolUse.name] : []))
1007
1006
  .join(", ");
1008
1007
  streamSpan.addEvent("stream.tool_use", {
1009
1008
  iteration: 0,
@@ -1029,8 +1028,7 @@ export class AmazonBedrockProvider extends BaseProvider {
1029
1028
  });
1030
1029
  if (stopReason === "tool_use") {
1031
1030
  const toolNames = assistantMessage.content
1032
- .filter((b) => b.toolUse?.name)
1033
- .map((b) => b.toolUse.name)
1031
+ .flatMap((b) => (b.toolUse?.name ? [b.toolUse.name] : []))
1034
1032
  .join(", ");
1035
1033
  streamSpan.addEvent("stream.tool_use", {
1036
1034
  iteration,
@@ -1,17 +1,21 @@
1
1
  import { type LanguageModel } from "ai";
2
2
  import { type AIProviderName } from "../constants/enums.js";
3
3
  import { BaseProvider } from "../core/baseProvider.js";
4
- import type { TextGenerationOptions, EnhancedGenerateResult } from "../types/generateTypes.js";
4
+ import type { EnhancedGenerateResult, TextGenerationOptions } from "../types/generateTypes.js";
5
+ import type { AnthropicProviderConfig } from "../types/providers.js";
5
6
  import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
7
+ import type { AnthropicAuthMethod, AnthropicResponseMetadata, ClaudeSubscriptionTier, ClaudeUsageInfo } from "../types/subscriptionTypes.js";
6
8
  import type { ValidationSchema } from "../types/typeAliases.js";
7
- import type { ClaudeSubscriptionTier, AnthropicAuthMethod, AnthropicResponseMetadata, ClaudeUsageInfo } from "../types/subscriptionTypes.js";
8
- import type { AnthropicProviderConfig } from "../types/providers.js";
9
9
  /**
10
10
  * Beta headers for Claude Code integration.
11
11
  * These enable experimental features:
12
12
  * - claude-code-20250219: Claude Code specific features
13
- * - interleaved-thinking-2025-05-14: Interleaved thinking mode
14
13
  * - fine-grained-tool-streaming-2025-05-14: Fine-grained tool streaming
14
+ *
15
+ * Note: interleaved-thinking-2025-05-14 was removed — it was claude-3-7-sonnet
16
+ * specific and causes invalid_request_error (HTTP 400) on claude-4 models
17
+ * (claude-opus-4-6, claude-sonnet-4-6) which handle thinking via the
18
+ * `thinking` request body parameter instead.
15
19
  */
16
20
  declare const ANTHROPIC_BETA_HEADERS: {
17
21
  "anthropic-beta": string;
@@ -140,6 +144,6 @@ export declare class AnthropicProvider extends BaseProvider {
140
144
  isAvailable(): Promise<boolean>;
141
145
  getModel(): LanguageModel;
142
146
  }
143
- export { ModelAccessError, isModelAvailableForTier, getRecommendedModelForTier, getModelCapabilities, } from "../models/anthropicModels.js";
147
+ export { getModelCapabilities, getRecommendedModelForTier, isModelAvailableForTier, ModelAccessError, } from "../models/anthropicModels.js";
144
148
  export { ANTHROPIC_BETA_HEADERS };
145
149
  export default AnthropicProvider;
@@ -1,34 +1,37 @@
1
1
  import { createAnthropic } from "@ai-sdk/anthropic";
2
+ import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
3
  import { stepCountIs, streamText } from "ai";
3
- import { trace, SpanKind, SpanStatusCode } from "@opentelemetry/api";
4
- import { AnthropicModels } from "../constants/enums.js";
4
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "fs";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ import { ANTHROPIC_TOKEN_URL, CLAUDE_CLI_USER_AGENT, CLAUDE_CODE_CLIENT_ID, } from "../auth/anthropicOAuth.js";
8
+ import { AnthropicModels, TOKEN_EXPIRY_BUFFER_MS, } from "../constants/enums.js";
5
9
  import { BaseProvider } from "../core/baseProvider.js";
6
10
  import { DEFAULT_MAX_STEPS } from "../core/constants.js";
11
+ import { getModelCapabilities, getRecommendedModelForTier, isModelAvailableForTier, } from "../models/anthropicModels.js";
12
+ import { createOAuthFetch } from "../proxy/oauthFetch.js";
7
13
  import { createProxyFetch } from "../proxy/proxyFetch.js";
8
14
  import { AuthenticationError, NetworkError, ProviderError, RateLimitError, } from "../types/errors.js";
9
15
  import { logger } from "../utils/logger.js";
10
16
  import { calculateCost } from "../utils/pricing.js";
11
17
  import { createAnthropicConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
12
18
  import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
13
- import { isModelAvailableForTier, getRecommendedModelForTier, getModelCapabilities, } from "../models/anthropicModels.js";
14
- import { CLAUDE_CLI_USER_AGENT, CLAUDE_CODE_CLIENT_ID, ANTHROPIC_TOKEN_URL, } from "../auth/anthropicOAuth.js";
15
- import { createOAuthFetch } from "../proxy/oauthFetch.js";
16
- import { homedir } from "os";
17
- import { readFileSync, existsSync, writeFileSync, mkdirSync, renameSync, } from "fs";
18
- import { join } from "path";
19
- import { TOKEN_EXPIRY_BUFFER_MS } from "../constants/enums.js";
19
+ import { resolveToolChoice } from "../utils/toolChoice.js";
20
20
  import { getModelId } from "./providerTypeUtils.js";
21
21
  /**
22
22
  * Beta headers for Claude Code integration.
23
23
  * These enable experimental features:
24
24
  * - claude-code-20250219: Claude Code specific features
25
- * - interleaved-thinking-2025-05-14: Interleaved thinking mode
26
25
  * - fine-grained-tool-streaming-2025-05-14: Fine-grained tool streaming
26
+ *
27
+ * Note: interleaved-thinking-2025-05-14 was removed — it was claude-3-7-sonnet
28
+ * specific and causes invalid_request_error (HTTP 400) on claude-4 models
29
+ * (claude-opus-4-6, claude-sonnet-4-6) which handle thinking via the
30
+ * `thinking` request body parameter instead.
27
31
  */
28
32
  const ANTHROPIC_BETA_HEADERS = {
29
33
  "anthropic-beta": [
30
34
  "claude-code-20250219",
31
- "interleaved-thinking-2025-05-14",
32
35
  "fine-grained-tool-streaming-2025-05-14",
33
36
  ].join(","),
34
37
  };
@@ -155,7 +158,9 @@ const detectAuthMethod = (oauthToken) => {
155
158
  logger.warn("[detectAuthMethod] ANTHROPIC_AUTH_METHOD=oauth but no OAuth token found; falling through to auto-detection");
156
159
  }
157
160
  else if (explicit) {
158
- logger.warn("[detectAuthMethod] Unrecognized ANTHROPIC_AUTH_METHOD value; falling through to auto-detection", { value: explicit });
161
+ logger.warn("[detectAuthMethod] Unrecognized ANTHROPIC_AUTH_METHOD value; falling through to auto-detection", {
162
+ value: explicit,
163
+ });
159
164
  }
160
165
  // Auto-detect: OAuth takes precedence if available
161
166
  const method = oauthToken ? "oauth" : "api_key";
@@ -762,7 +767,7 @@ export class AnthropicProvider extends BaseProvider {
762
767
  maxRetries: 0, // NL11: Disable AI SDK's invisible internal retries; we handle retries with OTel instrumentation
763
768
  tools,
764
769
  stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
765
- toolChoice: shouldUseTools ? "auto" : "none",
770
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
766
771
  abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
767
772
  experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
768
773
  onStepFinish: ({ toolCalls, toolResults }) => {
@@ -857,7 +862,7 @@ export class AnthropicProvider extends BaseProvider {
857
862
  }
858
863
  }
859
864
  // Re-export types and utilities for convenience
860
- export { ModelAccessError, isModelAvailableForTier, getRecommendedModelForTier, getModelCapabilities, } from "../models/anthropicModels.js";
865
+ export { getModelCapabilities, getRecommendedModelForTier, isModelAvailableForTier, ModelAccessError, } from "../models/anthropicModels.js";
861
866
  // Export beta headers constant for external use
862
867
  export { ANTHROPIC_BETA_HEADERS };
863
868
  export default AnthropicProvider;
@@ -1,8 +1,8 @@
1
- import type { ZodType } from "zod";
2
1
  import { type LanguageModel, type Schema } from "ai";
3
- import { AIProviderName } from "../constants/enums.js";
4
- import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
2
+ import type { ZodType } from "zod";
3
+ import { type AIProviderName } from "../constants/enums.js";
5
4
  import { BaseProvider } from "../core/baseProvider.js";
5
+ import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
6
6
  /**
7
7
  * Anthropic provider implementation using BaseProvider pattern
8
8
  * Migrated from direct API calls to Vercel AI SDK (@ai-sdk/anthropic)
@@ -1,13 +1,14 @@
1
1
  import { createAnthropic } from "@ai-sdk/anthropic";
2
+ import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
3
  import { NoOutputGeneratedError, streamText, } from "ai";
3
- import { trace, SpanKind, SpanStatusCode } from "@opentelemetry/api";
4
- import { AIProviderName, AnthropicModels } from "../constants/enums.js";
4
+ import { AnthropicModels } from "../constants/enums.js";
5
5
  import { BaseProvider } from "../core/baseProvider.js";
6
6
  import { AuthenticationError, NetworkError, ProviderError, RateLimitError, } from "../types/errors.js";
7
7
  import { logger } from "../utils/logger.js";
8
8
  import { calculateCost } from "../utils/pricing.js";
9
+ import { createAnthropicBaseConfig, validateApiKey, } from "../utils/providerConfig.js";
9
10
  import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
10
- import { validateApiKey, createAnthropicBaseConfig, } from "../utils/providerConfig.js";
11
+ import { resolveToolChoice } from "../utils/toolChoice.js";
11
12
  import { getModelId } from "./providerTypeUtils.js";
12
13
  const streamTracer = trace.getTracer("neurolink.provider.anthropic");
13
14
  /**
@@ -90,7 +91,7 @@ export class AnthropicProviderV2 extends BaseProvider {
90
91
  maxOutputTokens: options.maxTokens, // No default limit - unlimited unless specified
91
92
  maxRetries: 0, // NL11: Disable AI SDK's invisible internal retries; we handle retries with OTel instrumentation
92
93
  tools,
93
- toolChoice: shouldUseTools ? "auto" : "none",
94
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
94
95
  abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
95
96
  experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
96
97
  onStepFinish: ({ toolCalls, toolResults }) => {
@@ -1,6 +1,6 @@
1
1
  import { type LanguageModel } from "ai";
2
+ import { type AIProviderName } from "../constants/enums.js";
2
3
  import { BaseProvider } from "../core/baseProvider.js";
3
- import { AIProviderName } from "../constants/enums.js";
4
4
  import type { StreamOptions, StreamResult } from "../types/streamTypes.js";
5
5
  export declare class AzureOpenAIProvider extends BaseProvider {
6
6
  private apiKey;
@@ -1,12 +1,13 @@
1
1
  import { createAzure } from "@ai-sdk/azure";
2
2
  import { stepCountIs, streamText } from "ai";
3
- import { BaseProvider } from "../core/baseProvider.js";
4
3
  import { APIVersions } from "../constants/enums.js";
5
- import { validateApiKey, createAzureAPIKeyConfig, createAzureEndpointConfig, } from "../utils/providerConfig.js";
4
+ import { BaseProvider } from "../core/baseProvider.js";
6
5
  import { DEFAULT_MAX_STEPS } from "../core/constants.js";
7
- import { logger } from "../utils/logger.js";
8
6
  import { createProxyFetch } from "../proxy/proxyFetch.js";
7
+ import { logger } from "../utils/logger.js";
8
+ import { createAzureAPIKeyConfig, createAzureEndpointConfig, validateApiKey, } from "../utils/providerConfig.js";
9
9
  import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
10
+ import { resolveToolChoice } from "../utils/toolChoice.js";
10
11
  export class AzureOpenAIProvider extends BaseProvider {
11
12
  apiKey;
12
13
  resourceName;
@@ -108,7 +109,7 @@ export class AzureOpenAIProvider extends BaseProvider {
108
109
  ? { temperature: options.temperature }
109
110
  : {}),
110
111
  tools,
111
- toolChoice: shouldUseTools ? "auto" : "none",
112
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
112
113
  stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
113
114
  abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
114
115
  experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
@@ -11,6 +11,7 @@ import { logger } from "../utils/logger.js";
11
11
  import { isGemini3Model } from "../utils/modelDetection.js";
12
12
  import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
13
13
  import { estimateTokens } from "../utils/tokenEstimation.js";
14
+ import { resolveToolChoice } from "../utils/toolChoice.js";
14
15
  import { buildNativeConfig, buildNativeToolDeclarations, collectStreamChunks, collectStreamChunksIncremental, computeMaxSteps, createTextChannel, executeNativeToolCalls, extractTextFromParts, handleMaxStepsTermination, pushModelResponseToHistory, sanitizeToolsForGemini, } from "./googleNativeGemini3.js";
15
16
  import { toAnalyticsStreamResult } from "./providerTypeUtils.js";
16
17
  // Google AI Live API types now imported from ../types/providerSpecific.js
@@ -32,11 +33,6 @@ async function createGoogleGenAIClient(apiKey) {
32
33
  const Ctor = ctor;
33
34
  return new Ctor({ apiKey });
34
35
  }
35
- // Environment variable setup
36
- if (!process.env.GOOGLE_GENERATIVE_AI_API_KEY &&
37
- process.env.GOOGLE_AI_API_KEY) {
38
- process.env.GOOGLE_GENERATIVE_AI_API_KEY = process.env.GOOGLE_AI_API_KEY;
39
- }
40
36
  /**
41
37
  * Google AI Studio provider implementation using BaseProvider
42
38
  * Migrated from original GoogleAIStudio class to new factory pattern
@@ -473,6 +469,8 @@ export class GoogleAIStudioProvider extends BaseProvider {
473
469
  // Build message array from options with multimodal support
474
470
  // Using protected helper from BaseProvider to eliminate code duplication
475
471
  const messages = await this.buildMessagesForStream(options);
472
+ const collectedToolCalls = [];
473
+ const collectedToolResults = [];
476
474
  const result = await streamText({
477
475
  model,
478
476
  messages: messages,
@@ -480,7 +478,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
480
478
  maxOutputTokens: options.maxTokens, // No default limit - unlimited unless specified
481
479
  tools,
482
480
  stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
483
- toolChoice: shouldUseTools ? "auto" : "none",
481
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
484
482
  abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
485
483
  experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
486
484
  // Gemini 3: use thinkingLevel via providerOptions
@@ -502,6 +500,28 @@ export class GoogleAIStudioProvider extends BaseProvider {
502
500
  },
503
501
  }),
504
502
  onStepFinish: ({ toolCalls, toolResults }) => {
503
+ for (const toolCall of toolCalls) {
504
+ collectedToolCalls.push({
505
+ toolCallId: toolCall.toolCallId,
506
+ toolName: toolCall.toolName,
507
+ args: toolCall.args ??
508
+ toolCall.input ??
509
+ toolCall
510
+ .parameters ??
511
+ {},
512
+ });
513
+ }
514
+ for (const toolResult of toolResults) {
515
+ const rawToolResult = toolResult;
516
+ collectedToolResults.push({
517
+ toolName: toolResult.toolName,
518
+ status: rawToolResult.error ? "failure" : "success",
519
+ output: (rawToolResult.output ??
520
+ rawToolResult.result) ?? undefined,
521
+ error: rawToolResult.error,
522
+ id: rawToolResult.toolCallId ?? toolResult.toolName,
523
+ });
524
+ }
505
525
  this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
506
526
  logger.warn("[GoogleAiStudioProvider] Failed to store tool executions", {
507
527
  provider: this.providerName,
@@ -530,6 +550,10 @@ export class GoogleAIStudioProvider extends BaseProvider {
530
550
  stream: transformedStream,
531
551
  provider: this.providerName,
532
552
  model: this.modelName,
553
+ ...(shouldUseTools && {
554
+ toolCalls: collectedToolCalls,
555
+ toolResults: collectedToolResults,
556
+ }),
533
557
  analytics: analyticsPromise,
534
558
  metadata: {
535
559
  startTime,
@@ -121,6 +121,14 @@ export declare class GoogleVertexProvider extends BaseProvider {
121
121
  */
122
122
  private validateStreamOptionsOnly;
123
123
  protected executeStream(options: StreamOptions, analysisSchema?: ZodType | Schema<unknown>): Promise<StreamResult>;
124
+ private maybeExecuteNativeGemini3ToolStream;
125
+ private executeAISDKStream;
126
+ private resolveAISDKStreamTools;
127
+ private buildAISDKStreamOptions;
128
+ private captureAISDKStreamToolStep;
129
+ private startObservedAISDKStream;
130
+ private attachAISDKStreamObservers;
131
+ private observeAISDKStreamResult;
124
132
  /**
125
133
  * Create @google/genai client configured for Vertex AI
126
134
  */
@@ -142,6 +150,8 @@ export declare class GoogleVertexProvider extends BaseProvider {
142
150
  * This bypasses @ai-sdk/google-vertex to properly handle thought_signature
143
151
  */
144
152
  private executeNativeGemini3Stream;
153
+ private executeNativeGemini3StreamWithSpan;
154
+ private runNativeGemini3StreamLoop;
145
155
  /**
146
156
  * Execute generate using native @google/genai SDK for Gemini 3 models on Vertex AI
147
157
  * This bypasses @ai-sdk/google-vertex to properly handle thought_signature