Madhu Chitikela
Initial commit: AI Code Debugger with multi-provider fallback and professional UI
fc63ff9
Raw
History Blame Contribute Delete
4.67 kB
import os
import time
from dotenv import load_dotenv
from langchain_groq import ChatGroq
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.schema import HumanMessage, SystemMessage
from database import init_db, save_log
load_dotenv()
init_db()
# ── ALL Models ───────────────────────────────────────────────────
ALL_MODELS = [
{"provider": "groq", "model": "gemma2-9b-it"},
{"provider": "groq", "model": "llama-3.1-8b-instant"},
{"provider": "groq", "model": "mixtral-8x7b-32768"},
{"provider": "groq", "model": "llama3-8b-8192"},
{"provider": "groq", "model": "llama-3.3-70b-versatile"},
{"provider": "gemini", "model": "gemini-2.0-flash"},
{"provider": "gemini", "model": "gemini-1.5-flash"},
]
def get_working_llm():
for entry in ALL_MODELS:
provider = entry["provider"]
model = entry["model"]
try:
print(f"πŸ”„ Trying [{provider}] {model}...")
if provider == "groq":
llm = ChatGroq(
model=model,
groq_api_key=os.getenv("GROQ_API_KEY"),
temperature=0
)
else:
llm = ChatGoogleGenerativeAI(
model=model,
google_api_key=os.getenv("GEMINI_API_KEY"),
temperature=0
)
# Quick test
llm.invoke("Say OK")
print(f"βœ… Working: [{provider}] {model}")
return llm, provider, model
except Exception as e:
err = str(e)
if any(x in err for x in ["429", "rate_limit", "quota", "decommission"]):
print(f"⚠️ [{provider}] {model} rate limited, trying next...")
time.sleep(0.3)
continue
else:
print(f"❌ [{provider}] {model} error: {err[:80]}")
continue
return None, None, None
def debug_code(broken_code: str, error_message: str, language: str = "Python"):
"""
Direct LLM call β€” no agent, no tools, no iteration limit.
Fast, reliable, works on ALL free models.
"""
start = time.time()
# Get working model
llm, provider, model_name = get_working_llm()
if llm is None:
return (
"⏳ All models rate limited.\n\nWait 10-60 mins and try again.",
"_All providers exhausted._"
)
# Build messages
system_msg = SystemMessage(content="""You are an expert Python debugging assistant.
When given broken code and an error message:
1. Identify exactly what is wrong
2. Fix the code
3. Explain the fix clearly
Always respond in this format:
FIXED CODE:
```python
[the complete fixed code here]
```
EXPLANATION:
[clear explanation of what was wrong and how you fixed it]""")
user_msg = HumanMessage(content=f"""Please fix this broken {language} code.
BROKEN CODE:
```{language.lower()}
{broken_code}
```
ERROR MESSAGE:
{error_message}
Give me the fixed code and explain what was wrong.""")
# Thinking log
thinking = f"""### 🧠 Agent Thinking Process
**Step 1 β€” πŸ” Model Selected**
- Provider: `{provider}`
- Model: `{model_name}`
**Step 2 β€” πŸ“‹ Analyzing Error**
- Error: `{error_message}`
- Language: `{language}`
**Step 3 β€” πŸ”§ Generating Fix**
- Sending to LLM for direct analysis...
**Step 4 β€” βœ… Response Received**
- Fix generated successfully!
"""
try:
print(f"πŸ”§ Debugging with [{provider}] {model_name}...")
response = llm.invoke([system_msg, user_msg])
fixed_code = response.content
time_taken = time.time() - start
print(f"βœ… Fixed in {round(time_taken, 2)}s")
save_log(
broken_code=broken_code,
error_msg=error_message,
fixed_code=fixed_code,
status="success",
time_taken=round(time_taken, 2)
)
return fixed_code, thinking
except Exception as e:
time_taken = time.time() - start
err_msg = str(e)
save_log(
broken_code=broken_code,
error_msg=error_message,
fixed_code=None,
status="failed",
time_taken=round(time_taken, 2)
)
if "429" in err_msg or "rate_limit" in err_msg or "quota" in err_msg:
return (
"⏳ Rate limit reached.\nWait 10-60 minutes and try again.",
"_Rate limit hit during generation._"
)
return f"❌ Error:\n{err_msg}", thinking