from huggingface_hub import InferenceClient import os import requests import json LLAMA_MODEL = "meta-llama/Llama-3.2-3B-Instruct" # Default model USE_LOCAL_OLLAMA = False # Set to True if using local Ollama def query_model(prompt): """ Query the Llama model with the given prompt Supports both Hugging Face Inference API and local Ollama """ try: if USE_LOCAL_OLLAMA: return query_ollama(prompt) else: return query_huggingface(prompt) except Exception as e: return f"Error generating workout plan: {str(e)}" def query_huggingface(prompt): """ Query Llama via Hugging Face Inference API """ HF_TOKEN = os.getenv("HF_TOKEN") if not HF_TOKEN: return "Error: HF_TOKEN not found. Please set your Hugging Face token in environment variables." # Initialize the client with Llama model client = InferenceClient( model=LLAMA_MODEL, token=HF_TOKEN ) # Enhanced system prompt for better responses system_prompt = """You are a certified professional fitness trainer with expertise in creating personalized workout plans. Always provide complete, detailed workout plans with: - Clear day-by-day structure - Specific exercises with sets, reps, and rest periods - Warm-up and cool-down recommendations - Safety considerations based on user's profile When asked for a 5-day plan, ensure ALL 5 days are included with clear day headers.""" # Make the API call response = client.chat_completion( messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt} ], max_tokens=3000, temperature=0.7, top_p=0.95 ) # Extract and return the response workout_plan = response.choices[0].message.content # Verify if the response contains all 5 days days_found = sum([f"Day {i}" in workout_plan for i in range(1, 6)]) if days_found < 5: # If incomplete, try one more time with more explicit instruction retry_prompt = prompt + "\n\nIMPORTANT: The previous response was incomplete. Please ensure ALL 5 days (Day 1 through Day 5) are included in the plan. Each day should be clearly marked with 'Day X' header and include 4-6 exercises." retry_response = client.chat_completion( messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": retry_prompt} ], max_tokens=3000, temperature=0.7 ) workout_plan = retry_response.choices[0].message.content return workout_plan def query_ollama(prompt): """ Query Llama via local Ollama (completely free, no API key needed) """ try: response = requests.post( "http://localhost:11434/api/generate", json={ "model": "llama3.2:3b", # or "llama3.2:1b" for lighter model "prompt": f"""You are a certified professional fitness trainer. Create a comprehensive 5-day workout plan. {prompt} Provide a complete, detailed 5-day workout plan with clear day headers, exercises, sets, reps, and rest periods.""", "stream": False, "max_tokens": 3000, "temperature": 0.7 } ) if response.status_code == 200: return response.json()["response"] else: return f"Error: Ollama returned status code {response.status_code}" except requests.exceptions.ConnectionError: return "Error: Cannot connect to Ollama. Make sure Ollama is running locally (run 'ollama serve' in terminal)" except Exception as e: return f"Error with Ollama: {str(e)}" def test_api_connection(): """ Test function to verify API connection """ try: if USE_LOCAL_OLLAMA: # Test Ollama connection response = requests.post( "http://localhost:11434/api/generate", json={ "model": "llama3.2:3b", "prompt": "Say 'API connection successful' if you can read this.", "stream": False, "max_tokens": 50 } ) if response.status_code == 200: return True, "Ollama connection successful" else: return False, f"Ollama connection failed: {response.status_code}" else: # Test Hugging Face connection HF_TOKEN = os.getenv("HF_TOKEN") if not HF_TOKEN: return False, "HF_TOKEN not found" client = InferenceClient( model=LLAMA_MODEL, token=HF_TOKEN ) response = client.chat_completion( messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Say 'API connection successful' if you can read this."} ], max_tokens=50, temperature=0.1 ) return True, f"API connection successful (using {LLAMA_MODEL})" except Exception as e: return False, f"API connection failed: {str(e)}" def switch_model(model_name): """ Switch to a different Llama model """ global LLAMA_MODEL LLAMA_MODEL = model_name return f"Switched to {model_name}" def set_ollama_mode(use_ollama): """ Switch between Hugging Face API and local Ollama """ global USE_LOCAL_OLLAMA USE_LOCAL_OLLAMA = use_ollama mode = "local Ollama" if use_ollama else "Hugging Face API" return f"Switched to {mode} mode"