File size: 6,145 Bytes
586cb9f
adce40c
5917716
e8c8729
586cb9f
542b56f
5f5fe6e
5917716
 
 
 
 
 
e8c8729
5917716
 
 
 
 
e8c8729
 
 
 
 
 
 
 
5f5fe6e
8cf882d
528bf4b
e8c8729
 
 
 
c4f2069
e8c8729
5917716
c4f2069
e8c8729
5917716
 
c4f2069
5917716
c4f2069
 
adce40c
e8c8729
 
 
 
 
 
 
 
5245a46
3b61042
2a8e918
e8c8729
e28804a
e8c8729
 
 
 
 
 
 
 
 
 
 
 
c4f2069
3d5c37c
e8c8729
 
 
 
 
 
c4f2069
6587c5c
5245a46
e8c8729
c4f2069
 
542b56f
e28804a
6587c5c
e8c8729
5245a46
e8c8729
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e28804a
586cb9f
a2aeb87
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import gradio as gr
import random
import time
import threading

# ---------------- Dictionary y'ibibazo n'ibisubizo ----------------
ibisubizo_dict = {
    "Icyapa cya STOP gisobanura iki?": (
        "Ugomba guhagarara neza mbere yo gukomeza, urebe ko umuhanda utekanye.",
        "Icyapa cya STOP gituma umugenzi amenya guhagarara ngo hamenyekane umutekano w'umuhanda."
    ),
    "Umuvuduko ntarengwa mu mujyi ni uwuhe?": (
        "Ni 40 km/h mu mijyi.",
        "Umuvuduko ntarengwa ugamije kugabanya impanuka mu mijyi, cyane cyane hafi y'ahantu hateraniye abantu."
    ),
    "Icyapa cya Attention École gisobanura iki?": (
        "Kigaragaza ko hafi yaho hari ishuri, ugomba kugabanya umuvuduko no kwitonda.",
        "Iki cyapa cyerekana ahari ishuri cyangwa abana bari hafi y'umuhanda."
    ),
    "Iyo umwana ari ku muhanda, ukora iki?": (
        "Ugabanya umuvuduko kandi ube maso cyane.",
        "Umwana ashobora guhita yinjira mu muhanda nta kwitegereza, ugomba kwitonda cyane."
    ),
    "Iyo ugiye guca ku bandi, ukora iki?": (
        "Ureba neza niba umuhanda ubibemerera kandi nta modoka iza imbere.",
        "Kureba mbere yo guca ku bandi birinda impanuka."
    ),
}

# ---------------- Functions ----------------
def gusubiza(ikibazo):
    ans, expl = ibisubizo_dict.get(ikibazo, ("Nta bisubizo bihari kuri icyo kibazo.", "Nta explanation."))
    return ans + "\n\n💡 Explanation: " + expl

def gutegura_quiz(batch_size=5):
    quiz = random.sample(list(ibisubizo_dict.items()), min(batch_size, len(ibisubizo_dict)))
    quiz_questions = []
    quiz_choices = []
    for q, (ans, _) in quiz:
        other_answers = list(set(a for a, _ in ibisubizo_dict.values()) - {ans})
        choices = random.sample(other_answers, min(2, len(other_answers))) + [ans]
        random.shuffle(choices)
        quiz_questions.append(q)
        quiz_choices.append(choices)
    return quiz_questions, quiz_choices

# ---------------- Timer Function ----------------
def start_timer(timer_box, duration=20):
    def countdown():
        for i in range(duration, -1, -1):
            timer_box.update(value=f"⏱️ {i} seconds left", visible=True)
            time.sleep(1)
    thread = threading.Thread(target=countdown, daemon=True)
    thread.start()

