@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +1 -5
  2. package/dist/adapters/providerImageAdapter.js +43 -19
  3. package/dist/browser/neurolink.min.js +414 -414
  4. package/dist/cli/commands/setup.d.ts +12 -7
  5. package/dist/cli/commands/setup.js +17 -16
  6. package/dist/constants/contextWindows.js +23 -95
  7. package/dist/constants/enums.d.ts +111 -216
  8. package/dist/constants/enums.js +124 -240
  9. package/dist/factories/providerDescriptors.d.ts +2 -4
  10. package/dist/factories/providerDescriptors.js +83 -127
  11. package/dist/hitl/hitlManager.d.ts +14 -0
  12. package/dist/hitl/hitlManager.js +16 -0
  13. package/dist/models/manifestRegistry.js +53 -4
  14. package/dist/neurolink.d.ts +37 -0
  15. package/dist/neurolink.js +39 -0
  16. package/dist/providers/catalog/cerebras.json +75 -0
  17. package/dist/providers/catalog/cloudflare.json +121 -0
  18. package/dist/providers/catalog/fireworks.json +124 -0
  19. package/dist/providers/catalog/groq.json +127 -0
  20. package/dist/providers/catalog/index.generated.d.ts +3 -0
  21. package/dist/providers/catalog/index.generated.js +33 -0
  22. package/dist/providers/catalog/loader.d.ts +6 -0
  23. package/dist/providers/catalog/loader.js +115 -0
  24. package/dist/providers/catalog/mistral.json +244 -0
  25. package/dist/providers/catalog/perplexity.json +103 -0
  26. package/dist/providers/catalog/provider-catalog.schema.json +351 -0
  27. package/dist/providers/catalog/sambanova.json +129 -0
  28. package/dist/providers/catalog/schema.d.ts +123 -0
  29. package/dist/providers/catalog/schema.js +310 -0
  30. package/dist/providers/catalog/together-ai.json +172 -0
  31. package/dist/providers/catalog/xai.json +108 -0
  32. package/dist/providers/openaiCompatCatalog.d.ts +13 -13
  33. package/dist/providers/openaiCompatCatalog.js +15 -326
  34. package/dist/types/hitl.d.ts +2 -0
  35. package/dist/types/index.d.ts +2 -0
  36. package/dist/types/index.js +2 -0
  37. package/dist/types/providerCatalog.d.ts +149 -0
  38. package/dist/types/providerCatalog.generated.d.ts +2 -0
  39. package/dist/types/providerCatalog.generated.js +1 -0
  40. package/dist/types/providerCatalog.js +7 -0
  41. package/dist/types/providers.d.ts +14 -14
  42. package/dist/utils/modelChoices.d.ts +11 -3
  43. package/dist/utils/modelChoices.js +84 -190
  44. package/dist/utils/pricing.js +92 -127
  45. package/dist/utils/providerConfig.d.ts +1 -1
  46. package/dist/utils/providerConfig.js +24 -108
  47. package/package.json +2 -1
  48. package/dist/models/manifests/cerebras.d.ts +0 -9
  49. package/dist/models/manifests/cerebras.js +0 -19
  50. package/dist/models/manifests/sambanova.d.ts +0 -11
  51. 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
  }
@@ -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: cerebrasManifest,
62
- sambanova: sambanovaManifest,
110
+ cerebras: catalogManifest("cerebras"),
111
+ sambanova: catalogManifest("sambanova"),
63
112
  cohere: cohereManifest,
64
113
  "together-ai": togetherAiManifest,
65
114
  fireworks: fireworksManifest,
@@ -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"];