Як я будував AI Gateway: Архітектура системи

Коли я почав розробляти систему для трьох типів ботів, то дуже швидко зрозумів: звичайний підхід не підходить.

У мене був Integration Bot, який мав розсилати повідомлення. Constructor Bot, який мав обробляти користувацькі команди. І User Bot, який мав бути розумним з AI. Кожен мав свою логіку, свої потреби, свої способи спілкуватися з базою даних.

Я йшов від простого до складного, оскільки не було остаточного рішення що це має бути, з початку це був лише конструктор ботів через веб інтерфейс за допомогою хендлерів на php —  один бекенд.

Але з архітектурою, яка зробить три типи ботів незалежними, але зв’язаними через спільну AI систему.

 

Чому Clean Architecture?

Clean Architecture — це не якась магія, це просто добра організація коду. Ідея проста: чим далі від центру, тим більше залежностей від реального світу.

Уявіть круги:

  • Самий центр — ваша бізнес-логіка. Чиста, без залежностей, тестована.
  • Наступний круг — правила додатку. Як вони спілкуються.
  • Третій круг — http, база даних, зовнішні сервіси.
  • Зовнішній круг — інтерфейси, API, користувачі.

Залежності іду завжди від зовні до центру. Таким чином внутрішній код не знає про базу даних, про API, про те, який фреймворк використовується.

Мені це дало свободу. Я міг змінити базу з MySQL на PostgreSQL — внутрішній код не знає про це. Я міг додати Redis для кешування — і це  не впливає на внутрішній код.

Але найголовніше — я зробив код тестованим. Без бази, без API, без будь-чого реального.

 

Як це виглядає у мене?

У мене є чотири окремих мікросервіси, кожен в своєму Docker контейнері, кожен зі своїм docker-compose:

1. Laravel Backend (PHP)

Це серце системи. Тут живе вся бізнес-логіка ботів, управління користувачами, сховище даних.

Це чиста архітектура — Domain не знає про Laravel, Database не знає про HTTP.

2. AI Gateway (Node.js)

Окремий сервіс, який сидить між Laravel й AI провайдерами. Його робота — обрати найкращого AI помічника, побудувати контекст, відправити запит, повернути відповідь.

Чому окремо? Тому що:

  • Потрібна швидкість — Node.js краще для асинхронної обробки
  • Потрібна незалежність — якщо Laravel упаде, AI Gateway продовжить працювати
  • Потрібна масштабованість — можу запустити декілька інстансів AI Gateway

3. Content Parser (Go)

Мікросервіс, який витягує контент з web сторінок, Reddit, Telegram каналів. Написаний на Go тому що потрібна швидкість та мінімальні ресурси.

Його робота проста: “Дай мені URL, я витягну звідти головне й повернусь”.

4. React Frontend (TypeScript)

Вебінтерфейс для користувачів. Спілкується з Laravel API.

Як вони живуть разом?

Тут приходить цікава частина. У мене не один docker-compose.yml, а три окремих, які спілкуються через shared network.

Три окремих docker-compose файли:

1. docker-compose-php83.yml (Laravel + Workers)

yaml

2. docker-compose.yml (AI Gateway)

yaml

3. docker-compose.yml (Content Parser)

yaml

Як це працює?

Крок 1: Створюємо shared network

bash

Крок 2: Запускаємо кожен docker-compose окремо

bash

Результат: Три окремих системи, але всі в одній мережі shared_network. Вони бачать одна одну через hostname:

  • Laravel через http://ai-gateway-service:3002
  • Laravel через http://content-parser:8080
  • Content Parser через http://ai-gateway-service:3002

Це дає мені максимальну гнучкість:

  • Запусти тільки AI Gateway для тестування
  • Запусти тільки Content Parser для розробки парсера
  • Запусти все разом для повної системи
  • Легко масштабуй кожну частину незалежно

Реальний флоу повідомлення

Щоб зрозуміти, як це працює, давайте відстежимо одне повідомлення від користувача до AI відповіді:

Крок 1: Користувач пише в Telegram

Боти отримує повідомлення через webhook від Telegram.

Крок 2: Laravel обробляє

Telegram webhook → Laravel Route → Controller → Use Case → Service

 

Laravel отримує повідомлення, перевіряє юзера, витягає контекст з бази.

Крок 3: Запит іде до AI Gateway

Laravel відправляє HTTP запит до ai-gateway:3002/api/generate:

json

Крок 4: AI Gateway обробляє контекст

  • Вибирає найрелевантнішу інформацію
  • Обирає AI провайдера (OpenAI? Google? Claude?)
  • Будує промпт
  • Відправляє запит

Крок 5: Відповідь повертається

json

Крок 6: Laravel зберігає й відправляє

Результат зберігається в базі, відправляється назад боту в Telegram.

Все це — декілька мікросервісів, які спілкуються через HTTP.

Чому мікросервіси?

Якби я писав все в одному монолітному PHP додатку, я мав би такі проблеми:

  • Масштабування — якщо мені потрібна більше потужності для AI обробки, я мусив масштабувати весь додаток
  • Технологія lock-in — якщо я захотів використати Go для парсера (тому що він швидший), мені довелось би переписувати на PHP
  • Падіння системи — якщо AI Gateway впадав, весь додаток зупинявся
  • Development — коли я змінював AI Gateway код, мені довелось перезапускати весь Laravel

З мікросервісами:

  • Незалежне масштабування — запускаю більше AI Gateway інстансів, якщо потрібна більша пропускна спроможність
  • Вибір технології — контент парсер на Go, AI Gateway на Node, backend на PHP — все мішається й працює
  • Стійкість — одна частина впадає, інші працюють
  • Development швидкість — змінюю AI Gateway, перезапускаю тільки його контейнер

Dependency Injection — як вони спілкуються?

Но як Laravel контролер знає, куди послати запит до AI Gateway? Як вона знає адресу, порт, які параметри?

Тут допомагає Dependency Injection. Я не пишу адреси “в жорстко” в коді. Я передаю залежності через конструктор:

php

У .env файлі я вказую:

Код не знає де живе AI Gateway. Він просто знає, що є якийсь AIGatewayService, який робить роботу.

Це дозволяє мені:

  • Тестувати — замісти реального AI Gateway, я можу передати mock
  • Міняти реалізацію — замісти HTTP, я можу використати гря, або Redis queue
  • Конфігурувати — змінити URL в .env — й все переналаштовується

Резюме: Три рівні архітектури

Рівень 1: Clean Architecture (код) Мій код організований так, щоб внутрішня логіка не знала про зовнішній світ.

Рівень 2: Мікросервіси (сервіси) Я розбив систему на чотири незалежних сервіси, кожен з своєю відповідальністю.

Рівень 3: Docker Compose (оркестрація) Все це живе в Docker контейнерах, які спілкуються через HTTP й network.

Результат:

  • 🧩 Модульність — кожна частина робить одне й робить добре
  • 🚀 Масштабованість — додаю нові інстанси без зміни коду
  • 🛡️ Стійкість — одна частина впадає, система продовжує працювати
  • 🧪 Тестованість — можу тестувати кожну частину окремо
  • 🔄 Гнучкість — можу міняти технології без переписування всього

Коли система почне рости, архітектура врятує мене від хаосу. Окрім того мікросервіси можна використати в інших проектах, той же парсер чи AI Gateway


Наступна стаття: Smart Context — як система розуміє контекст розмови без тонн даних.

Автор, один на один з компіллером

 

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *