# EKSRelay PHP relay pomiędzy Chatwoot, Flowise i WooCommerce. Odbiera webhooki z Chatwoot, przekazuje wiadomości do Flowise (LLM agent) i wystawia narzędzia (`/tools/*`) wywoływane przez agenta. ## Architektura ``` Klient → CHATWOOT → EKSRELAY /webhooks/chatwoot → FLOWISE (Tool Agent) ↓ narzędzia EKSRELAY /tools/* ↓ WOOCOMMERCE REST API WP AJAX (mu-plugin) ← odpowiedź ← EKSRELAY ← FLOWISE ``` ## Uruchomienie lokalne ```bash composer install cp .env.example .env # uzupełnij .env php -S 0.0.0.0:8080 -t public ``` ## Zmienne środowiskowe (`.env`) | Zmienna | Opis | |---|---| | `CHATWOOT_BASE_URL` | URL instancji Chatwoot (np. `https://eksupport.easyklima.com`) | | `CHATWOOT_API_TOKEN` | Token API Chatwoot (Settings → Account → API) | | `CHATWOOT_ACCOUNT_ID` | ID konta Chatwoot (z URL `/accounts/X/`) | | `CHATWOOT_BOT_AGENT_ID` | ID agenta-bota (opcjonalne) | | `CHATWOOT_TICKET_LABEL` | Label oznaczający ręczną obsługę (domyślnie: `ticket`) | | `FLOWISE_PREDICT_URL` | URL endpointu `/api/v1/prediction/` | | `FLOWISE_API_KEY` | Klucz API Flowise (jeśli włączone) | | `WP_AJAX_URL` | URL WordPress AJAX: `https://sklep.pl/wp-admin/admin-ajax.php` | | `WOOCOMMERCE_BASE_URL` | URL sklepu WooCommerce | | `WOOCOMMERCE_CONSUMER_KEY` | Klucz WooCommerce REST API (`ck_...`) | | `WOOCOMMERCE_CONSUMER_SECRET` | Secret WooCommerce REST API (`cs_...`) | | `RELAY_SHARED_SECRET` | Losowy token chroniący endpointy `/tools/*` | ## Endpointy ### Webhook | Endpoint | Opis | |---|---| | `POST /webhooks/chatwoot` | Odbiera eventy z Chatwoot. Przetwarza tylko `message_created` + `incoming`. | ### Tools (wywoływane przez Flowise) Wszystkie wymagają nagłówka `Authorization: Bearer `. | Endpoint | Źródło danych | Opis | |---|---|---| | `POST /tools/get_order_data` | WooCommerce REST API | Zamówienie po numerze lub emailu | | `POST /tools/get_product_data` | WooCommerce REST API | Produkt po ID, SKU lub frazie | | `POST /tools/get_shipping_data` | WooCommerce REST API | Strefy i metody wysyłki | | `POST /tools/get_payment_methods` | WooCommerce REST API | Dostępne metody płatności | | `POST /tools/get_car_data` | **WP AJAX (mu-plugin)** | Dane auta z bazy pojazdów WP | | `POST /tools/get_product_compatibility` | **WP AJAX (mu-plugin)** | Kompatybilność produktu z autem | | `POST /tools/new_ticket` | Chatwoot API | Tworzy ticket, dodaje label `ticket` | ## Zależność: mu-plugin WordPress (`aiac_chat_api.php`) Dwa endpointy — `get_car_data` i `get_product_compatibility` — **nie korzystają z WooCommerce REST API**, lecz bezpośrednio z WordPress AJAX udostępnianego przez mu-plugin `aiac_chat_api.php`. ### Dlaczego Dane o samochodach (`marka/model/rok/silnik → typ gazu, ilość, adapter`) i sprawdzanie kompatybilności produktu z autem są przechowywane w WordPressie jako: - custom post type: `car` - taxonomie: `car_model`, `car_production_year` - pola ACF: `ac_gas_type`, `ac_gas_amount`, `adapters`, itp. Standardowe WooCommerce REST API nie wystawia tych danych — stąd konieczność korzystania z pluginu. ### Aktualny stan (tymczasowy) Plugin `aiac_chat_api.php` jest **starym rozwiązaniem** z poprzedniego chatbota. EKSRelay wywołuje jego publiczne AJAX endpointy: ``` GET https://easyklima.pl/wp-admin/admin-ajax.php?action=chat_get_car_data&car_brand=Toyota&... GET https://easyklima.pl/wp-admin/admin-ajax.php?action=chat_get_product_compatibility&... ``` Endpointy są publiczne (`nopriv`) i nie wymagają uwierzytelnienia. ### Docelowe rozwiązanie (TODO) Plugin powinien zostać **przebudowany** tak, żeby: 1. Wystawiał dedykowane REST API zamiast AJAX (`register_rest_route` → `/wp-json/aiac/v1/car-data`) 2. Wprowadzał uwierzytelnienie (shared secret lub wp-nonce) 3. Był niezależny od starego kodu chatbota (usunięcie funkcji ticketów, Baselinker itp.) 4. Ewentualnie obsługiwał też `get_product_data` z wariantami i wieloma walutami (WCML), czego obecne rozwiązanie przez WC REST API nie pokrywa w pełni Do tego czasu EKSRelay korzysta ze starych endpointów AJAX — działa, ale jest kruche (bez auth, zależne od legacy kodu). ## Flowise — konfiguracja Narzędzia Flowise znajdują się w katalogu `flowise-tools/`. Każdy plik JSON to definicja do zaimportowania w Flowise UI (Tools → Add Tool → Import). W chatflow Flowise należy ustawić zmienne: | Zmienna | Wartość | |---|---| | `relay_base` | URL EKSRelay (np. `http://localhost:8080` lub produkcyjny) | | `relay_shared_secret` | Wartość `RELAY_SHARED_SECRET` z `.env` | ## Konfiguracja Chatwoot W Chatwoot → Settings → Integrations → Webhooks → Add: - URL: `https:///webhooks/chatwoot` - Zdarzenia: ✅ `message_created` ## Wdrożenie 1. Sklonuj repo na serwer (najlepiej ten sam co Flowise) 2. `composer install --no-dev` 3. Skonfiguruj `.env` z produkcyjnymi danymi 4. Ustaw PHP-FPM + nginx lub uruchom `php -S 0.0.0.0:8080 -t public` 5. Zaktualizuj `relay_base` w zmiennych Flowise na publiczny URL 6. Dodaj webhook w Chatwoot