Samanta Das commited on
Commit
94ff04d
·
verified ·
1 Parent(s): 53b5128

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +215 -165
app.py CHANGED
@@ -1,198 +1,248 @@
1
  import os
 
2
  import gradio as gr
 
3
  from deep_translator import GoogleTranslator
4
- import google.generativeai as genai
5
  from groq import Groq
 
6
  from dotenv import load_dotenv
7
 
8
- # Load environment variables
9
- load_dotenv()
10
-
11
- # Configure API keys
12
- GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
13
- GROQ_API_KEY = os.getenv("GROQ_API_KEY")
14
-
15
- # Configure Gemini
16
- if GEMINI_API_KEY:
17
- genai.configure(api_key=GEMINI_API_KEY)
18
-
19
- # Configure Groq
20
- groq_client = None
21
- if GROQ_API_KEY:
22
- groq_client = Groq(api_key=GROQ_API_KEY)
23
-
24
- # Supported languages
25
- LANGUAGES = {
26
- "English": "en",
27
- "Spanish": "es",
28
- "French": "fr",
29
- "German": "de",
30
- "Chinese": "zh",
31
- "Japanese": "ja",
32
- "Korean": "ko",
33
- "Hindi": "hi",
34
- "Arabic": "ar",
35
- "Russian": "ru"
36
- }
37
-
38
- def translate_text(text, source_lang, target_lang):
39
- """Translate text between languages."""
40
- if source_lang == target_lang:
41
- return text
42
-
43
- try:
44
- translator = GoogleTranslator(source=source_lang, target=target_lang)
45
- return translator.translate(text)
46
- except Exception as e:
47
- print(f"Translation error: {str(e)}")
48
- return text
49
-
50
- def get_gemini_response(question):
51
- """Get response from Gemini model."""
52
- try:
53
- model = genai.GenerativeModel(
54
- model_name="gemini-1.5-flash-002",
55
- generation_config={
56
- "temperature": 0.7,
57
- "max_output_tokens": 4096
58
- }
59
- )
60
- response = model.generate_content(question)
61
- return response.text
62
- except Exception as e:
63
- print(f"Gemini error: {str(e)}")
64
- return None
65
-
66
- def get_groq_response(question):
67
- """Get response from Groq model."""
68
- try:
69
- response = groq_client.chat.completions.create(
70
- model="llama3-70b-8192",
71
- messages=[
72
- {"role": "system", "content": "You are a helpful assistant."},
73
- {"role": "user", "content": question}
74
- ],
75
- temperature=0.7,
76
- max_tokens=4096
77
- )
78
- return response.choices[0].message.content
79
- except Exception as e:
80
- print(f"Groq error: {str(e)}")
81
- return None
82
-
83
- def process_question(question, language, question_type):
84
- """Process the question and return responses."""
85
 
86
- # Check if we have any API keys configured
87
- if not GEMINI_API_KEY and not GROQ_API_KEY:
88
- error_msg = "No API keys configured. Please add GEMINI_API_KEY or GROQ_API_KEY to your environment variables."
89
- return error_msg, error_msg, error_msg
 
 
 
 
 
 
 
 
 
 
 
90
 
91
- try:
92
- # Get language codes
93
- source_lang = LANGUAGES.get(language, "en")
94
-
95
- # Translate question to English if needed
96
- english_question = translate_text(question, source_lang, "en") if language != "English" else question
97
-
98
- # Get model response
99
- answer = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
- # Try Gemini first
102
- if GEMINI_API_KEY:
103
- answer = get_gemini_response(english_question)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
- # If Gemini fails or isn't available, try Groq
106
- if answer is None and GROQ_API_KEY:
107
- answer = get_groq_response(english_question)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
- if answer is None:
110
- return "Error getting response", "Error getting response", "Error getting response"
 
111
 
112
- # Translate answer back to original language if needed
113
- translated_answer = translate_text(answer, "en", source_lang) if language != "English" else answer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
- return english_question, answer, translated_answer
 
116
 
117
- except Exception as e:
118
- error_msg = f"Error: {str(e)}"
119
- return error_msg, error_msg, error_msg
120
 
