from flask import Flask, request, jsonify, make_response import os, time, html, requests, json from itsdangerous import BadSignature, URLSafeSerializer SECRET_KEY = os.getenv("SECRET_KEY", "change-me") # must match Gate TOKEN_TTL = int(os.getenv("TOKEN_TTL", "3600")) CHAT_MODEL_URL = os.getenv("CHAT_MODEL_URL", "") # e.g. https:///chat app = Flask(__name__) signer = URLSafeSerializer(SECRET_KEY, salt="jarvis-facegate") def verify_token(token: str): try: data = signer.loads(token) if time.time() - float(data.get("ts", 0)) > TOKEN_TTL: return None return data except BadSignature: return None def shell(name=""): safe = html.escape(name or "Agent") return f""" Jarvis Chat

Jarvis Chat

Welcome, {safe}. You are now connected.
""" @app.get("/") def home(): token = request.args.get("token","") info = verify_token(token) if token else None if not info: return make_response("

Access denied. Missing/invalid token.

", 401) name = info.get("name","User") return make_response(shell(name), 200, {"Content-Type":"text/html; charset=utf-8"}) @app.post("/api/chat") def api_chat(): # This is a simple proxy to your chatbot model, or a stub if CHAT_MODEL_URL is unset. q = (request.json or {}).get("q","").strip() if not q: return jsonify({"error":"empty message"}), 400 if CHAT_MODEL_URL: try: r = requests.post(CHAT_MODEL_URL, json={"inputs": q}, timeout=60) if r.ok: # Tailor this to your model's response schema data = r.json() a = data.get("generated_text") or data.get("answer") or str(data) return jsonify({"a": a}) return jsonify({"error": f"model status {r.status_code}"}), 502 except Exception as e: return jsonify({"error": f"upstream error: {e}"}), 502 else: # Stub: echo return jsonify({"a": f"(stub) You said: {q}"}), 200 if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)