Una implementación de codificación para crear un agente avanzado de inteligencia web con Tavily y Gemini AI

En este tutorial, presentamos un agente de inteligencia web avanzado e interactivo impulsado por Tavily y Géminis Ai de Google. Aprenderemos cómo configurar y usar este agente inteligente para extraer sin problemas contenido estructurado de las páginas web, realizar análisis sofisticados de IA y presentar resultados perspicaces. Con indicaciones para el usuario e interactivas, el manejo de errores sólidos y una interfaz terminal visualmente atractiva, esta herramienta ofrece un entorno intuitivo y potente para explorar la extracción de contenido web y el análisis de contenido basado en IA.

import os
import json
import asyncio
from typing import List, Dict, Any
from dataclasses import dataclass
from rich.console import Console
from rich.progress import track
from rich.panel import Panel
from rich.markdown import Markdown

Importamos y configuramos bibliotecas esenciales para manejar estructuras de datos, programación asincrónica y anotaciones de tipo, junto con una biblioteca rica que permite salidas terminales visualmente atractivas. Estos módulos facilitan colectivamente la ejecución eficiente, estructurada e interactiva de tareas de inteligencia web dentro del cuaderno.

from langchain_tavily import TavilyExtract
from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent

Inicializamos los componentes esenciales de Langchain: TavilyExtract habilita la recuperación avanzada de contenido web, init_chat_model establece el modelo de chat de Gemini con AI, y Crear_react_agent construye un agente dinámico basado en el razonamiento capaz de la toma de decisiones inteligente durante las tareas de análisis web. Juntas, estas herramientas forman el motor central para los sofisticados flujos de trabajo de inteligencia web impulsados ​​por la IA.

@dataclass
class WebIntelligence:
    """Web Intelligence Configuration"""
    tavily_key: str = os.getenv("TAVILY_API_KEY", "")
    google_key: str = os.getenv("GOOGLE_API_KEY", "")
    extract_depth: str = "advanced"
    max_urls: int = 10

Mira el Cuaderno aquí

WebIntelligence DataClass sirve como un contenedor de configuración estructurado, contiene las claves API para Tavily y Google Gemini, y configurando los parámetros de extracción como Extract_Depth y el número máximo de URL (max_urls). Simplifica la administración y el acceso de la configuración crucial, asegurando la integración y la personalización de las tareas de extracción de contenido web dentro del agente de inteligencia.

@dataclass
class WebIntelligence:
    """Web Intelligence Configuration"""
    tavily_key: str = os.getenv("TAVILY_API_KEY", "")
    google_key: str = os.getenv("GOOGLE_API_KEY", "")
    extract_depth: str = "advanced"
    max_urls: int = 10
The WebIntelligence dataclass serves as a structured configuration container, holding API keys for Tavily and Google Gemini, and setting extraction parameters like extract_depth and the maximum number of URLs (max_urls). It simplifies the management and access of crucial settings, ensuring seamless integration and customization of web content extraction tasks within the intelligence agent.

