Documentation

Use the agent. Understand the framework. Deploy your own.

Two audiences. Users of ASKTERRA leave knowing how to get useful answers fast, interpret outputs, and recognize when the agent is going off the rails. Operators & architects leave understanding how the framework is structured, how a new deployment is configured in one YAML file, and where the seams are when you wire in custom tools or specialist agents.

Getting started

Three prompts to try first. Paste any of these into the chat to feel the loop end-to-end:
  • Show me a Landsat 9 true-color composite for summer 2024 over Yellowstone National Park.
  • Map LCMS land cover for the Salt Lake City metro area in 2024 and chart the area in each class.
  • What's the most recent cloud-free Sentinel-2 image over Boulder, Colorado, and what's the NDVI?
  1. Browse without signing in. These docs, the About page, the Products page, and the legal pages are public. The Chat and Scripts tabs only appear in the navbar after you sign in — that's expected, not a bug.
  2. Sign in. Click the Sign In arrow at the top-right and pick the Google account your operator added to the access list. After consent you land back on the chat page within a few seconds.
  3. Open the welcome screen. The center shows a short greeting and a few starter prompts — clickable example questions. Click any one to send it as your first message, or type your own into the chat box at the bottom.
  4. Watch the agent work. Text streams in as it's written; tool calls appear as collapsible blocks; maps, charts, and thumbnails render inline as the agent produces them. Most analyses take 10–60 seconds.
  5. Interact with the outputs. Click maps to query pixels, toggle layers, and animate time-lapses; click chart points to inspect; click any artifact title to open it full-screen in a new tab.
  6. Refine with follow-ups. The chat remembers your study area, dates, intermediate variables, and previous outputs across turns in the same session — say "now show me the same thing for 2010" or "make a chart of the area in each class."
Don't know if you have access? If you can't tell whether your email is on the allow-list before clicking Sign In, contact the AskTerra team at askterra@redcastleresources.com before you try to sign in — they can add you in a couple of minutes and save you a confused round-trip.
Tip. Each chat session is independent. Click + New Session in the left pane to start fresh, or click any session title to resume where you left off. The session pane also shows running token usage so you can see the cost of long conversations.

How a session works

In plain English: your message becomes a series of tool calls; each tool runs in its own sandbox; outputs stream back as they're produced. Here's the same flow with the moving parts named — useful when you're debugging a stuck turn or evaluating where work happens.

  1. Chat UI sends your message to the backend over Server-Sent Events (/run_sse).
  2. Gemini reads your message, the recent history, and the registered tool list, then decides which tools to call (often several in sequence).
  3. MCP server(s) execute the tools the model called — most commonly the geeViz MCP, a sandboxed Python REPL that holds your session's variables across turns. The agent can also call remote MCPs, Python functions, and grounding sources from the same tool list.
  4. Earth Engine does the geospatial compute. The framework's credential proxy — a small in-process module that holds the service account and mints short-lived bearer tokens server-side — means your browser never holds EE credentials, and every call is stamped with a per-user workload tag for attribution.
  5. Artifact service writes maps, charts, thumbnails, and reports to per-session storage (local filesystem in dev, GCS in prod) and serves them from stable URLs that survive tabs and reloads.
  6. Streamed back — the Chat UI receives the agent's narrative text, the tool-call blocks, and artifact links on the same SSE channel as they arrive, so you see the answer assemble in real time instead of waiting for a final blob.

The framework

What's a "tenant"? One deployment of the framework — with its own brand, access policy, agent topology, and tool set. ASKTERRA is one tenant; other tenants run elsewhere on the same engine. Throughout this page, "tenant" = one instance.

What you're using is one tenant of a reusable, multi-tenant agent framework — geeViz Agent. ASKTERRA is the deployment; geeViz Agent is the framework that runs it. Each tenant has its own brand, access policy, AI tools, and Cloud Run service — but shares a single, battle-tested conversation engine, artifact pipeline, sandbox, and Earth Engine auth proxy.

