@juspay/neurolink 9.68.16 → 9.68.17
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 +6 -0
- package/dist/browser/neurolink.min.js +341 -341
- package/dist/lib/providers/cloudflare.js +2 -1
- package/dist/lib/providers/cohere.js +2 -1
- package/dist/lib/providers/deepseek.js +2 -1
- package/dist/lib/providers/fireworks.js +2 -1
- package/dist/lib/providers/groq.js +2 -1
- package/dist/lib/providers/huggingFace.js +2 -1
- package/dist/lib/providers/litellm.js +2 -1
- package/dist/lib/providers/llamaCpp.js +1 -6
- package/dist/lib/providers/lmStudio.js +3 -2
- package/dist/lib/providers/nvidiaNim.js +2 -1
- package/dist/lib/providers/openAI.js +2 -1
- package/dist/lib/providers/openaiCompatible.js +3 -2
- package/dist/lib/providers/perplexity.js +2 -1
- package/dist/lib/providers/togetherAi.js +2 -1
- package/dist/lib/providers/xai.js +2 -1
- package/dist/lib/utils/logSanitize.d.ts +14 -0
- package/dist/lib/utils/logSanitize.js +16 -0
- package/dist/providers/cloudflare.js +2 -1
- package/dist/providers/cohere.js +2 -1
- package/dist/providers/deepseek.js +2 -1
- package/dist/providers/fireworks.js +2 -1
- package/dist/providers/groq.js +2 -1
- package/dist/providers/huggingFace.js +2 -1
- package/dist/providers/litellm.js +2 -1
- package/dist/providers/llamaCpp.js +1 -6
- package/dist/providers/lmStudio.js +3 -2
- package/dist/providers/nvidiaNim.js +2 -1
- package/dist/providers/openAI.js +2 -1
- package/dist/providers/openaiCompatible.js +3 -2
- package/dist/providers/perplexity.js +2 -1
- package/dist/providers/togetherAi.js +2 -1
- package/dist/providers/xai.js +2 -1
- package/dist/utils/logSanitize.d.ts +14 -0
- package/dist/utils/logSanitize.js +16 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CloudflareModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createCloudflareConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -44,7 +45,7 @@ export class CloudflareProvider extends OpenAIChatCompletionsProvider {
|
|
|
44
45
|
logger.debug("Cloudflare Workers AI Provider initialized", {
|
|
45
46
|
modelName: this.modelName,
|
|
46
47
|
providerName: this.providerName,
|
|
47
|
-
baseURL: this.config.baseURL,
|
|
48
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
51
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CohereModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
5
6
|
import { createCohereConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
6
7
|
import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
|
|
@@ -36,7 +37,7 @@ export class CohereProvider extends OpenAIChatCompletionsProvider {
|
|
|
36
37
|
logger.debug("Cohere Provider initialized", {
|
|
37
38
|
modelName: this.modelName,
|
|
38
39
|
providerName: this.providerName,
|
|
39
|
-
baseURL: this.config.baseURL,
|
|
40
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
40
41
|
});
|
|
41
42
|
}
|
|
42
43
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DeepSeekModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createDeepSeekConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -55,7 +56,7 @@ export class DeepSeekProvider extends OpenAIChatCompletionsProvider {
|
|
|
55
56
|
logger.debug("DeepSeek Provider initialized", {
|
|
56
57
|
modelName: this.modelName,
|
|
57
58
|
providerName: this.providerName,
|
|
58
|
-
baseURL: this.config.baseURL,
|
|
59
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
// ===========================================================================
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FireworksModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createFireworksConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -34,7 +35,7 @@ export class FireworksProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("Fireworks Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GroqModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createGroqConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class GroqProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("Groq Provider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { createHuggingFaceConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
4
5
|
import { TimeoutError } from "../utils/timeout.js";
|
|
5
6
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class HuggingFaceProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("HuggingFaceProvider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -3,6 +3,7 @@ import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
|
3
3
|
import { AuthenticationError, InvalidModelError, ModelAccessDeniedError, NetworkError, ProviderError, RateLimitError, isModelAccessDeniedMessage, parseAllowedModels, } from "../types/index.js";
|
|
4
4
|
import { isAbortError } from "../utils/errorHandling.js";
|
|
5
5
|
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
6
7
|
import { isGemini25Model as isCanonicalGemini25Model } from "../utils/modelDetection.js";
|
|
7
8
|
import { calculateCost } from "../utils/pricing.js";
|
|
8
9
|
import { getProviderModel } from "../utils/providerConfig.js";
|
|
@@ -53,7 +54,7 @@ export class LiteLLMProvider extends OpenAIChatCompletionsProvider {
|
|
|
53
54
|
logger.debug("LiteLLM Provider initialized", {
|
|
54
55
|
modelName: this.modelName,
|
|
55
56
|
provider: this.providerName,
|
|
56
|
-
baseURL: this.config.baseURL,
|
|
57
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
getProviderName() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NetworkError, ProviderError } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { TimeoutError } from "../utils/timeout.js";
|
|
4
5
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
5
6
|
const LLAMACPP_DEFAULT_BASE_URL = "http://localhost:8080/v1";
|
|
@@ -7,12 +8,6 @@ const LLAMACPP_PLACEHOLDER_KEY = "llamacpp";
|
|
|
7
8
|
const getLlamaCppBaseURL = () => {
|
|
8
9
|
return process.env.LLAMACPP_BASE_URL || LLAMACPP_DEFAULT_BASE_URL;
|
|
9
10
|
};
|
|
10
|
-
/**
|
|
11
|
-
* Strip embedded `user:pass@` credentials from a URL before logging it or
|
|
12
|
-
* surfacing it in a user-facing error. Preserves host/port/path so the URL
|
|
13
|
-
* stays useful for diagnostics.
|
|
14
|
-
*/
|
|
15
|
-
const redactUrlCredentials = (url) => url.replace(/\/\/[^/@]+@/, "//***@");
|
|
16
11
|
/**
|
|
17
12
|
* llama.cpp Provider — direct HTTP, no AI SDK.
|
|
18
13
|
*
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
2
2
|
import { InvalidModelError, NetworkError, ProviderError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { TimeoutError } from "../utils/timeout.js";
|
|
5
6
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
6
7
|
const LM_STUDIO_DEFAULT_BASE_URL = "http://localhost:1234/v1";
|
|
@@ -34,7 +35,7 @@ export class LMStudioProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("LM Studio Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|
|
@@ -60,7 +61,7 @@ export class LMStudioProvider extends OpenAIChatCompletionsProvider {
|
|
|
60
61
|
message.includes("ECONNREFUSED") ||
|
|
61
62
|
message.includes("Failed to fetch") ||
|
|
62
63
|
message.includes("fetch failed")) {
|
|
63
|
-
return new NetworkError(`LM Studio server not reachable at ${this.config.baseURL}. ` +
|
|
64
|
+
return new NetworkError(`LM Studio server not reachable at ${redactUrlCredentials(this.config.baseURL)}. ` +
|
|
64
65
|
`Open the LM Studio app, load a model, and click "Start Server".`, "lm-studio");
|
|
65
66
|
}
|
|
66
67
|
if (message.includes("model_not_found") || message.includes("404")) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NvidiaNimModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createNvidiaNimConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -164,7 +165,7 @@ export class NvidiaNimProvider extends OpenAIChatCompletionsProvider {
|
|
|
164
165
|
logger.debug("NVIDIA NIM Provider initialized", {
|
|
165
166
|
modelName: this.modelName,
|
|
166
167
|
providerName: this.providerName,
|
|
167
|
-
baseURL: this.config.baseURL,
|
|
168
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
getProviderName() {
|
|
@@ -3,6 +3,7 @@ import { AIProviderName as AIProviderNameEnum } from "../constants/enums.js";
|
|
|
3
3
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
4
4
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
5
5
|
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
6
7
|
import { calculateCost } from "../utils/pricing.js";
|
|
7
8
|
import { createOpenAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
8
9
|
import { MAX_IMAGE_BYTES, readBoundedBuffer } from "../utils/sizeGuard.js";
|
|
@@ -67,7 +68,7 @@ export class OpenAIProvider extends OpenAIChatCompletionsProvider {
|
|
|
67
68
|
logger.debug("OpenAIProvider initialized", {
|
|
68
69
|
model: this.modelName,
|
|
69
70
|
providerName: this.providerName,
|
|
70
|
-
baseURL: this.config.baseURL,
|
|
71
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
// ===========================================================================
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { TimeoutError } from "../utils/timeout.js";
|
|
4
5
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
5
6
|
const FALLBACK_OPENAI_COMPATIBLE_MODEL = "gpt-3.5-turbo";
|
|
@@ -42,7 +43,7 @@ export class OpenAICompatibleProvider extends OpenAIChatCompletionsProvider {
|
|
|
42
43
|
logger.debug("OpenAI Compatible Provider initialized", {
|
|
43
44
|
modelName: this.modelName,
|
|
44
45
|
provider: this.providerName,
|
|
45
|
-
baseURL: this.config.baseURL,
|
|
46
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
46
47
|
});
|
|
47
48
|
}
|
|
48
49
|
getProviderName() {
|
|
@@ -78,7 +79,7 @@ export class OpenAICompatibleProvider extends OpenAIChatCompletionsProvider {
|
|
|
78
79
|
if (typeof errorRecord?.message === "string") {
|
|
79
80
|
if (errorRecord.message.includes("ECONNREFUSED") ||
|
|
80
81
|
errorRecord.message.includes("Failed to fetch")) {
|
|
81
|
-
return new NetworkError(`OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${this.config.baseURL}`, "openai-compatible");
|
|
82
|
+
return new NetworkError(`OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${redactUrlCredentials(this.config.baseURL)}`, "openai-compatible");
|
|
82
83
|
}
|
|
83
84
|
if (errorRecord.message.includes("API_KEY_INVALID") ||
|
|
84
85
|
errorRecord.message.includes("Invalid API key") ||
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { PerplexityModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createPerplexityConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class PerplexityProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("Perplexity Provider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TogetherAIModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createTogetherAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -32,7 +33,7 @@ export class TogetherAIProvider extends OpenAIChatCompletionsProvider {
|
|
|
32
33
|
logger.debug("Together AI Provider initialized", {
|
|
33
34
|
modelName: this.modelName,
|
|
34
35
|
providerName: this.providerName,
|
|
35
|
-
baseURL: this.config.baseURL,
|
|
36
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
39
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { XaiModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createXaiConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -34,7 +35,7 @@ export class XaiProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("xAI Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|
|
@@ -26,6 +26,20 @@
|
|
|
26
26
|
* @param maxLen - Maximum number of characters to keep (default 500).
|
|
27
27
|
*/
|
|
28
28
|
export declare function sanitizeForLog(text: string, maxLen?: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Strip embedded `user:pass@` credentials from a URL's authority component
|
|
31
|
+
* before logging it or surfacing it in a user-facing error.
|
|
32
|
+
*
|
|
33
|
+
* Turns `https://user:secret@host/path` into `https://***@host/path` while
|
|
34
|
+
* leaving credential-free URLs untouched, so the host/port/path stay useful
|
|
35
|
+
* for diagnostics. Use this for any `baseURL`/endpoint a caller may have
|
|
36
|
+
* supplied with inline credentials. The match is global, so every `//…@`
|
|
37
|
+
* authority in the string is redacted (e.g. a proxy chain or a URL embedded
|
|
38
|
+
* in a query parameter), not just the first.
|
|
39
|
+
*
|
|
40
|
+
* @param url - The URL (or URL-shaped string) to redact.
|
|
41
|
+
*/
|
|
42
|
+
export declare function redactUrlCredentials(url: string): string;
|
|
29
43
|
/**
|
|
30
44
|
* Recursively sanitize a record/array, returning a structurally identical
|
|
31
45
|
* value with sensitive keys redacted and string values run through
|
|
@@ -91,6 +91,22 @@ export function sanitizeForLog(text, maxLen = 500) {
|
|
|
91
91
|
}
|
|
92
92
|
return text.slice(0, maxLen).replace(SECRET_PATTERN, "***");
|
|
93
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Strip embedded `user:pass@` credentials from a URL's authority component
|
|
96
|
+
* before logging it or surfacing it in a user-facing error.
|
|
97
|
+
*
|
|
98
|
+
* Turns `https://user:secret@host/path` into `https://***@host/path` while
|
|
99
|
+
* leaving credential-free URLs untouched, so the host/port/path stay useful
|
|
100
|
+
* for diagnostics. Use this for any `baseURL`/endpoint a caller may have
|
|
101
|
+
* supplied with inline credentials. The match is global, so every `//…@`
|
|
102
|
+
* authority in the string is redacted (e.g. a proxy chain or a URL embedded
|
|
103
|
+
* in a query parameter), not just the first.
|
|
104
|
+
*
|
|
105
|
+
* @param url - The URL (or URL-shaped string) to redact.
|
|
106
|
+
*/
|
|
107
|
+
export function redactUrlCredentials(url) {
|
|
108
|
+
return url.replace(/\/\/[^/@]+@/g, "//***@");
|
|
109
|
+
}
|
|
94
110
|
/**
|
|
95
111
|
* Recursively sanitize a record/array, returning a structurally identical
|
|
96
112
|
* value with sensitive keys redacted and string values run through
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CloudflareModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createCloudflareConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -44,7 +45,7 @@ export class CloudflareProvider extends OpenAIChatCompletionsProvider {
|
|
|
44
45
|
logger.debug("Cloudflare Workers AI Provider initialized", {
|
|
45
46
|
modelName: this.modelName,
|
|
46
47
|
providerName: this.providerName,
|
|
47
|
-
baseURL: this.config.baseURL,
|
|
48
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
51
|
getProviderName() {
|
package/dist/providers/cohere.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CohereModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
5
6
|
import { createCohereConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
6
7
|
import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
|
|
@@ -36,7 +37,7 @@ export class CohereProvider extends OpenAIChatCompletionsProvider {
|
|
|
36
37
|
logger.debug("Cohere Provider initialized", {
|
|
37
38
|
modelName: this.modelName,
|
|
38
39
|
providerName: this.providerName,
|
|
39
|
-
baseURL: this.config.baseURL,
|
|
40
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
40
41
|
});
|
|
41
42
|
}
|
|
42
43
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DeepSeekModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createDeepSeekConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -55,7 +56,7 @@ export class DeepSeekProvider extends OpenAIChatCompletionsProvider {
|
|
|
55
56
|
logger.debug("DeepSeek Provider initialized", {
|
|
56
57
|
modelName: this.modelName,
|
|
57
58
|
providerName: this.providerName,
|
|
58
|
-
baseURL: this.config.baseURL,
|
|
59
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
// ===========================================================================
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FireworksModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createFireworksConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -34,7 +35,7 @@ export class FireworksProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("Fireworks Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|
package/dist/providers/groq.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GroqModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createGroqConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class GroqProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("Groq Provider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { createHuggingFaceConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
4
5
|
import { TimeoutError } from "../utils/timeout.js";
|
|
5
6
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class HuggingFaceProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("HuggingFaceProvider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -3,6 +3,7 @@ import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
|
3
3
|
import { AuthenticationError, InvalidModelError, ModelAccessDeniedError, NetworkError, ProviderError, RateLimitError, isModelAccessDeniedMessage, parseAllowedModels, } from "../types/index.js";
|
|
4
4
|
import { isAbortError } from "../utils/errorHandling.js";
|
|
5
5
|
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
6
7
|
import { isGemini25Model as isCanonicalGemini25Model } from "../utils/modelDetection.js";
|
|
7
8
|
import { calculateCost } from "../utils/pricing.js";
|
|
8
9
|
import { getProviderModel } from "../utils/providerConfig.js";
|
|
@@ -53,7 +54,7 @@ export class LiteLLMProvider extends OpenAIChatCompletionsProvider {
|
|
|
53
54
|
logger.debug("LiteLLM Provider initialized", {
|
|
54
55
|
modelName: this.modelName,
|
|
55
56
|
provider: this.providerName,
|
|
56
|
-
baseURL: this.config.baseURL,
|
|
57
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
getProviderName() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NetworkError, ProviderError } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { TimeoutError } from "../utils/timeout.js";
|
|
4
5
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
5
6
|
const LLAMACPP_DEFAULT_BASE_URL = "http://localhost:8080/v1";
|
|
@@ -7,12 +8,6 @@ const LLAMACPP_PLACEHOLDER_KEY = "llamacpp";
|
|
|
7
8
|
const getLlamaCppBaseURL = () => {
|
|
8
9
|
return process.env.LLAMACPP_BASE_URL || LLAMACPP_DEFAULT_BASE_URL;
|
|
9
10
|
};
|
|
10
|
-
/**
|
|
11
|
-
* Strip embedded `user:pass@` credentials from a URL before logging it or
|
|
12
|
-
* surfacing it in a user-facing error. Preserves host/port/path so the URL
|
|
13
|
-
* stays useful for diagnostics.
|
|
14
|
-
*/
|
|
15
|
-
const redactUrlCredentials = (url) => url.replace(/\/\/[^/@]+@/, "//***@");
|
|
16
11
|
/**
|
|
17
12
|
* llama.cpp Provider — direct HTTP, no AI SDK.
|
|
18
13
|
*
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
2
2
|
import { InvalidModelError, NetworkError, ProviderError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { TimeoutError } from "../utils/timeout.js";
|
|
5
6
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
6
7
|
const LM_STUDIO_DEFAULT_BASE_URL = "http://localhost:1234/v1";
|
|
@@ -34,7 +35,7 @@ export class LMStudioProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("LM Studio Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|
|
@@ -60,7 +61,7 @@ export class LMStudioProvider extends OpenAIChatCompletionsProvider {
|
|
|
60
61
|
message.includes("ECONNREFUSED") ||
|
|
61
62
|
message.includes("Failed to fetch") ||
|
|
62
63
|
message.includes("fetch failed")) {
|
|
63
|
-
return new NetworkError(`LM Studio server not reachable at ${this.config.baseURL}. ` +
|
|
64
|
+
return new NetworkError(`LM Studio server not reachable at ${redactUrlCredentials(this.config.baseURL)}. ` +
|
|
64
65
|
`Open the LM Studio app, load a model, and click "Start Server".`, "lm-studio");
|
|
65
66
|
}
|
|
66
67
|
if (message.includes("model_not_found") || message.includes("404")) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NvidiaNimModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createNvidiaNimConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -164,7 +165,7 @@ export class NvidiaNimProvider extends OpenAIChatCompletionsProvider {
|
|
|
164
165
|
logger.debug("NVIDIA NIM Provider initialized", {
|
|
165
166
|
modelName: this.modelName,
|
|
166
167
|
providerName: this.providerName,
|
|
167
|
-
baseURL: this.config.baseURL,
|
|
168
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
getProviderName() {
|
package/dist/providers/openAI.js
CHANGED
|
@@ -3,6 +3,7 @@ import { AIProviderName as AIProviderNameEnum } from "../constants/enums.js";
|
|
|
3
3
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
4
4
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
5
5
|
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
6
7
|
import { calculateCost } from "../utils/pricing.js";
|
|
7
8
|
import { createOpenAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
8
9
|
import { MAX_IMAGE_BYTES, readBoundedBuffer } from "../utils/sizeGuard.js";
|
|
@@ -67,7 +68,7 @@ export class OpenAIProvider extends OpenAIChatCompletionsProvider {
|
|
|
67
68
|
logger.debug("OpenAIProvider initialized", {
|
|
68
69
|
model: this.modelName,
|
|
69
70
|
providerName: this.providerName,
|
|
70
|
-
baseURL: this.config.baseURL,
|
|
71
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
// ===========================================================================
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
3
4
|
import { TimeoutError } from "../utils/timeout.js";
|
|
4
5
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
5
6
|
const FALLBACK_OPENAI_COMPATIBLE_MODEL = "gpt-3.5-turbo";
|
|
@@ -42,7 +43,7 @@ export class OpenAICompatibleProvider extends OpenAIChatCompletionsProvider {
|
|
|
42
43
|
logger.debug("OpenAI Compatible Provider initialized", {
|
|
43
44
|
modelName: this.modelName,
|
|
44
45
|
provider: this.providerName,
|
|
45
|
-
baseURL: this.config.baseURL,
|
|
46
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
46
47
|
});
|
|
47
48
|
}
|
|
48
49
|
getProviderName() {
|
|
@@ -78,7 +79,7 @@ export class OpenAICompatibleProvider extends OpenAIChatCompletionsProvider {
|
|
|
78
79
|
if (typeof errorRecord?.message === "string") {
|
|
79
80
|
if (errorRecord.message.includes("ECONNREFUSED") ||
|
|
80
81
|
errorRecord.message.includes("Failed to fetch")) {
|
|
81
|
-
return new NetworkError(`OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${this.config.baseURL}`, "openai-compatible");
|
|
82
|
+
return new NetworkError(`OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${redactUrlCredentials(this.config.baseURL)}`, "openai-compatible");
|
|
82
83
|
}
|
|
83
84
|
if (errorRecord.message.includes("API_KEY_INVALID") ||
|
|
84
85
|
errorRecord.message.includes("Invalid API key") ||
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { PerplexityModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createPerplexityConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -33,7 +34,7 @@ export class PerplexityProvider extends OpenAIChatCompletionsProvider {
|
|
|
33
34
|
logger.debug("Perplexity Provider initialized", {
|
|
34
35
|
modelName: this.modelName,
|
|
35
36
|
providerName: this.providerName,
|
|
36
|
-
baseURL: this.config.baseURL,
|
|
37
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
40
|
getProviderName() {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TogetherAIModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createTogetherAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -32,7 +33,7 @@ export class TogetherAIProvider extends OpenAIChatCompletionsProvider {
|
|
|
32
33
|
logger.debug("Together AI Provider initialized", {
|
|
33
34
|
modelName: this.modelName,
|
|
34
35
|
providerName: this.providerName,
|
|
35
|
-
baseURL: this.config.baseURL,
|
|
36
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
39
|
getProviderName() {
|
package/dist/providers/xai.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { XaiModels } from "../constants/enums.js";
|
|
2
2
|
import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
4
5
|
import { createXaiConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
5
6
|
import { TimeoutError } from "../utils/timeout.js";
|
|
6
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
@@ -34,7 +35,7 @@ export class XaiProvider extends OpenAIChatCompletionsProvider {
|
|
|
34
35
|
logger.debug("xAI Provider initialized", {
|
|
35
36
|
modelName: this.modelName,
|
|
36
37
|
providerName: this.providerName,
|
|
37
|
-
baseURL: this.config.baseURL,
|
|
38
|
+
baseURL: redactUrlCredentials(this.config.baseURL),
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
getProviderName() {
|