import gradio as gr import asyncio from smolagents import CodeAgent, tool, InferenceClientModel from bs4 import BeautifulSoup import duckduckgo_search import os token = os.environ.get("HUGGINGFACE_TOKEN", "") @tool def web_search_duckduckgo(query: str) -> list: """ Выполняет поиск через DuckDuckGo. Args: query (str): поисковый запрос. Returns: list: список найденных URL. """ results = duckduckgo_search.DDGS().text(query) urls = [r["href"] for r in results] return urls @tool def fetch_html(url: str) -> str: """ Загружает HTML по URL. Args: url (str): адрес страницы. Returns: str: HTML-текст страницы. """ import requests resp = requests.get(url, timeout=10) resp.raise_for_status() return resp.text @tool def extract_text_from_html(html: str) -> str: """ Извлекает текст из HTML. Args: html (str): HTML-документ. Returns: str: текстовое содержимое документа. """ from bs4 import BeautifulSoup soup = BeautifulSoup(html, "html.parser") return soup.get_text("\n") @tool def summarize_and_extract_architecture(text: str) -> str: """ Анализирует текст статьи и извлекает архитектуру описанной системы. Args: text (str): Полный текст статьи или её фрагмент, в котором описана система. Returns: str: Структурированное текстовое описание архитектуры системы (компоненты, связи, потоки данных, этапы обработки). """ model = InferenceClientModel(model_id="facebook/bart-large-cnn") prompt = f""" Ты — эксперт по анализу научных статей. Текст статьи: {text} Создай краткое содержание, в которое будет входит анализ публикаци – научное направление, цель исследования, использованные методы, полученные результаты  """ return model(prompt) model = InferenceClientModel(model_id="Qwen/Qwen2.5-7B-Instruct", token = token) agent = CodeAgent( model=model, tools=[web_search_duckduckgo, fetch_html, extract_text_from_html, summarize_and_extract_architecture], add_base_tools=False, ) def process_article(article_title): """ Функция для обработки запроса статьи. Вызывает мультиагента для поиска и суммаризации. """ try: # Если ваш агент использует асинхронные вызовы if hasattr(agent, 'run_async'): # Создаем новую event loop для асинхронного вызова loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) result = loop.run_until_complete(agent.run_async(article_title)) loop.close() else: # Если агент синхронный result = agent.run(article_title) return result except Exception as e: return f"Произошла ошибка: {str(e)}" # Альтернативный более простой интерфейс (если нужен минималистичный вариант) def create_simple_interface(): """Простой интерфейс для быстрого тестирования""" def simple_process(article_title): if not article_title.strip(): return "Пожалуйста, введите название статьи." return process_article(article_title) interface = gr.Interface( fn=simple_process, inputs=gr.Textbox( label="Название статьи", placeholder="Например: 'Deep Learning in Computer Vision'", lines=2 ), outputs=gr.Textbox( label="Результат", lines=15, placeholder="Результат появится здесь..." ), title="📄 Поиск и суммаризация статей", description="Введите название статьи, и агент найдет ее и создаст краткое содержание.", examples=[ ["Neural Networks and Deep Learning"], ["Renewable Energy Technologies Review"], ["COVID-19 Vaccines Development and Efficacy"] ], theme=gr.themes.Soft() ) return interface if __name__ == "__main__": demo = create_simple_interface() demo.launch( server_name="0.0.0.0", server_port=7860, share=False, debug=True )