Single agent, multi-agent, sub-agents, and A2A

The framework treats agent topology as configuration. The same engine that runs a single root agent runs a constellation of specialists — operators choose what fits the use case.

  • Single root agent (the default) — one strong agent handles the entire conversation: dataset choice, code generation, visualization, narrative. Simplest to operate; best when the work is broadly geospatial and a single model context is sufficient.
  • In-process sub-agents — declare a sub_agents list under any agent spec. Each sub-agent has its own model, tools, MCP servers, instructions, and even its own sub-agents (recursive). Use this for specialists the root delegates to — a fact-checker, a citation-finder, an output-quality reviewer, a domain expert (forestry, hydrology, urban planning). Sub-agents share the parent's session context.
  • Agent-to-Agent (A2A) connectors — declare an a2a list with the URL of a remote agent. Each connector becomes an ask_<name>(question) tool the root can call. Use this when the specialist runs as a separate service — a different tenant's agent, a customer's in-house GIS agent, a partner's analytical model.
  • Hierarchies — sub-agents can themselves have sub-agents and A2A connectors. The framework handles orchestration, context-passing, per-event token accounting, streaming, and tool-call attribution at every layer.

A deployment that begins as a single agent grows into a multi-agent system as its use cases broaden — without rewriting code, only by editing tenant.yaml.

Custom tools — Python, MCP, or both

Every agent in the framework reads its tool surface from configuration. Operators have three ways to add custom tools — and they compose freely on the same agent.

  • Plain Python functions (agent.tools block) — drop a Python file into the tenant package, point the agent's tools entry at it, and your function becomes a tool the model can call. The simplest path for proprietary calculations, internal APIs, lookup tables, or domain-specific transformations. Lives in-process — no separate server to deploy.
  • Local MCP servers (type: stdio) — declare an MCP server the agent process launches as a subprocess at startup. The framework's reference geeViz MCP works this way: a sandboxed Python REPL exposing the full Earth Engine + geeViz tool surface. See this instance for the actual tool roster bound here.
  • Remote MCP servers (type: streamable_http) — declare an MCP server reachable over HTTP. The framework's reference gmaps MCP works this way: Google Maps Platform for place search, geocoding, routing, Street View, weather, and air quality. The same pattern plugs in any internal GIS service, third-party analytics API, specialty model, or partner data feed that speaks MCP.

The agent doesn't distinguish a built-in capability from a custom Python function from a remote MCP tool. They appear in the same tool list, get called the same way, contribute to the same conversation. Custom tools are how a single framework serves dramatically different verticals — forestry, finance, defense, infrastructure — without forking.

Architecture

A deployed tenant is a single FastAPI process built around Google ADK:

  • FastAPI + Google ADK — serves the chat UI, the SSE streaming endpoint (/run_sse), the artifact + map proxy routes, the admin endpoints, the auth middleware, and the Earth Engine credential proxy.
  • Tenant config — a single tenant.yaml declares brand, theme, agent hierarchy, MCP servers, A2A connectors, RAG sources, sub-agents. The framework reads it at startup and constructs the ADK Agent tree.
  • MCP subprocess(es) — every tool surface the agent uses is exposed via Model Context Protocol. The framework supports both stdio (local subprocess) and streamable_http (remote MCP server) transports, with sandboxed REPLs and built-in audit logging.
  • Earth Engine via geeViz.eeAuth — holds service-account credentials in-memory, mints per-request bearer tokens, and stamps every EE call with a workload tag (agent__map__<tenant>__<user>__<session>) so usage is attributable per-user.
  • Artifact service — local filesystem in dev, GCS in prod. Every map, chart, thumbnail, PDF, and dashboard is written here and served from a stable per-session URL that survives across tabs and reloads.
  • Auth middleware — gates every non-public path with a signed session cookie. The cookie is set by Google Sign-In, with Cloud IAP available as a legacy fallback.
  • Per-tenant Cloud Run service — each instance runs in its own GCP project (or sub-project), with its own runtime service account, Cloud SQL session store, GCS artifact bucket, Secret Manager entries, and Cloud Logging sink. The setup wizard provisions all of it on first deploy.

