From cf5e53f341bf14b542d1a55aac71ad962699a7f1 Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 8 Dec 2025 10:52:57 +0100 Subject: [PATCH] =?UTF-8?q?anderes=20LLm=20und=20timeout=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config.py | 2 +- app/services/llm_service.py | 34 +++++++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/config.py b/app/config.py index b0ed146..a1ea619 100644 --- a/app/config.py +++ b/app/config.py @@ -26,7 +26,7 @@ class Settings: # WP-05 LLM / Ollama OLLAMA_URL: str = os.getenv("MINDNET_OLLAMA_URL", "http://127.0.0.1:11434") # ÄNDERUNG: Standard auf 'mistral' gesetzt, da bereits lokal vorhanden - LLM_MODEL: str = os.getenv("MINDNET_LLM_MODEL", "mistral") + LLM_MODEL: str = os.getenv("MINDNET_LLM_MODEL", "phi3:mini") PROMPTS_PATH: str = os.getenv("MINDNET_PROMPTS_PATH", "config/prompts.yaml") # API diff --git a/app/services/llm_service.py b/app/services/llm_service.py index 0990087..3d99064 100644 --- a/app/services/llm_service.py +++ b/app/services/llm_service.py @@ -1,12 +1,8 @@ """ app/services/llm_service.py — LLM Client (Ollama) -Zweck: - Kapselt die Kommunikation mit der Ollama API. - Lädt Prompts & Templates aus der YAML-Config. - Version: - 0.1.0 (WP-05 Init) + 0.1.2 (WP-05 Fix: Increased Timeout for CPU Inference) """ import httpx @@ -22,13 +18,13 @@ class LLMService: def __init__(self): self.settings = get_settings() self.prompts = self._load_prompts() - self.client = httpx.AsyncClient(base_url=self.settings.OLLAMA_URL, timeout=60.0) + # FIX: Timeout auf 120 Sekunden erhöht für CPU-Only Server + self.client = httpx.AsyncClient(base_url=self.settings.OLLAMA_URL, timeout=120.0) def _load_prompts(self) -> dict: """Lädt Prompts aus der konfigurierten YAML-Datei.""" path = Path(self.settings.PROMPTS_PATH) if not path.exists(): - # Fallback, falls Datei noch nicht existiert (Dev-Schutz) logger.warning(f"Prompt config not found at {path}, using defaults.") return { "system_prompt": "You are a helpful AI assistant.", @@ -56,24 +52,32 @@ class LLMService: "model": self.settings.LLM_MODEL, "system": system_prompt, "prompt": final_prompt, - "stream": False, # Vorerst kein Streaming für einfacheres Handling + "stream": False, "options": { "temperature": 0.7, - "num_ctx": 4096 + # Kleinerer Context spart Rechenzeit, falls 4096 zu viel ist + "num_ctx": 2048 } } try: response = await self.client.post("/api/generate", json=payload) - response.raise_for_status() + + if response.status_code != 200: + error_msg = response.text + logger.error(f"Ollama API Error ({response.status_code}): {error_msg}") + return f"Fehler vom LLM (Modell '{self.settings.LLM_MODEL}' vorhanden?): {error_msg}" + data = response.json() return data.get("response", "") - except httpx.HTTPError as e: - logger.error(f"Ollama API Error: {e}") - return f"Fehler bei der Generierung der Antwort: {str(e)}" + + except httpx.ReadTimeout: + return "Timeout: Das Modell braucht zu lange zum Antworten (>120s). Hardware-Limit erreicht?" + except httpx.ConnectError: + return "Verbindungsfehler: Ist Ollama gestartet (Port 11434)?" except Exception as e: - logger.error(f"LLM Service Error: {e}") - return "Ein unerwarteter Fehler ist aufgetreten." + logger.error(f"LLM Service Exception: {e}") + return f"Interner Fehler: {str(e)}" async def close(self): await self.client.aclose() \ No newline at end of file