Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/lib/providers/amazonBedrock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,40 @@ export class AmazonBedrockProvider extends BaseProvider {

const errorMessage = error instanceof Error ? error.message : String(error);

if (
errorMessage.includes("rate limit") ||
errorMessage.includes("throttling") ||
errorMessage.includes("429")
) {
return new Error(
"Amazon Bedrock rate limit exceeded. Please try again later.",
);
}

if (
errorMessage.includes("ECONNRESET") ||
errorMessage.includes("ENOTFOUND") ||
errorMessage.includes("ECONNREFUSED") ||
errorMessage.includes("network") ||
errorMessage.includes("connection")
) {
return new Error(
"Amazon Bedrock API connection error. Please check your internet connection and try again.",
);
}

if (
errorMessage.includes("500") ||
errorMessage.includes("502") ||
errorMessage.includes("503") ||
errorMessage.includes("504") ||
errorMessage.includes("server error")
) {
return new Error(
"Amazon Bedrock API server error. Please try again in a few moments.",
);
}

if (errorMessage.includes("InvalidRequestException")) {
return new Error(
`❌ Amazon Bedrock Request Error\n\nThe request was invalid: ${errorMessage}\n\n🔧 Common Solutions:\n1. Check your model ID format\n2. Verify your request parameters\n3. Ensure your AWS account has Bedrock access`,
Expand Down
45 changes: 20 additions & 25 deletions src/lib/providers/anthropic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,15 @@ export class AnthropicProvider extends BaseProvider {
}

const errorRecord = error as UnknownRecord;
const message =
typeof errorRecord?.message === "string"
? errorRecord.message
: "Unknown error";

// Handle API key errors
if (
(typeof errorRecord?.message === "string" &&
errorRecord.message.includes("API_KEY_INVALID")) ||
(typeof errorRecord?.message === "string" &&
errorRecord.message.includes("Invalid API key"))
message.includes("API_KEY_INVALID") ||
message.includes("Invalid API key")
) {
return new Error(
"Invalid Anthropic API key. Please check your ANTHROPIC_API_KEY environment variable.",
Expand All @@ -100,10 +102,9 @@ export class AnthropicProvider extends BaseProvider {

// Handle rate limiting errors
if (
typeof errorRecord?.message === "string" &&
(errorRecord.message.includes("rate limit") ||
errorRecord.message.includes("too_many_requests") ||
errorRecord.message.includes("429"))
message.includes("rate limit") ||
message.includes("too_many_requests") ||
message.includes("429")
) {
return new Error(
"Anthropic rate limit exceeded. Please try again later.",
Expand All @@ -112,12 +113,11 @@ export class AnthropicProvider extends BaseProvider {

// Handle connection errors
if (
typeof errorRecord?.message === "string" &&
(errorRecord.message.includes("ECONNRESET") ||
errorRecord.message.includes("ENOTFOUND") ||
errorRecord.message.includes("ECONNREFUSED") ||
errorRecord.message.includes("network") ||
errorRecord.message.includes("connection"))
message.includes("ECONNRESET") ||
message.includes("ENOTFOUND") ||
message.includes("ECONNREFUSED") ||
message.includes("network") ||
message.includes("connection")
) {
return new Error(
"Anthropic API connection error. Please check your internet connection and try again.",
Expand All @@ -126,23 +126,18 @@ export class AnthropicProvider extends BaseProvider {

// Handle server errors
if (
typeof errorRecord?.message === "string" &&
(errorRecord.message.includes("500") ||
errorRecord.message.includes("502") ||
errorRecord.message.includes("503") ||
errorRecord.message.includes("504") ||
errorRecord.message.includes("server error"))
message.includes("500") ||
message.includes("502") ||
message.includes("503") ||
message.includes("504") ||
message.includes("server error")
) {
return new Error(
"Anthropic API server error. Please try again in a few moments.",
);
}

const message =
typeof errorRecord?.message === "string"
? errorRecord.message
: "Unknown error";
return new Error(`Anthropic error: ${message}`);
return new Error(`Anthropic Error: ${message}`);
}

// executeGenerate removed - BaseProvider handles all generation with tools
Expand Down
50 changes: 42 additions & 8 deletions src/lib/providers/azureOpenai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,18 +79,52 @@ export class AzureOpenAIProvider extends BaseProvider {

protected handleProviderError(error: unknown): Error {
const errorObj = error as UnknownRecord;
if (
errorObj?.message &&
typeof errorObj.message === "string" &&
errorObj.message.includes("401")
) {
return new Error("Invalid Azure OpenAI API key or endpoint.");
}
const message =
errorObj?.message && typeof errorObj.message === "string"
? errorObj.message
: "Unknown error";
return new Error(`Azure OpenAI error: ${message}`);

if (message.includes("401")) {
return new Error("Invalid Azure OpenAI API key or endpoint.");
}

if (
message.includes("rate limit") ||
message.includes("rate_limit_exceeded") ||
message.includes("429")
) {
return new Error(
"Azure OpenAI rate limit exceeded. Please try again later.",
);
}

// Handle connection errors
if (
message.includes("ECONNRESET") ||
message.includes("ENOTFOUND") ||
message.includes("ECONNREFUSED") ||
message.includes("network") ||
message.includes("connection")
) {
return new Error(
"Azure OpenAI API connection error. Please check your internet connection and try again.",
);
}

// Handle server errors
if (
message.includes("500") ||
message.includes("502") ||
message.includes("503") ||
message.includes("504") ||
message.includes("server error")
) {
return new Error(
"Azure OpenAI API server error. Please try again in a few moments.",
);
}

return new Error(`Azure OpenAI Error: ${message}`);
}

// executeGenerate removed - BaseProvider handles all generation with tools
Expand Down
41 changes: 30 additions & 11 deletions src/lib/providers/googleAiStudio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,29 +74,48 @@ export class GoogleAIStudioProvider extends BaseProvider {
}

const errorRecord = error as UnknownRecord;
const message =
typeof errorRecord?.message === "string"
? errorRecord.message
: "Unknown error";

if (message.includes("API_KEY_INVALID")) {
return new Error(
"Invalid Google AI API key. Please check your GOOGLE_AI_API_KEY environment variable.",
);
}

if (message.includes("RATE_LIMIT_EXCEEDED")) {
return new Error(
"Google AI rate limit exceeded. Please try again later.",
);
}

if (
typeof errorRecord?.message === "string" &&
errorRecord.message.includes("API_KEY_INVALID")
message.includes("ECONNRESET") ||
message.includes("ENOTFOUND") ||
message.includes("ECONNREFUSED") ||
message.includes("network") ||
message.includes("connection")
) {
return new Error(
"Invalid Google AI API key. Please check your GOOGLE_AI_API_KEY environment variable.",
"Google AI API connection error. Please check your internet connection and try again.",
);
}

if (
typeof errorRecord?.message === "string" &&
errorRecord.message.includes("RATE_LIMIT_EXCEEDED")
message.includes("500") ||
message.includes("502") ||
message.includes("503") ||
message.includes("504") ||
message.includes("server error")
) {
return new Error(
"Google AI rate limit exceeded. Please try again later.",
"Google AI API server error. Please try again in a few moments.",
);
}

const message =
typeof errorRecord?.message === "string"
? errorRecord.message
: "Unknown error";
return new Error(`Google AI error: ${message}`);
return new Error(`Google AI Error: ${message}`);
}
// executeGenerate removed - BaseProvider handles all generation with tools
protected async executeStream(
Expand Down
24 changes: 24 additions & 0 deletions src/lib/providers/googleVertex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,30 @@ export class GoogleVertexProvider extends BaseProvider {
? errorRecord.message
: "Unknown error occurred";

if (
message.includes("ECONNRESET") ||
message.includes("ENOTFOUND") ||
message.includes("ECONNREFUSED") ||
message.includes("network") ||
message.includes("connection")
) {
return new Error(
"Google Vertex AI API connection error. Please check your internet connection and try again.",
);
}

if (
message.includes("500") ||
message.includes("502") ||
message.includes("503") ||
message.includes("504") ||
message.includes("server error")
) {
return new Error(
"Google Vertex AI API server error. Please try again in a few moments.",
);
}

if (message.includes("PERMISSION_DENIED")) {
return new Error(
`❌ Google Vertex AI Permission Denied\n\nYour Google Cloud credentials don't have permission to access Vertex AI.\n\nRequired Steps:\n1. Ensure your service account has Vertex AI User role\n2. Check if Vertex AI API is enabled in your project\n3. Verify your project ID is correct\n4. Confirm your location/region has Vertex AI available`,
Expand Down
78 changes: 38 additions & 40 deletions src/lib/providers/litellm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,57 +102,55 @@ export class LiteLLMProvider extends BaseProvider {
return new Error(`LiteLLM request timed out: ${error.message}`);
}

// Check for timeout by error name and message as fallback
const errorRecord = error as UnknownRecord;
const message =
typeof errorRecord?.message === "string"
? errorRecord.message
: "Unknown error";

if (
errorRecord?.name === "TimeoutError" ||
(typeof errorRecord?.message === "string" &&
errorRecord.message.includes("Timeout"))
message.includes("ECONNREFUSED") ||
message.includes("Failed to fetch") ||
message.includes("ECONNRESET") ||
message.includes("ENOTFOUND")
) {
return new Error(
`LiteLLM request timed out: ${errorRecord?.message || "Unknown timeout"}`,
`LiteLLM proxy server not available. Please start the LiteLLM proxy server at ${
process.env.LITELLM_BASE_URL || "http://localhost:4000"
}`,
);
}
if (typeof errorRecord?.message === "string") {
if (
errorRecord.message.includes("ECONNREFUSED") ||
errorRecord.message.includes("Failed to fetch")
) {
return new Error(
"LiteLLM proxy server not available. Please start the LiteLLM proxy server at " +
`${process.env.LITELLM_BASE_URL || "http://localhost:4000"}`,
);
}

if (
errorRecord.message.includes("API_KEY_INVALID") ||
errorRecord.message.includes("Invalid API key")
) {
return new Error(
"Invalid LiteLLM configuration. Please check your LITELLM_API_KEY environment variable.",
);
}
if (
message.includes("API_KEY_INVALID") ||
message.includes("Invalid API key")
) {
return new Error(
"Invalid LiteLLM configuration. Please check your LITELLM_API_KEY environment variable.",
);
}

if (errorRecord.message.includes("rate limit")) {
return new Error(
"LiteLLM rate limit exceeded. Please try again later.",
);
}
if (
message.includes("rate limit") ||
message.includes("rate_limit_exceeded") ||
message.includes("429")
) {
return new Error("LiteLLM rate limit exceeded. Please try again later.");
}

if (
errorRecord.message.includes("model") &&
errorRecord.message.includes("not found")
) {
return new Error(
`Model '${this.modelName}' not available in LiteLLM proxy. ` +
"Please check your LiteLLM configuration and ensure the model is configured.",
);
}
if (
message.includes("500") ||
message.includes("502") ||
message.includes("503") ||
message.includes("504") ||
message.includes("server error")
) {
return new Error(
"LiteLLM proxy server error. Please check the proxy server logs for more details.",
);
}

return new Error(
`LiteLLM error: ${errorRecord?.message || "Unknown error"}`,
);
return new Error(`LiteLLM Error: ${message}`);
}

/**
Expand Down
Loading