Chatbot / app.py
Fawad97's picture
Update app.py
72bf8a3 verified
import os
os.system("pip install groq")
import gradio as gr
import json
from groq import Groq
# Initialize Groq API client
api_key = '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'
client = Groq(api_key=api_key)
# Lessons structure
lessons = {
"beginner": {
"topics": [
"Introduction to Arabic Letters",
"Basic Arabic Grammar: Nouns and Pronouns",
"Basic Arabic Sentence Structure"
]
},
"intermediate": {
"topics": [
"Verb Forms in Arabic",
"Arabic Tenses and Conjugation",
"Arabic Question Structures"
]
},
"advanced": {
"topics": [
"Advanced Arabic Sentence Structure",
"Arabic Vocabulary Building",
"Arabic Syntax and Semantics"
]
}
}
def save_user_data(user_id, data):
with open(f"{user_id}_data.json", "w") as file:
json.dump(data, file)
def load_user_data(user_id):
try:
with open(f"{user_id}_data.json", "r") as file:
return json.load(file)
except FileNotFoundError:
return {"level": None, "current_lesson": 0, "score": 0}
def generate_response(level, topic):
prompt = f"Generate a lesson on {topic} for {level} level Arabic learner."
response = client.chat.completions.create(
messages=[{"role": "user", "content": prompt}],
model="llama-3.3-70b-versatile",
)
return response.choices[0].message.content
def create_interface():
with gr.Blocks() as demo:
gr.Markdown("(Smart AI) Smart Arabic-Instructor: Chatbot for Quranic Arabic Learning")
# User ID input
user_id = gr.Textbox(label="Enter User ID", placeholder="Type your User ID")
# Action selection
action = gr.Radio(
choices=["start", "select_level", "start_learning"],
label="Choose Action",
value="start",
visible=False
)
# Welcome message
welcome_msg = gr.Textbox(
label="Welcome",
visible=False,
interactive=False
)
# Level selection
level_select = gr.Dropdown(
choices=["beginner", "intermediate", "advanced"],
label="Select Level",
visible=False
)
# Topic selection
topic_select = gr.Dropdown(
choices=[],
label="Select Topic",
visible=False
)
# Output box for responses
output_box = gr.Textbox(
label="Lesson Content",
interactive=False,
visible=False,
lines=10
)
# Submit button
submit_btn = gr.Button("Submit", visible=False)
def show_welcome(user_id):
if not user_id:
return {
welcome_msg: gr.update(visible=False),
action: gr.update(visible=False),
submit_btn: gr.update(visible=False)
}
return {
welcome_msg: gr.update(visible=True, value=f"Welcome {user_id}! Please select an action to continue."),
action: gr.update(visible=True),
submit_btn: gr.update(visible=True)
}
def update_interface(user_id, action_selected):
if not user_id:
return {
level_select: gr.update(visible=False),
topic_select: gr.update(visible=False),
output_box: gr.update(visible=False),
welcome_msg: gr.update(value="Please enter a User ID first.", visible=True)
}
if action_selected == "start":
return {
level_select: gr.update(visible=False),
topic_select: gr.update(visible=False),
output_box: gr.update(visible=True, value="Welcome! Select 'select_level' to choose your level.")
}
elif action_selected == "select_level":
return {
level_select: gr.update(visible=True),
topic_select: gr.update(visible=False),
output_box: gr.update(visible=True, value="Please select your level.")
}
elif action_selected == "start_learning":
current_level = load_user_data(user_id).get("level")
if not current_level:
return {
level_select: gr.update(visible=True),
topic_select: gr.update(visible=True, choices=lessons["beginner"]["topics"]),
output_box: gr.update(visible=True, value="Please select a level and topic to begin.")
}
topics = lessons[current_level]["topics"]
return {
level_select: gr.update(visible=True),
topic_select: gr.update(visible=True, choices=topics),
output_box: gr.update(visible=True, value="Select a topic to start learning.")
}
def handle_submit(user_id, action_selected, level, topic):
if not user_id:
return "Please enter a User ID first."
if action_selected == "start":
return "Please select 'select_level' to choose your level."
elif action_selected == "select_level":
if not level:
return "Please select a level."
user_data = load_user_data(user_id)
user_data["level"] = level
save_user_data(user_id, user_data)
return f"Level set to {level}. Select 'start_learning' to begin your lessons."
elif action_selected == "start_learning":
if not level or not topic:
return "Please select both level and topic."
lesson_content = generate_response(level, topic)
return f"Lesson on {topic} for {level} level:\n\n{lesson_content}"
# Event handlers
user_id.change(
show_welcome,
inputs=[user_id],
outputs=[welcome_msg, action, submit_btn]
)
action.change(
update_interface,
inputs=[user_id, action],
outputs=[level_select, topic_select, output_box]
)
level_select.change(
lambda level: gr.update(choices=lessons[level]["topics"]) if level else gr.update(choices=[]),
inputs=[level_select],
outputs=[topic_select]
)
submit_btn.click(
handle_submit,
inputs=[user_id, action, level_select, topic_select],
outputs=[output_box]
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch()