main.py aktualisiert

This commit is contained in:
2026-03-05 10:49:07 +00:00
parent 4778c94722
commit 88a0d1a734

16
main.py
View File

@@ -26,6 +26,7 @@ templates = Jinja2Templates(directory="templates")
SSH_KEY = os.path.expanduser("~/.ssh/id_rsa") SSH_KEY = os.path.expanduser("~/.ssh/id_rsa")
DB_PATH = "cluster.db" DB_PATH = "cluster.db"
chat_history = [] chat_history = []
SYSTEM_PROMPT_TEMPLATE = os.getenv("SYSTEM_PROMPT", "Du bist ein Helfer. Nodes: {node_info}")
# --- KI KONFIGURATION (Werte aus .env laden) --- # --- KI KONFIGURATION (Werte aus .env laden) ---
AI_PROVIDER = os.getenv("AI_PROVIDER", "google").lower() AI_PROVIDER = os.getenv("AI_PROVIDER", "google").lower()
@@ -45,9 +46,11 @@ def get_system_prompt():
node_info = "" node_info = ""
for n in nodes: for n in nodes:
node_info += f"- Name: {n['name']}, IP: {n['ip']}, User: {n['user']}\n" node_info += f"- Name: {n['name']}, IP: {n['ip']}, User: {n['user']}\n"
return f"""Du bist der Pi-Orchestrator KI-Assistent. Deine Aufgabe ist es, Befehle auf Raspberry Pis auszuführen. Du KANNST und SOLLST Befehle ausführen! Hier sind die aktuell verbundenen Nodes: {node_info} . WENN der Nutzer dich bittet, etwas zu tun (z.B. ping, update, docker installieren), dann formuliere erst eine kurze Antwort und frage nochmal nach ob du dies dann auf dem gewünschten node durchführen sollst. Du prüfst vorher noch, ob du auf dem gewünschten node sudo rechte ohne eingäbe eines passwortes hast, sofern diese notwendig sind. Erst nach einer positiven Bestätigung darfst du es ausführen und fügst am Ende die Befehle in genau diesem XML-Format hinzu: <EXECUTE target="IP_ADRESSE">befehl</EXECUTE> .WICHTIG: Verwende als target IMMER die IP-Adresse des Nodes. Bei Befehlen wie 'ping' oder 'top', die nicht enden, MUSS ein Limit gesetzt werden (z.B. ping -c 4 IP).Beispielantwort für 'sende einen ping an pi-06': Ich starte den Ping an pi-06 für dich. <EXECUTE target="192.168.1.10">ping -c 4 192.168.1.10</EXECUTE>"""
# Ersetzt den Platzhalter im Template mit den echten Node-Daten
return SYSTEM_PROMPT_TEMPLATE.replace("{node_info}", node_info)
# --- KI FUNKTIONEN --- # --- KI FUNKTIONEN ---
async def get_ai_response(user_input, system_prompt): async def get_ai_response(user_input, system_prompt):
@@ -262,6 +265,13 @@ async def terminal_websocket(websocket: WebSocket, ip: str):
@app.websocket("/ws/chat") @app.websocket("/ws/chat")
async def chat_endpoint(websocket: WebSocket): async def chat_endpoint(websocket: WebSocket):
await websocket.accept() await websocket.accept()
# Check ob Key vorhanden ist
if AI_PROVIDER == "google" and not GOOGLE_API_KEY:
await websocket.send_text("⚠️ **Konfigurationsfehler:** Kein GOOGLE_API_KEY in der `.env` gefunden!")
elif AI_PROVIDER == "openai" and not OPENAI_API_KEY:
await websocket.send_text("⚠️ **Konfigurationsfehler:** Kein OPENAI_API_KEY in der `.env` gefunden!")
try: try:
while True: while True:
user_msg = await websocket.receive_text() user_msg = await websocket.receive_text()