@juspay/neurolink 12.4.4 → 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/hitl/hitlManager.d.ts +14 -0
- package/dist/hitl/hitlManager.js +16 -0
- package/dist/models/manifestRegistry.js +53 -4
- package/dist/neurolink.d.ts +37 -0
- package/dist/neurolink.js +39 -0
- 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/hitl.d.ts +2 -0
- 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
|
@@ -97,4 +97,18 @@ export declare class HITLManager extends EventEmitter {
|
|
|
97
97
|
* Get count of pending confirmations
|
|
98
98
|
*/
|
|
99
99
|
getPendingCount(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Whether a specific confirmation is still awaiting a response on this manager.
|
|
102
|
+
*
|
|
103
|
+
* A pending entry holds the `resolve`/`reject` of the suspended tool call, so it
|
|
104
|
+
* exists only in the memory of the manager that issued it. A manager constructed
|
|
105
|
+
* after the confirmation was issued — a session rebuilt from persisted state, for
|
|
106
|
+
* example — has an empty set, and `processUserResponse` for such an id logs a
|
|
107
|
+
* warning and returns without resolving anything.
|
|
108
|
+
*
|
|
109
|
+
* Callers that report an outcome back to a user should check this before treating
|
|
110
|
+
* a delivered `hitl:confirmation-response` as acted upon: the event being received
|
|
111
|
+
* says a listener existed, not that anything was waiting for it.
|
|
112
|
+
*/
|
|
113
|
+
hasPendingConfirmation(confirmationId: string): boolean;
|
|
100
114
|
}
|
package/dist/hitl/hitlManager.js
CHANGED
|
@@ -457,4 +457,20 @@ export class HITLManager extends EventEmitter {
|
|
|
457
457
|
getPendingCount() {
|
|
458
458
|
return this.pendingConfirmations.size;
|
|
459
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Whether a specific confirmation is still awaiting a response on this manager.
|
|
462
|
+
*
|
|
463
|
+
* A pending entry holds the `resolve`/`reject` of the suspended tool call, so it
|
|
464
|
+
* exists only in the memory of the manager that issued it. A manager constructed
|
|
465
|
+
* after the confirmation was issued — a session rebuilt from persisted state, for
|
|
466
|
+
* example — has an empty set, and `processUserResponse` for such an id logs a
|
|
467
|
+
* warning and returns without resolving anything.
|
|
468
|
+
*
|
|
469
|
+
* Callers that report an outcome back to a user should check this before treating
|
|
470
|
+
* a delivered `hitl:confirmation-response` as acted upon: the event being received
|
|
471
|
+
* says a listener existed, not that anything was waiting for it.
|
|
472
|
+
*/
|
|
473
|
+
hasPendingConfirmation(confirmationId) {
|
|
474
|
+
return this.pendingConfirmations.has(confirmationId);
|
|
475
|
+
}
|
|
460
476
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PROVIDER_MAX_TOKENS } from "../core/constants.js";
|
|
2
|
+
import { getCatalogJsonEntries } from "../providers/catalog/loader.js";
|
|
2
3
|
import { anthropicManifest } from "./manifests/anthropic.js";
|
|
3
4
|
import { openaiManifest } from "./manifests/openai.js";
|
|
4
5
|
import { azureManifest } from "./manifests/azure.js";
|
|
@@ -18,8 +19,6 @@ import { lmStudioManifest } from "./manifests/lm-studio.js";
|
|
|
18
19
|
import { llamacppManifest } from "./manifests/llamacpp.js";
|
|
19
20
|
import { xaiManifest } from "./manifests/xai.js";
|
|
20
21
|
import { groqManifest } from "./manifests/groq.js";
|
|
21
|
-
import { cerebrasManifest } from "./manifests/cerebras.js";
|
|
22
|
-
import { sambanovaManifest } from "./manifests/sambanova.js";
|
|
23
22
|
import { cohereManifest } from "./manifests/cohere.js";
|
|
24
23
|
import { togetherAiManifest } from "./manifests/together-ai.js";
|
|
25
24
|
import { fireworksManifest } from "./manifests/fireworks.js";
|
|
@@ -31,6 +30,56 @@ import { jinaManifest } from "./manifests/jina.js";
|
|
|
31
30
|
import { stabilityManifest } from "./manifests/stability.js";
|
|
32
31
|
import { ideogramManifest } from "./manifests/ideogram.js";
|
|
33
32
|
import { recraftManifest } from "./manifests/recraft.js";
|
|
33
|
+
/**
|
|
34
|
+
* Builds a manifest for a JSON-catalog provider from its catalog entry.
|
|
35
|
+
*
|
|
36
|
+
* Only used for cerebras and sambanova (see MANIFEST_REGISTRY below) — the
|
|
37
|
+
* catalog JSON carries no per-model `maxOutputTokens`, only a provider-wide
|
|
38
|
+
* `models.defaultMaxOutputTokens`, so every derived entry uses that ceiling.
|
|
39
|
+
* For cerebras/sambanova this is 8192, identical to their old hand-written
|
|
40
|
+
* manifests' `maxOutputTokens`. The other 7 catalog providers' hand
|
|
41
|
+
* manifests carry higher documented ceilings — 64000 for groq, xai,
|
|
42
|
+
* together-ai, fireworks and perplexity, 8192 for mistral and cloudflare —
|
|
43
|
+
* that the JSON's `defaultMaxOutputTokens` (a generic 4096 placeholder for
|
|
44
|
+
* all 7) would silently regress, so they stay hand-written, untouched.
|
|
45
|
+
*
|
|
46
|
+
* `contextWindow` falls back to `models.defaultContextWindow` when a model
|
|
47
|
+
* spec omits its own (matches resolveManifestEntry's synthesized-`_default`
|
|
48
|
+
* fallback pattern above). `aliases` is always `[]` — CatalogModelSpec has
|
|
49
|
+
* no alias field.
|
|
50
|
+
*/
|
|
51
|
+
function buildCatalogManifest(entry) {
|
|
52
|
+
const namedModels = Object.fromEntries(Object.entries(entry.models.catalog).map(([modelId, spec]) => [
|
|
53
|
+
modelId,
|
|
54
|
+
{
|
|
55
|
+
aliases: [],
|
|
56
|
+
contextWindow: spec.contextWindow ?? entry.models.defaultContextWindow,
|
|
57
|
+
maxOutputTokens: entry.models.defaultMaxOutputTokens,
|
|
58
|
+
vision: spec.vision,
|
|
59
|
+
functionCalling: entry.capabilities.tools,
|
|
60
|
+
},
|
|
61
|
+
]));
|
|
62
|
+
return {
|
|
63
|
+
defaultContextWindow: entry.models.defaultContextWindow,
|
|
64
|
+
models: {
|
|
65
|
+
_default: {
|
|
66
|
+
aliases: [],
|
|
67
|
+
contextWindow: entry.models.defaultContextWindow,
|
|
68
|
+
maxOutputTokens: entry.models.defaultMaxOutputTokens,
|
|
69
|
+
vision: false,
|
|
70
|
+
functionCalling: entry.capabilities.tools,
|
|
71
|
+
},
|
|
72
|
+
...namedModels,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const catalogManifest = (id) => {
|
|
77
|
+
const entry = getCatalogJsonEntries().find((e) => e.id === id);
|
|
78
|
+
if (!entry) {
|
|
79
|
+
throw new Error(`No catalog JSON entry found for provider "${id}"`);
|
|
80
|
+
}
|
|
81
|
+
return buildCatalogManifest(entry);
|
|
82
|
+
};
|
|
34
83
|
/**
|
|
35
84
|
* Every provider's model manifest, keyed by the exact AIProviderName enum
|
|
36
85
|
* value (kebab-case) — e.g. "google-ai", "nvidia-nim". Manifests are pure
|
|
@@ -58,8 +107,8 @@ export const MANIFEST_REGISTRY = {
|
|
|
58
107
|
llamacpp: llamacppManifest,
|
|
59
108
|
xai: xaiManifest,
|
|
60
109
|
groq: groqManifest,
|
|
61
|
-
cerebras:
|
|
62
|
-
sambanova:
|
|
110
|
+
cerebras: catalogManifest("cerebras"),
|
|
111
|
+
sambanova: catalogManifest("sambanova"),
|
|
63
112
|
cohere: cohereManifest,
|
|
64
113
|
"together-ai": togetherAiManifest,
|
|
65
114
|
fireworks: fireworksManifest,
|
package/dist/neurolink.d.ts
CHANGED
|
@@ -1311,6 +1311,43 @@ export declare class NeuroLink {
|
|
|
1311
1311
|
* @see {@link NeuroLink.executeTool} for events related to tool execution
|
|
1312
1312
|
*/
|
|
1313
1313
|
getEventEmitter(): TypedEventEmitter<NeuroLinkEvents>;
|
|
1314
|
+
/**
|
|
1315
|
+
* Whether a HITL confirmation is still awaiting a response on THIS instance.
|
|
1316
|
+
*
|
|
1317
|
+
* Emitting `hitl:confirmation-response` is not proof the decision landed. The
|
|
1318
|
+
* forwarding listener for that event is installed once at construction, so
|
|
1319
|
+
* `emitter.emit(...)` reports a listener was invoked even when nothing is
|
|
1320
|
+
* waiting — the pending set lives one hop further in, on the HITL manager, and
|
|
1321
|
+
* holds the `resolve`/`reject` of the suspended tool call. An instance built
|
|
1322
|
+
* after the confirmation was issued (a session rebuilt from persisted state)
|
|
1323
|
+
* therefore accepts the event and resolves nothing.
|
|
1324
|
+
*
|
|
1325
|
+
* Returns `false` in two different situations, which it deliberately does not
|
|
1326
|
+
* distinguish: HITL was never configured on this instance, and the id is
|
|
1327
|
+
* unknown or already settled. Both mean "emitting a response here achieves
|
|
1328
|
+
* nothing", which is the question this answers. A caller that needs to tell a
|
|
1329
|
+
* configuration mistake from an expired confirmation should check the HITL
|
|
1330
|
+
* config separately rather than read that into this boolean.
|
|
1331
|
+
*
|
|
1332
|
+
* This is advisory, not atomic: it reports the state at the moment it is
|
|
1333
|
+
* called. Nothing stops the confirmation timing out immediately afterwards, so
|
|
1334
|
+
* emit on the answer without an `await` in between. Over the case it exists
|
|
1335
|
+
* for — an instance rebuilt from persisted state, whose pending set is empty
|
|
1336
|
+
* and can never repopulate for an id it never issued — absence cannot become
|
|
1337
|
+
* presence, so the answer cannot go stale in the unsafe direction.
|
|
1338
|
+
*
|
|
1339
|
+
* @param confirmationId - The id from the `hitl:confirmation-request` event
|
|
1340
|
+
* @returns `true` only if this instance is still holding that confirmation
|
|
1341
|
+
*
|
|
1342
|
+
* @example
|
|
1343
|
+
* ```typescript
|
|
1344
|
+
* if (!neurolink.hasPendingHITLConfirmation(confirmationId)) {
|
|
1345
|
+
* return refuse("This conversation has expired, so the action was not carried out.");
|
|
1346
|
+
* }
|
|
1347
|
+
* neurolink.getEventEmitter().emit("hitl:confirmation-response", { ... });
|
|
1348
|
+
* ```
|
|
1349
|
+
*/
|
|
1350
|
+
hasPendingHITLConfirmation(confirmationId: string): boolean;
|
|
1314
1351
|
/**
|
|
1315
1352
|
* Returns the instance-level tool-dedup configuration, or `undefined` when
|
|
1316
1353
|
* toolDedup was not provided at construction time.
|
package/dist/neurolink.js
CHANGED
|
@@ -9132,6 +9132,45 @@ Current user's request: ${currentInput}`;
|
|
|
9132
9132
|
getEventEmitter() {
|
|
9133
9133
|
return this.emitter;
|
|
9134
9134
|
}
|
|
9135
|
+
/**
|
|
9136
|
+
* Whether a HITL confirmation is still awaiting a response on THIS instance.
|
|
9137
|
+
*
|
|
9138
|
+
* Emitting `hitl:confirmation-response` is not proof the decision landed. The
|
|
9139
|
+
* forwarding listener for that event is installed once at construction, so
|
|
9140
|
+
* `emitter.emit(...)` reports a listener was invoked even when nothing is
|
|
9141
|
+
* waiting — the pending set lives one hop further in, on the HITL manager, and
|
|
9142
|
+
* holds the `resolve`/`reject` of the suspended tool call. An instance built
|
|
9143
|
+
* after the confirmation was issued (a session rebuilt from persisted state)
|
|
9144
|
+
* therefore accepts the event and resolves nothing.
|
|
9145
|
+
*
|
|
9146
|
+
* Returns `false` in two different situations, which it deliberately does not
|
|
9147
|
+
* distinguish: HITL was never configured on this instance, and the id is
|
|
9148
|
+
* unknown or already settled. Both mean "emitting a response here achieves
|
|
9149
|
+
* nothing", which is the question this answers. A caller that needs to tell a
|
|
9150
|
+
* configuration mistake from an expired confirmation should check the HITL
|
|
9151
|
+
* config separately rather than read that into this boolean.
|
|
9152
|
+
*
|
|
9153
|
+
* This is advisory, not atomic: it reports the state at the moment it is
|
|
9154
|
+
* called. Nothing stops the confirmation timing out immediately afterwards, so
|
|
9155
|
+
* emit on the answer without an `await` in between. Over the case it exists
|
|
9156
|
+
* for — an instance rebuilt from persisted state, whose pending set is empty
|
|
9157
|
+
* and can never repopulate for an id it never issued — absence cannot become
|
|
9158
|
+
* presence, so the answer cannot go stale in the unsafe direction.
|
|
9159
|
+
*
|
|
9160
|
+
* @param confirmationId - The id from the `hitl:confirmation-request` event
|
|
9161
|
+
* @returns `true` only if this instance is still holding that confirmation
|
|
9162
|
+
*
|
|
9163
|
+
* @example
|
|
9164
|
+
* ```typescript
|
|
9165
|
+
* if (!neurolink.hasPendingHITLConfirmation(confirmationId)) {
|
|
9166
|
+
* return refuse("This conversation has expired, so the action was not carried out.");
|
|
9167
|
+
* }
|
|
9168
|
+
* neurolink.getEventEmitter().emit("hitl:confirmation-response", { ... });
|
|
9169
|
+
* ```
|
|
9170
|
+
*/
|
|
9171
|
+
hasPendingHITLConfirmation(confirmationId) {
|
|
9172
|
+
return this.hitlManager?.hasPendingConfirmation(confirmationId) ?? false;
|
|
9173
|
+
}
|
|
9135
9174
|
/**
|
|
9136
9175
|
* Returns the instance-level tool-dedup configuration, or `undefined` when
|
|
9137
9176
|
* toolDedup was not provided at construction time.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "cerebras",
|
|
4
|
+
"displayName": "Cerebras",
|
|
5
|
+
"aliases": [],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURL": "https://api.cerebras.ai/v1"
|
|
9
|
+
},
|
|
10
|
+
"models": {
|
|
11
|
+
"default": "gpt-oss-120b",
|
|
12
|
+
"fallbacks": ["gpt-oss-120b", "gemma-4-31b"],
|
|
13
|
+
"defaultContextWindow": 65536,
|
|
14
|
+
"defaultMaxOutputTokens": 8192,
|
|
15
|
+
"catalog": {
|
|
16
|
+
"gpt-oss-120b": {
|
|
17
|
+
"contextWindow": 65536,
|
|
18
|
+
"pricingPerMTok": { "input": 0.35, "output": 0.75 },
|
|
19
|
+
"vision": false,
|
|
20
|
+
"status": "production",
|
|
21
|
+
"description": "Recommended - OpenAI GPT-OSS 120B (open-weight); wafer-scale speed"
|
|
22
|
+
},
|
|
23
|
+
"gemma-4-31b": {
|
|
24
|
+
"contextWindow": 65536,
|
|
25
|
+
"pricingPerMTok": { "input": 0.99, "output": 1.49 },
|
|
26
|
+
"vision": false,
|
|
27
|
+
"status": "production",
|
|
28
|
+
"description": "Google Gemma 4 31B"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"topModels": ["gpt-oss-120b", "gemma-4-31b"]
|
|
32
|
+
},
|
|
33
|
+
"capabilities": {
|
|
34
|
+
"text": true,
|
|
35
|
+
"streaming": true,
|
|
36
|
+
"tools": true,
|
|
37
|
+
"toolsWithStreaming": true,
|
|
38
|
+
"structuredOutput": true,
|
|
39
|
+
"structuredOutputWithTools": false,
|
|
40
|
+
"embeddings": false,
|
|
41
|
+
"thinking": false
|
|
42
|
+
},
|
|
43
|
+
"errorRules": [
|
|
44
|
+
{
|
|
45
|
+
"status": 401,
|
|
46
|
+
"pattern": "wrong_api_key|Wrong API Key|invalid_api_key",
|
|
47
|
+
"class": "authentication",
|
|
48
|
+
"message": "Invalid Cerebras API key. Check {apiKeyEnvVar}. Get one at https://cloud.cerebras.ai"
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"setup": {
|
|
52
|
+
"url": "https://cloud.cerebras.ai",
|
|
53
|
+
"apiKeyFormat": null,
|
|
54
|
+
"billingPolicy": "free-with-card",
|
|
55
|
+
"instructions": [
|
|
56
|
+
"1. Visit: https://cloud.cerebras.ai",
|
|
57
|
+
"2. Sign in or create a free Cerebras account",
|
|
58
|
+
"3. Create an API key under API Keys",
|
|
59
|
+
"4. Set {apiKeyEnvVar} in your .env file"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"evidence": {
|
|
63
|
+
"rosterVerified": {
|
|
64
|
+
"date": "2026-08-27",
|
|
65
|
+
"method": "authenticated GET /v1/models"
|
|
66
|
+
},
|
|
67
|
+
"authProbe": {
|
|
68
|
+
"date": "2026-08-26",
|
|
69
|
+
"status": 401,
|
|
70
|
+
"code": "wrong_api_key"
|
|
71
|
+
},
|
|
72
|
+
"liveMatrix": { "date": "2026-08-27", "result": "4/4" },
|
|
73
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1561"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "cloudflare",
|
|
4
|
+
"displayName": "Cloudflare Workers AI",
|
|
5
|
+
"aliases": ["workers-ai", "cf-ai"],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURLTemplate": "https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1",
|
|
9
|
+
"extraCredentials": ["accountId"],
|
|
10
|
+
"missingCredentialMessage": "CLOUDFLARE_ACCOUNT_ID is required (or pass credentials.cloudflare.accountId). Get the account id from https://dash.cloudflare.com/"
|
|
11
|
+
},
|
|
12
|
+
"models": {
|
|
13
|
+
"default": "@cf/meta/llama-3.3-70b-instruct-fp8-fast",
|
|
14
|
+
"fallbackModelName": "@cf/meta/llama-3.1-8b-instruct-fast",
|
|
15
|
+
"fallbacks": [
|
|
16
|
+
"@cf/meta/llama-3.3-70b-instruct-fp8-fast",
|
|
17
|
+
"@cf/meta/llama-3.1-70b-instruct",
|
|
18
|
+
"@cf/meta/llama-3.1-8b-instruct-fast",
|
|
19
|
+
"@cf/meta/llama-3.2-11b-vision-instruct",
|
|
20
|
+
"@cf/mistral/mistral-7b-instruct-v0.2",
|
|
21
|
+
"@cf/qwen/qwen1.5-14b-chat-awq"
|
|
22
|
+
],
|
|
23
|
+
"defaultContextWindow": 8192,
|
|
24
|
+
"defaultMaxOutputTokens": 4096,
|
|
25
|
+
"catalog": {
|
|
26
|
+
"@cf/meta/llama-3.3-70b-instruct-fp8-fast": {
|
|
27
|
+
"enumMember": "LLAMA_3_3_70B_FAST",
|
|
28
|
+
"contextWindow": 24000,
|
|
29
|
+
"vision": false,
|
|
30
|
+
"status": "production",
|
|
31
|
+
"description": "Recommended - Llama 3.3 70B Instruct (FP8 fast)"
|
|
32
|
+
},
|
|
33
|
+
"@cf/meta/llama-3.1-70b-instruct": {
|
|
34
|
+
"enumMember": "LLAMA_3_1_70B_INSTRUCT",
|
|
35
|
+
"contextWindow": 24000,
|
|
36
|
+
"vision": false,
|
|
37
|
+
"status": "production",
|
|
38
|
+
"description": "Llama 3.1 70B Instruct"
|
|
39
|
+
},
|
|
40
|
+
"@cf/meta/llama-3.1-8b-instruct-fast": {
|
|
41
|
+
"enumMember": "LLAMA_3_1_8B_FAST",
|
|
42
|
+
"contextWindow": 24000,
|
|
43
|
+
"vision": false,
|
|
44
|
+
"status": "production",
|
|
45
|
+
"description": "Llama 3.1 8B Instruct (fast)"
|
|
46
|
+
},
|
|
47
|
+
"@cf/meta/llama-3.2-11b-vision-instruct": {
|
|
48
|
+
"enumMember": "LLAMA_3_2_11B_VISION",
|
|
49
|
+
"contextWindow": 24000,
|
|
50
|
+
"vision": true,
|
|
51
|
+
"status": "production",
|
|
52
|
+
"description": "Llama 3.2 11B Vision Instruct"
|
|
53
|
+
},
|
|
54
|
+
"@cf/mistral/mistral-7b-instruct-v0.2": {
|
|
55
|
+
"enumMember": "MISTRAL_7B_INSTRUCT_V0_2",
|
|
56
|
+
"contextWindow": 32768,
|
|
57
|
+
"vision": false,
|
|
58
|
+
"status": "production",
|
|
59
|
+
"description": "Mistral 7B Instruct v0.2"
|
|
60
|
+
},
|
|
61
|
+
"@cf/qwen/qwen1.5-14b-chat-awq": {
|
|
62
|
+
"enumMember": "QWEN_1P5_14B_CHAT_AWQ",
|
|
63
|
+
"contextWindow": 7500,
|
|
64
|
+
"vision": false,
|
|
65
|
+
"status": "production",
|
|
66
|
+
"description": "Qwen 1.5 14B Chat AWQ"
|
|
67
|
+
},
|
|
68
|
+
"@cf/google/gemma-2b-it-lora": {
|
|
69
|
+
"enumMember": "GEMMA_2B_IT_LORA",
|
|
70
|
+
"contextWindow": 4096,
|
|
71
|
+
"vision": false,
|
|
72
|
+
"status": "production",
|
|
73
|
+
"description": "Gemma 2B IT (LoRA)"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"topModels": [
|
|
77
|
+
"@cf/meta/llama-3.3-70b-instruct-fp8-fast",
|
|
78
|
+
"@cf/meta/llama-3.1-70b-instruct",
|
|
79
|
+
"@cf/meta/llama-3.1-8b-instruct-fast",
|
|
80
|
+
"@cf/meta/llama-3.2-11b-vision-instruct"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"capabilities": {
|
|
84
|
+
"text": true,
|
|
85
|
+
"streaming": true,
|
|
86
|
+
"tools": true,
|
|
87
|
+
"toolsWithStreaming": true,
|
|
88
|
+
"structuredOutput": false,
|
|
89
|
+
"structuredOutputWithTools": false,
|
|
90
|
+
"embeddings": false,
|
|
91
|
+
"thinking": false
|
|
92
|
+
},
|
|
93
|
+
"errorRules": [
|
|
94
|
+
{
|
|
95
|
+
"status": 401,
|
|
96
|
+
"pattern": "Invalid API key|Authentication",
|
|
97
|
+
"class": "authentication",
|
|
98
|
+
"message": "Invalid Cloudflare API key. Use a token with Workers AI Read+Write scope. Get one at https://dash.cloudflare.com/profile/api-tokens"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"setup": {
|
|
102
|
+
"url": "https://dash.cloudflare.com/profile/api-tokens",
|
|
103
|
+
"apiKeyFormat": null,
|
|
104
|
+
"billingPolicy": "free-tier",
|
|
105
|
+
"description": "API token (Workers AI Read+Write scope)",
|
|
106
|
+
"instructions": [
|
|
107
|
+
"1. Visit: https://dash.cloudflare.com/profile/api-tokens",
|
|
108
|
+
"2. Create a token with 'Workers AI: Read + Write' scope",
|
|
109
|
+
"3. Set {apiKeyEnvVar} in your .env file",
|
|
110
|
+
"4. Also set CLOUDFLARE_ACCOUNT_ID (find it in the dashboard URL or under 'Account ID')"
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
"evidence": {
|
|
114
|
+
"rosterVerified": {
|
|
115
|
+
"date": "2026-08-28",
|
|
116
|
+
"method": "transcribed from pre-migration TS catalog"
|
|
117
|
+
},
|
|
118
|
+
"liveMatrix": null,
|
|
119
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1587"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "fireworks",
|
|
4
|
+
"displayName": "Fireworks AI",
|
|
5
|
+
"aliases": [],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURL": "https://api.fireworks.ai/inference/v1"
|
|
9
|
+
},
|
|
10
|
+
"models": {
|
|
11
|
+
"default": "accounts/fireworks/models/deepseek-v4-pro",
|
|
12
|
+
"testModel": "accounts/fireworks/models/kimi-k2p6",
|
|
13
|
+
"fallbackModelName": "accounts/fireworks/models/deepseek-v4-pro",
|
|
14
|
+
"fallbacks": [
|
|
15
|
+
"accounts/fireworks/models/deepseek-v4-pro",
|
|
16
|
+
"accounts/fireworks/models/glm-5p1",
|
|
17
|
+
"accounts/fireworks/models/glm-5",
|
|
18
|
+
"accounts/fireworks/models/kimi-k2p6",
|
|
19
|
+
"accounts/fireworks/models/kimi-k2p5",
|
|
20
|
+
"accounts/fireworks/models/gpt-oss-120b"
|
|
21
|
+
],
|
|
22
|
+
"defaultContextWindow": 128000,
|
|
23
|
+
"defaultMaxOutputTokens": 4096,
|
|
24
|
+
"catalog": {
|
|
25
|
+
"accounts/fireworks/models/deepseek-v4-pro": {
|
|
26
|
+
"enumMember": "DEEPSEEK_V4_PRO",
|
|
27
|
+
"vision": false,
|
|
28
|
+
"status": "production",
|
|
29
|
+
"description": "Recommended - DeepSeek V4 Pro, current general-purpose default"
|
|
30
|
+
},
|
|
31
|
+
"accounts/fireworks/models/glm-5p1": {
|
|
32
|
+
"enumMember": "GLM_5P1",
|
|
33
|
+
"vision": false,
|
|
34
|
+
"status": "production",
|
|
35
|
+
"description": "GLM 5.1 — Zhipu flagship"
|
|
36
|
+
},
|
|
37
|
+
"accounts/fireworks/models/glm-5": {
|
|
38
|
+
"enumMember": "GLM_5",
|
|
39
|
+
"vision": false,
|
|
40
|
+
"status": "production",
|
|
41
|
+
"description": "GLM 5 — broader coverage"
|
|
42
|
+
},
|
|
43
|
+
"accounts/fireworks/models/kimi-k2p6": {
|
|
44
|
+
"enumMember": "KIMI_K2P6",
|
|
45
|
+
"vision": false,
|
|
46
|
+
"status": "production",
|
|
47
|
+
"description": "Kimi K2.6 — Moonshot flagship"
|
|
48
|
+
},
|
|
49
|
+
"accounts/fireworks/models/kimi-k2p5": {
|
|
50
|
+
"enumMember": "KIMI_K2P5",
|
|
51
|
+
"vision": false,
|
|
52
|
+
"status": "production",
|
|
53
|
+
"description": "Kimi K2.5 — preceding Kimi"
|
|
54
|
+
},
|
|
55
|
+
"accounts/fireworks/models/gpt-oss-120b": {
|
|
56
|
+
"enumMember": "GPT_OSS_120B",
|
|
57
|
+
"vision": false,
|
|
58
|
+
"status": "production",
|
|
59
|
+
"description": "GPT-OSS 120B — Apache-2.0 OpenAI weights"
|
|
60
|
+
},
|
|
61
|
+
"accounts/fireworks/models/llama-v3p2-90b-vision-instruct": {
|
|
62
|
+
"enumMember": "LLAMA_V3P2_90B_VISION_INSTRUCT",
|
|
63
|
+
"vision": true,
|
|
64
|
+
"status": "production",
|
|
65
|
+
"description": "Llama 3.2 90B Vision Instruct — vision-capable; restored from the pre-migration adapter's vision map (contextWindow/pricing not yet re-verified)"
|
|
66
|
+
},
|
|
67
|
+
"accounts/fireworks/models/llama-v3p2-11b-vision-instruct": {
|
|
68
|
+
"enumMember": "LLAMA_V3P2_11B_VISION_INSTRUCT",
|
|
69
|
+
"vision": true,
|
|
70
|
+
"status": "production",
|
|
71
|
+
"description": "Llama 3.2 11B Vision Instruct — vision-capable; restored from the pre-migration adapter's vision map (contextWindow/pricing not yet re-verified)"
|
|
72
|
+
},
|
|
73
|
+
"accounts/fireworks/models/phi-3-vision-128k-instruct": {
|
|
74
|
+
"enumMember": "PHI_3_VISION_128K_INSTRUCT",
|
|
75
|
+
"vision": true,
|
|
76
|
+
"status": "production",
|
|
77
|
+
"description": "Phi-3 Vision 128K Instruct — vision-capable; restored from the pre-migration adapter's vision map (contextWindow/pricing not yet re-verified)"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"topModels": [
|
|
81
|
+
"accounts/fireworks/models/deepseek-v4-pro",
|
|
82
|
+
"accounts/fireworks/models/glm-5p1",
|
|
83
|
+
"accounts/fireworks/models/kimi-k2p6",
|
|
84
|
+
"accounts/fireworks/models/gpt-oss-120b"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"capabilities": {
|
|
88
|
+
"text": true,
|
|
89
|
+
"streaming": true,
|
|
90
|
+
"tools": true,
|
|
91
|
+
"toolsWithStreaming": true,
|
|
92
|
+
"structuredOutput": true,
|
|
93
|
+
"structuredOutputWithTools": true,
|
|
94
|
+
"embeddings": false,
|
|
95
|
+
"thinking": false
|
|
96
|
+
},
|
|
97
|
+
"errorRules": [
|
|
98
|
+
{
|
|
99
|
+
"status": 401,
|
|
100
|
+
"pattern": "Invalid API key|Authentication",
|
|
101
|
+
"class": "authentication",
|
|
102
|
+
"message": "Invalid Fireworks API key. Get one at https://fireworks.ai/account/api-keys"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"setup": {
|
|
106
|
+
"url": "https://fireworks.ai/account/api-keys",
|
|
107
|
+
"apiKeyFormat": null,
|
|
108
|
+
"billingPolicy": "free-with-card",
|
|
109
|
+
"instructions": [
|
|
110
|
+
"1. Visit: https://fireworks.ai/account/api-keys",
|
|
111
|
+
"2. Sign in to your Fireworks AI account",
|
|
112
|
+
"3. Create a new API key",
|
|
113
|
+
"4. Set {apiKeyEnvVar} in your .env file"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
"evidence": {
|
|
117
|
+
"rosterVerified": {
|
|
118
|
+
"date": "2026-08-28",
|
|
119
|
+
"method": "transcribed from pre-migration TS catalog"
|
|
120
|
+
},
|
|
121
|
+
"liveMatrix": null,
|
|
122
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1587"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./provider-catalog.schema.json",
|
|
3
|
+
"id": "groq",
|
|
4
|
+
"displayName": "Groq",
|
|
5
|
+
"aliases": [],
|
|
6
|
+
"tier": 2,
|
|
7
|
+
"wire": {
|
|
8
|
+
"baseURL": "https://api.groq.com/openai/v1"
|
|
9
|
+
},
|
|
10
|
+
"models": {
|
|
11
|
+
"default": "llama-3.3-70b-versatile",
|
|
12
|
+
"testModel": "openai/gpt-oss-120b",
|
|
13
|
+
"fallbacks": [
|
|
14
|
+
"llama-3.3-70b-versatile",
|
|
15
|
+
"llama-3.1-8b-instant",
|
|
16
|
+
"gemma2-9b-it",
|
|
17
|
+
"mixtral-8x7b-32768",
|
|
18
|
+
"llama-3.2-90b-vision-preview",
|
|
19
|
+
"llama-3.2-11b-vision-preview"
|
|
20
|
+
],
|
|
21
|
+
"defaultContextWindow": 128000,
|
|
22
|
+
"defaultMaxOutputTokens": 4096,
|
|
23
|
+
"catalog": {
|
|
24
|
+
"llama-3.3-70b-versatile": {
|
|
25
|
+
"contextWindow": 131072,
|
|
26
|
+
"pricingPerMTok": { "input": 0.59, "output": 0.79 },
|
|
27
|
+
"vision": false,
|
|
28
|
+
"status": "production",
|
|
29
|
+
"description": "Recommended - Production default; sub-100ms"
|
|
30
|
+
},
|
|
31
|
+
"llama-3.1-8b-instant": {
|
|
32
|
+
"contextWindow": 128000,
|
|
33
|
+
"pricingPerMTok": { "input": 0.05, "output": 0.08 },
|
|
34
|
+
"vision": false,
|
|
35
|
+
"status": "production",
|
|
36
|
+
"description": "Lowest latency tier"
|
|
37
|
+
},
|
|
38
|
+
"gemma2-9b-it": {
|
|
39
|
+
"enumMember": "GEMMA_2_9B_IT",
|
|
40
|
+
"contextWindow": 8192,
|
|
41
|
+
"pricingPerMTok": { "input": 0.2, "output": 0.2 },
|
|
42
|
+
"vision": false,
|
|
43
|
+
"status": "production",
|
|
44
|
+
"description": "Google Gemma 2 9B"
|
|
45
|
+
},
|
|
46
|
+
"mixtral-8x7b-32768": {
|
|
47
|
+
"contextWindow": 32768,
|
|
48
|
+
"pricingPerMTok": { "input": 0.24, "output": 0.24 },
|
|
49
|
+
"vision": false,
|
|
50
|
+
"status": "production",
|
|
51
|
+
"description": "Mistral 8x7B MoE, 32K context"
|
|
52
|
+
},
|
|
53
|
+
"llama-guard-3-8b": {
|
|
54
|
+
"contextWindow": 8192,
|
|
55
|
+
"vision": false,
|
|
56
|
+
"status": "production",
|
|
57
|
+
"description": "Llama Guard 3 8B — safety classifier"
|
|
58
|
+
},
|
|
59
|
+
"llama-3.2-90b-vision-preview": {
|
|
60
|
+
"contextWindow": 128000,
|
|
61
|
+
"pricingPerMTok": { "input": 0.9, "output": 0.9 },
|
|
62
|
+
"vision": true,
|
|
63
|
+
"status": "preview",
|
|
64
|
+
"description": "Multimodal (vision)"
|
|
65
|
+
},
|
|
66
|
+
"llama-3.2-11b-vision-preview": {
|
|
67
|
+
"contextWindow": 128000,
|
|
68
|
+
"pricingPerMTok": { "input": 0.18, "output": 0.18 },
|
|
69
|
+
"vision": true,
|
|
70
|
+
"status": "preview",
|
|
71
|
+
"description": "Llama 3.2 11B Vision Preview — smaller multimodal"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"topModels": [
|
|
75
|
+
"llama-3.3-70b-versatile",
|
|
76
|
+
"llama-3.1-8b-instant",
|
|
77
|
+
"llama-3.2-90b-vision-preview",
|
|
78
|
+
"gemma2-9b-it",
|
|
79
|
+
"mixtral-8x7b-32768"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"capabilities": {
|
|
83
|
+
"text": true,
|
|
84
|
+
"streaming": true,
|
|
85
|
+
"tools": true,
|
|
86
|
+
"toolsWithStreaming": true,
|
|
87
|
+
"structuredOutput": true,
|
|
88
|
+
"structuredOutputWithTools": false,
|
|
89
|
+
"embeddings": false,
|
|
90
|
+
"thinking": false
|
|
91
|
+
},
|
|
92
|
+
"errorRules": [
|
|
93
|
+
{
|
|
94
|
+
"status": 401,
|
|
95
|
+
"pattern": "Invalid API key|Authentication|invalid_api_key",
|
|
96
|
+
"class": "authentication",
|
|
97
|
+
"message": "Invalid Groq API key. Check {apiKeyEnvVar}. Get one at https://console.groq.com/keys"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"pattern": "model_decommissioned",
|
|
101
|
+
"class": "invalid-model",
|
|
102
|
+
"message": "Groq model '{model}' was decommissioned. Pick a current model from https://console.groq.com/docs/models."
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"quirks": {
|
|
106
|
+
"timeoutErrorClass": "provider"
|
|
107
|
+
},
|
|
108
|
+
"setup": {
|
|
109
|
+
"url": "https://console.groq.com/keys",
|
|
110
|
+
"apiKeyFormat": null,
|
|
111
|
+
"billingPolicy": "free-tier",
|
|
112
|
+
"instructions": [
|
|
113
|
+
"1. Visit: https://console.groq.com/keys",
|
|
114
|
+
"2. Sign in to your Groq account",
|
|
115
|
+
"3. Create a new API key",
|
|
116
|
+
"4. Set {apiKeyEnvVar} in your .env file"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"evidence": {
|
|
120
|
+
"rosterVerified": {
|
|
121
|
+
"date": "2026-08-28",
|
|
122
|
+
"method": "transcribed from pre-migration TS catalog"
|
|
123
|
+
},
|
|
124
|
+
"liveMatrix": null,
|
|
125
|
+
"addedInPR": "https://github.com/juspay/neurolink/pull/1587"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ProviderCatalogJson } from "../../types/index.js";
|
|
2
|
+
export declare const CATALOG_JSON_ENTRIES: ProviderCatalogJson[];
|
|
3
|
+
export declare const CATALOG_PROVIDER_IDS: readonly ["cerebras", "cloudflare", "fireworks", "groq", "mistral", "perplexity", "sambanova", "together-ai", "xai"];
|