Feature: Geburtstags-KI — 2 Modi (morgen: Ideen, heute: Hundeperspektive), DB-Cache, Abend-Tagebuch-Hinweis (SW by-v780)
This commit is contained in:
parent
af7fe7813e
commit
9ebd40aaae
7 changed files with 185 additions and 10 deletions
|
|
@ -167,6 +167,85 @@ def _log_rasse_request(user_id: int):
|
|||
)
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# POST /ki/geburtstag — Geburtstags-Überraschungsideen (kostenlos für alle)
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
class BirthdayRequest(BaseModel):
|
||||
dog_id: int
|
||||
name: str
|
||||
rasse: Optional[str] = None
|
||||
alter: Optional[int] = None
|
||||
mode: str = "tomorrow" # "tomorrow" | "today"
|
||||
|
||||
@router.post("/geburtstag")
|
||||
async def ki_geburtstag(req: BirthdayRequest, request: Request,
|
||||
user=Depends(get_current_user)):
|
||||
"""Kostenlose KI-Geburtstagsideen — kein Premium nötig, 1x/Tag, DB-gecacht."""
|
||||
from datetime import date
|
||||
year = date.today().year
|
||||
mode = req.mode if req.mode in ("tomorrow", "today") else "tomorrow"
|
||||
|
||||
# Aus DB-Cache zurückgeben wenn bereits generiert
|
||||
with db() as conn:
|
||||
cached = conn.execute(
|
||||
"SELECT content FROM bday_ki_cache WHERE dog_id=? AND year=? AND mode=?",
|
||||
(req.dog_id, year, mode)
|
||||
).fetchone()
|
||||
if cached:
|
||||
return {"answer": cached["content"], "cached": True}
|
||||
|
||||
# Rate-Limit: 1 Generierung pro Tag pro User
|
||||
rl_check(request, max_requests=1, window_seconds=86400, key=f"ki_bday_{req.dog_id}_{mode}")
|
||||
|
||||
name = req.name.strip()[:40] or "deinen Hund"
|
||||
rasse = req.rasse or None
|
||||
alter = req.alter
|
||||
rasse_str = f"({rasse})" if rasse else ""
|
||||
|
||||
if mode == "today":
|
||||
# Aus Sicht des Hundes — was er sich für seinen Geburtstag vorstellt
|
||||
alter_str = f"{alter}. Geburtstag" if alter else "Geburtstag"
|
||||
system = (
|
||||
"Du bist ein Hund und erzählst aus deiner eigenen Perspektive. "
|
||||
"Schreibe auf Deutsch, verspielt, liebevoll und mit Hundelogik. "
|
||||
"Verwende typische Hundegedanken: Fressen, Gassi, Schmusen, Spielen, Gerüche."
|
||||
)
|
||||
prompt = (
|
||||
f"Ich bin {name} {rasse_str} und heute ist mein {alter_str}! "
|
||||
f"Erzähl in meiner Stimme (als Hund), wie ich mir den perfekten Geburtstagstag vorgestellt habe — "
|
||||
f"von Morgen bis Abend. Was möchte ich erleben, fressen, riechen, spielen? "
|
||||
f"Ca. 150 Wörter, herzlich und humorvoll."
|
||||
)
|
||||
else:
|
||||
# Überraschungsideen für morgen
|
||||
alter_str = f"{alter}. Geburtstag" if alter else "Geburtstag"
|
||||
system = (
|
||||
"Du bist ein begeisterter Hundefreund mit vielen kreativen Ideen. "
|
||||
"Antworte auf Deutsch, herzlich, konkret und mit einer Prise Humor. "
|
||||
"Fokus auf praktische, umsetzbare Überraschungen."
|
||||
)
|
||||
prompt = (
|
||||
f"Morgen ist der {alter_str} von {name} {rasse_str}! "
|
||||
f"Was können wir {name} besonders gönnen? "
|
||||
f"Gib 5 konkrete, liebevolle Überraschungsideen — von einfach bis aufwendig, "
|
||||
f"jeweils mit einem Satz warum Hunde das lieben."
|
||||
)
|
||||
|
||||
try:
|
||||
answer = await ki_module.complete(
|
||||
system=system, prompt=prompt, max_tokens=600, requires_premium=False,
|
||||
)
|
||||
with db() as conn:
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO bday_ki_cache (dog_id, year, mode, content) VALUES (?,?,?,?)",
|
||||
(req.dog_id, year, mode, answer)
|
||||
)
|
||||
return {"answer": answer, "cached": False}
|
||||
except ki_module.KIUnavailableError:
|
||||
raise HTTPException(503, "KI momentan nicht verfügbar.")
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# POST /ki/rasse-erkennung — Vision-basierte Rassenerkennung
|
||||
# ------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue