Spaces:
Sleeping
Sleeping
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) | |