Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,61 +1,108 @@
|
|
1 |
-
from smolagents import CodeAgent,
|
2 |
-
import datetime
|
3 |
-
import requests
|
4 |
-
import pytz
|
5 |
import yaml
|
|
|
|
|
|
|
6 |
from tools.final_answer import FinalAnswerTool
|
7 |
|
8 |
from Gradio_UI import GradioUI
|
9 |
|
10 |
-
|
11 |
@tool
|
12 |
-
def
|
13 |
-
#Keep this format for the description / args / args description but feel free to modify the tool
|
14 |
-
"""A tool that does nothing yet
|
15 |
-
Args:
|
16 |
-
arg1: the first argument
|
17 |
-
arg2: the second argument
|
18 |
"""
|
19 |
-
|
20 |
|
21 |
-
@tool
|
22 |
-
def get_current_time_in_timezone(timezone: str) -> str:
|
23 |
-
"""A tool that fetches the current local time in a specified timezone.
|
24 |
Args:
|
25 |
-
|
26 |
"""
|
27 |
-
|
28 |
-
#
|
29 |
-
|
30 |
-
|
31 |
-
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
|
32 |
-
return f"The current local time in {timezone} is: {local_time}"
|
33 |
-
except Exception as e:
|
34 |
-
return f"Error fetching time for timezone '{timezone}': {str(e)}"
|
35 |
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
-
final_answer = FinalAnswerTool()
|
38 |
|
39 |
-
|
40 |
-
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
|
41 |
|
42 |
model = HfApiModel(
|
43 |
-
max_tokens=2096,
|
44 |
-
temperature=0.5,
|
45 |
-
model_id='Qwen/Qwen2.5-Coder-32B-Instruct'
|
46 |
-
custom_role_conversions=None,
|
47 |
)
|
48 |
|
49 |
-
|
50 |
# Import tool from Hub
|
51 |
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
|
52 |
|
|
|
53 |
with open("prompts.yaml", 'r') as stream:
|
54 |
prompt_templates = yaml.safe_load(stream)
|
55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
agent = CodeAgent(
|
57 |
model=model,
|
58 |
-
tools=[final_answer],
|
59 |
max_steps=6,
|
60 |
verbosity_level=1,
|
61 |
grammar=None,
|
|
|
1 |
+
from smolagents import CodeAgent, HfApiModel, load_tool
|
|
|
|
|
|
|
2 |
import yaml
|
3 |
+
from smolagents import tool
|
4 |
+
from duckduckgo_search import DDGS
|
5 |
+
|
6 |
from tools.final_answer import FinalAnswerTool
|
7 |
|
8 |
from Gradio_UI import GradioUI
|
9 |
|
10 |
+
|
11 |
@tool
|
12 |
+
def DuckDuckGoSearchTool(query: str) -> str:
|
|
|
|
|
|
|
|
|
|
|
13 |
"""
|
14 |
+
Инструмент для поиска информации в интернете с помощью DuckDuckGo.
|
15 |
|
|
|
|
|
|
|
16 |
Args:
|
17 |
+
query: Поисковый запрос.
|
18 |
"""
|
19 |
+
with DDGS() as ddgs:
|
20 |
+
results = [r for r in ddgs.text(query, max_results=5)] # Ограничиваем до 5 результатов
|
21 |
+
if not results:
|
22 |
+
return "По вашему запросу ничего не найдено."
|
|
|
|
|
|
|
|
|
23 |
|
24 |
+
formatted_results = "\n\n".join(
|
25 |
+
f"**Заголовок:** {r['title']}\n**Ссылка:** {r['href']}\n**Краткое содержание:** {r['body']}"
|
26 |
+
for r in results
|
27 |
+
)
|
28 |
+
return formatted_results
|
29 |
|
|
|
30 |
|
31 |
+
final_answer = FinalAnswerTool()
|
|
|
32 |
|
33 |
model = HfApiModel(
|
34 |
+
max_tokens=2096,
|
35 |
+
temperature=0.5,
|
36 |
+
model_id='Qwen/Qwen2.5-Coder-32B-Instruct', # Возможно, эта модель перегружена
|
37 |
+
custom_role_conversions=None,
|
38 |
)
|
39 |
|
|
|
40 |
# Import tool from Hub
|
41 |
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
|
42 |
|
43 |
+
|
44 |
with open("prompts.yaml", 'r') as stream:
|
45 |
prompt_templates = yaml.safe_load(stream)
|
46 |
+
|
47 |
+
# Ключевое изменение: обновленный system_prompt в стиле Thought-Action-Observation
|
48 |
+
system_prompt = """
|
49 |
+
Ты — профессиональный поисковый ассистент, аналог Perplexity. Твоя задача — предоставлять исчерпывающие и точные ответы на запросы пользователей, основываясь на информации из нескольких источников в интернете.
|
50 |
+
|
51 |
+
Ты должен действовать в цикле **Thought-Action-Observation**:
|
52 |
+
|
53 |
+
* **Thought:** Сначала обдумай задачу. Определи, какую информацию нужно найти и какие шаги предпринять. Сформулируй план действий. *Всегда начинай с Thought.*
|
54 |
+
* **Action:** Выполни действие, используя доступные инструменты. В твоем распоряжении *только* инструмент `DuckDuckGoSearchTool` для поиска и `final_answer` для окончательного ответа. Используй `DuckDuckGoSearchTool` с правильным аргументом (`query`). Код должен быть на Python и заключен в теги ` ```py ` и ` ```<end_code> `.
|
55 |
+
* **Observation:** Получи результат действия (вывод `print()` в коде). Оцени результат. Если нужно, перейди к следующему шагу (Thought). Если ответ найден, используй `final_answer`.
|
56 |
+
|
57 |
+
**Правила:**
|
58 |
+
|
59 |
+
1. **Всегда следуй циклу Thought-Action-Observation.** Каждый шаг должен присутствовать.
|
60 |
+
2. **Используй только доступные инструменты.** Не выдумывай несуществующие инструменты.
|
61 |
+
3. **Правильно вызывай инструменты.** Передавай аргументы *напрямую*, а не в виде словаря. Например, `DuckDuckGoSearchTool(query="столица Франции")`, а не `DuckDuckGoSearchTool({"query": "столица Франции"})`.
|
62 |
+
4. **Анализируй несколько источников.** Не ограничивайся одним результатом поиска.
|
63 |
+
5. **Формируй сводку (саммари).** Ответ должен быть кратким, ёмким и содержать ссылки на источники (или названия сайтов, если ссылки не помещаются).
|
64 |
+
6. **Пиши на русском языке.**
|
65 |
+
7. **Если информации недостаточно, сообщи об этом.** Не придумывай ответ.
|
66 |
+
8. **Не сохраняй результаты поиска в переменные для следующего шага. Используй `print()`.** Результат `print()` автоматически попадет в Observation. Это *единственный* способ передать информацию между шагами.
|
67 |
+
9. **Переменные сохраняются между шагами.** Если ты определил переменную на одном шаге, она будет доступна на следующих.
|
68 |
+
10. **Нельзя использовать один и тот же запрос дважды.** Если ты уже искал что-то, не повторяй поиск с тем же запросом.
|
69 |
+
|
70 |
+
**Пример (не копируй его полностью, адаптируй под задачу):**
|
71 |
+
|
72 |
+
Пользователь: Какая самая высокая гора в мире?
|
73 |
+
|
74 |
+
Thought: Мне нужно найти самую высокую гору в мире. Я буду использовать DuckDuckGoSearchTool для поиска информации.
|
75 |
+
Action:
|
76 |
+
```py
|
77 |
+
print(DuckDuckGoSearchTool(query="самая высокая гора в мире"))
|
78 |
+
```<end_code>
|
79 |
+
Observation: (Здесь будет вывод DuckDuckGoSearchTool, содержащий несколько результатов поиска)
|
80 |
+
|
81 |
+
Thought: Я получил несколько результатов. Нужно проанализировать их, найти наиболее авторитетные источники и убедиться, что информация совпадает. Затем я сформирую сводку и верну ответ.
|
82 |
+
Action:
|
83 |
+
```py
|
84 |
+
# (Здесь мог бы быть код для дополнительного анализа, если бы были другие инструменты.
|
85 |
+
# Но так как у нас только DuckDuckGoSearchTool,
|
86 |
+
# мы предполагаем, что первый шаг уже дал достаточно информации)
|
87 |
+
final_answer("Самая высокая гора в мире - Эверест (Джомолунгма). Высота - 8848.86 метров. Источники: Википедия (ссылка), National Geographic (ссылка).")
|
88 |
+
```<end_code>
|
89 |
+
|
90 |
+
---
|
91 |
+
Доступные тебе инструменты:
|
92 |
+
{%- for tool in tools.values() %}
|
93 |
+
- {{ tool.name }}: {{ tool.description }}
|
94 |
+
Takes inputs: {{tool.inputs}}
|
95 |
+
Returns an output of type: {{tool.output_type}}
|
96 |
+
{%- endfor %}
|
97 |
+
|
98 |
+
Начни!
|
99 |
+
"""
|
100 |
+
prompt_templates['system_prompt'] = system_prompt
|
101 |
+
|
102 |
+
|
103 |
agent = CodeAgent(
|
104 |
model=model,
|
105 |
+
tools=[DuckDuckGoSearchTool, final_answer, image_generation_tool],
|
106 |
max_steps=6,
|
107 |
verbosity_level=1,
|
108 |
grammar=None,
|