# Недоделки — начать отсюда ## Последнее изменение (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.tsx` — `TransportSegmentCard` между элементами маршрута с иконками машина/автобус/такси и ценами --- ### СДЕЛАНО ранее: Переработка 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` ### Средний приоритет 3. **Drag & drop в ItineraryWidget** — перетаскивание элементов между днями 4. **Кеш SearXNG результатов** — Redis кеш на 10-30 минут 5. **Сохранение draft в БД** — персистентность TripDraft через trip_drafts таблицу ### Низкий приоритет 6. **Экспорт маршрута** — PDF/Markdown 7. **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) ```