-
Notifications
You must be signed in to change notification settings - Fork 148
Feat: Tools aop registry and tools namespace #19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| @classmethod | ||
| def get_research_tools(cls) -> list[Type[BaseTool]]: | ||
| """Get all research tools (is_system_tool = False). | ||
| Returns: | ||
| List of research tool classes | ||
| """ | ||
| return [tool for tool in cls._tools.values() if not tool.is_system_tool] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вот это немного нарушает мою изначальную концепцию, где можно было выпускать разные наборы тулов. Условно system, research, file, web search, server и всё такое. Импортишь их всем пакетом и агент приобретает необходимые навыки
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю заменить на признак is_enable: bool, чтобы можно было управлять активными тулами на уровне регистри.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Сделал что пользователь можешь собрать любой набор какой хочет, если он передаёт их через toolkit в контроллере, то пользовательские тулы сливаются с системными.
Плюс во всех агентах используются все тулы, кроме случаев когда необходимо отключить ризонинг.
|
Я чучуточку скептичен насчёт регистри. Оно мне кажется немного оверкиллом. Пока не очевидны сценарии, где тулзы понадобились бы централизованно из регистри Не вижу смысла в бинарном разделении system/research. В изначальной моей идее из коммента выше - это просто один из возможных пакетов тулзов В моём понимании флоу: импортим/пишем необходимые тулзы/их наборы, подсовываем в тулкит агента, радуемся разделение на тулзов на файлики выглядит хорошо Кроме того, стоит и конкретных агентов вынести на уровень с тулзами |
| logging.basicConfig( | ||
| level=logging.INFO, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@virrius а мы зачем так внутри агента настраиваем basicConfig логера?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это наследие оригинальной версии и вопрос скорее к @virrius мой код на данном участке просто выполняет декомпозицию (раскладывает классы по файликам).
Сделал регистри опциональным, это теперь для нас история, мы можем добалять тулы в общий пул из любого места, юзерам возможно это тоже понравится, возможность использовать кастомные toolkit вдобавок к дефолтному набору - сохранена.
Убрал эту логику, теперь список тулов запрашивается из регистир, плюс к этому набору добавляется набор переданный юзером через toolkit.
Предлагаю агентов перенести в свой неймспейс отдельным PR, а то в этом и так уже много правок. |
MiXaiLL76
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tool, tool, tool
| from sgr_deep_research.tools import ( | ||
| AgentCompletionTool, | ||
| BaseTool, | ||
| ClarificationTool, | ||
| CreateReportTool, | ||
| NextStepToolsBuilder, | ||
| NextStepToolStub, | ||
| ReasoningTool, | ||
| WebSearchTool, | ||
| research_agent_tools, | ||
| system_agent_tools, | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Много тулзов. Они тут зачем если есть регистри? я вижу там удаляются некоторые тулзы по возможности, мб просто по tool.class.name будем делать? чтобы меньше импортов было?
| *(toolkit or []), | ||
| ] | ||
| self.toolkit = [*ToolsRegistry.get_tools(), *(toolkit or [])] | ||
| self.toolkit.remove(ReasoningTool) # we use our own reasoning scheme |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ну типо вот тут, сделать удаление через class.name, можно тупо перебором мб?
| AgentCompletionTool, | ||
| BaseTool, | ||
| ClarificationTool, | ||
| CreateReportTool, | ||
| ReasoningTool, | ||
| WebSearchTool, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tool, tool, tool, tool. Если есть регистри, они не нужны в таком виде
| tools = { | ||
| ReasoningTool, | ||
| CreateReportTool, | ||
| AgentCompletionTool, | ||
| ] | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tool, tool, tool....
registry.get("name")?
| from sgr_deep_research.tools import ( | ||
| AgentCompletionTool, | ||
| BaseTool, | ||
| ClarificationTool, | ||
| CreateReportTool, | ||
| ReasoningTool, | ||
| WebSearchTool, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tool, tool, tool
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Моё понимание концепции сейчас на уровне:
коллекция для централизованного хранения и обработки тулзов - ОК, но само по себе не слишком полезно. Добавляет абстракцию, добавляет список стейтов (enabled) и накидывает лишней логики копирования
Применение в агенте - не ОК - оно используется буквально для инициализации toolkit, который по идее должен быть полностью заменён локальным registry агента
Добавление/удаление тулзов - не ОК, непонятно, как эффективно выбрать необходимый набор тулзов из общего количества
Регистри всё ещё кажется излишним и не слишком удобным. Я не понимаю/не оценил идею, в которой оно может быть полезно в текущей реализации
Предположим, количество тулзов в проекте возрастёт до сотни. А агент мы хотим формировать из 7-12. Каков будет механизм выбора тулзов из регистри? Писать 90 раз disable_tool? Сейчас внего копируется весь общий регистри. Согласно нашим обсуждениям об идее регистри, стоит сделать минимальную обёртку, которая могла бы фыормировать необходимый список тулов из общего количество по конфигу
Моё предложение - пивотнуться на уровне идеи или прикопать это дело до момента, когда появится более сформированная потребность
| if isinstance(action_tool, ClarificationTool): | ||
| if isinstance(action_tool, BaseTool): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мне кажется, тут что-то пошло не так с переименованием. Важно чтобы этот кейс срабатывал именно для ClarificationTool.
Выше в тайпинге тоже бы предпочёл видеть конкретно ReasoningTool
| class BaseTool(BaseModel): | ||
| """Class to provide tool handling capabilities.""" | ||
|
|
||
| is_enabled: ClassVar[bool] = True |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вот тут вангую проблемы будут. Это поле где-то используется? Предполагается к использованию?
| } | ||
|
|
||
| @classmethod | ||
| def get_default_registry(cls) -> "ToolsRegistry": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Выглядит лишним в текущей логике. Можно просто через конструктор инициализировать
Приветствую! Предлагаю вашему вниманию рефакторинг тулов о котором я размышлял всю прошлую неделю.
Первым делом выполнил небольшой рефакторинг, призванный разделить тулы и ядро в отдельные логические блоки.
core.tools.baseиcore.tools.researchбыла выполнена декомпозиция тулов, все тулы была разнесены по отдельным файлам, при этом логика тулов осталась прежнейcore.toolsна уровень выше и хранятся теперь вtoolsBaseToolбыл так же вынесен в отдельный файлbase_tool.py, но при этом остался вcoreNextStepToolStubиNextStepToolsBuilderтак же были вынесены в отдельный файлnext_step_tools.pyвcoreСледующим важным нововведеним данного PR является механизм реестра тулов.
coreбыл добавленtools_registry, который содержит в себе классToolsRegistryи декоратор@toolпозволяющий регистрировать в указанном регистри объекты расширящие классBaseTool, то есть тулыis_system_toolс типом boolean, по умолчанию он имеет статус FalseToolsRegistryимеются два метода,get_system_tools- возвращает список системных тулов иget_research_toolsкоторый будет возвращать исследовательские тулы, указанные методы призваны заменить хардкодsystem_agent_toolsиresearch_agent_tools