RayMune commited on
Commit
29fdba3
·
1 Parent(s): 81917a3

Updated app.py and added UI improvements

Browse files
Files changed (1) hide show
  1. app.py +571 -5
app.py CHANGED
@@ -3,21 +3,587 @@ import gradio as gr
3
  import requests
4
  import inspect
5
  import pandas as pd
 
 
 
 
 
 
6
 
7
  # (Keep Constants as is)
8
  # --- Constants ---
9
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
10
 
11
- # --- Basic Agent Definition ---
12
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
13
  class BasicAgent:
14
  def __init__(self):
15
- print("BasicAgent initialized.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  def __call__(self, question: str) -> str:
 
17
  print(f"Agent received question (first 50 chars): {question[:50]}...")
18
- fixed_answer = "This is a default answer."
19
- print(f"Agent returning fixed answer: {fixed_answer}")
20
- return fixed_answer
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  def run_and_submit_all( profile: gr.OAuthProfile | None):
23
  """
 
3
  import requests
4
  import inspect
5
  import pandas as pd
6
+ import re
7
+ import json
8
+ import math
9
+ import datetime
10
+ from typing import Dict, List, Any, Optional, Union
11
+ import time
12
 
13
  # (Keep Constants as is)
14
  # --- Constants ---
15
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
16
 
17
+ # --- Advanced Agent Definition ---
18
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
19
  class BasicAgent:
20
  def __init__(self):
21
+ print("Advanced Agent initialized.")
22
+ # Initialize knowledge base and tools
23
+ self._init_knowledge_base()
24
+ self._init_tools()
25
+
26
+ def _init_knowledge_base(self):
27
+ """Initialize the agent's knowledge base."""
28
+ self.knowledge_base = {
29
+ # General knowledge categories
30
+ "general_knowledge": {
31
+ "planets": ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"],
32
+ "elements": {
33
+ "H": {"name": "Hydrogen", "atomic_number": 1},
34
+ "He": {"name": "Helium", "atomic_number": 2},
35
+ "O": {"name": "Oxygen", "atomic_number": 8},
36
+ "C": {"name": "Carbon", "atomic_number": 6},
37
+ "N": {"name": "Nitrogen", "atomic_number": 7},
38
+ "Fe": {"name": "Iron", "atomic_number": 26},
39
+ "Au": {"name": "Gold", "atomic_number": 79}
40
+ },
41
+ "countries": {
42
+ "USA": {"capital": "Washington D.C.", "continent": "North America"},
43
+ "UK": {"capital": "London", "continent": "Europe"},
44
+ "France": {"capital": "Paris", "continent": "Europe"},
45
+ "Japan": {"capital": "Tokyo", "continent": "Asia"},
46
+ "Brazil": {"capital": "Brasília", "continent": "South America"},
47
+ "Australia": {"capital": "Canberra", "continent": "Australia"},
48
+ "Egypt": {"capital": "Cairo", "continent": "Africa"}
49
+ }
50
+ },
51
+
52
+ # Tech and programming knowledge
53
+ "tech": {
54
+ "programming_languages": {
55
+ "Python": {"paradigm": "multi-paradigm", "typing": "dynamic", "year": 1991},
56
+ "JavaScript": {"paradigm": "multi-paradigm", "typing": "dynamic", "year": 1995},
57
+ "Java": {"paradigm": "object-oriented", "typing": "static", "year": 1995},
58
+ "C++": {"paradigm": "multi-paradigm", "typing": "static", "year": 1985},
59
+ "Go": {"paradigm": "concurrent", "typing": "static", "year": 2009},
60
+ "Rust": {"paradigm": "multi-paradigm", "typing": "static", "year": 2010}
61
+ },
62
+ "frameworks": {
63
+ "web": ["React", "Angular", "Vue", "Django", "Flask", "Express", "Spring"],
64
+ "ml": ["TensorFlow", "PyTorch", "scikit-learn", "Keras", "Hugging Face Transformers"],
65
+ "mobile": ["React Native", "Flutter", "Xamarin", "SwiftUI", "Kotlin"]
66
+ },
67
+ "databases": {
68
+ "relational": ["MySQL", "PostgreSQL", "SQLite", "Oracle", "SQL Server"],
69
+ "nosql": ["MongoDB", "Cassandra", "Redis", "Elasticsearch", "DynamoDB"]
70
+ }
71
+ },
72
+
73
+ # Definitions for common terms
74
+ "definitions": {
75
+ "algorithm": "A step-by-step procedure or formula for solving a problem or accomplishing a task.",
76
+ "api": "Application Programming Interface - a set of rules that allows different software applications to communicate with each other.",
77
+ "cloud computing": "The delivery of computing services over the internet to offer faster innovation, flexible resources, and economies of scale.",
78
+ "machine learning": "A subset of AI that enables systems to learn and improve from experience without being explicitly programmed.",
79
+ "neural network": "A computing system inspired by biological neural networks that can learn to perform tasks by considering examples.",
80
+ "blockchain": "A distributed, decentralized, public ledger that records transactions across many computers.",
81
+ "devops": "A set of practices that combines software development and IT operations to shorten the development lifecycle.",
82
+ "agile": "An iterative approach to project management and software development that helps teams deliver value to their customers faster.",
83
+ "rest": "Representational State Transfer - an architectural style for designing networked applications.",
84
+ "git": "A distributed version control system for tracking changes in source code during software development."
85
+ },
86
+
87
+ # Common question patterns and responses
88
+ "question_patterns": {
89
+ "greeting": ["hello", "hi", "hey", "greetings"],
90
+ "identity": ["who are you", "what are you", "your name", "who created you"],
91
+ "capabilities": ["what can you do", "help me", "your capabilities", "your functions"],
92
+ "math": ["calculate", "compute", "solve", "equation", "math problem"],
93
+ "time": ["time", "date", "day", "today", "current time"],
94
+ "weather": ["weather", "temperature", "forecast", "rain", "sunny"],
95
+ "definition": ["define", "meaning of", "what is", "what are", "definition"],
96
+ "comparison": ["difference between", "compare", "versus", "vs", "similarities"],
97
+ "recommendation": ["recommend", "suggest", "best", "top", "advice"],
98
+ "how_to": ["how to", "how do i", "steps to", "guide", "tutorial"],
99
+ "why": ["why is", "why do", "why does", "reason for", "explain why"]
100
+ }
101
+ }
102
+
103
+ # Response templates for different question types
104
+ self.response_templates = {
105
+ "greeting": "Hello! I'm an advanced AI assistant. How can I help you today?",
106
+ "identity": "I'm an advanced AI assistant designed to help answer your questions and provide information on various topics.",
107
+ "capabilities": "I can answer questions, provide explanations, solve problems, offer recommendations, and assist with various topics including math, definitions, comparisons, and more.",
108
+ "unknown": "I don't have enough information to answer that question accurately. Could you provide more details or rephrase your question?",
109
+ "clarification": "I'm not sure I understand your question completely. Could you rephrase it or provide more context?",
110
+ "math_response": "Based on my calculations, {result}.",
111
+ "definition_response": "The term '{term}' refers to {definition}.",
112
+ "comparison_response": "When comparing {item1} and {item2}: {differences}",
113
+ "recommendation_response": "Based on your request, I would recommend {recommendations}.",
114
+ "how_to_response": "Here's how to {task}: {steps}",
115
+ "why_response": "The reason for {subject} is {explanation}."
116
+ }
117
+
118
+ def _init_tools(self):
119
+ """Initialize the agent's tools for answering different types of questions."""
120
+ self.tools = {
121
+ "math_solver": self._solve_math_problem,
122
+ "definition_finder": self._answer_definition,
123
+ "comparison_maker": self._compare_items,
124
+ "recommendation_engine": self._make_recommendation,
125
+ "how_to_guide": self._create_how_to,
126
+ "why_explainer": self._explain_why,
127
+ "general_knowledge": self._answer_general_knowledge,
128
+ "time_handler": self._handle_time_questions,
129
+ "advanced_math": self._handle_advanced_math,
130
+ "code_generator": self._generate_code_examples
131
+ }
132
+
133
+ def _categorize_question(self, question: str) -> str:
134
+ """Determine the category of the question."""
135
+ question_lower = question.lower()
136
+
137
+ # Check each category
138
+ for category, keywords in self.knowledge_base["question_patterns"].items():
139
+ for keyword in keywords:
140
+ if keyword in question_lower:
141
+ return category
142
+
143
+ # Check for general knowledge questions
144
+ if any(word in question_lower for word in ["what", "who", "where", "when", "list", "name", "tell me about"]):
145
+ return "general_knowledge"
146
+
147
+ # If no category matches
148
+ return "unknown"
149
+
150
+ def _extract_math_expression(self, question: str) -> Optional[str]:
151
+ """Extract mathematical expressions from the question."""
152
+ # Look for basic arithmetic patterns
153
+ math_patterns = [
154
+ r'(\d+\s*[\+\-\*\/]\s*\d+)', # Simple operations like "2 + 2"
155
+ r'(\d+\s*[\+\-\*\/]\s*\d+\s*[\+\-\*\/]\s*\d+)', # More complex like "2 + 3 * 4"
156
+ r'what is (\d+\s*[\+\-\*\/]\s*\d+)', # "What is 2 + 2"
157
+ r'calculate (\d+\s*[\+\-\*\/]\s*\d+)' # "Calculate 2 + 2"
158
+ ]
159
+
160
+ for pattern in math_patterns:
161
+ match = re.search(pattern, question.lower())
162
+ if match:
163
+ return match.group(1)
164
+
165
+ return None
166
+
167
+ def _solve_math_problem(self, question: str) -> str:
168
+ """Safely evaluate a mathematical expression."""
169
+ expression = self._extract_math_expression(question)
170
+ if not expression:
171
+ return "I couldn't identify a mathematical expression in your question."
172
+
173
+ try:
174
+ # Replace × with * and ÷ with /
175
+ expression = expression.replace('×', '*').replace('÷', '/')
176
+ # Remove any non-math characters
177
+ expression = re.sub(r'[^0-9\+\-\*\/\(\)\.\s]', '', expression)
178
+ result = eval(expression)
179
+ return f"{expression} = {result}"
180
+ except Exception as e:
181
+ return f"I couldn't evaluate the expression '{expression}'. Error: {str(e)}"
182
+
183
+ def _answer_definition(self, question: str) -> str:
184
+ """Generate a definition response."""
185
+ # Extract the term being defined
186
+ patterns = [
187
+ r'define\s+([a-zA-Z\s]+)',
188
+ r'what\s+is\s+([a-zA-Z\s]+)',
189
+ r'meaning\s+of\s+([a-zA-Z\s]+)'
190
+ ]
191
+
192
+ term = None
193
+ for pattern in patterns:
194
+ match = re.search(pattern, question.lower())
195
+ if match:
196
+ term = match.group(1).strip()
197
+ break
198
+
199
+ if not term:
200
+ return self.response_templates["clarification"]
201
+
202
+ # Check if we have a definition for the term
203
+ for key, definition in self.knowledge_base["definitions"].items():
204
+ if term in key or key in term:
205
+ return self.response_templates["definition_response"].format(term=key, definition=definition)
206
+
207
+ return f"I don't have a specific definition for '{term}' in my knowledge base."
208
+
209
+ def _compare_items(self, question: str) -> str:
210
+ """Compare two items mentioned in the question."""
211
+ # Extract items to compare
212
+ patterns = [
213
+ r'difference between ([a-zA-Z\s]+) and ([a-zA-Z\s]+)',
214
+ r'compare ([a-zA-Z\s]+) and ([a-zA-Z\s]+)',
215
+ r'([a-zA-Z\s]+) vs ([a-zA-Z\s]+)'
216
+ ]
217
+
218
+ item1 = None
219
+ item2 = None
220
+ for pattern in patterns:
221
+ match = re.search(pattern, question.lower())
222
+ if match:
223
+ item1 = match.group(1).strip()
224
+ item2 = match.group(2).strip()
225
+ break
226
+
227
+ if not item1 or not item2:
228
+ return "I couldn't identify the items you want to compare. Please specify them clearly."
229
+
230
+ # Check if we can compare programming languages
231
+ tech_info = self.knowledge_base["tech"]["programming_languages"]
232
+ if item1 in tech_info and item2 in tech_info:
233
+ lang1 = tech_info[item1]
234
+ lang2 = tech_info[item2]
235
+ differences = []
236
+
237
+ if lang1["paradigm"] != lang2["paradigm"]:
238
+ differences.append(f"{item1} follows {lang1['paradigm']} paradigm while {item2} follows {lang2['paradigm']} paradigm")
239
+
240
+ if lang1["typing"] != lang2["typing"]:
241
+ differences.append(f"{item1} uses {lang1['typing']} typing while {item2} uses {lang2['typing']} typing")
242
+
243
+ if lang1["year"] != lang2["year"]:
244
+ differences.append(f"{item1} was created in {lang1['year']} while {item2} was created in {lang2['year']}")
245
+
246
+ if differences:
247
+ return self.response_templates["comparison_response"].format(
248
+ item1=item1,
249
+ item2=item2,
250
+ differences=". ".join(differences) + "."
251
+ )
252
+
253
+ return f"I don't have enough information to compare {item1} and {item2} in detail."
254
+
255
+ def _make_recommendation(self, question: str) -> str:
256
+ """Make recommendations based on the question."""
257
+ question_lower = question.lower()
258
+
259
+ # Recommend programming language
260
+ if "programming language" in question_lower:
261
+ if "web" in question_lower:
262
+ return "For web development, I would recommend JavaScript with frameworks like React or Vue.js for frontend, and Node.js, Python (Django/Flask), or Ruby on Rails for backend."
263
+ elif "data science" in question_lower or "machine learning" in question_lower:
264
+ return "For data science and machine learning, Python is highly recommended due to its extensive libraries like TensorFlow, PyTorch, scikit-learn, and pandas."
265
+ elif "mobile" in question_lower:
266
+ return "For mobile development, consider Swift for iOS, Kotlin for Android, or cross-platform frameworks like React Native or Flutter."
267
+ else:
268
+ return "For general purpose programming, Python is great for beginners due to its readability. Java and C# are excellent for enterprise applications. Rust and Go are modern languages with great performance characteristics."
269
+
270
+ # Recommend database
271
+ elif "database" in question_lower:
272
+ if "scalability" in question_lower or "large scale" in question_lower:
273
+ return "For highly scalable applications, consider NoSQL databases like MongoDB, Cassandra, or cloud-based solutions like Amazon DynamoDB or Google Firestore."
274
+ elif "relational" in question_lower or "sql" in question_lower:
275
+ return "For relational data, PostgreSQL is an excellent open-source choice with advanced features. MySQL is also popular and well-supported. For smaller applications, SQLite is a lightweight option."
276
+ else:
277
+ return "For most applications, PostgreSQL is a versatile choice. If you need schema flexibility, consider MongoDB. For caching and real-time data, Redis is excellent."
278
+
279
+ return "I need more specific information about what you're looking for to provide a tailored recommendation."
280
+
281
+ def _create_how_to(self, question: str) -> str:
282
+ """Create a how-to guide based on the question."""
283
+ question_lower = question.lower()
284
+
285
+ # Extract the task
286
+ match = re.search(r'how to ([a-zA-Z\s]+)', question_lower)
287
+ if not match:
288
+ return "Could you specify what you want to learn how to do?"
289
+
290
+ task = match.group(1).strip()
291
+
292
+ # Common how-to guides
293
+ how_to_guides = {
294
+ "learn programming": """
295
+ 1. Choose a programming language (Python is great for beginners)
296
+ 2. Set up your development environment
297
+ 3. Learn the basic syntax and concepts
298
+ 4. Practice with small projects
299
+ 5. Use online resources like tutorials, documentation, and courses
300
+ 6. Join programming communities for support
301
+ 7. Build increasingly complex projects
302
+ 8. Learn about algorithms and data structures
303
+ 9. Contribute to open source projects
304
+ """,
305
+ "create a website": """
306
+ 1. Define the purpose and goals of your website
307
+ 2. Choose a domain name and hosting provider
308
+ 3. Decide between using a website builder, CMS, or coding from scratch
309
+ 4. Design the layout and user interface
310
+ 5. Create and organize your content
311
+ 6. Add functionality with plugins or custom code
312
+ 7. Test your website on different devices and browsers
313
+ 8. Optimize for search engines (SEO)
314
+ 9. Launch your website
315
+ 10. Maintain and update regularly
316
+ """,
317
+ "learn machine learning": """
318
+ 1. Master the prerequisites: Python, statistics, and linear algebra
319
+ 2. Understand the basic concepts and terminology
320
+ 3. Learn about data preprocessing and visualization
321
+ 4. Study supervised learning algorithms (regression, classification)
322
+ 5. Explore unsupervised learning techniques (clustering, dimensionality reduction)
323
+ 6. Practice with datasets from Kaggle or UCI Machine Learning Repository
324
+ 7. Learn a machine learning library like scikit-learn
325
+ 8. Study deep learning fundamentals
326
+ 9. Experiment with neural network frameworks like TensorFlow or PyTorch
327
+ 10. Work on real-world projects and participate in competitions
328
+ """
329
+ }
330
+
331
+ # Check if we have a guide for this task
332
+ for guide_task, steps in how_to_guides.items():
333
+ if task in guide_task or guide_task in task:
334
+ return self.response_templates["how_to_response"].format(task=task, steps=steps)
335
+
336
+ return f"I don't have a specific guide for how to {task}. Could you ask about a more specific topic?"
337
+
338
+ def _explain_why(self, question: str) -> str:
339
+ """Explain why something happens or exists."""
340
+ question_lower = question.lower()
341
+
342
+ # Extract the subject
343
+ patterns = [
344
+ r'why is ([a-zA-Z\s]+)',
345
+ r'why do ([a-zA-Z\s]+)',
346
+ r'why does ([a-zA-Z\s]+)',
347
+ r'explain why ([a-zA-Z\s]+)'
348
+ ]
349
+
350
+ subject = None
351
+ for pattern in patterns:
352
+ match = re.search(pattern, question_lower)
353
+ if match:
354
+ subject = match.group(1).strip()
355
+ break
356
+
357
+ if not subject:
358
+ return "Could you clarify what you want me to explain?"
359
+
360
+ # Common explanations
361
+ explanations = {
362
+ "sky blue": "The sky appears blue because molecules in the air scatter blue light from the sun more than they scatter red light. This is called Rayleigh scattering.",
363
+ "water wet": "Water is wet in the sense that it makes other materials wet. Wetness is the ability of a liquid to adhere to the surface of a solid.",
364
+ "programming important": "Programming is important because it enables us to create software that solves problems, automates tasks, and powers much of modern technology and infrastructure.",
365
+ "python popular": "Python is popular due to its readability, versatility, extensive libraries, strong community support, and applications in growing fields like data science and machine learning.",
366
+ "computers use binary": "Computers use binary (0s and 1s) because digital electronics are based on two states: on and off. This binary system simplifies hardware design and is the foundation of all digital computing."
367
+ }
368
+
369
+ # Check if we have an explanation for this subject
370
+ for key, explanation in explanations.items():
371
+ if subject in key or key in subject:
372
+ return self.response_templates["why_response"].format(subject=subject, explanation=explanation)
373
+
374
+ return f"I don't have a specific explanation for why {subject}. Could you ask about something more specific?"
375
+
376
+ def _answer_general_knowledge(self, question: str) -> str:
377
+ """Answer general knowledge questions."""
378
+ question_lower = question.lower()
379
+
380
+ # Check for questions about planets
381
+ if any(planet.lower() in question_lower for planet in self.knowledge_base["general_knowledge"]["planets"]):
382
+ if "how many" in question_lower and "planets" in question_lower:
383
+ return f"There are 8 recognized planets in our solar system: {', '.join(self.knowledge_base['general_knowledge']['planets'])}."
384
+
385
+ for planet in self.knowledge_base["general_knowledge"]["planets"]:
386
+ if planet.lower() in question_lower:
387
+ if planet == "Earth":
388
+ return "Earth is the third planet from the Sun and the only astronomical object known to harbor life."
389
+ elif planet == "Mars":
390
+ return "Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, often called the 'Red Planet'."
391
+ elif planet == "Jupiter":
392
+ return "Jupiter is the fifth planet from the Sun and the largest in the Solar System, characterized by its Great Red Spot."
393
+ else:
394
+ return f"{planet} is one of the planets in our solar system."
395
+
396
+ # Check for questions about elements
397
+ if "element" in question_lower:
398
+ for symbol, data in self.knowledge_base["general_knowledge"]["elements"].items():
399
+ if symbol.lower() in question_lower or data["name"].lower() in question_lower:
400
+ return f"{data['name']} (symbol: {symbol}) is a chemical element with atomic number {data['atomic_number']}."
401
+
402
+ # Check for questions about countries
403
+ if "capital" in question_lower or "country" in question_lower:
404
+ for country, data in self.knowledge_base["general_knowledge"]["countries"].items():
405
+ if country.lower() in question_lower:
406
+ return f"The capital of {country} is {data['capital']}, and it's located in {data['continent']}."
407
+ elif data["capital"].lower() in question_lower:
408
+ return f"{data['capital']} is the capital of {country}, which is located in {data['continent']}."
409
+
410
+ # Check for programming language questions
411
+ if "programming language" in question_lower:
412
+ for lang, data in self.knowledge_base["tech"]["programming_languages"].items():
413
+ if lang.lower() in question_lower:
414
+ return f"{lang} is a {data['paradigm']} programming language with {data['typing']} typing, created in {data['year']}."
415
+
416
+ return "I don't have specific information about that in my knowledge base."
417
+
418
+ def _handle_time_questions(self, question: str) -> str:
419
+ """Handle questions about time and date."""
420
+ question_lower = question.lower()
421
+ current_time = datetime.datetime.now()
422
+
423
+ if "time" in question_lower:
424
+ return f"The current time is {current_time.strftime('%H:%M:%S')}."
425
+
426
+ elif "date" in question_lower or "today" in question_lower or "day" in question_lower:
427
+ return f"Today is {current_time.strftime('%A, %B %d, %Y')}."
428
+
429
+ elif "month" in question_lower:
430
+ return f"The current month is {current_time.strftime('%B')}."
431
+
432
+ elif "year" in question_lower:
433
+ return f"The current year is {current_time.strftime('%Y')}."
434
+
435
+ return f"The current date and time is {current_time.strftime('%A, %B %d, %Y %H:%M:%S')}."
436
+
437
+ def _handle_advanced_math(self, question: str) -> str:
438
+ """Handle more advanced mathematical operations."""
439
+ question_lower = question.lower()
440
+
441
+ # Check for square root
442
+ sqrt_match = re.search(r'square root of (\d+)', question_lower)
443
+ if sqrt_match:
444
+ number = int(sqrt_match.group(1))
445
+ result = math.sqrt(number)
446
+ return f"The square root of {number} is {result}."
447
+
448
+ # Check for exponentiation
449
+ exp_match = re.search(r'(\d+) to the power of (\d+)', question_lower)
450
+ if exp_match:
451
+ base = int(exp_match.group(1))
452
+ exponent = int(exp_match.group(2))
453
+ result = math.pow(base, exponent)
454
+ return f"{base} to the power of {exponent} is {result}."
455
+
456
+ # Check for logarithm
457
+ log_match = re.search(r'log(?:arithm)? of (\d+)', question_lower)
458
+ if log_match:
459
+ number = int(log_match.group(1))
460
+ result = math.log10(number)
461
+ return f"The logarithm (base 10) of {number} is {result}."
462
+
463
+ # Check for trigonometric functions
464
+ trig_patterns = {
465
+ r'sin(?:e)? of (\d+)': ('sine', math.sin),
466
+ r'cos(?:ine)? of (\d+)': ('cosine', math.cos),
467
+ r'tan(?:gent)? of (\d+)': ('tangent', math.tan)
468
+ }
469
+
470
+ for pattern, (name, func) in trig_patterns.items():
471
+ match = re.search(pattern, question_lower)
472
+ if match:
473
+ angle = int(match.group(1))
474
+ # Convert to radians if needed
475
+ if "degrees" in question_lower or "degree" in question_lower:
476
+ angle_rad = math.radians(angle)
477
+ result = func(angle_rad)
478
+ return f"The {name} of {angle} degrees is {result}."
479
+ else:
480
+ result = func(angle)
481
+ return f"The {name} of {angle} radians is {result}."
482
+
483
+ return "I couldn't identify a specific advanced math operation in your question."
484
+
485
+ def _generate_code_examples(self, question: str) -> str:
486
+ """Generate code examples based on the question."""
487
+ question_lower = question.lower()
488
+
489
+ # Python examples
490
+ if "python" in question_lower:
491
+ if "hello world" in question_lower:
492
+ return "Here's a Python Hello World example:\n```python\nprint(\"Hello, World!\")\n```"
493
+
494
+ elif "function" in question_lower or "def" in question_lower:
495
+ return "Here's how to define a function in Python:\n```python\ndef greet(name):\n # Return a greeting message\n return f\"Hello, {name}!\"\n\n# Example usage\nmessage = greet(\"Alice\")\nprint(message) # Output: Hello, Alice!\n```"
496
+
497
+ elif "class" in question_lower or "object" in question_lower:
498
+ return "Here's how to define a class in Python:\n```python\nclass Person:\n def __init__(self, name, age):\n self.name = name\n self.age = age\n \n def greet(self):\n return f\"Hello, my name is {self.name} and I am {self.age} years old.\"\n\n# Example usage\nperson = Person(\"Alice\", 30)\nprint(person.greet()) # Output: Hello, my name is Alice and I am 30 years old.\n```"
499
+
500
+ elif "list" in question_lower or "array" in question_lower:
501
+ return "Here's how to work with lists in Python:\n```python\n# Create a list\nfruits = [\"apple\", \"banana\", \"cherry\"]\n\n# Access elements\nprint(fruits[0]) # Output: apple\n\n# Modify elements\nfruits[1] = \"blueberry\"\nprint(fruits) # Output: ['apple', 'blueberry', 'cherry']\n\n# Add elements\nfruits.append(\"orange\")\nprint(fruits) # Output: ['apple', 'blueberry', 'cherry', 'orange']\n\n# Remove elements\nfruits.remove(\"cherry\")\nprint(fruits) # Output: ['apple', 'blueberry', 'orange']\n\n# List comprehension\nsquares = [x**2 for x in range(5)]\nprint(squares) # Output: [0, 1, 4, 9, 16]\n```"
502
+
503
+ elif "dictionary" in question_lower or "dict" in question_lower:
504
+ return "Here's how to work with dictionaries in Python:\n```python\n# Create a dictionary\nperson = {\n \"name\": \"Alice\",\n \"age\": 30,\n \"city\": \"New York\"\n}\n\n# Access values\nprint(person[\"name\"]) # Output: Alice\n\n# Modify values\nperson[\"age\"] = 31\nprint(person) # Output: {'name': 'Alice', 'age': 31, 'city': 'New York'}\n\n# Add new key-value pairs\nperson[\"email\"] = \"alice@example.com\"\nprint(person) # Output: {'name': 'Alice', 'age': 31, 'city': 'New York', 'email': 'alice@example.com'}\n\n# Remove key-value pairs\ndel person[\"city\"]\nprint(person) # Output: {'name': 'Alice', 'age': 31, 'email': 'alice@example.com'}\n\n# Dictionary comprehension\nsquares = {x: x**2 for x in range(5)}\nprint(squares) # Output: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}\n```"
505
+
506
+ # JavaScript examples
507
+ elif "javascript" in question_lower or "js" in question_lower:
508
+ if "hello world" in question_lower:
509
+ return "Here's a JavaScript Hello World example:\n```javascript\nconsole.log(\"Hello, World!\");\n```"
510
+
511
+ elif "function" in question_lower:
512
+ return "Here's how to define functions in JavaScript:\n```javascript\n// Function declaration\nfunction greet(name) {\n return `Hello, ${name}!`;\n}\n\n// Arrow function\nconst greetArrow = (name) => `Hello, ${name}!`;\n\n// Example usage\nconsole.log(greet(\"Alice\")); // Output: Hello, Alice!\nconsole.log(greetArrow(\"Bob\")); // Output: Hello, Bob!\n```"
513
+
514
+ elif "class" in question_lower or "object" in question_lower:
515
+ return "Here's how to define a class in JavaScript:\n```javascript\nclass Person {\n constructor(name, age) {\n this.name = name;\n this.age = age;\n }\n \n greet() {\n return `Hello, my name is ${this.name} and I am ${this.age} years old.`;\n }\n}\n\n// Example usage\nconst person = new Person(\"Alice\", 30);\nconsole.log(person.greet()); // Output: Hello, my name is Alice and I am 30 years old.\n```"
516
+
517
+ elif "array" in question_lower or "list" in question_lower:
518
+ return "Here's how to work with arrays in JavaScript:\n```javascript\n// Create an array\nconst fruits = [\"apple\", \"banana\", \"cherry\"];\n\n// Access elements\nconsole.log(fruits[0]); // Output: apple\n\n// Modify elements\nfruits[1] = \"blueberry\";\nconsole.log(fruits); // Output: ['apple', 'blueberry', 'cherry']\n\n// Add elements\nfruits.push(\"orange\");\nconsole.log(fruits); // Output: ['apple', 'blueberry', 'cherry', 'orange']\n\n// Remove elements\nfruits.splice(fruits.indexOf(\"cherry\"), 1);\nconsole.log(fruits); // Output: ['apple', 'blueberry', 'orange']\n\n// Array methods\nconst numbers = [1, 2, 3, 4, 5];\nconst doubled = numbers.map(x => x * 2);\nconsole.log(doubled); // Output: [2, 4, 6, 8, 10]\n```"
519
+
520
+ elif "object" in question_lower or "dict" in question_lower:
521
+ return "Here's how to work with objects in JavaScript:\n```javascript\n// Create an object\nconst person = {\n name: \"Alice\",\n age: 30,\n city: \"New York\"\n};\n\n// Access properties\nconsole.log(person.name); // Output: Alice\n\n// Modify properties\nperson.age = 31;\nconsole.log(person); // Output: {name: 'Alice', age: 31, city: 'New York'}\n\n// Add new properties\nperson.email = \"alice@example.com\";\nconsole.log(person); // Output: {name: 'Alice', age: 31, city: 'New York', email: 'alice@example.com'}\n\n// Remove properties\ndelete person.city;\nconsole.log(person); // Output: {name: 'Alice', age: 31, email: 'alice@example.com'}\n\n// Object destructuring\nconst { name, age } = person;\nconsole.log(name, age); // Output: Alice 31\n```"
522
+
523
+ return "I can provide code examples, but I need more specific information about what programming language and concept you're interested in."
524
+
525
+ def _generate_response(self, question: str, category: str) -> str:
526
+ """Generate a response based on the question category."""
527
+ if category == "greeting":
528
+ return self.response_templates["greeting"]
529
+
530
+ elif category == "identity":
531
+ return self.response_templates["identity"]
532
+
533
+ elif category == "capabilities":
534
+ return self.response_templates["capabilities"]
535
+
536
+ elif category == "math":
537
+ # Try advanced math first, then fall back to basic math
538
+ advanced_result = self.tools["advanced_math"](question)
539
+ if "couldn't identify" not in advanced_result:
540
+ return advanced_result
541
+ return self.tools["math_solver"](question)
542
+
543
+ elif category == "time":
544
+ return self.tools["time_handler"](question)
545
+
546
+ elif category == "definition":
547
+ return self.tools["definition_finder"](question)
548
+
549
+ elif category == "comparison":
550
+ return self.tools["comparison_maker"](question)
551
+
552
+ elif category == "recommendation":
553
+ return self.tools["recommendation_engine"](question)
554
+
555
+ elif category == "how_to":
556
+ # Check if it's a coding question
557
+ if any(lang in question.lower() for lang in ["code", "program", "python", "javascript", "java", "c++", "function", "class"]):
558
+ return self.tools["code_generator"](question)
559
+ return self.tools["how_to_guide"](question)
560
+
561
+ elif category == "why":
562
+ return self.tools["why_explainer"](question)
563
+
564
+ elif category == "general_knowledge":
565
+ return self.tools["general_knowledge"](question)
566
+
567
+ else:
568
+ return self.response_templates["unknown"]
569
+
570
  def __call__(self, question: str) -> str:
571
+ """Process the question and return an answer."""
572
  print(f"Agent received question (first 50 chars): {question[:50]}...")
573
+
574
+ # Handle empty or very short questions
575
+ if not question or len(question.strip()) < 3:
576
+ return "Please provide a valid question with more details so I can help you better."
577
+
578
+ # Categorize the question
579
+ category = self._categorize_question(question)
580
+ print(f"Question categorized as: {category}")
581
+
582
+ # Generate response based on category
583
+ answer = self._generate_response(question, category)
584
+
585
+ print(f"Agent returning answer: {answer[:50]}...")
586
+ return answer
587
 
588
  def run_and_submit_all( profile: gr.OAuthProfile | None):
589
  """