{
  "provider_id": "gcp_gemini",
  "vendor": "google",
  "display_name": "Google Gemini (GCP)",
  "tiers": {
    "light": {
      "model_id": "gemini-3.8-flash",
      "display_name": "Gemini 3.8 Flash",
      "fallback_model_id": "",
      "api_key_env": "GEMINI_FLASH_API_KEY",
      "max_output_tokens": 65536,
      "max_context_tokens": 1048576,
      "cost_tier": "low",
      "thinking_levels": [
        "low",
        "medium",
        "high"
      ],
      "_thinking_levels_note": "'minimal' is EXCLUDED: gemini-3.8-flash rejects thinking_level 'minimal' with 400 INVALID_ARGUMENT, verified live. _THINKING_LEVELS in clients/gemini.py still accepts it and QueryHints still documents it, so a plugin asking for it here fails the call outright rather than being clamped. Declared for the probe's benefit; nothing clamps a query against it yet.",
      "capabilities": [
        "text",
        "multimodal_image",
        "native_pdf",
        "remote_uri_gs",
        "structured_output",
        "function_calling"
      ],
      "_fallback_note": "GA endpoint; no fallback needed. Verified live 2026-09-12 against models.get: id exists, display_name 'Gemini 3.8 Flash', 1048576 in / 65536 out, thinking_level honoured, native PDF read. EVENTMILL_MODEL_LIGHT overrides model_id, EVENTMILL_MAX_OUTPUT_LIGHT the cap, without a code change."
    },
    "heavy": {
      "model_id": "gemini-3.1-pro-preview",
      "display_name": "Gemini 3.1 Pro",
      "fallback_model_id": "gemini-3.5-flash",
      "_fallback_note": "model_id is a Preview endpoint; Google gives ~2 weeks notice before preview deprecation. EVENTMILL_MODEL_HEAVY overrides model_id without a code change.",
      "api_key_env": "GEMINI_PRO_API_KEY",
      "max_output_tokens": 65536,
      "max_context_tokens": 1048576,
      "cost_tier": "high",
      "thinking_levels": [
        "low",
        "medium",
        "high"
      ],
      "_thinking_levels_note": "'minimal' is excluded here too, but unverified rather than known-rejected — the light tier's rejection was measured and this tier's was not tested. Left out so the probe never picks a level that might 400.",
      "capabilities": [
        "text",
        "multimodal_image",
        "native_pdf",
        "remote_uri_gs",
        "structured_output",
        "function_calling",
        "deep_reasoning"
      ]
    }
  },
  "file_handling": {
    "application/pdf": {
      "max_pages": 1000,
      "max_size_mb": 50,
      "tokens_per_page": 560,
      "tokens_per_page_by_resolution": {
        "low": 280,
        "medium": 560,
        "high": 1120
      },
      "default_media_resolution": "medium",
      "ingestion_paths": [
        "gs_uri",
        "inline_bytes",
        "files_api"
      ],
      "preferred_ingestion": "gs_uri"
    }
  },
  "output_budget": {
    "_note": "Gemini 3.x spends thinking tokens from the same budget as the reply, so max_output_tokens is not all available for content. Reserve this much when sizing how much a single call is asked to produce; ignoring it truncates a long JSON reply mid-record.",
    "default_thinking_level": "medium",
    "thinking_reserve_tokens": {
      "minimal": 1024,
      "low": 4096,
      "medium": 16384,
      "high": 32768
    }
  },
  "document_strategies": {
    "application/pdf": "native",
    "application/json": "extract_text",
    "text/csv": "extract_text",
    "text/plain": "extract_text",
    "text/html": "extract_text",
    "default": "extract_and_chunk"
  }
}
