mirror of
https://github.com/leonvanzyl/autocoder.git
synced 2026-03-17 02:43:09 +00:00
fix: handle rate_limit_event crash in chat sessions
The Claude CLI sends `rate_limit_event` messages that the SDK's `parse_message()` doesn't recognize, raising `MessageParseError` and crashing all three chat session types (spec, assistant, expand). Changes: - Bump claude-agent-sdk minimum from 0.1.0 to 0.1.39 - Add `check_rate_limit_error()` helper in chat_constants.py that detects rate limits from both MessageParseError data payloads and error message text patterns - Wrap `receive_response()` loops in all three `_query_claude()` methods with retry-on-rate-limit logic (up to 3 retries with backoff) - Gracefully log and skip non-rate-limit MessageParseError instead of crashing the session - Add `rate_limited` message type to frontend TypeScript types and handle it in useSpecChat, useAssistantChat, useExpandChat hooks to show "Rate limited. Retrying in Xs..." system messages Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -269,6 +269,20 @@ export function useAssistantChat({
|
||||
break;
|
||||
}
|
||||
|
||||
case "rate_limited": {
|
||||
// Show rate limit info as system message
|
||||
setMessages((prev) => [
|
||||
...prev,
|
||||
{
|
||||
id: generateId(),
|
||||
role: "system",
|
||||
content: `Rate limited. Retrying in ${data.retry_in}s... (attempt ${data.attempt}/${data.max_attempts})`,
|
||||
timestamp: new Date(),
|
||||
},
|
||||
]);
|
||||
break;
|
||||
}
|
||||
|
||||
case "pong": {
|
||||
// Keep-alive response, nothing to do
|
||||
break;
|
||||
|
||||
@@ -226,6 +226,20 @@ export function useExpandChat({
|
||||
break
|
||||
}
|
||||
|
||||
case 'rate_limited': {
|
||||
// Show rate limit info as system message
|
||||
setMessages((prev) => [
|
||||
...prev,
|
||||
{
|
||||
id: generateId(),
|
||||
role: 'system',
|
||||
content: `Rate limited. Retrying in ${data.retry_in}s... (attempt ${data.attempt}/${data.max_attempts})`,
|
||||
timestamp: new Date(),
|
||||
},
|
||||
])
|
||||
break
|
||||
}
|
||||
|
||||
case 'pong': {
|
||||
// Keep-alive response, nothing to do
|
||||
break
|
||||
|
||||
@@ -322,6 +322,20 @@ export function useSpecChat({
|
||||
break
|
||||
}
|
||||
|
||||
case 'rate_limited': {
|
||||
// Show rate limit info as system message
|
||||
setMessages((prev) => [
|
||||
...prev,
|
||||
{
|
||||
id: generateId(),
|
||||
role: 'system',
|
||||
content: `Rate limited. Retrying in ${data.retry_in}s... (attempt ${data.attempt}/${data.max_attempts})`,
|
||||
timestamp: new Date(),
|
||||
},
|
||||
])
|
||||
break
|
||||
}
|
||||
|
||||
case 'pong': {
|
||||
// Keep-alive response, nothing to do
|
||||
break
|
||||
|
||||
@@ -407,6 +407,13 @@ export interface SpecChatResponseDoneMessage {
|
||||
type: 'response_done'
|
||||
}
|
||||
|
||||
export interface SpecChatRateLimitedMessage {
|
||||
type: 'rate_limited'
|
||||
retry_in: number
|
||||
attempt: number
|
||||
max_attempts: number
|
||||
}
|
||||
|
||||
export type SpecChatServerMessage =
|
||||
| SpecChatTextMessage
|
||||
| SpecChatQuestionMessage
|
||||
@@ -416,6 +423,7 @@ export type SpecChatServerMessage =
|
||||
| SpecChatErrorMessage
|
||||
| SpecChatPongMessage
|
||||
| SpecChatResponseDoneMessage
|
||||
| SpecChatRateLimitedMessage
|
||||
|
||||
// Image attachment for chat messages
|
||||
export interface ImageAttachment {
|
||||
@@ -501,6 +509,13 @@ export interface AssistantChatPongMessage {
|
||||
type: 'pong'
|
||||
}
|
||||
|
||||
export interface AssistantChatRateLimitedMessage {
|
||||
type: 'rate_limited'
|
||||
retry_in: number
|
||||
attempt: number
|
||||
max_attempts: number
|
||||
}
|
||||
|
||||
export type AssistantChatServerMessage =
|
||||
| AssistantChatTextMessage
|
||||
| AssistantChatToolCallMessage
|
||||
@@ -509,6 +524,7 @@ export type AssistantChatServerMessage =
|
||||
| AssistantChatErrorMessage
|
||||
| AssistantChatConversationCreatedMessage
|
||||
| AssistantChatPongMessage
|
||||
| AssistantChatRateLimitedMessage
|
||||
|
||||
// ============================================================================
|
||||
// Expand Chat Types
|
||||
@@ -532,6 +548,7 @@ export type ExpandChatServerMessage =
|
||||
| SpecChatErrorMessage // Reuse error message type
|
||||
| SpecChatPongMessage // Reuse pong message type
|
||||
| SpecChatResponseDoneMessage // Reuse response_done type
|
||||
| SpecChatRateLimitedMessage // Reuse rate_limited message type
|
||||
|
||||
// Bulk feature creation
|
||||
export interface FeatureBulkCreate {
|
||||
|
||||
Reference in New Issue
Block a user