Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -513,33 +513,135 @@ class RaindropSearchBot:
|
|
513 |
ref_counter += 1
|
514 |
|
515 |
return output
|
516 |
-
|
517 |
def process_request(self, user_request: str) -> str:
|
518 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
519 |
try:
|
520 |
-
# Generate search
|
521 |
-
|
|
|
522 |
|
523 |
-
# Get results with fallback
|
524 |
-
google_results = self.search_with_fallback(
|
525 |
|
526 |
# Add delay before news API call
|
527 |
self.random_delay()
|
528 |
|
529 |
-
|
|
|
530 |
|
531 |
-
# Process results
|
532 |
processed_results = self.process_all_results([], google_results, news_results)
|
533 |
|
534 |
# Generate response
|
535 |
essay = self.generate_essay_response(processed_results, user_request)
|
536 |
|
|
|
537 |
return self.format_results(processed_results, essay)
|
538 |
|
539 |
except Exception as e:
|
540 |
logger.error(f"Error processing request: {e}")
|
541 |
-
return "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
542 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
543 |
def generate_search_query(self, user_request: str) -> str:
|
544 |
"""Convert user request to optimized search terms."""
|
545 |
logger.info(f"Generating search query for: {user_request}")
|
|
|
513 |
ref_counter += 1
|
514 |
|
515 |
return output
|
516 |
+
|
517 |
def process_request(self, user_request: str) -> str:
|
518 |
+
"""
|
519 |
+
Process user request with improved error handling and query generation.
|
520 |
+
|
521 |
+
Args:
|
522 |
+
user_request (str): The user's original search request
|
523 |
+
|
524 |
+
Returns:
|
525 |
+
str: Formatted results and analysis
|
526 |
+
"""
|
527 |
try:
|
528 |
+
# Generate optimized search query
|
529 |
+
search_query = self.generate_search_queries(user_request)
|
530 |
+
logger.info(f"Processing request: {search_query}")
|
531 |
|
532 |
+
# Get search results with fallback
|
533 |
+
google_results = self.search_with_fallback(search_query)
|
534 |
|
535 |
# Add delay before news API call
|
536 |
self.random_delay()
|
537 |
|
538 |
+
# Get news results
|
539 |
+
news_results = self.get_news_results(search_query)
|
540 |
|
541 |
+
# Process all results
|
542 |
processed_results = self.process_all_results([], google_results, news_results)
|
543 |
|
544 |
# Generate response
|
545 |
essay = self.generate_essay_response(processed_results, user_request)
|
546 |
|
547 |
+
# Format and return results
|
548 |
return self.format_results(processed_results, essay)
|
549 |
|
550 |
except Exception as e:
|
551 |
logger.error(f"Error processing request: {e}")
|
552 |
+
return f"""
|
553 |
+
An error occurred while processing your request: {str(e)}
|
554 |
+
|
555 |
+
Please try again with a different search query or contact support if the problem persists.
|
556 |
+
"""
|
557 |
+
|
558 |
+
def generate_search_queries(self, user_request: str) -> str:
|
559 |
+
"""
|
560 |
+
Generate optimized search queries from user request.
|
561 |
+
|
562 |
+
Args:
|
563 |
+
user_request (str): The original user query
|
564 |
+
|
565 |
+
Returns:
|
566 |
+
str: Optimized search query
|
567 |
+
"""
|
568 |
+
try:
|
569 |
+
# Clean and preprocess the user request
|
570 |
+
cleaned_request = self.preprocess_query(user_request)
|
571 |
+
|
572 |
+
# Generate search query using GPT
|
573 |
+
prompt = f"""
|
574 |
+
Convert this search request into an optimized search query using proper search operators.
|
575 |
+
Request: {cleaned_request}
|
576 |
+
|
577 |
+
Guidelines:
|
578 |
+
- Focus on key concepts and synonyms
|
579 |
+
- Use combination of keywords that would appear in titles or descriptions
|
580 |
+
- Return only the search terms, no explanation
|
581 |
+
- Include alternative phrasings
|
582 |
+
- Keep it concise (max 6-8 key terms/phrases)
|
583 |
+
- use the formatting authorised in raindrop search:
|
584 |
+
o use " for exact search (ex: "artificial intelligence")
|
585 |
+
o use - to exclude some terms (ex: -math) // Do not exclude terms that are potentially relevant
|
586 |
+
o use match:OR for alternatives (ex: apple match:OR banana )
|
587 |
+
o use match:AND for inclusion of both cases systematically (ex: apple match:AND banana )
|
588 |
+
o use parenthesis for combinations ( ex: sugar match:AND (banana match:OR apple) )
|
589 |
+
|
590 |
+
Example elaborate request: ("artificial intelligence" match:OR AI) -"machine learning"
|
591 |
+
Use your judgement, think step by steps.
|
592 |
+
Return only the search query terms.
|
593 |
+
"""
|
594 |
+
|
595 |
+
response = self.client.chat.completions.create(
|
596 |
+
model="gpt-4-mini",
|
597 |
+
messages=[{"role": "user", "content": prompt}],
|
598 |
+
temperature=0.3,
|
599 |
+
max_tokens=100
|
600 |
+
)
|
601 |
+
|
602 |
+
optimized_query = response.choices[0].message.content.strip()
|
603 |
+
logger.info(f"Generated search query: {optimized_query}")
|
604 |
+
|
605 |
+
return optimized_query
|
606 |
+
|
607 |
+
except Exception as e:
|
608 |
+
logger.error(f"Error generating search queries: {e}")
|
609 |
+
# Fallback to using the original request if query generation fails
|
610 |
+
return user_request
|
611 |
|
612 |
+
def preprocess_query(self, query: str) -> str:
|
613 |
+
"""
|
614 |
+
Preprocess the user query to remove unnecessary elements and standardize format.
|
615 |
+
|
616 |
+
Args:
|
617 |
+
query (str): Original query string
|
618 |
+
|
619 |
+
Returns:
|
620 |
+
str: Cleaned query string
|
621 |
+
"""
|
622 |
+
try:
|
623 |
+
# Convert to lowercase
|
624 |
+
query = query.lower()
|
625 |
+
|
626 |
+
# Remove extra whitespace
|
627 |
+
query = ' '.join(query.split())
|
628 |
+
|
629 |
+
# Remove special characters except basic punctuation
|
630 |
+
query = re.sub(r'[^a-z0-9\s\'".,?!-]', '', query)
|
631 |
+
|
632 |
+
# Remove multiple punctuation marks
|
633 |
+
query = re.sub(r'([.,?!])\1+', r'\1', query)
|
634 |
+
|
635 |
+
# Ensure proper spacing around quotes
|
636 |
+
query = re.sub(r'(?<=[^\s])"', ' "', query)
|
637 |
+
query = re.sub(r'"(?=[^\s])', '" ', query)
|
638 |
+
|
639 |
+
return query
|
640 |
+
|
641 |
+
except Exception as e:
|
642 |
+
logger.error(f"Error preprocessing query: {e}")
|
643 |
+
return query
|
644 |
+
|
645 |
def generate_search_query(self, user_request: str) -> str:
|
646 |
"""Convert user request to optimized search terms."""
|
647 |
logger.info(f"Generating search query for: {user_request}")
|