@juspay/neurolink
Version:
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
380 lines (379 loc) • 14.5 kB
TypeScript
/**
* Request Validation Utilities
* Provides Zod schemas and validation helpers for server routes
*/
import { z } from "zod";
import type { ErrorResponse, ServerValidationResult } from "../../types/index.js";
/**
* Agent execute request schema
*/
export declare const AgentExecuteRequestSchema: z.ZodObject<{
input: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
text: z.ZodString;
images: z.ZodOptional<z.ZodArray<z.ZodString>>;
files: z.ZodOptional<z.ZodArray<z.ZodString>>;
}, z.core.$strip>]>;
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
systemPrompt: z.ZodOptional<z.ZodString>;
temperature: z.ZodOptional<z.ZodNumber>;
maxTokens: z.ZodOptional<z.ZodNumber>;
tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
stream: z.ZodOptional<z.ZodBoolean>;
sessionId: z.ZodOptional<z.ZodString>;
userId: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Options a WebSocket `generate`/`stream` message may pass through to
* `neurolink.generate()`/`.stream()`. Deliberately an allowlist, not the full
* `GenerateOptions`/`StreamOptions` shape: the raw client JSON is untrusted,
* and `GenerateOptions.credentials` in particular carries a per-provider
* `baseURL` (see `NeurolinkCredentials`) that would otherwise let any caller
* redirect the server's own outbound request to an arbitrary host (SSRF) or
* swap in their own API key. `z.object` strips unknown keys by default, so
* `credentials` and anything else outside this list never reaches the SDK
* call — the same posture `AgentExecuteRequestSchema` already takes for the
* equivalent HTTP route.
*/
export declare const WebSocketAgentOptionsSchema: z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
systemPrompt: z.ZodOptional<z.ZodString>;
temperature: z.ZodOptional<z.ZodNumber>;
maxTokens: z.ZodOptional<z.ZodNumber>;
maxSteps: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>;
/**
* WebSocket `generate`/`stream` message payload schema.
*/
export declare const WebSocketAgentRequestSchema: z.ZodObject<{
prompt: z.ZodString;
options: z.ZodOptional<z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
systemPrompt: z.ZodOptional<z.ZodString>;
temperature: z.ZodOptional<z.ZodNumber>;
maxTokens: z.ZodOptional<z.ZodNumber>;
maxSteps: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>>;
}, z.core.$strip>;
/**
* Tool execute request schema
*/
export declare const ToolExecuteRequestSchema: z.ZodObject<{
name: z.ZodString;
arguments: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
sessionId: z.ZodOptional<z.ZodString>;
userId: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Tool arguments schema (for direct tool execution)
*/
export declare const ToolArgumentsSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
/**
* Memory session ID parameter schema
*/
export declare const SessionIdParamSchema: z.ZodObject<{
sessionId: z.ZodString;
}, z.core.$strip>;
/**
* MCP server name parameter schema
*/
export declare const ServerNameParamSchema: z.ZodObject<{
name: z.ZodString;
}, z.core.$strip>;
/**
* Tool name parameter schema
*/
export declare const ToolNameParamSchema: z.ZodObject<{
name: z.ZodString;
}, z.core.$strip>;
/**
* Tool search query schema
*/
export declare const ToolSearchQuerySchema: z.ZodObject<{
q: z.ZodOptional<z.ZodString>;
source: z.ZodOptional<z.ZodString>;
limit: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
}, z.core.$strip>;
/**
* Generic ID parameter schema (for session endpoints using :id)
*/
export declare const IdParamSchema: z.ZodObject<{
id: z.ZodString;
}, z.core.$strip>;
/**
* Sessions list query schema (with optional pagination and filtering)
*/
export declare const SessionsListQuerySchema: z.ZodObject<{
userId: z.ZodOptional<z.ZodString>;
limit: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
offset: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
}, z.core.$strip>;
/**
* Session messages query schema (for pagination)
*/
export declare const SessionMessagesQuerySchema: z.ZodObject<{
limit: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
offset: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
}, z.core.$strip>;
/**
* Embed request schema (single text)
*/
export declare const EmbedRequestSchema: z.ZodObject<{
text: z.ZodString;
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Embed many request schema (batch texts)
*/
export declare const EmbedManyRequestSchema: z.ZodObject<{
texts: z.ZodArray<z.ZodString>;
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Skill create request schema
*/
export declare const SkillCreateRequestSchema: z.ZodObject<{
name: z.ZodString;
displayName: z.ZodOptional<z.ZodString>;
description: z.ZodString;
instructions: z.ZodString;
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
scope: z.ZodOptional<z.ZodEnum<{
global: "global";
scoped: "scoped";
}>>;
scopeIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
requestedBy: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Skill update request schema — all fields optional (patch semantics)
*/
export declare const SkillUpdateRequestSchema: z.ZodObject<{
name: z.ZodOptional<z.ZodString>;
displayName: z.ZodOptional<z.ZodOptional<z.ZodString>>;
description: z.ZodOptional<z.ZodString>;
instructions: z.ZodOptional<z.ZodString>;
tags: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
scope: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
global: "global";
scoped: "scoped";
}>>>;
scopeIds: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
requestedBy: z.ZodOptional<z.ZodOptional<z.ZodString>>;
}, z.core.$strip>;
/**
* One dictionary entry for transcription: correct spelling, mis-hearings, meaning.
*/
export declare const TranscribeDictionaryEntrySchema: z.ZodObject<{
term: z.ZodString;
heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
meaning: z.ZodOptional<z.ZodString>;
}, z.core.$strip>;
/**
* Engine and correction settings shared by `POST /agent/transcribe`, the
* OpenAI-compatible route's extension fields and the transcribe WebSocket's
* config frame. Unknown keys (including `credentials`) are stripped: a caller
* cannot swap in its own key or point an engine at another host.
*/
export declare const TranscribeConfigSchema: z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
language: z.ZodOptional<z.ZodString>;
prompt: z.ZodOptional<z.ZodString>;
dictionary: z.ZodOptional<z.ZodArray<z.ZodObject<{
term: z.ZodString;
heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
meaning: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>>;
correction: z.ZodOptional<z.ZodObject<{
enabled: z.ZodOptional<z.ZodBoolean>;
guard: z.ZodOptional<z.ZodEnum<{
decide: "decide";
none: "none";
}>>;
decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>]>>;
transliterate: z.ZodOptional<z.ZodEnum<{
native: "native";
latin: "latin";
}>>;
punctuate: z.ZodOptional<z.ZodBoolean>;
secondOpinion: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>;
context: z.ZodOptional<z.ZodString>;
maxDropRatio: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>>;
fallback: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
when: z.ZodOptional<z.ZodArray<z.ZodEnum<{
error: "error";
empty: "empty";
unsure: "unsure";
}>>>;
}, z.core.$strip>>;
diarization: z.ZodOptional<z.ZodBoolean>;
wordTimestamps: z.ZodOptional<z.ZodBoolean>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>;
/**
* `POST /agent/transcribe` body: the config plus exactly one audio source.
*/
export declare const TranscribeRequestSchema: z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
language: z.ZodOptional<z.ZodString>;
prompt: z.ZodOptional<z.ZodString>;
dictionary: z.ZodOptional<z.ZodArray<z.ZodObject<{
term: z.ZodString;
heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
meaning: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>>;
correction: z.ZodOptional<z.ZodObject<{
enabled: z.ZodOptional<z.ZodBoolean>;
guard: z.ZodOptional<z.ZodEnum<{
decide: "decide";
none: "none";
}>>;
decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>]>>;
transliterate: z.ZodOptional<z.ZodEnum<{
native: "native";
latin: "latin";
}>>;
punctuate: z.ZodOptional<z.ZodBoolean>;
secondOpinion: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>;
context: z.ZodOptional<z.ZodString>;
maxDropRatio: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>>;
fallback: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
when: z.ZodOptional<z.ZodArray<z.ZodEnum<{
error: "error";
empty: "empty";
unsure: "unsure";
}>>>;
}, z.core.$strip>>;
diarization: z.ZodOptional<z.ZodBoolean>;
wordTimestamps: z.ZodOptional<z.ZodBoolean>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
audio: z.ZodOptional<z.ZodString>;
audioUrl: z.ZodOptional<z.ZodString>;
audioPath: z.ZodOptional<z.ZodString>;
format: z.ZodOptional<z.ZodEnum<{
mp3: "mp3";
wav: "wav";
ogg: "ogg";
opus: "opus";
m4a: "m4a";
flac: "flac";
webm: "webm";
mp4: "mp4";
mpeg: "mpeg";
mpga: "mpga";
pcm16: "pcm16";
}>>;
}, z.core.$strip>;
/**
* The transcribe WebSocket's first text frame: the config plus streaming tuning.
*/
export declare const TranscribeStreamConfigSchema: z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
language: z.ZodOptional<z.ZodString>;
prompt: z.ZodOptional<z.ZodString>;
dictionary: z.ZodOptional<z.ZodArray<z.ZodObject<{
term: z.ZodString;
heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
meaning: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>>;
correction: z.ZodOptional<z.ZodObject<{
enabled: z.ZodOptional<z.ZodBoolean>;
guard: z.ZodOptional<z.ZodEnum<{
decide: "decide";
none: "none";
}>>;
decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
provider: z.ZodOptional<z.ZodString>;
model: z.ZodOptional<z.ZodString>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>]>>;
transliterate: z.ZodOptional<z.ZodEnum<{
native: "native";
latin: "latin";
}>>;
punctuate: z.ZodOptional<z.ZodBoolean>;
secondOpinion: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
}, z.core.$strip>>;
context: z.ZodOptional<z.ZodString>;
maxDropRatio: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>>;
fallback: z.ZodOptional<z.ZodObject<{
provider: z.ZodString;
model: z.ZodOptional<z.ZodString>;
when: z.ZodOptional<z.ZodArray<z.ZodEnum<{
error: "error";
empty: "empty";
unsure: "unsure";
}>>>;
}, z.core.$strip>>;
diarization: z.ZodOptional<z.ZodBoolean>;
wordTimestamps: z.ZodOptional<z.ZodBoolean>;
timeoutMs: z.ZodOptional<z.ZodNumber>;
streaming: z.ZodOptional<z.ZodObject<{
mode: z.ZodOptional<z.ZodEnum<{
auto: "auto";
native: "native";
chunked: "chunked";
}>>;
sampleRate: z.ZodOptional<z.ZodNumber>;
endSilenceMs: z.ZodOptional<z.ZodNumber>;
intervalMs: z.ZodOptional<z.ZodNumber>;
softCutSeconds: z.ZodOptional<z.ZodNumber>;
maxUtteranceSeconds: z.ZodOptional<z.ZodNumber>;
onsetRms: z.ZodOptional<z.ZodNumber>;
prerollMs: z.ZodOptional<z.ZodNumber>;
minSpeechMs: z.ZodOptional<z.ZodNumber>;
}, z.core.$strip>>;
}, z.core.$strip>;
/**
* Type guard to check if a value is an ErrorResponse
*/
export declare function isErrorResponse(value: unknown): value is ErrorResponse;
/**
* Create a standardized error response
*/
export declare function createErrorResponse(code: string, message: string, details?: unknown, requestId?: string, httpStatus?: number): ErrorResponse;
/**
* Validate request body against a Zod schema
*/
export declare function validateRequest<T>(schema: z.ZodSchema<T>, data: unknown, requestId?: string): ServerValidationResult<T>;
/**
* Validate query parameters against a Zod schema
*/
export declare function validateQuery<T>(schema: z.ZodSchema<T>, query: Record<string, string>, requestId?: string): ServerValidationResult<T>;
/**
* Validate path parameters against a Zod schema
*/
export declare function validateParams<T>(schema: z.ZodSchema<T>, params: Record<string, string>, requestId?: string): ServerValidationResult<T>;