@juspay/neurolink 13.8.21 → 13.8.23

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.
@@ -2,12 +2,6 @@ import type { AIProviderName } from "../constants/enums.js";
2
2
  import { BaseProvider } from "../core/baseProvider.js";
3
3
  import { ProviderError } from "../types/index.js";
4
4
  import type { DecisionDialect, DecisionError, DecisionQuestion, DecisionRequest, DecisionResult, DecisionPreparedMedia, DecisionState, LanguageModel, StreamOptions, StreamResult, ValidationSchema } from "../types/index.js";
5
- /**
6
- * Generous enough for a cold start (measured at 2.0–2.7s after idle on Jev)
7
- * while still bounded. Every internal caller is fail-open, so this only bites
8
- * on a genuine stall.
9
- */
10
- export declare const DEFAULT_DECISION_TIMEOUT_MS = 5000;
11
5
  export { asNumber, isRecord } from "./decide/guards.js";
12
6
  /**
13
7
  * FastAPI's request-validation envelope, `{"detail":[{loc, msg, input}]}`,
@@ -9,12 +9,6 @@ import { redactUrlsInText } from "../utils/logSanitize.js";
9
9
  import { estimateDecisionStateTokens, resolveDecisionLimitsReading, unsupportedDecisionQuestion, } from "../utils/decisionLimits.js";
10
10
  import { systemOneDialect } from "./decide/dialects/systemOne.js";
11
11
  import { asNumber, isRecord } from "./decide/guards.js";
12
- /**
13
- * Generous enough for a cold start (measured at 2.0–2.7s after idle on Jev)
14
- * while still bounded. Every internal caller is fail-open, so this only bites
15
- * on a genuine stall.
16
- */
17
- export const DEFAULT_DECISION_TIMEOUT_MS = 5000;
18
12
  const DEFAULT_MAX_RETRIES = 1;
19
13
  export { asNumber, isRecord } from "./decide/guards.js";
