Spaces:
Sleeping
Sleeping
| import os | |
| import re | |
| import requests | |
| # No need for streamlit import | |
| # No need for dotenv as secrets are loaded directly by Hugging Face Spaces environment | |
| # from dotenv import load_dotenv | |
| # load_dotenv() # Removed for deployment on Hugging Face Spaces | |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") # Access API key from environment variables | |
| # Ensure the API key is available. If not, provide a clear message. | |
| if not GROQ_API_KEY: | |
| print("Error: GROQ_API_KEY environment variable not set.") | |
| # In a real app, you might want to raise an exception or handle this more robustly. | |
| # For now, functions will return an error message if the key is missing. | |
| GROQ_URL = "https://api.groq.com/openai/v1/chat/completions" | |
| MODEL = "llama3-8b-8192" # Ensure this model is available and correctly spelled | |
| HEADERS = { | |
| "Authorization": f"Bearer {GROQ_API_KEY}", | |
| "Content-Type": "application/json" | |
| } | |
| def call_groq(prompt, system="You are a helpful and concise AI tutor."): | |
| """ | |
| Makes a call to the Groq API with the given prompt and system message. | |
| Handles API key availability and potential request errors. | |
| """ | |
| if not GROQ_API_KEY: | |
| return "⚠️ API Key not configured. Please set GROQ_API_KEY in Hugging Face Space secrets." | |
| payload = { | |
| "model": MODEL, | |
| "messages": [ | |
| {"role": "system", "content": system}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| "temperature": 0.7 | |
| } | |
| try: | |
| res = requests.post(GROQ_URL, headers=HEADERS, json=payload) | |
| res.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) | |
| return res.json()["choices"][0]["message"]["content"] | |
| except requests.exceptions.HTTPError as http_err: | |
| print(f"Groq API HTTP error: {http_err} - {res.text}") | |
| return f"⚠️ Groq API HTTP error: {http_err}. Details: {res.text}" | |
| except requests.exceptions.ConnectionError as conn_err: | |
| print(f"Groq API connection error: {conn_err}") | |
| return "⚠️ Connection error to Groq API. Check network or API endpoint." | |
| except requests.exceptions.Timeout as timeout_err: | |
| print(f"Groq API timeout error: {timeout_err}") | |
| return "⚠️ Groq API request timed out." | |
| except requests.exceptions.RequestException as req_err: | |
| print(f"Groq API request error: {req_err}") | |
| return "⚠️ An unexpected error occurred with the Groq API request." | |
| except Exception as e: | |
| print(f"An unexpected error occurred: {e}") | |
| return f"⚠️ An unexpected error occurred: {e}" | |
| # Removed @st.cache_data decorator | |
| def mentor_chat_response(query): | |
| """ | |
| Generates a mentor-style response for a given query using Groq. | |
| """ | |
| prompt = f"Explain this concept clearly in simple terms:\n\n{query}" | |
| return call_groq(prompt) | |
| # Removed @st.cache_data decorator | |
| def generate_flashcards(text): | |
| """ | |
| Generates 5 flashcards (Q&A pairs) based on the provided text content using Groq. | |
| Truncates text if it's too long. | |
| """ | |
| if len(text) > 2000: | |
| text = text[:2000] # Truncate text if it's too long for the prompt | |
| prompt = f"""Create 5 flashcards based on this content:\n\n{text}\n\nFormat:\nQ: ...\nA: ...""" | |
| raw = call_groq(prompt) | |
| print("🧠 RAW FLASHCARD RESPONSE:\n", raw) # For debugging | |
| cards = [] | |
| # Split by "Q:" to get individual flashcard blocks. [1:] to skip empty string before first Q. | |
| blocks = re.split(r"Q:\s*", raw)[1:] | |
| for block in blocks: | |
| # Split each block by "A:" to separate question and answer | |
| parts = block.strip().split("A:") | |
| if len(parts) == 2: | |
| q = parts[0].strip() | |
| # Take only the first line of the answer, assuming A: ends the answer section | |
| a = parts[1].strip().split("\n")[0] | |
| cards.append({"question": q, "answer": a}) | |
| return cards |