# ---------------- Gradio Interface ----------------
with gr.Blocks(theme=gr.themes.Soft(primary_hue="green", secondary_hue="yellow")) as demo:

    gr.Markdown("# 🚗 AI y’Amategeko y’Umuhanda 🇷🇼\n### *Yakozwe na Viateur Irasubiza*")

    # --- Igice cyo gusaba igisubizo ---
    with gr.Row():
        with gr.Column(scale=1):
            ikibazo = gr.Dropdown(choices=list(ibisubizo_dict.keys()), label="➡️ Hitamo ikibazo", value=list(ibisubizo_dict.keys())[0])
            kanda = gr.Button("🔍 Saba igisubizo")
        with gr.Column(scale=1):
            igisubizo = gr.Textbox(label="🧠 Igisubizo", lines=6)
    kanda.click(fn=gusubiza, inputs=ikibazo, outputs=igisubizo)

    # --- Quiz Section ---
    gr.Markdown("## 📝 Quiz: Amanota ako kanya ku kibazo kimwe ku gihe")
    quiz_button = gr.Button("Tangira Quiz")
    reset_button = gr.Button("🔄 Reset Quiz")
    quiz_score = gr.Textbox(label="🏆 Amanota yose", value="0/20", interactive=False)
    current_score = gr.State(0)
    quiz_questions_state = gr.State()
    quiz_choices_state = gr.State()
    current_question_state = gr.State("")

    radio_widgets = []
    instant_outputs = []
    timer_boxes = []

    for i in range(5):
        r = gr.Radio(choices=[], label=f"Ikibazo {i+1}", visible=False)
        radio_widgets.append(r)
        inst = gr.Markdown("", visible=False)
        instant_outputs.append(inst)
        timer_box = gr.Markdown("", visible=False)
        timer_boxes.append(timer_box)

    # --- Start Quiz ---
    def start_quiz():
        questions, choices = gutegura_quiz()
        updates = []
        for i, r in enumerate(radio_widgets):
            if i < len(questions):
                updates.append(gr.update(choices=choices[i], label=questions[i], visible=True, value=None))
            else:
                updates.append(gr.update(visible=False))
        for inst in instant_outputs:
            updates.append(gr.update(value="", visible=False))
        for timer_box in timer_boxes:
            updates.append(gr.update(value="", visible=False))
        # Start timer for first question
        start_timer(timer_boxes[0])
        return questions, choices, *updates, 0, "0/20", questions[0]

    quiz_button.click(
        fn=start_quiz,
        inputs=[],
        outputs=[quiz_questions_state, quiz_choices_state] + radio_widgets + instant_outputs + timer_boxes + [current_score, quiz_score, current_question_state]
    )

    # --- Check Answer ---
    def check_answer(answer, question, score):
        if not question:
            return "", score, f"{score}/20"
        correct, expl = ibisubizo_dict.get(question, ("", ""))
        if answer == correct:
            score += 4
            status = f"✅ Igisubizo cyawe ni cyo\n💡 Explanation: {expl}"
        else:
            status = f"❌ Igisubizo nyacyo: {correct}\n💡 Explanation: {expl}\nTip: Subira usome neza icyapa!"
        return status, score, f"{score}/20"

    for r, inst in zip(radio_widgets, instant_outputs):
        r.change(fn=check_answer, inputs=[r, current_question_state, current_score], outputs=[inst, current_score, quiz_score])

    # --- Reset Quiz ---
    def reset_quiz():
        updates = []
        for r, inst, timer_box in zip(radio_widgets, instant_outputs, timer_boxes):
            updates.append(gr.update(visible=False, value=None))
            updates.append(gr.update(value=""))
            updates.append(gr.update(value="", visible=False))
        return 0, "0/20", *updates

    reset_button.click(
        fn=reset_quiz,
        inputs=[],
        outputs=[current_score, quiz_score] + radio_widgets + instant_outputs + timer_boxes
    )

    # --- Footer / Copyright ---
    gr.Markdown("© 2025 Viateur Irasubiza. Uburenganzira bwose burabitswe.\n\nAI yakozwe kugirango ifashe Abanyarwanda kwiga amategeko y'umuhanda.")

demo.launch()