Spaces:
Paused
Paused
| # server.py | |
| import os | |
| import uuid | |
| import subprocess | |
| import flask | |
| from flask_cors import CORS | |
| from dotenv import load_dotenv | |
| from livekit import api | |
| load_dotenv() | |
| LIVEKIT_URL = os.environ.get("LIVEKIT_URL") | |
| LIVEKIT_API_KEY = os.environ.get("LIVEKIT_API_KEY") | |
| LIVEKIT_API_SECRET = os.environ.get("LIVEKIT_API_SECRET") | |
| ROOM_NAME = "rajesh-portfolio-room" | |
| if not all([LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET]): | |
| raise EnvironmentError("LIVEKIT_URL, LIVEKIT_API_KEY, and LIVEKIT_API_SECRET must be set") | |
| app = flask.Flask(__name__, template_folder="templates") | |
| CORS(app, resources={r"/get-token": {"origins": "*"}}) | |
| def index(): | |
| return flask.render_template("index.html") | |
| def get_token(): | |
| identity = f"user-{uuid.uuid4()}" | |
| token = ( | |
| api.AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET) | |
| .with_identity(identity) | |
| .with_name(f"Visitor-{identity}") | |
| .with_grants(api.VideoGrants(room_join=True, room=ROOM_NAME)) | |
| ) | |
| return flask.jsonify({"token": token.to_jwt(), "livekitUrl": LIVEKIT_URL}) | |
| # Start agent as subprocess before Flask starts | |
| agent_process = None | |
| if __name__ == "__main__": | |
| print("=" * 60) | |
| print("Starting LiveKit Agent worker...") | |
| print("=" * 60) | |
| # Start agent as non-blocking subprocess | |
| agent_process = subprocess.Popen( | |
| ["python", "app.py"], | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.STDOUT, | |
| text=True, | |
| bufsize=1 | |
| ) | |
| print("[AGENT] Process started with PID:", agent_process.pid) | |
| print("=" * 60) | |
| print("Starting Flask server...") | |
| print("=" * 60) | |
| # Run Flask (this blocks) | |
| app.run(host="0.0.0.0", port=7860) |