File size: 1,824 Bytes
fbd18c8
 
 
 
6d5b557
fbd18c8
 
 
0017280
 
106354e
68a6539
fbd18c8
 
 
 
 
9815e49
fbd18c8
 
 
 
 
 
 
 
 
 
 
 
9815e49
fbd18c8
f95cdb7
 
fbd18c8
 
 
 
 
 
 
 
 
 
 
 
0017280
 
112b4f4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"""Google Gemini LLM provider (google-genai SDK)."""

SUPPORTED_MODELS = [
    "gemini-2.5-flash",
    "gemini-2.5-pro",
    "gemini-2.0-flash",
]


def generate(system_prompt: str, user_message: str, api_key: str,
             model: str = None, temperature: float = 0.0,
             max_tokens: int = 8192) -> str:
    from google import genai

    model = model or SUPPORTED_MODELS[0]
    client = genai.Client(api_key=api_key)

    try:
        response = client.models.generate_content(
            model=model,
            contents=user_message,
            config=genai.types.GenerateContentConfig(
                system_instruction=system_prompt,
                temperature=temperature,
                max_output_tokens=max_tokens,
            ),
        )
        # Check for blocked responses
        if not response.text:
            return ""
        return response.text
    except ValueError as e:
        # Safety filter block — return empty so verifier treats it as generation failure
        return ""
    except Exception as e:
        error_type = type(e).__name__
        error_msg = str(e)
        if "auth" in error_type.lower() or "authentication" in error_type.lower() or "api_key" in error_msg.lower():
            raise RuntimeError(f"Gemini authentication failed. Check your API key.") from e
        elif "rate" in error_type.lower() or "429" in error_msg:
            raise RuntimeError(f"Gemini rate limit exceeded. Wait a moment and try again.") from e
        elif "model" in error_msg.lower() or "not found" in error_msg.lower():
            raise RuntimeError(f"Gemini model error: {error_msg}") from e
        else:
            raise RuntimeError(f"Gemini API error ({error_type}): {error_msg}") from e


def list_models(api_key: str) -> list[str]:
    return list(SUPPORTED_MODELS)