main.py aktualisiert

This commit is contained in:
2026-03-06 16:36:02 +00:00
parent bcd705bc93
commit b63d4cbf63

121
main.py
View File

@@ -86,30 +86,77 @@ def get_system_prompt():
return template.replace("{node_info}", node_info) return template.replace("{node_info}", node_info)
# --- KI LOGIK (UNVERÄNDERT) --- # --- KI FUNKTIONEN ---
async def get_ai_response(user_input, system_prompt): async def get_ai_response(user_input, system_prompt):
global chat_history global chat_history
# 1. Die neue User-Nachricht dem Gedächtnis hinzufügen
chat_history.append({"role": "user", "content": user_input}) chat_history.append({"role": "user", "content": user_input})
# 2. Gedächtnis auf die letzten 30 Nachrichten begrenzen
chat_history = chat_history[-30:] chat_history = chat_history[-30:]
ai_msg = "" ai_msg = ""
try: try:
if AI_PROVIDER in ["openai", "ollama"]: if AI_PROVIDER == "openai" or AI_PROVIDER == "ollama":
url = OLLAMA_BASE_URL if AI_PROVIDER == "ollama" else None messages = [{"role": "system", "content": system_prompt}] + chat_history
if url and not url.endswith('/v1'): url = url.rstrip('/') + '/v1'
key = "ollama" if AI_PROVIDER == "ollama" else OPENAI_API_KEY # Sicherstellen, dass die URL für Ollama korrekt endet
model_to_use = OLLAMA_MODEL if AI_PROVIDER == "ollama" else OPENAI_MODEL if AI_PROVIDER == "ollama":
url = OLLAMA_BASE_URL
if not url.endswith('/v1') and not url.endswith('/v1/'):
url = url.rstrip('/') + '/v1'
key = "ollama"
model_to_use = OLLAMA_MODEL
else:
url = None # Benutzt Standard OpenAI URL
key = OPENAI_API_KEY
model_to_use = OPENAI_MODEL
client = openai.OpenAI(base_url=url, api_key=key) client = openai.OpenAI(base_url=url, api_key=key)
response = client.chat.completions.create(model=model_to_use, messages=[{"role": "system", "content": system_prompt}] + chat_history) response = client.chat.completions.create(
model=model_to_use,
messages=messages
)
ai_msg = response.choices[0].message.content ai_msg = response.choices[0].message.content
elif AI_PROVIDER == "google": elif AI_PROVIDER == "google":
# Für Google Gemini
if not GOOGLE_API_KEY:
return "Fehler: GOOGLE_API_KEY fehlt in der .env Datei!"
client = genai.Client(api_key=GOOGLE_API_KEY) client = genai.Client(api_key=GOOGLE_API_KEY)
google_history = [types.Content(role="user" if m["role"] == "user" else "model", parts=[types.Part.from_text(text=msg["content"])]) for msg in chat_history[:-1]]
chat = client.chats.create(model=GOOGLE_MODEL, config=types.GenerateContentConfig(system_instruction=system_prompt), history=google_history) # Wir müssen unser Array in das spezielle Google-Format umwandeln
google_history = []
# Alle Nachrichten AUSSER der allerletzten (die aktuelle User-Frage) in die History packen
for msg in chat_history[:-1]:
role = "user" if msg["role"] == "user" else "model"
google_history.append(
types.Content(role=role, parts=[types.Part.from_text(text=msg["content"])])
)
# Chat MIT dem übersetzten Gedächtnis starten
chat = client.chats.create(
model=GOOGLE_MODEL,
config=types.GenerateContentConfig(system_instruction=system_prompt),
history=google_history
)
# Jetzt erst die neue Nachricht an den Chat mit Gedächtnis schicken
response = chat.send_message(user_input) response = chat.send_message(user_input)
ai_msg = response.text ai_msg = response.text
except Exception as e: except Exception as e:
ai_msg = f"KI Fehler: {e}" ai_msg = f"Fehler bei der KI-Anfrage: {e}"
print(f"KI Fehler: {e}")
# 3. Die Antwort der KI ebenfalls ins Gedächtnis aufnehmen
chat_history.append({"role": "assistant", "content": ai_msg}) chat_history.append({"role": "assistant", "content": ai_msg})
return ai_msg return ai_msg
# --- WebSocket Manager --- # --- WebSocket Manager ---
@@ -313,22 +360,43 @@ async def run_remote_task(ip, user, cmd):
# --- Settings API --- # --- Settings API ---
@app.get("/api/settings") @app.get("/api/settings")
async def get_settings(): async def get_settings():
return {"provider": AI_PROVIDER, "google_model": GOOGLE_MODEL, "openai_model": OPENAI_MODEL, "ollama_model": OLLAMA_MODEL, "ollama_base_url": OLLAMA_BASE_URL} return {
"provider": AI_PROVIDER,
"google_model": GOOGLE_MODEL,
"openai_model": OPENAI_MODEL,
"ollama_model": OLLAMA_MODEL,
"ollama_base_url": OLLAMA_BASE_URL # URL ans Frontend schicken
}
@app.post("/api/settings") @app.post("/api/settings")
async def update_settings(request: Request): async def update_settings(request: Request):
# WICHTIG: OLLAMA_BASE_URL als global deklarieren
global AI_PROVIDER, GOOGLE_MODEL, OPENAI_MODEL, OLLAMA_MODEL, OLLAMA_BASE_URL global AI_PROVIDER, GOOGLE_MODEL, OPENAI_MODEL, OLLAMA_MODEL, OLLAMA_BASE_URL
data = await request.json() data = await request.json()
provider = data.get("provider") provider = data.get("provider")
model = data.get("model")
ollama_url = data.get("ollama_base_url") # URL vom Frontend empfangen
if provider: if provider:
AI_PROVIDER = provider; set_key(ENV_FILE, "AI_PROVIDER", provider) AI_PROVIDER = provider
if data.get("model"): set_key(ENV_FILE, "AI_PROVIDER", provider)
m = data.get("model")
if provider == "google": GOOGLE_MODEL = m; set_key(ENV_FILE, "GOOGLE_MODEL", m) if provider == "google" and model:
if provider == "openai": OPENAI_MODEL = m; set_key(ENV_FILE, "OPENAI_MODEL", m) GOOGLE_MODEL = model
if provider == "ollama": OLLAMA_MODEL = m; set_key(ENV_FILE, "OLLAMA_MODEL", m) set_key(ENV_FILE, "GOOGLE_MODEL", model)
if data.get("ollama_base_url"): elif provider == "openai" and model:
u = data.get("ollama_base_url"); OLLAMA_BASE_URL = u; set_key(ENV_FILE, "OLLAMA_BASE_URL", u) OPENAI_MODEL = model
set_key(ENV_FILE, "OPENAI_MODEL", model)
elif provider == "ollama" and model:
OLLAMA_MODEL = model
set_key(ENV_FILE, "OLLAMA_MODEL", model)
# Wenn eine Ollama-URL mitgeschickt wurde, speichern wir sie
if ollama_url:
OLLAMA_BASE_URL = ollama_url
set_key(ENV_FILE, "OLLAMA_BASE_URL", ollama_url)
return {"status": "success"} return {"status": "success"}
@app.get("/api/models") @app.get("/api/models")
@@ -372,6 +440,21 @@ async def get_models(provider: str, url: str = None):
return {"models": models} return {"models": models}
except Exception as e:
print(f"Fehler beim Abrufen der Modelle für {provider}: {str(e)}")
return {"models": []} # Gibt eine leere Liste zurück -> Frontend nutzt Fallback
# Im neuen SDK (google-genai) heißt das Feld 'supported_actions'
for m in client.models.list():
if 'generateContent' in m.supported_actions:
# Wir nehmen den Namen und entfernen das 'models/' Präfix
model_name = m.name.replace("models/", "")
models.append(model_name)
models.sort()
return {"models": models}
except Exception as e: except Exception as e:
print(f"Fehler beim Abrufen der Modelle für {provider}: {str(e)}") print(f"Fehler beim Abrufen der Modelle für {provider}: {str(e)}")
return {"models": []} # Gibt eine leere Liste zurück -> Frontend nutzt Fallback return {"models": []} # Gibt eine leere Liste zurück -> Frontend nutzt Fallback