File size: 4,240 Bytes
5ed6f3b 9b5b26a c19d193 6aae614 9b5b26a 9e8f79d d3f4ae6 1056355 e27cd26 d3f4ae6 e27cd26 1056355 d3f4ae6 1056355 d3f4ae6 e27cd26 d3f4ae6 1056355 d3f4ae6 9b5b26a d3f4ae6 1ce23aa d3f4ae6 1ce23aa d3f4ae6 1ce23aa 5ed6f3b c5e9a1e 8c01ffb 9206cbc 1ce23aa d3f4ae6 1ce23aa 9206cbc 8c01ffb 861422e 1ce23aa 8fe992b 9206cbc 8c01ffb |
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 |
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
@tool
def generate_keywords(topic: str, max_keywords: int = 30) -> str:
"""Генерирует релевантные ключевые слова для заданной темы
Args:
topic: Тема для генерации (на русском языке)
max_keywords: Максимальное количество возвращаемых ключевых слов
"""
import random
from collections import deque
# Инициализация компонентов генерации
base_words = [w.strip().lower() for w in topic.split() if len(w) > 2]
if not base_words:
return "Необходимо указать более конкретную тему"
# Паттерны для генерации
patterns = [
["вопросы", "что такое", "как сделать", "почему", "когда", "где найти"],
["топ", "лучшие", "рейтинг", "самые популярные"],
["методы", "способы", "технологии", "решения"],
["обзор", "отзывы", "сравнение", "виды"],
["курс", "урок", "обучение", "самоучитель"],
["2025", "новинки", "тренды", "будущее"],
["для начинающих", "профессиональные", "премиум"],
["бесплатно", "купить", "заказать", "стоимость"],
["преимущества", "недостатки", "польза", "вред"],
["идеи", "примеры", "кейсы", "истории успеха"]
]
# Генерация вариантов
keywords = set()
queue = deque([(0, [], base_words)])
while queue:
level, current, remaining = queue.popleft()
if level >= 3 or not remaining:
if current:
keywords.add(" ".join(current))
continue
# Добавляем паттерны
if level == 0:
for pattern_group in patterns:
for p in pattern_group:
new_phrase = [p] + current
queue.append((level+1, new_phrase, remaining))
# Комбинируем слова
for i in range(len(remaining)):
next_word = remaining[i]
new_phrase = current + [next_word]
new_remaining = remaining[:i] + remaining[i+1:]
queue.append((level+1, new_phrase, new_remaining))
# Добавляем модификаторы
modifiers = ["", "2025", "курс", "обзор", "топ", "способы"]
for mod in modifiers:
if mod:
modified = current + [f"{next_word}-{mod}"]
queue.append((level+2, modified, new_remaining))
# Ранжирование и выборка
result = sorted(keywords,
key=lambda x: (-len(x.split()), x))
random.shuffle(result[:len(result)//2])
return ", ".join(result[:max(max_keywords, 1)])
# Initialize components
final_answer = FinalAnswerTool()
# Model initialization
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
# Load tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
# Load prompt templates
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
# Create agent
agent = CodeAgent(
tools=[
image_generation_tool,
generate_keywords,
final_answer,
DuckDuckGoSearchTool()
],
model=model,
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
# Launch UI
GradioUI(agent).launch() |