|
44 | 44 | sign_edt, |
45 | 45 | ) |
46 | 46 |
|
47 | | -# ── Gemma 4 via Google AI Studio ───────────────────────────────────────────── |
48 | | -# Gemma 4 (E4B) is a multimodal any-to-any model — not on HF serverless. |
49 | | -# The only public inference path is Google AI Studio (free API key at |
50 | | -# aistudio.google.com/apikey). Add key as GOOGLE_API_KEY Space secret. |
| 47 | +# ── Gemma 4 via Google AI Studio (pure REST — no extra deps) ───────────────── |
| 48 | +# Uses the Gemini REST API directly with `requests` (always available). |
| 49 | +# No google-generativeai package needed — avoids grpcio compile time. |
51 | 50 | # |
52 | | -# Fallback chain (checked in order): |
53 | | -# 1. Google AI Studio — GOOGLE_API_KEY + GEMMA_MODEL (default: gemma-4-e4b-it) |
54 | | -# 2. HF InferenceClient — HF_TOKEN + featherless-ai + gemma-3-12b-it |
| 51 | +# Fallback chain: |
| 52 | +# 1. Google AI Studio REST — GOOGLE_API_KEY |
| 53 | +# 2. HF featherless-ai — HF_TOKEN + gemma-3-12b-it |
| 54 | +import requests as _requests |
| 55 | + |
55 | 56 | _GEMMA_MODEL = os.environ.get("GEMMA_MODEL", "gemma-4-31b-it") |
56 | 57 | _GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY") |
57 | 58 | _HF_TOKEN = os.environ.get("HF_TOKEN") |
58 | 59 | _GEMMA_AVAILABLE = False |
59 | 60 | _GEMMA_BACKEND = None # "google" | "hf" |
60 | 61 | _GEMMA_INIT_ERR = "" |
61 | | -_gemma_google = None |
62 | 62 | _gemma_hf = None |
63 | 63 |
|
64 | | -try: |
65 | | - import google.generativeai as genai |
66 | | - if _GOOGLE_API_KEY: |
67 | | - genai.configure(api_key=_GOOGLE_API_KEY) |
68 | | - _gemma_google = genai.GenerativeModel(_GEMMA_MODEL) |
69 | | - _GEMMA_AVAILABLE = True |
70 | | - _GEMMA_BACKEND = "google" |
71 | | - else: |
72 | | - _GEMMA_INIT_ERR = "GOOGLE_API_KEY not set" |
73 | | -except Exception as _e: |
74 | | - _GEMMA_INIT_ERR = f"google-generativeai error: {_e}" |
75 | | - |
76 | | -if not _GEMMA_AVAILABLE: |
| 64 | +if _GOOGLE_API_KEY: |
| 65 | + _GEMMA_AVAILABLE = True |
| 66 | + _GEMMA_BACKEND = "google" |
| 67 | +else: |
| 68 | + _GEMMA_INIT_ERR = "GOOGLE_API_KEY not set" |
77 | 69 | try: |
78 | 70 | from huggingface_hub import InferenceClient |
79 | 71 | if _HF_TOKEN: |
@@ -205,11 +197,18 @@ def _call_gemma(prompt: str, single: bool = False) -> str: |
205 | 197 | return "" |
206 | 198 | try: |
207 | 199 | if _GEMMA_BACKEND == "google": |
208 | | - resp = _gemma_google.generate_content( |
209 | | - prompt, |
210 | | - generation_config={"max_output_tokens": 300 if not single else 120}, |
| 200 | + url = ( |
| 201 | + f"https://generativelanguage.googleapis.com/v1beta/models/" |
| 202 | + f"{_GEMMA_MODEL}:generateContent?key={_GOOGLE_API_KEY}" |
211 | 203 | ) |
212 | | - return resp.text.strip() |
| 204 | + body = { |
| 205 | + "contents": [{"parts": [{"text": prompt}]}], |
| 206 | + "generationConfig": {"maxOutputTokens": 300 if not single else 120}, |
| 207 | + } |
| 208 | + r = _requests.post(url, json=body, timeout=60) |
| 209 | + r.raise_for_status() |
| 210 | + data = r.json() |
| 211 | + return data["candidates"][0]["content"]["parts"][0]["text"].strip() |
213 | 212 | else: |
214 | 213 | result = _gemma_hf.chat.completions.create( |
215 | 214 | model="google/gemma-3-12b-it", |
|
0 commit comments