@juspay/neurolink 11.2.2 → 11.2.3
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 +10 -0
- package/dist/browser/neurolink.min.js +392 -392
- package/dist/factories/providerRegistry.d.ts +16 -4
- package/dist/factories/providerRegistry.js +70 -48
- package/dist/lib/factories/providerRegistry.d.ts +16 -4
- package/dist/lib/factories/providerRegistry.js +70 -48
- package/dist/lib/providers/configuredOpenAICompat.js +10 -3
- package/dist/lib/providers/openaiCompatCatalog.js +9 -11
- package/dist/lib/types/providers.d.ts +15 -1
- package/dist/providers/configuredOpenAICompat.js +10 -3
- package/dist/providers/openaiCompatCatalog.js +9 -11
- package/dist/types/providers.d.ts +15 -1
- package/package.json +2 -2
- package/dist/lib/providers/cloudflare.d.ts +0 -26
- package/dist/lib/providers/cloudflare.js +0 -83
- package/dist/lib/providers/fireworks.d.ts +0 -22
- package/dist/lib/providers/fireworks.js +0 -73
- package/dist/lib/providers/groq.d.ts +0 -24
- package/dist/lib/providers/groq.js +0 -83
- package/dist/lib/providers/mistral.d.ts +0 -25
- package/dist/lib/providers/mistral.js +0 -87
- package/dist/lib/providers/perplexity.d.ts +0 -24
- package/dist/lib/providers/perplexity.js +0 -69
- package/dist/lib/providers/togetherAi.d.ts +0 -23
- package/dist/lib/providers/togetherAi.js +0 -73
- package/dist/lib/providers/xai.d.ts +0 -22
- package/dist/lib/providers/xai.js +0 -77
- package/dist/providers/cloudflare.d.ts +0 -26
- package/dist/providers/cloudflare.js +0 -82
- package/dist/providers/fireworks.d.ts +0 -22
- package/dist/providers/fireworks.js +0 -72
- package/dist/providers/groq.d.ts +0 -24
- package/dist/providers/groq.js +0 -82
- package/dist/providers/mistral.d.ts +0 -25
- package/dist/providers/mistral.js +0 -86
- package/dist/providers/perplexity.d.ts +0 -24
- package/dist/providers/perplexity.js +0 -68
- package/dist/providers/togetherAi.d.ts +0 -23
- package/dist/providers/togetherAi.js +0 -72
- package/dist/providers/xai.d.ts +0 -22
- package/dist/providers/xai.js +0 -76
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { CloudflareModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createCloudflareConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
|
-
/**
|
|
9
|
-
* Cloudflare Workers AI exposes an OpenAI-compatible endpoint scoped per
|
|
10
|
-
* account: `https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/v1`.
|
|
11
|
-
* The account id is required — without it the URL would 404.
|
|
12
|
-
*/
|
|
13
|
-
const buildCloudflareBaseURL = (accountId) => `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/v1`;
|
|
14
|
-
const getCloudflareApiKey = () => validateApiKey(createCloudflareConfig());
|
|
15
|
-
const getDefaultCloudflareModel = () => getProviderModel("CLOUDFLARE_MODEL", CloudflareModels.LLAMA_3_3_70B_FAST);
|
|
16
|
-
/**
|
|
17
|
-
* Cloudflare Workers AI Provider — direct HTTP, no AI SDK.
|
|
18
|
-
*
|
|
19
|
-
* Edge-served open models (Llama / Mistral / Qwen / Gemma) at
|
|
20
|
-
* `https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1`
|
|
21
|
-
* (OpenAI-compatible). Cheapest tier for high-volume usage.
|
|
22
|
-
*
|
|
23
|
-
* Required env: `CLOUDFLARE_API_KEY` + `CLOUDFLARE_ACCOUNT_ID`.
|
|
24
|
-
*
|
|
25
|
-
* All request/stream/tool-loop orchestration lives in
|
|
26
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
27
|
-
* and provider-specific error mapping.
|
|
28
|
-
*
|
|
29
|
-
* @see https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/
|
|
30
|
-
*/
|
|
31
|
-
export class CloudflareProvider extends OpenAIChatCompletionsProvider {
|
|
32
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
33
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
34
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
35
|
-
? overrideApiKey
|
|
36
|
-
: getCloudflareApiKey();
|
|
37
|
-
const accountId = (credentials?.accountId ??
|
|
38
|
-
process.env.CLOUDFLARE_ACCOUNT_ID ??
|
|
39
|
-
"").trim();
|
|
40
|
-
if (!accountId) {
|
|
41
|
-
throw new Error("CLOUDFLARE_ACCOUNT_ID is required (or pass credentials.cloudflare.accountId). Get the account id from https://dash.cloudflare.com/");
|
|
42
|
-
}
|
|
43
|
-
const baseURL = credentials?.baseURL ?? buildCloudflareBaseURL(accountId);
|
|
44
|
-
super("cloudflare", modelName, sdk, { baseURL, apiKey });
|
|
45
|
-
logger.debug("Cloudflare Workers AI Provider initialized", {
|
|
46
|
-
modelName: this.modelName,
|
|
47
|
-
providerName: this.providerName,
|
|
48
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
getProviderName() {
|
|
52
|
-
return "cloudflare";
|
|
53
|
-
}
|
|
54
|
-
getDefaultModel() {
|
|
55
|
-
return getDefaultCloudflareModel();
|
|
56
|
-
}
|
|
57
|
-
getFallbackModelName() {
|
|
58
|
-
return CloudflareModels.LLAMA_3_1_8B_FAST;
|
|
59
|
-
}
|
|
60
|
-
getFallbackModels() {
|
|
61
|
-
return [
|
|
62
|
-
CloudflareModels.LLAMA_3_3_70B_FAST,
|
|
63
|
-
CloudflareModels.LLAMA_3_1_70B_INSTRUCT,
|
|
64
|
-
CloudflareModels.LLAMA_3_1_8B_FAST,
|
|
65
|
-
CloudflareModels.LLAMA_3_2_11B_VISION,
|
|
66
|
-
CloudflareModels.MISTRAL_7B_INSTRUCT_V0_2,
|
|
67
|
-
CloudflareModels.QWEN_1P5_14B_CHAT_AWQ,
|
|
68
|
-
];
|
|
69
|
-
}
|
|
70
|
-
formatProviderError(error) {
|
|
71
|
-
const rules = [
|
|
72
|
-
{
|
|
73
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
74
|
-
/Invalid API key|Authentication/i.test(ctx.message),
|
|
75
|
-
errorClass: AuthenticationError,
|
|
76
|
-
message: "Invalid Cloudflare API key. Use a token with Workers AI Read+Write scope. Get one at https://dash.cloudflare.com/profile/api-tokens",
|
|
77
|
-
},
|
|
78
|
-
...DEFAULT_ERROR_RULES,
|
|
79
|
-
];
|
|
80
|
-
return classifyProviderError(error, rules, "cloudflare", this.modelName);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* Fireworks AI Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* Hosted open-model serving at api.fireworks.ai/inference/v1
|
|
8
|
-
* (OpenAI-compatible). Best for low-latency at scale on Llama / Mixtral /
|
|
9
|
-
* Qwen / DeepSeek. All request/stream/tool-loop orchestration lives in
|
|
10
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
11
|
-
* and provider-specific error mapping.
|
|
12
|
-
*
|
|
13
|
-
* @see https://docs.fireworks.ai/api-reference/introduction
|
|
14
|
-
*/
|
|
15
|
-
export declare class FireworksProvider extends OpenAIChatCompletionsProvider {
|
|
16
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["fireworks"]);
|
|
17
|
-
protected getProviderName(): AIProviderName;
|
|
18
|
-
protected getDefaultModel(): string;
|
|
19
|
-
protected getFallbackModelName(): string;
|
|
20
|
-
protected getFallbackModels(): string[];
|
|
21
|
-
protected formatProviderError(error: unknown): Error;
|
|
22
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { FireworksModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createFireworksConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
|
-
const FIREWORKS_DEFAULT_BASE_URL = "https://api.fireworks.ai/inference/v1";
|
|
9
|
-
const getFireworksApiKey = () => validateApiKey(createFireworksConfig());
|
|
10
|
-
const getDefaultFireworksModel = () => getProviderModel("FIREWORKS_MODEL", FireworksModels.DEEPSEEK_V4_PRO);
|
|
11
|
-
/**
|
|
12
|
-
* Fireworks AI Provider — direct HTTP, no AI SDK.
|
|
13
|
-
*
|
|
14
|
-
* Hosted open-model serving at api.fireworks.ai/inference/v1
|
|
15
|
-
* (OpenAI-compatible). Best for low-latency at scale on Llama / Mixtral /
|
|
16
|
-
* Qwen / DeepSeek. All request/stream/tool-loop orchestration lives in
|
|
17
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
18
|
-
* and provider-specific error mapping.
|
|
19
|
-
*
|
|
20
|
-
* @see https://docs.fireworks.ai/api-reference/introduction
|
|
21
|
-
*/
|
|
22
|
-
export class FireworksProvider extends OpenAIChatCompletionsProvider {
|
|
23
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
24
|
-
// Trim the override before applying precedence. A blank/whitespace
|
|
25
|
-
// `credentials.apiKey` must NOT bypass the env key — that would build a
|
|
26
|
-
// client with an unusable bearer token and fail at request time.
|
|
27
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
28
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
29
|
-
? overrideApiKey
|
|
30
|
-
: getFireworksApiKey();
|
|
31
|
-
const baseURL = credentials?.baseURL?.trim() ||
|
|
32
|
-
process.env.FIREWORKS_BASE_URL?.trim() ||
|
|
33
|
-
FIREWORKS_DEFAULT_BASE_URL;
|
|
34
|
-
super("fireworks", modelName, sdk, { baseURL, apiKey });
|
|
35
|
-
logger.debug("Fireworks Provider initialized", {
|
|
36
|
-
modelName: this.modelName,
|
|
37
|
-
providerName: this.providerName,
|
|
38
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getProviderName() {
|
|
42
|
-
return "fireworks";
|
|
43
|
-
}
|
|
44
|
-
getDefaultModel() {
|
|
45
|
-
return getDefaultFireworksModel();
|
|
46
|
-
}
|
|
47
|
-
getFallbackModelName() {
|
|
48
|
-
return FireworksModels.DEEPSEEK_V4_PRO;
|
|
49
|
-
}
|
|
50
|
-
getFallbackModels() {
|
|
51
|
-
return [
|
|
52
|
-
FireworksModels.DEEPSEEK_V4_PRO,
|
|
53
|
-
FireworksModels.GLM_5P1,
|
|
54
|
-
FireworksModels.GLM_5,
|
|
55
|
-
FireworksModels.KIMI_K2P6,
|
|
56
|
-
FireworksModels.KIMI_K2P5,
|
|
57
|
-
FireworksModels.GPT_OSS_120B,
|
|
58
|
-
];
|
|
59
|
-
}
|
|
60
|
-
formatProviderError(error) {
|
|
61
|
-
const rules = [
|
|
62
|
-
{
|
|
63
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
64
|
-
/Invalid API key|Authentication/i.test(ctx.message),
|
|
65
|
-
errorClass: AuthenticationError,
|
|
66
|
-
message: "Invalid Fireworks API key. Get one at https://fireworks.ai/account/api-keys",
|
|
67
|
-
},
|
|
68
|
-
...DEFAULT_ERROR_RULES,
|
|
69
|
-
];
|
|
70
|
-
return classifyProviderError(error, rules, "fireworks", this.modelName);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=fireworks.js.map
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* Groq Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* Sub-100ms inference of Llama / Mistral / Gemma at api.groq.com/openai/v1
|
|
8
|
-
* (OpenAI-compatible). Best for low-latency tier; trade-off vs other open
|
|
9
|
-
* model hosts is throughput latency, not quality.
|
|
10
|
-
*
|
|
11
|
-
* All request/stream/tool-loop orchestration lives in
|
|
12
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
13
|
-
* and provider-specific error mapping.
|
|
14
|
-
*
|
|
15
|
-
* @see https://console.groq.com/docs/quickstart
|
|
16
|
-
*/
|
|
17
|
-
export declare class GroqProvider extends OpenAIChatCompletionsProvider {
|
|
18
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["groq"]);
|
|
19
|
-
protected getProviderName(): AIProviderName;
|
|
20
|
-
protected getDefaultModel(): string;
|
|
21
|
-
protected getFallbackModelName(): string;
|
|
22
|
-
protected getFallbackModels(): string[];
|
|
23
|
-
protected formatProviderError(error: unknown): Error;
|
|
24
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { GroqModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError, InvalidModelError, ProviderError, } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createGroqConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { TimeoutError } from "../utils/timeout.js";
|
|
8
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
9
|
-
const GROQ_DEFAULT_BASE_URL = "https://api.groq.com/openai/v1";
|
|
10
|
-
const getGroqApiKey = () => validateApiKey(createGroqConfig());
|
|
11
|
-
const getDefaultGroqModel = () => getProviderModel("GROQ_MODEL", GroqModels.LLAMA_3_3_70B_VERSATILE);
|
|
12
|
-
/**
|
|
13
|
-
* Groq Provider — direct HTTP, no AI SDK.
|
|
14
|
-
*
|
|
15
|
-
* Sub-100ms inference of Llama / Mistral / Gemma at api.groq.com/openai/v1
|
|
16
|
-
* (OpenAI-compatible). Best for low-latency tier; trade-off vs other open
|
|
17
|
-
* model hosts is throughput latency, not quality.
|
|
18
|
-
*
|
|
19
|
-
* All request/stream/tool-loop orchestration lives in
|
|
20
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
21
|
-
* and provider-specific error mapping.
|
|
22
|
-
*
|
|
23
|
-
* @see https://console.groq.com/docs/quickstart
|
|
24
|
-
*/
|
|
25
|
-
export class GroqProvider extends OpenAIChatCompletionsProvider {
|
|
26
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
27
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
28
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
29
|
-
? overrideApiKey
|
|
30
|
-
: getGroqApiKey();
|
|
31
|
-
const baseURL = credentials?.baseURL?.trim() ||
|
|
32
|
-
process.env.GROQ_BASE_URL?.trim() ||
|
|
33
|
-
GROQ_DEFAULT_BASE_URL;
|
|
34
|
-
super("groq", modelName, sdk, { baseURL, apiKey });
|
|
35
|
-
logger.debug("Groq Provider initialized", {
|
|
36
|
-
modelName: this.modelName,
|
|
37
|
-
providerName: this.providerName,
|
|
38
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getProviderName() {
|
|
42
|
-
return "groq";
|
|
43
|
-
}
|
|
44
|
-
getDefaultModel() {
|
|
45
|
-
return getDefaultGroqModel();
|
|
46
|
-
}
|
|
47
|
-
getFallbackModelName() {
|
|
48
|
-
return GroqModels.LLAMA_3_1_8B_INSTANT;
|
|
49
|
-
}
|
|
50
|
-
getFallbackModels() {
|
|
51
|
-
return [
|
|
52
|
-
GroqModels.LLAMA_3_3_70B_VERSATILE,
|
|
53
|
-
GroqModels.LLAMA_3_1_8B_INSTANT,
|
|
54
|
-
GroqModels.GEMMA_2_9B_IT,
|
|
55
|
-
GroqModels.MIXTRAL_8X7B_32768,
|
|
56
|
-
GroqModels.LLAMA_3_2_90B_VISION_PREVIEW,
|
|
57
|
-
GroqModels.LLAMA_3_2_11B_VISION_PREVIEW,
|
|
58
|
-
];
|
|
59
|
-
}
|
|
60
|
-
formatProviderError(error) {
|
|
61
|
-
// Groq's TimeoutError maps to plain ProviderError (not NetworkError, the
|
|
62
|
-
// classifier's built-in default) — intercept before delegating.
|
|
63
|
-
if (error instanceof TimeoutError) {
|
|
64
|
-
return new ProviderError(`Groq request timed out: ${error.message}`, "groq");
|
|
65
|
-
}
|
|
66
|
-
const rules = [
|
|
67
|
-
{
|
|
68
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
69
|
-
/Invalid API key|Authentication|invalid_api_key/i.test(ctx.message),
|
|
70
|
-
errorClass: AuthenticationError,
|
|
71
|
-
message: "Invalid Groq API key. Check GROQ_API_KEY. Get one at https://console.groq.com/keys",
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
match: (ctx) => /model_decommissioned/i.test(ctx.message),
|
|
75
|
-
errorClass: InvalidModelError,
|
|
76
|
-
message: (ctx) => `Groq model '${ctx.modelName}' was decommissioned. Pick a current model from https://console.groq.com/docs/models.`,
|
|
77
|
-
},
|
|
78
|
-
...DEFAULT_ERROR_RULES,
|
|
79
|
-
];
|
|
80
|
-
return classifyProviderError(error, rules, "groq", this.modelName);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=groq.js.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* Mistral AI Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* OpenAI-compatible chat completions at api.mistral.ai/v1. All request/stream/
|
|
8
|
-
* tool-loop orchestration lives in `OpenAIChatCompletionsProvider`; this class
|
|
9
|
-
* only declares configuration and the provider-specific error mapping.
|
|
10
|
-
*
|
|
11
|
-
* Mistral's `/chat/completions` accepts `response_format: { type:
|
|
12
|
-
* "json_schema" }` on current models (mistral-small-2506 and newer), so no
|
|
13
|
-
* structured-output downgrade is needed — the base client's default
|
|
14
|
-
* pass-through is correct.
|
|
15
|
-
*
|
|
16
|
-
* @see https://docs.mistral.ai/api/
|
|
17
|
-
*/
|
|
18
|
-
export declare class MistralProvider extends OpenAIChatCompletionsProvider {
|
|
19
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["mistral"]);
|
|
20
|
-
protected getProviderName(): AIProviderName;
|
|
21
|
-
protected getDefaultModel(): string;
|
|
22
|
-
protected formatProviderError(error: unknown): Error;
|
|
23
|
-
protected getFallbackModelName(): string;
|
|
24
|
-
protected getFallbackModels(): string[];
|
|
25
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { MistralModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createMistralConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
|
-
const MISTRAL_DEFAULT_BASE_URL = "https://api.mistral.ai/v1";
|
|
9
|
-
const getMistralApiKey = () => {
|
|
10
|
-
return validateApiKey(createMistralConfig());
|
|
11
|
-
};
|
|
12
|
-
const getDefaultMistralModel = () => {
|
|
13
|
-
// Vision-capable Mistral Small (June 2025) with multimodal support.
|
|
14
|
-
return getProviderModel("MISTRAL_MODEL", MistralModels.MISTRAL_SMALL_2506);
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Mistral AI Provider — direct HTTP, no AI SDK.
|
|
18
|
-
*
|
|
19
|
-
* OpenAI-compatible chat completions at api.mistral.ai/v1. All request/stream/
|
|
20
|
-
* tool-loop orchestration lives in `OpenAIChatCompletionsProvider`; this class
|
|
21
|
-
* only declares configuration and the provider-specific error mapping.
|
|
22
|
-
*
|
|
23
|
-
* Mistral's `/chat/completions` accepts `response_format: { type:
|
|
24
|
-
* "json_schema" }` on current models (mistral-small-2506 and newer), so no
|
|
25
|
-
* structured-output downgrade is needed — the base client's default
|
|
26
|
-
* pass-through is correct.
|
|
27
|
-
*
|
|
28
|
-
* @see https://docs.mistral.ai/api/
|
|
29
|
-
*/
|
|
30
|
-
export class MistralProvider extends OpenAIChatCompletionsProvider {
|
|
31
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
32
|
-
// Trim the override before applying precedence. A blank/whitespace
|
|
33
|
-
// `credentials.apiKey` must NOT bypass `getMistralApiKey()` — that would
|
|
34
|
-
// build a client with an unusable bearer token and fail at request time
|
|
35
|
-
// with a confusing 401 instead of at construction time.
|
|
36
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
37
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
38
|
-
? overrideApiKey
|
|
39
|
-
: getMistralApiKey();
|
|
40
|
-
// Treat blank/whitespace overrides as unset so an empty
|
|
41
|
-
// `credentials.baseURL` or `MISTRAL_BASE_URL=` cannot silently override
|
|
42
|
-
// the default with "" (mirrors the apiKey precedence above).
|
|
43
|
-
const baseURL = credentials?.baseURL?.trim() ||
|
|
44
|
-
process.env.MISTRAL_BASE_URL?.trim() ||
|
|
45
|
-
MISTRAL_DEFAULT_BASE_URL;
|
|
46
|
-
super("mistral", modelName, sdk, { baseURL, apiKey });
|
|
47
|
-
logger.debug("Mistral Provider initialized", {
|
|
48
|
-
modelName: this.modelName,
|
|
49
|
-
providerName: this.providerName,
|
|
50
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
// ===========================================================================
|
|
54
|
-
// Abstract hooks (required)
|
|
55
|
-
// ===========================================================================
|
|
56
|
-
getProviderName() {
|
|
57
|
-
return "mistral";
|
|
58
|
-
}
|
|
59
|
-
getDefaultModel() {
|
|
60
|
-
return getDefaultMistralModel();
|
|
61
|
-
}
|
|
62
|
-
formatProviderError(error) {
|
|
63
|
-
const rules = [
|
|
64
|
-
{
|
|
65
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
66
|
-
/API_KEY_INVALID|Invalid API key|Unauthorized/i.test(ctx.message),
|
|
67
|
-
errorClass: AuthenticationError,
|
|
68
|
-
message: "Invalid Mistral API key. Please check your MISTRAL_API_KEY environment variable.",
|
|
69
|
-
},
|
|
70
|
-
...DEFAULT_ERROR_RULES,
|
|
71
|
-
];
|
|
72
|
-
return classifyProviderError(error, rules, "mistral", this.modelName);
|
|
73
|
-
}
|
|
74
|
-
// ===========================================================================
|
|
75
|
-
// Optional hooks
|
|
76
|
-
// ===========================================================================
|
|
77
|
-
getFallbackModelName() {
|
|
78
|
-
return MistralModels.MISTRAL_SMALL_2506;
|
|
79
|
-
}
|
|
80
|
-
getFallbackModels() {
|
|
81
|
-
return [
|
|
82
|
-
MistralModels.MISTRAL_SMALL_2506,
|
|
83
|
-
MistralModels.MISTRAL_LARGE_LATEST,
|
|
84
|
-
];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=mistral.js.map
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* Perplexity Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* Sonar models with built-in web grounding. OpenAI-compatible chat
|
|
8
|
-
* completions at api.perplexity.ai. Best for queries that need fresh
|
|
9
|
-
* web context (search-augmented answers). Citation data, if the API returns
|
|
10
|
-
* any, is not extracted or exposed by this provider.
|
|
11
|
-
*
|
|
12
|
-
* All request/stream/tool-loop orchestration lives in
|
|
13
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
14
|
-
* and provider-specific error mapping.
|
|
15
|
-
*
|
|
16
|
-
* @see https://docs.perplexity.ai/api-reference/chat-completions
|
|
17
|
-
*/
|
|
18
|
-
export declare class PerplexityProvider extends OpenAIChatCompletionsProvider {
|
|
19
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["perplexity"]);
|
|
20
|
-
protected getProviderName(): AIProviderName;
|
|
21
|
-
protected getDefaultModel(): string;
|
|
22
|
-
protected getFallbackModels(): string[];
|
|
23
|
-
protected formatProviderError(error: unknown): Error;
|
|
24
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { PerplexityModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createPerplexityConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
|
-
const PERPLEXITY_DEFAULT_BASE_URL = "https://api.perplexity.ai";
|
|
9
|
-
const getPerplexityApiKey = () => validateApiKey(createPerplexityConfig());
|
|
10
|
-
const getDefaultPerplexityModel = () => getProviderModel("PERPLEXITY_MODEL", PerplexityModels.SONAR);
|
|
11
|
-
/**
|
|
12
|
-
* Perplexity Provider — direct HTTP, no AI SDK.
|
|
13
|
-
*
|
|
14
|
-
* Sonar models with built-in web grounding. OpenAI-compatible chat
|
|
15
|
-
* completions at api.perplexity.ai. Best for queries that need fresh
|
|
16
|
-
* web context (search-augmented answers). Citation data, if the API returns
|
|
17
|
-
* any, is not extracted or exposed by this provider.
|
|
18
|
-
*
|
|
19
|
-
* All request/stream/tool-loop orchestration lives in
|
|
20
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
21
|
-
* and provider-specific error mapping.
|
|
22
|
-
*
|
|
23
|
-
* @see https://docs.perplexity.ai/api-reference/chat-completions
|
|
24
|
-
*/
|
|
25
|
-
export class PerplexityProvider extends OpenAIChatCompletionsProvider {
|
|
26
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
27
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
28
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
29
|
-
? overrideApiKey
|
|
30
|
-
: getPerplexityApiKey();
|
|
31
|
-
const baseURL = credentials?.baseURL?.trim() ||
|
|
32
|
-
process.env.PERPLEXITY_BASE_URL?.trim() ||
|
|
33
|
-
PERPLEXITY_DEFAULT_BASE_URL;
|
|
34
|
-
super("perplexity", modelName, sdk, { baseURL, apiKey });
|
|
35
|
-
logger.debug("Perplexity Provider initialized", {
|
|
36
|
-
modelName: this.modelName,
|
|
37
|
-
providerName: this.providerName,
|
|
38
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getProviderName() {
|
|
42
|
-
return "perplexity";
|
|
43
|
-
}
|
|
44
|
-
getDefaultModel() {
|
|
45
|
-
return getDefaultPerplexityModel();
|
|
46
|
-
}
|
|
47
|
-
getFallbackModels() {
|
|
48
|
-
return [
|
|
49
|
-
PerplexityModels.SONAR,
|
|
50
|
-
PerplexityModels.SONAR_PRO,
|
|
51
|
-
PerplexityModels.SONAR_REASONING,
|
|
52
|
-
PerplexityModels.SONAR_REASONING_PRO,
|
|
53
|
-
PerplexityModels.SONAR_DEEP_RESEARCH,
|
|
54
|
-
];
|
|
55
|
-
}
|
|
56
|
-
formatProviderError(error) {
|
|
57
|
-
const rules = [
|
|
58
|
-
{
|
|
59
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
60
|
-
/Invalid API key|Authentication/i.test(ctx.message),
|
|
61
|
-
errorClass: AuthenticationError,
|
|
62
|
-
message: "Invalid Perplexity API key. Get one at https://www.perplexity.ai/settings/api",
|
|
63
|
-
},
|
|
64
|
-
...DEFAULT_ERROR_RULES,
|
|
65
|
-
];
|
|
66
|
-
return classifyProviderError(error, rules, "perplexity", this.modelName);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=perplexity.js.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* Together AI Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* Hosted open-model gateway at api.together.xyz/v1 (OpenAI-compatible).
|
|
8
|
-
* Llama / Mistral / Qwen / DeepSeek / Gemma / WizardLM available
|
|
9
|
-
* server-less; pass any catalog id via `--model`.
|
|
10
|
-
* All request/stream/tool-loop orchestration lives in
|
|
11
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
12
|
-
* and provider-specific error mapping.
|
|
13
|
-
*
|
|
14
|
-
* @see https://docs.together.ai/docs/openai-api-compatibility
|
|
15
|
-
*/
|
|
16
|
-
export declare class TogetherAIProvider extends OpenAIChatCompletionsProvider {
|
|
17
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["together"]);
|
|
18
|
-
protected getProviderName(): AIProviderName;
|
|
19
|
-
protected getDefaultModel(): string;
|
|
20
|
-
protected getFallbackModelName(): string;
|
|
21
|
-
protected getFallbackModels(): string[];
|
|
22
|
-
protected formatProviderError(error: unknown): Error;
|
|
23
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { TogetherAIModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError } from "../types/index.js";
|
|
3
|
-
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
-
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
6
|
-
import { createTogetherAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
7
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
|
-
const TOGETHER_DEFAULT_BASE_URL = "https://api.together.xyz/v1";
|
|
9
|
-
const getTogetherApiKey = () => validateApiKey(createTogetherAIConfig());
|
|
10
|
-
const getDefaultTogetherModel = () => getProviderModel("TOGETHER_MODEL", TogetherAIModels.LLAMA_3_3_70B_INSTRUCT_TURBO);
|
|
11
|
-
/**
|
|
12
|
-
* Together AI Provider — direct HTTP, no AI SDK.
|
|
13
|
-
*
|
|
14
|
-
* Hosted open-model gateway at api.together.xyz/v1 (OpenAI-compatible).
|
|
15
|
-
* Llama / Mistral / Qwen / DeepSeek / Gemma / WizardLM available
|
|
16
|
-
* server-less; pass any catalog id via `--model`.
|
|
17
|
-
* All request/stream/tool-loop orchestration lives in
|
|
18
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
19
|
-
* and provider-specific error mapping.
|
|
20
|
-
*
|
|
21
|
-
* @see https://docs.together.ai/docs/openai-api-compatibility
|
|
22
|
-
*/
|
|
23
|
-
export class TogetherAIProvider extends OpenAIChatCompletionsProvider {
|
|
24
|
-
constructor(modelName, sdk, _region, credentials) {
|
|
25
|
-
const overrideApiKey = credentials?.apiKey?.trim();
|
|
26
|
-
const apiKey = overrideApiKey && overrideApiKey.length > 0
|
|
27
|
-
? overrideApiKey
|
|
28
|
-
: getTogetherApiKey();
|
|
29
|
-
const baseURL = credentials?.baseURL?.trim() ||
|
|
30
|
-
process.env.TOGETHER_BASE_URL?.trim() ||
|
|
31
|
-
TOGETHER_DEFAULT_BASE_URL;
|
|
32
|
-
super("together-ai", modelName, sdk, { baseURL, apiKey });
|
|
33
|
-
logger.debug("Together AI Provider initialized", {
|
|
34
|
-
modelName: this.modelName,
|
|
35
|
-
providerName: this.providerName,
|
|
36
|
-
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
getProviderName() {
|
|
40
|
-
return "together-ai";
|
|
41
|
-
}
|
|
42
|
-
getDefaultModel() {
|
|
43
|
-
return getDefaultTogetherModel();
|
|
44
|
-
}
|
|
45
|
-
getFallbackModelName() {
|
|
46
|
-
return TogetherAIModels.LLAMA_3_1_8B_INSTRUCT_TURBO;
|
|
47
|
-
}
|
|
48
|
-
getFallbackModels() {
|
|
49
|
-
return [
|
|
50
|
-
TogetherAIModels.LLAMA_3_3_70B_INSTRUCT_TURBO,
|
|
51
|
-
TogetherAIModels.LLAMA_3_1_405B_INSTRUCT_TURBO,
|
|
52
|
-
TogetherAIModels.LLAMA_3_1_70B_INSTRUCT_TURBO,
|
|
53
|
-
TogetherAIModels.LLAMA_3_1_8B_INSTRUCT_TURBO,
|
|
54
|
-
TogetherAIModels.MIXTRAL_8X22B_INSTRUCT,
|
|
55
|
-
TogetherAIModels.QWEN_2_5_72B_INSTRUCT_TURBO,
|
|
56
|
-
TogetherAIModels.DEEPSEEK_R1,
|
|
57
|
-
TogetherAIModels.DEEPSEEK_V3,
|
|
58
|
-
];
|
|
59
|
-
}
|
|
60
|
-
formatProviderError(error) {
|
|
61
|
-
const rules = [
|
|
62
|
-
{
|
|
63
|
-
match: (ctx) => ctx.statusCode === 401 ||
|
|
64
|
-
/Invalid API key|Authentication/i.test(ctx.message),
|
|
65
|
-
errorClass: AuthenticationError,
|
|
66
|
-
message: "Invalid Together AI API key. Get one at https://api.together.xyz/settings/api-keys",
|
|
67
|
-
},
|
|
68
|
-
...DEFAULT_ERROR_RULES,
|
|
69
|
-
];
|
|
70
|
-
return classifyProviderError(error, rules, "together-ai", this.modelName);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=togetherAi.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { AIProviderName } from "../constants/enums.js";
|
|
2
|
-
import type { NeurolinkCredentials } from "../types/index.js";
|
|
3
|
-
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
4
|
-
/**
|
|
5
|
-
* xAI Grok Provider — direct HTTP, no AI SDK.
|
|
6
|
-
*
|
|
7
|
-
* OpenAI-compatible chat completions at api.x.ai/v1 (Grok family:
|
|
8
|
-
* grok-3, grok-3-mini, grok-2-latest, grok-2-vision-latest, grok-beta).
|
|
9
|
-
* All request/stream/tool-loop orchestration lives in
|
|
10
|
-
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
11
|
-
* and provider-specific error mapping.
|
|
12
|
-
*
|
|
13
|
-
* @see https://docs.x.ai/api
|
|
14
|
-
*/
|
|
15
|
-
export declare class XaiProvider extends OpenAIChatCompletionsProvider {
|
|
16
|
-
constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["xai"]);
|
|
17
|
-
protected getProviderName(): AIProviderName;
|
|
18
|
-
protected getDefaultModel(): string;
|
|
19
|
-
protected getFallbackModelName(): string;
|
|
20
|
-
protected getFallbackModels(): string[];
|
|
21
|
-
protected formatProviderError(error: unknown): Error;
|
|
22
|
-
}
|