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

  1. Read error.statusCode, message and error.details - Google's message states the exact invalid field or overload reason
  2. For 400: use the exact model id from the catalog (e.g. 'gemini-2.0-flash') and remove unsupported parameters
  3. For 503/504 (retryable=true): retry with backoff, or fail over to another provider via the ProviderManager
  4. 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

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


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/851f1eaed2a8fffa. Report an issue: GitHub.