@juspay/neurolink 12.51.4 → 12.52.1

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.
@@ -100,6 +100,7 @@ export declare enum AIProviderName {
100
100
  WAFER = "wafer",
101
101
  WANDB_INFERENCE = "wandb-inference",
102
102
  XAI = "xai",
103
+ XIAOMI_MIMO = "xiaomi-mimo",
103
104
  Z_AI = "z-ai",
104
105
  COHERE = "cohere",
105
106
  REPLICATE = "replicate",
@@ -1751,6 +1752,9 @@ export declare enum XaiModels {
1751
1752
  GROK_2_VISION_LATEST = "grok-2-vision-latest",
1752
1753
  GROK_BETA = "grok-beta"
1753
1754
  }
1755
+ export declare enum XiaomiMimoModels {
1756
+ MIMO_V2_6_FLASH = "mimo-v2.6-flash"
1757
+ }
1754
1758
  export declare enum ZAiModels {
1755
1759
  GLM_5_3 = "glm-5.3",
1756
1760
  GLM_5_3_FLASH = "glm-5.3-flash",
@@ -105,6 +105,7 @@ export var AIProviderName;
105
105
  AIProviderName["WAFER"] = "wafer";
106
106
  AIProviderName["WANDB_INFERENCE"] = "wandb-inference";
107
107
  AIProviderName["XAI"] = "xai";
108
+ AIProviderName["XIAOMI_MIMO"] = "xiaomi-mimo";
108
109
  AIProviderName["Z_AI"] = "z-ai";
109
110
  // ── END GENERATED(provider-members) ──
110
111
  AIProviderName["COHERE"] = "cohere";
@@ -2071,6 +2072,10 @@ export var XaiModels;
2071
2072
  XaiModels["GROK_2_VISION_LATEST"] = "grok-2-vision-latest";
2072
2073
  XaiModels["GROK_BETA"] = "grok-beta";
2073
2074
  })(XaiModels || (XaiModels = {}));
2075
+ export var XiaomiMimoModels;
2076
+ (function (XiaomiMimoModels) {
2077
+ XiaomiMimoModels["MIMO_V2_6_FLASH"] = "mimo-v2.6-flash";
2078
+ })(XiaomiMimoModels || (XiaomiMimoModels = {}));
2074
2079
  export var ZAiModels;