RAG sources

Any agent can be grounded with retrieval-augmented generation via the rag_sources list. Supported source types:

  • vertex_search — Vertex AI Search datastores (PDFs, web crawls, structured data).
  • gemini_file_search — Gemini's File API for ad-hoc document grounding.
  • google_search — built-in Google Search grounding for fresh web context.
  • custom_http — any HTTP endpoint that returns documents matching the framework's RAG response schema.

RAG results appear inline in the model's response with citation chips that link to the source document.

Auth and access model

The framework supports two sign-in paths simultaneously:

  1. Google Sign-In — the primary path. Configured by an OAuth client ID; gated by per-environment ADMIN_EMAILS and USER_EMAILS lists. Each list entry can be a single email or a Google Group email — group membership is checked at sign-in via the Cloud Identity API and cached briefly. Manage access by editing the group in Workspace; no redeploy needed.
  2. Cloud IAP — legacy / internal deployments can stay on Identity-Aware Proxy. The framework reads the X-Goog-Authenticated-User-Email header as a fallback.

Role on the session is either admin or user; admins see the /admin dashboard, users see chat + scripts only. Public pages (/, /about, /products, /docs, /privacy, /terms, /eula) render without sign-in so anonymous visitors can learn about the deployment before they sign in.

Customization (tenant.yaml)

Almost everything an operator usually wants to change lives in one file: tenant.yaml. The framework reads it at startup; restart the service to pick up changes — no recompile, no migration. The blocks group naturally into three concerns:

Brand & visuals

  • slug, name, short_name, title — brand identifiers used in the navbar, page titles, and email subjects.
  • theme — dark + light palettes, each ~20 CSS variables (surface, text, accent, dividers, etc.). Written into a :root block at request time so the entire UI is themed without forking CSS.
  • typography, logos, ui.starter_questions, footer — the rest of the brand surface.

Agent & tools

  • agent — the root agent spec (recursive): model, temperature, tools, MCP servers, sub-agents, A2A connectors, RAG sources, instructions addendum.
  • ee, model_armor — Earth Engine tier + quota project, content-screening template + RAI filter thresholds.

Access & contact

  • auth — public path list, session cookie config, optional Workspace-domain restriction.
  • contact — support email, label, docs URL, mail-subject prefix.

A real tenant.yaml is ~150–300 lines; what follows is the spine — enough structure to recognize the shape, not a full schema:

slug: askterra
name: Geospatial Agent
short_name: ASKTERRA
title: ASKTERRA Geospatial Agent

theme:
  dark:  { bg: "#1e1e1e", text: "#d6d1ca", accent: "#48848f", ... }
  light: { bg: "#f5f1ec", text: "#372e2c", accent: "#00897b", ... }

