{"record":{"id":"851f1eaed2a8fffa","repo":"ruvnet/ruflo","slug":"google-response-status","errorCode":"GOOGLE_${response.status}","errorMessage":"${message}","messagePattern":"\\$\\{message\\}","errorType":"exception","errorClass":"LLMProviderError","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/providers/src/google-provider.ts","lineNumber":419,"sourceCode":"    const errorText = await response.text();\n    let errorData: { error?: { message?: string } };\n\n    try {\n      errorData = JSON.parse(errorText);\n    } catch {\n      errorData = { error: { message: errorText } };\n    }\n\n    const message = errorData.error?.message || 'Unknown error';\n\n    switch (response.status) {\n      case 401:\n      case 403:\n        throw new AuthenticationError(message, 'google', errorData);\n      case 429:\n        throw new RateLimitError(message, 'google', undefined, errorData);\n      default:\n        throw new LLMProviderError(\n          message,\n          `GOOGLE_${response.status}`,\n          'google',\n          response.status,\n          response.status >= 500,\n          errorData\n        );\n    }\n  }\n}\n","sourceCodeStart":401,"sourceCodeEnd":430,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/providers/src/google-provider.ts#L401-L430","documentation":"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).","triggerScenarios":"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.","commonSituations":"Model id not matching the v1beta catalog; unsupported parameters on a specific model; Gemini flash models returning transient 503 overload during peak usage.","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"],"exampleFix":"// before\nconst res = await provider.complete({ ...req, model: 'gemini' }); // GOOGLE_400: invalid model id\n\n// after\nconst res = await provider.complete({ ...req, model: 'gemini-2.0-flash' }); // exact catalog id","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"import { LLMProviderError, isLLMProviderError } from './types.js';\nfunction isGoogleApiError(e: unknown): e is LLMProviderError {\n  return isLLMProviderError(e) && e.provider === 'google' && e.code.startsWith('GOOGLE_');\n}","tryCatchPattern":"try {\n  return await provider.complete(req);\n} catch (e) {\n  if (isGoogleApiError(e)) {\n    if (e.retryable) return retryWithBackoff(() => provider.complete(req)); // 5xx / overload\n    throw new BadRequestError(`google rejected request (${e.statusCode}): ${e.message}`, { cause: e });\n  }\n  throw e;\n}","preventionTips":["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"],"tags":["http-error","google","gemini","api-error","status-mapping"],"backgroundTag":"http-error-response","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}