QMetaRam / backend /qkernel /executors /chat_executor.py
metarm's picture
Upload folder using huggingface_hub (part 4)
945aae0 verified
Raw History Blame Contribute Delete
2.42 kB
import os
import logging
from ..core import BaseService
logger = logging.getLogger("qkernel.executors.chat")
SYSTEM_PROMPT = """You are Q, an intelligent AI assistant.
CRITICAL RULES:
1. Answer directly and concisely
2. Never explain your reasoning process
3. Never mention internal systems, analysis, or "perspectives"
4. Keep responses short (2-4 sentences) unless the user asks for depth
5. Answer in the user's language
6. Be helpful and friendly, but do NOT be verbose"""
SYSTEM_PROMPT_FAST = """You are Q, a fast AI assistant.
Answer in 1-2 sentences maximum. Be direct and concise."""
class ChatExecutor(BaseService):
name: str = "chat"
def __init__(self) -> None:
self.api_key = os.getenv("OPENAI_API_KEY", "")
self._provider: str = os.getenv("CHAT_PROVIDER", "openai")
async def process(self, event: dict) -> dict:
message = event.get("message", "")
context = event.get("context", []) or []
model_type = event.get("model", "deep")
if not message.strip():
return {"response": ""}
if not self.api_key:
return {"response": "", "model": "none", "error": "missing_api_key"}
try:
import openai
client = openai.OpenAI(api_key=self.api_key)
messages = [
{
"role": "system",
"content": SYSTEM_PROMPT_FAST
if model_type == "fast"
else SYSTEM_PROMPT,
}
]
for ctx in context[-10:]:
role = "user" if ctx.get("role") == "user" else "assistant"
messages.append({"role": role, "content": ctx.get("content", "")})
messages.append({"role": "user", "content": message})
response = client.chat.completions.create(
model=os.getenv("CHAT_MODEL", "gpt-4o-mini"),
messages=messages,
temperature=0.7,
max_tokens=60 if model_type == "fast" else 300,
)
return {
"response": response.choices[0].message.content,
"model": model_type,
"tokens": response.usage.total_tokens if response.usage else 0,
}
except Exception as e:
logger.error("ChatExecutor error: %s", e)
return {"response": "", "model": "none", "error": str(e)}