/ 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()