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()