diff --git a/docs/mcp-tools.md b/docs/mcp-tools.md index 4ba2a787..2163ef58 100644 --- a/docs/mcp-tools.md +++ b/docs/mcp-tools.md @@ -2226,7 +2226,7 @@ Distance et temps de trajet entre deux points ``` Renvoie la distance (en mètres) entre deux points à partir de leur longitude et latitude. -Renvoie aussi une estimation du temps de trajet dans le cas où un profil (marche, voiture) est renseigné. +Renvoie aussi une estimation du temps de trajet lorsque `profile` vaut `car` ou `pedestrian`. (source : Géoplateforme (calcul d'itinéraire)). ``` @@ -2237,7 +2237,7 @@ Renvoie aussi une estimation du temps de trajet dans le cas où un profil (march | `arrival` | object | oui | Le point d'arrivée | | `departure` | object | oui | Le point de départ | | `optimize` | string (enum) | non | La métrique à optimiser, lorsqu'il y a un choix : `time` chemin le plus rapide, `distance` chemin le plus court. Cette option est sans effet lorsque `profile=spherical` ou `ellipsoidal`. Valeurs : time, distance. Valeur par défaut : time. | -| `profile` | string (enum) | non | Le type de chemin suivi :, `spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%), `ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise et coûteuse, précision à 1mm), `car` en voiture, `pedestrian` à pied. Valeurs : spherical, ellipsoidal, car, pedestrian. Valeur par défaut : spherical. | +| `profile` | string (enum) | non | Le type de chemin suivi : `spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%), `ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise, précision à 0.5cm), `car` en voiture, `pedestrian` à pied. Valeurs : spherical, ellipsoidal, car, pedestrian. Valeur par défaut : spherical. |
Schéma d’entrée brut @@ -2301,7 +2301,7 @@ Renvoie aussi une estimation du temps de trajet dans le cas où un profil (march "pedestrian" ], "default": "spherical", - "description": "Le type de chemin suivi :, `spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%), `ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise et coûteuse, précision à 1mm), `car` en voiture, `pedestrian` à pied." + "description": "Le type de chemin suivi : `spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%), `ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise, précision à 0.5cm), `car` en voiture, `pedestrian` à pied." }, "optimize": { "type": "string", diff --git a/src/gpf/itinerary.ts b/src/gpf/itinerary.ts index c16ed601..9eba76b7 100644 --- a/src/gpf/itinerary.ts +++ b/src/gpf/itinerary.ts @@ -3,11 +3,13 @@ import logger from "../logger.js"; import type { JsonFetcher } from "../helpers/http.js"; import type { RateLimiter } from "../helpers/RateLimiter.js"; import { getNavigationRateLimiter } from "./navigationRateLimiter.js"; -import { TRAVEL_TIME_PROFILES } from "./navigation.js"; +import { TRAVEL_TIME_PROFILES, TRAVEL_TIME_RESOURCE } from "./navigation.js"; export const NAVIGATION_ITINERARY_SOURCE = "Géoplateforme (calcul d'itinéraire)"; export const NAVIGATION_ITINERARY_URL = "https://data.geopf.fr/navigation/itineraire"; -export const ITINERARY_RESOURCE = "bdtopo-osrm"; +// Same engine as the `travel_time_filter` isochrones, so that both report the +// same travel times. +export const ITINERARY_RESOURCE = TRAVEL_TIME_RESOURCE; export const ITINERARY_PROFILES = TRAVEL_TIME_PROFILES; export const ITINERARY_METRICS = ["time", "distance"] as const; diff --git a/src/tools/DistanceTool.ts b/src/tools/DistanceTool.ts index 8b5ae88b..d21cc849 100644 --- a/src/tools/DistanceTool.ts +++ b/src/tools/DistanceTool.ts @@ -27,11 +27,11 @@ const distanceInputSchema = z.object({ .enum(["spherical", "ellipsoidal", ...ITINERARY_PROFILES]) .default("spherical") .describe(["Le type de chemin suivi :", - "`spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%)", - "`ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise et coûteuse, précision à 1mm)", - "`car` en voiture", - "`pedestrian` à pied.", - ].join(", ")), + " `spherical` distance à vol d'oiseau (Terre ronde, précision à 0.5%),", + " `ellipsoidal` distance à vol d'oiseau (Terre ellipsoïde, plus précise, précision à 0.5cm),", + " `car` en voiture,", + " `pedestrian` à pied.", + ].join("")), optimize: z .enum(ITINERARY_METRICS) .default("time") @@ -55,7 +55,7 @@ type DistanceInput = z.infer; const DISTANCE_TOOL_DESCRIPTION = [ `Renvoie la distance (en mètres) entre deux points à partir de leur longitude et latitude.`, - `Renvoie aussi une estimation du temps de trajet dans le cas où un profil (marche, voiture) est renseigné.`, + `Renvoie aussi une estimation du temps de trajet lorsque \`profile\` vaut \`car\` ou \`pedestrian\`.`, `(source : ${NAVIGATION_ITINERARY_SOURCE}).`, ].join("\n"); @@ -106,8 +106,8 @@ class DistanceTool extends BaseTool { optimize: input.optimize, }); return { - distance: itinerary.distance, - time: Math.round(itinerary.duration) + distance: Math.round(itinerary.distance * 100) / 100, + time: Math.round(itinerary.duration * 10) / 10 }; } default: { diff --git a/test/gpf/itinerary.test.ts b/test/gpf/itinerary.test.ts index 46bb3682..a9b552db 100644 --- a/test/gpf/itinerary.test.ts +++ b/test/gpf/itinerary.test.ts @@ -36,7 +36,7 @@ describe("NavigationItineraryClient", () => { const parsedUrl = new URL(urls[0]); expect(parsedUrl.origin + parsedUrl.pathname).toEqual("https://data.geopf.fr/navigation/itineraire"); - expect(parsedUrl.searchParams.get("resource")).toEqual("bdtopo-osrm"); + expect(parsedUrl.searchParams.get("resource")).toEqual("bdtopo-valhalla"); expect(parsedUrl.searchParams.get("start")).toEqual("3.274356,49.839862"); expect(parsedUrl.searchParams.get("end")).toEqual("5.044572,47.326213"); expect(parsedUrl.searchParams.get("profile")).toEqual("car"); diff --git a/test/tools/distance.test.ts b/test/tools/distance.test.ts index 71428160..7d575155 100644 --- a/test/tools/distance.test.ts +++ b/test/tools/distance.test.ts @@ -71,11 +71,11 @@ describe("Test DistanceTool", () => { }); it.each([ - ["car", 395174, 212, 212], - ["pedestrian", 12345, 67.8, 68], - ] as const)("should return itinerary distance and time for %s", async (profile, distance, duration, time) => { + ["car", 395174.126, 395174.13, 212, 212], + ["pedestrian", 12345, 12345, 67.83, 67.8], + ] as const)("should return itinerary distance and time for %s", async (profile, rawDistance, distance, duration, time) => { const tool = new DistanceTool(); - const getItinerarySpy = vi.spyOn(navigationItineraryClient, "getItinerary").mockResolvedValue({ distance, duration }); + const getItinerarySpy = vi.spyOn(navigationItineraryClient, "getItinerary").mockResolvedValue({ distance: rawDistance, duration }); const response = await tool.toolCall({ params: { name: "distance", arguments: { departure, arrival, profile } }, });