class SmartWebAgent:
    """Intelligent Web Content Extraction & Analysis Agent"""
   
    def __init__(self, config: WebIntelligence):
        self.config = config
        self.console = Console()
        self._setup_environment()
        self._initialize_tools()
   
    def _setup_environment(self):
        """Setup API keys with interactive prompts"""
        if not self.config.tavily_key:
            self.config.tavily_key = input("🔑 Enter Tavily API Key: ")
            os.environ["TAVILY_API_KEY"] = self.config.tavily_key
           
        if not self.config.google_key:
            self.config.google_key = input("🔑 Enter Google Gemini API Key: ")
            os.environ["GOOGLE_API_KEY"] = self.config.google_key
   
    def _initialize_tools(self):
        """Initialize AI tools and agents"""
        self.console.print("🛠️  Initializing AI Tools...", style="bold blue")
       
        try:
            self.extractor = TavilyExtract(
                extract_depth=self.config.extract_depth,
                include_images=False,  
                include_raw_content=False,
                max_results=3
            )
           
            self.llm = init_chat_model(
                "gemini-2.0-flash",
                model_provider="google_genai",
                temperature=0.3,
                max_tokens=1024
            )
           
            test_response = self.llm.invoke("Say 'AI tools initialized successfully!'")
            self.console.print(f"✅ LLM Test: {test_response.content}", style="green")
           
            self.agent = create_react_agent(self.llm, [self.extractor])
           
            self.console.print("✅ AI Agent Ready!", style="bold green")
           
        except Exception as e:
            self.console.print(f"❌ Initialization Error: {e}", style="bold red")
            self.console.print("💡 Check your API keys and internet connection", style="yellow")
            raise
   
    def extract_content(self, urls: List[str]) -> Dict[str, Any]:
        """Extract and structure content from URLs"""
        results = {}
       
        for url in track(urls, description="🌐 Extracting content..."):
            try:
                response = self.extractor.invoke({"urls": [url]})
                content = json.loads(response.content) if isinstance(response.content, str) else response.content
                results[url] = {
                    "status": "success",
                    "data": content,
                    "summary": content.get("summary", "No summary available")[:200] + "..."
                }
            except Exception as e:
                results[url] = {"status": "error", "error": str(e)}
       
        return results
   
    def analyze_with_ai(self, query: str, urls: List[str] = None) -> str:
        """Intelligent analysis using AI agent"""
        try:
            if urls:
                message = f"Use the tavily_extract tool to analyze these URLs and answer: {query}\nURLs: {urls}"
            else:
                message = query
               
            self.console.print(f"🤖 AI Analysis: {query}", style="bold magenta")
           
            messages = [{"role": "user", "content": message}]
           
            all_content = []
            with self.console.status("🔄 AI thinking..."):
                try:
                    for step in self.agent.stream({"messages": messages}, stream_mode="values"):
                        if "messages" in step and step["messages"]:
                            for msg in step["messages"]:
                                if hasattr(msg, 'content') and msg.content and msg.content not in all_content:
                                    all_content.append(str(msg.content))
                except Exception as stream_error:
                    self.console.print(f"⚠️ Stream error: {stream_error}", style="yellow")
           
            if not all_content:
                self.console.print("🔄 Trying direct AI invocation...", style="yellow")
                try:
                    response = self.llm.invoke(message)
                    return str(response.content) if hasattr(response, 'content') else str(response)
                except Exception as direct_error:
                    self.console.print(f"⚠️ Direct error: {direct_error}", style="yellow")
                   
                    if urls:
                        self.console.print("🔄 Extracting content first...", style="blue")
                        extracted = self.extract_content(urls)
                        content_summary = "\n".join([
                            f"URL: {url}\nContent: {result.get('summary', 'No content')}\n"
                            for url, result in extracted.items() if result.get('status') == 'success'
                        ])
                       
                        fallback_query = f"Based on this content, {query}:\n\n{content_summary}"
                        response = self.llm.invoke(fallback_query)
                        return str(response.content) if hasattr(response, 'content') else str(response)
           
            return "\n".join(all_content) if all_content else "❌ Unable to generate response. Please check your API keys and try again."
           
        except Exception as e:
            return f"❌ Analysis failed: {str(e)}\n\nTip: Make sure your API keys are valid and you have internet connectivity."
   
    def display_results(self, results: Dict[str, Any]):
        """Beautiful result display"""
        for url, result in results.items():
            if result["status"] == "success":
                panel = Panel(
                    f"🔗 [bold blue]{url}[/bold blue]\n\n{result['summary']}",
                    title="✅ Extracted Content",
                    border_style="green"
                )
            else:
                panel = Panel(
                    f"🔗 [bold red]{url}[/bold red]\n\n❌ Error: {result['error']}",
                    title="❌ Extraction Failed",
                    border_style="red"
                )
            self.console.print(panel)

Mira el Cuaderno aquí

La clase SmartWagent encapsula un sistema inteligente de extracción y análisis de contenido web, utilizando API de Tavily y Gemini AI de Google. Interactivamente establece herramientas esenciales, maneja las claves API de forma segura, extrae datos estructurados de las URL proporcionadas y aprovecha un agente impulsado por IA para realizar análisis de contenido perspicaces. Además, utiliza salidas visuales ricas para comunicar resultados, mejorando así la legibilidad y la experiencia del usuario durante las tareas interactivas.

