from groq import Groq import groq import os import re # Tried in this order; each model has its own free daily limit MODELS = [ "openai/gpt-oss-20b", "openai/gpt-oss-120b", "qwen/qwen3.8-27b", ] FALLBACK_ANSWER = "Hmm, daar moet ik even over nadenken..." class GroqAgent: def __init__(self, system_content): self.client = Groq(api_key=os.environ.get("GROQ_API_KEY")) self.system_content = system_content def request_llm_response(self, message_content): messages = [ {"role": "system", "content": self.system_content}, {"role": "user", "content": message_content}, ] for model in MODELS: try: kwargs = { "model": model, "messages": messages, "max_completion_tokens": 400, } if model.startswith("openai/"): kwargs["reasoning_effort"] = "low" chat_completion = self.client.chat.completions.create(**kwargs) message = chat_completion.choices[0].message.content or "" # Qwen can include its thinking in tags; strip it message = re.sub(r".*?", "", message, flags=re.DOTALL).strip() if message: return message print(f"[agent] {model} returned an empty answer, trying next model") except groq.RateLimitError: print(f"[agent] {model} hit its rate limit, trying next model") except groq.APIError as e: print(f"[agent] {model} failed: {e}") return FALLBACK_ANSWER