Files
hermes-relay/app.py
T
wouser e05fa9c5c1 v2.1: Switch to voice-assistant profile
- Use voice-assistant profile (minimal chatbot, max_turns=10, nous provider)
- Remove /fast prefix and model override - handled by profile config
- Use messaging toolset for send_message tool (Telegram delivery)
- Add hardcoded TELEGRAM_BOT_TOKEN and TELEGRAM_HOME_CHANNEL to relay env
- Telegram delivery now works via gateway's send_message_tool
- Version bump to 2.1
- Health endpoint shows profile: voice-assistant
2026-06-16 09:37:48 +02:00

139 lines
5.0 KiB
Python

"""
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
tg_msg = "🤖 Hermes Relay\n\nVraag: " + prompt + "\n\nAntwoord: " + answer
tg_sent = send_telegram(tg_msg)
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)