@juspay/neurolink 12.5.0 → 12.5.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 +1 -5
- package/dist/adapters/providerImageAdapter.js +43 -19
- package/dist/browser/neurolink.min.js +414 -414
- package/dist/cli/commands/setup.d.ts +12 -7
- package/dist/cli/commands/setup.js +17 -16
- package/dist/constants/contextWindows.js +23 -95
- package/dist/constants/enums.d.ts +111 -216
- package/dist/constants/enums.js +124 -240
- package/dist/factories/providerDescriptors.d.ts +2 -4
- package/dist/factories/providerDescriptors.js +83 -127
- package/dist/models/manifestRegistry.js +53 -4
- package/dist/providers/catalog/cerebras.json +75 -0
- package/dist/providers/catalog/cloudflare.json +121 -0
- package/dist/providers/catalog/fireworks.json +124 -0
- package/dist/providers/catalog/groq.json +127 -0
- package/dist/providers/catalog/index.generated.d.ts +3 -0
- package/dist/providers/catalog/index.generated.js +33 -0
- package/dist/providers/catalog/loader.d.ts +6 -0
- package/dist/providers/catalog/loader.js +115 -0
- package/dist/providers/catalog/mistral.json +244 -0
- package/dist/providers/catalog/perplexity.json +103 -0
- package/dist/providers/catalog/provider-catalog.schema.json +351 -0
- package/dist/providers/catalog/sambanova.json +129 -0
- package/dist/providers/catalog/schema.d.ts +123 -0
- package/dist/providers/catalog/schema.js +310 -0
- package/dist/providers/catalog/together-ai.json +172 -0
- package/dist/providers/catalog/xai.json +108 -0
- package/dist/providers/openaiCompatCatalog.d.ts +13 -13
- package/dist/providers/openaiCompatCatalog.js +15 -326
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/providerCatalog.d.ts +149 -0
- package/dist/types/providerCatalog.generated.d.ts +2 -0
- package/dist/types/providerCatalog.generated.js +1 -0
- package/dist/types/providerCatalog.js +7 -0
- package/dist/types/providers.d.ts +14 -14
- package/dist/utils/modelChoices.d.ts +11 -3
- package/dist/utils/modelChoices.js +84 -190
- package/dist/utils/pricing.js +92 -127
- package/dist/utils/providerConfig.d.ts +1 -1
- package/dist/utils/providerConfig.js +24 -108
- package/package.json +2 -1
- package/dist/models/manifests/cerebras.d.ts +0 -9
- package/dist/models/manifests/cerebras.js +0 -19
- package/dist/models/manifests/sambanova.d.ts +0 -11
- package/dist/models/manifests/sambanova.js +0 -42
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts the JSON authoring format into the runtime
|
|
3
|
+
* OpenAICompatCatalogEntry shape the registry loop consumes. All
|
|
4
|
+
* knowledge about deriving env vars, template interpolation and error
|
|
5
|
+
* rule matching lives HERE — the JSON stays declarative.
|
|
6
|
+
*/
|
|
7
|
+
import { CATALOG_JSON_ENTRIES } from "./index.generated.js";
|
|
8
|
+
import { DEFAULT_ERROR_RULES } from "../../utils/errorClassifier.js";
|
|
9
|
+
import { AuthenticationError, RateLimitError, InvalidModelError, NetworkError, ProviderError, } from "../../types/index.js";
|
|
10
|
+
const ERROR_CLASS_MAP = {
|
|
11
|
+
authentication: AuthenticationError,
|
|
12
|
+
"rate-limit": RateLimitError,
|
|
13
|
+
"invalid-model": InvalidModelError,
|
|
14
|
+
network: NetworkError,
|
|
15
|
+
provider: ProviderError,
|
|
16
|
+
};
|
|
17
|
+
// Duplicated from tools/codegen-catalog.ts intentionally: src/ must not
|
|
18
|
+
// import from tools/ (build-time tooling depends on runtime source, not the
|
|
19
|
+
// reverse).
|
|
20
|
+
function toCamelCase(id) {
|
|
21
|
+
return id.replace(/-([a-z])/g, (_m, c) => c.toUpperCase());
|
|
22
|
+
}
|
|
23
|
+
// Resolves the NeurolinkCredentials key for an entry — respects a
|
|
24
|
+
// credentialsKey override (required where the derived camelCase would
|
|
25
|
+
// rename a pre-existing public credential field; see together-ai). Single
|
|
26
|
+
// source of truth shared with codegen's own credentialsKeyFor() so the
|
|
27
|
+
// generated NeurolinkCredentials keys and any runtime consumer (Task 7's
|
|
28
|
+
// descriptors) can never drift from each other.
|
|
29
|
+
export function catalogCredentialsKey(entry) {
|
|
30
|
+
return entry.credentialsKey ?? toCamelCase(entry.id);
|
|
31
|
+
}
|
|
32
|
+
export function catalogEnvVar(entry, kind) {
|
|
33
|
+
const override = entry.wire.envOverrides?.[kind];
|
|
34
|
+
if (override) {
|
|
35
|
+
return override;
|
|
36
|
+
}
|
|
37
|
+
const base = entry.id.toUpperCase().replace(/-/g, "_");
|
|
38
|
+
return kind === "apiKey"
|
|
39
|
+
? `${base}_API_KEY`
|
|
40
|
+
: kind === "baseURL"
|
|
41
|
+
? `${base}_BASE_URL`
|
|
42
|
+
: `${base}_MODEL`;
|
|
43
|
+
}
|
|
44
|
+
function interpolate(template, entry, modelName) {
|
|
45
|
+
return template
|
|
46
|
+
.replace(/\{apiKeyEnvVar\}/g, catalogEnvVar(entry, "apiKey"))
|
|
47
|
+
.replace(/\{setupUrl\}/g, entry.setup.url)
|
|
48
|
+
.replace(/\{model\}/g, modelName ?? "");
|
|
49
|
+
}
|
|
50
|
+
export function buildCatalogConfigOptions(entry) {
|
|
51
|
+
return {
|
|
52
|
+
providerName: entry.displayName,
|
|
53
|
+
envVarName: catalogEnvVar(entry, "apiKey"),
|
|
54
|
+
setupUrl: entry.setup.url,
|
|
55
|
+
description: entry.setup.description ?? "API key",
|
|
56
|
+
instructions: entry.setup.instructions.map((line) => interpolate(line, entry)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function buildErrorRules(entry) {
|
|
60
|
+
const bespoke = entry.errorRules.map((rule) => {
|
|
61
|
+
const regex = rule.pattern ? new RegExp(rule.pattern, "i") : undefined;
|
|
62
|
+
return {
|
|
63
|
+
match: (ctx) => (rule.status !== undefined && ctx.statusCode === rule.status) ||
|
|
64
|
+
(regex !== undefined && regex.test(ctx.message)),
|
|
65
|
+
errorClass: ERROR_CLASS_MAP[rule.class],
|
|
66
|
+
message: rule.message.includes("{model}")
|
|
67
|
+
? (ctx) => interpolate(rule.message, entry, ctx.modelName)
|
|
68
|
+
: interpolate(rule.message, entry),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
return [...bespoke, ...DEFAULT_ERROR_RULES];
|
|
72
|
+
}
|
|
73
|
+
export function getCatalogJsonEntries() {
|
|
74
|
+
return CATALOG_JSON_ENTRIES;
|
|
75
|
+
}
|
|
76
|
+
export function buildCatalogEntries() {
|
|
77
|
+
return CATALOG_JSON_ENTRIES.map((entry) => {
|
|
78
|
+
const base = {
|
|
79
|
+
providerName: entry.id,
|
|
80
|
+
aliases: [entry.id, ...entry.aliases],
|
|
81
|
+
apiKeyEnvVar: catalogEnvVar(entry, "apiKey"),
|
|
82
|
+
configOptions: buildCatalogConfigOptions(entry),
|
|
83
|
+
modelEnvVar: catalogEnvVar(entry, "model"),
|
|
84
|
+
defaultModel: entry.models.default,
|
|
85
|
+
registryDefaultModel: entry.models.registryDefaultModel ?? entry.models.default,
|
|
86
|
+
registryDefaultModelChecksEnvVar: entry.quirks?.registryDefaultIgnoresModelEnvVar !== true,
|
|
87
|
+
fallbackModelName: entry.models.fallbackModelName ??
|
|
88
|
+
entry.models.fallbacks[1] ??
|
|
89
|
+
entry.models.fallbacks[0],
|
|
90
|
+
fallbackModels: [...entry.models.fallbacks],
|
|
91
|
+
errorRules: buildErrorRules(entry),
|
|
92
|
+
};
|
|
93
|
+
const { baseURLTemplate } = entry.wire;
|
|
94
|
+
if (baseURLTemplate) {
|
|
95
|
+
// Schema constrains extraCredentials to exactly one entry (Task 1) —
|
|
96
|
+
// [0] is the whole list by construction, mirroring the deliberately
|
|
97
|
+
// accountId-shaped runtime computedBaseURL type.
|
|
98
|
+
const extra = entry.wire.extraCredentials?.[0] ?? "accountId";
|
|
99
|
+
base.computedBaseURL = {
|
|
100
|
+
envVar: `${entry.id.toUpperCase().replace(/-/g, "_")}_${extra.replace(/([A-Z])/g, "_$1").toUpperCase()}`,
|
|
101
|
+
missingValueMessage: entry.wire.missingCredentialMessage ??
|
|
102
|
+
`Missing ${extra} for ${entry.displayName}`,
|
|
103
|
+
build: (value) => baseURLTemplate.replaceAll(`{${extra}}`, value),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
base.baseURLEnvVar = catalogEnvVar(entry, "baseURL");
|
|
108
|
+
base.defaultBaseURL = entry.wire.baseURL;
|
|
109
|
+
}
|
|
110
|
+
if (entry.quirks?.timeoutErrorClass === "provider") {
|
|
111
|
+
base.timeoutErrorClass = ProviderError;
|
|
112
|
+
}
|
|
113
|
+
return base;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "mistral",
|
|
4
|
+
"displayName": "Mistral",
|
|
5
|
+
"aliases": [],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURL": "https://api.mistral.ai/v1"
|
|
9
|
+
},
|
|
10
|
+
"models": {
|
|
11
|
+
"default": "mistral-small-2506",
|
|
12
|
+
"fallbackModelName": "mistral-small-2506",
|
|
13
|
+
"registryDefaultModel": "mistral-large-latest",
|
|
14
|
+
"fallbacks": ["mistral-small-2506", "mistral-large-latest"],
|
|
15
|
+
"defaultContextWindow": 128000,
|
|
16
|
+
"defaultMaxOutputTokens": 4096,
|
|
17
|
+
"catalog": {
|
|
18
|
+
"mistral-large-latest": {
|
|
19
|
+
"contextWindow": 256000,
|
|
20
|
+
"vision": true,
|
|
21
|
+
"status": "production",
|
|
22
|
+
"description": "Mistral Large (Latest)"
|
|
23
|
+
},
|
|
24
|
+
"mistral-large-2512": {
|
|
25
|
+
"contextWindow": 256000,
|
|
26
|
+
"vision": true,
|
|
27
|
+
"status": "production",
|
|
28
|
+
"description": "Mistral Large 2512"
|
|
29
|
+
},
|
|
30
|
+
"mistral-medium-latest": {
|
|
31
|
+
"contextWindow": 128000,
|
|
32
|
+
"vision": true,
|
|
33
|
+
"status": "production",
|
|
34
|
+
"description": "Mistral Medium (Latest)"
|
|
35
|
+
},
|
|
36
|
+
"mistral-medium-2508": {
|
|
37
|
+
"vision": true,
|
|
38
|
+
"status": "production",
|
|
39
|
+
"description": "Mistral Medium 2508"
|
|
40
|
+
},
|
|
41
|
+
"mistral-small-latest": {
|
|
42
|
+
"contextWindow": 128000,
|
|
43
|
+
"vision": true,
|
|
44
|
+
"status": "production",
|
|
45
|
+
"description": "Mistral Small (Latest)"
|
|
46
|
+
},
|
|
47
|
+
"mistral-small-2506": {
|
|
48
|
+
"vision": true,
|
|
49
|
+
"status": "production",
|
|
50
|
+
"description": "Recommended - Mistral Small 2506"
|
|
51
|
+
},
|
|
52
|
+
"magistral-medium-latest": {
|
|
53
|
+
"contextWindow": 128000,
|
|
54
|
+
"vision": true,
|
|
55
|
+
"status": "production",
|
|
56
|
+
"description": "Magistral Medium (Reasoning)"
|
|
57
|
+
},
|
|
58
|
+
"magistral-small-latest": {
|
|
59
|
+
"vision": true,
|
|
60
|
+
"status": "production",
|
|
61
|
+
"description": "Magistral Small (Reasoning)"
|
|
62
|
+
},
|
|
63
|
+
"ministral-14b-2512": {
|
|
64
|
+
"enumMember": "MINISTRAL_14B_2512",
|
|
65
|
+
"vision": false,
|
|
66
|
+
"status": "production",
|
|
67
|
+
"description": "Ministral 14B (Edge)"
|
|
68
|
+
},
|
|
69
|
+
"ministral-8b-2512": {
|
|
70
|
+
"enumMember": "MINISTRAL_8B_2512",
|
|
71
|
+
"vision": false,
|
|
72
|
+
"status": "production",
|
|
73
|
+
"description": "Ministral 8B (Edge)"
|
|
74
|
+
},
|
|
75
|
+
"ministral-3b-2512": {
|
|
76
|
+
"enumMember": "MINISTRAL_3B_2512",
|
|
77
|
+
"vision": false,
|
|
78
|
+
"status": "production",
|
|
79
|
+
"description": "Ministral 3B (Edge)"
|
|
80
|
+
},
|
|
81
|
+
"codestral-latest": {
|
|
82
|
+
"contextWindow": 256000,
|
|
83
|
+
"vision": false,
|
|
84
|
+
"status": "production",
|
|
85
|
+
"description": "Codestral (Code Generation)"
|
|
86
|
+
},
|
|
87
|
+
"codestral-2508": {
|
|
88
|
+
"contextWindow": 256000,
|
|
89
|
+
"vision": false,
|
|
90
|
+
"status": "production",
|
|
91
|
+
"description": "Codestral 2508 (Code Generation)"
|
|
92
|
+
},
|
|
93
|
+
"codestral-embed": {
|
|
94
|
+
"vision": false,
|
|
95
|
+
"status": "production",
|
|
96
|
+
"description": "Codestral Embed"
|
|
97
|
+
},
|
|
98
|
+
"devstral-medium-latest": {
|
|
99
|
+
"vision": false,
|
|
100
|
+
"status": "production",
|
|
101
|
+
"description": "Devstral Medium (Software Development)"
|
|
102
|
+
},
|
|
103
|
+
"devstral-small-latest": {
|
|
104
|
+
"vision": false,
|
|
105
|
+
"status": "production",
|
|
106
|
+
"description": "Devstral Small (Software Development)"
|
|
107
|
+
},
|
|
108
|
+
"pixtral-large": {
|
|
109
|
+
"vision": true,
|
|
110
|
+
"status": "retired",
|
|
111
|
+
"description": "Retired 2026-05-31 — use mistral-medium-latest instead"
|
|
112
|
+
},
|
|
113
|
+
"pixtral-12b": {
|
|
114
|
+
"vision": true,
|
|
115
|
+
"status": "retired",
|
|
116
|
+
"description": "Retired 2025-12-31 — use ministral-14b-2512 instead"
|
|
117
|
+
},
|
|
118
|
+
"voxtral-small-latest": {
|
|
119
|
+
"vision": false,
|
|
120
|
+
"status": "production",
|
|
121
|
+
"description": "Voxtral Small (Audio)"
|
|
122
|
+
},
|
|
123
|
+
"voxtral-mini-latest": {
|
|
124
|
+
"vision": false,
|
|
125
|
+
"status": "production",
|
|
126
|
+
"description": "Voxtral Mini (Audio)"
|
|
127
|
+
},
|
|
128
|
+
"devstral-2512": {
|
|
129
|
+
"enumMember": "DEVSTRAL_2",
|
|
130
|
+
"contextWindow": 256000,
|
|
131
|
+
"vision": false,
|
|
132
|
+
"status": "production",
|
|
133
|
+
"description": "Devstral 2 (December 2025)"
|
|
134
|
+
},
|
|
135
|
+
"devstral-small-2512": {
|
|
136
|
+
"enumMember": "DEVSTRAL_SMALL_2",
|
|
137
|
+
"contextWindow": 256000,
|
|
138
|
+
"vision": false,
|
|
139
|
+
"status": "production",
|
|
140
|
+
"description": "Devstral Small 2 (December 2025)"
|
|
141
|
+
},
|
|
142
|
+
"magistral-medium-2509": {
|
|
143
|
+
"vision": true,
|
|
144
|
+
"status": "production",
|
|
145
|
+
"description": "Magistral Medium 2509"
|
|
146
|
+
},
|
|
147
|
+
"magistral-small-2509": {
|
|
148
|
+
"vision": true,
|
|
149
|
+
"status": "production",
|
|
150
|
+
"description": "Magistral Small 2509"
|
|
151
|
+
},
|
|
152
|
+
"voxtral-mini-2602": {
|
|
153
|
+
"enumMember": "VOXTRAL_MINI_TRANSCRIBE_2",
|
|
154
|
+
"vision": false,
|
|
155
|
+
"status": "production",
|
|
156
|
+
"description": "Voxtral Mini Transcribe 2 (February 2026)"
|
|
157
|
+
},
|
|
158
|
+
"mistral-ocr-2512": {
|
|
159
|
+
"enumMember": "MISTRAL_OCR_3",
|
|
160
|
+
"vision": false,
|
|
161
|
+
"status": "production",
|
|
162
|
+
"description": "Mistral OCR 3 (December 2025)"
|
|
163
|
+
},
|
|
164
|
+
"mistral-ocr-latest": {
|
|
165
|
+
"vision": false,
|
|
166
|
+
"status": "production",
|
|
167
|
+
"description": "Mistral OCR (Latest)"
|
|
168
|
+
},
|
|
169
|
+
"mistral-nemo": {
|
|
170
|
+
"vision": false,
|
|
171
|
+
"status": "production",
|
|
172
|
+
"description": "Mistral Nemo"
|
|
173
|
+
},
|
|
174
|
+
"mistral-embed": {
|
|
175
|
+
"vision": false,
|
|
176
|
+
"status": "production",
|
|
177
|
+
"description": "Mistral Embed"
|
|
178
|
+
},
|
|
179
|
+
"mistral-moderation-latest": {
|
|
180
|
+
"vision": false,
|
|
181
|
+
"status": "production",
|
|
182
|
+
"description": "Mistral Moderation (Latest)"
|
|
183
|
+
},
|
|
184
|
+
"mistral-small-2603": {
|
|
185
|
+
"enumMember": "MISTRAL_SMALL_4",
|
|
186
|
+
"contextWindow": 256000,
|
|
187
|
+
"vision": true,
|
|
188
|
+
"status": "production",
|
|
189
|
+
"description": "Mistral Small 4 (June 2026)"
|
|
190
|
+
},
|
|
191
|
+
"mistral-small-creative": {
|
|
192
|
+
"vision": true,
|
|
193
|
+
"status": "production",
|
|
194
|
+
"description": "Mistral Small Creative"
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"topModels": [
|
|
198
|
+
"mistral-large-latest",
|
|
199
|
+
"mistral-small-latest",
|
|
200
|
+
"codestral-latest",
|
|
201
|
+
"magistral-medium-latest",
|
|
202
|
+
"mistral-nemo"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
"capabilities": {
|
|
206
|
+
"text": true,
|
|
207
|
+
"streaming": true,
|
|
208
|
+
"tools": true,
|
|
209
|
+
"toolsWithStreaming": true,
|
|
210
|
+
"structuredOutput": true,
|
|
211
|
+
"structuredOutputWithTools": true,
|
|
212
|
+
"embeddings": false,
|
|
213
|
+
"thinking": false
|
|
214
|
+
},
|
|
215
|
+
"errorRules": [
|
|
216
|
+
{
|
|
217
|
+
"status": 401,
|
|
218
|
+
"pattern": "API_KEY_INVALID|Invalid API key|Unauthorized",
|
|
219
|
+
"class": "authentication",
|
|
220
|
+
"message": "Invalid Mistral API key. Please check your {apiKeyEnvVar} environment variable."
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
"quirks": {
|
|
224
|
+
"registryDefaultIgnoresModelEnvVar": true
|
|
225
|
+
},
|
|
226
|
+
"setup": {
|
|
227
|
+
"url": "https://console.mistral.ai/",
|
|
228
|
+
"apiKeyFormat": null,
|
|
229
|
+
"billingPolicy": "free-with-card",
|
|
230
|
+
"instructions": [
|
|
231
|
+
"1. Visit: https://console.mistral.ai/",
|
|
232
|
+
"2. Create or sign in to your account",
|
|
233
|
+
"3. Generate a new API key"
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
"evidence": {
|
|
237
|
+
"rosterVerified": {
|
|
238
|
+
"date": "2026-08-28",
|
|
239
|
+
"method": "transcribed from pre-migration TS catalog"
|
|
240
|
+
},
|
|
241
|
+
"liveMatrix": null,
|
|
242
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1587"
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "perplexity",
|
|
4
|
+
"displayName": "Perplexity",
|
|
5
|
+
"aliases": ["pplx"],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURL": "https://api.perplexity.ai"
|
|
9
|
+
},
|
|
10
|
+
"models": {
|
|
11
|
+
"default": "sonar",
|
|
12
|
+
"fallbacks": [
|
|
13
|
+
"sonar",
|
|
14
|
+
"sonar-pro",
|
|
15
|
+
"sonar-reasoning",
|
|
16
|
+
"sonar-reasoning-pro",
|
|
17
|
+
"sonar-deep-research"
|
|
18
|
+
],
|
|
19
|
+
"defaultContextWindow": 127000,
|
|
20
|
+
"defaultMaxOutputTokens": 4096,
|
|
21
|
+
"catalog": {
|
|
22
|
+
"sonar": {
|
|
23
|
+
"contextWindow": 127000,
|
|
24
|
+
"pricingPerMTok": { "input": 1.0, "output": 1.0 },
|
|
25
|
+
"vision": false,
|
|
26
|
+
"status": "production",
|
|
27
|
+
"description": "Recommended - Sonar with web grounding"
|
|
28
|
+
},
|
|
29
|
+
"sonar-pro": {
|
|
30
|
+
"contextWindow": 200000,
|
|
31
|
+
"pricingPerMTok": { "input": 3.0, "output": 15.0 },
|
|
32
|
+
"vision": false,
|
|
33
|
+
"status": "production",
|
|
34
|
+
"description": "Better reasoning"
|
|
35
|
+
},
|
|
36
|
+
"sonar-reasoning": {
|
|
37
|
+
"contextWindow": 127000,
|
|
38
|
+
"pricingPerMTok": { "input": 1.0, "output": 5.0 },
|
|
39
|
+
"vision": false,
|
|
40
|
+
"status": "production",
|
|
41
|
+
"description": "Explicit reasoning traces"
|
|
42
|
+
},
|
|
43
|
+
"sonar-reasoning-pro": {
|
|
44
|
+
"contextWindow": 127000,
|
|
45
|
+
"pricingPerMTok": { "input": 2.0, "output": 8.0 },
|
|
46
|
+
"vision": false,
|
|
47
|
+
"status": "production",
|
|
48
|
+
"description": "Flagship reasoning + web"
|
|
49
|
+
},
|
|
50
|
+
"sonar-deep-research": {
|
|
51
|
+
"contextWindow": 200000,
|
|
52
|
+
"pricingPerMTok": { "input": 2.0, "output": 8.0 },
|
|
53
|
+
"vision": false,
|
|
54
|
+
"status": "production",
|
|
55
|
+
"description": "Long-form research with citations"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"topModels": [
|
|
59
|
+
"sonar",
|
|
60
|
+
"sonar-pro",
|
|
61
|
+
"sonar-reasoning",
|
|
62
|
+
"sonar-reasoning-pro",
|
|
63
|
+
"sonar-deep-research"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"capabilities": {
|
|
67
|
+
"text": true,
|
|
68
|
+
"streaming": true,
|
|
69
|
+
"tools": true,
|
|
70
|
+
"toolsWithStreaming": true,
|
|
71
|
+
"structuredOutput": false,
|
|
72
|
+
"structuredOutputWithTools": false,
|
|
73
|
+
"embeddings": false,
|
|
74
|
+
"thinking": false
|
|
75
|
+
},
|
|
76
|
+
"errorRules": [
|
|
77
|
+
{
|
|
78
|
+
"status": 401,
|
|
79
|
+
"pattern": "Invalid API key|Authentication",
|
|
80
|
+
"class": "authentication",
|
|
81
|
+
"message": "Invalid Perplexity API key. Get one at https://www.perplexity.ai/settings/api"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"setup": {
|
|
85
|
+
"url": "https://www.perplexity.ai/settings/api",
|
|
86
|
+
"apiKeyFormat": null,
|
|
87
|
+
"billingPolicy": "no-free-tier",
|
|
88
|
+
"instructions": [
|
|
89
|
+
"1. Visit: https://www.perplexity.ai/settings/api",
|
|
90
|
+
"2. Sign in to your Perplexity account",
|
|
91
|
+
"3. Create a new API key (Sonar tier)",
|
|
92
|
+
"4. Set {apiKeyEnvVar} in your .env file"
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
"evidence": {
|
|
96
|
+
"rosterVerified": {
|
|
97
|
+
"date": "2026-08-28",
|
|
98
|
+
"method": "transcribed from pre-migration TS catalog"
|
|
99
|
+
},
|
|
100
|
+
"liveMatrix": null,
|
|
101
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1587"
|
|
102
|
+
}
|
|
103
|
+
}
|