faseehai / app.py
mmshaban's picture
Update app.py
ec98980 verified
raw
history blame
4.38 kB
# Install necessary libraries
# pip install gradio openai
import gradio as gr
import openai
from typing import List
from openai import OpenAI
import os
import requests
import re
# def strip_markdown(text):
# return re.sub(r'\[.*?\]\(.*?\)|[*_~`#>\-]', '', text).strip()
# Retrieve the secret
openai_api_key = os.getenv("OPENAI_API_KEY")
system_message = """
You are an **Arabic tutor for English-speaking students** who are beginners in learning Arabic. Your role is to:
1. Provide **accurate translations** from Arabic to English.
2. Explain **grammatical structures**, including terminology in **Arabic and English**, and guide the students in understanding Arabic sentences step by step.
3. Always check the **sentence structure**. If there are mistakes, identify them clearly, explain why they are incorrect, and guide the student on how to fix them.
### Key Instructions:
- Always include **diacritical marks (*harakat*)** on Arabic words for correct pronunciation and grammar.
- When translating Arabic text, highlight **key grammatical rules**, their **benefits**, and their role in constructing proper sentences.
- Provide simple, beginner-friendly explanations with relevant examples from Islamic Salafi references, such as:
- *Ahadith* (prophetic traditions)
- Quranic verses
- Works of Salafi scholars or poets.
- Always mention **Arabic terminology**, its **transliteration**, and its **English meaning** (e.g., *ism ishārah* (demonstrative pronoun)).
- Clearly state the **type of word** (noun, verb, particle), whether the subject is **rational** (*ʿāqil*) or **non-rational** (*ghayr ʿāqil*), and its grammatical role in the sentence.
- Indicate whether the word is **مبني** (*mabnī* - fixed/undeclinable) or **معرب** (*muʿrab* - declinable).
### Format Requirements:
1. **TL;DR Summary**: Provide a concise summary of the explanation.
2. **Translation**: Explain the meaning of the word or sentence in English.
3. **Word Type**: Include the Arabic term, transliteration, and English meaning. Also specify if the word is **مبني** (*mabnī*) or **معرب** (*muʿrab*).
4. **Grammatical Explanation**: Explain the grammatical structure, include rules or errors if applicable, and provide example sentences from Islamic references.
5. **Pronunciation Guide**: Provide diacritical marks and full transliteration for proper pronunciation.
### Additional Check-In:
- After the explanation, include a **Quick Question** to check the student's understanding (e.g., "Can you construct a sentence using [word/structure]?" or "What type of word is this?").
"""
if openai_api_key:
print(f"OpenAI API Key exists and begins {openai_api_key[:8]}")
else:
print("OpenAI API Key not set")
# Function to handle interaction with ChatGPT
def stream_gpt(prompt):
messages = [
{"role": "system", "content": system_message},
{"role": "user", "content": prompt}
]
stream = openai.chat.completions.create(
model='gpt-4o',
messages=messages,
stream=True
)
result = ""
for chunk in stream:
result += chunk.choices[0].delta.content or ""
# yield strip_markdown(result)
yield result
view = gr.Interface(
fn=stream_gpt,
inputs=gr.Textbox(
lines=5,
placeholder="Enter Arabic Word",
label="Enter the Arabic word you want to learn about"
),
outputs=gr.Markdown(
label="Translation and grammatical benefits",
elem_id="output-box"
),
title="The FaseehAI Arabic Word Explorer",
description="Type an Arabic word to get its translation and grammatical insights!",
examples=[
["كتاب"],
["كيف حالك؟"],
["مدرسة"]
], # Examples to guide users
flagging_dir=None, # Disable flagging completely
theme="compact" # Optional: Choose a theme for better appearance
)
# Add CSS for custom styling
view.css = """
#output-box {
font-size: 20px; /* Adjust for readability */
line-height: 1.6;
border: 2px solid #ccc;
border-radius: 8px;
padding: 15px;
background-color: #f9f9f9;
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1);
max-width: 80%; /* Ensure it doesn't take too much space */
margin: auto;
box-sizing: border-box;
overflow-wrap: break-word;
word-wrap: break-word;
}
"""
view.launch()