|
from typing import List |
|
from duckduckgo_search import DDGS |
|
import requests |
|
import os |
|
|
|
|
|
|
|
def simple_search(query: str, max_results: int = 3) -> List[str]: |
|
""" |
|
Perform a DuckDuckGo search and return a list of strings summarizing the top results. |
|
""" |
|
with DDGS() as ddgs: |
|
raw_results = list(ddgs.text(query, max_results=max_results)) |
|
|
|
results = [] |
|
for r in raw_results: |
|
try: |
|
title = r.get("title", "") |
|
link = r.get("href") or r.get("link", "") |
|
summary = f"{title} - {link}" |
|
results.append(summary) |
|
except Exception as e: |
|
print("Skipping malformed search result:", r, "Error:", e) |
|
|
|
return results |
|
|
|
|
|
|
|
def jina_search_tool(query: str, api_key: str) -> List[str]: |
|
""" |
|
Perform a web search using Jina AI's s.jina.ai endpoint and retrieve clean, LLM-friendly content. |
|
""" |
|
api_endpoint = f"https://s.jina.ai/{query.replace(' ', '+')}" |
|
headers = { |
|
"Authorization": f"Bearer {api_key}", |
|
"Accept": "application/json", |
|
"User-Agent": "Mozilla/5.0" |
|
} |
|
|
|
try: |
|
response = requests.get(api_endpoint, headers=headers, timeout=10) |
|
if response.status_code == 200: |
|
data = response.json() |
|
contents = [item.get("content", "") for item in data.get("results", [])] |
|
return contents |
|
else: |
|
print(f"Failed to fetch search results: Status code {response.status_code}") |
|
return [] |
|
except Exception as e: |
|
print(f"Error fetching search results: {e}") |
|
return [] |
|
|