ruvnet/ruflo · error · LLMProviderError
GOOGLE_${response.status}
GOOGLE_${response.status}
Error message
${message} What it means
GoogleProvider's fallback mapping for any status other than 401/403/429: LLMProviderError with code GOOGLE_<status>, retryable=true only when status >= 500. The message comes from Google's error JSON ('Unknown error' if the body was unparseable).
Source
Thrown at v3/@claude-flow/providers/src/google-provider.ts:419
const errorText = await response.text();
let errorData: { error?: { message?: string } };
try {
errorData = JSON.parse(errorText);
} catch {
errorData = { error: { message: errorText } };
}
const message = errorData.error?.message || 'Unknown error';
switch (response.status) {
case 401:
case 403:
throw new AuthenticationError(message, 'google', errorData);
case 429:
throw new RateLimitError(message, 'google', undefined, errorData);
default:
throw new LLMProviderError(
message,
`GOOGLE_${response.status}`,
'google',
response.status,
response.status >= 500,
errorData
);
}
}
}
View on GitHub (pinned to fa13ee4ad6)
Solutions
- Read error.statusCode, message and error.details - Google's message states the exact invalid field or overload reason
- For 400: use the exact model id from the catalog (e.g. 'gemini-2.0-flash') and remove unsupported parameters
- For 503/504 (retryable=true): retry with backoff, or fail over to another provider via the ProviderManager
- For sustained 503 on one model, temporarily switch to a less loaded Gemini variant
Example fix
// before
const res = await provider.complete({ ...req, model: 'gemini' }); // GOOGLE_400: invalid model id
// after
const res = await provider.complete({ ...req, model: 'gemini-2.0-flash' }); // exact catalog id Defensive patterns
Strategy: try-catch
Type guard
import { LLMProviderError, isLLMProviderError } from './types.js';
function isGoogleApiError(e: unknown): e is LLMProviderError {
return isLLMProviderError(e) && e.provider === 'google' && e.code.startsWith('GOOGLE_');
} Try / catch
try {
return await provider.complete(req);
} catch (e) {
if (isGoogleApiError(e)) {
if (e.retryable) return retryWithBackoff(() => provider.complete(req)); // 5xx / overload
throw new BadRequestError(`google rejected request (${e.statusCode}): ${e.message}`, { cause: e });
}
throw e;
} Prevention
- Use exact model ids from the v1beta catalog (provider.listModels())
- Treat 503 'overloaded' as transient: retry with backoff, not as a bug
- Log statusCode + details on 400 to catch invalid fields quickly
When it happens
Trigger: complete() receiving 400 INVALID_ARGUMENT (bad model name like 'gemini' without version, malformed request fields), 503 'model is overloaded' from Gemini capacity, or 504 timeouts.
Common situations: Model id not matching the v1beta catalog; unsupported parameters on a specific model; Gemini flash models returning transient 503 overload during peak usage.
Related errors
- COHERE_${response.status}
- OPENAI_${response.status}
- AUTHENTICATION
- RATE_LIMIT
- MCP server "${server.name}" is in cooldown (HTTP ${cd.status
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/851f1eaed2a8fffa.
Report an issue: GitHub.