@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
396 lines (395 loc) • 12.3 kB
JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$comment": "Documentation-grade mirror of src/lib/providers/catalog/schema.ts for editor red-squiggle validation. The zod schema is authoritative \u2014 keep this file in sync by hand when that one changes. This mirror cannot express the zod schema's cross-field refinements (e.g. models.default must be a key of models.catalog, wire's baseURL-XOR-baseURLTemplate rule, errorRules requiring status or pattern); those are enforced only at parse time by parseProviderCatalogJson.",
"title": "NeuroLink Provider Catalog",
"type": "object",
"additionalProperties": false,
"required": [
"id",
"displayName",
"aliases",
"tier",
"wire",
"models",
"capabilities",
"errorRules",
"setup",
"evidence"
],
"properties": {
"$schema": {
"type": "string",
"description": "Editor-only pointer to this file. Accepted and ignored by the parser."
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
},
"displayName": {
"type": "string"
},
"enumTypeName": {
"type": "string",
"pattern": "^[A-Za-z_$][A-Za-z0-9_$]*$",
"description": "Exported <Name>Models enum name override. Default: PascalCase(id) + \"Models\"."
},
"credentialsKey": {
"type": "string",
"description": "Overrides the derived camelCase NeurolinkCredentials key. Required where the derived name would rename a pre-existing public credential field (see together-ai -> \"together\")."
},
"aliases": {
"type": "array",
"items": {
"type": "string"
}
},
"tier": {
"const": 2
},
"wire": {
"type": "object",
"additionalProperties": false,
"properties": {
"baseURL": {
"type": "string"
},
"baseURLTemplate": {
"type": "string"
},
"extraCredentials": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z_$][A-Za-z0-9_$]*$"
},
"maxItems": 1
},
"missingCredentialMessage": {
"type": "string"
},
"apiKeyFallbackEnvVars": {
"type": "array",
"items": {
"type": "string"
},
"description": "Additional env vars validateApiKey() tries, in order, when the primary apiKeyEnvVar is unset (e.g. HF_TOKEN alongside HUGGINGFACE_API_KEY)."
},
"envOverrides": {
"type": "object",
"additionalProperties": false,
"properties": {
"apiKey": {
"type": "string"
},
"baseURL": {
"type": "string"
},
"model": {
"type": "string"
}
}
}
}
},
"models": {
"type": "object",
"additionalProperties": false,
"required": [
"default",
"fallbacks",
"defaultContextWindow",
"defaultMaxOutputTokens",
"catalog"
],
"properties": {
"default": {
"type": "string"
},
"fallbacks": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
},
"fallbackModelName": {
"type": "string",
"description": "Default: fallbacks[1] ?? fallbacks[0]."
},
"registryDefaultModel": {
"type": "string",
"description": "Default: models.default."
},
"defaultContextWindow": {
"type": "number"
},
"defaultMaxOutputTokens": {
"type": "number"
},
"catalog": {
"type": "object",
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"required": ["vision", "status", "description"],
"properties": {
"contextWindow": {
"type": "number"
},
"maxOutputTokens": {
"type": "number"
},
"pricingPerMTok": {
"type": "object",
"additionalProperties": false,
"required": ["input", "output"],
"properties": {
"input": {
"type": "number"
},
"output": {
"type": "number"
},
"cachedInput": {
"type": "number"
}
}
},
"vision": {
"type": "boolean"
},
"status": {
"type": "string",
"enum": ["production", "preview", "retired"]
},
"description": {
"type": "string"
},
"enumMember": {
"type": "string",
"pattern": "^[A-Za-z_$][A-Za-z0-9_$]*$"
}
}
}
},
"topModels": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Ordered curated subset of catalog keys for wizard/choice surfaces. Falls back to the full catalog in file order when absent."
},
"visionModel": {
"type": "string",
"description": "The live-verified vision model capability tests should exercise. Must be a key of models.catalog whose entry has vision: true (enforced by the zod schema, not expressible here). Default: first vision:true model in file order."
},
"testModel": {
"type": "string",
"minLength": 1,
"description": "The live-verified model the capability matrix drives, for providers whose default is retired upstream or gated off the testing account. May name a model outside models.catalog. Default: models.default. Never affects the runtime default."
}
}
},
"capabilities": {
"type": "object",
"additionalProperties": false,
"required": [
"text",
"streaming",
"tools",
"toolsWithStreaming",
"structuredOutput",
"structuredOutputWithTools",
"embeddings",
"thinking"
],
"properties": {
"text": {
"type": "boolean"
},
"streaming": {
"type": "boolean"
},
"tools": {
"anyOf": [{ "type": "boolean" }, { "const": "model-dependent" }],
"description": "\"model-dependent\" when tool support varies per served model and the vendor doesn't reject tools for unsupported ones (e.g. HuggingFace's router)."
},
"toolsWithStreaming": {
"type": "boolean"
},
"structuredOutput": {
"type": "boolean"
},
"structuredOutputWithTools": {
"type": "boolean"
},
"embeddings": {
"type": "boolean"
},
"thinking": {
"type": "boolean"
}
}
},
"errorRules": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["class", "message"],
"properties": {
"status": {
"type": "number"
},
"pattern": {
"type": "string"
},
"class": {
"type": "string",
"enum": [
"authentication",
"rate-limit",
"invalid-model",
"network",
"provider"
]
},
"message": {
"type": "string"
}
}
}
},
"quirks": {
"type": "object",
"additionalProperties": false,
"properties": {
"timeoutErrorClass": {
"const": "provider"
},
"registryDefaultIgnoresModelEnvVar": {
"type": "boolean"
},
"messageContentFormat": {
"type": "string",
"enum": ["string"],
"description": "Vendor accepts messages[].content only as a plain string, rejecting OpenAI's content-parts array and the null used on an assistant message with tool_calls. Normalized by ConfiguredOpenAICompatProvider."
},
"responseFormatDowngrade": {
"type": "string",
"enum": ["json-schema-to-json-object"],
"description": "Vendor rejects response_format: { type: \"json_schema\" } outright but accepts { type: \"json_object\" }. ConfiguredOpenAICompatProvider downgrades the request so generate({ schema }) keeps working."
},
"replayReasoningContent": {
"type": "boolean",
"description": "Vendor wants each assistant turn's reasoning_content sent back on every later request of the conversation (DeepSeek documents a 400 without it once tools are in play). Off for every other provider, since strict OpenAI-compatible backends reject the unknown field."
},
"authHeaderStyle": {
"type": "string",
"enum": ["x-api-key"],
"description": "Vendor's chat-completions endpoint authenticates with X-Api-Key instead of the inherited Authorization: Bearer default (Reka's OpenAPI spec declares exactly one security scheme, an apiKey in header X-Api-Key). Normalized by ConfiguredOpenAICompatProvider.getAuthHeaders()."
}
}
},
"timeouts": {
"type": "object",
"additionalProperties": false,
"description": "Descriptor-only generate/stream turn-budget override consumed by buildCatalogDescriptor(); never read by the OpenAI-compat runtime path.",
"properties": {
"generateMs": {
"type": "number"
},
"streamMs": {
"type": "number"
}
}
},
"autoSelectPriority": {
"type": "number",
"description": "Descriptor-only ascending auto-select priority override (lower = tried first in getBestProvider()'s fallback chain). Absent = provider is not part of the auto-select chain."
},
"setup": {
"type": "object",
"additionalProperties": false,
"required": ["url", "apiKeyFormat", "billingPolicy", "instructions"],
"properties": {
"url": {
"type": "string"
},
"apiKeyFormat": {
"type": ["string", "null"]
},
"billingPolicy": {
"type": "string",
"enum": ["free-tier", "free-with-card", "no-free-tier"]
},
"instructions": {
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"description": "Label shown by the setup wizard for the credential (default: \"API key\")."
}
}
},
"evidence": {
"type": "object",
"additionalProperties": false,
"required": ["rosterVerified", "liveMatrix", "addedInPR"],
"properties": {
"rosterVerified": {
"$ref": "#/definitions/probeEvidence"
},
"authProbe": {
"$ref": "#/definitions/probeEvidence"
},
"billingProbe": {
"$ref": "#/definitions/probeEvidence"
},
"liveMatrix": {
"type": ["object", "null"],
"additionalProperties": false,
"required": ["date", "result"],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"result": {
"type": "string"
}
}
},
"addedInPR": {
"type": "string"
}
}
}
},
"definitions": {
"probeEvidence": {
"type": "object",
"additionalProperties": false,
"required": ["date"],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"status": {
"type": "number"
},
"code": {
"type": "string"
},
"method": {
"type": "string"
}
}
}
}
}