joshuarauh's picture
Update app.py
ef21c2f verified
raw
history blame
5.02 kB
# app.py
import os
import gradio as gr
from anthropic import Anthropic
import wolframalpha
from datetime import datetime, timedelta
from collections import deque
# Initialize clients
anthropic = Anthropic(api_key=os.environ.get('ANTHROPIC_API_KEY'))
wolfram_client = wolframalpha.Client(os.environ.get('WOLFRAM_APPID'))
def verify_solution(problem, claimed_solution):
"""Verify a mathematical solution using Wolfram Alpha"""
try:
# Clean up the problem and solution for Wolfram Alpha
query = f"Solve {problem}"
result = wolfram_client.query(query)
# Extract the solution from Wolfram Alpha
wolfram_solution = next(result.results).text
# Compare solutions (needs sophisticated parsing based on your problem types)
solutions_match = compare_solutions(wolfram_solution, claimed_solution)
return {
'verified': solutions_match,
'wolfram_solution': wolfram_solution,
'match': solutions_match
}
except Exception as e:
return {
'verified': False,
'error': str(e),
'wolfram_solution': None
}
def compare_solutions(wolfram_sol, claude_sol):
"""Compare two solutions for mathematical equivalence"""
# This would need sophisticated parsing based on your problem types
# Basic example:
return abs(float(wolfram_sol) - float(claude_sol)) < 0.001
def generate_test(subject):
"""Generate and verify a math test"""
try:
# Generate the test using Claude
system_prompt = """Generate 3 university-level math questions with numerical solutions that can be verified.
For each question:
1. State the problem clearly
2. Provide your step-by-step solution
3. Give the final answer in a format that can be verified
Use simple $$ for all math expressions."""
message = anthropic.messages.create(
model="claude-3-opus-20240229",
max_tokens=1500,
temperature=0.7,
messages=[{
"role": "user",
"content": f"{system_prompt}\n\nWrite an exam for {subject}."
}]
)
# Extract questions and solutions
content = message.content[0].text
# Add verification results
verification_results = []
# For each question/solution pair (you'll need to parse the content)
# Example structure:
verification_note = "\n\n## Solution Verification:\n"
for i, (problem, solution) in enumerate(parse_questions(content)):
result = verify_solution(problem, solution)
verification_note += f"\nQuestion {i+1}:\n"
if result['verified']:
verification_note += "✅ Solution verified by Wolfram Alpha\n"
else:
verification_note += "⚠️ Solution needs verification\n"
if result['wolfram_solution']:
verification_note += f"Wolfram Alpha got: {result['wolfram_solution']}\n"
# Add usage statistics
usage_stats = f"""
\n---\nUsage Statistics:
• Input Tokens: {message.usage.input_tokens:,}
• Output Tokens: {message.usage.output_tokens:,}
• Wolfram Alpha calls: {len(verification_results)}
Cost Breakdown:
• Claude Cost: ${((message.usage.input_tokens / 1000) * 0.015) + ((message.usage.output_tokens / 1000) * 0.075):.4f}
• Wolfram API calls: {len(verification_results)}
"""
return content + verification_note + usage_stats
except Exception as e:
return f"Error: {str(e)}"
# Update requirements.txt to include:
# wolframalpha==5.0.0
# Update environment variables to include WOLFRAM_APPID
# Rest of your Gradio interface code remains the same...
# Subject choices
subjects = [
"Single Variable Calculus",
"Multivariable Calculus",
"Linear Algebra",
"Differential Equations",
"Real Analysis",
"Complex Analysis",
"Abstract Algebra",
"Probability Theory",
"Numerical Analysis",
"Topology"
]
# Create Gradio interface
interface = gr.Interface(
fn=generate_test,
inputs=gr.Dropdown(
choices=subjects,
label="Select Mathematics Subject",
info="Choose a subject for the exam questions"
),
outputs=gr.Markdown(
label="Generated Test",
latex_delimiters=[
{"left": "$$", "right": "$$", "display": True},
{"left": "$", "right": "$", "display": False}
]
),
title="Advanced Mathematics Test Generator",
description="""Generates university-level mathematics exam questions with solutions using Claude 3 Opus.
Limited to 25 requests per day. Please use responsibly.""",
theme="default",
allow_flagging="never"
)
# Launch the interface
if __name__ == "__main__":
interface.launch()