121
- def create_ui():
122
- """Create the Gradio interface."""
123
-
124
- # Determine which APIs are available
125
- available_apis = []
126
- if GEMINI_API_KEY:
127
- available_apis.append("Gemini")
128
- if GROQ_API_KEY:
129
- available_apis.append("Groq")
130
-
131
- api_status = f"Active APIs: {', '.join(available_apis)}" if available_apis else "No APIs configured"
132
-
133
- with gr.Blocks(title="AI Question Answering") as app:
134
- gr.Markdown("# AI Question Answering System")
135
- gr.Markdown(f"**{api_status}**")
136
-
137
- with gr.Row():
138
- with gr.Column():
139
- # Input components
140
  question_input = gr.Textbox(
141
  label="Your Question",
142
  placeholder="Type your question here...",
143
  lines=5
144
  )
145
 
146
- with gr.Row():
147
  language_input = gr.Dropdown(
148
- label="Language",
149
- choices=list(LANGUAGES.keys()),
 
150
  value="English"
151
  )
152
-
153
  question_type = gr.Dropdown(
154
  label="Question Type",
155
  choices=["general", "math", "job"],
156
  value="general"
157
  )
158
-
159
- submit_btn = gr.Button("Submit", variant="primary")
160
- clear_btn = gr.Button("Clear")
161
-
162
- with gr.Row():
163
- # Output components
164
- english_question = gr.Textbox(
165
- label="English Question",
166
- lines=3,
167
- interactive=False
168
- )
169
- english_answer = gr.Textbox(
170
- label="English Answer",
171
- lines=5,
172
- interactive=False
173
- )
174
- translated_answer = gr.Textbox(
175
- label="Translated Answer",
176
- lines=5,
177
- interactive=False
178
  )
179
-
180
- # Button actions
181
- submit_btn.click(
182
- process_question,
183
- inputs=[question_input, language_input, question_type],
184
- outputs=[english_question, english_answer, translated_answer]
185
- )
186
-
187
- clear_btn.click(
188
- lambda: ("", "", ""),
189
- outputs=[english_question, english_answer, translated_answer]
190
- )
191
-
192
- return app
193
 
194
- # Create and launch the app
195
- app = create_ui()
 
196
 
197
  if __name__ == "__main__":
198
- app.launch()
 
 
 
1
  import os
2
+ import re
3
  import gradio as gr
4
+ from typing import Tuple, Dict, List
5
  from deep_translator import GoogleTranslator
 
6
  from groq import Groq
7
+ import google.generativeai as genai
8
  from dotenv import load_dotenv
9
 
