
Как мы научили AG2 дружить с нормальным DI (и почему это вообще нужно)
vvlrff 7 минут назад Как мы научили AG2 дружить с нормальным DI (и почему это вообще нужно) Средний 10 мин 224 Python * Микросервисы * Обзор Из песочницы Cитуация: у вас в проекте давно живёт Dishka. Контейнер настроен,...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. vvlrff 7 минут назад Как мы научили AG2 дружить с нормальным DI (и почему это вообще нужно) Средний 10 мин 224 Python * Микросервисы * Обзор Из песочницы Cитуация: у вас в проекте давно живёт Dishka. Контейнер настроен, пулы, фабрики UoW. И тут вы добавляете LLM-агента (например, на AG2).
А он такой: «Спасибо, держи dependencies={'session': session, 'repo': repo} и мою собственную DI-библиотеку. То есть теперь у вас два параллельных DI-контейнера: один для HTTP-роутов, второй — для тулз агента. Один и тот же сценарий приходится регистрировать дважды.
Технические детали
На каждый /chat-роут — руками собирать словарь зависимостей и передавать его в agent. ask(dependencies={... И всё это — рядом с уже существующим Dishka-контейнером, который ровно эту работу делать умеет.
Эта статья — про то, как этого больше не делать. Внутри:зачем агенту вообще нужен полноценный DI и почему AG2 поставляется со встроенным fast-depends;пакет dishka-ag2— мост между AG2 и Dishka, который превращает два контейнера в один;рабочий пример, который я собрал: FastAPI + AG2-агент со SSE-стримом, тулзы ходят в Postgres через типизированный DI;транзакционная семантика tool calls — что происходит, когда модель вызывает три инструмента параллельно и один из них падает. Полный код примера: github.
com/vvlrff/ag2_ag-ui_example — со всеми миграциями, Docker-сборкой и тестами. Проблема: почему dependencies={... } — это больAG2 предлагает прокидывать зависимости в инструменты через словарь — либо на уровне агента, либо на каждый прогон:# на уровне агента (живёт всю жизнь приложения) agent = Agent( tools=, dependencies={"static_dep": something}, ) # на каждый прогон — актуальная сессия летит сюда await agent.
Отраслевые последствия
", dependencies={"db_session": session, "repo": repo})Достаёшь в тулзе через fast-depends-аннотацию — типизация на месте:@tool async def my_tool(session: Annotated) -> ... И до какого-то момента этого хватает. Что не так начинается дальше:Дублирование DI.
Если в проекте уже есть Dishka — у вас два контейнера. Один и тот же CreateNoteUseCase регистрируется в Dishka (для HTTP-роутов) и где-то рядом собирается руками для dependencies={... Две политики жизненных циклов.
Любая правка в дереве зависимостей — в двух местах. Ручная сборка словаря в каждом /chat-роуте. На каждый запрос вы открываете Dishka REQUEST, достаёте оттуда сессию, репо, нужные сервисы, складываете в dict и передаёте в agent.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





