- ki.complete() zählt sich selbst (user_id-Parameter, _track_usage) - CLOUD_WEEKLY_LIMIT=20, geprüft vor jedem Cloud-Call - user_id durchgereicht in health, diary, knigge, notes, ki-route - Admin-Panel: 7-Tage-Ansicht, Limit-Info, Top-Cloud-User-Tabelle - Statusmail täglich 06:00 CEST statt alle 2h
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""BAN YARO — KI Routes"""
|
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
import ki as ki_module
|
|
from auth import get_current_user
|
|
from ratelimit import check as rl_check
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class TrainingRequest(BaseModel):
|
|
problem: str
|
|
rasse: Optional[str] = None
|
|
alter: Optional[str] = None
|
|
|
|
|
|
@router.post("/training")
|
|
async def ki_training(req: TrainingRequest, request: Request,
|
|
user=Depends(get_current_user)):
|
|
"""KI-Trainingsberatung für individuelle Verhaltens- und Trainingsprobleme."""
|
|
rl_check(request, max_requests=10, window_seconds=3600, key="ki_training")
|
|
if not req.problem or len(req.problem.strip()) < 10:
|
|
raise HTTPException(400, "Bitte beschreibe das Problem genauer.")
|
|
if len(req.problem) > 1000:
|
|
raise HTTPException(400, "Beschreibung zu lang (max. 1000 Zeichen).")
|
|
|
|
rasse = req.rasse or "unbekannt"
|
|
alter = req.alter or "unbekannt"
|
|
|
|
system = (
|
|
"Du bist ein erfahrener, zertifizierter Hundetrainer mit Schwerpunkt "
|
|
"auf positiver Verstärkung und gewaltfreier Erziehung. "
|
|
"Antworte immer auf Deutsch, konkret, verständlich und motivierend. "
|
|
"Gib keine Ratschläge die Schmerz oder Zwang beinhalten. "
|
|
"Wenn das Problem schwerwiegend ist (Aggression, starke Angst), "
|
|
"empfehle professionellen Hundetrainer vor Ort zusätzlich."
|
|
)
|
|
|
|
prompt = f"""Hund: {rasse}, {alter} alt.
|
|
|
|
Problem: {req.problem.strip()}
|
|
|
|
Bitte gib:
|
|
1. Eine kurze Einschätzung des Problems (1-2 Sätze)
|
|
2. 3-5 konkrete Trainingsschritte die ich heute starten kann
|
|
3. Was ich vermeiden sollte
|
|
4. Wann ich einen Profi hinzuziehen sollte (falls relevant)
|
|
|
|
Schreibe klar und strukturiert, ohne unnötigen Fachjargon."""
|
|
|
|
try:
|
|
result = await ki_module.complete(
|
|
prompt=prompt,
|
|
system=system,
|
|
max_tokens=600,
|
|
requires_premium=False,
|
|
user_id=user["id"],
|
|
)
|
|
return {"antwort": result}
|
|
except ki_module.KIUnavailableError as e:
|
|
raise HTTPException(503, str(e))
|
|
except Exception as e:
|
|
raise HTTPException(500, "KI momentan nicht verfügbar.")
|