5.1 KiB
5.1 KiB
flight-search
Vyhledávání letenek přes KAYAK s ukládáním výsledků do SQLite.
Kdy aktivovat
- "hledej letenky", "flight search", "letenky do X", "vyhledej let", "letenky PRG→PTY"
- Když uživatel zadá trasu, datumy a počet osob
Přehled
Skill orchestruje hledání letenek:
- Vytvoří definici hledání v DB přes CLI skript
- Fetchnout KAYAK URL přes
web_fetch - Parsuje výsledky z markdown
- Uloží nalezené lety do DB
- Prezentuje top výsledky uživateli
Postup
1. Získat parametry od uživatele
Vyžadované:
- origin — IATA kód (např. PRG)
- destination — IATA kód (např. PTY)
- dep_date — datum odletu (YYYY-MM-DD)
- ret_date — datum návratu (YYYY-MM-DD)
- adults — počet dospělých (default 1)
Volitelné:
- flex_days — ±dny pro flexibilní hledání (default 0, max 3)
- min_stay_days — minimální doba pobytu v destinaci (default 1)
- max_layovers — max přestupy (default 1, pevně nastaveno)
- currency — CZK (default)
2. Vytvořit hledání
uv run skills/flight-search/scripts/flight_search.py create-search \
--origin PRG --destination PTY \
--dep-date 2026-12-21 --ret-date 2027-01-04 \
--adults 3 --flex-days 3 --min-stay-days 14 --max-layovers 1
Vrátí JSON s search_id a seznamem urls.
3. Fetch KAYAK stránky
Pro každou URL z urls použij web_fetch s extractMode="text".
Důležité: Používej cz.kayak.com doménu (české UI, ceny v CZK). URL formát:
https://www.cz.kayak.com/flights/{origin}-{destination}/{dep}/{ret}/{adults}adults?sort=price_a&fs=stops=-2
KAYAK URL parametry:
sort=price_a— seřadit podle ceny vzestupněfs=stops=-2— max 1 přestup (KAYAK počítá "additional stops", -2 = max 1)curr=CZK— ceny v CZK (na cz.kayak.com je CZK default)
4. Parsování výsledků
KAYAK vrací markdown s lety. Hledej vzory:
Cena (na cz.kayak.com v CZK):
34 484 Kčnebo32 232 Kč/osobuneboCelkem 96 695 Kč- Pozor: mezera jako oddělovač tisíců, ne čárka
Aerolinka:
Air France,KLM,Turkish Airlines,SWISS,Copa Airlines,United Airlines, atd.- Může být kombinace:
KLM, Air France
Trasa a přestupy:
1 přest.nebo2 přest.CDG Mezipřistání 3hod 05min, Paříž Letiště Charlese de GaullaAMS Mezipřistání 16hod 55min, Amsterdam Letiště Schiphol
Časy:
- Odlet:
09:50 – 20:20nebo09:50 - Přílet:
20:20nebo20:20+1(+1 = další den) - Doba letu:
16hod 30minnebo16h 30m
Typický blok výsledku (cz.kayak.com s fs=stops=-2):
1. 09:50 – 20:20
PRG Letiště Václav Havel - PTY Tocumen Intl 1 přest.
CDG Mezipřistání 3hod 05min, Paříž Letiště Charlese de Gaulla 16hod 30min
2. 22:30 – 22:40+1
PTY Tocumen Intl - PRG Letiště Václav Havel 1 přest.
CDG Mezipřistání 6hod 25min, Paříž Letiště Charlese de Gaulla 18hod 10min
Air France
1
0
34 484 Kč
/osobu
Celkem 103 452 Kč
Light
5. Uložit výsledky
Pro každý nalezený let:
uv run skills/flight-search/scripts/flight_search.py add-result \
--search-id <ID> \
--airline "Air France" \
--route "PRG→CDG→PTY / PTY→CDG→PRG" \
--dep-date 2026-12-21 --ret-date 2027-01-04 \
--dep-time "09:50" --arr-time "20:20" \
--layovers 1 --layover-info "CDG 3h05m" \
--duration "16h30m" \
--price 34484 --price-czk 34484
Nebo batch přes stdin:
echo '[{"search_id":1,"airline":"Air France",...}]' | \
uv run skills/flight-search/scripts/flight_search.py add-results
6. Prezentovat výsledky
uv run skills/flight-search/scripts/flight_search.py results <search_id> --top 5
Výstup formátuj pro uživatele v češtině s přehlednou tabulkou.
7. Historie a správa
# Seznam hledání
uv run skills/flight-search/scripts/flight_search.py list-searches
# Smazat hledání
uv run skills/flight-search/scripts/flight_search.py delete-search <id>
Poznámky k parsování
- KAYAK stránka může obsahovat reklamy (JustFly, Expedia, FlightHub) — ignoruj
- Některé výsledky mají "Vlastní transfer" (self-transfer) — označ, ale nefiltruj
- Ceny jsou per osoba, celková cena je vždy uvedena jako "Celkem X Kč"
- Na cz.kayak.com jsou ceny automaticky v CZK
- Pokud web_fetch selže nebo vrátí jen navigaci bez výsledků, informuj uživatele a navrhni manuální kontrolu na KAYAKu
- KAYAK může vyžadovat více fetchů pro flex data — každá URL je jedna kombinace datumů
CLI reference
| Příkaz | Popis |
|---|---|
create-search |
Vytvoří hledání, vrátí search_id + URL |
add-result |
Přidá jeden výsledek |
add-results |
Přidá víc výsledků z JSON (stdin nebo --json-file) |
results <id> |
Top N výsledků seřazených podle ceny |
list-searches |
Seznam všech hledání |
delete-search <id> |
Smaže hledání + výsledky |
DB
Auto-vytvořeno v db/flight_search.sqlite. Tabulky:
searches— definice hledání (trasa, datumy, flex, osoby)results— nalezené lety (aerolinka, trasa, časy, cena, přestupy)