20
14
  /**
@@ -297,10 +291,10 @@ export class SystemOneDecisionProvider extends BaseProvider {
297
291
  const body = JSON.stringify(payload);
298
292
  this.assertWithinRequestBytes(body);
299
293
  this.assertWithinVendorLimits(payload, resolvedModel);
294
+ // An entry that declares no `timeouts.decideMs` gets BaseProvider's 30 s.
300
295
  const timeoutMs = request.timeoutMs ??
301
296
  this.defaultTimeoutMs(questionEntries.length, stateTokens) ??
302
- this.defaultTimeout ??
303
- DEFAULT_DECISION_TIMEOUT_MS;
297
+ this.defaultTimeout;
304
298
  let lastError;
305
299
  for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
306
300
  const startedAt = Date.now();
@@ -2,7 +2,7 @@ import { TypeSafeModels } from "../constants/enums.js";
2
2
  import { logger } from "../utils/logger.js";
3
3
  import { redactUrlForError } from "../utils/logSanitize.js";
4
4
  import { getProviderModel } from "../utils/providerConfig.js";
5
- import { asNumber, DEFAULT_DECISION_TIMEOUT_MS, describeValidationErrors, isRecord, SystemOneDecisionProvider, } from "./systemOneDecision.js";
5
+ import { asNumber, describeValidationErrors, isRecord, SystemOneDecisionProvider, } from "./systemOneDecision.js";
6
6
  const TYPESAFE_DEFAULT_BASE_URL = "https://api.typesafe.ai";
7
7
  /**
8
8
  * Vercel AI Gateway's evaluation-model endpoint.
@@ -322,7 +322,7 @@ export class TypeSafeProvider extends SystemOneDecisionProvider {
322
322
  }
323
323
  const response = await this.proxyFetch(`${this.baseURL}/v1/models`, {
324
324
  headers: { Authorization: `Bearer ${this.apiKey}` },
325
- signal: AbortSignal.timeout(this.defaultTimeout ?? DEFAULT_DECISION_TIMEOUT_MS),
325
+ signal: AbortSignal.timeout(this.defaultTimeout),
326
326
  });
327
327
  const payload = await response.json().catch(() => null);
328
328
  if (!response.ok) {
@@ -5116,7 +5116,7 @@
5116
5116
  {"objectID":"69f3db3e89a8fd474930cba6df7b01125fa2d9dd41aaadf8d8838423632ace30","title":"What is sent to Cloudflare","url":"/docs/getting-started/providers/cloudflare-clef#what-is-sent-to-cloudflare","content":"boolean is the SDK's name for the wire's noul. model is sent although the\npath already names it: Cloudflare's schema marks it required, and a body whose\nmodel differs from the path is refused. A request with no model was accepted\nlive and answered by clef-flash, so sending it matters only for following the\nschema. Cloudflare wraps every answer in its own\nenvelope, and NeuroLink reads the answers out of it:\n\nThe request id is the cf-ai-req-id response header; where that is absent (a\nrejected token never reaches the model) it is the edge's cf-ray.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"What is sent to Cloudflare","lvl3":""}},
5117
5117
  {"objectID":"37eb6d126d3af6ca22085fbf94025a8f23da15691c8f6070b946f5aaa27e2f10","title":"One token, two providers","url":"/docs/getting-started/providers/cloudflare-clef#one-token-two-providers","content":"cloudflare-clef and cloudflare read the same two variables, but each has its\nown credentials slice, so the two cannot be mixed up:\n\n| | cloudflare (text) | cloudflare-clef (decide) |\n| --------------- | --------------------------- | ---------------------------- |\n| Token | CLOUDFLARE_API_KEY | CLOUDFLARE_API_KEY |\n| Account id | CLOUDFLARE_ACCOUNT_ID | CLOUDFLARE_ACCOUNT_ID |\n| SDK credentials | credentials.cloudflare | credentials.cloudflareClef |\n| Serves | generate() and stream() | decide() only |\n\ncredentials.cloudflare does not configure decide. Setting the two\nvariables for the text provider also lets decide() use Clef when no other\ndecision provider is configured, and no switch turns that off while the two\nvariables are set in the environment. A host that wants the Workers AI text\nprovider without Clef can give the text provider its token and account id only\nthrough credentials.cloudflare, and leave the environment variables unset.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"One token, two providers","lvl3":""}},
5118
5118
  {"objectID":"fee62c91a128411e33fcad60cf048405bd86ff0f4015189d992b70d34fe1b86f","title":"Measured on a real account, October 2026","url":"/docs/getting-started/providers/cloudflare-clef#measured-on-a-real-account-october-2026","content":"The Workers AI endpoint ignored text past about 2,048 tokens until 2026-10-04,\nfar below Cloudflare's documented 64K context, and read far more on 2026-10-07\n(hosted service or model: unknown). Request-size refusals also changed between two measurement dates.\nThe original measurements were on 2026-10-03; the bounded follow-up campaign\nused 133 probe calls on 2026-10-04, with one request at a time.\n\nWhich model: on both clef-flash and clef, the follow-up still read the\nfact at the 2026-10-03 clef-flash lower bound for logs, number lists, digit\narrays and compact JSON, and did not read it 2.5% to 3.1% further on. English prose and\nrandom CJK had already matched on both models. It also checked the question\ncount, pixel and four/five-image boundaries on both models, the id, option,\nscore-level and PNG/JPEG/WebP boundaries on clef, and the image/jpg case on\nboth models. Natural-script\nprose was measured on clef; a reworked many-key object probe matched on both.\nTypeScript, minified JSON and synthetic Devanagari/emoji cuts remain 9B-only\nmeasurements. Historical latency, billing and burst figures retain their dates.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"Measured on a real account, October 2026","lvl3":""}},
5119
- {"objectID":"d037c352a1fe4919ca99ec7f802ad178e960f28da494088ad0702c93867c6a67","title":"What the 413 counts","url":"/docs/getting-started/providers/cloudflare-clef#what-the-413-counts","content":"The paragraph above gives the edges for plain text. What the estimate is made of\nwas measured on 2026-10-23 and 2026-10-24, one request at a time and with the daily\nallocation spent. That does not hide the size gate: it answers 413 before the\nallocation check answers 429/code 4006, so a 413 means refused by the gate and a\n429 means the request passed it (these probes read no answer).\nThe estimate is the characters of the request's JSON without its images\n array (the key included), over four, rounded half up. A text of 196,609\n characters got 429 on clef-flash and 196,610 got 5021 (estimate 49,153; twice\n 24,576 is 49,152); on clef, 524,288 got 429 and 524,292 got 5021.\nThe images are not in it. Bodies of 396,820 and 517,199 bytes (one and four\n images, the text at the edge) and 632,380 and 1,168,636 bytes (one image of\n about 0.5 and 1.1 MB, a text of 100,000 characters) got 429 on clef-flash,\n not 5021, while a text of 196,612 characters got 5021 with the same 200 KB image\n beside it. That is an inference from the order of the two refusals; no answer\n was read from these bodies. Live case 19.14, which sends about 253 KB with an\n image, is answered. On 2026-10-05 the estimate was the whole body over four\n (133,126 for 532,505 bytes); it no longer is.\nIt counts characters, not bytes. 98,252 \"é\" (196,612 bytes in UTF-8) got 429;\n 98,252 newlines, which JSON writes as two characters each, got 5021.\n\nNeuroLink therefore holds the text of a Clef request (the body without images) to\n195,584 characters on clef-flash and 523,264 on clef, which is eight characters\nper window token less 1,024, and refuses more locally as max_tokens_exceeded,\nthe kind Cloudflare's own 413 gets. A model it does not know has no such limit.\nReaching it takes a text that its state limit above does not allow except through\nthe questions or control characters, which JSON writes as up to six characters each.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"What the 413 counts","lvl3":""}},
5119
+ {"objectID":"d037c352a1fe4919ca99ec7f802ad178e960f28da494088ad0702c93867c6a67","title":"What the 413 counts","url":"/docs/getting-started/providers/cloudflare-clef#what-the-413-counts","content":"The paragraph above gives the edges for plain text. What the estimate is made of\nwas measured on 2026-10-23 and 2026-10-24, one request at a time and with the daily\nallocation spent. That does not hide the size gate: it answers 413 before the\nallocation check answers 429/code 4006, so a 413 means refused by the gate and a\n429 means the request passed it (these probes read no answer).\nThe estimate is the characters of the request's JSON without its images\n array (the key included), over four, rounded half up. A text of 196,609\n characters got 429 on clef-flash and 196,610 got 5021 (estimate 49,153; twice\n 24,576 is 49,152); on clef, 524,288 got 429 and 524,292 got 5021.\nThe images are not in it. Bodies of 396,820 and 517,199 bytes (one and four\n images, the text at the edge) and 632,380 and 1,168,636 bytes (one image of\n about 0.5 and 1.1 MB, a text of 100,000 characters) got 429 on clef-flash,\n not 5021, while a text of 196,612 characters got 5021 with the same 200 KB image\n beside it. That was an inference from the order of the two refusals, made with\n the allocation spent. Once it was restored (2026-10-24) the answers were read:\n image bodies of 196,616 bytes (8 over the text edge) and 1,168,636 bytes on\n clef-flash, and of 524,292 and 724,504 bytes on clef (one image each and a\n short text), got HTTP 200 with 258, 906, 749 and 825 input tokens; the status\n and the token counts were read, not the content of the answers. Live case 19.14,\n which sends about 253 KB with an image, is answered. On 2026-10-05 the estimate was the whole body over four\n (133,126 for 532,505 bytes); it no longer is.\nIt counts characters, not bytes. 98,252 \"é\" (196,612 bytes in UTF-8) got 429;\n 98,252 newlines, which JSON writes as two characters each, got 5021.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"What the 413 counts","lvl3":""}},
5120
5120
  {"objectID":"26bf07373276f11bf9e656e74cd4a5cbdeeed0e8b4bfa1c057f362b55a3ad959","title":"The state window changed on 2026-10-07","url":"/docs/getting-started/providers/cloudflare-clef#the-state-window-changed-on-2026-10-07","content":"The window described above no longer applies. On 2026-10-07 the Workers AI\nendpoint read the whole state. This section records what was measured; the\nnumbers above stay as the record of 2026-10-03 and 2026-10-04.\n\nMeasured with one request at a time between 07:24 and 08:12 UTC, with a fact\nplaced at the end of the state (the part a cut would drop) and the question \"what\ncolour does the text say the vault code is?\". A fact counts as read when the\nanswer's probability for its colour is at least 0.8.\n\n| State | Model | Characters | Input tokens billed | Fact read (probability) | Time |\n| --------------------------------- | ------------ | ---------- | ------------------- | ----------------------- | ------ |\n| Prose, fact at 55,000 | clef-flash | 60,032 | 10,555 | yes (0.980) | 0.8 s |\n| Prose, fact at 55,000 | clef | 60,032 | 10,555 | yes (0.996) | 2.0 s |\n| Prose, no fact (control) | clef-flash | 60,000 | 10,547 | no (0.297) | 1.1 s |\n| Prose, no fact (control) | clef | 60,000 | 10,547 | no (0.170) | 2.0 s |\n| Prose, fact at 200,000 | clef-flash | 240,032 | 41,755 | yes (0.978) | 3.0 s |\n| Prose, fact at the end | clef-flash | 300,031 | 52,154 | yes (0.984) | 4.9 s |\n| Prose, fact at the end | clef | 300,031 | 52,154 | yes (0.996) | 11.8 s |\n| Prose, fact at the end | clef-flash | 500,031 | 86,819 | yes (0.985) | 19.2 s |\n| JSON array of digits, fact at end | clef-flash | 115,031 | 115,153 | yes (0.986) | 11.3 s |\n| JSON array of digits, fact at end | clef-flash | 158,031 | 158,153 | yes (0.987) | 30.9 s |\n| JSON array of digits, fact at end |","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"The state window changed on 2026-10-07","lvl3":""}},
5121
5121
  {"objectID":"39c1f7ffec3b0df62b067ce9d778c3752d09cb8fdecce80b4e64028655048470","title":"What NeuroLink refuses before any request","url":"/docs/getting-started/providers/cloudflare-clef#what-neurolink-refuses-before-any-request","content":"| Refused | Limit | Error kind |\n| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------- |\n| A state estimated over 16,000 tokens | digits 1 token each, punctuation 0.75, emoji 3, other non-ASCII text 1.5, letters about 4 characters a token | max_tokens_exceeded |\n| More than 64 questions in one decide() | 64 | max_tokens_exceeded |\n| A request body over 256,000 bytes | 256,000 | invalid_request |\n| clef-flash: text without images over 195,584 characters | 195,584 (clef: 523,264) | max_tokens_exceeded |\n| More than 4 images, a video, or a format other than PNG, JPEG or WebP | | invalid_request |\n| A model name that is not a plain name, such as clef/../x | | invalid_request |\n| A missing token or account id, or a base URL that cannot work | | authentication or invalid_request |","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"What NeuroLink refuses before any request","lvl3":""}},
5122
5122
  {"objectID":"bb0d1df2801529da652fbd15360879d9b2ccce53dfdf4d825a7a00f4e19d8d15","title":"What is not verified","url":"/docs/getting-started/providers/cloudflare-clef#what-is-not-verified","content":"The status Cloudflare returns for a token without Workers AI permission. No\n such token was available. A 403 is treated as an ordinary invalid_request,\n not authentication, so that if it does mean a missing permission, fixing it\n in the dashboard works at once, without restarting the process.\nAny 5xx other than one 529. Cloudflare answered a single server error, HTTP 529\n with code 5012 (\"Clef inference failed\"), to a 190,153-token state on clef on\n 2026-10-07; the retry and classification of 500, 502, 503 and 504 rest on\n ordinary HTTP conventions.\nWhat a Workers Paid account that has run out of credit gets. Only the Free plan's\n daily allocation running out was seen (HTTP 429, code 4006, 2026-10-05); it is\n not retried. Cloudflare documents a reset at 00:00 UTC, but this account was\n still refused at 02:38 and 04:12 UTC on 2026-10-06 and answered again at\n 07:24 UTC on 2026-10-07, so when the allowance returns here is not verified.\nThe 27B TypeScript, minified-JSON and synthetic Devanagari/emoji cuts; see the\n model coverage above.\nThe rate limit. Only a burst of 60 was tried.\nWhether Cloudflare's service is generally available or in beta.\nWhether the state window (about 2,048 tokens until 2026-10-04, none found by\n 2026-10-07) and the changing request-size limit belong to the hosted service or\n to the model itself. The open weights on Hugging Face\n were not run.\nWhether either limit changes again. The live decide suite carries four canary\n cases that fail with an instruction to re-measure: 19.10 and 19.10b send a\n prose state and a digit array just under NeuroLink's own limit, with a fact at\n the very end, to both models, and fail if the service stops reading below that\n limit; 19.11 and 19.11b check both sides of the text-only request ceiling on\n clef-flash and clef.\n None of them notices a service that reads more than the limit allows.","hierarchy":{"lvl0":"Getting Started","lvl1":"Cloudflare Clef Provider Guide","lvl2":"What is not verified","lvl3":""}},
@@ -6556,7 +6556,7 @@
6556
6556
  {"objectID":"0e9ffbaad88dadb6493a28fd7481227ff45f814672b9224e965f48bf3b8b9e0b","title":"When NeuroLink uses it","url":"/docs/getting-started/providers/scaledown#when-neurolink-uses-it","content":"Every built-in consumer of decide — model routing, relevance-driven\ncompaction, tool routing and RAG planning — asks for the default decision\nprovider. That is the first one that is configured, in the environment or in\nthe credentials passed to the SDK, in the order TypeSafe, Laya,\nXOR, SubQ, Perplexity,\nCloudflare Clef, OpenAI Decisions,\nthen ScaleDown. ScaleDown counts with its key alone. So:\nOnly a ScaleDown key: built-in features use ScaleDown, and each of their\n decisions is then a paid request (see Cost) that still falls back to\n what NeuroLink did before on any failure.\nA ScaleDown key, plus any earlier provider's key: built-in features use\n that earlier provider. ScaleDown runs only where a caller asks for\n provider: \"scaledown\".\nA blank SCALEDOWN_API_KEY: no key. ScaleDown is not configured.\nprovider: \"scaledown\" with no key: an authentication error and no\n request.\n\nScaleDown is last on purpose, and its key is not shared. Apart from ScaleDown, the providers that\ncome after SubQ in the order are the ones whose key is also read by a text\nprovider (Perplexity's, the Cloudflare pair and OpenAI's), placed behind it so\nthat a key set only for a text provider cannot displace a decision provider a\nhost set up on purpose. That reasoning does not cover ScaleDown, whose key\nbelongs to no other provider: it was placed last, after OpenAI Decisions, as a\ndeliberate choice and not by that rule. The effect is that an ambient OPENAI_API_KEY, PERPLEXITY_API_KEY or\nCloudflare pair in the environment outranks a SCALEDOWN_API_KEY set on purpose.\nThe one exception is a gateway's key: an OPENAI_API_KEY found only in the\nenvironment is skipped for the default while OPENAI_BASE_URL, OPENAI_API_BASE\nor credentials.openai.baseURL names a host other than https://api.openai.com,\nso with nothing earlier configured ScaleDown is the default.","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"When NeuroLink uses it","lvl3":""}},
6557
6557
  {"objectID":"b06a4af3a93c004935822bcc4b8c3fa7b19a496460ca3d2a9f8ea72446d6c262","title":"How the catalog entry says this","url":"/docs/getting-started/providers/scaledown#how-the-catalog-entry-says-this","content":"scaledown.json needed two optional keys in its decide block that no earlier\nentry set, both read by the shared catalog engine for any entry that sets them.\nAn entry that omits them behaves exactly as before.\n\n| Key | Value | What it does |\n| --------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| authHeader | \"x-api-key\" | The API key is sent as x-api-key: <key> and no Authorization header is sent at all. \"bearer\", the default when the key is omitted, sends Authorization: Bearer <key>. This is the decide request's own setting; quirks.authHeaderStyle belongs to the chat path and is not read here |\n| stateEncoding | \"text\" | The state that goes out is always a string: a string is sent unchanged (not trimmed), any other value as its JSON text, and a state that is blank after trimming is refused before any request as an invalid_request. Omitted means the state goes out as given |\n\nThe rest of the entry is the same kind of data every decide entry carries: the\nsystem-one dialect, order 8, the endpoint {baseURL}/v1/scaledown, the model in\nthe body, trailing slashes dropped from the base URL, and the error rules in the\ntable below. The fields are also described in the generated API reference, under\nDecideBlock.","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"How the catalog entry says this","lvl3":""}},
6558
6558
  {"objectID":"9f3c9d52f412bb381d8f770fa11e1de1c1f66ba5b56c324de62a11d5f6cf35bd","title":"Images and video","url":"/docs/getting-started/providers/scaledown#images-and-video","content":"ScaleDown's endpoint reads text only, and the catalog entry declares no media. An\nimage or a video attached to a decide() call for ScaleDown is refused before any\nrequest, as an invalid_request, and the catalog marks both models\nvision: false. This refusal comes before the blank-state check, so a call that\ncarries media is always refused for the media. To decide over images today, use\nXOR, Perplexity,\nCloudflare Clef or OpenAI Decisions.","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Images and video","lvl3":""}},
6559
- {"objectID":"32661eaf2994628038e0d49fc81ee5e962c42273147ac024b6b6a66c0d2f2142","title":"Timeouts","url":"/docs/getting-started/providers/scaledown#timeouts","content":"The default is 30,000 ms per attempt. The entry declares it (timeouts.decideMs\nin scaledown.json). It is not the 5,000 ms of DEFAULT_DECISION_TIMEOUT_MS:\nthat constant comes after the provider's own default timeout, which is 30,000 ms\non the provider base class, so it is never reached. A provider that wants a\nshorter limit declares one, as TypeSafe, Laya and XOR declare 5,000 ms.\n\n30 seconds is not derived from a measurement of ScaleDown, but a 5-second limit\nwould have cut answers off. In the live test of 2026-10-20, with no timeoutMs, 10 identical\n265-token requests were answered in 0.3 to 9.8 s, and two of them (6.1 s and\n9.8 s) took longer than 5 s. A choice question is scored once per option, and the\nmarketing session saw one ScaleDown 504 (Endpoint request timed out) after\nabout 29 seconds. ScaleDown's own latency is otherwise not measured here, so a\ncaller with many options or a long state should pass timeoutMs.\n\nA 504 that ScaleDown sends is classified timeout and is not retried. A timeout\nraised by NeuroLink's own clock is retried once, so a request that never answers\nfails after about twice the limit (a loopback stand-in, not ScaleDown, that did\nnot answer in 30 s was cut off at 30,000 ms and retried, 60.4 s in all).","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Timeouts","lvl3":""}},
6559
+ {"objectID":"32661eaf2994628038e0d49fc81ee5e962c42273147ac024b6b6a66c0d2f2142","title":"Timeouts","url":"/docs/getting-started/providers/scaledown#timeouts","content":"The default is 30,000 ms per attempt. The entry declares it (timeouts.decideMs\nin scaledown.json); 30,000 ms is also what the provider base class gives an\nentry that declares none. There is no shared 5,000 ms default: a provider that\nwants a shorter limit declares one, as TypeSafe, Laya and XOR declare 5,000 ms.\n\n30 seconds is not derived from a measurement of ScaleDown, but a 5-second limit\nwould have cut answers off. In the live test of 2026-10-20, with no timeoutMs, 10 identical\n265-token requests were answered in 0.3 to 9.8 s, and two of them (6.1 s and\n9.8 s) took longer than 5 s. A choice question is scored once per option, and the\nmarketing session saw one ScaleDown 504 (Endpoint request timed out) after\nabout 29 seconds. ScaleDown's own latency is otherwise not measured here, so a\ncaller with many options or a long state should pass timeoutMs.\n\nA 504 that ScaleDown sends is classified timeout and is not retried. A timeout\nraised by NeuroLink's own clock is retried once, so a request that never answers\nfails after about twice the limit (a loopback stand-in, not ScaleDown, that did\nnot answer in 30 s was cut off at 30,000 ms and retried, 60.4 s in all).","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Timeouts","lvl3":""}},
6560
6560
  {"objectID":"a09b830ff06ece8be11a2d4fb2093b734e19a11ba1ba8393b17cce73b3f653b7","title":"Cost","url":"/docs/getting-started/providers/scaledown#cost","content":"List price: USD 0.05 per million input tokens, with output tokens not\ncharged, from ScaleDown's launch post and from the usage.cost in a response, as\nreported to this project by the marketing session on 2026-10-15. This project has\nnot priced a call itself and has not checked the rate since, so check ScaleDown's\ndashboard for the current one.\n\nNeuroLink prices a decision from the input tokens the reply reports, at that one\nrate, and counts output tokens at nothing. It does not read the reply's\nusage.cost. result.usage and the CLI's Cost: line are therefore an estimate\nfrom the list price, not a bill. A reply that reports no usage is priced at zero.\nThe sign-up allowance is a free allowance whose expiry is not established.","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Cost","lvl3":""}},
6561
6561
  {"objectID":"9fe742ca7befe0c2159befcd8359f9831dcb2b94f4f462faff3e74b86b47fffc","title":"Errors","url":"/docs/getting-started/providers/scaledown#errors","content":"ScaleDown's documentation lists HTTP 402 (insufficient credits), 422 (invalid),\n502 (model service error) and 504 (timeout). The marketing session also saw, on\n2026-10-15, a 429 Max queue length has been reached (no rate-limit headers; it\ncleared after a few seconds) and a 504 Endpoint request timed out, and each\nwas answered when it retried by hand. NeuroLink shows the detail text of an\nerror body, whether it is a plain string, an object with a message, or a list\nof validation errors. A list, which is the form both 422 bodies took in the live\ntest of 2026-10-20, is shown as Request failed validation — <where>: <reason>,\nfor up to five entries and without the input each entry echoes back (that is\nthe request, state included). A body in any other form gives only\nScaleDown request failed with HTTP <status>; the kind and the retry behaviour\ndo not change.\n\n| Reply | Kind | Retried |\n| ---------------------------------------------------- | ------------------------------------------------------------------------- | --------- |\n| 401 | authentication — the provider instance stops retrying | no |\n| 402 | invalid_request — no credit left, or a key ScaleDown does not recognise | no |\n| 422 | invalid_request, with ScaleDown's reason when the body shows one | no |\n| 429 | rate_limit | yes, once |\n| 502 | server | yes, once |\n| 504 | timeout","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Errors","lvl3":""}},
6562
6562
  {"objectID":"586e2eeaa1cb6c511d8eabf5f8e3aea68d19a0585eef1879b0a8432342bd93a7","title":"Data retention","url":"/docs/getting-started/providers/scaledown#data-retention","content":"NeuroLink has not read ScaleDown's data-handling terms. The state and the questions\nof every request go to api.scaledown.xyz, including the ones the built-in\nconsumers send for model routing, compaction, tool routing and RAG planning\nwhenever ScaleDown is the default decision provider. Read ScaleDown's terms before\nsending anything sensitive.","hierarchy":{"lvl0":"Getting Started","lvl1":"ScaleDown Provider Guide","lvl2":"Data retention","lvl3":""}},
@@ -6649,7 +6649,7 @@
6649
6649
  {"objectID":"96e991d6ea0464b1707e71a219f12f335400ad2b5401eaa86b74abb223adb7b3","title":"Verification status","url":"/docs/getting-started/providers/subconscious#verification-status","content":"Tier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the\ncatalog currently records for Subconscious — docs- and roster-verified, not\nlive-verified:\n\n| Probe | Result |\n| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | unauthenticated GET https://api.subconscious.dev/v1/models, HTTP 200, 4 models, 2026-09-29 — no key used |\n| Route check | unauthenticated GET https://api.subconscious.dev/v1/chat/completions answered HTTP 405 with allow: POST, 2026-09-29; no POST was sent |\n| Billing | public pages read without an account: the cloud API page and the pricing page.","hierarchy":{"lvl0":"Getting Started","lvl1":"Subconscious Provider Guide","lvl2":"Verification status","lvl3":""}},
6650
6650
  {"objectID":"8c3a0849c95eedb67f4cc7f557d8e1be167e442bfbc369468d98442b1312777e","title":"Error statuses","url":"/docs/getting-started/providers/subconscious#error-statuses","content":"The OpenAPI spec (https://docs.subconscious.dev/api-reference/openapi.json)\nlists these responses for /chat/completions:\n\n| Status | Vendor description | NeuroLink class |\n| ------ | ------------------------------------------------------------ | ----------------- |\n| 400 | Bad request due to invalid parameters or unsupported options | not in errorRules |\n| 401 | Unauthorized because of a missing or invalid API key | authentication |\n| 429 | Rate limited due to too many requests or tokens per minute | rate-limit |\n| 500 | Internal server error | not in errorRules |","hierarchy":{"lvl0":"Getting Started","lvl1":"Subconscious Provider Guide","lvl2":"Error statuses","lvl3":""}},
6651
6651
  {"objectID":"0fca22eccff731488298cebb313d9ddfc374ef3c7fccdc469899e5119d9f1ad3","title":"See also","url":"/docs/getting-started/providers/subconscious#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility","hierarchy":{"lvl0":"Getting Started","lvl1":"Subconscious Provider Guide","lvl2":"See also","lvl3":""}},
6652
- {"objectID":"7afe6dc192c3cc3ce8d4789877a559228c35059789628947b0c558d640232775","title":"SubQ Provider Guide","url":"/docs/getting-started/providers/subq","content":"SubQ Provider Guide\n\nA provider of decide — the same typed boolean / choice / score\nanswers as TypeSafe's Jev, Laya, XOR,\nPerplexity and Cloudflare Clef,\nfrom Subquadratic's hosted SubQ Snap. It emits no text at all.\n\nOverview\n\nsubq-snap-preview is Subquadratic's decision model, in public preview. You\nsend one state plus named, typed questions. The model answers every question\nin a single pass and returns a typed answer for each, with a probability\ninstead of a sentence. SubQ speaks the same System One wire as TypeSafe, so\nNeuroLink describes it with one catalog file,\nsrc/lib/providers/catalog/subq.json, and no provider code of its own. NeuroLink\ncalls SubQ's public endpoint, so a key alone configures it: there is no base\nURL to set.\n\nKey Facts\n\n| | |\n| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Provider id | subq; the aliases subquadratic and subq-snap name it too |\n| Inference type | decide only |\n| Model | subq-snap-preview, the only model on SubQ's Decisions endpoint. SUBQ_MODEL sets it |\n| Key | SUBQ_API_KEY, or credentials.subq.apiKey. Keys come from console.subq.ai; the console shows one only once |\n| Endpoint | https://api.subq.ai/v1/systemone; SUBQ_BASE_URL or credentials.subq.baseURL can name another origin |\n| Questions per request | no cap declared |\n| State window | 376,000 estimated tokens, advisory: reported by decisionLimits(), never enforced. SubQ's own 400 response states a maximum model length of 393,216 tokens; see Limits |\n| Media | none. Images attached to a decide() call are refused before any request; see Images |\n| Default timeout | 5 seconds; timeoutMs or --timeout replaces it |\n| Precedence | used automatically unless TypeSafe, Laya or XOR is configured; it comes ahead of Perplexity, Cloudflare Clef, OpenAI Decisions and ScaleDown |\n\nQuick Start\nGet a key\n\nSign up at console.subq.ai and create an API key. The\nconsole shows it once, so copy it then. SubQ answers HTTP 402 to a request made\nwith no credits left.\nConfigure\n\nSet the key in the environment:\n\nor in the config passed to the SDK, exactly as for any other provider. Values\npassed per call override the constructor's, which override the environment:\n\nSUBQ_BASE_URL and credentials.subq.baseURL name an origin. NeuroLink appends\n/v1/systemone and drops any trailing slashes, so a value that already ends in\n/v1 would send the request to /v1/v1/systemone.\nUse it\n\nFrom the CLI\n\nWhen NeuroLink uses it\n\nEvery built-in consumer of decide — model routing, relevance-driven\ncompaction, tool routing and RAG planning — asks for the default decision\nprovider. That is the first one that is configured, in the environment or in\nthe credentials passed to the SDK, in the order TypeSafe, Laya,\nXOR, SubQ, Perplexity,\nCloudflare Clef, OpenAI Decisions,\nthen ScaleDown. SubQ counts with its key alone. It sits\nahead of Perplexity, Clef and OpenAI Decisions because its key belongs to no other\nprovider, so setting it can only be meant for SubQ, whereas theirs are shared\nwith text providers and must not displace it. ScaleDown, whose key is also its\nown, was placed last on purpose. So:\nOnly a SubQ key: built-in features use SubQ.\nA SubQ key, plus a Perplexity key, the Cloudflare pair, OPENAI_API_KEY or\n SCALEDOWN_API_KEY: built-in features use SubQ; Perplexity, Cloudflare Clef,\n OpenAI Decisions and ScaleDown run only where a caller asks for\n provider: \"perplexity-decider\", provider: \"cloudflare-clef\",\n provider: \"openai-decisions\" or provider: \"scaledown\".\nA SubQ key, plus TypeSafe's key, or Laya's or XOR's key and base URL:\n built-in features use TypeSafe, Laya or XOR, in that order, whichever is\n configu","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"","lvl3":""}},
6652
+ {"objectID":"7afe6dc192c3cc3ce8d4789877a559228c35059789628947b0c558d640232775","title":"SubQ Provider Guide","url":"/docs/getting-started/providers/subq","content":"SubQ Provider Guide\n\nA provider of decide — the same typed boolean / choice / score\nanswers as TypeSafe's Jev, Laya, XOR,\nPerplexity and Cloudflare Clef,\nfrom Subquadratic's hosted SubQ Snap. It emits no text at all.\n\nOverview\n\nsubq-snap-preview is Subquadratic's decision model, in public preview. You\nsend one state plus named, typed questions. The model answers every question\nin a single pass and returns a typed answer for each, with a probability\ninstead of a sentence. SubQ speaks the same System One wire as TypeSafe, so\nNeuroLink describes it with one catalog file,\nsrc/lib/providers/catalog/subq.json, and no provider code of its own. NeuroLink\ncalls SubQ's public endpoint, so a key alone configures it: there is no base\nURL to set.\n\nKey Facts\n\n| | |\n| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Provider id | subq; the aliases subquadratic and subq-snap name it too |\n| Inference type | decide only |\n| Model | subq-snap-preview, the only model on SubQ's Decisions endpoint. SUBQ_MODEL sets it |\n| Key | SUBQ_API_KEY, or credentials.subq.apiKey. Keys come from console.subq.ai; the console shows one only once |\n| Endpoint | https://api.subq.ai/v1/systemone; SUBQ_BASE_URL or credentials.subq.baseURL can name another origin |\n| Questions per request | no cap declared |\n| State window | 376,000 estimated tokens, advisory: reported by decisionLimits(), never enforced. SubQ's own 400 response states a maximum model length of 393,216 tokens; see Limits |\n| Media | none. Images attached to a decide() call are refused before any request; see Images |\n| Default timeout | 30 seconds per attempt; timeoutMs or --timeout replaces it |\n| Precedence | used automatically unless TypeSafe, Laya or XOR is configured; it comes ahead of Perplexity, Cloudflare Clef, OpenAI Decisions and ScaleDown |\n\nQuick Start\nGet a key\n\nSign up at console.subq.ai and create an API key. The\nconsole shows it once, so copy it then. SubQ answers HTTP 402 to a request made\nwith no credits left.\nConfigure\n\nSet the key in the environment:\n\nor in the config passed to the SDK, exactly as for any other provider. Values\npassed per call override the constructor's, which override the environment:\n\nSUBQ_BASE_URL and credentials.subq.baseURL name an origin. NeuroLink appends\n/v1/systemone and drops any trailing slashes, so a value that already ends in\n/v1 would send the request to /v1/v1/systemone.\nUse it\n\nFrom the CLI\n\nWhen NeuroLink uses it\n\nEvery built-in consumer of decide — model routing, relevance-driven\ncompaction, tool routing and RAG planning — asks for the default decision\nprovider. That is the first one that is configured, in the environment or in\nthe credentials passed to the SDK, in the order TypeSafe, Laya,\nXOR, SubQ, Perplexity,\nCloudflare Clef, OpenAI Decisions,\nthen ScaleDown. SubQ counts with its key alone. It sits\nahead of Perplexity, Clef and OpenAI Decisions because its key belongs to no other\nprovider, so setting it can only be meant for SubQ, whereas theirs are shared\nwith text providers and must not displace it. ScaleDown, whose key is also its\nown, was placed last on purpose. So:\nOnly a SubQ key: built-in features use SubQ.\nA SubQ key, plus a Perplexity key, the Cloudflare pair, OPENAI_API_KEY or\n SCALEDOWN_API_KEY: built-in features use SubQ; Perplexity, Cloudflare Clef,\n OpenAI Decisions and ScaleDown run only where a caller asks for\n provider: \"perplexity-decider\", provider: \"cloudflare-clef\",\n provider: \"openai-decisions\" or provider: \"scaledown\".\nA SubQ key, plus TypeSafe's key, or Laya's or XOR's key and base URL:\n built-in features use TypeSafe, Laya or XOR, in that order, whichever is\n configu","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"","lvl3":""}},
6653
6653
  {"objectID":"e3bea9ca02b054acb28554849e0e81ca2881ff4789c51ecfae77359c4de17488","title":"SubQ Provider Guide","url":"/docs/getting-started/providers/subq#subq-provider-guide","content":"A provider of decide — the same typed boolean / choice / score\nanswers as TypeSafe's Jev, Laya, XOR,\nPerplexity and Cloudflare Clef,\nfrom Subquadratic's hosted SubQ Snap. It emits no text at all.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"SubQ Provider Guide","lvl3":""}},
6654
6654
  {"objectID":"e9a1296ef2e945c77e18e49fd508f9925268bcba0dbc91fd332f0d303f3bed67","title":"Overview","url":"/docs/getting-started/providers/subq#overview","content":"subq-snap-preview is Subquadratic's decision model, in public preview. You\nsend one state plus named, typed questions. The model answers every question\nin a single pass and returns a typed answer for each, with a probability\ninstead of a sentence. SubQ speaks the same System One wire as TypeSafe, so\nNeuroLink describes it with one catalog file,\nsrc/lib/providers/catalog/subq.json, and no provider code of its own. NeuroLink\ncalls SubQ's public endpoint, so a key alone configures it: there is no base\nURL to set.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Overview","lvl3":""}},
6655
6655
  {"objectID":"1ba4213315360e1bd7ffb4d6a6155269f05ca6642867dc7f9345ed30ad0dcb87","title":"Key Facts","url":"/docs/getting-started/providers/subq#key-facts","content":"| | |\n| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Provider id | subq; the aliases subquadratic and subq-snap name it too |\n| Inference type | decide only |\n| Model | subq-snap-preview, the only model on SubQ's Decisions endpoint. SUBQ_MODEL sets it |\n| Key | SUBQ_API_KEY, or credentials.subq.apiKey. Keys come from console.subq.ai; the console shows one only once |\n| Endpoint | https://api.subq.ai/v1/systemone; SUBQ_BASE_URL or credentials.subq.baseURL can name another origin |\n| Questions per request | no cap declared |\n| State window | 376,000 estimated tokens, advisory: reported by decisionLimits(), never enforced. SubQ's own 400 response states a maximum model length of 393,216 tokens; see Limits |\n| Media | none.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Key Facts","lvl3":""}},
@@ -6658,7 +6658,7 @@
6658
6658
  {"objectID":"a8c3194ce8f499cbe6422dbc9ee37ffcc09dcbc69fe39624f390e894e4e41d9c","title":"3. Use it","url":"/docs/getting-started/providers/subq#3-use-it","content":"3. Use it","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"3. Use it","lvl3":""}},
6659
6659
  {"objectID":"cd2e1693aea238ce70fb60a3f8d74b4359f1726857014165f3fffd99df1b5bf5","title":"From the CLI","url":"/docs/getting-started/providers/subq#from-the-cli","content":"From the CLI","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"From the CLI","lvl3":""}},
6660
6660
  {"objectID":"3827eaed3d77845619f0aca3fcb31fa406bcb4130bf489035a4e673470170ffb","title":"When NeuroLink uses it","url":"/docs/getting-started/providers/subq#when-neurolink-uses-it","content":"Every built-in consumer of decide — model routing, relevance-driven\ncompaction, tool routing and RAG planning — asks for the default decision\nprovider. That is the first one that is configured, in the environment or in\nthe credentials passed to the SDK, in the order TypeSafe, Laya,\nXOR, SubQ, Perplexity,\nCloudflare Clef, OpenAI Decisions,\nthen ScaleDown. SubQ counts with its key alone. It sits\nahead of Perplexity, Clef and OpenAI Decisions because its key belongs to no other\nprovider, so setting it can only be meant for SubQ, whereas theirs are shared\nwith text providers and must not displace it. ScaleDown, whose key is also its\nown, was placed last on purpose. So:\nOnly a SubQ key: built-in features use SubQ.\nA SubQ key, plus a Perplexity key, the Cloudflare pair, OPENAI_API_KEY or\n SCALEDOWN_API_KEY: built-in features use SubQ; Perplexity, Cloudflare Clef,\n OpenAI Decisions and ScaleDown run only where a caller asks for\n provider: \"perplexity-decider\", provider: \"cloudflare-clef\",\n provider: \"openai-decisions\" or provider: \"scaledown\".\nA SubQ key, plus TypeSafe's key, or Laya's or XOR's key and base URL:\n built-in features use TypeSafe, Laya or XOR, in that order, whichever is\n configured; SubQ runs only where a caller asks for provider: \"subq\".\nA blank SUBQ_API_KEY: no key. SubQ is not configured.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"When NeuroLink uses it","lvl3":""}},
6661
- {"objectID":"1d299f5eff73ec92910a1c96e5e24965d2594c3f049ce8f0ba6a1d5dbb73bd02","title":"Limits","url":"/docs/getting-started/providers/subq#limits","content":"The state window is advisory. decisionLimits() reports 376,000 estimated\nstate tokens, and the catalog records a model contextWindow of 393,216. Both\ncome from one live observation made on 2026-10-13 for NeuroLink (not by this\nchange): SubQ refused a request of 399,795 tokens with HTTP 400, and the message\nnames a maximum model length of 393,216 tokens; the largest request it answered\nhad 376,180 input tokens. So 393,216 is the maximum model length SubQ's own 400\nresponse states, and 376,000 is a margin under the largest request it answered.\nBoth are advisory: a longer state is sent, the server decides, and neither\nfigure is a guarantee. The 376,000 counts NeuroLink's estimated tokens, which can\ndiffer from the tokens SubQ counts, so a state near it can still be refused.\n\nSubQ answers an over-length request with HTTP 400 and a validation_error body\n(The decoder prompt (length 399795) is longer than the maximum model length of\n393216 ...). NeuroLink reports it as invalid_request, not retried; it is not\nreported as max_tokens_exceeded.\n\nNo question cap is declared. SubQ's documentation gives no count; a choice\nquestion takes 2 to 255 options, a score question 2 to 10 levels, and a\nquestion name up to 100 characters. SubQ refuses a request outside those with\nHTTP 422, which NeuroLink reports as invalid_request, with SubQ's reason when\nthe body is the documented object form.\n\nTimeout. The default is 5 seconds per attempt. A state near the window takes\nlonger to read than a short one, so size timeoutMs for the states you send.\n\nPrice. SubQ's documentation gives $0.05 per million input tokens and no\ncharge for output tokens (read on 2026-10-13; check the console for the current\nrate). Each response carries usage.input_tokens, which decide() returns as\nusage.inputTokens.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Limits","lvl3":""}},
6661
+ {"objectID":"1d299f5eff73ec92910a1c96e5e24965d2594c3f049ce8f0ba6a1d5dbb73bd02","title":"Limits","url":"/docs/getting-started/providers/subq#limits","content":"The state window is advisory. decisionLimits() reports 376,000 estimated\nstate tokens, and the catalog records a model contextWindow of 393,216. Both\ncome from one live observation made on 2026-10-13 for NeuroLink (not by this\nchange): SubQ refused a request of 399,795 tokens with HTTP 400, and the message\nnames a maximum model length of 393,216 tokens; the largest request it answered\nhad 376,180 input tokens. So 393,216 is the maximum model length SubQ's own 400\nresponse states, and 376,000 is a margin under the largest request it answered.\nBoth are advisory: a longer state is sent, the server decides, and neither\nfigure is a guarantee. The 376,000 counts NeuroLink's estimated tokens, which can\ndiffer from the tokens SubQ counts, so a state near it can still be refused.\n\nSubQ answers an over-length request with HTTP 400 and a validation_error body\n(The decoder prompt (length 399795) is longer than the maximum model length of\n393216 ...). NeuroLink reports it as invalid_request, not retried; it is not\nreported as max_tokens_exceeded.\n\nNo question cap is declared. SubQ's documentation gives no count; a choice\nquestion takes 2 to 255 options, a score question 2 to 10 levels, and a\nquestion name up to 100 characters. SubQ refuses a request outside those with\nHTTP 422, which NeuroLink reports as invalid_request, with SubQ's reason when\nthe body is the documented object form.\n\nTimeout. The default is 30 seconds per attempt. SubQ's catalog entry declares\nno timeouts.decideMs, so the 30 seconds of the provider base class applies; it\nis not the 5 seconds that TypeSafe, Laya and XOR declare. A timeout raised by\nNeuroLink's own clock before any response arrives is retried once, so a request\nthat never answers fails after about twice the limit (a loopback stand-in, not\nSubQ, that never answered was cut off at 30,000 ms and again after the retry,\n60.3 to 60.5 s in all, in three runs).","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Limits","lvl3":""}},
6662
6662
  {"objectID":"4c664b622160929b5860a9d062387141d6a2902dade93c7d7d8887e13ff8fc9d","title":"Images","url":"/docs/getting-started/providers/subq#images","content":"SubQ's documentation describes image input: up to 4 images per request, each an\nobject with a mediaType and a one-line base64 string, with no data:\nprefix. NeuroLink's decide() prepares images as data: URLs, and a catalog\nentry cannot yet describe the object form, so SubQ's entry declares no media.\nAn image attached to a decide() call for SubQ is refused before any request,\nas invalid_request, and the catalog marks the model vision: false. To\ndecide over images today, use XOR, Perplexity\nor Cloudflare Clef.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Images","lvl3":""}},
6663
6663
  {"objectID":"789f51fadc3b52d17f55a04b15240e2a8c4b722dae7a88131e99a18447fe3568","title":"Errors","url":"/docs/getting-started/providers/subq#errors","content":"SubQ's documentation gives an error body of {\"detail\": {\"error_type\": \"…\",\n\"message\": \"…\"}}. NeuroLink shows the message, or a detail that is a plain\nstring. A body in any other form, such as a detail that is an array, gives only\nSubQ request failed with HTTP <status>; the kind and the retry behaviour do not\nchange.\n\n| Reply | Kind | Retried |\n| ----- | ------------------------------------------------------------------------------------------ | ------- |\n| 401 | authentication — the provider instance stops retrying | no |\n| 402 | invalid_request — the account has no credits | no |\n| 403 | invalid_request — the key cannot use the model | no |\n| 400 | invalid_request, with SubQ's reason (for example a prompt past the maximum model length) | no |\n| 422 | invalid_request, with SubQ's reason (documented body form) | no |\n| 429 | rate_limit | yes |\n| 503 | overloaded | yes |\n| 5xx | server | yes |\n| other | invalid_request | no |\n| image | invalid_request, with no network call (see Images) | no |\n\nOnly a 401 stops the instance. A 402 is not treated as a rejected key on\npurpose: after you add credit, the same instance works again, with no restart.\nAn error message never carries the API key; if SubQ echoes it, NeuroLink\nreplaces it before the message reaches a log or an error.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Errors","lvl3":""}},
6664
6664
  {"objectID":"e2bf63ecccdffc248bdf0bee10df038bac383d491a3f3ce10694a3ec2acc7fa3","title":"Data retention","url":"/docs/getting-started/providers/subq#data-retention","content":"Check SubQ's data retention page\nbefore sending anything sensitive. SubQ's documentation, as read on 2026-10-13\n(a reading made before this page was written, and not repeated for it), says\nthat prompts are kept indefinitely unless the organization sets otherwise, and\nthat Decisions are unaffected by zero data retention. Check the page for the\ncurrent terms.","hierarchy":{"lvl0":"Getting Started","lvl1":"SubQ Provider Guide","lvl2":"Data retention","lvl3":""}},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "13.8.21",
3
+ "version": "13.8.23",
4
4
  "packageManager": "pnpm@10.34.7+sha512.upirxYVTmTM3W1lx9LxtbHOhtLftxKh559EC/lQj0eAjCdZ8YKEfBJVQk6luUhrZw7E4zdZUylvlY/N4s65IvQ==",
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": {