diff --git a/homelab-ai-bot/tools/api_costs.py b/homelab-ai-bot/tools/api_costs.py new file mode 100644 index 00000000..205a5a4d --- /dev/null +++ b/homelab-ai-bot/tools/api_costs.py @@ -0,0 +1,84 @@ +"""API-Kosten Tool — OpenRouter Guthaben und Verbrauch abfragen.""" + +import requests +from core import config + +TOOLS = [ + { + "type": "function", + "function": { + "name": "get_api_costs", + "description": "OpenRouter API-Kosten und Guthaben abfragen. Zeigt Verbrauch (heute/Woche/Monat), Restguthaben und Hochrechnung.", + "parameters": { + "type": "object", + "properties": {}, + }, + }, + }, +] + + +def _get_key(): + cfg = config.parse_config() + return cfg.api_keys.get("openrouter_key", "") + + +def handle_get_api_costs(**kw): + key = _get_key() + if not key: + return "OpenRouter API Key fehlt in homelab.conf" + + headers = {"Authorization": f"Bearer {key}"} + + try: + r_key = requests.get("https://openrouter.ai/api/v1/auth/key", + headers=headers, timeout=10) + r_key.raise_for_status() + key_data = r_key.json().get("data", {}) + except Exception as e: + return f"API-Abfrage fehlgeschlagen: {e}" + + try: + r_credits = requests.get("https://openrouter.ai/api/v1/credits", + headers=headers, timeout=10) + r_credits.raise_for_status() + credit_data = r_credits.json().get("data", {}) + except Exception: + credit_data = {} + + usage_daily = key_data.get("usage_daily", 0) + usage_weekly = key_data.get("usage_weekly", 0) + usage_monthly = key_data.get("usage_monthly", 0) + total_credits = credit_data.get("total_credits", 0) + total_usage = credit_data.get("total_usage", 0) + remaining = total_credits - total_usage if total_credits else None + + monthly_forecast = usage_daily * 30 if usage_daily > 0 else 0 + + lines = [ + "OpenRouter API-Kosten", + "", + f"Heute: ${usage_daily:.4f}", + f"Woche: ${usage_weekly:.4f}", + f"Monat: ${usage_monthly:.4f}", + ] + + if monthly_forecast > 0: + lines.append(f"Prognose (30d): ${monthly_forecast:.2f}") + + lines.append("") + + if remaining is not None: + lines.append(f"Guthaben: ${total_credits:.2f}") + lines.append(f"Verbraucht: ${total_usage:.2f}") + lines.append(f"Restguthaben: ${remaining:.2f}") + if usage_daily > 0 and remaining > 0: + days_left = remaining / usage_daily + lines.append(f"Reicht noch: ~{days_left:.0f} Tage (bei aktuellem Verbrauch)") + else: + lines.append("Guthaben: unbegrenzt (kein Limit gesetzt)") + + return "\n".join(lines) + + +HANDLERS = {"get_api_costs": handle_get_api_costs}