multiagent-2 / app.py
i-timur's picture
.
078f638
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
)