agent:
  model:
    api_default_name: gemini-3.5-flash
    thinking_budget: 16384
    temperature: 0.3
  mcp_servers:
    - { name: geeviz, type: stdio, script: geeViz/mcp/server.py }
    - { name: gmaps,  type: streamable_http, url: https://mapstools... }
  sub_agents: []
  a2a: []
  rag_sources: []

auth:
  enabled: true
  public_exact: [/, /about, /products, /docs, /privacy, /terms, /eula]

For things that change between environments — secrets, OAuth client IDs, allow-lists — the framework uses per-environment .env.test and .env.prod files that the deploy script forwards as Cloud Run environment variables. Editing the env file and redeploying is the canonical "update access" workflow.

This instance (ASKTERRA)

Specifically for the deployment you're using right now:

  • URL pattern — the Chat tab lives at / (or /chat, which redirects there). After you start or open a session your URL looks like /?session=<id> — that <id> is your session identifier.
  • Topology — single root agent (no sub-agents, no A2A connectors, no RAG sources). The full conversation runs end-to-end on one agent.
  • Brand — ASKTERRA Geospatial Agent, operated by RedCastle Resources.
  • Modelgemini-3.5-flash with a 16384-token thinking budget (temperature 0.3).
  • MCP servers — the geeviz stdio MCP (the full Earth Engine + geeViz tool surface) plus the gmaps streamable_http MCP (Google Maps + places + routes + Street View + weather + air quality).
  • Built-in grounding — Gemini's native Google Search tool is enabled in addition to all MCP-provided tools.
  • Access — Google Sign-In gated by ADMIN_EMAILS + USER_EMAILS (each entry can be an individual email or a Google Group).
  • Hosting — Cloud Run with Cloud SQL session store, GCS artifact bucket, and Model Armor content screening at the HIGH threshold.

geeViz MCP tool roster

The geeviz MCP exposes 12 tools to the agent. User-visible marks tools you'll typically see as tool-call blocks in the chat; Background marks tools the agent uses invisibly to set up an answer.

  • run_code User-visible — sandboxed Python REPL (the workhorse).
  • search_geeviz Background — look up geeViz functions, modules, examples.
  • search_datasets Background — query the Earth Engine catalog.
  • inspect_asset Background — bands, dtypes, class properties.
  • env_info Background — runtime environment + package versions.
  • export_image User-visible — long-running EE image exports.
  • get_streetview User-visible — Street View imagery for a lat/lng.
  • geeviz_search_places Background — geocode and place lookup.
  • manage_asset User-visible — create / move / delete user assets.
  • map_control User-visible — center, layer order, basemap, legend.
  • save_session User-visible — snapshot the current REPL state.
  • view_output User-visible — open the rendered map/chart/report.

Other tenants of the same framework swap any of these out — different model, different MCP servers, different brand, different access policy — without modifying the framework code.

Extending: your own tenant

If you operate the framework (or are evaluating it), the typical lifecycle for a new tenant breaks into three phases. Time estimates assume a fresh GCP organization and someone reasonably comfortable with Cloud Run.

Phase 1 — Provision & configure
  1. Run the setup wizard (~30–60 min the first time, ~10 min on re-runs)python -m geeviz_agent.create_tenant walks you through GCP project creation, API enables, IAM, Cloud Logging, Model Armor template, Maps + Gemini API keys, ADC, scaffold of tenants/<slug>/, Google Sign-In OAuth client setup, and end-to-end verification. Most steps are idempotent; re-run with --resume <slug> picks up where you left off.
  2. Customize tenants/<slug>/tenant.yaml (~30 min for a baseline) — brand, palette, agent config, MCP servers, custom Python tools, sub-agents, A2A connectors, access policy. Most operators edit ~30 lines for a baseline deployment.
  3. Drop your logos (~10 min) into tenants/<slug>/static/ — light and dark wordmarks plus a favicon.
  4. Wire your tools (~30 min to several hours) — add a Python module under tenants/<slug>/tools/ for in-process functions, or declare a custom MCP server (local or remote) under agent.mcp_servers. Add sub-agents under agent.sub_agents or A2A connectors under agent.a2a.
  5. Set .env.test / .env.prod (~10 min) — at minimum ADMIN_EMAILS and GOOGLE_OAUTH_CLIENT_ID.
Phase 2 — Deploy
  1. Deploy (~5–15 min per push)./deploy.sh test builds a container, pushes a Cloud Run revision, and (first run) provisions Cloud SQL + GCS bucket + Secret Manager entries. ./deploy.sh prod does the same for production.
  2. Map a custom domain (~15 min + DNS propagation) — Cloud Run domain mapping or an external load balancer with managed TLS.
Phase 3 — Operate
  1. Grant & revoke access — add team members to ADMIN_EMAILS / USER_EMAILS, or (better) put a Google Group on those lists and manage membership in Workspace so access changes don't require a redeploy.
  2. Monitor — per-tenant Cloud Logging sink captures the FastAPI + agent process logs; per-tenant BigQuery dataset captures Gemini per-event token usage for cost attribution. The /admin dashboard (admins only) surfaces recent sessions, live token counts, and tool-call errors.
  3. Roll model upgrades — edit agent.model.api_default_name in tenant.yaml, redeploy. Per-event token accounting makes it easy to compare cost/latency of the old vs new model on real traffic before switching production over.
  4. Rotate secrets — OAuth client secret, Cloud SQL password, signing key, and the Maps Platform key all live in Secret Manager. Rotate via gcloud secrets versions add; Cloud Run picks up new versions on the next revision.
  5. Scale Cloud Run — tune min-instances upward for zero cold-start latency, or max-instances upward if a tenant outgrows the default ceiling. Earth Engine compute cost dwarfs Cloud Run cost in practice, so watch EE quota, not container instance hours.
  6. Watch Gemini cost — the per-tenant BigQuery usage table records every Gemini API call with token counts.

Prompting tips

  • Study area: "Sandy County, Wyoming" beats "the western US." A named place, a county/state, or a bounding box all work.
  • Time window: "From 2018 to 2024", "summer 2024 (Jun–Aug)", or "the most recent cloud-free image" are clearer than "recently."
  • Dataset: name it if you know it. "Use NLCD 2021" or "use LCMS v2024-10" beats "use the standard land cover."
  • One output at a time: a map, then a chart of the same data, then a thumbnail for a report — easier to verify than asking for everything in one shot.
  • Push back: when something looks wrong, say so — "Are you sure those are the correct date ranges?"
  • Verify: "What asset ID did you use? How many features in the FeatureCollection? What's the date of the most recent image?"

Anti-example

Vague prompts force the agent to guess; specific prompts get useful answers in one turn.

BAD

show me everything about the west

The agent has to ask follow-up questions or guess — either wastes a turn.

GOOD

show me LCMS land cover change for Yellowstone NP between 2000 and 2024, with a Sankey of the top transitions

Study area, dataset, time window, and desired output are all specified — the agent can act in one turn.

Use cases

Real prompt-to-output sequences. Open the Chat tab and paste any prompt to try it. Adapt the study area, dates, and datasets to your domain.

About the abbreviations. cl. / tl. / rl. / gil. / sal. are real geeViz module aliases — hover any of them to see the full module path. ee.* names are Earth Engine API methods — see the EE API docs.

Click any case to expand or collapse.

Land cover change — LCMS over the Wasatch Front

Goal: see how land cover has changed over a metro area between 1985 and the most recent year.

turn 1

Map LCMS land cover for the Salt Lake City metro area in 1985 and 2024 side by side.

Agent looks up USFS/GTAC/LCMS/v2024-10, filters to year=1985 and year=2024 over a Salt Lake bbox, adds both as map layers with the dataset's official class colors.

turn 2

Make a Sankey diagram of land cover transitions between 1985 and 2024 for the same area.

Agent calls cl.summarize_and_chart with chart_type='sankey' — interactive Sankey HTML.

turn 3

Save a one-page report with both the 1985 vs 2024 map and the Sankey, plus a summary of the largest transitions.

Agent assembles a report via rl — map thumb + Sankey + top-transitions table + narrative paragraph — saved as HTML.

Wildfire burn severity — MTBS + dNBR

Goal: map burn severity for a named fire and compare to MTBS perimeters.

turn 1

Pull the MTBS burn perimeter for the Palisades Fire (January 2025) and add it to the map.

Filters the MTBS FeatureCollection by name + year, returns the perimeter polygon as a vector layer.

turn 2

Compute pre-fire vs post-fire dNBR from Landsat 8/9 and show the burn severity classes (low / medium / high).

Builds two Landsat composites (60 days before/after the fire start) via gil, computes dNBR, thresholds into 4 classes with the MTBS color ramp.

turn 3

Chart the area in each severity class inside the burn perimeter.

Reduces the dNBR class image inside the burn polygon with ee.Reducer.frequencyHistogram(), renders as a bar chart with class names + acres.

Drought + vegetation stress — GRIDMET + NDVI

Goal: correlate drought conditions with vegetation response over a rangeland.

turn 1

Show GRIDMET drought (PDSI) over the Powder River Basin, monthly for 2020–2024.

Filters IDAHO_EPSCOR/GRIDMET to monthly composites of PDSI, animates as a time-lapse layer.

turn 2

Now add MODIS NDVI for the same months, and chart the basin-mean NDVI anomaly (vs the 2010–2019 baseline).

Builds a baseline mean NDVI (2010–2019 monthly), subtracts from each 2020–2024 month, charts the time series via cl.

turn 3

Where in the basin had the largest NDVI decline during the 2022 drought peak?

Spatial reduce — classify pixels by anomaly bin, render a "decline hotspots" thumbnail via tl with legend + scale bar.

Urban growth — Dynamic World + NLCD impervious

Goal: quantify new built-up area in a fast-growing region.

turn 1

How much new "built" area appeared in Maricopa County between 2017 and 2024 according to Dynamic World?

Loads GOOGLE/DYNAMICWORLD/V1, computes annual mode classes for 2017 and 2024, intersects "built" pixels, reports added square kilometers (zonal stats via sal).

turn 2

Cross-check with NLCD 2021 impervious surface fraction — where do the two disagree?

Loads USGS/NLCD_RELEASES/2021_REL/NLCD/2021 impervious band, builds an agreement/disagreement mask, charts the area in each category.

Flood mapping — Sentinel-1 SAR

Goal: map flood extent shortly after an event using SAR (clouds don't block radar).

turn 1

Map flooded area in the lower Mississippi after the storm peak around February 2025. Use Sentinel-1.

Loads COPERNICUS/S1_GRD, builds a pre-event and post-event median, applies a VV-band threshold mask, displays the difference as the flood layer.

turn 2

Overlay urban areas to show which population centers were inundated.

Adds GHSL or NLCD urban classes as a vector layer, intersects with the flood mask, reports affected populated pixels.

Snow cover persistence — MODIS

Goal: rank watersheds by snow persistence for water-supply forecasting.

turn 1

Compute MODIS snow cover persistence (April–May) over the upper Colorado River basin for 2020–2024 and rank HUC-8 watersheds by persistence.

Uses MODIS/061/MOD10A1, counts days with snow per pixel across the date window, reduces by HUC-8 boundary, returns a ranked table + a choropleth.

Saved scripts

Once an analysis is working, save it as a parameterized script anyone with access can re-run without going through the chat — no LLM in the loop, no token cost. Useful for hand-offs, dashboards, and "run this every Monday" workflows.

  1. In the chat, hover over a successful code block; a + Save as script button appears in the block's toolbar. (Alternative: open the Scripts tab and click + New from Chat.)
  2. Name your script and add a description so collaborators understand what it does.
  3. Edit parameter values (study area, dates, scale, output filename) and click Run Script.
  4. Outputs render below — re-run any time with new parameter values.
What's pre-imported in a script. A saved script runs in the same sandbox as run_code, with these aliases already bound. No import statements needed in your script body.
  • eeearthengine-api
  • Mapgv.geeView.Map
  • gvgeeView
  • gilgetImagesLib
  • salgetSummaryAreasLib
  • edwedwLib
  • gmgoogleMapsLib
  • palettesgeePalettes
  • cloutputLib.charts
  • tloutputLib.thumbs
  • rloutputLib.reports
Self-contained rule. A saved script runs in a fresh REPL (no chat history) — make sure the code defines every variable it uses. If a script fails with a NameError, edit it to add the missing definitions near the top.

BAD — depends on chat-history state that no longer exists:

# 'aoi' and 'lcms' were defined in earlier chat turns — gone now
classes = lcms.filter(ee.Filter.eq('year', 2024)).first()
Map.addLayer(classes.clip(aoi), {}, 'LCMS 2024')

GOOD — every name is defined inside the script:

aoi = ee.Geometry.BBox(-112.1, 40.6, -111.7, 40.9)
lcms = ee.ImageCollection('USFS/GTAC/LCMS/v2024-10')
classes = lcms.filter(ee.Filter.eq('year', 2024)).first()
Map.addLayer(classes.clip(aoi), {}, 'LCMS 2024')

Reports + exports

Output types

  • Maps are standalone HTML files that include the layer state and the legend — share the link with anyone who has access to your session.
  • Charts are Plotly HTML — interactive, with download buttons for PNG / CSV.
  • Thumbnails (single-image PNG, animated GIF, filmstrip) include legends, scale bars, inset locators, and basemaps.
  • Reports bundle multiple sections (map thumb, chart, table, narrative paragraph) into one HTML page suitable for emailing or printing to PDF via your browser's Cmd/Ctrl + P → Save as PDF.
  • Tables render as markdown in the chat; the agent can produce CSV via df.to_csv(...) if you ask.
  • Runnable Python — every analysis is exportable as a standalone script.
Vector export formats. If you need a vector deliverable (GeoJSON, KML, shapefile), ask explicitly — the agent can convert a FeatureCollection via Earth Engine's Export.table.toDrive() with the appropriate fileFormat=. Raster GeoTIFFs go via export_image.

Where outputs live

Every artifact appears inline in the chat and is listed in the session's artifacts panel. Each one has a stable per-session URL that survives tab reloads and works for anyone with access to your session. Artifacts persist for the life of the session.

Troubleshooting

Long-running analysis fails — Earth Engine "Computation timed out"
EE-side compute timeout. Fix at the analysis level — coarsen the scale, shrink the AOI, or shorten the time window. See the Top tip on coarsening scale.
Long-running analysis fails — ADK / agent timeout (chat hangs > 5 minutes)
Framework-side timeout: the agent's heartbeat to the MCP subprocess didn't return. Any saved scripts survive a refresh (they live in the database). Refresh, start a new session, and if the same analysis hangs again, treat it as the EE case above and coarsen the scale.
"Memory limit exceeded"
Same family as the EE timeout. Coarsen scale, shrink AOI, or shorten time window.
Empty / blank map
Usually means a filter returned 0 features or images. Ask: "how many features matched the filter?" — the agent will add a .size().getInfo() probe.
Map shows but my polygon outline is invisible
The polygon is probably bigger than the visible map area. Zoom out, or ask the agent to "center the map on the study area."
Map or chart renders, but the legend is wrong
Ask: "use the dataset's official class names and colors for the legend" or "inspect the asset's class properties and rebuild the legend from those."
Agent referenced a dataset that doesn't exist (made-up asset ID)
If you don't see a search_datasets or inspect_asset call before the agent uses an asset ID, treat the ID as unverified — ask "did you verify that asset exists?" Pre-empt it by naming the dataset in your prompt ("use NLCD 2021").
"Wrong" classification or numbers that don't match a published source
Ask: "what asset ID did you use? what version? what date range? what scale?" — most disagreements trace back to a different dataset version or window.
"You're not authorized for this app"
Your email isn't in the access list. Contact the AskTerra team at askterra@redcastleresources.com.

Get help

Stuck or have a feature request? Email the AskTerra team at askterra@redcastleresources.com. Including your session ID and a screenshot of the failure makes triage roughly 10x faster.

How to grab your session ID. It's the value after ?session= in the browser URL bar — click the URL bar, select all (Ctrl/Cmd + A), copy (Ctrl/Cmd + C) and paste into your email.

Additional documentation: https://docs.askterra.io. For a product overview, see the About page. Legal documents: Terms, Privacy, EULA.