name: trip-flights
description: Wyszukiwanie lotow rodzinnych przez deep-linki Kayak + automatyzacje prawdziwego Chrome, z cross-checkiem przez SerpAPI Google Flights / Duffel. Uzyj gdy user chce znalezc loty, porownac polaczenia, zaplanowac wylot rodzinny z ograniczeniami (bagaz, max czas podrozy, wykluczone przesiadki, ferie szkolne). Trigger: "znajdz loty", "szukaj lotow", "kayak", "lot do", "wylot", "bilety lotnicze", "flight search".
trip-flights
Wyszukiwanie lotow pod twarde wymagania rodzinne. Zrodlo bazowe: Kayak (deep-linki URL), odczyt przez prawdziwa przegladarke Chrome.
Profil domyslny (rodzina Arka)
- Wylot i powrot: lotnisko Chopina w Warszawie (WAW). Modlin (WMI) odpada; nie wlaczaj "pobliskich lotnisk".
- Pasazerowie: 2 doroslych + dzieci ur. 01/2018 i 12/2014 (w styczniu 2027: 9 i 12 lat).
- Miejsca 2+2, rodzina siedzi razem.
- Bagaz: min 2 rejestrowane + 4 podreczne wliczone w cene (albo doliczone do porownania).
- Max 15h lacznego czasu podrozy na odcinek (
legdur=-900).
- Przesiadki: Dubaj wykluczony (
layoverair=-DXB), Stambul OK.
- Druga rodzina (Lukasz, slaskie, tez 2+2) leci tymi samymi lotami - lacznie ~8 osob.
Ferie zimowe 2027 (koordynacja dwoch rodzin)
- slaskie (Lukasz): 18-31.01.2027
- mazowieckie (my): 1-14.02.2027
- Limit: max 5 dni szkolnych poza feriami na rodzine. Dla kazdego wariantu dat policz dni robocze pon-pt poza feriami danej rodziny.
- Wariant bazowy 24.01-3.02: my 5 dni (25-29.01), Lukasz 3 dni (1-3.02). Okno przesuniec: wylot 23-27.01, powrot 2-7.02.
Workflow
- Zbuduj URL Kayak wg
references/kayak-url-params.md - ale BEZ parametru fs= (zweryfikowane 07/2026: layoverair=-XXX potrafi wykluczyc 63 lotniska i wyciac dobre huby, legdur przepuszcza odcinki ponad limit). Twarde wymagania egzekwuj we wlasnej walidacji w kroku 4:
https://www.kayak.pl/flights/WAW-BKK/2027-01-24/2027-02-03/2adults/children-12-9?sort=bestflight_a
fs=airlines=TK / fs=stops=0 uzywaj tylko do generowania linkow per-opcja w raporcie.
- Otworz w prawdziwym Chrome - preferowana kolejnosc:
a) Claude in Chrome (sesja usera, zero setupu),
b) Playwright podpiety do dzialajacego Chrome usera przez CDP (
chrome --remote-debugging-port=9222, potem connectOverCDP) - przejmuje zaufana sesje z cookies i fingerprint,
c) Playwright z persistent context na kopii profilu usera, zawsze headed.
NIGDY headless - Kayak uzywa PerimeterX (captcha "Press & Hold" nierozwiazywalna programowo). Jesli captcha wyskoczy, popros usera o reczne przytrzymanie.
- Odczytaj wyniki - najpierw sprobuj przechwycic wewnetrzne odpowiedzi JSON Kayaka z warstwy sieciowej (poll API wynikow;
read_network_requests w Claude in Chrome lub page.on('response') w Playwright) - pelne dane strukturalne bez scrapowania DOM. Fallback: snapshot strony (cena calkowita, linie, czasy odcinkow, lotnisko i czas przesiadki).
- Walidacja twardych wymagan - odrzuc wszystko co: >15h/odcinek, przesiadka DXB, brak sensownej opcji bagazowej. Filtry URL traktuj jako pre-filtr, nie zaufanie ostateczne.
- Policz dni szkolne poza feriami dla obu rodzin dla faktycznych dat opcji.
- Cross-check top 3 przez SerpAPI Google Flights (
exclude_conns, max_duration, bags) lub Duffel - szczegoly w references/flight-apis.md.
- Raport do pliku MD: kazde wyszukiwanie zapisz jako
trips/<id>/results/YYYY-MM-DD-<temat>.md w repo tripAgent (i commituj - raporty zawsze ida do repo). Zawartosc: 3-5 opcji, kazda z cena dla 2+2 z bagazem, czasem podrozy, przesiadka, dniami szkolnymi obu rodzin i klikalnym linkiem do rezerwacji (deep-link Kayak + link przewoznika). Na gorze: rekomendacja 1 glowna + 1 zapasowa oraz data/godzina wyszukiwania (ceny sie zmieniaja).
Zasady
- Nie buduj nic na Amadeus Self-Service (wylaczany 17.07.2026) ani Kiwi Tequila (zamkniete dla nowych).
- Ceny z Kayak zawsze weryfikuj u przewoznika przed decyzja - deep-link filtry bagazowe bywaja niedokladne.
- Ceny sa personalizowane po cookies/sesji: przed zakupem porownaj cene w oknie incognito z cena
w normalnej sesji (zaobserwowane przy zakupie BKK 07/2026 - incognito bywalo tansze).
- Przy monitoringu cen:
monitoring/price_monitor.py + trips/<id>/monitor.json (active=true) -
launchd co 2h, alert SMS przy zmianie >= progu, twardy filtr max godzin na odcinek.