File size: 3,543 Bytes
73152bb
c02d868
ae12037
a9e9116
667e88a
ae12037
c02d868
ae12037
a9e9116
73152bb
a9e9116
 
ae12037
 
 
a9e9116
 
 
 
 
73152bb
a9e9116
 
73152bb
 
a9e9116
73152bb
a9e9116
 
73152bb
a9e9116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73152bb
 
a9e9116
 
73152bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a9e9116
 
73152bb
 
 
 
 
 
 
ae12037
73152bb
a9e9116
73152bb
 
427cae4
ae12037
73152bb
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import requests
import urllib.parse
from bs4 import BeautifulSoup

class DuckDuckGoAgent:
    def __init__(self):
        print("DuckDuckGoAgent initialized.")
        self.headers = {
            "User-Agent": "Mozilla/5.0"
        }

    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 'AbstractText' in data and data['AbstractText']:
                    return data['AbstractText'][:200]
                else:
                    print("No abstract found, falling back to scraping.")
                    return self.scrape_duckduckgo(query)
            else:
                print(f"DuckDuckGo API failed: {response.status_code}")
                return self.scrape_duckduckgo(query)
        except Exception as e:
            print(f"Error contacting DuckDuckGo 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]
            print("No useful snippets found, using Hugging Face LLM.")
            return self.call_huggingface_llm(query)
        except Exception as e:
            print(f"Scraping error: {e}")
            return self.call_huggingface_llm(query)

    def call_huggingface_llm(self, prompt: str) -> str:
        hf_api_key = os.getenv("HF_API_TOKEN")
        model = "mistralai/Mistral-7B-Instruct-v0.1"

        if not hf_api_key:
            return "Error: Hugging Face API Token no configurado."

        url = f"https://api-inference.huggingface.co/models/{model}"
        headers = {
            "Authorization": f"Bearer {hf_api_key}",
            "Content-Type": "application/json"
        }

        payload = {
            "inputs": prompt,
            "parameters": {
                "max_new_tokens": 200,
                "temperature": 0.7
            }
        }

        try:
            response = requests.post(url, headers=headers, json=payload, timeout=30)
            response.raise_for_status()
            output = response.json()
            if isinstance(output, list) and "generated_text" in output[0]:
                return output[0]["generated_text"].strip()[:200]
            elif isinstance(output, dict) and "error" in output:
                return f"HF LLM error: {output['error']}"
            else:
                return "No se pudo obtener respuesta del LLM."
        except Exception as e:
            print(f"Error en Hugging Face LLM: {e}")
            return "Error al contactar con el modelo Hugging Face."

    def __call__(self, question: str) -> str:
        print(f"Agent received question (first 50 chars): {question[:50]}...")
        answer = self.get_duckduckgo_answer(question)
        print(f"Agent returning answer: {answer}")
        return answer