matthewspring's picture
Upload folder using huggingface_hub
785a1a6 verified
import gradio as gr
from daggr import FnNode, InferenceNode, Graph
import random
# Generate math problems with increasing difficulty
def generate_math_problem(level):
if level <= 3:
# Addition problems
a = random.randint(1, 10 * level)
b = random.randint(1, 10 * level)
return f"{a} + {b} = ?", a + b
elif level <= 6:
# Subtraction problems
a = random.randint(10, 20 * level)
b = random.randint(1, a)
return f"{a} - {b} = ?", a - b
elif level <= 9:
# Multiplication problems
a = random.randint(1, 5 * level)
b = random.randint(1, 5)
return f"{a} × {b} = ?", a * b
else:
# Division problems
b = random.randint(1, 5)
a = b * random.randint(1, 10 * level)
return f"{a} ÷ {b} = ?", a // b
# Node to generate new math problems
problem_generator = FnNode(
fn=lambda level: generate_math_problem(level),
inputs={"level": gr.Number(label="Current Level", value=1)},
outputs={
"problem": gr.Textbox(label="Math Problem"),
"correct_answer": gr.Number(label="Correct Answer", visible=False)
}
)
# Node for user to input their answer
user_input = FnNode(
fn=lambda problem: problem,
inputs={"problem": gr.Textbox(visible=False)},
outputs={"problem_display": gr.Textbox(label="Your Problem")}
)
# Node for AI to solve the problem
ai_solver = InferenceNode(
model="meta-llama/Llama-3.1-8B-Instruct",
inputs={
"prompt": gr.Textbox(visible=False),
"problem": gr.Textbox(visible=False)
},
postprocess=lambda original, inputs: {
"ai_response": original[0]["generated_text"].split("=")[-1].strip()
},
outputs={"ai_response": gr.Textbox(label="AI's Answer", visible=False)},
system_prompt="Solve this math problem. Provide ONLY the numerical answer with no explanation or formatting. Problem: {problem}"
)
# Node to check answers and update game state
def check_answers(user_answer, ai_response, correct_answer, level, user_score, ai_score):
try:
user_correct = int(user_answer) == correct_answer
except:
user_correct = False
try:
ai_correct = int(ai_response) == correct_answer
except:
ai_correct = False
# Update scores
user_score += 1 if user_correct else 0
ai_score += 1 if ai_correct else 0
# Increase difficulty if both got it right
level += 1 if user_correct and ai_correct else 0
# Prepare feedback message
feedback = f"**Level {level} Results:**\n\n"
feedback += f"✅ Your answer ({user_answer}) was {'correct!' if user_correct else 'wrong.'}\n"
feedback += f"🤖 AI's answer ({ai_response}) was {'correct!' if ai_correct else 'wrong.'}\n\n"
feedback += f"Score: You {user_score} - {ai_score} AI\n"
if level > 10:
feedback += "\n🎉 Congratulations! You've completed all levels!"
level = 1 # Reset game
return {
"feedback": feedback,
"new_level": level,
"new_user_score": user_score,
"new_ai_score": ai_score
}
answer_checker = FnNode(
fn=check_answers,
inputs={
"user_answer": gr.Textbox(label="Your Answer"),
"ai_response": gr.Textbox(visible=False),
"correct_answer": gr.Number(visible=False),
"level": gr.Number(visible=False),
"user_score": gr.Number(visible=False, value=0),
"ai_score": gr.Number(visible=False, value=0)
},
outputs={
"feedback": gr.Markdown(),
"new_level": gr.Number(visible=False),
"new_user_score": gr.Number(visible=False),
"new_ai_score": gr.Number(visible=False)
}
)
# Create the game workflow
graph = Graph(
name="Math Challenge: Human vs AI",
nodes=[problem_generator, user_input, ai_solver, answer_checker],
connections=[
(problem_generator.outputs["problem"], user_input.inputs["problem"]),
(problem_generator.outputs["problem"], ai_solver.inputs["problem"]),
(problem_generator.outputs["correct_answer"], answer_checker.inputs["correct_answer"]),
(problem_generator.outputs["level"], answer_checker.inputs["level"]),
(user_input.outputs["problem_display"], None), # Display to user
(ai_solver.outputs["ai_response"], answer_checker.inputs["ai_response"]),
(answer_checker.outputs["feedback"], None), # Display feedback
(answer_checker.outputs["new_level"], problem_generator.inputs["level"])
],
inputs=[problem_generator.inputs["level"]],
outputs=[user_input.outputs["problem_display"],
answer_checker.outputs["feedback"]]
)
# Launch the game
graph.launch()