Spaces:
Running
Running
import gradio as gr | |
import base64 | |
import io | |
import requests | |
def solve_stem_problem(api_key, image, subject): | |
if not api_key.strip(): | |
return "β Error: API key is required." | |
detectives = { | |
"math": "Algebra Ace", | |
"physics": "Physics Phantom", | |
"chemistry": "Chemistry Clue-finder", | |
"coding": "Code Cracker" | |
} | |
detective = detectives.get(subject, "Algebra Ace") | |
try: | |
# Convert image to base64 string | |
buffered = io.BytesIO() | |
image.save(buffered, format="PNG") | |
encoded_image = base64.b64encode(buffered.getvalue()).decode('utf-8') | |
image_url_data = f"data:image/png;base64,{encoded_image}" | |
except Exception as e: | |
return f"β Error encoding image: {str(e)}" | |
try: | |
headers = { | |
"Authorization": f"Bearer {api_key}", | |
"Content-Type": "application/json", | |
"HTTP-Referer": "https://stem-sleuth.example.com", | |
"X-Title": "STEM Sleuth" | |
} | |
payload = { | |
"model": "google/gemini-2.0-flash-exp:free", | |
"messages": [ | |
{ | |
"role": "user", | |
"content": [ | |
{ | |
"type": "text", | |
"text": f"Act as {detective} and solve this {subject} problem step-by-step with a detective narrative." | |
}, | |
{ | |
"type": "image_url", | |
"image_url": { | |
"url": image_url_data | |
} | |
} | |
] | |
} | |
] | |
} | |
response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=payload) | |
if response.status_code != 200: | |
return f"β API Error {response.status_code}: {response.text}" | |
completion = response.json() | |
message = completion.get("choices", [{}])[0].get("message", {}).get("content") | |
if not message: | |
return "β οΈ No response content received. Try another image or check the model output." | |
return message | |
except Exception as e: | |
return f"β API call failed: {str(e)}" | |
# Launch Gradio Interface | |
iface = gr.Interface( | |
fn=solve_stem_problem, | |
inputs=[ | |
gr.Textbox(label="π OpenRouter API Key", type="password"), | |
gr.Image(label="πΌοΈ Upload STEM Problem Image", type="pil"), | |
gr.Dropdown(["math", "physics", "chemistry", "coding"], label="π Select Subject") | |
], | |
outputs=gr.Textbox(label="π΅οΈββοΈ Detective's Solution"), | |
title="π§ STEM Sleuth Solver", | |
description="Upload a math, physics, chemistry, or coding problem image and solve it with a detective twist using OpenRouter Gemini model." | |
) | |
iface.launch() |