@juspay/neurolink 12.47.2 → 12.47.3
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.
|
@@ -11,6 +11,15 @@ export declare class AnthropicProvider extends BaseProvider {
|
|
|
11
11
|
private readonly authMethod;
|
|
12
12
|
private readonly subscriptionTier;
|
|
13
13
|
private readonly enableBetaFeatures;
|
|
14
|
+
/**
|
|
15
|
+
* Where requests go when not to `api.anthropic.com`: the credentials'
|
|
16
|
+
* `baseURL`, else the config's, else `ANTHROPIC_BASE_URL` — normalized once
|
|
17
|
+
* (no trailing slash, no `/vN` suffix: the SDK appends `/v1` itself).
|
|
18
|
+
* Undefined means the vendor's own endpoint; every "proxy in use" decision
|
|
19
|
+
* reads this, never the environment directly, so a per-instance gateway is
|
|
20
|
+
* honoured the same way the environment one always was.
|
|
21
|
+
*/
|
|
22
|
+
private readonly baseURL;
|
|
14
23
|
private oauthToken;
|
|
15
24
|
private lastResponseMetadata;
|
|
16
25
|
private usageInfo;
|
|
@@ -25,6 +34,7 @@ export declare class AnthropicProvider extends BaseProvider {
|
|
|
25
34
|
constructor(modelName?: string, sdk?: unknown, config?: AnthropicProviderConfig, credentials?: {
|
|
26
35
|
apiKey?: string;
|
|
27
36
|
oauthToken?: string;
|
|
37
|
+
baseURL?: string;
|
|
28
38
|
});
|
|
29
39
|
/**
|
|
30
40
|
* Get authentication headers based on current auth method and configuration.
|
|
@@ -58,6 +58,31 @@ const getAnthropicApiKey = () => {
|
|
|
58
58
|
const getDefaultAnthropicModel = () => {
|
|
59
59
|
return getProviderModel("ANTHROPIC_MODEL", AnthropicModels.CLAUDE_SONNET_4_6);
|
|
60
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* The official Anthropic SDK builds `${baseURL}/v1/messages` itself, so a
|
|
63
|
+
* version-suffixed base URL — the form the previous @ai-sdk/anthropic
|
|
64
|
+
* implementation REQUIRED (`https://api.anthropic.com/v1`) — would double up
|
|
65
|
+
* as `/v1/v1/messages`. Normalize the inverse way: strip trailing slashes and
|
|
66
|
+
* a trailing `/vN` segment, so both historical forms keep working whether the
|
|
67
|
+
* URL comes from the credentials, the config or `ANTHROPIC_BASE_URL`. Blank
|
|
68
|
+
* means "the vendor's endpoint".
|
|
69
|
+
*/
|
|
70
|
+
function normalizeAnthropicBaseURL(raw) {
|
|
71
|
+
const value = raw?.trim();
|
|
72
|
+
if (!value) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
const trimmed = value.replace(/\/+$/, "");
|
|
76
|
+
const stripped = trimmed.replace(/\/v\d+$/, "");
|
|
77
|
+
if (stripped !== trimmed) {
|
|
78
|
+
logger.debug("[AnthropicProvider] Stripping the version suffix from the base URL — " +
|
|
79
|
+
"the official Anthropic SDK appends /v1 to the base URL itself.", {
|
|
80
|
+
baseURL: redactUrlCredentials(value),
|
|
81
|
+
rewrittenTo: redactUrlCredentials(stripped),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return stripped;
|
|
85
|
+
}
|
|
61
86
|
const streamTracer = trace.getTracer("neurolink.provider.anthropic");
|
|
62
87
|
/**
|
|
63
88
|
* Get OAuth token from stored credentials file or environment.
|
|
@@ -476,6 +501,15 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
476
501
|
authMethod;
|
|
477
502
|
subscriptionTier;
|
|
478
503
|
enableBetaFeatures;
|
|
504
|
+
/**
|
|
505
|
+
* Where requests go when not to `api.anthropic.com`: the credentials'
|
|
506
|
+
* `baseURL`, else the config's, else `ANTHROPIC_BASE_URL` — normalized once
|
|
507
|
+
* (no trailing slash, no `/vN` suffix: the SDK appends `/v1` itself).
|
|
508
|
+
* Undefined means the vendor's own endpoint; every "proxy in use" decision
|
|
509
|
+
* reads this, never the environment directly, so a per-instance gateway is
|
|
510
|
+
* honoured the same way the environment one always was.
|
|
511
|
+
*/
|
|
512
|
+
baseURL;
|
|
479
513
|
oauthToken;
|
|
480
514
|
lastResponseMetadata = null;
|
|
481
515
|
usageInfo = null;
|
|
@@ -511,12 +545,16 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
511
545
|
const subscriptionTier = config?.subscriptionTier ??
|
|
512
546
|
(authMethod === "oauth" ? detectSubscriptionTier(oauthToken) : "api");
|
|
513
547
|
const targetModel = modelName || getDefaultAnthropicModel();
|
|
548
|
+
// Resolved before super(): the tier check below needs it, and the
|
|
549
|
+
// credentials win over the config, which wins over the environment —
|
|
550
|
+
// the same precedence `apiKey` has.
|
|
551
|
+
const baseURL = normalizeAnthropicBaseURL(credentials?.baseURL ?? config?.baseURL ?? process.env.ANTHROPIC_BASE_URL);
|
|
514
552
|
// Determine effective model based on tier access.
|
|
515
|
-
// Skip tier validation when a proxy is in use (
|
|
516
|
-
//
|
|
517
|
-
//
|
|
553
|
+
// Skip tier validation when a proxy is in use (a base URL is set) — the
|
|
554
|
+
// proxy handles model access and auth, so the SDK should pass the
|
|
555
|
+
// requested model through without downgrading.
|
|
518
556
|
let effectiveModel = targetModel;
|
|
519
|
-
const usingProxy =
|
|
557
|
+
const usingProxy = baseURL !== undefined;
|
|
520
558
|
if (!usingProxy &&
|
|
521
559
|
subscriptionTier !== "api" &&
|
|
522
560
|
!isModelAvailableForTier(targetModel, subscriptionTier)) {
|
|
@@ -533,6 +571,7 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
533
571
|
// Store computed values
|
|
534
572
|
this.oauthToken = oauthToken;
|
|
535
573
|
this.subscriptionTier = subscriptionTier;
|
|
574
|
+
this.baseURL = baseURL;
|
|
536
575
|
// Use the auth method already resolved above (before tier computation)
|
|
537
576
|
this.authMethod = authMethod;
|
|
538
577
|
// Build headers based on auth method and subscription tier
|
|
@@ -570,6 +609,9 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
570
609
|
// The claude-code-20250219 beta header triggers "credential only for Claude Code" error
|
|
571
610
|
client = new Anthropic({
|
|
572
611
|
apiKey: "oauth-authenticated", // Placeholder, actual auth is in fetch wrapper
|
|
612
|
+
// The same gateway the API-key branch honours: without it, OAuth
|
|
613
|
+
// credentials that also name a base URL would still reach the vendor.
|
|
614
|
+
...(this.baseURL && { baseURL: this.baseURL }),
|
|
573
615
|
// Note: No headers passed - fetch wrapper sets oauth-2025-04-20 beta header
|
|
574
616
|
// Limit capture wraps the OAuth fetch so subscription quota headers
|
|
575
617
|
// (anthropic-ratelimit-unified-*) are recorded on every request —
|
|
@@ -599,33 +641,10 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
599
641
|
else {
|
|
600
642
|
// Traditional API key authentication
|
|
601
643
|
const apiKeyToUse = credentials?.apiKey ?? config?.apiKey ?? getAnthropicApiKey();
|
|
602
|
-
// The official Anthropic SDK builds `${baseURL}/v1/messages` itself, so
|
|
603
|
-
// a version-suffixed base URL — the form the previous @ai-sdk/anthropic
|
|
604
|
-
// implementation REQUIRED (`https://api.anthropic.com/v1`) — would
|
|
605
|
-
// double up as `/v1/v1/messages`. Normalize the inverse way now: strip
|
|
606
|
-
// a trailing `/vN` segment when present so both historical forms of
|
|
607
|
-
// ANTHROPIC_BASE_URL keep working.
|
|
608
|
-
const normalizedBaseURL = (() => {
|
|
609
|
-
const raw = process.env.ANTHROPIC_BASE_URL;
|
|
610
|
-
if (!raw) {
|
|
611
|
-
return undefined;
|
|
612
|
-
}
|
|
613
|
-
const trimmed = raw.replace(/\/+$/, "");
|
|
614
|
-
const stripped = trimmed.replace(/\/v\d+$/, "");
|
|
615
|
-
if (stripped !== trimmed) {
|
|
616
|
-
logger.debug("[AnthropicProvider] Stripping the version suffix from " +
|
|
617
|
-
"ANTHROPIC_BASE_URL — the official Anthropic SDK appends /v1 " +
|
|
618
|
-
"to the base URL itself.", {
|
|
619
|
-
baseURL: redactUrlCredentials(raw),
|
|
620
|
-
rewrittenTo: redactUrlCredentials(stripped),
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
return stripped;
|
|
624
|
-
})();
|
|
625
644
|
client = new Anthropic({
|
|
626
645
|
apiKey: apiKeyToUse,
|
|
627
646
|
defaultHeaders: headers,
|
|
628
|
-
...(
|
|
647
|
+
...(this.baseURL && { baseURL: this.baseURL }),
|
|
629
648
|
// Same capture as the OAuth branch: works for direct API-key traffic
|
|
630
649
|
// (legacy requests/tokens counters) and for the NeuroLink Claude proxy
|
|
631
650
|
// (verbatim unified quota plus x-neurolink-* account/pool state).
|
|
@@ -676,10 +695,11 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
676
695
|
*/
|
|
677
696
|
getAuthHeaders() {
|
|
678
697
|
const headers = {};
|
|
679
|
-
// When routing through proxy (
|
|
680
|
-
// OAuth beta set so the proxy forwards
|
|
681
|
-
// Anthropic treats the request with tighter
|
|
682
|
-
|
|
698
|
+
// When routing through a proxy (a base URL is set — per instance or
|
|
699
|
+
// ANTHROPIC_BASE_URL), use the full OAuth beta set so the proxy forwards
|
|
700
|
+
// them upstream. Without these, Anthropic treats the request with tighter
|
|
701
|
+
// non-subscription rate limits.
|
|
702
|
+
const usingProxy = this.baseURL !== undefined;
|
|
683
703
|
if (this.enableBetaFeatures) {
|
|
684
704
|
if (usingProxy) {
|
|
685
705
|
// The 1M-context beta requires a plan upgrade on most accounts;
|
|
@@ -705,9 +725,9 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
705
725
|
}
|
|
706
726
|
}
|
|
707
727
|
if (usingProxy) {
|
|
708
|
-
// WAFs in front of
|
|
709
|
-
//
|
|
710
|
-
//
|
|
728
|
+
// WAFs in front of Anthropic proxies commonly block the bare SDK UA
|
|
729
|
+
// ("Anthropic/JS x.y.z"); send the claude-cli UA the OAuth path already
|
|
730
|
+
// uses. Direct-to-Anthropic traffic keeps the honest SDK UA.
|
|
711
731
|
headers["User-Agent"] = CLAUDE_CLI_USER_AGENT;
|
|
712
732
|
}
|
|
713
733
|
// Add subscription-specific headers if applicable
|
|
@@ -736,8 +756,8 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
736
756
|
// Proxy mode: bypass tier validation entirely — the proxy handles model
|
|
737
757
|
// access. Log at debug level so users can tell why an unknown model name
|
|
738
758
|
// "validated" when their proxy may not actually expose it.
|
|
739
|
-
if (
|
|
740
|
-
logger.debug("[validateModelAccess] Bypassing tier check (
|
|
759
|
+
if (this.baseURL !== undefined) {
|
|
760
|
+
logger.debug("[validateModelAccess] Bypassing tier check (a base URL is set — the proxy enforces access)", { model });
|
|
741
761
|
return true;
|
|
742
762
|
}
|
|
743
763
|
// API tier has access to all models
|
|
@@ -105,9 +105,16 @@ export type NeurolinkCredentials = {
|
|
|
105
105
|
apiKey?: string;
|
|
106
106
|
baseURL?: string;
|
|
107
107
|
};
|
|
108
|
+
/**
|
|
109
|
+
* Anthropic. `baseURL` points the official SDK client at a gateway or proxy
|
|
110
|
+
* instead of `api.anthropic.com` (with or without a trailing `/v1`); it
|
|
111
|
+
* takes precedence over `ANTHROPIC_BASE_URL`, exactly as `apiKey` does over
|
|
112
|
+
* `ANTHROPIC_API_KEY`.
|
|
113
|
+
*/
|
|
108
114
|
anthropic?: {
|
|
109
115
|
apiKey?: string;
|
|
110
116
|
oauthToken?: string;
|
|
117
|
+
baseURL?: string;
|
|
111
118
|
};
|
|
112
119
|
googleAiStudio?: {
|
|
113
120
|
apiKey?: string;
|
|
@@ -4131,15 +4131,15 @@
|
|
|
4131
4131
|
{"objectID":"1d8625a67cba7bc640e454fe15f76d86e2be4fbe79e9496fc085e5a6df496086","title":"Future Enhancements","url":"/docs/features/pdf-support#future-enhancements","content":"Planned features for PDF support:\nOCR Integration: Extract text from scanned PDFs\nPage Selection: Analyze specific pages only\nPDF Generation: Create PDFs from AI responses\nForm Filling: Extract and populate PDF forms","hierarchy":{"lvl0":"Features","lvl1":"PDF File Support","lvl2":"Future Enhancements","lvl3":""}},
|
|
4132
4132
|
{"objectID":"20bb5119cb74199a04bebd17c621d8c6a0438c0833f12103b9f3914c5f026ceb","title":"Feedback and Support","url":"/docs/features/pdf-support#feedback-and-support","content":"Found a bug or have a feature request? Please:\nCheck existing issues on GitHub\nCreate a new issue with:\nProvider used\nPDF file details (size, pages)\nError message or unexpected behavior\nSample code (if possible)","hierarchy":{"lvl0":"Features","lvl1":"PDF File Support","lvl2":"Feedback and Support","lvl3":""}},
|
|
4133
4133
|
{"objectID":"7c47c75b9023d438078ad3ed696c167cb9b5beaa369fad844635f7f32cce74a5","title":"Version 9.2.0 (Current)","url":"/docs/features/pdf-support#version-920-current","content":"✅ Initial PDF support for Vertex AI, Anthropic, Bedrock, AI Studio\n✅ Auto-detection via --file flag\n✅ Multiple PDF processing\n✅ Size and page limit validation\n✅ Comprehensive error messages\n✅ CLI and SDK integration\n✅ Streaming support\n✅ Mixed multimodal inputs (PDF + CSV + images)\n\nNext: Multimodal Chat Guide | CSV Support","hierarchy":{"lvl0":"Features","lvl1":"PDF File Support","lvl2":"Version 9.2.0 (Current)","lvl3":""}},
|
|
4134
|
-
{"objectID":"2a46dad649fcc5c7b389d9db519211899183703302b4127f0a4a2285018e1362","title":"Per-Request Credentials","url":"/docs/features/per-request-credentials","content":"Per-Request Credentials\n\nStatus: Stable | Availability: SDK only\n\nOverview\n\nNeuroLink allows provider credentials to be supplied at two levels below the environment-variable default: on the NeuroLink constructor (instance level) and on individual generate() / stream() calls (per-call level). Credentials are resolved in the following order of precedence:\n\nThis enables multi-tenant architectures where different users or tenants supply their own provider API keys (bring-your-own-key, BYOK), without requiring separate NeuroLink instances per user or touching the process environment.\n\nTypical use cases:\nMulti-tenant SaaS — each API request carries the calling user's provider key; no shared key leakage between tenants\nBYOK products — end users paste their OpenAI / Anthropic keys in settings; you forward them to NeuroLink per call\nTesting and CI — inject credentials programmatically without setting environment variables\nProvider switching — override only the active provider's credentials while leaving others to fall through to env vars\n\nQuick Start\n\nInstance-Level vs Per-Call\n\nInstance-Level Credentials\n\nSet credentials in the NeuroLink constructor. These apply as the default for every generate() and stream() call made on that instance. Useful when serving a single tenant or when you have a known key for the duration of the instance lifecycle.\n\nPer-Call Credentials\n\nSet credentials directly on generate() or stream(). These override the instance-level credentials for that single call only. Only the providers you explicitly set are overridden — others continue falling through to instance credentials and then environment variables.\n\nPrecedence Rules\n\n| Level | Scope | Set on |\n| ----------- | --------------------- | ----------------------------------------------------------------------------------- |\n| Per-call | Single request only | generate({ credentials }), stream({ credentials }) or decide({ credentials }) |\n| Instance | All calls on instance | new NeuroLink({ credentials }) |\n| Environment | Process-wide fallback | OPENAI_API_KEY, ANTHROPIC_API_KEY, … |\n\nUnset providers at any level fall through to the next. You never need to repeat a credential at the per-call level if the instance default is correct.\n\nProvider Credential Reference\n\nAll fields are optional — omit any field you want to fall through to a lower-precedence level.\n\n| Provider | Key | Fields |\n| -------------------- | ------------------- | ---------------------------------------------------------------------------------------------------- |\n| OpenAI | openai | apiKey, baseURL |\n| Anthropic | anthropic | apiKey, oauthToken
|
|
4134
|
+
{"objectID":"2a46dad649fcc5c7b389d9db519211899183703302b4127f0a4a2285018e1362","title":"Per-Request Credentials","url":"/docs/features/per-request-credentials","content":"Per-Request Credentials\n\nStatus: Stable | Availability: SDK only\n\nOverview\n\nNeuroLink allows provider credentials to be supplied at two levels below the environment-variable default: on the NeuroLink constructor (instance level) and on individual generate() / stream() calls (per-call level). Credentials are resolved in the following order of precedence:\n\nThis enables multi-tenant architectures where different users or tenants supply their own provider API keys (bring-your-own-key, BYOK), without requiring separate NeuroLink instances per user or touching the process environment.\n\nTypical use cases:\nMulti-tenant SaaS — each API request carries the calling user's provider key; no shared key leakage between tenants\nBYOK products — end users paste their OpenAI / Anthropic keys in settings; you forward them to NeuroLink per call\nTesting and CI — inject credentials programmatically without setting environment variables\nProvider switching — override only the active provider's credentials while leaving others to fall through to env vars\n\nQuick Start\n\nInstance-Level vs Per-Call\n\nInstance-Level Credentials\n\nSet credentials in the NeuroLink constructor. These apply as the default for every generate() and stream() call made on that instance. Useful when serving a single tenant or when you have a known key for the duration of the instance lifecycle.\n\nPer-Call Credentials\n\nSet credentials directly on generate() or stream(). These override the instance-level credentials for that single call only. Only the providers you explicitly set are overridden — others continue falling through to instance credentials and then environment variables.\n\nPrecedence Rules\n\n| Level | Scope | Set on |\n| ----------- | --------------------- | ----------------------------------------------------------------------------------- |\n| Per-call | Single request only | generate({ credentials }), stream({ credentials }) or decide({ credentials }) |\n| Instance | All calls on instance | new NeuroLink({ credentials }) |\n| Environment | Process-wide fallback | OPENAI_API_KEY, ANTHROPIC_API_KEY, … |\n\nUnset providers at any level fall through to the next. You never need to repeat a credential at the per-call level if the instance default is correct.\n\nProvider Credential Reference\n\nAll fields are optional — omit any field you want to fall through to a lower-precedence level.\n\n| Provider | Key | Fields |\n| -------------------- | ------------------- | ---------------------------------------------------------------------------------------------------- |\n| OpenAI | openai | apiKey, baseURL |\n| Anthropic | anthropic | apiKey, oauthToken, baseURL |\n| Google AI Studio | googleAiStudio | apiKey, baseURL |\n| Google Vertex AI | vertex | projectId, location, apiKey (Express Mode), serviceAccountKey, clientEmail, privateKey |\n| Amazon Bedrock | bedrock | accessKeyId, secretAccessKey, sessionToken, region |\n| Amazon SageMaker | sagemaker | accessKeyId, secretAccessKey, sessionToken, region, endpoint |\n| Azure OpenAI | azure | apiKey, resourceName, deploymentName, apiVersion |\n| Mistral | mistral | apiKey |\n| Hugging Face | huggingFace | apiKey, baseURL |\n| OpenRouter | openrouter | apiKey, baseURL |\n| LiteLLM | litellm | apiKey, baseURL |\n| OpenAI-Compatible | openaiCompatible | apiKey, baseURL |\n| Cerebras | cerebras | apiKey, baseURL |\n| SambaNova | sambanova | apiKey, baseURL |\n| Ollama | ollama | baseURL ","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"","lvl3":""}},
|
|
4135
4135
|
{"objectID":"12291afcfaaf4af65b01b07e93a9eac08280ff7c61394f6051a86c1b152a7b4a","title":"Per-Request Credentials","url":"/docs/features/per-request-credentials#per-request-credentials","content":"Status: Stable | Availability: SDK only","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Per-Request Credentials","lvl3":""}},
|
|
4136
4136
|
{"objectID":"6c6756b0806344240b3c86d6b0063587db50f2c4ccf936a32e87d4377b77014c","title":"Overview","url":"/docs/features/per-request-credentials#overview","content":"NeuroLink allows provider credentials to be supplied at two levels below the environment-variable default: on the NeuroLink constructor (instance level) and on individual generate() / stream() calls (per-call level). Credentials are resolved in the following order of precedence:\n\nThis enables multi-tenant architectures where different users or tenants supply their own provider API keys (bring-your-own-key, BYOK), without requiring separate NeuroLink instances per user or touching the process environment.\n\nTypical use cases:\nMulti-tenant SaaS — each API request carries the calling user's provider key; no shared key leakage between tenants\nBYOK products — end users paste their OpenAI / Anthropic keys in settings; you forward them to NeuroLink per call\nTesting and CI — inject credentials programmatically without setting environment variables\nProvider switching — override only the active provider's credentials while leaving others to fall through to env vars","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Overview","lvl3":""}},
|
|
4137
4137
|
{"objectID":"d4e86918319aa78b4e4461dbf29a60ebe90935e74fc70617f59bf524ba3e1eae","title":"Instance-Level Credentials","url":"/docs/features/per-request-credentials#instance-level-credentials","content":"Set credentials in the NeuroLink constructor. These apply as the default for every generate() and stream() call made on that instance. Useful when serving a single tenant or when you have a known key for the duration of the instance lifecycle.","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Instance-Level Credentials","lvl3":""}},
|
|
4138
4138
|
{"objectID":"250b1dd11e018f5f252b27ce408e3dade21eff1cf26eed4aaf81126fad6ab691","title":"Per-Call Credentials","url":"/docs/features/per-request-credentials#per-call-credentials","content":"Set credentials directly on generate() or stream(). These override the instance-level credentials for that single call only. Only the providers you explicitly set are overridden — others continue falling through to instance credentials and then environment variables.","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Per-Call Credentials","lvl3":""}},
|
|
4139
4139
|
{"objectID":"4166cbaf6e6263ac98e24d7ede9950b44aade18e787b57e71138d2fc2deaaa07","title":"Precedence Rules","url":"/docs/features/per-request-credentials#precedence-rules","content":"| Level | Scope | Set on |\n| ----------- | --------------------- | ----------------------------------------------------------------------------------- |\n| Per-call | Single request only | generate({ credentials }), stream({ credentials }) or decide({ credentials }) |\n| Instance | All calls on instance | new NeuroLink({ credentials }) |\n| Environment | Process-wide fallback | OPENAI_API_KEY, ANTHROPIC_API_KEY, … |\n\nUnset providers at any level fall through to the next. You never need to repeat a credential at the per-call level if the instance default is correct.","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Precedence Rules","lvl3":""}},
|
|
4140
|
-
{"objectID":"b739fcf7819dd6f055ebe3bcdb161ff839067dc172235f9d0072f9cf79d7bcd3","title":"Provider Credential Reference","url":"/docs/features/per-request-credentials#provider-credential-reference","content":"All fields are optional — omit any field you want to fall through to a lower-precedence level.\n\n| Provider | Key | Fields |\n| -------------------- | ------------------- | ---------------------------------------------------------------------------------------------------- |\n| OpenAI | openai | apiKey, baseURL |\n| Anthropic | anthropic | apiKey, oauthToken
|
|
4140
|
+
{"objectID":"b739fcf7819dd6f055ebe3bcdb161ff839067dc172235f9d0072f9cf79d7bcd3","title":"Provider Credential Reference","url":"/docs/features/per-request-credentials#provider-credential-reference","content":"All fields are optional — omit any field you want to fall through to a lower-precedence level.\n\n| Provider | Key | Fields |\n| -------------------- | ------------------- | ---------------------------------------------------------------------------------------------------- |\n| OpenAI | openai | apiKey, baseURL |\n| Anthropic | anthropic | apiKey, oauthToken, baseURL |\n| Google AI Studio | googleAiStudio | apiKey, baseURL |\n| Google Vertex AI | vertex | projectId, location, apiKey (Express Mode), serviceAccountKey, clientEmail, privateKey |\n| Amazon Bedrock | bedrock | accessKeyId, secretAccessKey, sessionToken, region |\n| Amazon SageMaker | sagemaker | accessKeyId, secretAccessKey, sessionToken, region, endpoint |\n| Azure OpenAI | azure | apiKey, resourceName, deploymentName, apiVersion |\n| Mistral | mistral | apiKey |\n| Hugging Face | huggingFace | apiKey, baseURL |\n| OpenRouter | openrouter | apiKey, baseURL |\n| LiteLLM | litellm | apiKey, baseURL |\n| OpenAI-Compatible | openaiCompatible","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Provider Credential Reference","lvl3":""}},
|
|
4141
4141
|
{"objectID":"575e2e50c5fd00e53fce66deee556264f3df8962e2188ac446e6e7d4ad29b2ed","title":"OpenAI","url":"/docs/features/per-request-credentials#openai","content":"Custom base URL for OpenAI-compatible proxies:","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"OpenAI","lvl3":""}},
|
|
4142
|
-
{"objectID":"499e7c1d012d337ad54e06db35770d5b3471afb0f9e3f471564642e8ba7e5c6b","title":"Anthropic","url":"/docs/features/per-request-credentials#anthropic","content":"OAuth token (Anthropic Claude subscription):","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Anthropic","lvl3":""}},
|
|
4142
|
+
{"objectID":"499e7c1d012d337ad54e06db35770d5b3471afb0f9e3f471564642e8ba7e5c6b","title":"Anthropic","url":"/docs/features/per-request-credentials#anthropic","content":"OAuth token (Anthropic Claude subscription):\n\nA gateway or proxy in front of Anthropic (baseURL wins over ANTHROPIC_BASE_URL, with or without a trailing /v1; a gateway that does its own auth accepts any apiKey):","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Anthropic","lvl3":""}},
|
|
4143
4143
|
{"objectID":"3f5ea871d2750f36fca227c33f109de53f5d0bc4c184ea956d0b8c3736babe29","title":"Vertex AI — Express Mode","url":"/docs/features/per-request-credentials#vertex-ai-express-mode","content":"Express Mode uses a simple API key instead of service-account credentials, making it suitable for per-request BYOK flows:\n\nFull service-account credentials (server-side only — keep private keys out of client code):","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Vertex AI — Express Mode","lvl3":""}},
|
|
4144
4144
|
{"objectID":"af5efdaa7ba1811d537c1c7aca8a0143cd8496be1e9db86526d34003cf427dbb","title":"Streaming with Credentials","url":"/docs/features/per-request-credentials#streaming-with-credentials","content":"credentials works identically on stream(). Note that neurolink.stream()\nreturns a StreamResult wrapper — iterate over its .stream property:","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Streaming with Credentials","lvl3":""}},
|
|
4145
4145
|
{"objectID":"ea70e911923bd079e70af1c36bda14c16bdd9bfcec49f236a9d0550d6602502a","title":"Multi-Tenant Request Handler","url":"/docs/features/per-request-credentials#multi-tenant-request-handler","content":"A typical pattern for a multi-tenant API endpoint. Note the provider-name →\ncredential-key mapping: the registered provider names (google-ai,\nopenai-compatible, huggingface) differ from their NeurolinkCredentials\nslot keys (googleAiStudio, openaiCompatible, huggingFace), so map\nexplicitly to avoid runtime surprises.\n\nNote: This example assumes API-key authentication. Providers like Bedrock\n(which use accessKeyId/secretAccessKey) and Ollama (which use baseURL)\nrequire different credential shapes — see the Provider Credential Reference above.","hierarchy":{"lvl0":"Features","lvl1":"Per-Request Credentials","lvl2":"Multi-Tenant Request Handler","lvl3":""}},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "12.47.
|
|
3
|
+
"version": "12.47.3",
|
|
4
4
|
"packageManager": "pnpm@10.15.1",
|
|
5
5
|
"description": "The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002/call) for routing, tool selection and context budgeting. MCP-native (4 transports), voice TTS/STT/realtime, RAG, agents, memory, compaction, 9 observability exporters. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · TypeSafe Jev and more.",
|
|
6
6
|
"author": {
|