| """ |
| Calls the Groq API to generate a response. |
| Model: llama-3.3-70b-versatile (or configured in GROQ_MODEL_ID) |
| |
| Setup: |
| - Ensure GROQ_API_KEY is set in your .env file |
| """ |
|
|
| import os |
| from dotenv import load_dotenv |
| from groq import Groq |
|
|
| load_dotenv() |
|
|
| from src.config import GROQ_API_KEY, GROQ_MODEL_ID |
|
|
| _client = None |
|
|
|
|
| def get_groq_client(): |
| global _client |
| if _client is not None: |
| return _client |
|
|
| key = os.getenv("GROQ_API_KEY") or GROQ_API_KEY |
| if not key or key == "gsk_your_key_here": |
| return None |
|
|
| try: |
| _client = Groq(api_key=key) |
| return _client |
| except Exception: |
| return None |
|
|
|
|
| def generate_response(prompt: str) -> str: |
| """ |
| Send a prompt to the Groq API and return the generated text. |
| |
| Args: |
| prompt: The full prompt string (with RAG context injected). |
| |
| Returns: |
| The LLM's response as a string. |
| """ |
| client = get_groq_client() |
| if not client: |
| return ( |
| "ERROR: GROQ_API_KEY is not configured or is using placeholder/invalid credentials. " |
| "Please configure GROQ_API_KEY in your .env file or Hugging Face Space Repository Secrets. " |
| "Get your key at: https://console.groq.com/" |
| ) |
|
|
| try: |
| response = client.chat.completions.create( |
| messages=[{"role": "user", "content": prompt}], |
| model=GROQ_MODEL_ID, |
| max_tokens=512, |
| temperature=0.2, |
| top_p=0.9 |
| ) |
| |
| return response.choices[0].message.content.strip() |
|
|
| except Exception as e: |
| return f"ERROR: Groq API connection failed — {str(e)}" |
|
|
|
|
| def classify(prompt: str) -> str: |
| """ |
| Lightweight classification call: short output, deterministic sampling. |
| |
| Used by the query_classifier node to label a query as FACTUAL / WORKFLOW / CHAT. |
| Returns the raw LLM output (caller is responsible for parsing). |
| """ |
| client = get_groq_client() |
| if not client: |
| return "FACTUAL" |
|
|
| try: |
| response = client.chat.completions.create( |
| messages=[{"role": "user", "content": prompt}], |
| model=GROQ_MODEL_ID, |
| max_tokens=8, |
| temperature=0.0, |
| top_p=1.0, |
| ) |
| return response.choices[0].message.content.strip() |
| except Exception: |
| return "FACTUAL" |
|
|
|
|
| if __name__ == "__main__": |
| test_prompt = "What is a Purchase Order in SAP procurement? Answer in 2 sentences." |
| print("Testing Groq API connection...") |
| print(f"Model : {GROQ_MODEL_ID}") |
| print(f"API Key : {GROQ_API_KEY[:10] if GROQ_API_KEY else 'NONE'}...{'*' * 20 if GROQ_API_KEY else 'MISSING'}\n") |
| print(generate_response(test_prompt)) |
|
|
|
|
|
|