"""Rozmowa z warstwą logiczną w sprawach tego modułu. Metody nie siedzą na wspólnym kliencie, tylko tutaj: gdyby siedziały tam, ich nazwy (`prompt`, `horoscope`, `llm_models`) byłyby w pliku, który jedzie do KAŻDEGO obrazu — także tam, gdzie tego modułu nie ma. Wspólny klient daje samą drogę w dół (`wywolaj`, `pobierz`, `strumien`), z szyfrowaniem łącza i tokenem międzywarstwowym; co nią pojedzie, jest sprawą modułu. """ from __future__ import annotations from typing import Any from app.config import settings def prompt(logic: Any, *, profile: str, when_utc_iso: str, lat: float, lon: float, budget: str = "medium", from_date: str | None = None, to_date: str | None = None, provider: str | None = None, model: str | None = None) -> dict[str, Any]: """Gotowy prompt z wyliczeń (LOG-29/30). `provider` jest potrzebny dla budżetu „maksymalny kontekst modelu": limit znaków zależy wtedy od okna kontekstu konkretnego modelu.""" payload: dict[str, Any] = { "profile": profile, "when_utc": when_utc_iso, "lat": lat, "lon": lon, "budget": budget, "provider": provider, "model": model, } if from_date and to_date: payload["from_date"], payload["to_date"] = from_date, to_date return logic.wywolaj("/chart/prompt", payload, max(settings.http_timeout, 60.0)) def horoscope(logic: Any, *, profile: str, when_utc_iso: str, lat: float, lon: float, budget: str = "medium", provider: str | None = None, model: str | None = None, from_date: str | None = None, to_date: str | None = None) -> dict[str, Any]: """Napisany horoskop (LOG-31). Długi timeout, bo pisanie trwa — zwłaszcza na modelu lokalnym.""" payload: dict[str, Any] = { "profile": profile, "when_utc": when_utc_iso, "lat": lat, "lon": lon, "budget": budget, } if provider: payload["provider"] = provider if model: payload["model"] = model if from_date and to_date: payload["from_date"], payload["to_date"] = from_date, to_date return logic.wywolaj("/chart/horoscope", payload, max(settings.http_timeout, 300.0)) def strumien(logic: Any, payload: dict[str, Any]): """Strumień postępu pisania (NDJSON), przekazywany do przeglądarki. Strumień niesie heartbeat, więc cisza na łączu nie zostanie wzięta za zerwanie.""" yield from logic.strumien("/chart/horoscope/stream", payload) def modele(logic: Any) -> dict[str, Any]: """Katalog modeli per dostawca — podpowiedzi do pola wyboru.""" return logic.pobierz("/llm/models")