- 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
4.6 KiB
4.6 KiB
Недоделки — начать отсюда
Последнее изменение (01.03.2026)
СДЕЛАНО: Маршруты по дорогам + стоимость проезда
Что сделано:
1. backend/internal/travel/twogis.go — 2GIS Routing API клиент:
- Метод
GetRoute(ctx, points, transport)— POSTrouting.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 на OpenRouteServicemapProfileToTwoGISTransport()— маппинг профилей
3. backend/internal/agent/travel_data_client.go — обновлённый клиент:
GetRoute(ctx, points, transport)— полныйRouteDirectionResultс geometryGetRouteSegments()— маршруты между каждой парой точек- Новые типы:
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иTravelItineraryWidgetParamsuseTravelChat.ts— извлечениеrouteDirectionиsegmentsиз виджетов, новые statetravel/page.tsx— передачаrouteDirectionвTravelMapTravelWidgets.tsx—TransportSegmentCardмежду элементами маршрута с иконками машина/автобус/такси и ценами
СДЕЛАНО ранее: Переработка POI коллектора — 2GIS как основной источник
(см. предыдущую версию CONTINUE.md)
Осталось сделать
Высокий приоритет
-
Цены отелей из SearXNG — LLM не всегда извлекает цены (0 RUB/night). Нужно:
- Добавить fallback: если цена 0, попробовать парсить из snippet
- Файл:
backend/internal/agent/travel_hotels_collector.go
-
Авиабилеты для маршрутов — "Золотое кольцо" не имеет IATA кода. Нужно:
- Если destination не IATA, искать билеты до первого конкретного города в маршруте
- Файл:
backend/internal/agent/travel_flights_collector.go
Средний приоритет
- Drag & drop в ItineraryWidget — перетаскивание элементов между днями
- Кеш SearXNG результатов — Redis кеш на 10-30 минут
- Сохранение draft в БД — персистентность TripDraft через trip_drafts таблицу
Низкий приоритет
- Экспорт маршрута — PDF/Markdown
- 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)