2075
2080
  (function (ZAiModels) {
2076
2081
  ZAiModels["GLM_5_3"] = "glm-5.3";
@@ -1,5 +1,5 @@
1
1
  import type { DecideCatalogJson, ProviderCatalogJson } from "../../types/index.js";
2
2
  export declare const CATALOG_JSON_ENTRIES: ProviderCatalogJson[];
3
- export declare const CATALOG_PROVIDER_IDS: readonly ["a2agent", "abliteration", "above-dev", "ai21", "aiand", "aihubmix", "aionlabs", "ambient", "api-route", "arcee", "atlas-cloud", "avian-io", "baidu-qianfan", "baseten", "bee-heossi", "byteplus-modelark", "bytez", "cerebras", "charm-hyper", "chutes", "cloudflare", "crusoe", "dashscope", "deepinfra", "deepseek", "empiriolabs", "featherless-ai", "fireworks", "friendli", "gmicloud", "gradientai", "groq", "hetzner-inference", "huggingface", "inception-labs", "inceptron", "inco", "inference-net", "io-intelligence", "koscompute", "lemonfox-ai", "lilac", "llmtech", "mancer", "meta-model-api", "minimax", "mistral", "moark", "modelscope", "moonshot-ai", "morph", "naver-clova-studio", "nebius", "neuralwatt", "novita", "ovhcloud", "parasail", "pareto-inference", "perplexity", "poolside", "prime-intellect", "reka", "sakana-ai", "sambanova", "sarvam", "scaleway", "siliconflow", "stackit", "stepfun", "subconscious", "synthetic", "telnyx", "thinking-machines", "tinfoil", "together-ai", "umans-ai", "upstage", "venice-ai", "vispark", "vultr-inference", "wafer", "wandb-inference", "xai", "z-ai"];
3
+ export declare const CATALOG_PROVIDER_IDS: readonly ["a2agent", "abliteration", "above-dev", "ai21", "aiand", "aihubmix", "aionlabs", "ambient", "api-route", "arcee", "atlas-cloud", "avian-io", "baidu-qianfan", "baseten", "bee-heossi", "byteplus-modelark", "bytez", "cerebras", "charm-hyper", "chutes", "cloudflare", "crusoe", "dashscope", "deepinfra", "deepseek", "empiriolabs", "featherless-ai", "fireworks", "friendli", "gmicloud", "gradientai", "groq", "hetzner-inference", "huggingface", "inception-labs", "inceptron", "inco", "inference-net", "io-intelligence", "koscompute", "lemonfox-ai", "lilac", "llmtech", "mancer", "meta-model-api", "minimax", "mistral", "moark", "modelscope", "moonshot-ai", "morph", "naver-clova-studio", "nebius", "neuralwatt", "novita", "ovhcloud", "parasail", "pareto-inference", "perplexity", "poolside", "prime-intellect", "reka", "sakana-ai", "sambanova", "sarvam", "scaleway", "siliconflow", "stackit", "stepfun", "subconscious", "synthetic", "telnyx", "thinking-machines", "tinfoil", "together-ai", "umans-ai", "upstage", "venice-ai", "vispark", "vultr-inference", "wafer", "wandb-inference", "xai", "xiaomi-mimo", "z-ai"];
4
4
  export declare const DECIDE_CATALOG_JSON_ENTRIES: DecideCatalogJson[];
5
5
  export declare const DECIDE_CATALOG_PROVIDER_IDS: readonly ["laya"];
@@ -84,6 +84,7 @@ import vultrInferenceJson from "./vultr-inference.json" with { type: "json" };
84
84
  import waferJson from "./wafer.json" with { type: "json" };
85
85
  import wandbInferenceJson from "./wandb-inference.json" with { type: "json" };
86
86
  import xaiJson from "./xai.json" with { type: "json" };
87
+ import xiaomiMimoJson from "./xiaomi-mimo.json" with { type: "json" };
87
88
  import zAiJson from "./z-ai.json" with { type: "json" };
88
89
  import { isDecideCatalogEntry, parseCatalogEntry } from "./schema.js";
89
90
  const asDecideEntry = (raw) => {
@@ -177,6 +178,7 @@ export const CATALOG_JSON_ENTRIES = [
177
178
  waferJson,
178
179
  wandbInferenceJson,
179
180
  xaiJson,
181
+ xiaomiMimoJson,
180
182
  zAiJson,
181
183
  ];
182
184
  export const CATALOG_PROVIDER_IDS = [
@@ -263,6 +265,7 @@ export const CATALOG_PROVIDER_IDS = [
263
265
  "wafer",
264
266
  "wandb-inference",
265
267
  "xai",
268
+ "xiaomi-mimo",
266
269
  "z-ai",
267
270
  ];
268
271
  export const DECIDE_CATALOG_JSON_ENTRIES = [layaJson].map(asDecideEntry);
@@ -0,0 +1,63 @@
1
+ {
2
+ "$schema": "./provider-catalog.schema.json",
3
+ "id": "xiaomi-mimo",
4
+ "displayName": "Xiaomi MiMo",
5
+ "aliases": [],
6
+ "tier": 2,
7
+ "wire": {
8
+ "baseURL": "https://api.xiaomimimo.com/v1",
9
+ "apiKeyFallbackEnvVars": ["MIMO_API_KEY"]
10
+ },
11
+ "models": {
12
+ "default": "mimo-v2.6-flash",
13
+ "fallbacks": ["mimo-v2.6-flash"],
14
+ "defaultContextWindow": 1048576,
15
+ "defaultMaxOutputTokens": 131072,
16
+ "catalog": {
17
+ "mimo-v2.6-flash": {
18
+ "contextWindow": 1048576,
19
+ "maxOutputTokens": 131072,
20
+ "vision": false,
21
+ "status": "production",
22
+ "description": "Xiaomi MiMo's usage-priced mimo-v2.6-flash, the vendor's named replacement for the retiring mimo-v2.5. The vendor's OpenClaw and OpenCode integration guides bind the integers 1048576 (context) and 131072 (output) to this exact id, and its API reference gives [1, 131072] as the required range for max_completion_tokens (visible plus reasoning tokens). The model table shows only the rounded labels 1M and 128K, so nothing was expanded from it. This pilot declares text generate/stream; tools, vision, structured output and thinking controls await separate evidence. Account/model access is unverified."
23
+ }
24
+ }
25
+ },
26
+ "capabilities": {
27
+ "text": true,
28
+ "streaming": true,
29
+ "tools": false,
30
+ "toolsWithStreaming": false,
31
+ "structuredOutput": false,
32
+ "structuredOutputWithTools": false,
33
+ "embeddings": false,
34
+ "thinking": false
35
+ },
36
+ "errorRules": [],
37
+ "setup": {
38
+ "url": "https://platform.xiaomimimo.com/#/console/api-keys",
39
+ "apiKeyFormat": null,
40
+ "billingPolicy": "promotional-credit",
41
+ "instructions": [
42
+ "1. Sign in to the Xiaomi MiMo platform console with a Xiaomi account and create a pay-as-you-go API key at https://platform.xiaomimimo.com/#/console/api-keys.",
43
+ "2. mimo-v2.6-flash is usage-priced against your account balance. The vendor's promotions page describes bonus credit, from Refer & Earn or new-user registration, that offsets pay-as-you-go API usage and is currently valid for 40 days. Eligibility and amounts vary by campaign; your own entitlement and balance are unverified, and this is not a free tier.",
44
+ "3. Set {apiKeyEnvVar}. The vendor's own examples name the variable MIMO_API_KEY, which is read as a fallback. The key is sent as Authorization: Bearer to https://api.xiaomimimo.com/v1/chat/completions (the vendor also accepts an api-key header, which this entry does not use).",
45
+ "4. Token Plan keys are a separate subscription product and are not covered by this entry. The declared scope is text generate and stream with mimo-v2.6-flash."
46
+ ],
47
+ "description": "Xiaomi MiMo text/stream pilot with a usage-priced mimo-v2.6-flash default. Bonus credit is a campaign-dependent promotion that offsets API usage; no account entitlement, roster, live inference or delivery is verified."
48
+ },
49
+ "evidence": {
50
+ "rosterVerified": {
51
+ "date": "2026-10-10",
52
+ "code": "PUBLIC_DOCS_ONLY_NOT_ROSTER_VERIFIED",
53
+ "method": "Public documentation GETs only: mimo.mi.com model.md, api/chat/openai-api.md, tokenplan/integration/openclaw.md and opencode.md, quick-start/faq/promotions.md, price/pay-as-you-go.md and updates/deprecate.md. No vendor roster, auth, billing or inference probe ran; this legacy field does not assert roster verification."
54
+ },
55
+ "billingProbe": {
56
+ "date": "2026-10-10",
57
+ "code": "PUBLIC_DOCS_ONLY_ACCOUNT_NOT_TESTED",
58
+ "method": "Public documentation only: the pay-as-you-go page states the API consumes the account balance by actual token usage, and the promotions page states bonus credit offsets API usage and is currently valid for 40 days with campaign-dependent amounts. No account was created and no credit amount or eligibility was checked."
59
+ },
60
+ "liveMatrix": null,
61
+ "addedInPR": "https://github.com/juspay/neurolink/pull/1977"
62
+ }
63
+ }
@@ -5,6 +5,31 @@
5
5
  * Best for academic papers, scientific documents, and mathematical content.
6
6
  */
7
7
  import { randomUUID } from "crypto";
8
+ const BEGIN_DOCUMENT = "\\begin{document}";
9
+ const END_DOCUMENT = "\\end{document}";
10
+ /**
11
+ * Split a LaTeX source into the text before `\begin{document}` and the body up
12
+ * to the first `\end{document}` after it, or null when there is no such pair.
13
+ *
14
+ * This is what `/^([\s\S]*?)\\begin\{document\}([\s\S]*?)\\end\{document\}/`
15
+ * returned, without its cost: with no `\end{document}` in the text, that
16
+ * pattern rescanned to the end of the input from every `\begin{document}`,
17
+ * so N occurrences took O(N * length). If the first `\begin{document}` has no
18
+ * closing marker after it, a later one cannot either, so two `indexOf` calls
19
+ * decide the match and the work is linear.
20
+ */
21
+ function splitDocumentBody(text) {
22
+ const begin = text.indexOf(BEGIN_DOCUMENT);
23
+ if (begin === -1) {
24
+ return null;
25
+ }
26
+ const bodyStart = begin + BEGIN_DOCUMENT.length;
27
+ const end = text.indexOf(END_DOCUMENT, bodyStart);
28
+ if (end === -1) {
29
+ return null;
30
+ }
31
+ return { preamble: text.slice(0, begin), body: text.slice(bodyStart, end) };
32
+ }
8
33
  /**
9
34
  * LaTeX-aware chunker implementation
10
35
  * Splits based on LaTeX structure (sections, environments)
@@ -37,12 +62,12 @@ export class LaTeXChunker {
37
62
  return chunks;
38
63
  }
39
64
  // Extract preamble if present
40
- const preambleMatch = text.match(/^([\s\S]*?)\\begin\{document\}([\s\S]*?)\\end\{document\}/);
65
+ const documentParts = splitDocumentBody(text);
41
66
  let preamble = "";
42
67
  let documentContent = text;
43
- if (preambleMatch) {
44
- preamble = preambleMatch[1].trim();
45
- documentContent = preambleMatch[2];
68
+ if (documentParts) {
69
+ preamble = documentParts.preamble.trim();
70
+ documentContent = documentParts.body;
46
71
  // Add preamble as first chunk if requested
47
72
  if (includePreamble && preamble.length > 0) {
48
73
  chunks.push({
@@ -25,6 +25,10 @@ declare function diversifyResults(results: VectorQueryResult[], topK: number): V
25
25
  * @param ragConfig - RAG configuration from generate/stream options
26
26
  * @param fallbackProvider - Provider to use for embeddings if not specified in ragConfig
27
27
  * @returns Prepared RAG tool to inject into the tools record
28
+ * @throws When `files` is empty, when no source can be loaded, and when the
29
+ * built-in hash embedding is given a chunk longer than 1,048,576 characters (it
30
+ * is the default, and the fallback when a configured embedding provider fails).
31
+ * The returned tool rejects a query over the same length the same way.
28
32
  */
29
33
  export declare function prepareRAGTool(ragConfig: RAGConfig, fallbackProvider?: string): Promise<RAGPreparedTool>;
30
34
  export {};
@@ -4,6 +4,7 @@ import { z } from "zod";
4
4
  import { SpanSerializer, SpanType, SpanStatus, getMetricsAggregator, } from "../observability/index.js";
5
5
  import { logger } from "../utils/logger.js";
6
6
  import { redactUrlForError } from "../utils/logSanitize.js";
7
+ import { ErrorFactory } from "../utils/errorHandling.js";
7
8
  import { ImageProcessor } from "../utils/imageProcessor.js";
8
9
  import { createChunker } from "./ChunkerFactory.js";
9
10
  import { createVectorQueryTool, InMemoryVectorStore, } from "./retrieval/vectorQueryTool.js";
@@ -49,6 +50,22 @@ function detectStrategy(filePath) {
49
50
  }
50
51
  /** Embedding dimension used by {@link generateSimpleEmbedding}. */
51
52
  const EMBEDDING_DIMENSION = 128;
53
+ /**
54
+ * Longest text, in UTF-16 code units, that {@link generateSimpleEmbedding}
55
+ * will hash: 1,048,576.
56
+ *
57
+ * The 128-dimension output does not bound the work. The function walks every
58
+ * character and every word of its input, and nothing upstream limits that
59
+ * input: a chunk is as large as the caller's `chunkSize` allows, and a search
60
+ * query is whatever the model sends. A default chunk is 1,000 characters, so
61
+ * this is about a thousand times that and no ordinary input reaches it. Longer
62
+ * text is refused with an error rather than truncated, because a clipped text
63
+ * would be embedded as a different document and rank as one.
64
+ *
65
+ * It applies only to the hash embedding. A configured embedding provider
66
+ * receives the text as before and applies its own limits.
67
+ */
68
+ const MAX_HASH_EMBEDDING_TEXT_LENGTH = 1_048_576;
52
69
  /**
53
70
  * Simple hash function for strings (FNV-1a variant).
54
71
  * Maps a word to a bucket index deterministically.
@@ -68,6 +85,9 @@ function hashWord(word, buckets) {
68
85
  * When a real embedding provider is configured, it will be used instead.
69
86
  */
70
87
  function generateSimpleEmbedding(text, dimension) {
88
+ if (text.length > MAX_HASH_EMBEDDING_TEXT_LENGTH) {
89
+ throw ErrorFactory.invalidParameters("rag.hashEmbedding", new Error(`text is ${text.length} characters, over the ${MAX_HASH_EMBEDDING_TEXT_LENGTH} character limit of the built-in hash embedding. Lower chunkSize, shorten the query, or configure an embeddingProvider.`), { length: text.length, maxLength: MAX_HASH_EMBEDDING_TEXT_LENGTH });
90
+ }
71
91
  const charEmbedding = new Array(dimension).fill(0);
72
92
  const wordEmbedding = new Array(dimension).fill(0);
73
93
  // Character-frequency features
@@ -148,6 +168,10 @@ function diversifyResults(results, topK) {
148
168
  * @param ragConfig - RAG configuration from generate/stream options
149
169
  * @param fallbackProvider - Provider to use for embeddings if not specified in ragConfig
150
170
  * @returns Prepared RAG tool to inject into the tools record
171
+ * @throws When `files` is empty, when no source can be loaded, and when the
172
+ * built-in hash embedding is given a chunk longer than 1,048,576 characters (it
173
+ * is the default, and the fallback when a configured embedding provider fails).
174
+ * The returned tool rejects a query over the same length the same way.
151
175
  */
152
176
  export async function prepareRAGTool(ragConfig, fallbackProvider) {
153
177
  const span = SpanSerializer.createSpan(SpanType.RAG, "rag.prepare", {
@@ -356,6 +380,7 @@ async function _prepareRAGToolInner(ragConfig, fallbackProvider) {
356
380
  const embedProviderName = embeddingProvider || fallbackProvider || "vertex";
357
381
  const embedModelName = embeddingModel || "gemini-2.5-flash";
358
382
  let embedFn = (text) => Promise.resolve(generateSimpleEmbedding(text, EMBEDDING_DIMENSION));
383
+ let embeddingFromProvider = false;
359
384
  if (wantProviderEmbeddings) {
360
385
  try {
361
386
  const { AIProviderFactory } = await import("../core/factory.js");
@@ -363,6 +388,7 @@ async function _prepareRAGToolInner(ragConfig, fallbackProvider) {
363
388
  if (typeof embedderProvider.embed === "function") {
364
389
  const providerEmbed = embedderProvider.embed.bind(embedderProvider);
365
390
  embedFn = (text) => providerEmbed(text, embedModelName);
391
+ embeddingFromProvider = true;
366
392
  }
367
393
  else {
368
394
  logger.warn(`[RAG] Embedding provider '${embedProviderName}' has no embed(); falling back to hash embeddings`);
@@ -387,6 +413,12 @@ async function _prepareRAGToolInner(ragConfig, fallbackProvider) {
387
413
  imageVectors = allVectors.slice(allChunks.length);
388
414
  }
389
415
  catch (error) {
416
+ // The hash embedding refuses text over its length limit. With no provider
417
+ // in use there is nothing to fall back from, and retrying would only repeat
418
+ // that refusal after a log line claiming a provider failed.
419
+ if (!embeddingFromProvider) {
420
+ throw error;
421
+ }
390
422
  // One failed chunk must not leave a mixed-space index — flip the whole
391
423
  // index AND all queries back to the hash space together.
392
424
  logger.warn("[RAG] Provider embedding failed mid-index; falling back to hash embeddings for index and queries", { error: error instanceof Error ? error.message : String(error) });
@@ -456,7 +488,7 @@ async function _prepareRAGToolInner(ragConfig, fallbackProvider) {
456
488
  // would be scored against provider-space vectors of another
457
489
  // dimension, which cosine reads as 0 for every chunk, so the tool
458
490
  // would return arbitrary chunks as if they were relevant. A hash-built
459
- // index never reaches this — its embedFn cannot reject.
491
+ // index only rejects here for a query over the hash length limit.
460
492
  const queryEmbedding = await embedFn(query);
461
493
  // Fetch more candidates than needed so diversity can select across files and images
462
494
  const loadedSources = fileContents.length + imageChunks.length;
@@ -1,2 +1,2 @@
1
- export type CatalogProviderName = "a2agent" | "abliteration" | "above-dev" | "ai21" | "aiand" | "aihubmix" | "aionlabs" | "ambient" | "api-route" | "arcee" | "atlas-cloud" | "avian-io" | "baidu-qianfan" | "baseten" | "bee-heossi" | "byteplus-modelark" | "bytez" | "cerebras" | "charm-hyper" | "chutes" | "cloudflare" | "crusoe" | "dashscope" | "deepinfra" | "deepseek" | "empiriolabs" | "featherless-ai" | "fireworks" | "friendli" | "gmicloud" | "gradientai" | "groq" | "hetzner-inference" | "huggingface" | "inception-labs" | "inceptron" | "inco" | "inference-net" | "io-intelligence" | "koscompute" | "laya" | "lemonfox-ai" | "lilac" | "llmtech" | "mancer" | "meta-model-api" | "minimax" | "mistral" | "moark" | "modelscope" | "moonshot-ai" | "morph" | "naver-clova-studio" | "nebius" | "neuralwatt" | "novita" | "ovhcloud" | "parasail" | "pareto-inference" | "perplexity" | "poolside" | "prime-intellect" | "reka" | "sakana-ai" | "sambanova" | "sarvam" | "scaleway" | "siliconflow" | "stackit" | "stepfun" | "subconscious" | "synthetic" | "telnyx" | "thinking-machines" | "tinfoil" | "together-ai" | "umans-ai" | "upstage" | "venice-ai" | "vispark" | "vultr-inference" | "wafer" | "wandb-inference" | "xai" | "z-ai";
2
- export type CatalogCredentialKey = "a2agent" | "abliteration" | "aboveDev" | "ai21" | "aiand" | "aihubmix" | "aionlabs" | "ambient" | "apiRoute" | "arcee" | "atlasCloud" | "avianIo" | "baiduQianfan" | "baseten" | "beeHeossi" | "byteplusModelark" | "bytez" | "cerebras" | "charmHyper" | "chutes" | "cloudflare" | "crusoe" | "dashscope" | "deepinfra" | "deepseek" | "empiriolabs" | "featherlessAi" | "fireworks" | "friendli" | "gmicloud" | "gradientai" | "groq" | "hetznerInference" | "huggingFace" | "inceptionLabs" | "inceptron" | "inco" | "inferenceNet" | "ioIntelligence" | "koscompute" | "laya" | "lemonfoxAi" | "lilac" | "llmtech" | "mancer" | "metaModelApi" | "minimax" | "mistral" | "moark" | "modelscope" | "moonshotAi" | "morph" | "naverClovaStudio" | "nebius" | "neuralwatt" | "novita" | "ovhcloud" | "parasail" | "paretoInference" | "perplexity" | "poolside" | "primeIntellect" | "reka" | "sakanaAi" | "sambanova" | "sarvam" | "scaleway" | "siliconflow" | "stackit" | "stepfun" | "subconscious" | "synthetic" | "telnyx" | "thinkingMachines" | "tinfoil" | "together" | "umansAi" | "upstage" | "veniceAi" | "vispark" | "vultrInference" | "wafer" | "wandbInference" | "xai" | "zAi";
1
+ export type CatalogProviderName = "a2agent" | "abliteration" | "above-dev" | "ai21" | "aiand" | "aihubmix" | "aionlabs" | "ambient" | "api-route" | "arcee" | "atlas-cloud" | "avian-io" | "baidu-qianfan" | "baseten" | "bee-heossi" | "byteplus-modelark" | "bytez" | "cerebras" | "charm-hyper" | "chutes" | "cloudflare" | "crusoe" | "dashscope" | "deepinfra" | "deepseek" | "empiriolabs" | "featherless-ai" | "fireworks" | "friendli" | "gmicloud" | "gradientai" | "groq" | "hetzner-inference" | "huggingface" | "inception-labs" | "inceptron" | "inco" | "inference-net" | "io-intelligence" | "koscompute" | "laya" | "lemonfox-ai" | "lilac" | "llmtech" | "mancer" | "meta-model-api" | "minimax" | "mistral" | "moark" | "modelscope" | "moonshot-ai" | "morph" | "naver-clova-studio" | "nebius" | "neuralwatt" | "novita" | "ovhcloud" | "parasail" | "pareto-inference" | "perplexity" | "poolside" | "prime-intellect" | "reka" | "sakana-ai" | "sambanova" | "sarvam" | "scaleway" | "siliconflow" | "stackit" | "stepfun" | "subconscious" | "synthetic" | "telnyx" | "thinking-machines" | "tinfoil" | "together-ai" | "umans-ai" | "upstage" | "venice-ai" | "vispark" | "vultr-inference" | "wafer" | "wandb-inference" | "xai" | "xiaomi-mimo" | "z-ai";
2
+ export type CatalogCredentialKey = "a2agent" | "abliteration" | "aboveDev" | "ai21" | "aiand" | "aihubmix" | "aionlabs" | "ambient" | "apiRoute" | "arcee" | "atlasCloud" | "avianIo" | "baiduQianfan" | "baseten" | "beeHeossi" | "byteplusModelark" | "bytez" | "cerebras" | "charmHyper" | "chutes" | "cloudflare" | "crusoe" | "dashscope" | "deepinfra" | "deepseek" | "empiriolabs" | "featherlessAi" | "fireworks" | "friendli" | "gmicloud" | "gradientai" | "groq" | "hetznerInference" | "huggingFace" | "inceptionLabs" | "inceptron" | "inco" | "inferenceNet" | "ioIntelligence" | "koscompute" | "laya" | "lemonfoxAi" | "lilac" | "llmtech" | "mancer" | "metaModelApi" | "minimax" | "mistral" | "moark" | "modelscope" | "moonshotAi" | "morph" | "naverClovaStudio" | "nebius" | "neuralwatt" | "novita" | "ovhcloud" | "parasail" | "paretoInference" | "perplexity" | "poolside" | "primeIntellect" | "reka" | "sakanaAi" | "sambanova" | "sarvam" | "scaleway" | "siliconflow" | "stackit" | "stepfun" | "subconscious" | "synthetic" | "telnyx" | "thinkingMachines" | "tinfoil" | "together" | "umansAi" | "upstage" | "veniceAi" | "vispark" | "vultrInference" | "wafer" | "wandbInference" | "xai" | "xiaomiMimo" | "zAi";
@@ -529,6 +529,10 @@ export type NeurolinkCredentials = {
529
529
  apiKey?: string;
530
530
  baseURL?: string;
531
531
  };
532
+ xiaomiMimo?: {
533
+ apiKey?: string;
534
+ baseURL?: string;
535
+ };
532
536
  zAi?: {
533
537
  apiKey?: string;
534
538
  baseURL?: string;
@@ -9775,6 +9775,15 @@
9775
9775
  {"objectID":"1ad1b971263952542f0624327b54b7599081e5d8de4d5afbcc62c4ca39ec6e41","title":"Provenance and remaining gates","url":"/docs/provider-integration/pilots/aihubmix-source-pilot#provenance-and-remaining-gates","content":"The legacy evidence.rosterVerified slot contains the explicit\nPUBLIC_DOCS_ONLY_NOT_ROSTER_VERIFIED marker and documentation methods. It has\nno HTTP status, auth probe or billing probe. liveMatrix is null and the PR\nfield is the canonical introduction PR URL\n(https://github.com/juspay/neurolink/pull/1966), set after the PR existed; it was\nPENDING_PR while the work was local. Q04 source admission accepts either the\nmarker or a canonical introduction PR URL. Its source-stage report keeps roster, live, installed-package and delivery\nclaims separate and gives no provider-count credit. Structural parsing or\nsource-stage admission does not certify current account/API availability.\n\nThe Q04 successor starts from 08c3c4e4e2881874fdf0e453923a3507b759532d,\nwhich descends from the checked live release\n8c78cd172a8b2036b75132488f9d24548f2a1e88. Its public fixture is byte-identical\nto the original source freeze. The profile's only semantic change is the PR\nmarker required by Q04. Shared schema, runtime, helpers and original source\nreceipts are preserved. Actual Q04 source admission passed and reports zero\nprovider-count, roster, live, installed-package and publication credit.\n\nCanonical catalog generation affects the index, provider union, provider/model\nenum regions and generated credential region. The standalone frozen install,\ncanonical generation and fixed point, fresh SDK/CLI/browser build, normal lint,\nstrict source/tools/CI types and all 16 guarded public cases passed. Source\noutside the generated regions is preserved. A command-delimiter failure before\nQ04 admission was retained and corrected by invoking the same production\nvalidator directly; no source or fixture repair was required.\n\nIntegrated source/build/required suites, normal hooks and commit, any separately\nassigned production sensitivity controls and clean installed-consumer acceptance\nremain pending. Accounts, funding, provider inference, external delivery and\ntarget credit are separate.","hierarchy":{"lvl0":"Provider Integration","lvl1":"AIHubMix text and streaming pilot","lvl2":"Provenance and remaining gates","lvl3":""}},
9776
9776
  {"objectID":"d7aebf13c33ee0a84a4651090aa0b463a2225173acb7dd93f2456adb58d06729","title":"NAVER CLOVA Studio source pilot","url":"/docs/provider-integration/pilots/naver-clova-source-pilot","content":"NAVER CLOVA Studio source pilot\n\nThis source entry uses the OpenAI-compatible chat route at\nhttps://clovastudio.stream.ntruss.com/v1/openai/chat/completions, a CLOVA\nStudio-issued Bearer API key, and the documented HCX-005 model. No actual\naccount, key, model roster, inference or payment operation was performed.\n\nThe vendor Chat Completions v3 reference\nstates that HCX-005 input and output together cannot exceed 128,000 tokens and\nthat requested output cannot exceed 4,096 tokens. The\nOpenAI-compatible guide\nuses that same exact model ID. These are explicit per-model constraints, not\nconversion of an approximate context label.\n\nThe CLOVA Studio prerequisites\nstate that model, purpose and token usage incur fees. The official\nnew-signup credit policy, retrieved on\nOctober 9, 2026, offers 100,000 KRW of conditional discount credit after\npayment-method registration and an application. Issued credit lasts three\nmonths. Eligibility follows the policy at application time; recipients of\nother discounts cannot apply. Free/trial products, Marketplace purchases and\nNAVER WORKS are excluded.\n\nThe bounded promotional-credit billing value records that offer without\nreclassifying it as a free tier or a card-only requirement. It preserves all\nthree existing billing values. It does not prove that a current account is\neligible, subscribed, funded, or able to call the API. Numeric model pricing is\nomitted rather than inventing a KRW-to-USD conversion.\n\nThe shim supports tool choice auto, none and a named tool object, but not\nrequired. The public SDK can express required, so the provider-scoped\nrejectRequiredToolChoice guard rejects that intent on a nonempty-tools\nrequest before sending. It preserves the accepted choices and leaves other\nproviders unchanged. It never changes required into auto.\n\nparallel_tool_calls: false is a documented endpoint limitation, but no\nordinary SDK generate/stream input channel for it was established; this change\nadds no unreachable parameter DSL. The shim ignores JSON-schema name and\nstrict, so this initial entry does not advertise native strict-schema or\nunproved tools-plus-schema support. Other models, native v3 payloads/events,\nembeddings, images, and SDK effort controls remain outside this pilot.\n\nThe dedicated public contract covers SDK and built CLI defaults and routes,\nunique user prompts and backend answers, effective stream modes, exact output\nbudgets, invalid-model rejection, tool nonce round trips for accepted choices,\nand intentional rejection of required. A paired existing-provider control\nmust still honor required. These are owned-endpoint proofs, not vendor live\navailability.\n\nDOCS_ONLY_ROSTER_NOT_OBSERVED labels the legacy required evidence field as\nsource documentation only. addedInPR names the introduction PR\n(https://github.com/juspay/neurolink/pull/1966); it is not proof of merge. Source, contract, installed package, actual account/live and\nreview/delivery states stay separate. Generated regions and heavy validation\nremain coordinator-owned after this source handoff.","hierarchy":{"lvl0":"Provider Integration","lvl1":"NAVER CLOVA Studio source pilot","lvl2":"","lvl3":""}},
9777
9777
  {"objectID":"9d81c7d704b297c3886df857adf195cfb90daed24c49f8e64a69db25064c84c2","title":"NAVER CLOVA Studio source pilot","url":"/docs/provider-integration/pilots/naver-clova-source-pilot#naver-clova-studio-source-pilot","content":"This source entry uses the OpenAI-compatible chat route at\nhttps://clovastudio.stream.ntruss.com/v1/openai/chat/completions, a CLOVA\nStudio-issued Bearer API key, and the documented HCX-005 model. No actual\naccount, key, model roster, inference or payment operation was performed.\n\nThe vendor Chat Completions v3 reference\nstates that HCX-005 input and output together cannot exceed 128,000 tokens and\nthat requested output cannot exceed 4,096 tokens. The\nOpenAI-compatible guide\nuses that same exact model ID. These are explicit per-model constraints, not\nconversion of an approximate context label.\n\nThe CLOVA Studio prerequisites\nstate that model, purpose and token usage incur fees. The official\nnew-signup credit policy, retrieved on\nOctober 9, 2026, offers 100,000 KRW of conditional discount credit after\npayment-method registration and an application. Issued credit lasts three\nmonths. Eligibility follows the policy at application time; recipients of\nother discounts cannot apply. Free/trial products, Marketplace purchases and\nNAVER WORKS are excluded.\n\nThe bounded promotional-credit billing value records that offer without\nreclassifying it as a free tier or a card-only requirement. It preserves all\nthree existing billing values. It does not prove that a current account is\neligible, subscribed, funded, or able to call the API. Numeric model pricing is\nomitted rather than inventing a KRW-to-USD conversion.\n\nThe shim supports tool choice auto, none and a named tool object, but not\nrequired. The public SDK can express required, so the provider-scoped\nrejectRequiredToolChoice guard rejects that intent on a nonempty-tools\nrequest before sending. It preserves the accepted choices and leaves other\nproviders unchanged. It never changes required into auto.\n\nparallel_tool_calls: false is a documented endpoint limitation, but no\nordinary SDK generate/stream input channel for it was established; this change\nadds no unreachable parameter DSL.","hierarchy":{"lvl0":"Provider Integration","lvl1":"NAVER CLOVA Studio source pilot","lvl2":"NAVER CLOVA Studio source pilot","lvl3":""}},
9778
+ {"objectID":"a2a1b3f3eace26df9887f72342446b632c131c811f5b8d9a34eea9f58c1c1ae8","title":"Xiaomi MiMo text and streaming pilot","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot","content":"Xiaomi MiMo text and streaming pilot\n\nThis local source pilot selects Xiaomi MiMo's usage-priced mimo-v2.6-flash\nmodel through https://api.xiaomimimo.com/v1/chat/completions. Its declared\nscope is text generation and streaming. Source preparation, public contract\nacceptance, installed-package acceptance, current account/API availability and\ndelivery are separate gates. This draft gives no live, delivered-provider or\nprovider-target credit.\n\nExact source facts\n\nAll pages below are on the vendor's own documentation host, mimo.mi.com, and\nwere retrieved on 2026-10-10 (hashes at the end).\nContext and output integers. The model table (model.md) shows only the\n rounded labels 1M and 128K, so nothing was expanded from it. The integers\n come from two vendor-authored client configurations that bind them to the\n exact id mimo-v2.6-flash: the OpenClaw guide (\"contextWindow\": 1048576,\n \"maxTokens\": 131072) and the OpenCode guide (\"limit\": { \"context\": 1048576,\n\"output\": 131072 }). Both name https://api.xiaomimimo.com/v1 as the\n pay-as-you-go base URL. The two pages use different client schemas and agree.\n The API reference independently gives [1, 131072] as the required range of\n max_completion_tokens and a default of 131072 for mimo-v2.6-flash; that\n parameter covers visible plus reasoning tokens. No first-party prose or spec\n table states the context integer; the OpenClaw and OpenCode snippets are the\n only bindings, and 1048576 equals 1024 * 1024.\nRoute and auth. The API reference documents\n https://api.xiaomimimo.com/v1/chat/completions and two alternative headers,\n api-key: $MIMO_API_KEY and Authorization: Bearer $MIMO_API_KEY. This entry\n uses the Bearer form.\nLifecycle. mimo-v2.6-flash is current and is the named replacement for\n the retiring mimo-v2.5; it is not itself on a retirement schedule. The\n deprecation page gives mimo-v2.5 and mimo-v2.5-pro a 10:00 (UTC+8)\n switch on 2026-10-14 in its table and 18:00 (UTC+8) in a note on the same page.\n The discrepancy is preserved here; no exact switch instant is certified.\n\nBilling\n\nThe API is usage-priced: the pay-as-you-go page says it \"consumes the account\nbalance based on the actual Token usage\". The promotions page describes bonus\ncredit, obtained through Refer & Earn or new-user registration, that \"can be\nused to offset pay-as-you-go API usage\" and is \"currently valid for 40 days\".\nIt also says eligibility, credit amounts and payout rules vary by campaign. The\ncatalog therefore uses promotional-credit, following the\nNAVER CLOVA Studio profile (src/lib/providers/catalog/naver-clova-studio.json).\nThis is not a free tier. Whether a payment method or identity verification is\nrequired to obtain a working key was not established for the real-time API, the\ncredit amount and eligibility were not checked on an account, and prices are\nnot recorded (the pay-as-you-go page lists CNY and USD and they were not\nconverted).\n\nScope that is deliberately not declared\n\nThe capability booleans limit the pilot's declared scope; false is not\nevidence that the vendor lacks a feature. Tools, vision, structured output and\nSDK thinking controls are not declared because none has been probed. The\ndeprecation page notes that in thinking mode mimo-v2.6-flash ignores custom\ntemperature and top_p, so a thinking mode exists; this entry exposes no\ncontrol for it. Token Plan keys and base URLs are a separate subscription\nproduct and are out of scope.\n\nKnown gaps the local contract cannot close\nOutput-budget field name. The vendor's request reference lists only\n max_completion_tokens. The SDK's shared chat-completions base sends\n max_tokens, and the suite pins that observed field. Whether the vendor\n honors max_tokens, ignores it (leaving the model's 131072 default) or\n rejects it is unverified. A catalog entry cannot rename the field; that would\n need a provider hook or a new catalog quirk, which is an operator decision.\nStreaming usage option. A streaming request carries\n stream_options: { \"include_usage\": true }. The vendor's reference documents\n stream but not stream_options. The suite does not observe how the vendor\n responds to the extra field.\nEnvironment variable. The vendor's own examples name MIMO_API_KEY. The\n catalog's derived primary variable is XIAOMI_MIMO_API_KEY, and MIMO_API_KEY\n is read as a fallback through wire.apiKeyFallbackEnvVars, the mechanism the\n Sakana AI entry also uses. Removing the fallback is a one-line change if the\n maintainers prefer the pure convention.\nCeilings are source-bound only. The shared wire builder fits max_tokens\n only to runtime-discovered ceilings, so the catalog's contextWindow and\n maxOutputTokens never appear on the wire, and no public CLI command or SDK\n export was found that reads them back. The owned endpoint cannot observe\n them; they rest on the cited source bindings alone.\n\nLocal public contract\n\ntest/continuous-test-suite-xiaomi-mimo-pilot.ts runs 12 cases through the\nbuilt public SDK and built CLI, with opt","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"","lvl3":""}},
9779
+ {"objectID":"e6f0fe17d0287ca08aa0b72ec5e47ce773e8c8baf82de0948002899e1fec6fe6","title":"Xiaomi MiMo text and streaming pilot","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#xiaomi-mimo-text-and-streaming-pilot","content":"This local source pilot selects Xiaomi MiMo's usage-priced mimo-v2.6-flash\nmodel through https://api.xiaomimimo.com/v1/chat/completions. Its declared\nscope is text generation and streaming. Source preparation, public contract\nacceptance, installed-package acceptance, current account/API availability and\ndelivery are separate gates. This draft gives no live, delivered-provider or\nprovider-target credit.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Xiaomi MiMo text and streaming pilot","lvl3":""}},
9780
+ {"objectID":"cab460c84439c33f9cb5dcc1bd16e9235de01e05431b2d30b17098ec5e025e2a","title":"Exact source facts","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#exact-source-facts","content":"All pages below are on the vendor's own documentation host, mimo.mi.com, and\nwere retrieved on 2026-10-10 (hashes at the end).\nContext and output integers. The model table (model.md) shows only the\n rounded labels 1M and 128K, so nothing was expanded from it. The integers\n come from two vendor-authored client configurations that bind them to the\n exact id mimo-v2.6-flash: the OpenClaw guide (\"contextWindow\": 1048576,\n \"maxTokens\": 131072) and the OpenCode guide (\"limit\": { \"context\": 1048576,\n\"output\": 131072 }). Both name https://api.xiaomimimo.com/v1 as the\n pay-as-you-go base URL. The two pages use different client schemas and agree.\n The API reference independently gives [1, 131072] as the required range of\n max_completion_tokens and a default of 131072 for mimo-v2.6-flash; that\n parameter covers visible plus reasoning tokens. No first-party prose or spec\n table states the context integer; the OpenClaw and OpenCode snippets are the\n only bindings, and 1048576 equals 1024 * 1024.\nRoute and auth. The API reference documents\n https://api.xiaomimimo.com/v1/chat/completions and two alternative headers,\n api-key: $MIMO_API_KEY and Authorization: Bearer $MIMO_API_KEY. This entry\n uses the Bearer form.\nLifecycle. mimo-v2.6-flash is current and is the named replacement for\n the retiring mimo-v2.5; it is not itself on a retirement schedule. The\n deprecation page gives mimo-v2.5 and mimo-v2.5-pro a 10:00 (UTC+8)\n switch on 2026-10-14 in its table and 18:00 (UTC+8) in a note on the same page.\n The discrepancy is preserved here; no exact switch instant is certified.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Exact source facts","lvl3":""}},
9781
+ {"objectID":"99997193af8d5761fed491df17f7f0a49a60df721d802908183c25373c08fbb8","title":"Billing","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#billing","content":"The API is usage-priced: the pay-as-you-go page says it \"consumes the account\nbalance based on the actual Token usage\". The promotions page describes bonus\ncredit, obtained through Refer & Earn or new-user registration, that \"can be\nused to offset pay-as-you-go API usage\" and is \"currently valid for 40 days\".\nIt also says eligibility, credit amounts and payout rules vary by campaign. The\ncatalog therefore uses promotional-credit, following the\nNAVER CLOVA Studio profile (src/lib/providers/catalog/naver-clova-studio.json).\nThis is not a free tier. Whether a payment method or identity verification is\nrequired to obtain a working key was not established for the real-time API, the\ncredit amount and eligibility were not checked on an account, and prices are\nnot recorded (the pay-as-you-go page lists CNY and USD and they were not\nconverted).","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Billing","lvl3":""}},
9782
+ {"objectID":"a5c82cf3d766314a9407f86e5f8129fbe40aad5857bc783b97c61d4f8bfcb3c2","title":"Scope that is deliberately not declared","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#scope-that-is-deliberately-not-declared","content":"The capability booleans limit the pilot's declared scope; false is not\nevidence that the vendor lacks a feature. Tools, vision, structured output and\nSDK thinking controls are not declared because none has been probed. The\ndeprecation page notes that in thinking mode mimo-v2.6-flash ignores custom\ntemperature and top_p, so a thinking mode exists; this entry exposes no\ncontrol for it. Token Plan keys and base URLs are a separate subscription\nproduct and are out of scope.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Scope that is deliberately not declared","lvl3":""}},
9783
+ {"objectID":"b1920fcbf8becee8dcb34965fc790f5ca16fe64514dc33885cc42c21c8f46209","title":"Known gaps the local contract cannot close","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#known-gaps-the-local-contract-cannot-close","content":"Output-budget field name. The vendor's request reference lists only\n max_completion_tokens. The SDK's shared chat-completions base sends\n max_tokens, and the suite pins that observed field. Whether the vendor\n honors max_tokens, ignores it (leaving the model's 131072 default) or\n rejects it is unverified. A catalog entry cannot rename the field; that would\n need a provider hook or a new catalog quirk, which is an operator decision.\nStreaming usage option. A streaming request carries\n stream_options: { \"include_usage\": true }. The vendor's reference documents\n stream but not stream_options. The suite does not observe how the vendor\n responds to the extra field.\nEnvironment variable. The vendor's own examples name MIMO_API_KEY. The\n catalog's derived primary variable is XIAOMI_MIMO_API_KEY, and MIMO_API_KEY\n is read as a fallback through wire.apiKeyFallbackEnvVars, the mechanism the\n Sakana AI entry also uses. Removing the fallback is a one-line change if the\n maintainers prefer the pure convention.\nCeilings are source-bound only. The shared wire builder fits max_tokens\n only to runtime-discovered ceilings, so the catalog's contextWindow and\n maxOutputTokens never appear on the wire, and no public CLI command or SDK\n export was found that reads them back. The owned endpoint cannot observe\n them; they rest on the cited source bindings alone.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Known gaps the local contract cannot close","lvl3":""}},
9784
+ {"objectID":"8d988c1b9c9f17a568ba163469be0dcabd60611fd93e92101cc9ea8f7c27a857","title":"Local public contract","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#local-public-contract","content":"test/continuous-test-suite-xiaomi-mimo-pilot.ts runs 12 cases through the\nbuilt public SDK and built CLI, with optional --package-root support for a\nlater installed consumer:\n\n| Cases | Count | Required observation |\n| ------------------------------------------- | ----: | --------------------------------------------------------------------------------------------------------------------------------------- |\n| SDK/CLI generate/stream default | 4 | Actual catalog default, route, Bearer header, unique user prompt, max_tokens: 32, stream mode, no tools/tool choice, and fresh answer |\n| SDK/CLI generate/stream invalid explicit id | 4 | All wire preconditions pass before HTTP 400 rejection; no fallback or successful reply |\n| SDK and CLI generate, only MIMO_API_KEY | 2 | The vendor-documented variable alone reaches the wire as the Bearer credential |\n| SDK generate, both variables set | 1 | XIAOMI_MIMO_API_KEY wins; the fallback's value never reaches the wire |\n| SDK generate, no key | 1 | Refusal before any request, naming XIAOMI_MIMO_API_KEY |\n\nThe fixture strips real credentials before imports, uses temporary homes and\nsets the provider route to its owned random-port listener. Public\nMODEL_CONFIG_URL uses that same listener's HEAD /health and\nGET /api/v1/models. A schema-valid empty registry keeps the provider's actual\ncatalog default in control. Positive metadata initialization requires the exact\nordered request pair; explicit CLI model paths require no metadata request.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Local public contract","lvl3":""}},
9785
+ {"objectID":"ffc6f8c30e69161df522917d0ff982175110507d3cfcc174b2e5144f23773699","title":"Provenance and remaining gates","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#provenance-and-remaining-gates","content":"The legacy evidence.rosterVerified slot carries the explicit\nPUBLIC_DOCS_ONLY_NOT_ROSTER_VERIFIED marker and documentation methods; it has\nno HTTP status, auth probe or roster. billingProbe is likewise documentation\nonly. liveMatrix is null. addedInPR holds the canonical introduction PR URL,\nhttps://github.com/juspay/neurolink/pull/1977; it was PENDING_PR in the\nfirst commit, before the PR existed. A URL alone is\nnot proof of merge, and source-stage admission gives no provider-count, roster,\nlive, installed-package or publication credit.\n\nAuthenticated roster, account creation, funding, live inference, installed\nconsumer acceptance and delivery are separate and not done here.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Provenance and remaining gates","lvl3":""}},
9786
+ {"objectID":"af08e2fec005ca76c90a90418848d429bab413b64e1b8a2b1501bcbcb7f58827","title":"Source receipts","url":"/docs/provider-integration/pilots/xiaomi-mimo-source-pilot#source-receipts","content":"Retrieved with a plain GET on 2026-10-10; the SHA-256 is of each response body.\n\n| First-party source | Body SHA256 |\n| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |\n| Model table | 26a7f23c7a12410e10cc75610dc9e6c364a637495161f5d41bc2a21e1075ed84 |\n| OpenClaw integration | 4fab15ca323ac46f8c9905d5a82d7cb02023220f17d20ba21c69dce5b540c924 |\n| OpenCode integration | d39cb672b9f9da03f3da00e83c964849bfdf3f9d06ca54efbbabd5374aa8c376 |\n| OpenAI-compatible API reference | 1be241b9a882b3c70954e8ec04031cb657b06c8e0b0bbb8511e5b6ec63b82ae7 |\n| Promotions FAQ | 63e8515066b5ec06a61e71262b4a5f41b945f9bd4e540b76299f3437880223e7 |\n| Pay-as-you-go pricing | f62427a339e91edbb252cc6b54cac92050d4254483b1e7eb97a234d6d32f947b |\n| Deprecation schedule | f5c856884116df8ebba552550ec5c6912b1d0bd8edad66e2bf1e973da6270068 |","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Source receipts","lvl3":""}},
9778
9787
  {"objectID":"bf3e1f8f1233a9b3d12aedbdbec4bf8cd196d18bf56b7bb104b34e31e90b61e0","title":"Provider Onboarding Tiers","url":"/docs/provider-integration/tiers/README","content":"Provider Onboarding Tiers\n\nFour tiers, ordered by effort. Always pick the lowest tier that's\nactually true for the provider you're adding — a provider that's\nOpenAI-wire-compatible but gets built as a bespoke Tier 3 subclass \"to be\nsafe\" is exactly the copy-pasted-boilerplate problem this redesign\nexists to eliminate (see ../adr/0002-catalog-over-subclass-default.md).\n\nProvider Integration index\n\n| Tier | Example | Code required | Time |\n| -------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------------- |\n| 1 — Aggregator passthrough | A new model id on an existing LiteLLM/OpenRouter route | None | Minutes |\n| 2 — Catalog entry | A new zero-quirk OpenAI-compatible vendor (the Groq/xAI/Together shape) | One data row + one mocked-test section | ~1 hour |\n| 3 — Adapter-based native | A vendor with its own SDK/wire format but a normal request/response HTTP lifecycle | One provider class | Days |\n| 4 — Full custom | SageMaker-class: non-HTTP protocol, SDK-signed auth, bespoke lifecycle | Custom executeStream/doGenerate, possibly own CLI subcommands | Days, needs written justification |\n\nTier 1 adds zero provider coverage — it is a usage change against an\nalready-counted aggregator, never reflected in\ndocs/reference/provider-comparison.md or the README's provider count.\n\nEvery tier that adds a new AIProviderName member (Tier 2 and above) ends\nthe same way: a manifest at\ndocs/provider-integration/manifests/<provider>.json\n(see ../manifests/README.md) and a green run\nof pnpm run verify:provider-onboarding (see\n../../../tools/verify-provider-onboarding.ts).\nTier 1 needs no manifest and no gate — see\ntier-1-aggregator-passthrough.md.\n\nUse ../../../tools/scaffold-provider.ts\n(pnpm run scaffold:provider) to generate the starting-point snippets for\nTiers 2–4 instead of copy-pasting from an existing provider by hand. Both\ntools ship in the tree; there is no manual-fallback era anymore — a PR\nthat skips the gate locally just fails it in CI.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Onboarding Tiers","lvl2":"","lvl3":""}},
9779
9788
  {"objectID":"de01fcaf93bee302e2fca5e18f85cba5def099685383ec01b61d18489dbca5aa","title":"Provider Onboarding Tiers","url":"/docs/provider-integration/tiers/README#provider-onboarding-tiers","content":"Four tiers, ordered by effort. Always pick the lowest tier that's\nactually true for the provider you're adding — a provider that's\nOpenAI-wire-compatible but gets built as a bespoke Tier 3 subclass \"to be\nsafe\" is exactly the copy-pasted-boilerplate problem this redesign\nexists to eliminate (see ../adr/0002-catalog-over-subclass-default.md).\n\nProvider Integration index\n\n| Tier | Example | Code required | Time |\n| -------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------------- |\n| 1 — Aggregator passthrough | A new model id on an existing LiteLLM/OpenRouter route | None | Minutes |\n| 2 — Catalog entry | A new zero-quirk OpenAI-compatible vendor (the Groq/xAI/Together shape) | One data row + one mocked-test section | ~1 hour |\n| 3 — Adapter-based native | A vendor with its own SDK/wire format but a normal request/response HTTP lifecycle | One provider class | Days |\n| 4 — Full custom | SageMaker-class: non-HTTP protocol, SDK-signed auth, bespoke lifecycle | Custom executeStream/doGenerate, possibly own CLI subcommands | Days, needs written justification |\n\nTier 1 adds zero provider coverage — it is a usage change against an\nalready-counted aggregator, never reflected in\ndocs/reference/provider-comparison.md or the README's provider count.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Onboarding Tiers","lvl2":"Provider Onboarding Tiers","lvl3":""}},
9780
9789
  {"objectID":"a9753e41ed762a57c15471c49e70dc9917e8388eca055e3dc1c4ce90db6804bb","title":"Tier 1 — Aggregator Passthrough","url":"/docs/provider-integration/tiers/tier-1-aggregator-passthrough","content":"Tier 1 — Aggregator Passthrough\n\nWhen this applies: the model you want is already reachable through a\nprovider NeuroLink already registers as a pass-through aggregator —\ntoday that's litellm (any backend the user's LiteLLM proxy exposes) or\nopenrouter (any model in OpenRouter's catalog). No new\nAIProviderName member, no new provider class, no new catalog row.\n\nWhat you're actually doing: picking a model id string and confirming\nit works — this is a usage change, not an integration change.\n\nChecklist\n[ ] Confirm the aggregator actually serves the model. For LiteLLM,\n check the proxy's /v1/models (or its config.yaml) for the\n model's model_name. For OpenRouter, check\n https://openrouter.ai/models for the exact vendor/model-id\n slug.\n[ ] No AIProviderName enum change. No PROVIDER_DESCRIPTORS change.\n No OPENAI_COMPAT_CATALOG change. If you find yourself editing any\n of those three for a \"Tier 1\" provider, it isn't Tier 1 — restart\n from ../tiers/README.md's decision tree.\n[ ] Optional: if the model needs a friendlier default alias, add it to\n MODEL_ALIASES / DEFAULT_MODEL_ALIASES in\n src/lib/models/modelRegistry.ts. Not required for the model to\n work.\n[ ] Optional: if the model needs a documented env var (e.g., a\n dedicated LiteLLM route), document it in\n docs/getting-started/environment-variables.md.\n[ ] Manually smoke-test the model end-to-end.\n[ ] No manifest file is required — tools/verify-provider-onboarding.ts\n (see ../../../tools/verify-provider-onboarding.ts) only gates\n new AIProviderName members, and Tier 1 never adds one.\n[ ] Confirmed: no edit to docs/reference/provider-comparison.md or\n README provider count for this change.\n\nVerification commands\n\nBoth should return a normal GenerateResult with non-empty content. If\neither 400s with an \"unknown model\" style error, the aggregator doesn't\nactually serve that model yet — fix the aggregator-side config, not\nNeuroLink.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Tier 1 — Aggregator Passthrough","lvl2":"","lvl3":""}},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "12.51.4",
3
+ "version": "12.52.1",
4
4
  "packageManager": "pnpm@10.15.1",
5
5
  "description": "The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002/call) for routing, tool selection and context budgeting. MCP-native (4 transports), voice TTS/STT/realtime, RAG, agents, memory, compaction, 9 observability exporters. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · TypeSafe Jev and more.",
6
6
  "author": {
@@ -162,9 +162,11 @@
162
162
  "test:provider-fallback-latency": "pnpm exec tsx test/continuous-test-suite-provider-fallback-latency.ts",
163
163
  "test:provider-wiring": "pnpm exec tsx test/continuous-test-suite-provider-wiring.ts",
164
164
  "test:embedding-response-validation": "pnpm exec tsx test/continuous-test-suite-embedding-response-validation.ts",
165
+ "test:xiaomi-mimo-pilot": "pnpm exec tsx test/continuous-test-suite-xiaomi-mimo-pilot.ts",
165
166
  "test:pdf-image-streaming": "pnpm exec tsx test/continuous-test-suite-pdf-image-streaming.ts",
166
167
  "test:rag": "pnpm exec tsx test/continuous-test-suite-rag.ts",
167
168
  "test:rag-html-markup": "pnpm exec tsx test/continuous-test-suite-rag-html-markup.ts",
169
+ "test:rag-bounds": "pnpm exec tsx test/continuous-test-suite-rag-bounds.ts",
168
170
  "test:skills": "pnpm exec tsx test/continuous-test-suite-skills.ts",
169
171
  "test:decide": "pnpm exec tsx test/continuous-test-suite-decide.ts",
170
172
  "test:decide-catalog": "pnpm exec tsx test/continuous-test-suite-decide-catalog.ts",
@@ -219,7 +221,7 @@
219
221
  "// CI tier — fast, no live AI calls, safe for every commit (test:unit; also see the separate provider-safety-net CI job, which runs build + test:providers-mocked + test:provider-structure + test:error-classifier-contract on every PR)": "",
220
222
  "test:tool-routing": "pnpm exec tsx test/continuous-test-suite-tool-routing.ts",
221
223
  "test:tool-routing-semantic": "pnpm exec tsx test/continuous-test-suite-tool-routing-semantic.ts",
222
- "test:unit": "pnpm run test:bugfixes && pnpm run test:mcp:infra && pnpm run test:mcp:spans && pnpm run test:tool-routing && pnpm run test:tool-routing-cli && pnpm run test:tool-dedup && pnpm run test:model-pool && pnpm run test:classifier-router && pnpm run test:tool-routing-semantic && pnpm run test:mcp-result-cache && pnpm run test:mcp-direct-name-repair && pnpm run test:mcp-breaker-resolved-errors && pnpm run test:archive:security && pnpm run test:office:security && pnpm run test:image-exif && pnpm run test:vector-chroma && pnpm run test:vector-pgvector && pnpm run test:vector-pinecone && pnpm run test:provider-wiring && pnpm run test:docs-mcp && pnpm run test:retired-model-defaults && pnpm run test:cli-fallback && pnpm run test:embedding-response-validation",
224
+ "test:unit": "pnpm run test:bugfixes && pnpm run test:mcp:infra && pnpm run test:mcp:spans && pnpm run test:tool-routing && pnpm run test:tool-routing-cli && pnpm run test:tool-dedup && pnpm run test:model-pool && pnpm run test:classifier-router && pnpm run test:tool-routing-semantic && pnpm run test:mcp-result-cache && pnpm run test:mcp-direct-name-repair && pnpm run test:mcp-breaker-resolved-errors && pnpm run test:archive:security && pnpm run test:office:security && pnpm run test:image-exif && pnpm run test:vector-chroma && pnpm run test:vector-pgvector && pnpm run test:vector-pinecone && pnpm run test:provider-wiring && pnpm run test:docs-mcp && pnpm run test:retired-model-defaults && pnpm run test:cli-fallback && pnpm run test:embedding-response-validation && pnpm run test:xiaomi-mimo-pilot && pnpm run test:rag-bounds",
223
225
  "// CI tier — live providers, runs only when API keys are present (test:credentials and test:dynamic make real provider calls when keys are set, so they live here, not in test:unit; test:matrix, a different suite covering the full provider capability matrix, runs nightly via .github/workflows/live-matrix.yml — test:providers itself is still only wired into test:live, not any GitHub Actions workflow)": "",
224
226
  "test:live": "pnpm run test:providers && pnpm run test:mcp:http && pnpm run test:mcp:sdk && pnpm run test:mcp:cli && pnpm run test:observability && pnpm run test:context && pnpm run test:memory && pnpm run test:tool-reliability && pnpm run test:evaluation && pnpm run test:autoresearch && pnpm run test:credentials && pnpm run test:dynamic && pnpm run test:model-not-found-retryable",
225
227
  "// CI tier — product output (image/video/TTS/PPT) — costs $$ per run (not wired into any GitHub Actions workflow as of this comment; run manually or add to live-matrix.yml if nightly coverage is needed)": "",