@juspay/neurolink 13.8.17 → 13.8.19
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 +5 -2
- package/README.md +1 -1
- package/dist/action/actionExecutor.d.ts +33 -3
- package/dist/action/actionExecutor.js +71 -15
- package/dist/action/actionInputs.js +4 -1
- package/dist/action/cliVersion.d.ts +25 -0
- package/dist/action/cliVersion.js +26 -0
- package/dist/action/index.d.ts +2 -1
- package/dist/action/index.js +2 -1
- package/dist/adapters/video/directorPipeline.js +46 -36
- package/dist/adapters/video/ffmpegAdapter.d.ts +17 -0
- package/dist/adapters/video/ffmpegAdapter.js +32 -5
- package/dist/adapters/video/frameExtractor.js +1 -1
- package/dist/adapters/video/videoMerger.js +5 -2
- package/dist/agent/arithmeticEvaluator.d.ts +32 -0
- package/dist/agent/arithmeticEvaluator.js +349 -0
- package/dist/agent/directTools.d.ts +6 -18
- package/dist/agent/directTools.js +17 -56
- package/dist/artifacts/artifactStore.d.ts +22 -1
- package/dist/artifacts/artifactStore.js +66 -6
- package/dist/auth/anthropicOAuth.d.ts +26 -1
- package/dist/auth/anthropicOAuth.js +81 -5
- package/dist/auth/secureFiles.d.ts +37 -0
- package/dist/auth/secureFiles.js +95 -0
- package/dist/auth/tokenStore.d.ts +43 -6
- package/dist/auth/tokenStore.js +260 -79
- package/dist/avatar/providers/DIDAvatar.js +49 -45
- package/dist/avatar/providers/ReplicateAvatar.js +33 -40
- package/dist/browser/neurolink.min.js +485 -558
- package/dist/cli/commands/auth.js +112 -70
- package/dist/cli/commands/proxy.d.ts +4 -0
- package/dist/cli/commands/proxy.js +128 -13
- package/dist/cli/commands/serve.d.ts +10 -1
- package/dist/cli/commands/serve.js +98 -17
- package/dist/cli/commands/server.js +17 -5
- package/dist/cli/index.js +146 -5
- package/dist/cli/loop/optionsSchema.d.ts +1 -1
- package/dist/cli/utils/envManager.js +17 -3
- package/dist/cli/utils/serverUtils.d.ts +39 -3
- package/dist/cli/utils/serverUtils.js +63 -6
- package/dist/core/baseProvider.js +7 -1
- package/dist/core/modules/MessageBuilder.js +5 -0
- package/dist/core/modules/ToolsManager.d.ts +46 -1
- package/dist/core/modules/ToolsManager.js +190 -43
- package/dist/files/fileReferenceRegistry.d.ts +2 -23
- package/dist/files/fileReferenceRegistry.js +55 -5
- package/dist/hitl/hitlManager.js +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +6 -1
- package/dist/mcp/auth/tokenStorage.d.ts +7 -0
- package/dist/mcp/auth/tokenStorage.js +23 -4
- package/dist/mcp/externalServerManager.d.ts +13 -3
- package/dist/mcp/externalServerManager.js +154 -136
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/mcpClientFactory.d.ts +14 -0
- package/dist/mcp/mcpClientFactory.js +70 -7
- package/dist/mcp/projectConfigTrust.d.ts +72 -0
- package/dist/mcp/projectConfigTrust.js +237 -0
- package/dist/mcp/transportUrlPolicy.d.ts +39 -0
- package/dist/mcp/transportUrlPolicy.js +172 -0
- package/dist/music/providers/BeatovenMusic.js +35 -46
- package/dist/music/providers/ReplicateMusic.js +33 -40
- package/dist/neurolink.d.ts +16 -1
- package/dist/neurolink.js +64 -11
- package/dist/processors/archive/ArchiveProcessor.js +15 -1
- package/dist/processors/archive/zipEntryIndex.d.ts +22 -0
- package/dist/processors/archive/zipEntryIndex.js +33 -0
- package/dist/processors/base/BaseFileProcessor.d.ts +9 -21
- package/dist/processors/base/BaseFileProcessor.js +40 -111
- package/dist/processors/data/YamlProcessor.d.ts +13 -1
- package/dist/processors/data/YamlProcessor.js +93 -2
- package/dist/processors/document/OpenDocumentProcessor.js +7 -2
- package/dist/processors/document/PptxProcessor.js +12 -7
- package/dist/processors/media/VideoProcessor.js +93 -15
- package/dist/providers/openaiChatCompletionsClient.js +12 -3
- package/dist/proxy/accountLedger.js +6 -8
- package/dist/proxy/geminiFormat.d.ts +3 -11
- package/dist/proxy/geminiFormat.js +11 -2
- package/dist/proxy/inboundAuth.d.ts +89 -0
- package/dist/proxy/inboundAuth.js +219 -0
- package/dist/proxy/openaiFormat.d.ts +3 -9
- package/dist/proxy/openaiFormat.js +21 -15
- package/dist/proxy/proxyTranslationEngine.d.ts +2 -6
- package/dist/proxy/proxyTranslationEngine.js +25 -14
- package/dist/proxy/routingPolicy.d.ts +3 -1
- package/dist/proxy/routingPolicy.js +7 -8
- package/dist/proxy/tokenRefresh.d.ts +6 -0
- package/dist/proxy/tokenRefresh.js +13 -1
- package/dist/proxy/updateState.js +4 -4
- package/dist/rag/document/loaders.d.ts +0 -6
- package/dist/rag/document/loaders.js +16 -10
- package/dist/rag/ragIntegration.d.ts +2 -2
- package/dist/rag/ragIntegration.js +35 -10
- package/dist/rag/retrieval/vectorQueryTool.d.ts +7 -0
- package/dist/rag/retrieval/vectorQueryTool.js +54 -17
- package/dist/server/abstract/baseServerAdapter.d.ts +43 -0
- package/dist/server/abstract/baseServerAdapter.js +119 -6
- package/dist/server/adapters/expressAdapter.d.ts +3 -0
- package/dist/server/adapters/expressAdapter.js +78 -6
- package/dist/server/adapters/fastifyAdapter.d.ts +3 -0
- package/dist/server/adapters/fastifyAdapter.js +165 -70
- package/dist/server/adapters/honoAdapter.d.ts +9 -1
- package/dist/server/adapters/honoAdapter.js +99 -21
- package/dist/server/adapters/koaAdapter.d.ts +1 -0
- package/dist/server/adapters/koaAdapter.js +153 -74
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +4 -0
- package/dist/server/middleware/auth.js +6 -2
- package/dist/server/middleware/cache.js +6 -1
- package/dist/server/middleware/rateLimit.js +29 -4
- package/dist/server/routes/agentRoutes.js +24 -11
- package/dist/server/routes/claudeProxyRoutes.d.ts +1 -0
- package/dist/server/routes/claudeProxyRoutes.js +273 -84
- package/dist/server/routes/codexProxyRoutes.d.ts +2 -2
- package/dist/server/routes/codexProxyRoutes.js +125 -40
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +35 -4
- package/dist/server/routes/mcpRoutes.d.ts +6 -2
- package/dist/server/routes/mcpRoutes.js +21 -7
- package/dist/server/routes/memoryRoutes.js +7 -6
- package/dist/server/routes/toolRoutes.d.ts +12 -2
- package/dist/server/routes/toolRoutes.js +33 -3
- package/dist/server/routes/transcribeRoutes.js +60 -13
- package/dist/server/utils/clientAddress.d.ts +23 -0
- package/dist/server/utils/clientAddress.js +65 -0
- package/dist/server/utils/clientError.d.ts +35 -0
- package/dist/server/utils/clientError.js +129 -0
- package/dist/server/utils/pathMatch.d.ts +21 -0
- package/dist/server/utils/pathMatch.js +41 -0
- package/dist/server/utils/validation.d.ts +9 -0
- package/dist/server/utils/validation.js +9 -0
- package/dist/server/websocket/WebSocketHandler.js +22 -3
- package/dist/server/websocket/frameQueue.d.ts +19 -0
- package/dist/server/websocket/frameQueue.js +41 -3
- package/dist/server/websocket/transcribeWebSocket.d.ts +8 -1
- package/dist/server/websocket/transcribeWebSocket.js +223 -34
- package/dist/skills/skillStores.js +5 -0
- package/dist/tasks/store/fileTaskStore.d.ts +2 -0
- package/dist/tasks/store/fileTaskStore.js +11 -4
- package/dist/types/attachments.d.ts +117 -0
- package/dist/types/attachments.js +15 -0
- package/dist/types/auth.d.ts +6 -0
- package/dist/types/cli.d.ts +4 -0
- package/dist/types/config.d.ts +56 -0
- package/dist/types/file.d.ts +8 -0
- package/dist/types/hitl.d.ts +8 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/mcp.d.ts +98 -0
- package/dist/types/multimodal.js +0 -41
- package/dist/types/openaiCompatible.d.ts +1 -1
- package/dist/types/processor.d.ts +14 -1
- package/dist/types/proxy.d.ts +71 -16
- package/dist/types/proxyClient.d.ts +2 -0
- package/dist/types/rag.d.ts +9 -0
- package/dist/types/safeFetch.d.ts +40 -0
- package/dist/types/server.d.ts +206 -10
- package/dist/types/tools.d.ts +57 -0
- package/dist/types/transcribe.d.ts +6 -0
- package/dist/utils/attachmentPolicy.d.ts +89 -0
- package/dist/utils/attachmentPolicy.js +327 -0
- package/dist/utils/dotenvBootstrap.d.ts +48 -19
- package/dist/utils/dotenvBootstrap.js +172 -31
- package/dist/utils/fileDetector.js +115 -65
- package/dist/utils/json/coerce.js +11 -1
- package/dist/utils/logSanitize.d.ts +5 -0
- package/dist/utils/logSanitize.js +8 -0
- package/dist/utils/logger.js +73 -1
- package/dist/utils/messageBuilder.d.ts +2 -2
- package/dist/utils/messageBuilder.js +118 -105
- package/dist/utils/multimodalOptionsBuilder.d.ts +1 -0
- package/dist/utils/multimodalOptionsBuilder.js +2 -0
- package/dist/utils/redis.d.ts +12 -0
- package/dist/utils/redis.js +72 -0
- package/dist/utils/retryAfter.d.ts +32 -0
- package/dist/utils/retryAfter.js +135 -11
- package/dist/utils/safeFetch.d.ts +22 -1
- package/dist/utils/safeFetch.js +132 -38
- package/dist/utils/safeStoreId.d.ts +19 -0
- package/dist/utils/safeStoreId.js +29 -0
- package/dist/utils/schemaConversion.d.ts +30 -3
- package/dist/utils/schemaConversion.js +457 -84
- package/dist/utils/sizeGuard.js +2 -2
- package/dist/utils/ssrfGuard.d.ts +3 -3
- package/dist/utils/ssrfGuard.js +71 -39
- package/dist/voice/eval/sttEvalStore.d.ts +26 -3
- package/dist/voice/eval/sttEvalStore.js +77 -12
- package/dist/voice/livekit/agentDefinition.d.ts +18 -0
- package/dist/voice/livekit/agentDefinition.js +22 -0
- package/dist/voice/livekit/realtimeMcpTools.d.ts +1 -1
- package/dist/voice/livekit/realtimeMcpTools.js +8 -7
- package/dist/voice/livekit/realtimeVoiceAgent.d.ts +2 -4
- package/dist/voice/livekit/realtimeVoiceAgent.js +18 -7
- package/dist/voice/livekit/voiceAgent.d.ts +2 -2
- package/dist/voice/livekit/voiceAgent.js +2 -1
- package/dist/voice/livekit/xaiSessionWatch.d.ts +0 -5
- package/dist/voice/livekit/xaiSessionWatch.js +30 -0
- package/dist/voice/providers/GeminiLive.js +21 -6
- package/dist/voice/providers/GoogleSTT.js +8 -5
- package/dist/voice/transcribe.d.ts +2 -2
- package/dist/voice/transcribe.js +34 -18
- package/dist/voice/whistle/audio.js +11 -5
- package/dist/workflow/workflows/adaptiveWorkflow.d.ts +2 -2
- package/dist/workflow/workflows/adaptiveWorkflow.js +10 -10
- package/dist/workflow/workflows/consensusWorkflow.d.ts +4 -4
- package/dist/workflow/workflows/consensusWorkflow.js +12 -12
- package/dist/workflow/workflows/fallbackWorkflow.d.ts +3 -3
- package/dist/workflow/workflows/fallbackWorkflow.js +7 -7
- package/dist/workflow/workflows/multiJudgeWorkflow.d.ts +7 -7
- package/dist/workflow/workflows/multiJudgeWorkflow.js +31 -31
- package/docs-site/static/search-index.json +74 -52
- package/package.json +173 -156
- package/scripts/observability/import-openobserve-dashboard.mjs +11 -3
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Rate Limiting Middleware
|
|
3
3
|
* Provides configurable rate limiting for server adapters
|
|
4
4
|
*/
|
|
5
|
+
import { logger } from "../../utils/logger.js";
|
|
5
6
|
import { RateLimitError as ServerRateLimitError } from "../errors.js";
|
|
6
7
|
/**
|
|
7
8
|
* In-memory rate limit store
|
|
@@ -86,6 +87,9 @@ export function createRateLimitMiddleware(config) {
|
|
|
86
87
|
excludePaths: skipPaths,
|
|
87
88
|
handler: async (ctx, next) => {
|
|
88
89
|
const key = keyGenerator(ctx);
|
|
90
|
+
if (!key) {
|
|
91
|
+
return next(); // Nothing to attribute the request to: see defaultKeyGenerator.
|
|
92
|
+
}
|
|
89
93
|
const { count, resetAt } = await store.increment(key, windowMs);
|
|
90
94
|
// Set rate limit headers in responseHeaders (adapters read from here)
|
|
91
95
|
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
@@ -107,12 +111,27 @@ export function createRateLimitMiddleware(config) {
|
|
|
107
111
|
};
|
|
108
112
|
}
|
|
109
113
|
/**
|
|
110
|
-
* Default key
|
|
114
|
+
* Default key: the TCP peer the adapter recorded on the context. Never a
|
|
115
|
+
* header, which the client writes: keyed on `X-Forwarded-For`, one shared
|
|
116
|
+
* bucket served every direct client and a rotating header escaped the limit.
|
|
117
|
+
* Behind a reverse proxy, pass a `keyGenerator` that reads the proxy's header
|
|
118
|
+
* (see `resolveClientAddress`). An empty key means "do not count".
|
|
111
119
|
*/
|
|
112
120
|
function defaultKeyGenerator(ctx) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
121
|
+
const address = ctx.remoteAddress?.trim();
|
|
122
|
+
if (!address) {
|
|
123
|
+
warnNoAddressOnce();
|
|
124
|
+
return "";
|
|
125
|
+
}
|
|
126
|
+
return address;
|
|
127
|
+
}
|
|
128
|
+
let warnedNoAddress = false;
|
|
129
|
+
function warnNoAddressOnce() {
|
|
130
|
+
if (warnedNoAddress) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
warnedNoAddress = true;
|
|
134
|
+
logger.alwaysStderr("[rateLimit] A request carried no peer address (ctx.remoteAddress), so the rate limiter let it through uncounted; pass a keyGenerator to limit by another key.");
|
|
116
135
|
}
|
|
117
136
|
/**
|
|
118
137
|
* Create a sliding window rate limiter
|
|
@@ -142,6 +161,9 @@ export function createSlidingWindowRateLimitMiddleware(config) {
|
|
|
142
161
|
excludePaths: skipPaths,
|
|
143
162
|
handler: async (ctx, next) => {
|
|
144
163
|
const key = keyGenerator(ctx);
|
|
164
|
+
if (!key) {
|
|
165
|
+
return next();
|
|
166
|
+
}
|
|
145
167
|
const now = Date.now();
|
|
146
168
|
// Get existing timestamps and filter old ones
|
|
147
169
|
let timestamps = store.get(key) || [];
|
|
@@ -201,6 +223,9 @@ export function createFixedWindowRateLimitMiddleware(config, store) {
|
|
|
201
223
|
excludePaths: skipPaths,
|
|
202
224
|
handler: async (ctx, next) => {
|
|
203
225
|
const key = keyGenerator(ctx);
|
|
226
|
+
if (!key) {
|
|
227
|
+
return next();
|
|
228
|
+
}
|
|
204
229
|
const { count, resetAt } = await rateLimitStore.increment(key, windowMs);
|
|
205
230
|
// Set rate limit headers in responseHeaders (adapters read from here)
|
|
206
231
|
ctx.responseHeaders = ctx.responseHeaders || {};
|
|
@@ -29,7 +29,13 @@ async function resolveRequestToolFilter(ctx, requestedTools) {
|
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
31
|
import { AgentInputError, resolveAgentInput } from "../utils/agentInput.js";
|
|
32
|
+
import { shapeRouteError } from "../utils/clientError.js";
|
|
32
33
|
import { createStreamRedactor } from "../utils/redaction.js";
|
|
34
|
+
/** The route's error response for an exception: a fixed message, the detail logged. */
|
|
35
|
+
function agentFailure(ctx, error, code = "EXECUTION_FAILED") {
|
|
36
|
+
const shaped = shapeRouteError("agentRoutes", ctx.requestId, error);
|
|
37
|
+
return createError(shaped.status === 500 ? code : shaped.code, shaped.message, undefined, ctx.requestId, shaped.status);
|
|
38
|
+
}
|
|
33
39
|
import { AgentExecuteRequestSchema, createErrorResponse as createError, EmbedManyRequestSchema, EmbedRequestSchema, SkillCreateRequestSchema, SkillUpdateRequestSchema, validateRequest, } from "../utils/validation.js";
|
|
34
40
|
/**
|
|
35
41
|
* Resolve the skills manager from the server's NeuroLink instance, or a
|
|
@@ -244,6 +250,9 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
244
250
|
return input;
|
|
245
251
|
}
|
|
246
252
|
const requestToolFilter = await resolveRequestToolFilter(ctx, request.tools);
|
|
253
|
+
// The adapter's signal: the client went away, or the request
|
|
254
|
+
// ran past the server's timeout. Either stops the generation
|
|
255
|
+
// instead of leaving it running for nobody.
|
|
247
256
|
const result = await ctx.neurolink.generate({
|
|
248
257
|
input,
|
|
249
258
|
provider: request.provider,
|
|
@@ -252,6 +261,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
252
261
|
temperature: request.temperature,
|
|
253
262
|
maxTokens: request.maxTokens,
|
|
254
263
|
...(requestToolFilter ? { toolFilter: requestToolFilter } : {}),
|
|
264
|
+
...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}),
|
|
255
265
|
context: callerContext(ctx, request),
|
|
256
266
|
});
|
|
257
267
|
// Map tool calls from SDK format to API format
|
|
@@ -295,6 +305,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
295
305
|
temperature: request.temperature,
|
|
296
306
|
maxTokens: request.maxTokens,
|
|
297
307
|
...(streamToolFilter ? { toolFilter: streamToolFilter } : {}),
|
|
308
|
+
...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}),
|
|
298
309
|
context: callerContext(ctx, request),
|
|
299
310
|
});
|
|
300
311
|
// Create redactor (no-op if redaction is not enabled)
|
|
@@ -377,9 +388,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
377
388
|
});
|
|
378
389
|
}
|
|
379
390
|
catch (error) {
|
|
380
|
-
return
|
|
381
|
-
? error.message
|
|
382
|
-
: "Embedding generation failed", undefined, ctx.requestId);
|
|
391
|
+
return agentFailure(ctx, error);
|
|
383
392
|
}
|
|
384
393
|
},
|
|
385
394
|
description: "Generate embedding for a single text",
|
|
@@ -418,9 +427,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
418
427
|
});
|
|
419
428
|
}
|
|
420
429
|
catch (error) {
|
|
421
|
-
return
|
|
422
|
-
? error.message
|
|
423
|
-
: "Batch embedding generation failed", undefined, ctx.requestId);
|
|
430
|
+
return agentFailure(ctx, error);
|
|
424
431
|
}
|
|
425
432
|
},
|
|
426
433
|
description: "Generate embeddings for multiple texts in a batch",
|
|
@@ -439,7 +446,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
439
446
|
return { skills, count: skills.length };
|
|
440
447
|
}
|
|
441
448
|
catch (error) {
|
|
442
|
-
return
|
|
449
|
+
return agentFailure(ctx, error);
|
|
443
450
|
}
|
|
444
451
|
},
|
|
445
452
|
description: "List active skills (index only — no instructions). Optional ?scopeId= filter.",
|
|
@@ -461,7 +468,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
461
468
|
return skill;
|
|
462
469
|
}
|
|
463
470
|
catch (error) {
|
|
464
|
-
return
|
|
471
|
+
return agentFailure(ctx, error);
|
|
465
472
|
}
|
|
466
473
|
},
|
|
467
474
|
description: "Fetch one skill (by id or exact name) with instructions",
|
|
@@ -490,7 +497,7 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
490
497
|
return result;
|
|
491
498
|
}
|
|
492
499
|
catch (error) {
|
|
493
|
-
return
|
|
500
|
+
return agentFailure(ctx, error);
|
|
494
501
|
}
|
|
495
502
|
},
|
|
496
503
|
description: "Create a skill (routed through the host's onMutationRequest gate when configured)",
|
|
@@ -520,8 +527,12 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
520
527
|
return result;
|
|
521
528
|
}
|
|
522
529
|
catch (error) {
|
|
530
|
+
// "not found" is this server's own wording for an unknown id, so
|
|
531
|
+
// it may be said; anything else is reduced to its category.
|
|
523
532
|
const message = error instanceof Error ? error.message : "Skill update failed";
|
|
524
|
-
return
|
|
533
|
+
return message.includes("not found")
|
|
534
|
+
? createError("NOT_FOUND", `Skill "${ctx.params.id}" not found`, undefined, ctx.requestId)
|
|
535
|
+
: agentFailure(ctx, error);
|
|
525
536
|
}
|
|
526
537
|
},
|
|
527
538
|
description: "Update a skill (patch semantics; version is bumped)",
|
|
@@ -546,7 +557,9 @@ export function createAgentRoutes(basePath = "/api", options) {
|
|
|
546
557
|
}
|
|
547
558
|
catch (error) {
|
|
548
559
|
const message = error instanceof Error ? error.message : "Skill delete failed";
|
|
549
|
-
return
|
|
560
|
+
return message.includes("not found")
|
|
561
|
+
? createError("NOT_FOUND", `Skill "${ctx.params.id}" not found`, undefined, ctx.requestId)
|
|
562
|
+
: agentFailure(ctx, error);
|
|
550
563
|
}
|
|
551
564
|
},
|
|
552
565
|
description: "Soft-delete (deprecate) a skill",
|
|
@@ -385,6 +385,7 @@ declare function handleAnthropicNonOkResponse(args: {
|
|
|
385
385
|
} | null;
|
|
386
386
|
entitlementFailure: AnthropicEntitlementFailure | null;
|
|
387
387
|
allowConfiguredModelFallback?: boolean;
|
|
388
|
+
clientSuppliedBetaForwarded?: boolean;
|
|
388
389
|
}): Promise<AnthropicNonOkResult>;
|
|
389
390
|
/**
|
|
390
391
|
* Detect Anthropic's anti-abuse / request-construction 429.
|