def run_async_safely(coro):
    """Run async function safely in any environment"""
    try:
        loop = asyncio.get_running_loop()
        import nest_asyncio
        nest_asyncio.apply()
        return asyncio.run(coro)
    except RuntimeError:
        return asyncio.run(coro)
    except ImportError:
        print("⚠️  Running in sync mode. Install nest_asyncio for better performance.")
        return None

Mira el Cuaderno aquí

La función run_async_safely garantiza que las funciones asincrónicas se ejecuten de manera confiable en diversos entornos de Python, como scripts estándar y cuadernos interactivos. Intenta adaptar los bucles de eventos existentes con la ayuda de Nest_asyncio; Si no está disponible, maneja con gracia el escenario, informando al usuario y por defecto a la ejecución síncrona como un respaldo.

def main():
    """Interactive Web Intelligence Demo"""
    console = Console()
    console.print(Panel("🚀 Web Intelligence Agent", style="bold cyan", subtitle="Powered by Tavily & Gemini"))
   
    config = WebIntelligence()
    agent = SmartWebAgent(config)
   
    demo_urls = [
        "https://en.wikipedia.org/wiki/Artificial_intelligence",
        "https://en.wikipedia.org/wiki/Machine_learning",
        "https://en.wikipedia.org/wiki/Quantum_computing"
    ]
   
    while True:
        console.print("\n" + "="*60)
        console.print("🎯 Choose an option:", style="bold yellow")
        console.print("1. Extract content from URLs")
        console.print("2. AI-powered analysis")
        console.print("3. Demo with sample URLs")
        console.print("4. Exit")
       
        choice = input("\nEnter choice (1-4): ").strip()
       
        if choice == "1":
            urls_input = input("Enter URLs (comma-separated): ")
            urls = [url.strip() for url in urls_input.split(",")]
            results = agent.extract_content(urls)
            agent.display_results(results)
           
        elif choice == "2":
            query = input("Enter your analysis query: ")
            urls_input = input("Enter URLs to analyze (optional, comma-separated): ")
            urls = [url.strip() for url in urls_input.split(",") if url.strip()] if urls_input.strip() else None
           
            try:
                response = agent.analyze_with_ai(query, urls)
                console.print(Panel(Markdown(response), title="🤖 AI Analysis", border_style="blue"))
            except Exception as e:
                console.print(f"❌ Analysis failed: {e}", style="bold red")
           
        elif choice == "3":
            console.print("🎬 Running demo with AI & Quantum Computing URLs...")
            results = agent.extract_content(demo_urls)
            agent.display_results(results)
           
            response = agent.analyze_with_ai(
                "Compare AI, ML, and Quantum Computing. What are the key relationships?",
                demo_urls
            )
            console.print(Panel(Markdown(response), title="🧠 Comparative Analysis", border_style="magenta"))
           
        elif choice == "4":
            console.print("👋 Goodbye!", style="bold green")
            break
        else:
            console.print("❌ Invalid choice!", style="bold red")


if __name__ == "__main__":
    main()

Mira el Cuaderno aquí

La función principal proporciona una demostración de línea de comandos interactiva del agente de inteligencia web inteligente. Presenta a los usuarios un menú intuitivo que les permite extraer contenido web de URL personalizadas, realizar análisis sofisticados de IA en temas seleccionados o explorar demostraciones predefinidas que involucran IA, aprendizaje automático y computación cuántica. El formato visual rico mejora la participación del usuario, lo que hace que las tareas de análisis web complejas sean directas y fáciles de usar.

En conclusión, siguiendo este tutorial integral, hemos creado un agente de inteligencia web mejorado mejorado capaz de una sofisticada extracción de contenido web y un análisis inteligente utilizando la IA Gemini de Google. A través de la extracción de datos estructurados, las consultas de IA dinámica y los resultados visualmente atractivos, este poderoso agente agiliza las tareas de investigación, enriquece sus flujos de trabajo de análisis de datos y fomenta ideas más profundas del contenido web. Con esta base, ahora estamos equipados para extender este agente aún más, personalizarlo para casos de uso específicos y aprovechar el poder combinado de IA e inteligencia web para mejorar la productividad y la toma de decisiones en nuestros proyectos.


Mira el Cuaderno aquí. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro 95k+ ml de subreddit y suscribirse a Nuestro boletín.


Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.