File size: 5,100 Bytes
c5fcc79
29dbcf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5fcc79
29dbcf6
 
 
 
 
 
 
c5fcc79
29dbcf6
c5fcc79
29dbcf6
 
c5fcc79
29dbcf6
 
 
 
 
 
 
c5fcc79
29dbcf6
 
 
 
c5fcc79
29dbcf6
 
c5fcc79
29dbcf6
 
 
 
 
 
c5fcc79
 
29dbcf6
 
 
 
c5fcc79
29dbcf6
 
 
 
 
 
 
078f638
29dbcf6
 
 
 
 
 
a1af291
c5fcc79
29dbcf6
 
fc945a3
29dbcf6
 
 
 
 
c5fcc79
 
29dbcf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5fcc79
29dbcf6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5fcc79
 
29dbcf6
 
 
 
 
 
 
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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
    )