10
+ # Load environment variables - Adapted for Hugging Face
11
+ load_dotenv() # Ensure to call the function to load the environment variables
12
+
13
+ # Multiple Groq API Keys
14
+ GROQ_API_KEYS = [
15
+ os.getenv("GORQ_API_KEY_1"),
16
+ os.getenv("GORQ_API_KEY_2"),
17
+ os.getenv("GORQ_API_KEY_3"),
18
+ os.getenv("GORQ_API_KEY_4"),
19
+ os.getenv("GORQ_API_KEY_5")
20
+ ]
21
+
22
+ # Multiple Gemini API Keys
23
+ GEMINI_API_KEYS = [
24
+ os.getenv("GEMINI_API_KEY_1"),
25
+ os.getenv("GEMINI_API_KEY_2"),
26
+ os.getenv("GEMINI_API_KEY_3"),
27
+ os.getenv("GEMINI_API_KEY_4"),
28
+ os.getenv("GEMINI_API_KEY_5")
29
+ ]
30
+
31
+ class TextCleaner:
32
+ """Handles cleaning and structuring of input text."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
+ @staticmethod
35
+ def clean_markdown(text: str) -> str:
36
+ """Remove unnecessary markdown and formatting symbols."""
37
+ # Remove excessive markdown symbols
38
+ text = re.sub(r'#{3,}', '##', text)
39
+ text = re.sub(r'\*{3,}', '**', text)
40
+ text = re.sub(r'_{3,}', '__', text)
41
+ text = re.sub(r'~{3,}', '~~', text)
42
+ text = re.sub(r'\n{3,}', '\n\n', text)
43
+ text = re.sub(r' {2,}', ' ', text)
44
+ text = re.sub(r'`{3,}', '```', text)
45
+ return text.strip()
46
+
47
+ class LanguageManager:
48
+ """Manages supported languages and their configurations."""
49
 
50
+ SUPPORTED_LANGUAGES: Dict[str, str] = {
51
+ # Languages mapping...
52
+ }
53
+
54
+ @classmethod
55
+ def get_language_code(cls, language_name: str) -> str:
56
+ return cls.SUPPORTED_LANGUAGES.get(language_name.lower(), "en")
57
+
58
+ @classmethod
59
+ def get_language_name(cls, language_code: str) -> str:
60
+ for name, code in cls.SUPPORTED_LANGUAGES.items():
61
+ if code == language_code:
62
+ return name.replace('_', ' ').title()
63
+ return "English"
64
+
65
+ class ModelManager:
66
+ """Manages different language models and their responses."""
67
+
68
+ def __init__(self):
69
+ self.model_configs = {
70
+ "math": "llama3-70b-8192",
71
+ "job": "llama-3.2-90b-text-preview",
72
+ "general": "gemini-1.5-flash-002"
73
+ }
74
 
75
+ # Initialize API clients
76
+ self.groq_client = self._initialize_groq_client()
77
+ self.gemini_client = self._initialize_gemini_client()
78
+
79
+ def _initialize_groq_client(self):
80
+ for key in GROQ_API_KEYS:
81
+ if key: # Check if the key is valid
82
+ return Groq(api_key=key)
83
+ raise ValueError("No valid Groq API keys found.")
84
+
85
+ def _initialize_gemini_client(self):
86
+ for key in GEMINI_API_KEYS:
87
+ if key: # Check if the key is valid
88
+ genai.configure(api_key=key)
89
+ return
90
+ raise ValueError("No valid Gemini API keys found.")
91
+
92
+ def get_model_response(self, question: str, question_type: str) -> str:
93
+ """Get response from appropriate model with preprocessing."""
94
+ model_name = self.model_configs.get(question_type, self.model_configs["general"])
95
 
96
+ try:
97
+ if "gemini" in model_name and GEMINI_API_KEYS[0]: # Use the first Gemini key
98
+ return self._get_gemini_response(question)
99
+ elif GROQ_API_KEYS[0]: # Use the first Groq key
100
+ return self._get_groq_response(question, model_name)
101
+ else:
102
+ return "API keys not configured. Please check your environment variables."
103
+ except Exception as e:
104
+ print(f"Model error: {str(e)}")
105
+ return "I apologize, but I'm unable to process your request at the moment. Please try again later."
106
+
107
+ def _get_groq_response(self, question: str, model_name: str) -> str:
108
+ """Get response from Groq model."""
109
+ try:
110
+ response = self.groq_client.chat.completions.create(
111
+ model=model_name,
112
+ messages=[
113
+ {"role": "system", "content": "You are a helpful assistant. For calculations, show step-by-step solutions."},
114
+ {"role": "user", "content": question}
115
+ ],
116
+ temperature=0.7,
117
+ max_tokens=4096 # Reduced for better performance
118
+ )
119
+ return TextCleaner.clean_markdown(response.choices[0].message.content)
120
+ except Exception as e:
121
+ raise Exception(f"Groq API error: {str(e)}")
122
+
123
+ def _get_gemini_response(self, question: str) -> str:
124
+ """Get response from Gemini model."""
125
+ try:
126
+ model = genai.GenerativeModel(
127
+ model_name="gemini-1.5-flash-002",
128
+ generation_config={
129
+ "temperature": 0.7,
130
+ "max_output_tokens": 4096 # Reduced for better performance
131
+ }
132
+ )
133
+ response = model.generate_content(question)
134
+ return TextCleaner.clean_markdown(response.text)
135
+ except Exception as e:
136
+ raise Exception(f"Gemini API error: {str(e)}")
137
+
138
+ class TranslationManager:
139
+ """Manages translation between different languages."""
140
+
141
+ def __init__(self):
142
+ self._supported_languages = set(LanguageManager.SUPPORTED_LANGUAGES.values())
143
+ self._translation_cache: Dict[str, str] = {}
144
+
145
+ def translate_text(self, text: str, source_lang: str, target_lang: str) -> str:
146
+ """Translate text between languages with caching and error handling."""
147
+ if source_lang == target_lang:
148
+ return text
149
 
150
+ cache_key = f"{source_lang}:{target_lang}:{text}"
151
+ if cache_key in self._translation_cache:
152
+ return self._translation_cache[cache_key]
153
 
154
+ try:
155
+ translator = GoogleTranslator(source=source_lang, target=target_lang)
156
+ translated_text = translator.translate(text)
157
+ self._translation_cache[cache_key] = translated_text
158
+ return translated_text
159
+ except Exception as e:
160
+ print(f"Translation error: {str(e)}")
161
+ return text
162
+
163
+ class QuestifyAI:
164
+ """Main application class for multilingual question answering."""
165
+
166
+ def __init__(self):
167
+ self.translation_manager = TranslationManager()
168
+ self.model_manager = ModelManager()
169
+
170
+ def process_question(
171
+ self,
172
+ question: str,
173
+ input_language: str,
174
+ question_type: str
175
+ ) -> Tuple[str, str, str]:
176
+ """Process a question through translation and model response pipeline."""
177
+ # Clean input
178
+ question = re.sub(r"[#/*\\]", "", question).strip()
179
 
180
+ # Get language code
181
+ language_code = LanguageManager.get_language_code(input_language)
182
 
183
+ # Translate to English if needed
184
+ english_question = (self.translation_manager.translate_text(question, language_code, "en")
185
+ if language_code != "en" else question)
186
 
187
+ # Get model response
188
+ english_answer = self.model_manager.get_model_response(english_question, question_type)
189
+
190
+ # Translate answer back if needed
191
+ translated_answer = (self.translation_manager.translate_text(english_answer, "en", language_code)
192
+ if language_code != "en" else english_answer)
193
+
194
+ return english_question, english_answer, translated_answer
195
+
196
+ def create_ui(self):
197
+ """Create Gradio interface for QuestifyAI."""
198
+ with gr.Blocks(title="Questify AI") as app:
199
+ gr.Markdown("# Questify AI - Multilingual Question Answering")
200
+
201
+ with gr.Row():
 
 
 
 
202
  question_input = gr.Textbox(
203
  label="Your Question",
204
  placeholder="Type your question here...",
205
  lines=5
206
  )
207
 
208
+ with gr.Column():
209
  language_input = gr.Dropdown(
210
+ label="Select Language",
211
+ choices=sorted([name.replace('_', ' ').title()
212
+ for name in LanguageManager.SUPPORTED_LANGUAGES.keys()]),
213
  value="English"
214
  )
 
215
  question_type = gr.Dropdown(
216
  label="Question Type",
217
  choices=["general", "math", "job"],
218
  value="general"
219
  )
220
+
221
+ submit_btn = gr.Button("Submit", variant="primary")
222
+ clear_btn = gr.Button("Clear")
223
+
224
+ with gr.Row():
225
+ english_question = gr.Textbox(label="Structured English Question", lines=3)
226
+ english_answer = gr.Textbox(label="Answer in English", lines=5)
227
+ translated_answer = gr.Textbox(label="Translated Answer", lines=5)
228
+
229
+ def handle_submit(question, language, q_type):
230
+ try:
231
+ return self.process_question(question, language, q_type)
232
+ except Exception as e:
233
+ return str(e), "", ""
234
+
235
+ submit_btn.click(
236
+ handle_submit,
237
+ inputs=[question_input, language_input, question_type],
238
+ outputs=[english_question, english_answer, translated_answer]
 
239
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
 
241
+ clear_btn.click(lambda: ("", "", ""), outputs=[question_input, english_question, english_answer, translated_answer])
242
+
243
+ return app
244
 
245
  if __name__ == "__main__":
246
+ app = QuestifyAI()
247
+ ui = app.create_ui()
248
+ ui.launch()