/ ai_local.py
ai_local.py
1 #!/usr/bin/env python3 2 """ 3 LOCAL-FIRST AI ASSISTANT 4 Uses your local models first, falls back to Groq 5 """ 6 import json, urllib.request, sys, subprocess, os 7 8 # Configuration 9 LOCAL_MODELS = [ 10 "mistral:latest", # 4.4 GB - Balanced 11 "dolphin-mistral:latest", # 4.1 GB - Uncensored 12 "tinyllama:latest", # 637 MB - Fast 13 "phi3:mini", # 2.2 GB - Capable 14 ] 15 16 def ask_local(prompt, model="mistral:latest"): 17 """Use your local Ollama models""" 18 try: 19 data = json.dumps({ 20 "model": model, 21 "prompt": prompt, 22 "stream": False, 23 "options": {"temperature": 0.7} 24 }).encode() 25 26 req = urllib.request.Request( 27 "http://localhost:11434/api/generate", 28 data=data, 29 headers={'Content-Type': 'application/json'} 30 ) 31 32 with urllib.request.urlopen(req, timeout=30) as r: 33 result = json.loads(r.read().decode()) 34 return f"[LOCAL: {model}] {result.get('response', 'No response')}" 35 except Exception as e: 36 return f"[LOCAL ERROR: {str(e)[:50]}]" 37 38 def ask_groq(prompt): 39 """Fallback to Groq API""" 40 try: 41 data = json.dumps({ 42 "model": "llama-3.3-70b-versatile", 43 "messages": [{"role": "user", "content": prompt}], 44 "max_tokens": 1000 45 }).encode() 46 47 req = urllib.request.Request( 48 "https://api.groq.com/openai/v1/chat/completions", 49 data=data, 50 headers={ 51 'Authorization': 'Bearer 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', 52 'Content-Type': 'application/json' 53 } 54 ) 55 56 with urllib.request.urlopen(req, timeout=20) as r: 57 result = json.loads(r.read().decode()) 58 return f"[GROQ] {result['choices'][0]['message']['content']}" 59 except Exception as e: 60 return f"[GROQ ERROR: {e}]" 61 62 def main(): 63 if len(sys.argv) > 1: 64 prompt = " ".join(sys.argv[1:]) 65 else: 66 prompt = input("Ask: ") 67 68 print("\n" + "="*70) 69 print("š¤ LOCAL-FIRST AI ASSISTANT") 70 print("="*70) 71 72 # Try local models first 73 print("\nš Trying local models (100% free/unrestricted)...") 74 for model in LOCAL_MODELS[:2]: # Try first 2 75 print(f" Testing {model}...") 76 response = ask_local(prompt, model) 77 if "ERROR" not in response: 78 print(f"ā Success with {model}") 79 print("\n" + "-"*70) 80 print(response) 81 print("-"*70 + "\n") 82 return 83 84 # Fallback to Groq 85 print("ā ļø Local models unavailable, using Groq API...") 86 response = ask_groq(prompt) 87 print("\n" + "-"*70) 88 print(response) 89 print("-"*70) 90 print("\nš” Tip: Ensure Ollama is running: 'ollama serve'") 91 92 if __name__ == "__main__": 93 main()