Files
gooseek/CONTINUE.md
home 08bd41e75c feat: travel service with 2GIS routing, POI, hotels + finance providers + UI overhaul
- Add travel-svc microservice (Amadeus, TravelPayouts, 2GIS, OpenRouteService)
- Add travel orchestrator with parallel collectors (events, POI, hotels, flights)
- Add 2GIS road routing with transport cost calculation (car/bus/taxi)
- Add TravelMap (2GIS MapGL) and TravelWidgets components
- Add useTravelChat hook for streaming travel agent responses
- Add finance heatmap providers refactor
- Add SearXNG settings, API proxy routes, Docker compose updates
- Update Dockerfiles, config, types, and all UI pages for consistency

Made-with: Cursor
2026-03-01 21:58:32 +03:00

4.6 KiB
Raw Blame History

Недоделки — начать отсюда

Последнее изменение (01.03.2026)

СДЕЛАНО: Маршруты по дорогам + стоимость проезда

Что сделано:

1. backend/internal/travel/twogis.go — 2GIS Routing API клиент:

  • Метод GetRoute(ctx, points, transport) — POST routing.api.2gis.com/routing/7.0.0/global
  • Поддержка transport: driving, taxi, walking, bicycle
  • Парсинг WKT LINESTRING из outcoming_path.geometry[].selection
  • Сборка RouteDirection с geometry, distance, duration, steps

2. backend/internal/travel/service.go — переключение на 2GIS:

  • GetRoute() сначала пробует 2GIS Routing, fallback на OpenRouteService
  • mapProfileToTwoGISTransport() — маппинг профилей

3. backend/internal/agent/travel_data_client.go — обновлённый клиент:

  • GetRoute(ctx, points, transport) — полный RouteDirectionResult с geometry
  • GetRouteSegments() — маршруты между каждой парой точек
  • Новые типы: RouteDirectionResult, RouteGeometryResult, RouteStepResult, RouteSegmentResult

4. backend/internal/agent/travel_orchestrator.go — дорожные маршруты:

  • emitTravelWidgets() вызывает buildRoadRoute() вместо прямых линий
  • buildTransportSegments() — маршруты между каждой парой точек
  • calculateTransportCosts() — расчёт стоимости (машина ~8₽/км, автобус ~2.5₽/км, такси ~100₽+18₽/км)
  • routeDirection и segments передаются в виджеты travel_map и travel_itinerary

5. Фронтенд — отображение дорожных маршрутов:

  • types.ts — новые типы RouteSegment, TransportCostOption, расширены TravelMapWidgetParams и TravelItineraryWidgetParams
  • useTravelChat.ts — извлечение routeDirection и segments из виджетов, новые state
  • travel/page.tsx — передача routeDirection в TravelMap
  • TravelWidgets.tsxTransportSegmentCard между элементами маршрута с иконками машина/автобус/такси и ценами

СДЕЛАНО ранее: Переработка POI коллектора — 2GIS как основной источник

(см. предыдущую версию CONTINUE.md)


Осталось сделать

Высокий приоритет

  1. Цены отелей из SearXNG — LLM не всегда извлекает цены (0 RUB/night). Нужно:

    • Добавить fallback: если цена 0, попробовать парсить из snippet
    • Файл: backend/internal/agent/travel_hotels_collector.go
  2. Авиабилеты для маршрутов — "Золотое кольцо" не имеет IATA кода. Нужно:

    • Если destination не IATA, искать билеты до первого конкретного города в маршруте
    • Файл: backend/internal/agent/travel_flights_collector.go

Средний приоритет

  1. Drag & drop в ItineraryWidget — перетаскивание элементов между днями
  2. Кеш SearXNG результатов — Redis кеш на 10-30 минут
  3. Сохранение draft в БД — персистентность TripDraft через trip_drafts таблицу

Низкий приоритет

  1. Экспорт маршрута — PDF/Markdown
  2. Real-time обновления — WebSocket для тредов

Контекст

Архитектура travel pipeline:

User -> /travel page -> streamTravelAgent() -> api-gateway -> chat-svc -> agent-svc
  -> RunTravelOrchestrator:
    1. Planner Agent (LLM) -> TripBrief
    2. Geocode destinations -> travel-svc -> 2GIS Geocoder API
    3. Parallel collectors:
       - Events: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
       - POI: 2GIS Places API (primary) -> LLM enrichment -> SearXNG fallback
       - Hotels: SearXNG -> Crawl4AI -> LLM extraction -> geocode (2GIS)
       - Transport: TravelPayouts API
    4. Itinerary Builder (LLM) -> ItineraryDay[]
    5. Road routing: 2GIS Routing API -> RouteDirection (дорожная геометрия)
    6. Transport costs: calculateTransportCosts() -> машина/автобус/такси
    7. Widget emission -> NDJSON stream -> frontend (карта 2GIS MapGL)