2025-05-07 17:20:34 -04:00
|
|
|
|
# ai.py
|
|
|
|
|
|
|
|
|
|
|
|
import requests
|
|
|
|
|
|
import os
|
|
|
|
|
|
from dotenv import load_dotenv
|
2025-05-07 18:40:28 -04:00
|
|
|
|
from personality import load_persona
|
2025-05-11 20:36:31 -04:00
|
|
|
|
from logger import setup_logger
|
|
|
|
|
|
logger = setup_logger("ai")
|
2025-05-07 17:20:34 -04:00
|
|
|
|
|
|
|
|
|
|
load_dotenv()
|
2025-05-11 00:48:31 -04:00
|
|
|
|
AI_URL = os.getenv("OLLAMA_API") # match .env and Docker ENV (e.g., http://localhost:11434/api/generate)
|
|
|
|
|
|
|
|
|
|
|
|
if not AI_URL:
|
2025-05-11 20:36:31 -04:00
|
|
|
|
raise ValueError("❌ OLLAMA_API environment variable is not set.")
|
|
|
|
|
|
logger.error("❌ OLLAMA_API environment variable is not set.")
|
2025-05-11 00:48:31 -04:00
|
|
|
|
|
2025-05-07 17:20:34 -04:00
|
|
|
|
|
2025-05-07 18:40:28 -04:00
|
|
|
|
def get_ai_response(user_prompt):
|
|
|
|
|
|
persona = load_persona()
|
2025-05-07 23:26:58 -04:00
|
|
|
|
|
2025-05-11 19:46:13 -04:00
|
|
|
|
if persona:
|
|
|
|
|
|
# Sanitize prompt injection
|
|
|
|
|
|
safe_inject = persona["prompt_inject"].replace("“", "\"").replace("”", "\"").replace("’", "'")
|
|
|
|
|
|
full_prompt = f"{safe_inject}\nUser: {user_prompt}\n{persona['name']}:"
|
|
|
|
|
|
else:
|
|
|
|
|
|
full_prompt = user_prompt # fallback mode: just send the user's prompt
|
2025-05-07 18:40:28 -04:00
|
|
|
|
|
2025-05-07 17:20:34 -04:00
|
|
|
|
payload = {
|
2025-05-07 23:26:58 -04:00
|
|
|
|
"model": "llama3:latest",
|
2025-05-07 18:40:28 -04:00
|
|
|
|
"prompt": full_prompt,
|
2025-05-07 17:20:34 -04:00
|
|
|
|
"stream": False
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-11 20:36:31 -04:00
|
|
|
|
#print("\n🛰️ SENDING TO OLLAMA /api/generate")
|
|
|
|
|
|
logger.info("🛰️ SENDING TO OLLAMA /api/generate")
|
|
|
|
|
|
#print("Payload:", payload)
|
|
|
|
|
|
logger.info(f"Payload: {payload}")
|
2025-05-07 23:26:58 -04:00
|
|
|
|
|
2025-05-07 17:20:34 -04:00
|
|
|
|
try:
|
|
|
|
|
|
response = requests.post(AI_URL, json=payload)
|
2025-05-11 20:36:31 -04:00
|
|
|
|
#print("📨 Raw response:", response.text)
|
|
|
|
|
|
logger.info(f"📨 Raw response: {response.text}")
|
2025-05-07 23:26:58 -04:00
|
|
|
|
|
2025-05-07 17:20:34 -04:00
|
|
|
|
if response.status_code == 200:
|
|
|
|
|
|
result = response.json()
|
2025-05-07 23:26:58 -04:00
|
|
|
|
return result.get("response", "[No message in response]")
|
2025-05-07 17:20:34 -04:00
|
|
|
|
else:
|
|
|
|
|
|
return f"[Error {response.status_code}] {response.text}"
|
|
|
|
|
|
except Exception as e:
|
2025-05-07 23:26:58 -04:00
|
|
|
|
return f"[Exception] {str(e)}"
|
2025-05-11 19:46:13 -04:00
|
|
|
|
|