@juspay/neurolink 12.54.2 → 12.55.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.
- package/CHANGELOG.md +2 -2
- package/dist/browser/neurolink.min.js +390 -390
- package/dist/constants/enums.d.ts +4 -0
- package/dist/constants/enums.js +5 -0
- package/dist/providers/catalog/index.generated.d.ts +1 -1
- package/dist/providers/catalog/index.generated.js +3 -0
- package/dist/providers/catalog/loader.d.ts +1 -0
- package/dist/providers/catalog/loader.js +7 -0
- package/dist/providers/catalog/provider-catalog.schema.json +8 -0
- package/dist/providers/catalog/runinfra.json +71 -0
- package/dist/providers/catalog/schema.d.ts +2 -0
- package/dist/providers/catalog/schema.js +2 -0
- package/dist/providers/catalog/xiaomi-mimo.json +4 -0
- package/dist/providers/configuredOpenAICompat.d.ts +5 -0
- package/dist/providers/configuredOpenAICompat.js +19 -1
- package/dist/providers/openaiChatCompletionsBase.d.ts +8 -4
- package/dist/providers/openaiChatCompletionsBase.js +18 -11
- package/dist/types/providerCatalog.d.ts +6 -0
- package/dist/types/providerCatalog.generated.d.ts +2 -2
- package/dist/types/providers.d.ts +9 -0
- package/docs-site/static/search-index.json +14 -3
- package/package.json +4 -2
|
@@ -80,6 +80,7 @@ export declare enum AIProviderName {
|
|
|
80
80
|
POOLSIDE = "poolside",
|
|
81
81
|
PRIME_INTELLECT = "prime-intellect",
|
|
82
82
|
REKA = "reka",
|
|
83
|
+
RUNINFRA = "runinfra",
|
|
83
84
|
SAKANA_AI = "sakana-ai",
|
|
84
85
|
SAMBANOVA = "sambanova",
|
|
85
86
|
SARVAM = "sarvam",
|
|
@@ -1537,6 +1538,9 @@ export declare enum RekaModels {
|
|
|
1537
1538
|
REKA_EDGE = "reka-edge",
|
|
1538
1539
|
REKA_EDGE_2603 = "reka-edge-2603"
|
|
1539
1540
|
}
|
|
1541
|
+
export declare enum RunInfraModels {
|
|
1542
|
+
NEMOTRON_3_5_LIGHTNING_30B = "nemotron-3-5-lightning-30b"
|
|
1543
|
+
}
|
|
1540
1544
|
export declare enum SakanaAiModels {
|
|
1541
1545
|
FUGU = "fugu",
|
|
1542
1546
|
FUGU_ULTRA = "fugu-ultra",
|
package/dist/constants/enums.js
CHANGED
|
@@ -85,6 +85,7 @@ export var AIProviderName;
|
|
|
85
85
|
AIProviderName["POOLSIDE"] = "poolside";
|
|
86
86
|
AIProviderName["PRIME_INTELLECT"] = "prime-intellect";
|
|
87
87
|
AIProviderName["REKA"] = "reka";
|
|
88
|
+
AIProviderName["RUNINFRA"] = "runinfra";
|
|
88
89
|
AIProviderName["SAKANA_AI"] = "sakana-ai";
|
|
89
90
|
AIProviderName["SAMBANOVA"] = "sambanova";
|
|
90
91
|
AIProviderName["SARVAM"] = "sarvam";
|
|
@@ -1837,6 +1838,10 @@ export var RekaModels;
|
|
|
1837
1838
|
RekaModels["REKA_EDGE"] = "reka-edge";
|
|
1838
1839
|
RekaModels["REKA_EDGE_2603"] = "reka-edge-2603";
|
|
1839
1840
|
})(RekaModels || (RekaModels = {}));
|
|
1841
|
+
export var RunInfraModels;
|
|
1842
|
+
(function (RunInfraModels) {
|
|
1843
|
+
RunInfraModels["NEMOTRON_3_5_LIGHTNING_30B"] = "nemotron-3-5-lightning-30b";
|
|
1844
|
+
})(RunInfraModels || (RunInfraModels = {}));
|
|
1840
1845
|
export var SakanaAiModels;
|
|
1841
1846
|
(function (SakanaAiModels) {
|
|
1842
1847
|
SakanaAiModels["FUGU"] = "fugu";
|
|
@@ -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", "longcat", "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"];
|
|
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", "longcat", "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", "runinfra", "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"];
|
|
@@ -64,6 +64,7 @@ import perplexityJson from "./perplexity.json" with { type: "json" };
|
|
|
64
64
|
import poolsideJson from "./poolside.json" with { type: "json" };
|
|
65
65
|
import primeIntellectJson from "./prime-intellect.json" with { type: "json" };
|
|
66
66
|
import rekaJson from "./reka.json" with { type: "json" };
|
|
67
|
+
import runinfraJson from "./runinfra.json" with { type: "json" };
|
|
67
68
|
import sakanaAiJson from "./sakana-ai.json" with { type: "json" };
|
|
68
69
|
import sambanovaJson from "./sambanova.json" with { type: "json" };
|
|
69
70
|
import sarvamJson from "./sarvam.json" with { type: "json" };
|
|
@@ -159,6 +160,7 @@ export const CATALOG_JSON_ENTRIES = [
|
|
|
159
160
|
poolsideJson,
|
|
160
161
|
primeIntellectJson,
|
|
161
162
|
rekaJson,
|
|
163
|
+
runinfraJson,
|
|
162
164
|
sakanaAiJson,
|
|
163
165
|
sambanovaJson,
|
|
164
166
|
sarvamJson,
|
|
@@ -247,6 +249,7 @@ export const CATALOG_PROVIDER_IDS = [
|
|
|
247
249
|
"poolside",
|
|
248
250
|
"prime-intellect",
|
|
249
251
|
"reka",
|
|
252
|
+
"runinfra",
|
|
250
253
|
"sakana-ai",
|
|
251
254
|
"sambanova",
|
|
252
255
|
"sarvam",
|
|
@@ -6,4 +6,5 @@ export declare function freezeCatalogCopy<T>(value: T): T;
|
|
|
6
6
|
export declare function getCatalogJsonEntries(): readonly ProviderCatalogJson[];
|
|
7
7
|
/** The `decide` entries, copied and frozen exactly as getCatalogJsonEntries() does. */
|
|
8
8
|
export declare function getDecideCatalogEntries(): readonly DecideCatalogJson[];
|
|
9
|
+
/** Build runtime provider entries with only the quirks each catalog opts into. */
|
|
9
10
|
export declare function buildCatalogEntries(): OpenAICompatCatalogEntry[];
|
|
@@ -118,6 +118,7 @@ export function getCatalogJsonEntries() {
|
|
|
118
118
|
export function getDecideCatalogEntries() {
|
|
119
119
|
return freezeCatalogCopy(DECIDE_CATALOG_JSON_ENTRIES);
|
|
120
120
|
}
|
|
121
|
+
/** Build runtime provider entries with only the quirks each catalog opts into. */
|
|
121
122
|
export function buildCatalogEntries() {
|
|
122
123
|
return CATALOG_JSON_ENTRIES.map((entry) => {
|
|
123
124
|
// Only models whose entry sets `tools` explicitly contribute a row —
|
|
@@ -171,6 +172,12 @@ export function buildCatalogEntries() {
|
|
|
171
172
|
base.baseURLEnvVar = catalogEnvVar(entry, "baseURL");
|
|
172
173
|
base.defaultBaseURL = entry.wire.baseURL;
|
|
173
174
|
}
|
|
175
|
+
if (entry.quirks?.maxTokensField) {
|
|
176
|
+
base.maxTokensField = entry.quirks.maxTokensField;
|
|
177
|
+
}
|
|
178
|
+
if (entry.quirks?.omitStreamOptions !== undefined) {
|
|
179
|
+
base.omitStreamOptions = entry.quirks.omitStreamOptions;
|
|
180
|
+
}
|
|
174
181
|
if (entry.quirks?.messageContentFormat) {
|
|
175
182
|
base.messageContentFormat = entry.quirks.messageContentFormat;
|
|
176
183
|
}
|
|
@@ -416,6 +416,14 @@
|
|
|
416
416
|
"type": "object",
|
|
417
417
|
"additionalProperties": false,
|
|
418
418
|
"properties": {
|
|
419
|
+
"maxTokensField": {
|
|
420
|
+
"const": "max_completion_tokens",
|
|
421
|
+
"description": "Send the caller's fitted maxTokens budget as max_completion_tokens and omit max_tokens. Omitted preserves the ordinary field."
|
|
422
|
+
},
|
|
423
|
+
"omitStreamOptions": {
|
|
424
|
+
"type": "boolean",
|
|
425
|
+
"description": "Omit stream_options for endpoints that do not document that extension. Does not discard usage returned without requesting it."
|
|
426
|
+
},
|
|
419
427
|
"timeoutErrorClass": {
|
|
420
428
|
"const": "provider"
|
|
421
429
|
},
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "runinfra",
|
|
4
|
+
"displayName": "RunInfra",
|
|
5
|
+
"enumTypeName": "RunInfraModels",
|
|
6
|
+
"aliases": [],
|
|
7
|
+
"tier": 2,
|
|
8
|
+
"wire": {
|
|
9
|
+
"baseURL": "https://api.runinfra.ai/v1",
|
|
10
|
+
"envOverrides": { "apiKey": "RUNINFRA_GATEWAY_KEY" },
|
|
11
|
+
"apiKeyFallbackEnvVars": ["RUNINFRA_API_KEY"]
|
|
12
|
+
},
|
|
13
|
+
"models": {
|
|
14
|
+
"default": "nemotron-3-5-lightning-30b",
|
|
15
|
+
"fallbacks": ["nemotron-3-5-lightning-30b"],
|
|
16
|
+
"defaultContextWindow": 262144,
|
|
17
|
+
"defaultMaxOutputTokens": 262144,
|
|
18
|
+
"catalog": {
|
|
19
|
+
"nemotron-3-5-lightning-30b": {
|
|
20
|
+
"contextWindow": 262144,
|
|
21
|
+
"maxOutputTokens": 262144,
|
|
22
|
+
"vision": false,
|
|
23
|
+
"status": "production",
|
|
24
|
+
"description": "Nemotron 3.5 Lightning 30B on RunInfra Model APIs, the only model this pilot lists. The vendor's copyable examples send exactly nemotron-3-5-lightning-30b as the model; the model page also shows the upstream served name nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16, which is not the id sent. The model page states a 262,144-token context window and 262,144 maximum generated output tokens. The chat-completions reference caps one request's output at the model's remaining context (its window minus your prompt) and clamps oversized values, so 262,144 output is a ceiling, not capacity beside a full prompt. This pilot declares text generate/stream only; tools, structured output, thinking and vision are not declared, which bounds this pilot and is not a claim the vendor lacks them. Availability is a runtime field and is unverified."
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"capabilities": {
|
|
29
|
+
"text": true,
|
|
30
|
+
"streaming": true,
|
|
31
|
+
"tools": false,
|
|
32
|
+
"toolsWithStreaming": false,
|
|
33
|
+
"structuredOutput": false,
|
|
34
|
+
"structuredOutputWithTools": false,
|
|
35
|
+
"embeddings": false,
|
|
36
|
+
"thinking": false
|
|
37
|
+
},
|
|
38
|
+
"errorRules": [
|
|
39
|
+
{
|
|
40
|
+
"status": 401,
|
|
41
|
+
"class": "authentication",
|
|
42
|
+
"message": "RunInfra answered 401. The vendor's authentication page lists 401 Invalid API key and 401 API key has expired. Check {apiKeyEnvVar} and the workspace API key at {setupUrl}."
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"setup": {
|
|
46
|
+
"url": "https://runinfra.ai/settings/api-keys",
|
|
47
|
+
"apiKeyFormat": null,
|
|
48
|
+
"billingPolicy": "promotional-credit",
|
|
49
|
+
"instructions": [
|
|
50
|
+
"1. Sign in to RunInfra and create a workspace API key under Settings > API keys at https://runinfra.ai/settings/api-keys. The vendor's authentication page says to send a workspace API key in an Authorization: Bearer header.",
|
|
51
|
+
"2. nemotron-3-5-lightning-30b is usage-priced per token in USD (the model page lists input, cached input and output rates per 1M tokens; rates may change). The vendor's plans page lists prepaid credits worth $1 each with a $5 minimum top-up, and a $1 signup credit, once per account, that it says never expires. Whether your account holds that credit is unverified, and this is not a free tier.",
|
|
52
|
+
"3. Set {apiKeyEnvVar}. The vendor's curl and SDK examples name RUNINFRA_GATEWAY_KEY, and its export block also sets RUNINFRA_API_KEY to the same value, which is read as a fallback. The key is sent as Authorization: Bearer to https://api.runinfra.ai/v1/chat/completions.",
|
|
53
|
+
"4. The vendor's chat-completions reference says a hosted model can be temporarily paused and then answers 503 with code hosted_model_paused. Availability of nemotron-3-5-lightning-30b to your account is unverified. The declared scope is text generate and stream with nemotron-3-5-lightning-30b."
|
|
54
|
+
],
|
|
55
|
+
"description": "RunInfra text/stream pilot with a usage-priced nemotron-3-5-lightning-30b default. The vendor's plans page lists a one-time signup credit; no account entitlement, roster, live inference, availability or delivery is verified."
|
|
56
|
+
},
|
|
57
|
+
"evidence": {
|
|
58
|
+
"rosterVerified": {
|
|
59
|
+
"date": "2026-10-12",
|
|
60
|
+
"code": "VENDOR_DOCS_ONLY_NOT_ROSTER_VERIFIED",
|
|
61
|
+
"method": "Public vendor page GETs only: runinfra.ai/inference-api/nemotron-3-5-lightning-30b, docs/tools-sdks/openai-compatibility, docs/api-reference/chat-completions.md and authentication.md, docs/introduction/plans.md and docs/changelog.md. No GET /v1/models, credentials, account or inference ran; this legacy field does not assert roster verification."
|
|
62
|
+
},
|
|
63
|
+
"billingProbe": {
|
|
64
|
+
"date": "2026-10-12",
|
|
65
|
+
"code": "PUBLIC_DOCS_ONLY_ACCOUNT_NOT_TESTED",
|
|
66
|
+
"method": "Public documentation only: the model page lists USD pay-per-token rates and the plans page lists $1 credits, a $5 minimum top-up and a $1 signup credit once per account that never expires. No account was created, no credit was checked and no top-up was tried."
|
|
67
|
+
},
|
|
68
|
+
"liveMatrix": null,
|
|
69
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1983"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -77,6 +77,8 @@ export declare const providerCatalogJsonSchema: z.ZodObject<{
|
|
|
77
77
|
message: z.ZodString;
|
|
78
78
|
}, z.core.$strict>>;
|
|
79
79
|
quirks: z.ZodOptional<z.ZodObject<{
|
|
80
|
+
maxTokensField: z.ZodOptional<z.ZodLiteral<"max_completion_tokens">>;
|
|
81
|
+
omitStreamOptions: z.ZodOptional<z.ZodBoolean>;
|
|
80
82
|
timeoutErrorClass: z.ZodOptional<z.ZodLiteral<"provider">>;
|
|
81
83
|
messageContentFormat: z.ZodOptional<z.ZodLiteral<"string">>;
|
|
82
84
|
registryDefaultIgnoresModelEnvVar: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -158,6 +158,8 @@ const catalogErrorRuleJsonSchema = z
|
|
|
158
158
|
}
|
|
159
159
|
});
|
|
160
160
|
const catalogQuirksSchema = z.strictObject({
|
|
161
|
+
maxTokensField: z.literal("max_completion_tokens").optional(),
|
|
162
|
+
omitStreamOptions: z.boolean().optional(),
|
|
161
163
|
timeoutErrorClass: z.literal("provider").optional(),
|
|
162
164
|
messageContentFormat: z.literal("string").optional(),
|
|
163
165
|
registryDefaultIgnoresModelEnvVar: z.boolean().optional(),
|
|
@@ -89,6 +89,11 @@ export declare class ConfiguredOpenAICompatProvider extends OpenAIChatCompletion
|
|
|
89
89
|
* so a stale flag costs one request rather than the turn.
|
|
90
90
|
*/
|
|
91
91
|
protected suppressResponseFormatWithTools(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Apply catalog-scoped budget, streaming and message dialects to the final
|
|
94
|
+
* request body. Reapplying these adjustments during a retry preserves the
|
|
95
|
+
* same endpoint contract without changing an already normalized budget.
|
|
96
|
+
*/
|
|
92
97
|
protected adjustRequestBody(body: OpenAICompatChatRequest, modelId: string): OpenAICompatChatRequest;
|
|
93
98
|
protected adjustResponseFormat(rf: OpenAICompatResponseFormat | undefined, modelId: string): OpenAICompatResponseFormat | undefined;
|
|
94
99
|
protected replayReasoningContent(): boolean;
|
|
@@ -164,8 +164,26 @@ export class ConfiguredOpenAICompatProvider extends OpenAIChatCompletionsProvide
|
|
|
164
164
|
suppressResponseFormatWithTools() {
|
|
165
165
|
return this.entry.supportsStructuredOutputWithTools !== true;
|
|
166
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Apply catalog-scoped budget, streaming and message dialects to the final
|
|
169
|
+
* request body. Reapplying these adjustments during a retry preserves the
|
|
170
|
+
* same endpoint contract without changing an already normalized budget.
|
|
171
|
+
*/
|
|
167
172
|
adjustRequestBody(body, modelId) {
|
|
168
|
-
|
|
173
|
+
let adjusted = super.adjustRequestBody(body, modelId);
|
|
174
|
+
if (this.entry.maxTokensField === "max_completion_tokens") {
|
|
175
|
+
const { max_tokens, ...withoutLegacyBudget } = adjusted;
|
|
176
|
+
adjusted = {
|
|
177
|
+
...withoutLegacyBudget,
|
|
178
|
+
...(max_tokens === undefined
|
|
179
|
+
? {}
|
|
180
|
+
: { max_completion_tokens: max_tokens }),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (this.entry.omitStreamOptions === true) {
|
|
184
|
+
const { stream_options: _streamOptions, ...withoutStreamOptions } = adjusted;
|
|
185
|
+
adjusted = withoutStreamOptions;
|
|
186
|
+
}
|
|
169
187
|
if (this.entry.rejectRequiredToolChoice === true &&
|
|
170
188
|
adjusted.tool_choice === "required" &&
|
|
171
189
|
Array.isArray(adjusted.tools) &&
|
|
@@ -158,12 +158,16 @@ export declare abstract class OpenAIChatCompletionsProvider extends BaseProvider
|
|
|
158
158
|
* uses the backend's own number — self-healing even when a discovery
|
|
159
159
|
* endpoint (`/model/info`) is absent or unauthorized;
|
|
160
160
|
* - when the error also states the real input size (vllm/LiteLLM
|
|
161
|
-
* phrasing)
|
|
162
|
-
*
|
|
161
|
+
* phrasing), its output budget is re-fit to `window − input − margin`
|
|
162
|
+
* and the request retried once. An explicit `max_completion_tokens`
|
|
163
|
+
* takes precedence over legacy `max_tokens`; a server-reported output
|
|
164
|
+
* budget is used only when the request carried neither field.
|
|
163
165
|
*
|
|
164
166
|
* Returns undefined when the error is not an overflow, or when no smaller
|
|
165
|
-
*
|
|
166
|
-
* original error then propagates unchanged.
|
|
167
|
+
* output budget can make the request fit (input alone too large) — the
|
|
168
|
+
* original error then propagates unchanged. The retry never increases an
|
|
169
|
+
* explicit caller budget and is normalized through the provider's wire
|
|
170
|
+
* adjustment hook, including when the initial budget was server-defaulted.
|
|
167
171
|
*/
|
|
168
172
|
private correctBodyAfterContextOverflow;
|
|
169
173
|
/**
|
|
@@ -376,12 +376,16 @@ export class OpenAIChatCompletionsProvider extends BaseProvider {
|
|
|
376
376
|
* uses the backend's own number — self-healing even when a discovery
|
|
377
377
|
* endpoint (`/model/info`) is absent or unauthorized;
|
|
378
378
|
* - when the error also states the real input size (vllm/LiteLLM
|
|
379
|
-
* phrasing)
|
|
380
|
-
*
|
|
379
|
+
* phrasing), its output budget is re-fit to `window − input − margin`
|
|
380
|
+
* and the request retried once. An explicit `max_completion_tokens`
|
|
381
|
+
* takes precedence over legacy `max_tokens`; a server-reported output
|
|
382
|
+
* budget is used only when the request carried neither field.
|
|
381
383
|
*
|
|
382
384
|
* Returns undefined when the error is not an overflow, or when no smaller
|
|
383
|
-
*
|
|
384
|
-
* original error then propagates unchanged.
|
|
385
|
+
* output budget can make the request fit (input alone too large) — the
|
|
386
|
+
* original error then propagates unchanged. The retry never increases an
|
|
387
|
+
* explicit caller budget and is normalized through the provider's wire
|
|
388
|
+
* adjustment hook, including when the initial budget was server-defaulted.
|
|
385
389
|
*/
|
|
386
390
|
correctBodyAfterContextOverflow(body, error) {
|
|
387
391
|
if (!isContextOverflowError(error)) {
|
|
@@ -393,11 +397,13 @@ export class OpenAIChatCompletionsProvider extends BaseProvider {
|
|
|
393
397
|
return undefined;
|
|
394
398
|
}
|
|
395
399
|
registerRuntimeContextWindow(this.providerName, body.model, details.budgetTokens);
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
400
|
+
const budgetField = typeof body.max_completion_tokens === "number"
|
|
401
|
+
? "max_completion_tokens"
|
|
402
|
+
: "max_tokens";
|
|
403
|
+
// A parsed output count is only a fallback for server-defaulted output;
|
|
404
|
+
// it must not override an explicit cap in either supported dialect.
|
|
405
|
+
const previousMaxTokens = typeof body[budgetField] === "number"
|
|
406
|
+
? body[budgetField]
|
|
401
407
|
: details.requestedOutputTokens;
|
|
402
408
|
if (previousMaxTokens === undefined || details.actualTokens <= 0) {
|
|
403
409
|
return undefined;
|
|
@@ -406,13 +412,14 @@ export class OpenAIChatCompletionsProvider extends BaseProvider {
|
|
|
406
412
|
if (refit <= 0 || refit >= previousMaxTokens) {
|
|
407
413
|
return undefined;
|
|
408
414
|
}
|
|
409
|
-
logger.warn(`${this.providerName}: ${body.model} rejected the request as over-window — retrying once with
|
|
415
|
+
logger.warn(`${this.providerName}: ${body.model} rejected the request as over-window — retrying once with ${budgetField} re-fit from the provider's own numbers`, {
|
|
410
416
|
window: details.budgetTokens,
|
|
411
417
|
inputTokens: details.actualTokens,
|
|
412
418
|
previousMaxTokens,
|
|
413
419
|
refitMaxTokens: refit,
|
|
414
420
|
});
|
|
415
|
-
|
|
421
|
+
const { max_tokens: _legacyBudget, max_completion_tokens: _completionBudget, ...withoutOutputBudget } = body;
|
|
422
|
+
return this.adjustRequestBody({ ...withoutOutputBudget, [budgetField]: refit }, body.model);
|
|
416
423
|
}
|
|
417
424
|
/**
|
|
418
425
|
* Hook called once at the start of every `executeStream` invocation.
|
|
@@ -74,6 +74,12 @@ export type CatalogErrorRuleJson = {
|
|
|
74
74
|
message: string;
|
|
75
75
|
};
|
|
76
76
|
export type CatalogQuirks = {
|
|
77
|
+
/** Send the caller's fitted maxTokens budget as max_completion_tokens and
|
|
78
|
+
* omit max_tokens. Omitted preserves the ordinary OpenAI-compatible field. */
|
|
79
|
+
maxTokensField?: "max_completion_tokens";
|
|
80
|
+
/** Omit stream_options where the endpoint does not document that extension.
|
|
81
|
+
* Does not discard usage that the endpoint returns without requesting it. */
|
|
82
|
+
omitStreamOptions?: boolean;
|
|
77
83
|
timeoutErrorClass?: "provider";
|
|
78
84
|
/** Vendor speaks OpenAI for chat but restricts how message content is
|
|
79
85
|
* encoded. "string": `messages[].content` must be a plain string —
|
|
@@ -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" | "longcat" | "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" | "longcat" | "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";
|
|
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" | "longcat" | "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" | "runinfra" | "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" | "longcat" | "mancer" | "metaModelApi" | "minimax" | "mistral" | "moark" | "modelscope" | "moonshotAi" | "morph" | "naverClovaStudio" | "nebius" | "neuralwatt" | "novita" | "ovhcloud" | "parasail" | "paretoInference" | "perplexity" | "poolside" | "primeIntellect" | "reka" | "runinfra" | "sakanaAi" | "sambanova" | "sarvam" | "scaleway" | "siliconflow" | "stackit" | "stepfun" | "subconscious" | "synthetic" | "telnyx" | "thinkingMachines" | "tinfoil" | "together" | "umansAi" | "upstage" | "veniceAi" | "vispark" | "vultrInference" | "wafer" | "wandbInference" | "xai" | "xiaomiMimo" | "zAi";
|
|
@@ -449,6 +449,10 @@ export type NeurolinkCredentials = {
|
|
|
449
449
|
apiKey?: string;
|
|
450
450
|
baseURL?: string;
|
|
451
451
|
};
|
|
452
|
+
runinfra?: {
|
|
453
|
+
apiKey?: string;
|
|
454
|
+
baseURL?: string;
|
|
455
|
+
};
|
|
452
456
|
sakanaAi?: {
|
|
453
457
|
apiKey?: string;
|
|
454
458
|
baseURL?: string;
|
|
@@ -1117,6 +1121,11 @@ export type OpenAICompatCatalogEntry = {
|
|
|
1117
1121
|
* Task 4, so nothing actually mutates it at runtime.
|
|
1118
1122
|
*/
|
|
1119
1123
|
errorRules: ProviderErrorRule[];
|
|
1124
|
+
/** See CatalogQuirks.maxTokensField. Preserve the fitted output budget while
|
|
1125
|
+
* changing only its wire name; omitted keeps max_tokens. */
|
|
1126
|
+
maxTokensField?: "max_completion_tokens";
|
|
1127
|
+
/** See CatalogQuirks.omitStreamOptions. Omitted preserves stream usage options. */
|
|
1128
|
+
omitStreamOptions?: boolean;
|
|
1120
1129
|
/**
|
|
1121
1130
|
* Optional override for the Error subclass a TimeoutError should produce
|
|
1122
1131
|
* for this entry. classifyProviderError() hard-codes
|
|
@@ -9782,13 +9782,24 @@
|
|
|
9782
9782
|
{"objectID":"2ad17a5a824efd7422b7a421784f775f43eb6f34a7d9608725564c0f070b1e19","title":"Provenance and remaining gates","url":"/docs/provider-integration/pilots/longcat-source-pilot#provenance-and-remaining-gates","content":"The legacy evidence.rosterVerified slot carries the explicit\nVENDOR_DOCS_ONLY_NOT_ROSTER_VERIFIED marker. It has no HTTP status, auth probe\nor billing probe; liveMatrix is null. evidence.addedInPR is the\nintroduction pull request URL (https://github.com/juspay/neurolink/pull/1980),\nset after the PR existed; it was PENDING_PR while the work was local. Source-stage admission does not certify current account or API\navailability.\n\nStill pending and separate: an authenticated GET /openai/v1/models roster, a\nfunded-account live matrix, installed-consumer acceptance and any delivery\nclaim.","hierarchy":{"lvl0":"Provider Integration","lvl1":"LongCat text and streaming source pilot","lvl2":"Provenance and remaining gates","lvl3":""}},
|
|
9783
9783
|
{"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":""}},
|
|
9784
9784
|
{"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":""}},
|
|
9785
|
-
{"objectID":"
|
|
9785
|
+
{"objectID":"02c87f98dbeb67bc9785655305d72c9f3166e958769aa0b75371ce5794403f85","title":"RunInfra text and streaming source pilot","url":"/docs/provider-integration/pilots/runinfra-source-pilot","content":"RunInfra text and streaming source pilot\n\nThis source-level catalog entry selects RunInfra's nemotron-3-5-lightning-30b\nmodel through https://api.runinfra.ai/v1/chat/completions with\nAuthorization: Bearer <workspace API key>. Its declared scope is text\ngeneration and streaming only. Source preparation, public contract acceptance,\ninstalled-package acceptance, current account/API availability and delivery are\nseparate gates. This entry gives no provider-count, roster, live, package or\ndelivery credit.\n\nVendor sources\n\nAll were read on 2026-10-12 with public GETs. No API call was made and no\naccount exists for this work.\nhttps://runinfra.ai/inference-api/nemotron-3-5-lightning-30b (model page)\nhttps://runinfra.ai/docs/tools-sdks/openai-compatibility\nhttps://runinfra.ai/docs/api-reference/chat-completions.md\nhttps://runinfra.ai/docs/api-reference/authentication.md\nhttps://runinfra.ai/docs/introduction/plans.md\nhttps://runinfra.ai/docs/changelog.md\n\nWhat the entry declares\n\n| Field | Value |\n| -------------- | ------------------------------------------------------------------------------------------------------------- |\n| Provider id | runinfra (display name RunInfra) |\n| Base URL | https://api.runinfra.ai/v1 |\n| Route | POST /chat/completions |\n| Credential | RUNINFRA_GATEWAY_KEY as a Bearer token, with RUNINFRA_API_KEY read as a fallback |\n| Default model | nemotron-3-5-lightning-30b (the only model listed, so no other fallback) |\n| Context window | 262,144 tokens |\n| Maximum output | 262,144 tokens, a ceiling and not capacity beside a full prompt (see below) |\n| Capabilities | text and streaming; tools, structured output, thinking, vision off |\n| Billing policy | promotional-credit, usage-priced per token, with a one-time signup credit listed on the vendor's plans page |\n\nThe model id is the one the vendor's copyable examples pass as model. The\nmodel page's header also shows the upstream served name\nnvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16, which is not the id to send.\n\nThe capability booleans bound this pilot's declared scope; they are not\nevidence that the vendor lacks those features. The model page lists tool\ncalling, JSON mode and streaming as supported and the accepted input as text\nonly. Tools, structured output, thinking and vision are simply not declared\nhere because none was probed.\n\nCredential variables\n\nThe vendor's curl and SDK examples read RUNINFRA_GATEWAY_KEY, and its export\nblock also sets RUNINFRA_API_KEY to the same value. The entry reads\nRUNINFRA_GATEWAY_KEY first and RUNINFRA_API_KEY as a fallback\n(wire.envOverrides.apiKey plus wire.apiKeyFallbackEnvVars). The vendor's\nauthentication page says RUNINFRA_API_KEY is the name its CLI and most\ncoding-agent integrations read and that it \"is not an alias for\nRUNINFRA_GATEWAY_KEY\", so the entry reads both. The base URL\nvariable is the derived RUNINFRA_BASE_URL, the name the vendor's export block\nalready uses.\n\nContext and output\n\nThe model page states \"Context window 262,144 tokens\" and \"Maximum generated\noutput 262,144 tokens\" for this exact model. The chat-completions reference\ngives the per-request cap as \"the model's remaining context, that is its\ncontext window minus your prompt\" and says oversized values are clamped, never\nrefused. So 262,144 is a ceiling, not 262,144 usable output beside a full\nprompt. The schema accepts equal context and output values, and other catalog\nentries already declare them. This SDK path sends neither ceiling on the wire,\nso the owned endpoint in the suite below cannot observe them.\n\nBilling\n\nThe model page lists \"USD, pay per token\" rates: $0.05 per 1M input tokens,\n$0.01 per 1M cached input tokens and $0.15 per 1M output tokens. They were read\non 2026-10-12, are not recorded in the catalog JSON and may change. The plans\npage lists a credit as worth $1, a minimum top-up of $5, top-up credit that\nlasts one year from purchase, and a $1 credit \"Free on signup\", \"once per\naccount, never expires\".\n\nThe catalog therefore uses promotional-credit, whose type comment in\nsrc/lib/types/providerCatalog.ts says a promotional allowance is conditional\nand that setup text must describe eligibility, activation and expiry without\nimplying current account entitlement. A credit given once per account is not a\nfree tier, and this entry does not claim one. no-free-tier would drop a\ncredit the vendor lists, free-tier and free-","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"","lvl3":""}},
|
|
9786
|
+
{"objectID":"7ae0060196f5b63b9761dc14d4973860368f1a688941942f6a5d53f17bbd3109","title":"RunInfra text and streaming source pilot","url":"/docs/provider-integration/pilots/runinfra-source-pilot#runinfra-text-and-streaming-source-pilot","content":"This source-level catalog entry selects RunInfra's nemotron-3-5-lightning-30b\nmodel through https://api.runinfra.ai/v1/chat/completions with\nAuthorization: Bearer <workspace API key>. Its declared scope is text\ngeneration and streaming only. Source preparation, public contract acceptance,\ninstalled-package acceptance, current account/API availability and delivery are\nseparate gates. This entry gives no provider-count, roster, live, package or\ndelivery credit.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"RunInfra text and streaming source pilot","lvl3":""}},
|
|
9787
|
+
{"objectID":"abe2f79120c75cd8f2b9a1fc152f90328201016ba1c9e5672fde8e5376410096","title":"Vendor sources","url":"/docs/provider-integration/pilots/runinfra-source-pilot#vendor-sources","content":"All were read on 2026-10-12 with public GETs. No API call was made and no\naccount exists for this work.\nhttps://runinfra.ai/inference-api/nemotron-3-5-lightning-30b (model page)\nhttps://runinfra.ai/docs/tools-sdks/openai-compatibility\nhttps://runinfra.ai/docs/api-reference/chat-completions.md\nhttps://runinfra.ai/docs/api-reference/authentication.md\nhttps://runinfra.ai/docs/introduction/plans.md\nhttps://runinfra.ai/docs/changelog.md","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Vendor sources","lvl3":""}},
|
|
9788
|
+
{"objectID":"be5abe4b1470d6ff8b0bfa5ddb500ef861abdb0ecbd9324c466bd9f98a8cd603","title":"What the entry declares","url":"/docs/provider-integration/pilots/runinfra-source-pilot#what-the-entry-declares","content":"| Field | Value |\n| -------------- | ------------------------------------------------------------------------------------------------------------- |\n| Provider id | runinfra (display name RunInfra) |\n| Base URL | https://api.runinfra.ai/v1 |\n| Route | POST /chat/completions |\n| Credential | RUNINFRA_GATEWAY_KEY as a Bearer token, with RUNINFRA_API_KEY read as a fallback |\n| Default model | nemotron-3-5-lightning-30b (the only model listed, so no other fallback) |\n| Context window | 262,144 tokens |\n| Maximum output | 262,144 tokens, a ceiling and not capacity beside a full prompt (see below) |\n| Capabilities | text and streaming; tools, structured output, thinking, vision off |\n| Billing policy | promotional-credit, usage-priced per token, with a one-time signup credit listed on the vendor's plans page |\n\nThe model id is the one the vendor's copyable examples pass as model. The\nmodel page's header also shows the upstream served name\nnvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16, which is not the id to send.\n\nThe capability booleans bound this pilot's declared scope; they are not\nevidence that the vendor lacks those features. The model page lists tool\ncalling, JSON mode and streaming as supported and the accepted input as text\nonly. Tools, structured output, thinking and vision are simply not declared\nhere because none was probed.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"What the entry declares","lvl3":""}},
|
|
9789
|
+
{"objectID":"8ea22f7578fbd488db62d0a8f829f3567eb26e21c2ed8df5a0826ade90bac9c2","title":"Credential variables","url":"/docs/provider-integration/pilots/runinfra-source-pilot#credential-variables","content":"The vendor's curl and SDK examples read RUNINFRA_GATEWAY_KEY, and its export\nblock also sets RUNINFRA_API_KEY to the same value. The entry reads\nRUNINFRA_GATEWAY_KEY first and RUNINFRA_API_KEY as a fallback\n(wire.envOverrides.apiKey plus wire.apiKeyFallbackEnvVars). The vendor's\nauthentication page says RUNINFRA_API_KEY is the name its CLI and most\ncoding-agent integrations read and that it \"is not an alias for\nRUNINFRA_GATEWAY_KEY\", so the entry reads both. The base URL\nvariable is the derived RUNINFRA_BASE_URL, the name the vendor's export block\nalready uses.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Credential variables","lvl3":""}},
|
|
9790
|
+
{"objectID":"87e58d57ec2c73d698a7d8c3f3fe75cfc3267d0b0cfebea19bb03cdeaa59cfa4","title":"Context and output","url":"/docs/provider-integration/pilots/runinfra-source-pilot#context-and-output","content":"The model page states \"Context window 262,144 tokens\" and \"Maximum generated\noutput 262,144 tokens\" for this exact model. The chat-completions reference\ngives the per-request cap as \"the model's remaining context, that is its\ncontext window minus your prompt\" and says oversized values are clamped, never\nrefused. So 262,144 is a ceiling, not 262,144 usable output beside a full\nprompt. The schema accepts equal context and output values, and other catalog\nentries already declare them. This SDK path sends neither ceiling on the wire,\nso the owned endpoint in the suite below cannot observe them.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Context and output","lvl3":""}},
|
|
9791
|
+
{"objectID":"5df66b1ea84ba2e6902cfa35233a51fce0cbe1ed4588587bc7216704fbeb68b9","title":"Billing","url":"/docs/provider-integration/pilots/runinfra-source-pilot#billing","content":"The model page lists \"USD, pay per token\" rates: $0.05 per 1M input tokens,\n$0.01 per 1M cached input tokens and $0.15 per 1M output tokens. They were read\non 2026-10-12, are not recorded in the catalog JSON and may change. The plans\npage lists a credit as worth $1, a minimum top-up of $5, top-up credit that\nlasts one year from purchase, and a $1 credit \"Free on signup\", \"once per\naccount, never expires\".\n\nThe catalog therefore uses promotional-credit, whose type comment in\nsrc/lib/types/providerCatalog.ts says a promotional allowance is conditional\nand that setup text must describe eligibility, activation and expiry without\nimplying current account entitlement. A credit given once per account is not a\nfree tier, and this entry does not claim one. no-free-tier would drop a\ncredit the vendor lists, free-tier and free-with-card would claim more than\nwas read, and the xiaomi-mimo and NAVER CLOVA Studio entries use\npromotional-credit for conditional bonus or signup credit. Whether a\nparticular account receives the credit, and what a signup asks of the account,\nwas not established.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Billing","lvl3":""}},
|
|
9792
|
+
{"objectID":"e69517ed7b2771cf0c85dfdcd2b3ecd0ef47363b1d02980940f7d5e80a1bab43","title":"Availability","url":"/docs/provider-integration/pilots/runinfra-source-pilot#availability","content":"Availability is a runtime field. The model page said \"Available\" on\n2026-10-12, but the vendor changelog says the model was listed ahead of its\npublic opening. The chat-completions reference says a hosted model can be\ntemporarily paused and then answers 503 with code hosted_model_paused.\nNo API call was made, so availability to any account is unverified.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Availability","lvl3":""}},
|
|
9793
|
+
{"objectID":"c44a6f29a351e862c3dcea298b1cbc52129fe85426e9e2e861169977e59d80e8","title":"Evidence caveats","url":"/docs/provider-integration/pilots/runinfra-source-pilot#evidence-caveats","content":"Context window 262144 and maximum generated output 262144 are both stated on\n the vendor's model page for this exact model. The chat-completions reference\n says per-request output is capped at the model's remaining context (window\n minus prompt) and that oversized values are clamped, so 262144 output is a\n ceiling, not capacity beside a full prompt. This SDK path does not send either\n ceiling on the wire; the owned endpoint cannot observe them.\nAvailability is a runtime field. The model page said Available on\n 2026-10-12; the vendor changelog says the model was listed ahead of its public\n opening and a paused model answers 503 hostedmodelpaused. No API call was\n made, so availability to any account is unverified.\nBilling is usage-priced (USD per token) with prepaid $1 credits, a $5 minimum\n top-up and a one-time $1 signup credit per account. Prices and credit terms\n were read from vendor pages and not tried on an account; they may change.\nThe vendor documents a reasoning_effort default for this model under JSON\n response formats, and says usage.outputTokenDetails.reasoningTokens reports\n 0 even when the model reasoned. Thinking, tools, structured output and vision\n are declared off here as a scope limit; none was probed, and whether streamed\n output carries reasoning text was never observed.\nThe chat-completions reference says this model reasons by default, that\n reasoning tokens count toward max_tokens before the answer, and that a\n smaller budget can be spent entirely on reasoning and return a completion\n whose content is empty. The suite's max_tokens: 32 is a wire marker for\n the owned endpoint, not a recommendation, and the empty-content behavior was\n not observed.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Evidence caveats","lvl3":""}},
|
|
9794
|
+
{"objectID":"83c82bf158f29ba1c9e527fe1e693bdc703cdd750f10c3e7380b6d7ae2f9777c","title":"Local public contract","url":"/docs/provider-integration/pilots/runinfra-source-pilot#local-public-contract","content":"test/continuous-test-suite-runinfra-pilot.ts runs twelve 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, /v1/chat/completions, Bearer header, unique user prompt, max_tokens: 32, stream mode, no tools/tool choice, answer |\n| SDK/CLI generate/stream invalid explicit model | 4 | All wire preconditions pass before HTTP 400 rejection; no fallback or successful reply |\n| Key variables | 4 | RUNINFRA_API_KEY alone reaches the wire (SDK and CLI), RUNINFRA_GATEWAY_KEY wins when both are set, and no key refuses before the wire and names it |\n\nThe fixture strips real credentials before imports, uses temporary homes and\npoints the provider at an owned random-port listener. Public MODEL_CONFIG_URL\nuses that same listener's HEAD /health and GET /api/v1/models; a\nschema-valid empty registry keeps the provider's actual catalog default in\ncontrol. The listener is the only server involved: no vendor host is contacted.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Local public contract","lvl3":""}},
|
|
9795
|
+
{"objectID":"d10202fe001113e5e0487518b154b04756ccb490eeb5a1800a8262aecfcf4936","title":"Provenance and remaining gates","url":"/docs/provider-integration/pilots/runinfra-source-pilot#provenance-and-remaining-gates","content":"The legacy evidence.rosterVerified slot carries the explicit\nVENDOR_DOCS_ONLY_NOT_ROSTER_VERIFIED marker and evidence.billingProbe\ncarries PUBLIC_DOCS_ONLY_ACCOUNT_NOT_TESTED; there is no HTTP status or auth\nprobe, and liveMatrix is null. evidence.addedInPR is the introduction pull\nrequest URL (https://github.com/juspay/neurolink/pull/1983), set after the pull\nrequest existed; it was PENDING_PR while the work was local. Source-stage admission does not certify current account or API\navailability.\n\nStill pending and separate: an authenticated GET /v1/models roster (the\nvendor's chat-completions reference says a temporarily paused model is\nreported there), a funded-account\nlive matrix, installed-consumer acceptance and any delivery claim.","hierarchy":{"lvl0":"Provider Integration","lvl1":"RunInfra text and streaming source pilot","lvl2":"Provenance and remaining gates","lvl3":""}},
|
|
9796
|
+
{"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 profile's quirks.maxTokensField maps the\n caller's fitted maxTokens budget to that field and omits max_tokens on\n generate and stream requests. An owned endpoint refuses the obsolete field\n and requires the exact requested budget before answering. This proves the\n emitted local wire contract; actual vendor acceptance and enforcement remain\n unverified. The parameter includes visible plus reasoning tokens.\nStreaming usage option. The vendor's reference documents stream but\n not stream_options. The profile's quirks.omitStreamOptions therefore omits\n that extension, preserving ordinary SSE streaming. Returned usage is still\n consumed if the vendor supplies it; no streaming usage completeness is claimed.\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 the output\n budget 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 ","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"","lvl3":""}},
|
|
9786
9797
|
{"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":""}},
|
|
9787
9798
|
{"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":""}},
|
|
9788
9799
|
{"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":""}},
|
|
9789
9800
|
{"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":""}},
|
|
9790
|
-
{"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
|
|
9791
|
-
{"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
|
|
9801
|
+
{"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 profile's quirks.maxTokensField maps the\n caller's fitted maxTokens budget to that field and omits max_tokens on\n generate and stream requests. An owned endpoint refuses the obsolete field\n and requires the exact requested budget before answering. This proves the\n emitted local wire contract; actual vendor acceptance and enforcement remain\n unverified. The parameter includes visible plus reasoning tokens.\nStreaming usage option. The vendor's reference documents stream but\n not stream_options. The profile's quirks.omitStreamOptions therefore omits\n that extension, preserving ordinary SSE streaming. Returned usage is still\n consumed if the vendor supplies it; no streaming usage completeness is claimed.\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 the output\n budget 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":""}},
|
|
9802
|
+
{"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 retains its original 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_completion_tokens: 32, no max_tokens or stream_options, 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| SDK/CLI generate/stream, budgets","hierarchy":{"lvl0":"Provider Integration","lvl1":"Xiaomi MiMo text and streaming pilot","lvl2":"Local public contract","lvl3":""}},
|
|
9792
9803
|
{"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":""}},
|
|
9793
9804
|
{"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":""}},
|
|
9794
9805
|
{"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":""}},
|