import gradio as gr import os import re from openai import OpenAI import time # Function to generate math solution using the Phi-4-reasoning-plus model def generate_math_solution(api_key, problem_text, history=None): if not api_key.strip(): return "Please enter your OpenRouter API key.", history if not problem_text.strip(): return "Please enter a math problem.", history try: client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=api_key, ) messages = [ {"role": "system", "content": """You are an expert math tutor who explains concepts clearly and thoroughly. Analyze the given math problem and provide a detailed step-by-step solution. For each step: 1. Show the mathematical operation 2. Explain why this step is necessary 3. Connect it to relevant mathematical concepts Format your response with clear section headers using markdown. Begin with an "Initial Analysis" section, follow with numbered steps, and conclude with a "Final Answer" section."""}, ] # Add conversation history if it exists if history: for exchange in history: messages.append({"role": "user", "content": exchange[0]}) if exchange[1]: # Check if there's a response messages.append({"role": "assistant", "content": exchange[1]}) # Add the current problem messages.append({"role": "user", "content": f"Solve this math problem step-by-step: {problem_text}"}) # Create the completion completion = client.chat.completions.create( model="microsoft/phi-4-reasoning-plus:free", messages=messages, extra_headers={ "HTTP-Referer": "https://advancedmathtutor.edu", "X-Title": "Advanced Math Tutor", } ) solution = completion.choices[0].message.content # Update history if history is None: history = [] history.append((problem_text, solution)) return solution, history except Exception as e: error_message = f"Error: {str(e)}" return error_message, history # Function to verify API key format def validate_api_key(api_key): # This is a simple check - OpenRouter keys typically start with "sk-or-" if api_key.startswith("sk-or-") and len(api_key) > 20: return True return False # Function to process LaTeX in the solution def process_solution(solution): # Replace $...$ with $$...$$ for better rendering in Gradio markdown solution = re.sub(r'(?