Spaces:
Running
Running
File size: 2,961 Bytes
c02d868 ae12037 a9e9116 667e88a ae12037 c02d868 ae12037 a9e9116 ae12037 a9e9116 c02d868 a9e9116 ae12037 a9e9116 ae12037 427cae4 ae12037 a9e9116 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import requests
import urllib.parse
from bs4 import BeautifulSoup
class DuckDuckGoAgent:
def __init__(self):
print("DuckDuckGoAgent initialized.")
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
self.gemini_api_key = None # Opcional: pon aquí tu clave si usas Gemini
def get_duckduckgo_answer(self, query: str) -> str:
search_query = urllib.parse.quote(query)
url = f"https://api.duckduckgo.com/?q={search_query}&format=json&no_html=1&skip_disambig=1"
try:
response = requests.get(url, timeout=10)
if response.status_code == 200:
data = response.json()
if data.get('AbstractText'):
return data['AbstractText'][:200]
else:
return self.scrape_duckduckgo(query) # Fallback
else:
return self.scrape_duckduckgo(query)
except Exception as e:
print(f"Error in API: {e}")
return self.scrape_duckduckgo(query)
def scrape_duckduckgo(self, query: str) -> str:
print("Using fallback: scraping HTML results.")
try:
response = requests.post(
"https://html.duckduckgo.com/html/",
data={"q": query},
headers=self.headers,
timeout=10
)
soup = BeautifulSoup(response.text, "html.parser")
snippets = soup.select(".result__snippet")
for s in snippets:
text = s.get_text().strip()
if text:
return text[:200]
return "No se encontró una respuesta adecuada en DuckDuckGo."
except Exception as e:
print(f"Scraping error: {e}")
return self.call_gemini_backup(query)
def call_gemini_backup(self, prompt: str) -> str:
if not self.gemini_api_key:
return "Error al contactar con DuckDuckGo."
try:
response = requests.post(
"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent",
headers={"Content-Type": "application/json"},
params={"key": self.gemini_api_key},
json={"contents": [{"parts": [{"text": prompt}]}]},
timeout=15
)
if response.status_code == 200:
data = response.json()
text = data["candidates"][0]["content"]["parts"][0]["text"]
return text.strip()[:200]
else:
return "Error con Gemini 2.0."
except Exception as e:
print(f"Gemini fallback error: {e}")
return "Error al contactar con DuckDuckGo."
def __call__(self, question: str) -> str:
print(f"Agent received question: {question[:50]}...")
return self.get_duckduckgo_answer(question)
|