Spaces:
Build error
Build error
| from langfuse import Langfuse | |
| from langfuse.decorators import observe, langfuse_context | |
| from config.config import settings | |
| from services.llama_generator import LlamaGenerator | |
| import os | |
| # Initialize Langfuse | |
| os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-04d2302a-aa5c-4870-9703-58ab64c3bcae" | |
| os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-d34ea200-feec-428e-a621-784fce93a5af" | |
| os.environ["LANGFUSE_HOST"] = "https://chris4k-langfuse-template-space.hf.space" # 🇪🇺 EU region | |
| try: | |
| langfuse = Langfuse() | |
| except Exception as e: | |
| print("Langfuse Offline") | |
| ######## | |
| html = """ | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>AI State Machine</title> | |
| <style> | |
| body { font-family: Arial, sans-serif; text-align: center; } | |
| #chatbox { width: 80%; height: 300px; border: 1px solid #ccc; overflow-y: auto; margin: 20px auto; padding: 10px; } | |
| #inputbox { width: 70%; padding: 5px; } | |
| button { padding: 5px 10px; } | |
| </style> | |
| </head> | |
| <body> | |
| <h2>AI State Machine</h2> | |
| <div id="chatbox"></div> | |
| <input type="text" id="inputbox" placeholder="Type your message..."> | |
| <button onclick="sendMessage()">Send</button> | |
| <script> | |
| let ws = new WebSocket("wss://chris4k-a-i-statemachine.hf.space/ws"); | |
| ws.onopen = function() { | |
| console.log("WebSocket connected!"); | |
| ws.send("Hello AI!"); // Send initial message | |
| }; | |
| ws.onmessage = (event) => { | |
| console.log("Message from server: ", event.data); | |
| let chatbox = document.getElementById("chatbox"); | |
| chatbox.innerHTML += `<p>${event.data}</p>`; | |
| chatbox.scrollTop = chatbox.scrollHeight; | |
| }; | |
| ws.onerror = function(error) { | |
| console.error("WebSocket Error: ", error); | |
| }; | |
| function sendMessage() { | |
| let input = document.getElementById("inputbox"); | |
| let message = input.value.trim(); | |
| if (message) { | |
| ws.send(message); | |
| input.value = ""; | |
| } | |
| } | |
| </script> | |
| </body> | |
| </html> | |
| """ | |
| ###### | |
| import asyncio | |
| import random | |
| import time | |
| from fastapi import FastAPI, WebSocket | |
| from fastapi.responses import HTMLResponse | |
| import uvicorn | |
| class AIStateManager: | |
| def __init__(self): | |
| self.state = "awake" | |
| self.research_tasks = ["Explore AI Ethics", "Find latest AI models", "Investigate quantum computing"] | |
| self.current_task = None | |
| self.heartbeat_count = 0 | |
| self.clients = set() | |
| async def set_state(self, new_state): | |
| """Thread-safe state change with logging.""" | |
| print(f"[STATE CHANGE] {self.state} → {new_state}") | |
| self.state = new_state | |
| await self.broadcast(f"State changed to {new_state}") | |
| async def broadcast(self, message): | |
| """Broadcast message to all connected clients.""" | |
| for client in list(self.clients): | |
| try: | |
| await client.send_text(message) | |
| except Exception as e: | |
| print(f"Broadcast error: {e}") | |
| self.clients.remove(client) | |
| async def research_cycle(self): | |
| """Manages research state tasks.""" | |
| while True: | |
| await asyncio.sleep(5) # Longer interval for visibility | |
| # State-based logic | |
| if self.state == "awake": | |
| self.heartbeat_count += 1 | |
| if self.heartbeat_count >= 3: | |
| await self.set_state("research") | |
| elif self.state == "research": | |
| if self.research_tasks: | |
| task = self.research_tasks.pop(0) | |
| await self.broadcast(f"Researching: {task}") | |
| # Simulate task work | |
| await asyncio.sleep(3) | |
| # Random chance of generating follow-up | |
| if random.random() < 0.3: | |
| await self.broadcast(f"Question about {task}") | |
| else: | |
| await self.set_state("sleeping") | |
| elif self.state == "sleeping": | |
| await self.broadcast("System in sleep mode") | |
| await asyncio.sleep(10) # Longer sleep | |
| # Reset after sleep | |
| self.research_tasks = ["Explore AI Ethics", "Find latest AI models", "Investigate quantum computing"] | |
| await self.set_state("awake") | |
| self.heartbeat_count = 0 | |
| # FastAPI Setup | |
| app = FastAPI() | |
| ai_manager = AIStateManager() | |
| async def websocket_endpoint(websocket: WebSocket): | |
| await websocket.accept() | |
| ai_manager.clients.add(websocket) | |
| try: | |
| while True: | |
| data = await websocket.receive_text() | |
| await ai_manager.broadcast(f"Received: {data}") | |
| except Exception as e: | |
| print(f"WebSocket error: {e}") | |
| finally: | |
| ai_manager.clients.remove(websocket) | |
| async def startup_event(): | |
| """Start research cycle on app startup.""" | |
| asyncio.create_task(ai_manager.research_cycle()) | |
| async def get(): | |
| """Serve frontend HTML.""" | |
| return HTMLResponse(html) | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="localhost", port=8000) | |