""" Hermes Relay v2 — Flask bridge tussen Node-RED en Hermes Agent. Gebruikt de voice-assistant profiel (minimale chatbot, max_turns=10). Geen prefix/model override nodig — profiel handelt dit af. Node-RED stuurt POST met msg.payload → Hermes (direct) → Alleen antwoord terug. """ import os import sys import time import logging # ── Hermes path toevoegen (zodat we Hermes direct kunnen importeren) ─── _HERMES_SITE = "/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages" if _HERMES_SITE not in sys.path: sys.path.insert(0, _HERMES_SITE) from flask import Flask, request, jsonify # ── Config ────────────────────────────────────────────────────────────── TIMEOUT = 120 # max seconden voor Hermes query TG_TARGET = "telegram" # hermes send target # ── Logging ───────────────────────────────────────────────────────────── logging.basicConfig( level=logging.INFO, format="[hermes-relay] %(asctime)s %(levelname)s %(message)s", stream=sys.stderr, ) logger = logging.getLogger(__name__) # ── Flask app ─────────────────────────────────────────────────────────── app = Flask(__name__) # ── Hermes warm houden ────────────────────────────────────────────────── from hermes_client import call_hermes as _hermes_query # Laad gateway config eenmalig voor Telegram verzenden _gw_config_loaded = False _gw_config = None def _ensure_gw_config(): """Laad gateway config eenmalig.""" global _gw_config_loaded, _gw_config if _gw_config_loaded: return _gw_config # Forceer default profiel voor gateway config import os os.environ["HERMES_HOME"] = "/root/.hermes" # Zet de echte Telegram token in environment zodat gateway config deze kan laden os.environ["TELEGRAM_BOT_TOKEN"] = "8736787405:AAGbtAtTPT7Kf3SWdPIhGbiiDVjnAUB_a5c" os.environ["TELEGRAM_HOME_CHANNEL"] = "5453608010" from gateway.config import load_gateway_config _gw_config = load_gateway_config() _gw_config_loaded = True return _gw_config def send_telegram(text): """Stuur bericht via gateway's send_message_tool (gebruikt gateway config met echte token).""" try: logger.info("Telegram send: starting...") _ensure_gw_config() logger.info("Telegram send: gw config loaded") from tools.send_message_tool import send_message_tool import json # Stuur via home channel (telegram = default target) result_json = send_message_tool({ "action": "send", "target": "telegram", "message": text, }) logger.info("Telegram send: send_message_tool returned") result = json.loads(result_json) if result.get("error"): logger.error("Telegram send failed: %s", result["error"]) return False logger.info("Telegram send: success=%s", result.get("success", False)) return result.get("success", False) except Exception as e: logger.error("Telegram send failed with exception: %s", e, exc_info=True) return False # ── Routes ────────────────────────────────────────────────────────────── @app.route("/ask", methods=["POST"]) def ask(): """Main relay endpoint — retourneert alleen het antwoord.""" start = time.time() # Parse input if request.is_json: data = request.get_json(silent=True) or {} prompt = data.get("payload", "") else: prompt = request.form.get("payload", "") if not prompt: return jsonify({"status": "error", "message": "No payload received"}), 400 logger.info("Received: %s...", prompt[:100]) # Roep Hermes aan (direct, geen subprocess) answer = _hermes_query(prompt) elapsed = round(time.time() - start, 1) logger.info("Answer (%.1fs): %s...", elapsed, answer[:200]) # Stuur ook naar Telegram (alleen het antwoord) tg_sent = send_telegram(answer) return jsonify({ "status": "ok", "answer": answer, "elapsed_seconds": elapsed, "telegram_sent": tg_sent, }) @app.route("/health", methods=["GET"]) def health(): """Health check voor Node-RED monitoring.""" return jsonify({ "status": "ok", "service": "hermes-relay", "version": "2.1", "mode": "python-import", "profile": "voice-assistant", }) if __name__ == "__main__": logger.info("Starting Hermes Relay v2.1 (voice-assistant profiel)...") app.run(host="0.0.0.0", port=8650, debug=False)