Skip to content

OpenStreetMap Tools ​

The @openassistant/osm package provides tools for accessing OpenStreetMap data and services including geocoding, routing, and US location data.

Installation ​

bash
npm install @openassistant/osm

Available Tools ​

Location Services ​

  • geocoding - Convert addresses to coordinates
  • reverseGeocoding - Convert coordinates to addresses
  • routing - Calculate routes between points
  • isochrone - Generate isochrone (travel time) polygons
  • roads - Get road network information

US Location Data ​

  • queryUSCity - Search US cities
  • queryUSCounty - Search US counties
  • queryUSState - Query US states
  • queryZipcode - Query US ZIP codes

Basic Usage ​

Geocoding ​

Convert an address to geographic coordinates:

typescript
import { geocoding } from '@openassistant/osm';
import { convertToVercelAiTool } from '@openassistant/utils';
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';

const geocodingTool = {
  ...geocoding,
};

const result = await generateText({
  model: openai('gpt-4'),
  prompt: 'What are the coordinates of the Eiffel Tower?',
  tools: {
    geocoding: convertToVercelAiTool(geocodingTool),
  },
});

console.log(result.text);

Usage with Assistant ​

typescript
import { geocoding, routing, isochrone } from '@openassistant/osm';
import { Assistant, type AssistantOptions } from '@openassistant/assistant';

const config: AssistantOptions = {
  ai: {
    getInstructions: () => `
      You are a helpful assistant with access to location services.
      You can geocode addresses, calculate routes, and generate isochrones.
    `,
    tools: {
      geocoding: { ...geocoding },
      routing: {
        ...routing,
        context: {
          getMapboxToken: () => process.env.MAPBOX_TOKEN!,
        },
      },
      isochrone: {
        ...isochrone,
        context: {
          getMapboxToken: () => process.env.MAPBOX_TOKEN!,
        },
      },
    },
  },
};

export function App() {
  return <Assistant options={config} />;
}

Routing ​

Calculate routes between two points:

typescript
import { routing } from '@openassistant/osm';
import { convertToVercelAiTool } from '@openassistant/utils';
import { Assistant } from '@openassistant/assistant';

const routingTool = {
  ...routing,
  context: {
    getMapboxToken: () => process.env.MAPBOX_TOKEN!,
  },
};

const config = {
  ai: {
    getInstructions: () => `You can calculate routes between locations.`,
    tools: {
      routing: routingTool,
    },
  },
};

export function App() {
  return <Assistant options={config} />;
}

Isochrone Generation ​

Generate travel time polygons:

typescript
import { isochrone } from '@openassistant/osm';
import { IsochroneComponent } from '@openassistant/leaflet';
import { Assistant } from '@openassistant/assistant';

const isochroneTool = {
  ...isochrone,
  context: {
    getMapboxToken: () => process.env.MAPBOX_TOKEN!,
  },
  component: IsochroneComponent,
};

const config = {
  ai: {
    getInstructions: () => `
      You can generate isochrone maps showing travel time from locations.
    `,
    tools: {
      isochrone: isochroneTool,
    },
  },
};

export function App() {
  return <Assistant options={config} />;
}

US Location Queries ​

Query US cities, counties, states, and ZIP codes:

typescript
import { queryUSCity, queryUSCounty, queryUSState, queryZipcode } from '@openassistant/osm';
import { Assistant } from '@openassistant/assistant';

const config = {
  ai: {
    getInstructions: () => `
      You can query US location data including cities, counties, states, and ZIP codes.
    `,
    tools: {
      queryUSCity: { ...queryUSCity },
      queryUSCounty: { ...queryUSCounty },
      queryUSState: { ...queryUSState },
      queryZipcode: { ...queryZipcode },
    },
  },
};

export function App() {
  return <Assistant options={config} />;
}

Context Options ​

Mapbox Tools (routing, isochrone) ​

These tools require a Mapbox API token:

typescript
type MapboxToolContext = {
  getMapboxToken: () => string;
};

To get a Mapbox token:

  1. Sign up at mapbox.com
  2. Create an access token
  3. Provide it via the context

OpenStreetMap Tools (geocoding, reverseGeocoding) ​

These tools use the free Nominatim service and don't require authentication. They include built-in rate limiting to comply with usage policies.

Example User Prompts ​

The AI can respond to prompts like:

  • "What are the coordinates of 123 Main Street, New York?"
  • "Find the route from San Francisco to Los Angeles"
  • "Show me a 15-minute walking isochrone from Times Square"
  • "What cities are in California with population over 100,000?"
  • "What is the address of coordinates 37.7749, -122.4194?"
  • "Find ZIP codes near 94102"

Rate Limiting ​

The OSM tools include built-in rate limiting to comply with service usage policies:

  • Nominatim (geocoding, reverse geocoding): 1 request per second
  • Mapbox (routing, isochrone): Configured based on your plan

Complete Example ​

typescript
import { geocoding, routing, isochrone, queryUSCity } from '@openassistant/osm';
import { IsochroneComponent } from '@openassistant/leaflet';
import { Assistant, type AssistantOptions } from '@openassistant/assistant';

const config: AssistantOptions = {
  ai: {
    getInstructions: () => `
      You are a helpful location assistant.
      You can:
      - Geocode addresses
      - Calculate routes
      - Generate travel time maps
      - Query US location data
    `,
    tools: {
      geocoding: { ...geocoding },
      routing: {
        ...routing,
        context: {
          getMapboxToken: () => process.env.MAPBOX_TOKEN!,
        },
      },
      isochrone: {
        ...isochrone,
        context: {
          getMapboxToken: () => process.env.MAPBOX_TOKEN!,
        },
        component: IsochroneComponent,
      },
      queryUSCity: { ...queryUSCity },
    },
  },
};

export function App() {
  return <Assistant options={config} />;
}

Data Caching ​

Results from OSM tools can be cached for use with other tools:

typescript
import { geocoding } from '@openassistant/osm';
import { keplergl } from '@openassistant/map';
import { ToolCache } from '@openassistant/utils';

const toolResultCache = ToolCache.getInstance();

const geocodingTool = {
  ...geocoding,
  onToolCompleted: (toolCallId: string, additionalData?: unknown) => {
    // Cache geocoding results
    toolResultCache.addDataset(toolCallId, additionalData);
  },
};

const keplerglTool = {
  ...keplergl,
  context: {
    getDataset: async (datasetName: string) => {
      // Use cached geocoding results
      if (toolResultCache.hasDataset(datasetName)) {
        return toolResultCache.getDataset(datasetName);
      }
      throw new Error(`Dataset ${datasetName} not found`);
    },
  },
};

API Reference ​

For detailed API documentation, see the OSM API Reference.

Next Steps ​

Released under the MIT License.