@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.
- package/CHANGELOG.md +8 -0
- package/README.md +7 -1
- package/dist/auth/anthropicOAuth.d.ts +18 -3
- package/dist/auth/anthropicOAuth.js +149 -4
- package/dist/auth/providers/firebase.js +5 -1
- package/dist/auth/providers/jwt.js +5 -1
- package/dist/auth/providers/workos.js +5 -1
- package/dist/auth/sessionManager.d.ts +1 -1
- package/dist/auth/sessionManager.js +58 -27
- package/dist/browser/neurolink.min.js +354 -334
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.js +188 -181
- package/dist/cli/commands/proxy.d.ts +2 -1
- package/dist/cli/commands/proxy.js +713 -431
- package/dist/cli/commands/task.js +3 -0
- package/dist/cli/factories/commandFactory.d.ts +2 -0
- package/dist/cli/factories/commandFactory.js +38 -0
- package/dist/cli/parser.js +4 -3
- package/dist/client/aiSdkAdapter.js +3 -0
- package/dist/client/streamingClient.js +30 -10
- package/dist/core/baseProvider.d.ts +6 -1
- package/dist/core/baseProvider.js +208 -230
- package/dist/core/factory.d.ts +3 -0
- package/dist/core/factory.js +138 -188
- package/dist/core/modules/GenerationHandler.js +3 -2
- package/dist/core/redisConversationMemoryManager.js +7 -3
- package/dist/evaluation/BatchEvaluator.js +4 -1
- package/dist/evaluation/hooks/observabilityHooks.js +5 -3
- package/dist/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
- package/dist/evaluation/pipeline/evaluationPipeline.js +24 -9
- package/dist/evaluation/pipeline/strategies/batchStrategy.js +6 -3
- package/dist/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
- package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
- package/dist/evaluation/scorers/scorerRegistry.js +353 -282
- package/dist/lib/auth/anthropicOAuth.d.ts +18 -3
- package/dist/lib/auth/anthropicOAuth.js +149 -4
- package/dist/lib/auth/providers/firebase.js +5 -1
- package/dist/lib/auth/providers/jwt.js +5 -1
- package/dist/lib/auth/providers/workos.js +5 -1
- package/dist/lib/auth/sessionManager.d.ts +1 -1
- package/dist/lib/auth/sessionManager.js +58 -27
- package/dist/lib/client/aiSdkAdapter.js +3 -0
- package/dist/lib/client/streamingClient.js +30 -10
- package/dist/lib/core/baseProvider.d.ts +6 -1
- package/dist/lib/core/baseProvider.js +208 -230
- package/dist/lib/core/factory.d.ts +3 -0
- package/dist/lib/core/factory.js +138 -188
- package/dist/lib/core/modules/GenerationHandler.js +3 -2
- package/dist/lib/core/redisConversationMemoryManager.js +7 -3
- package/dist/lib/evaluation/BatchEvaluator.js +4 -1
- package/dist/lib/evaluation/hooks/observabilityHooks.js +5 -3
- package/dist/lib/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
- package/dist/lib/evaluation/pipeline/evaluationPipeline.js +24 -9
- package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +6 -3
- package/dist/lib/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
- package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
- package/dist/lib/evaluation/scorers/scorerRegistry.js +353 -282
- package/dist/lib/mcp/toolRegistry.d.ts +2 -0
- package/dist/lib/mcp/toolRegistry.js +32 -31
- package/dist/lib/neurolink.d.ts +41 -2
- package/dist/lib/neurolink.js +1616 -1681
- package/dist/lib/observability/otelBridge.d.ts +2 -2
- package/dist/lib/observability/otelBridge.js +12 -3
- package/dist/lib/providers/amazonBedrock.js +2 -4
- package/dist/lib/providers/anthropic.d.ts +9 -5
- package/dist/lib/providers/anthropic.js +19 -14
- package/dist/lib/providers/anthropicBaseProvider.d.ts +3 -3
- package/dist/lib/providers/anthropicBaseProvider.js +5 -4
- package/dist/lib/providers/azureOpenai.d.ts +1 -1
- package/dist/lib/providers/azureOpenai.js +5 -4
- package/dist/lib/providers/googleAiStudio.js +30 -6
- package/dist/lib/providers/googleVertex.d.ts +10 -0
- package/dist/lib/providers/googleVertex.js +437 -423
- package/dist/lib/providers/huggingFace.d.ts +3 -3
- package/dist/lib/providers/huggingFace.js +6 -8
- package/dist/lib/providers/litellm.d.ts +1 -0
- package/dist/lib/providers/litellm.js +76 -55
- package/dist/lib/providers/mistral.js +2 -1
- package/dist/lib/providers/ollama.js +93 -23
- package/dist/lib/providers/openAI.d.ts +2 -0
- package/dist/lib/providers/openAI.js +141 -141
- package/dist/lib/providers/openRouter.js +2 -1
- package/dist/lib/providers/openaiCompatible.d.ts +4 -4
- package/dist/lib/providers/openaiCompatible.js +4 -4
- package/dist/lib/proxy/claudeFormat.d.ts +3 -2
- package/dist/lib/proxy/claudeFormat.js +27 -14
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +9 -33
- package/dist/lib/proxy/modelRouter.js +3 -0
- package/dist/lib/proxy/oauthFetch.d.ts +1 -1
- package/dist/lib/proxy/oauthFetch.js +289 -316
- package/dist/lib/proxy/proxyConfig.js +46 -24
- package/dist/lib/proxy/proxyEnv.d.ts +19 -0
- package/dist/lib/proxy/proxyEnv.js +73 -0
- package/dist/lib/proxy/proxyFetch.js +291 -217
- package/dist/lib/proxy/proxyTracer.d.ts +133 -0
- package/dist/lib/proxy/proxyTracer.js +645 -0
- package/dist/lib/proxy/rawStreamCapture.d.ts +10 -0
- package/dist/lib/proxy/rawStreamCapture.js +83 -0
- package/dist/lib/proxy/requestLogger.d.ts +32 -5
- package/dist/lib/proxy/requestLogger.js +503 -47
- package/dist/lib/proxy/sseInterceptor.d.ts +97 -0
- package/dist/lib/proxy/sseInterceptor.js +427 -0
- package/dist/lib/proxy/usageStats.d.ts +4 -3
- package/dist/lib/proxy/usageStats.js +25 -12
- package/dist/lib/rag/chunkers/MarkdownChunker.js +13 -5
- package/dist/lib/rag/chunking/markdownChunker.js +15 -6
- package/dist/lib/server/routes/claudeProxyRoutes.d.ts +17 -3
- package/dist/lib/server/routes/claudeProxyRoutes.js +3032 -1349
- package/dist/lib/services/server/ai/observability/instrumentation.d.ts +7 -1
- package/dist/lib/services/server/ai/observability/instrumentation.js +337 -161
- package/dist/lib/tasks/backends/bullmqBackend.d.ts +1 -0
- package/dist/lib/tasks/backends/bullmqBackend.js +35 -22
- package/dist/lib/tasks/store/redisTaskStore.d.ts +1 -0
- package/dist/lib/tasks/store/redisTaskStore.js +54 -39
- package/dist/lib/tasks/taskManager.d.ts +5 -0
- package/dist/lib/tasks/taskManager.js +158 -30
- package/dist/lib/telemetry/index.d.ts +2 -1
- package/dist/lib/telemetry/index.js +2 -1
- package/dist/lib/telemetry/telemetryService.d.ts +3 -0
- package/dist/lib/telemetry/telemetryService.js +69 -5
- package/dist/lib/types/cli.d.ts +10 -0
- package/dist/lib/types/proxyTypes.d.ts +160 -5
- package/dist/lib/types/streamTypes.d.ts +25 -3
- package/dist/lib/utils/messageBuilder.js +3 -2
- package/dist/lib/utils/providerHealth.d.ts +19 -0
- package/dist/lib/utils/providerHealth.js +279 -33
- package/dist/lib/utils/providerUtils.js +17 -22
- package/dist/lib/utils/toolChoice.d.ts +4 -0
- package/dist/lib/utils/toolChoice.js +7 -0
- package/dist/mcp/toolRegistry.d.ts +2 -0
- package/dist/mcp/toolRegistry.js +32 -31
- package/dist/neurolink.d.ts +41 -2
- package/dist/neurolink.js +1616 -1681
- package/dist/observability/otelBridge.d.ts +2 -2
- package/dist/observability/otelBridge.js +12 -3
- package/dist/providers/amazonBedrock.js +2 -4
- package/dist/providers/anthropic.d.ts +9 -5
- package/dist/providers/anthropic.js +19 -14
- package/dist/providers/anthropicBaseProvider.d.ts +3 -3
- package/dist/providers/anthropicBaseProvider.js +5 -4
- package/dist/providers/azureOpenai.d.ts +1 -1
- package/dist/providers/azureOpenai.js +5 -4
- package/dist/providers/googleAiStudio.js +30 -6
- package/dist/providers/googleVertex.d.ts +10 -0
- package/dist/providers/googleVertex.js +437 -423
- package/dist/providers/huggingFace.d.ts +3 -3
- package/dist/providers/huggingFace.js +6 -7
- package/dist/providers/litellm.d.ts +1 -0
- package/dist/providers/litellm.js +76 -55
- package/dist/providers/mistral.js +2 -1
- package/dist/providers/ollama.js +93 -23
- package/dist/providers/openAI.d.ts +2 -0
- package/dist/providers/openAI.js +141 -141
- package/dist/providers/openRouter.js +2 -1
- package/dist/providers/openaiCompatible.d.ts +4 -4
- package/dist/providers/openaiCompatible.js +4 -3
- package/dist/proxy/claudeFormat.d.ts +3 -2
- package/dist/proxy/claudeFormat.js +27 -14
- package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
- package/dist/proxy/cloaking/plugins/sessionIdentity.js +9 -33
- package/dist/proxy/modelRouter.js +3 -0
- package/dist/proxy/oauthFetch.d.ts +1 -1
- package/dist/proxy/oauthFetch.js +289 -316
- package/dist/proxy/proxyConfig.js +46 -24
- package/dist/proxy/proxyEnv.d.ts +19 -0
- package/dist/proxy/proxyEnv.js +72 -0
- package/dist/proxy/proxyFetch.js +291 -217
- package/dist/proxy/proxyTracer.d.ts +133 -0
- package/dist/proxy/proxyTracer.js +644 -0
- package/dist/proxy/rawStreamCapture.d.ts +10 -0
- package/dist/proxy/rawStreamCapture.js +82 -0
- package/dist/proxy/requestLogger.d.ts +32 -5
- package/dist/proxy/requestLogger.js +503 -47
- package/dist/proxy/sseInterceptor.d.ts +97 -0
- package/dist/proxy/sseInterceptor.js +426 -0
- package/dist/proxy/usageStats.d.ts +4 -3
- package/dist/proxy/usageStats.js +25 -12
- package/dist/rag/chunkers/MarkdownChunker.js +13 -5
- package/dist/rag/chunking/markdownChunker.js +15 -6
- package/dist/server/routes/claudeProxyRoutes.d.ts +17 -3
- package/dist/server/routes/claudeProxyRoutes.js +3032 -1349
- package/dist/services/server/ai/observability/instrumentation.d.ts +7 -1
- package/dist/services/server/ai/observability/instrumentation.js +337 -161
- package/dist/tasks/backends/bullmqBackend.d.ts +1 -0
- package/dist/tasks/backends/bullmqBackend.js +35 -22
- package/dist/tasks/store/redisTaskStore.d.ts +1 -0
- package/dist/tasks/store/redisTaskStore.js +54 -39
- package/dist/tasks/taskManager.d.ts +5 -0
- package/dist/tasks/taskManager.js +158 -30
- package/dist/telemetry/index.d.ts +2 -1
- package/dist/telemetry/index.js +2 -1
- package/dist/telemetry/telemetryService.d.ts +3 -0
- package/dist/telemetry/telemetryService.js +69 -5
- package/dist/types/cli.d.ts +10 -0
- package/dist/types/proxyTypes.d.ts +160 -5
- package/dist/types/streamTypes.d.ts +25 -3
- package/dist/utils/messageBuilder.js +3 -2
- package/dist/utils/providerHealth.d.ts +19 -0
- package/dist/utils/providerHealth.js +279 -33
- package/dist/utils/providerUtils.js +18 -22
- package/dist/utils/toolChoice.d.ts +4 -0
- package/dist/utils/toolChoice.js +6 -0
- package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +6609 -0
- package/docs/changelog.md +252 -0
- package/package.json +19 -2
- package/scripts/observability/check-proxy-telemetry.mjs +235 -0
- package/scripts/observability/docker-compose.proxy-observability.yaml +55 -0
- package/scripts/observability/import-openobserve-dashboard.mjs +240 -0
- package/scripts/observability/manage-local-openobserve.sh +215 -0
- package/scripts/observability/otel-collector.proxy-observability.yaml +78 -0
- 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
|
|
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
|
-
|
|
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(
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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 {
|
|
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 {
|
|
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 {
|
|
4
|
-
import {
|
|
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 {
|
|
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", {
|
|
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:
|
|
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 {
|
|
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 {
|
|
4
|
-
import
|
|
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 {
|
|
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 {
|
|
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:
|
|
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 { APIVersions } from "../constants/enums.js";
|
|
3
4
|
import { BaseProvider } from "../core/baseProvider.js";
|
|
4
|
-
import { AIProviderName, APIVersions } from "../constants/enums.js";
|
|
5
|
-
import { validateApiKey, createAzureAPIKeyConfig, createAzureEndpointConfig, } from "../utils/providerConfig.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:
|
|
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:
|
|
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
|