AI Assistant¶
The AI Assistant is a "chat with your data" panel that turns plain-English requests into GeoLibre's own operations — Spatial SQL, layer styling, map control, and more — and applies them through the app, the same way you would by hand. Open it from Processing → AI Assistant (top of the menu) or the command palette. It docks as a resizable panel at the bottom of the window (drag its top edge to resize, ✕ to close).
Because the assistant acts through the store rather than poking the map directly, almost everything it does is undoable with Ctrl/Cmd + Z, and every tool call (including the SQL it generates) is shown in the transcript so you can see exactly what ran.
The assistant is optional and disabled until you configure an API key. No data leaves your machine until you add a key and send a prompt.
Setup: add an API key¶
The assistant is provider-pluggable — it uses the Strands Agents SDK. Configure one (or more) providers in Settings → Environment Variables as environment variables:
| Provider | Environment variable(s) | Default model |
|---|---|---|
| Google Gemini | GEMINI_API_KEY or GOOGLE_API_KEY |
gemini-3.5-flash |
| Anthropic | ANTHROPIC_API_KEY |
claude-opus-4-8 |
| OpenAI | OPENAI_API_KEY |
gpt-5.5 |
| Ollama (local) | OLLAMA_BASE_URL (e.g. http://localhost:11434) |
llama3.2 |
| Amazon Bedrock | AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ AWS_REGION, optional AWS_SESSION_TOKEN) |
global.anthropic.claude-sonnet-4-6 |
| Custom (OpenAI-compatible) | OPENAI_COMPATIBLE_BASE_URL (+ optional OPENAI_COMPATIBLE_API_KEY) and OPENAI_COMPATIBLE_MODEL |
— |
- Ollama runs models on your own machine — no API key and nothing leaves your
computer. Point
OLLAMA_BASE_URLat your Ollama host (the/v1suffix is added automatically); setOLLAMA_MODELto pick which pulled model to use. - Bedrock calls AWS from the browser using your credentials (and the model
id is an inference-profile id such as
global.anthropic.claude-sonnet-4-6; setBEDROCK_MODELto choose another). - Custom covers any OpenAI-compatible endpoint — LiteLLM, vLLM, OpenRouter, Groq, Together, a local server, etc. — via its chat-completions API.
Hosted keys (and AWS credentials) are used directly from your browser to call the provider; they are never sent to GeoLibre's servers. Saving the setting enables the panel immediately — no reload needed.
Optional variables:
| Variable | Purpose |
|---|---|
GEOLIBRE_ASSISTANT_PROVIDER |
Force a provider (google / anthropic / openai) when several keys are set. |
GEOLIBRE_ASSISTANT_MODEL |
Pin a specific model id, overriding the default and the picker. |
TAVILY_API_KEY |
Enable reliable web search (the keyless fallback is best-effort and may be blocked by the browser). |
When more than one provider key is configured, a provider dropdown appears in the panel header; a model dropdown lets you switch models for the selected provider. Your choice is remembered across sessions.
Reading keys from your system environment (desktop)¶
On the desktop app, GeoLibre also reads the assistant's keys directly from
your operating system's environment variables — the ones you export from your
shell profile or set in the Windows Environment Variables dialog. Set a
supported variable in your OS environment, restart the app, and the matching
provider is configured automatically: you never type the key into Settings, and
because it is not entered there, it is never written to the saved
.geolibre.json project file. This is the recommended way to keep API keys out
of project files that you share or commit.
Only the following allowlisted names are read from your environment — GeoLibre
never reads any other system variable (your PATH, HOME, and the like never
reach the app), and this allowlist is enforced in the native backend, not just
the UI:
| Group | Variables read from the OS environment |
|---|---|
| Provider / model overrides | GEOLIBRE_ASSISTANT_PROVIDER, GEOLIBRE_ASSISTANT_MODEL |
| Google Gemini | GEMINI_API_KEY, GOOGLE_API_KEY, GOOGLE_GENAI_API_KEY |
| Anthropic | ANTHROPIC_API_KEY |
| OpenAI | OPENAI_API_KEY |
| Ollama | OLLAMA_BASE_URL, OLLAMA_MODEL |
| Custom (OpenAI-compatible) | OPENAI_COMPATIBLE_BASE_URL, OPENAI_COMPATIBLE_API_KEY, OPENAI_COMPATIBLE_MODEL |
| Web search | TAVILY_API_KEY |
Precedence: a value you enter in Settings → Environment Variables always wins; the OS environment only fills in the gaps. In the AI settings, any field supplied by the environment shows a note naming the variable backing it — leave that field blank to keep using the environment value.
Amazon Bedrock is not sourced from the OS environment
Bedrock's AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY credentials (and the
ambient OLLAMA_HOST) are deliberately excluded from OS-environment
reading: developers commonly have AWS credentials exported in their shell for
unrelated work, and silently adopting them could auto-activate Bedrock and
bill their AWS account for LLM calls they never intended. To use Bedrock,
enter the credentials in Settings → Environment Variables.
Desktop only
Reading OS environment variables requires the native backend, so it applies to the desktop app only. The browser and Jupyter builds cannot read the system environment; there, enter keys in Settings → Environment Variables (or bake them in at build time). Changes to OS variables are picked up on the next app launch.
Using it¶
Type a request and press Ctrl/Cmd + Enter (or click Send). The assistant streams its reply, runs tools as needed, and reports what it did. While it is working, Send becomes Stop — click it to cancel. Clear (the eraser icon) starts a fresh conversation.
show me all parcels larger than 1 hectare within 500 m of a river
color the counties by population using a graduated red ramp
buffer the roads by 100 m, then clip them to the county boundary
load the latest Sentinel-2 scene over this view
zoom to Africa, then switch to a dark basemap
add an OpenTopoMap basemap
What it can do¶
The assistant works by calling a fixed set of tools — it cannot invent operations, so its actions stay within GeoLibre's validated surface.
| Capability | What it does |
|---|---|
| Inspect layers | Lists loaded layers, their geometry, attribute fields, and SQL table names (schema only — never your full data). |
| NL → Spatial SQL | Generates and runs a read-only DuckDB Spatial SQL query through the SQL Workspace, and can add the result as a layer. |
| Geoprocessing | Runs the registered processing algorithms (buffer, clip, dissolve, intersection, difference, union, spatial join, simplify, H3 grids, …) and chains them into multi-step pipelines, adding each result as a layer. |
| Symbology | Applies a graduated (numeric) or categorized (text) color ramp to a layer. |
| Add data | Adds a layer from a public GeoJSON URL, or an XYZ tile basemap by name (osm, opentopomap, carto-dark) or a custom {z}/{x}/{y} URL. |
| Earth observation | Searches the Microsoft Planetary Computer STAC catalog (Sentinel-2, Landsat, NAIP, DEMs, …) and adds an item over the current view as a raster layer — tiles are signed server-side, so no credentials are needed. |
| Map control | Moves the camera (fit a layer or a bounding box), switches the basemap, toggles layer visibility/opacity, and removes layers. |
| Web search | Looks up current information online (best with TAVILY_API_KEY). |
| Code fallback | For tasks with no dedicated tool, runs a small JavaScript snippet against the live map (e.g. globe projection) or a Python snippet in the Pyodide runtime. |
Sample prompts¶
Prompts are free-form — these are starting points, not fixed commands. Refer to layers by name; the assistant looks up the rest. You can also chain steps in one message ("buffer the roads by 100 m and then clip to the county boundary") or keep refining across turns ("now color it by area").
Explore & query
what layers are loaded, and what fields does the parcels layer have?
how many parcels are larger than 1 hectare?
list the 10 most populous counties with their population
show parcels within 500 m of a river and add them as a layer
count points in each polygon of the districts layer
Geoprocessing & analysis
buffer the roads by 100 meters
buffer the roads by 100 m, then clip the buffer to the county boundary
dissolve the parcels by zoning type
find where the floodplain overlaps the buildings (intersection)
create an H3 hex grid at resolution 8 over the points and count points per cell
compute centroids of the counties and add them as a layer
Symbology
color the counties by population with a graduated red ramp
style the parcels categorized by land-use type
shade the tracts by median income using a viridis ramp with 7 classes
Add data & imagery
load the latest Sentinel-2 scene over this view
add the most recent cloud-free Landsat image for this area
search the Planetary Computer for NAIP imagery here
add an OpenTopoMap basemap
add this GeoJSON: https://example.com/data.geojson
Map control & styling
zoom to the parcels layer
fly to San Francisco
switch to a dark basemap
hide the buildings layer and set the parcels opacity to 0.5
remove the temporary buffer layer
Advanced (code fallback)
switch the map to a 3D globe projection
enable terrain with hillshade exaggeration of 1.5
load a CSV from a URL with pandas and summarize its columns
Safety and privacy¶
- Acts through the store. Layer, style, basemap, and add/remove actions go through the same one-way data flow as the rest of the app, so they are reconciled consistently and covered by undo/redo.
- Auditable. The generated SQL and every tool call appear in the transcript.
- Read-only SQL. The
run_sqltool rejects anything that isn't aSELECT/WITHquery. - Scoped context. Only layer/table names, attribute field names, and the current view are sent to the model — not your feature data.
- What leaves your browser. When you send a prompt, it (plus that scoped context) is sent to your chosen LLM provider using your own key. Don't enable the assistant on sensitive data you can't share with that provider.
Code-execution caveat
The JavaScript and Python fallbacks execute model-generated code in the app to cover requests no dedicated tool handles. Their direct map changes bypass the store and are not undoable. The code is shown in the transcript.
Limitations¶
- Requires a provider API key; offline use is not supported.
- Subject to each provider's cost, rate limits, and your network's CORS/CSP policy (browser-side calls).
- The unofficial Google Maps tile endpoints are intentionally not included; use the listed officially-supported basemaps or supply your own XYZ URL.