Chris4K's picture
Update app.py
1ac7e59 verified
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()
@app.websocket("/ws")
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)
@app.on_event("startup")
async def startup_event():
"""Start research cycle on app startup."""
asyncio.create_task(ai_manager.research_cycle())
@app.get("/")
async def get():
"""Serve frontend HTML."""
return HTMLResponse(html)
if __name__ == "__main__":
uvicorn.run(app, host="localhost", port=8000)