Skip to content

Commit 80d052d

Browse files
committed
fix: improve OpenAI Compatible rate limit error handling
- Add specific error handling for 429 status codes in BaseOpenAiCompatibleProvider - Add localized error messages for rate limiting in English and Chinese - Provide clearer guidance to users when hitting rate limits - Suggest upgrading plan or reducing request frequency Fixes #6928
1 parent f53fd39 commit 80d052d

File tree

3 files changed

+61
-15
lines changed

3 files changed

+61
-15
lines changed

src/api/providers/base-openai-compatible-provider.ts

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { ModelInfo } from "@roo-code/types"
66
import type { ApiHandlerOptions } from "../../shared/api"
77
import { ApiStream } from "../transform/stream"
88
import { convertToOpenAiMessages } from "../transform/openai-format"
9+
import { t } from "../../i18n"
910

1011
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
1112
import { DEFAULT_HEADERS } from "./constants"
@@ -83,25 +84,47 @@ export abstract class BaseOpenAiCompatibleProvider<ModelName extends string>
8384
stream_options: { include_usage: true },
8485
}
8586

86-
const stream = await this.client.chat.completions.create(params)
87+
try {
88+
const stream = await this.client.chat.completions.create(params)
8789

88-
for await (const chunk of stream) {
89-
const delta = chunk.choices[0]?.delta
90+
for await (const chunk of stream) {
91+
const delta = chunk.choices[0]?.delta
9092

91-
if (delta?.content) {
92-
yield {
93-
type: "text",
94-
text: delta.content,
93+
if (delta?.content) {
94+
yield {
95+
type: "text",
96+
text: delta.content,
97+
}
9598
}
96-
}
9799

98-
if (chunk.usage) {
99-
yield {
100-
type: "usage",
101-
inputTokens: chunk.usage.prompt_tokens || 0,
102-
outputTokens: chunk.usage.completion_tokens || 0,
100+
if (chunk.usage) {
101+
yield {
102+
type: "usage",
103+
inputTokens: chunk.usage.prompt_tokens || 0,
104+
outputTokens: chunk.usage.completion_tokens || 0,
105+
}
103106
}
104107
}
108+
} catch (error: any) {
109+
// Handle rate limiting errors specifically
110+
if (error?.status === 429 || error?.response?.status === 429) {
111+
const errorMessage = t("common:errors.openaiCompatible.rateLimitExceeded", {
112+
provider: this.providerName,
113+
})
114+
throw new Error(errorMessage)
115+
}
116+
117+
// Handle other errors
118+
if (error instanceof Error) {
119+
throw new Error(
120+
t("common:errors.openaiCompatible.genericError", {
121+
provider: this.providerName,
122+
error: error.message,
123+
}),
124+
)
125+
}
126+
127+
throw error
105128
}
106129
}
107130

@@ -115,9 +138,22 @@ export abstract class BaseOpenAiCompatibleProvider<ModelName extends string>
115138
})
116139

117140
return response.choices[0]?.message.content || ""
118-
} catch (error) {
141+
} catch (error: any) {
142+
// Handle rate limiting errors specifically
143+
if (error?.status === 429 || error?.response?.status === 429) {
144+
const errorMessage = t("common:errors.openaiCompatible.rateLimitExceeded", {
145+
provider: this.providerName,
146+
})
147+
throw new Error(errorMessage)
148+
}
149+
119150
if (error instanceof Error) {
120-
throw new Error(`${this.providerName} completion error: ${error.message}`)
151+
throw new Error(
152+
t("common:errors.openaiCompatible.completionError", {
153+
provider: this.providerName,
154+
error: error.message,
155+
}),
156+
)
121157
}
122158

123159
throw error

src/i18n/locales/en/common.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@
100100
"genericError": "Cerebras API Error ({{status}}): {{message}}",
101101
"noResponseBody": "Cerebras API Error: No response body",
102102
"completionError": "Cerebras completion error: {{error}}"
103+
},
104+
"openaiCompatible": {
105+
"rateLimitExceeded": "{{provider}} API rate limit exceeded. Please wait a moment before making another request. If using a free tier, consider upgrading your plan or reducing request frequency.",
106+
"genericError": "{{provider}} API error: {{error}}",
107+
"completionError": "{{provider}} completion error: {{error}}"
103108
}
104109
},
105110
"warnings": {

src/i18n/locales/zh-CN/common.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)