| """LLM invocation through Gemini API (google-genai).""" |
|
|
| from __future__ import annotations |
|
|
| from contextvars import ContextVar |
|
|
| from google import genai |
| from google.genai import types |
|
|
| from src.config import settings |
|
|
|
|
| _runtime_api_key: ContextVar[str | None] = ContextVar("runtime_gemini_api_key", default=None) |
|
|
| def set_runtime_gemini_api_key(api_key: str | None) -> None: |
| _runtime_api_key.set(api_key.strip() if isinstance(api_key, str) else None) |
|
|
| def invoke_llm(prompt: str) -> str: |
| """Invoke the configured chat model and return plain text. |
| |
| Args: prompt. |
| Returns: assistant text content. |
| Raises: RuntimeError if the API key is missing or response is empty. |
| """ |
| api_key = _runtime_api_key.get() or settings.gemini_api_key |
| if not api_key: |
| raise RuntimeError("Missing Gemini API key. Please provide it in the UI (or set GEMINI_API_KEY).") |
|
|
| client = genai.Client(api_key=api_key) |
| resp = client.models.generate_content( |
| model=settings.llm_model, |
| contents=prompt, |
| config=types.GenerateContentConfig( |
| temperature=settings.llm_temperature, |
| max_output_tokens=settings.llm_max_new_tokens, |
| ), |
| ) |
| text = (resp.text or "").strip() |
| if not text: |
| raise RuntimeError("Empty response from Gemini.") |
| return text |
|
|
|
|