CSA · DEC AI Team

DEC Chatbot — User Manual Clavardage DEC — Manuel d'utilisation

Last updated: April 2026  ·  Backend v2 (Claude Sonnet 4.6) Mis à jour : avril 2026  ·  Serveur v2 (Claude Sonnet 4.6)

OverviewVue d'ensemble

The DEC Chatbot is a conversational AI assistant that lets researchers and scientists search Canadian Earth Observation (EO) data catalogues using plain-language queries in English or French. It is live at dec-chat-dev.csadecai.com.

Le clavardage DEC est un assistant d'intelligence artificielle conversationnel qui permet aux chercheurs et aux scientifiques d'effectuer des recherches dans les catalogues de données d'observation de la Terre (OT) canadiens à l'aide de requêtes en langage naturel, en anglais ou en français. Il est accessible à dec-chat-dev.csadecai.com.

Users can ask questions like:

Les utilisateurs peuvent poser des questions telles que :

  • "Show me RCM SAR imagery over the Canadian Arctic from last month"
  • "Show me recent SAR data for Quebec"
  • "What lake water quality data is available for Lake Erie in 2024?"
  • « Montre-moi les images SAR RCM au-dessus de l'Arctique canadien du mois dernier »
  • « Montre-moi les données SAR récentes pour le Québec »
  • « Quelles données sur la qualité de l'eau des lacs sont disponibles pour le lac Érié en 2024 ? »

The chatbot returns a text summary of what was found, a satellite image thumbnail (when available), and a Source link to the verified catalogue record — so every response is traceable back to real data.

Le chatbot retourne un résumé textuel de ce qui a été trouvé, une vignette d'image satellite (lorsque disponible) et un lien Source vers l'enregistrement de catalogue vérifié — ainsi, chaque réponse est traçable jusqu'aux données réelles.

Architecture

User query (EN/FR)Requête utilisateur (FR/EN)
  
Nova Lite (ca-central-1) — intent + bbox + datetime extraction— extraction d'intention, bbox et datetime
  
STAC Search — DEC catalogue + EODMS (parallel)— catalogue DEC + EODMS (en parallèle)
  
DataAccessClient — enriches each item (preview URL, metadata)— enrichit chaque élément (URL d'aperçu, métadonnées)
  
Claude Sonnet 4.6 (ca-central-1, cross-region inference) — synthesizes response— synthétise la réponse
  
SSE stream → frontendFlux SSE → client

Backend files (mounted as ConfigMap in the pod)Fichiers du serveur (montés comme ConfigMap dans le pod)

FileRole
bedrock_client.pyFull pipeline: Sonnet 4.6 (intent) → STAC/GeoCore/compute/acquisition lookup → Sonnet 4.6 (synthesis). Also model IDs, system prompts, conversation memory, user-upload routing.
data_access.pyEnriches STAC items: finds image preview URLs, constructs llm_summary for each item.
stac_client.pySTAC catalogue client (DEC, EODMS, eodatahub, copernicus_ds, geo_canada).
geocore_client.pyGeoCore federated-search client for the geo.ca catalogue.
compute.pyNumerical change-detection backend (NDVI/NDWI/NBR pixel statistics over Sentinel-2 scenes).
acquisition_planner.pyPredicts next satellite overpass: Copernicus catalog for Sentinel-1/2; pyorbital + Celestrak TLEs for any other LEO satellite.
user_uploads.pyConverts user-uploaded files (images, GeoTIFF, PDFs, CSVs, text) into Bedrock content blocks for analysis.
dec_manual_kb.pyDEC platform user manual knowledge base, injected on platform_question intent.
server.pyFlask/Gunicorn HTTP server. Handles /chat/stream (JSON or multipart), /proxy/image, /proxy/cog, /stt, /health. Contains the _ImageSanitizer that strips hallucinated image URLs.
FichierRôle
bedrock_client.pyPipeline complet : Sonnet 4.6 (intention) → STAC/GeoCore/calcul/recherche d'acquisition → Sonnet 4.6 (synthèse). Aussi : identifiants de modèles, invites système, mémoire de conversation, routage des téléversements.
data_access.pyEnrichit les éléments STAC : trouve les URL d'aperçu, construit le llm_summary pour chaque élément.
stac_client.pyClient de catalogue STAC (DEC, EODMS, eodatahub, copernicus_ds, geo_canada).
geocore_client.pyClient de recherche fédérée GeoCore pour le catalogue geo.ca.
compute.pyBackend de détection numérique de changements (statistiques NDVI/NDWI/NBR sur scènes Sentinel-2).
acquisition_planner.pyPrédit le prochain survol satellite : catalogue Copernicus pour Sentinel-1/2 ; pyorbital + TLE Celestrak pour tout autre satellite LEO.
user_uploads.pyConvertit les fichiers téléversés (images, GeoTIFF, PDF, CSV, texte) en blocs de contenu Bedrock pour analyse.
dec_manual_kb.pyBase de connaissances du manuel utilisateur de la plateforme DEC, injectée sur l'intention platform_question.
server.pyServeur HTTP Flask/Gunicorn. Gère /chat/stream (JSON ou multipart), /proxy/image, /proxy/cog, /stt, /health. Contient l'_ImageSanitizer qui supprime les URL d'images hallucinées.

Kubernetes

ResourceDetails
Clusterdevdec-cluster, namespace dec-chatbot-dev
Backend deploymentchat-backend — python:3.11-slim, Gunicorn gthread, 8 workers
Frontend deploymentchat-frontend — nginx serving static HTML
ConfigMapschat-backend-app (4 Python files), chat-frontend (index.html + manual.html)
IAM roledec-chatbot-backend-role — Bedrock invoke permissions via IRSA
Docker imageECR: 043309328117.dkr.ecr.ca-central-1.amazonaws.com/dec-chatbot-backend:latest
RessourceDétails
Clusterdevdec-cluster, espace de noms dec-chatbot-dev
Déploiement serveurchat-backend — python:3.11-slim, Gunicorn gthread, 8 workers
Déploiement clientchat-frontend — nginx servant le HTML statique
ConfigMapschat-backend-app (4 fichiers Python), chat-frontend (index.html + manual.html)
Rôle IAMdec-chatbot-backend-role — permissions d'invocation Bedrock via IRSA
Image DockerECR : 043309328117.dkr.ecr.ca-central-1.amazonaws.com/dec-chatbot-backend:latest

AI ModelsModèles d'IA

RoleModelRegion
Intent extractorAmazon Nova Lite (ca.amazon.nova-lite-v1:0)ca-central-1
Response synthesizerClaude Sonnet 4.6 (us.anthropic.claude-sonnet-4-6)ca-central-1 (cross-region inference)
Fallback synthesizerClaude 3 Sonnet (anthropic.claude-3-sonnet-20240229-v1:0)ca-central-1
RôleModèleRégion
Extracteur d'intentionAmazon Nova Lite (ca.amazon.nova-lite-v1:0)ca-central-1
Synthétiseur de réponsesClaude Sonnet 4.6 (us.anthropic.claude-sonnet-4-6)ca-central-1 (inférence inter-région)
Synthétiseur de secoursClaude 3 Sonnet (anthropic.claude-3-sonnet-20240229-v1:0)ca-central-1

Using the ChatbotUtilisation du chatbot

Searching for dataRecherche de données

Ask in plain language. Include a location and/or time period for best results. The chatbot searches DEC and EODMS in parallel.

Posez votre question en langage naturel. Incluez un lieu et/ou une période pour de meilleurs résultats. Le chatbot effectue des recherches simultanément dans DEC et EODMS.

  • Geographic references (provinces, cities, "Arctic", "Canada-wide") are automatically converted to bounding boxes.
  • Relative dates ("last month", "summer 2024") are converted to ISO 8601 intervals.
  • If the query is too vague, the chatbot will ask a clarifying question.
  • Les références géographiques (provinces, villes, « Arctique », « à l'échelle du Canada ») sont automatiquement converties en boîtes englobantes.
  • Les dates relatives (« le mois dernier », « été 2024 ») sont converties en intervalles ISO 8601.
  • Si la requête est trop vague, le chatbot posera une question de clarification.

Source linksLiens vers les sources

Every response with real data includes a Source: Catalogue record link. Clicking it opens the STAC item record in the DEC or EODMS catalogue, which shows full metadata, download links, and provenance. This is how you verify the response is not hallucinated.

Chaque réponse contenant de vraies données inclut un lien Source : Enregistrement de catalogue. En cliquant dessus, vous ouvrez l'enregistrement STAC dans le catalogue DEC ou EODMS, qui affiche les métadonnées complètes, les liens de téléchargement et la provenance. C'est ainsi que vous vérifiez que la réponse n'est pas hallucinée.

Satellite imagesImages satellites

Preview thumbnails are served through /proxy/image. GeoTIFF files are converted to PNG on the fly. Some collections (SENTINEL-5P, Landsat, climate normals) do not have thumbnail assets in the catalogue — those return text-only responses.

Les vignettes d'aperçu sont servies via /proxy/image. Les fichiers GeoTIFF sont convertis en PNG à la volée. Certaines collections (SENTINEL-5P, Landsat, normales climatiques) n'ont pas de vignettes dans le catalogue — celles-ci retournent des réponses textuelles uniquement.

Conversation memoryMémoire de conversation

The chatbot remembers the last 10 turns of your conversation so you can ask follow-ups like "show me more" or "what about July?". Memory is per-session and is lost if the pod restarts.

Le chatbot se souvient des 10 derniers échanges de votre conversation, ce qui vous permet de poser des questions de suivi comme « montre-moi plus » ou « qu'en est-il de juillet ? ». La mémoire est par session et est perdue si le pod redémarre.

Acquisition planningPlanification d'acquisitions

Ask when a satellite will next pass over a location and the chatbot will return a predicted overpass time. It supports any active LEO satellite — Sentinel-1, Sentinel-2, Sentinel-3, Sentinel-5P, Sentinel-6, Landsat 8/9, MODIS Terra/Aqua, RADARSAT Constellation Mission (RCM-1/2/3), NOAA-20, Suomi NPP, the ISS, and others. Two prediction backends are used:

  • Copernicus DataSpace catalog (Sentinel-1 and Sentinel-2): the most recent confirmed overpass over the location is read from the public OData catalog and projected forward using the observed cadence.
  • TLE orbit propagation (everything else): the latest Two-Line Element for the satellite is fetched from Celestrak (cached for 24h) and propagated with pyorbital to find the next time the satellite will be physically over the location.

Example queries: "When is the next Sentinel-2 image over Montreal?", "When does Landsat 9 next pass over Toronto?", "When is the next RCM acquisition over Quebec City?". The chatbot answers in UTC with a local-time conversion, lists upcoming passes, and is explicit about the difference between an overhead pass and an actual imaging acquisition (Landsat WRS-2 path/row, RCM tasking, etc. mean the satellite isn't always imaging on every pass).

Demandez quand un satellite passera ensuite au-dessus d'un emplacement et le chatbot retournera l'heure de survol prédite. Il prend en charge tout satellite LEO actif — Sentinel-1, Sentinel-2, Sentinel-3, Sentinel-5P, Sentinel-6, Landsat 8/9, MODIS Terra/Aqua, la mission de la Constellation RADARSAT (RCM-1/2/3), NOAA-20, Suomi NPP, la SSI et autres. Deux moteurs de prédiction sont utilisés :

  • Catalogue Copernicus DataSpace (Sentinel-1 et Sentinel-2) : le passage confirmé le plus récent est lu dans le catalogue OData public et projeté vers l'avant en utilisant la cadence observée.
  • Propagation orbitale TLE (tout autre satellite) : le dernier élément orbital (Two-Line Element) est récupéré depuis Celestrak (mis en cache 24 h) et propagé avec pyorbital pour trouver le prochain moment où le satellite survolera l'emplacement.

Exemples de questions : « Quand aura lieu la prochaine image Sentinel-2 au-dessus de Montréal ? », « Quand Landsat 9 passera-t-il au-dessus de Toronto ? », « Quand est la prochaine acquisition RCM au-dessus de Québec ? ». Le chatbot répond en UTC avec une conversion en heure locale, liste les survols à venir, et précise la distinction entre un simple survol et une acquisition réelle (cycle WRS-2 de Landsat, tâches RCM, etc. — un satellite n'image pas systématiquement à chaque passage).

Uploading files for analysisTéléverser des fichiers pour analyse

Use the paperclip button next to the input box (or drag-and-drop) to attach files alongside your question. The chatbot can then look at what you uploaded and answer questions about it.

  • Images (PNG, JPEG, GIF, WEBP): passed straight to the model for visual analysis. Maximum 5 MB per image.
  • GeoTIFF / TIFF: rendered server-side to a percentile-stretched PNG preview (max 2000 px) so the model can analyse the imagery. The reply will mention that values reflect the stretch, not original sensor units.
  • Documents (PDF, DOC/DOCX, XLS/XLSX, CSV, HTML, TXT, MD): handed to the model as native document blocks. Maximum 4 MB per document.
  • Other text (JSON, YAML, log files, source code): inlined into the prompt as text, truncated at 50 000 characters.
  • Unsupported binaries (e.g. ZIP, EXE, executables): skipped with a short note in the reply explaining what was dropped.

Up to 6 files per message. Uploaded files are kept in the in-memory conversation history, so follow-up questions like "what's in the lower-left of the image?" work without re-uploading. They are lost when the pod restarts.

Utilisez le bouton trombone à côté de la zone de texte (ou glissez-déposez) pour joindre des fichiers à votre question. Le chatbot peut ensuite examiner ce que vous avez téléversé et répondre à des questions à son sujet.

  • Images (PNG, JPEG, GIF, WEBP) : transmises directement au modèle pour analyse visuelle. Limite de 5 Mo par image.
  • GeoTIFF / TIFF : rendues côté serveur en aperçu PNG étiré par centiles (max 2000 px) pour que le modèle puisse analyser l'imagerie. La réponse précise que les valeurs reflètent l'étirement, pas les unités du capteur.
  • Documents (PDF, DOC/DOCX, XLS/XLSX, CSV, HTML, TXT, MD) : passés au modèle en blocs de document natifs. Limite de 4 Mo par document.
  • Autres textes (JSON, YAML, journaux, code source) : intégrés à l'invite, tronqués à 50 000 caractères.
  • Binaires non pris en charge (ex. ZIP, EXE) : ignorés avec une note dans la réponse expliquant ce qui a été écarté.

Jusqu'à 6 fichiers par message. Les fichiers téléversés sont conservés dans l'historique de conversation en mémoire, ce qui permet aux questions de suivi comme « qu'y a-t-il en bas à gauche de l'image ? » de fonctionner sans nouveau téléversement. Ils sont perdus au redémarrage du pod.

Change DetectionDétection de changements

The chatbot can compare two time periods over an area of interest (AOI) and tell you what changed — either as a numerical analysis backed by real pixel statistics, or as a visual change-detection map. Just say what kind of change you want to see and which two years; it picks the right path automatically.

Le chatbot peut comparer deux périodes pour une zone d'intérêt (AOI) et identifier les changements — soit sous forme d'analyse numérique appuyée sur des statistiques de pixels réels, soit sous forme de carte de détection de changements. Indiquez simplement le type de changement et les deux années; le système choisit automatiquement la voie appropriée.

Two output modesDeux modes de sortie

Compute mode (default) — opens the underlying COGs over your AOI and runs zonal statistics. Returns numbers (mean values, percentage changes) plus clickable source links so you can verify the underlying data. Triggered by phrases like "compare X between 2022 and 2024", "how much did X change?", or "did vegetation decline?".

Visual mode — overlays the NRCan Planaura cosine-similarity change map on the map. Coverage: Montreal/Quebec only, 2020–2025, spring/summer, consecutive 1-year pairs. Triggered by "show me the change map", "visualize the change", or "Planaura". If the AOI/years fall outside Planaura's coverage, the system silently falls back to compute mode.

Mode calcul (par défaut) — ouvre les COGs sous-jacents sur votre AOI et calcule les statistiques zonales. Retourne des valeurs numériques (moyennes, variations en pourcentage) et des liens cliquables vers les sources pour permettre la vérification. Déclenché par des phrases comme « compare X entre 2022 et 2024 », « de combien X a-t-il changé ? », ou « la végétation a-t-elle décliné ? ».

Mode visuel — superpose la carte de similarité cosinus du modèle Planaura de RNCan sur la carte. Couverture : Montréal/Québec uniquement, 2020–2025, printemps/été, paires d'années consécutives. Déclenché par « montre la carte des changements », « visualise », ou « Planaura ». Si l'AOI/années ne sont pas couvertes, le système bascule silencieusement en mode calcul.

Compute capabilities (8 operations)Capacités de calcul (8 opérations)

OperationSourceUse case
NDVI (vegetation greenness)Sentinel-2 L2A (B04 + B08)"Did vegetation decline or recover?"
NBR (burn severity)Sentinel-2 L2A (B08 + B12)"Was this area burned by fire?"
NDBI (built-up index)Sentinel-2 L2A (B11 + B08)"Did this area urbanize?"
NDWI (open water / flood proxy)Sentinel-2 L2A (B03 + B08)"Did open water expand or contract?" / "Was this area flooded?"
fCOVER (vegetation cover %)Govt of Canada Datacube"Did vegetation cover change?" (Canada, 2019–2023)
LAI (leaf area index)Govt of Canada Datacube"Did the canopy thicken or thin?" (Canada, 2019–2023)
fAPAR (absorbed PAR fraction)Govt of Canada Datacube"Did photosynthetic activity change?" (Canada, 2019–2023)
Lake Erie water qualityDEC lake_erie_daily / lake_erie_14days"Did Lake Erie algae / chlorophyll / turbidity change?"
OpérationSourceCas d'usage
NDVI (verdure de la végétation)Sentinel-2 L2A (B04 + B08)« La végétation a-t-elle décliné ou récupéré ? »
NBR (gravité des incendies)Sentinel-2 L2A (B08 + B12)« Cette zone a-t-elle été brûlée ? »
NDBI (indice bâti)Sentinel-2 L2A (B11 + B08)« Cette zone s'est-elle urbanisée ? »
NDWI (eau libre / approximation d'inondation)Sentinel-2 L2A (B03 + B08)« L'eau libre s'est-elle étendue ou contractée ? » / « Cette zone a-t-elle été inondée ? »
fCOVER (couvert végétal %)Cube de données Gouvernement du Canada« Le couvert végétal a-t-il changé ? » (Canada, 2019–2023)
LAI (indice de surface foliaire)Cube de données Gouvernement du Canada« La canopée s'est-elle épaissie ou éclaircie ? » (Canada, 2019–2023)
fAPAR (fraction de PAR absorbée)Cube de données Gouvernement du Canada« L'activité photosynthétique a-t-elle changé ? » (Canada, 2019–2023)
Qualité de l'eau du lac ÉriéDEC lake_erie_daily / lake_erie_14days« Les algues / la chlorophylle / la turbidité du lac Érié ont-elles changé ? »

Example queriesExemples de requêtes

  • compare vegetation in Ottawa between 2022 and 2024 → NDVI compute path
  • did the area near Fort McMurray burn between 2022 and 2024? → NBR compute path
  • did Toronto urbanize between 2018 and 2024? → NDBI compute path
  • did water bodies expand near Calgary between 2022 and 2024? → NDWI compute path
  • how did leaf area index change in Saskatoon between 2020 and 2023? → LAI compute path
  • did fAPAR change in Edmonton between 2020 and 2023? → fAPAR compute path
  • how did vegetation cover change in Saskatoon between 2020 and 2023? → fCOVER compute path
  • did Lake Erie water quality change between 2023 and 2024? → Lake Erie compute path
  • was the Fraser Valley flooded between 2020 and 2021? → NDWI (open-water proxy) compute path
  • show me the change detection map for Montreal between 2022 and 2023 → Planaura visual map
  • compare la végétation à Ottawa entre 2022 et 2024 → calcul NDVI
  • la région de Fort McMurray a-t-elle brûlé entre 2022 et 2024 ? → calcul NBR
  • Toronto s'est-il urbanisé entre 2018 et 2024 ? → calcul NDBI
  • les plans d'eau près de Calgary se sont-ils étendus entre 2022 et 2024 ? → calcul NDWI
  • comment l'indice de surface foliaire a-t-il changé à Saskatoon entre 2020 et 2023 ? → calcul LAI
  • fAPAR a-t-il changé à Edmonton entre 2020 et 2023 ? → calcul fAPAR
  • comment le couvert végétal a-t-il changé à Saskatoon entre 2020 et 2023 ? → calcul fCOVER
  • la qualité de l'eau du lac Érié a-t-elle changé entre 2023 et 2024 ? → calcul lac Érié
  • la vallée du Fraser a-t-elle été inondée entre 2020 et 2021 ? → calcul NDWI (approximation eau libre)
  • montre la carte de détection de changements pour Montréal entre 2022 et 2023 → carte visuelle Planaura

Source attribution and honestyAttribution des sources et honnêteté

Every compute response embeds two clickable links to the underlying STAC items used in the comparison. These are not estimates — they come from real pixel reads via rio-tiler with HTTP range requests. If no comparable scene pair exists for your AOI/years, the chatbot tells you plainly rather than fabricating numbers. End-to-end latency is typically 15–30 seconds.

Chaque réponse en mode calcul intègre deux liens cliquables vers les éléments STAC sous-jacents utilisés dans la comparaison. Ce ne sont pas des estimations — elles proviennent de lectures de pixels réels via rio-tiler avec des requêtes HTTP par plages d'octets. Si aucune paire de scènes comparable n'existe pour votre AOI/années, le chatbot le dit clairement plutôt que de fabriquer des chiffres. La latence de bout en bout est généralement de 15 à 30 secondes.

Available Data CollectionsCollections de données disponibles

Digital Earth Canada (DEC)

CollectionDescriptionImage preview
canada_wide_lakesCanada-wide lake algae monitoring (Jun 2024)Yes (GeoTIFF)
SENTINEL-5PTROPOMI atmospheric data: NO₂, methane, ozone (Jan 2025–present)No
rcmRADARSAT Constellation Mission SARYes (JPEG)
rcm-ardRCM Analysis-Ready DataYes (PNG)
sentinel-2-l2aSentinel-2 Level-2A optical imageryYes (JPEG)
sentinel-1-rtcSentinel-1 SAR (RTC)No
landsat-c2l2-srLandsat Collection 2 Level-2 Surface ReflectanceNo
landsat-c2l1Landsat Collection 2 Level-1No
venus-l2aVENµS Level-2A surface reflectanceNo
SGBAirPhotosAerial photographyYes (JPEG)
Radarsat1RawProductsRADARSAT-1 archiveYes (JPEG)
aqhi-forecasts-realtimeAir Quality Health Index forecastsNo
climate-normalsClimate normalsNo
NAPLNational Air Photo Library (large, slow)No
ai-ready-mosaicsAI-ready mosaicsNo
CollectionDescriptionAperçu d'image
canada_wide_lakesSurveillance des algues lacustres à l'échelle du Canada (juin 2024)Oui (GeoTIFF)
SENTINEL-5PDonnées atmosphériques TROPOMI : NO₂, méthane, ozone (jan. 2025–présent)Non
rcmDonnées SAR de la Mission de la Constellation RADARSATOui (JPEG)
rcm-ardDonnées prêtes à l'analyse de la MCROui (PNG)
sentinel-2-l2aImagerie optique Sentinel-2 niveau 2AOui (JPEG)
sentinel-1-rtcSAR Sentinel-1 (RTC)Non
landsat-c2l2-srRéflectance de surface Landsat Collection 2 niveau 2Non
landsat-c2l1Landsat Collection 2 niveau 1Non
venus-l2aRéflectance de surface VENµS niveau 2ANon
SGBAirPhotosPhotographie aérienneOui (JPEG)
Radarsat1RawProductsArchive RADARSAT-1Oui (JPEG)
aqhi-forecasts-realtimePrévisions de la Cote air santéNon
climate-normalsNormales climatiquesNon
NAPLBibliothèque nationale de photos aériennes (volumineux, lent)Non
ai-ready-mosaicsMosaïques prêtes pour l'IANon

EODMS (NRCan)

CollectionDescriptionImage preview
rcmRADARSAT Constellation Mission SAR (1.1M+ items)Yes (JPEG)
rcm-ardRCM Analysis-Ready Data (19K items)Yes (PNG)
sentinel-1Sentinel-1 SAR (75K items)Yes (PNG)
CollectionDescriptionAperçu d'image
rcmSAR de la Mission de la Constellation RADARSAT (1,1 M+ éléments)Oui (JPEG)
rcm-ardDonnées prêtes à l'analyse de la MCR (19 K éléments)Oui (PNG)
sentinel-1SAR Sentinel-1 (75 K éléments)Oui (PNG)
Not available: Sentinel-2, ArcticDEM, full Landsat archive, MODIS, and AQHI forecasts are indexed in the catalogue but return no results when searched — they are not yet populated. Non disponibles : Sentinel-2, ArcticDEM, l'archive Landsat complète, MODIS et les prévisions AQHI sont indexés dans le catalogue mais ne retournent aucun résultat lors d'une recherche — ils ne sont pas encore peuplés.

UK EO DataHub

CollectionDescriptionImage preview
sentinel2_ardSentinel-2 Analysis Ready Data (UK/Europe)Yes (JPEG)
sentinel1_ardSentinel-1 SAR Analysis Ready Data (UK/Europe)Yes (JPEG)
sentinel1Sentinel-1 SAR raw/processedYes (JPEG)
ukcpUK Climate ProjectionsNo
CollectionDescriptionAperçu d'image
sentinel2_ardDonnées prêtes à l'analyse Sentinel-2 (Royaume-Uni/Europe)Oui (JPEG)
sentinel1_ardDonnées SAR prêtes à l'analyse Sentinel-1 (Royaume-Uni/Europe)Oui (JPEG)
sentinel1SAR Sentinel-1 brut/traitéOui (JPEG)
ukcpProjections climatiques du Royaume-UniNon

Copernicus Data Space

CollectionDescriptionImage preview
ccm-opticalCopernicus Contributing Mission optical imageryNo
ccm-sarCopernicus Contributing Mission SAR imageryNo
clms_ba_global_300m_daily_v3_cogCLMS Global Burnt Area 300m daily (COG)No
clms_ba_global_300m_monthly_v3_cogCLMS Global Burnt Area 300m monthly (COG)No
CollectionDescriptionAperçu d'image
ccm-opticalImagerie optique des missions contributrices CopernicusNon
ccm-sarImagerie SAR des missions contributrices CopernicusNon
clms_ba_global_300m_daily_v3_cogCLMS superficie brûlée mondiale 300m quotidienne (COG)Non
clms_ba_global_300m_monthly_v3_cogCLMS superficie brûlée mondiale 300m mensuelle (COG)Non

Government of Canada Datacube

CollectionDescriptionImage preview
monthly-vegetation-parameters-20m-v1Monthly LAI, fAPAR, fCOVER at 20m — Canada-wide (May 2019–Oct 2023)Yes (PNG)
CollectionDescriptionAperçu d'image
monthly-vegetation-parameters-20m-v1LAI, fAPAR, fCOVER mensuels à 20m — partout au Canada (mai 2019–oct. 2023)Oui (PNG)

Adding a New STAC CatalogueAjouter un nouveau catalogue STAC

The chatbot supports any standard STAC 1.0.0 catalogue with a /search endpoint. Adding a new catalogue requires no code changes — set one environment variable and redeploy. Images will work automatically as long as the catalogue's items have a thumbnail asset with a public HTTPS URL.

Le chatbot prend en charge tout catalogue STAC 1.0.0 standard disposant d'un point de terminaison /search. L'ajout d'un nouveau catalogue ne nécessite aucune modification du code — définissez une variable d'environnement et redéployez. Les images fonctionneront automatiquement si les éléments du catalogue ont un actif thumbnail avec une URL HTTPS publique.

Step 1 — Set the env varÉtape 1 — Définir la variable d'environnement

Run this command, replacing the values with your catalogue's details:

Exécutez cette commande en remplaçant les valeurs par les détails de votre catalogue :

kubectl -n dec-chatbot-dev set env deployment/chat-backend \
  EXTRA_STAC_CATALOGUES='[
    {
      "name":        "my_catalogue",
      "url":         "https://example.com/stac/search",
      "label":       "My Catalogue",
      "description": "Brief description of the data",
      "browse_url":  "https://example.com/stac/collections/{collection}/items/{id}"
    }
  ]'

To add multiple catalogues, include more objects in the JSON array.

Pour ajouter plusieurs catalogues, incluez d'autres objets dans le tableau JSON.

Step 2 — Restart the podÉtape 2 — Redémarrer le pod

kubectl -n dec-chatbot-dev rollout restart deployment/chat-backend

Step 3 — Update the AI prompt (recommended)Étape 3 — Mettre à jour l'invite du modèle (recommandé)

The catalogue will be searched automatically for broad queries ("all" mode), but the AI won't know its collection IDs by name. For the best results, add the catalogue's known collection IDs to the _LITE_SYSTEM prompt in bedrock_client.py under a new "Known <CatalogueName> collection IDs" block, then redeploy the backend.

Le catalogue sera interrogé automatiquement pour les requêtes générales (mode « all »), mais le modèle ne connaîtra pas ses identifiants de collection par nom. Pour de meilleurs résultats, ajoutez les identifiants de collection connus du catalogue dans l'invite _LITE_SYSTEM de bedrock_client.py sous un nouveau bloc « Known <NomDuCatalogue> collection IDs », puis redéployez le serveur.

Verify it's connectedVérifier la connexion

After restart, check the pod logs for confirmation:

Après le redémarrage, vérifiez les journaux du pod pour confirmer :

kubectl -n dec-chatbot-dev logs -l app=chat-backend --tail=20 | grep -i "registered\|catalogue"

You should see a line like: Registered catalogues: ['dec', 'eodms', ..., 'my_catalogue']

Vous devriez voir une ligne comme : Registered catalogues: ['dec', 'eodms', ..., 'my_catalogue']

Authentication: Basic auth is supported for catalogues that require a username/password (currently used for EODMS). For other auth schemes (API keys, OAuth), a small code addition to bedrock_client.py is needed — contact a developer. Authentification : L'authentification de base est prise en charge pour les catalogues nécessitant un nom d'utilisateur et un mot de passe (actuellement utilisé pour EODMS). Pour d'autres schémas d'authentification (clés API, OAuth), une petite modification du code dans bedrock_client.py est nécessaire — contactez un développeur.

Updating the ChatbotMise à jour du chatbot

Backend logic lives in four Python files mounted via ConfigMap. No Docker image rebuild is needed for code changes — just update the ConfigMap and restart the deployment.

La logique du serveur réside dans quatre fichiers Python montés via ConfigMap. Aucune reconstruction de l'image Docker n'est nécessaire pour les modifications de code — il suffit de mettre à jour le ConfigMap et de redémarrer le déploiement.

Note: The frontend and backend are deployed separately. Editing chat-backend-app does NOT update what users see at the root URL. Always deploy frontend changes to the chat-frontend ConfigMap. Remarque : Le client et le serveur sont déployés séparément. Modifier chat-backend-app ne met PAS à jour ce que les utilisateurs voient à l'URL racine. Déployez toujours les modifications du client vers le ConfigMap chat-frontend.

Update backend Python filesMettre à jour les fichiers Python du serveur

kubectl -n dec-chatbot-dev create configmap chat-backend-app \
  --from-file=bedrock_client.py=/c/Users/lwang/bedrock_client.py \
  --from-file=data_access.py=/c/Users/lwang/data_access.py \
  --from-file=stac_client.py=/c/Users/lwang/stac_client.py \
  --from-file=server.py=/c/Users/lwang/server.py \
  --dry-run=client -o yaml | kubectl apply -f - && \
kubectl -n dec-chatbot-dev rollout restart deployment/chat-backend

Update frontend HTMLMettre à jour le HTML du client

kubectl -n dec-chatbot-dev create configmap chat-frontend \
  --from-file=index.html=/c/Users/lwang/chat-frontend-index.html \
  --from-file=manual.html=/c/Users/lwang/manual.html \
  --dry-run=client -o yaml | kubectl apply -f - && \
kubectl -n dec-chatbot-dev rollout restart deployment/chat-frontend

Rebuild the Docker image (after pip dependency changes)Reconstruire l'image Docker (après des modifications de dépendances pip)

Only needed if you add or update Python packages. The image is pre-baked (no pip install on startup).

Nécessaire uniquement si vous ajoutez ou mettez à jour des paquets Python. L'image est préconstruite (aucun pip install au démarrage).

aws codebuild start-build \
  --profile "DEC AI" \
  --region ca-central-1 \
  --project-name dec-chatbot-backend-build

Check rollout statusVérifier l'état du déploiement

kubectl -n dec-chatbot-dev rollout status deployment/chat-backend
kubectl -n dec-chatbot-dev rollout status deployment/chat-frontend

View pod logsConsulter les journaux du pod

kubectl -n dec-chatbot-dev logs -l app=chat-backend --tail=100 -f

Run the audit regression testExécuter le test de régression d'audit

Run after every deploy to confirm nothing broke. Baseline: 104 passed, 1 warned, 0 failed.

À exécuter après chaque déploiement pour confirmer que rien n'est cassé. Référence : 104 réussis, 1 avertissement, 0 échec.

POD=$(kubectl -n dec-chatbot-dev get pod -l app=chat-backend \
  -o jsonpath='{.items[0].metadata.name}')
kubectl -n dec-chatbot-dev exec -i "$POD" -- \
  bash -c 'cat > /tmp/audit_test.py' < /c/Users/lwang/audit_test.py
kubectl -n dec-chatbot-dev exec "$POD" -- \
  bash -c 'python3 /tmp/audit_test.py' 2>&1

Updating EODMS CredentialsMise à jour des identifiants EODMS

The EODMS catalogue requires Basic Auth to fetch thumbnail images and search certain collections. Credentials are stored as a Kubernetes Secret and injected into the pod as environment variables (EODMS_USERNAME and EODMS_PASSWORD).

Le catalogue EODMS requiert une authentification Basic Auth pour récupérer les vignettes et rechercher certaines collections. Les identifiants sont stockés comme un Secret Kubernetes et injectés dans le pod sous forme de variables d'environnement (EODMS_USERNAME et EODMS_PASSWORD).

When to do this: The EODMS password is managed by NRCan and may expire or be rotated. If thumbnail images from EODMS collections stop working, update the credentials here. Quand le faire : Le mot de passe EODMS est géré par RNCan et peut expirer ou être renouvelé. Si les vignettes des collections EODMS cessent de fonctionner, mettez à jour les identifiants ici.

Step 1 — Update the Kubernetes SecretÉtape 1 — Mettre à jour le Secret Kubernetes

kubectl -n dec-chatbot-dev create secret generic eodms-credentials \
  --from-literal=username=YOUR_EODMS_USERNAME \
  --from-literal=password=YOUR_NEW_PASSWORD \
  --dry-run=client -o yaml | kubectl apply -f -

Step 2 — Restart the backend pod to pick up the new secretÉtape 2 — Redémarrer le pod serveur pour prendre en compte le nouveau secret

kubectl -n dec-chatbot-dev rollout restart deployment/chat-backend

Step 3 — VerifyÉtape 3 — Vérifier

POD=$(kubectl -n dec-chatbot-dev get pod -l app=chat-backend \
  -o jsonpath='{.items[0].metadata.name}')
kubectl -n dec-chatbot-dev exec "$POD" -- \
  bash -c 'echo "user=$EODMS_USERNAME pass=${EODMS_PASSWORD:0:3}***"'
Verify EODMS connectivity by running the audit test (Section 2: STAC Connectivity). EODMS/rcm, EODMS/rcm-ard, and EODMS/sentinel-1 should all show ✓ with item counts. Vérifiez la connectivité EODMS en exécutant le test d'audit (Section 2 : Connectivité STAC). EODMS/rcm, EODMS/rcm-ard et EODMS/sentinel-1 doivent tous afficher ✓ avec le nombre d'éléments.

Current EODMS accountCompte EODMS actuel

The EODMS account used is a shared service account managed by the CSA DEC AI team. For account issues or password resets, contact NRCan EODMS support.

Le compte EODMS utilisé est un compte de service partagé géré par l'équipe IA DEC de l'ASC. Pour les problèmes de compte ou les réinitialisations de mot de passe, contactez le soutien EODMS de RNCan.

AI Model ConfigurationConfiguration du modèle d'IA

The synthesizer model is set by the SYNTHESIZER constant at the top of bedrock_client.py. To switch models, update this line and redeploy.

Le modèle synthétiseur est défini par la constante SYNTHESIZER en haut de bedrock_client.py. Pour changer de modèle, modifiez cette ligne et redéployez.

# In bedrock_client.py — line ~55
SYNTHESIZER = "us.anthropic.claude-sonnet-4-6"   # current
The fallback model (SYNTHESIZER_FALLBACK) is used automatically if the primary model returns an AccessDeniedException due to marketplace policy. No manual intervention needed. Le modèle de secours (SYNTHESIZER_FALLBACK) est utilisé automatiquement si le modèle principal retourne une AccessDeniedException en raison de la politique de la place de marché. Aucune intervention manuelle n'est nécessaire.

TroubleshootingDépannage

Images not displaying (broken image icon)Images non affichées (icône d'image brisée)

  • Check /proxy/image?url=<encoded-url> directly — should return 200 with image/png or image/jpeg.
  • If EODMS thumbnails are broken, EODMS credentials may have expired — see Updating EODMS Credentials.
  • Run the audit test: Section 4 (Image Proxy) tests every preview URL.
  • Vérifiez /proxy/image?url=<url-encodée> directement — doit retourner 200 avec image/png ou image/jpeg.
  • Si les vignettes EODMS sont brisées, les identifiants EODMS ont peut-être expiré — voir Mise à jour des identifiants EODMS.
  • Exécutez le test d'audit : la Section 4 (Proxy d'images) teste toutes les URL d'aperçu.

Chatbot returns "no data found" for queries that should have resultsLe chatbot retourne « aucune donnée trouvée » pour des requêtes qui devraient avoir des résultats

  • Check DEC STAC connectivity: curl "https://resource-catalogue.dec.alpha.canada.ca/stac/search?limit=1"
  • Check EODMS connectivity: requires Basic Auth, test with the audit script Section 2.
  • The bbox may be wrong — Nova Lite occasionally extracts incorrect coordinates. Check the pod logs for the parsed intent JSON.
  • Vérifiez la connectivité DEC STAC : curl "https://resource-catalogue.dec.alpha.canada.ca/stac/search?limit=1"
  • Vérifiez la connectivité EODMS : nécessite Basic Auth, testez avec la Section 2 du script d'audit.
  • La bbox est peut-être incorrecte — Nova Lite extrait parfois des coordonnées erronées. Consultez les journaux du pod pour le JSON d'intention analysé.

Pod logs show Bedrock errorsLes journaux du pod affichent des erreurs Bedrock

  • AccessDeniedException: private marketplace — primary model is marketplace-blocked; fallback should activate automatically.
  • ValidationException: invalid model identifier — model ID is wrong or not available in this region. Check the Model Configuration section.
  • ThrottlingException — request rate too high; Bedrock will retry automatically via the SDK.
  • AccessDeniedException: private marketplace — le modèle principal est bloqué par la place de marché ; le secours doit s'activer automatiquement.
  • ValidationException: invalid model identifier — l'identifiant du modèle est incorrect ou non disponible dans cette région. Consultez la section Configuration du modèle d'IA.
  • ThrottlingException — taux de requêtes trop élevé ; Bedrock réessaiera automatiquement via le SDK.

Health checkVérification de l'état

curl https://dec-chat-dev.csadecai.com/health

Expected response: {"status":"ok","model":"Claude Sonnet 4.6 (DEC)"}

Réponse attendue : {"status":"ok","model":"Claude Sonnet 4.6 (DEC)"}

Pod is stuck / not respondingLe pod est bloqué / ne répond pas

# Force restart
kubectl -n dec-chatbot-dev rollout restart deployment/chat-backend

# Check pod status
kubectl -n dec-chatbot-dev get pods -l app=chat-backend

# Tail logs
kubectl -n dec-chatbot-dev logs -l app=chat-backend --tail=200 -f

Developer Handover ReferenceRéférence de passation aux développeurs

This section captures institutional knowledge for a developer or administrator taking over maintenance of the platform — things that are not obvious from reading the code alone.

Cette section capture les connaissances institutionnelles pour un développeur ou un administrateur prenant en charge la maintenance de la plateforme — des éléments qui ne sont pas évidents à la seule lecture du code.

AWS environmentEnvironnement AWS

PropertyValue
Account ID043309328117
Default regionca-central-1
AWS CLI profileDEC AI (configured via SSO)
Environment typeGC Science ASEA-managed (shared SSC cloud)
Operator IAM rolePowerSysadmin — account-wide, boundary: SSCPowerSysadminBoundaryPolicy
Workload IAM roledec-chatbot-backend-role — boundary: SSCCustomRoleBoundaryPolicy (IRSA)
PropriétéValeur
Identifiant de compte043309328117
Région par défautca-central-1
Profil AWS CLIDEC AI (configuré via SSO)
Type d'environnementGC Science géré par ASEA (nuage SSC partagé)
Rôle IAM opérateurPowerSysadmin — à l'échelle du compte, limite : SSCPowerSysadminBoundaryPolicy
Rôle IAM de charge de travaildec-chatbot-backend-role — limite : SSCCustomRoleBoundaryPolicy (IRSA)
IAM constraints: iam:CreateUser is blocked by the boundary — you cannot create IAM users directly. New IAM roles must use SSCCustomRoleBoundaryPolicy as a permission boundary or they will be denied. Route tables are managed by CloudFormation — do not manually add IGW routes to private subnets. Contact Kevin White (SSC) for account-level access issues. Contraintes IAM : iam:CreateUser est bloqué par la limite — vous ne pouvez pas créer d'utilisateurs IAM directement. Les nouveaux rôles IAM doivent utiliser SSCCustomRoleBoundaryPolicy comme limite de permissions, sinon ils seront refusés. Les tables de routage sont gérées par CloudFormation — ne pas ajouter manuellement des routes IGW aux sous-réseaux privés. Contactez Kevin White (SSC) pour les problèmes d'accès au niveau du compte.

Kubernetes cluster accessAccès au cluster Kubernetes

The EKS cluster is devdec-cluster in ca-central-1. All chatbot resources live in the dec-chatbot-dev namespace.

Le cluster EKS est devdec-cluster dans ca-central-1. Toutes les ressources du chatbot se trouvent dans l'espace de noms dec-chatbot-dev.

# Configure kubectl (run once, after SSO login)
aws eks update-kubeconfig \
  --profile "DEC AI" \
  --region ca-central-1 \
  --name devdec-cluster

# Verify access
kubectl -n dec-chatbot-dev get pods

Source files (local working copies)Fichiers sources (copies de travail locales)

All working copies live in C:\Users\lwang\. There is no git repository for the backend Python files — the ConfigMap is the source of truth once deployed. Keep local copies in sync manually.

Toutes les copies de travail se trouvent dans C:\Users\lwang\. Il n'y a pas de dépôt git pour les fichiers Python du serveur — le ConfigMap est la source de vérité une fois déployé. Gardez les copies locales synchronisées manuellement.

FileDeployed to
bedrock_client.pychat-backend-app ConfigMap
data_access.pychat-backend-app ConfigMap
stac_client.pychat-backend-app ConfigMap
server.pychat-backend-app ConfigMap
chat-frontend-index.htmlchat-frontend ConfigMap (what users see at /)
manual.htmlchat-frontend ConfigMap (accessible at /manual.html)
audit_test.pyCopied to pod at runtime — not a deployed artifact
FichierDéployé vers
bedrock_client.pyConfigMap chat-backend-app
data_access.pyConfigMap chat-backend-app
stac_client.pyConfigMap chat-backend-app
server.pyConfigMap chat-backend-app
chat-frontend-index.htmlConfigMap chat-frontend (ce que les utilisateurs voient à /)
manual.htmlConfigMap chat-frontend (accessible à /manual.html)
audit_test.pyCopié dans le pod à l'exécution — pas un artefact déployé
Important: The only frontend file is chat-frontend-index.html. chat-frontend-live.html was deleted and is not used. Do not create a new chat-frontend-live.html by mistake. Important : Le seul fichier client est chat-frontend-index.html. chat-frontend-live.html a été supprimé et n'est pas utilisé. Ne créez pas par erreur un nouveau chat-frontend-live.html.

Request pipeline (step by step)Pipeline de requêtes (étape par étape)

  1. User message arrives at POST /chat/stream (SSE endpoint in server.py). Body: {"message": "...", "conversation_id": "..."}.
  2. Nova Lite extracts intent (bedrock_client.py). Returns a JSON object with query_type, collections, bbox (decimal degrees), and datetime (ISO 8601 interval). Known issue: Nova Lite occasionally returns a null bbox or wrong-hemisphere coordinates — bbox validation guards are in place but not foolproof. Check pod logs for the parsed intent JSON when debugging "no results" queries.
  3. STAC search runs in parallel against the DEC catalogue (https://resource-catalogue.dec.alpha.canada.ca/stac/search) and EODMS (https://www.eodms-sgdot.nrcan-rncan.gc.ca/api/v1/stac/search). Max 10 results per source, sorted by date descending.
  4. DataAccessClient enriches each item (data_access.py). Resolves the best preview URL (checks thumbnail, overview, visual assets in order) and builds an llm_summary dict with key metadata and an embedded image markdown tag pointing at /proxy/image?url=....
  5. Claude Sonnet 4.6 synthesizes the final response, receiving all enriched items plus conversation history (last 10 turns). Text tokens are streamed back as SSE (data: {"token": "..."}).
  6. map_action event is emitted after the text stream, before {"done": true}:
    data: {"type": "map_action", "url": "<asset href>",
           "bounds": [west, south, east, north],
           "item_id": "...", "collection": "..."}
    The frontend is intended to use this to pan/zoom a map viewer. The event is deployed but the frontend JS handler is not yet wired up.
  7. ImageSanitizer in server.py post-processes every response to strip any hallucinated ![...](...) image tags invented by Claude. Only URLs that came from real catalogue assets during the enrichment step are allowed through.
  1. Le message de l'utilisateur arrive à POST /chat/stream (point de terminaison SSE dans server.py). Corps : {"message": "...", "conversation_id": "..."}.
  2. Nova Lite extrait l'intention (bedrock_client.py). Retourne un objet JSON avec query_type, collections, bbox (degrés décimaux) et datetime (intervalle ISO 8601). Problème connu : Nova Lite retourne parfois une bbox nulle ou des coordonnées dans le mauvais hémisphère — des gardes de validation bbox sont en place mais ne sont pas infaillibles. Consultez les journaux du pod pour le JSON d'intention analysé lors du débogage des requêtes « aucun résultat ».
  3. La recherche STAC s'exécute en parallèle sur le catalogue DEC (https://resource-catalogue.dec.alpha.canada.ca/stac/search) et EODMS (https://www.eodms-sgdot.nrcan-rncan.gc.ca/api/v1/stac/search). Maximum 10 résultats par source, triés par date décroissante.
  4. DataAccessClient enrichit chaque élément (data_access.py). Résout la meilleure URL d'aperçu (vérifie les assets thumbnail, overview, visual dans l'ordre) et construit un dict llm_summary avec les métadonnées clés et une balise markdown d'image intégrée pointant vers /proxy/image?url=....
  5. Claude Sonnet 4.6 synthétise la réponse finale, recevant tous les éléments enrichis plus l'historique de conversation (10 derniers échanges). Les tokens de texte sont diffusés en SSE (data: {"token": "..."}).
  6. L'événement map_action est émis après le flux de texte, avant {"done": true} :
    data: {"type": "map_action", "url": "<asset href>",
           "bounds": [west, south, east, north],
           "item_id": "...", "collection": "..."}
    Le client est censé utiliser ceci pour déplacer/zoomer un visualiseur de carte. L'événement est déployé mais le gestionnaire JS du client n'est pas encore câblé.
  7. ImageSanitizer dans server.py post-traite chaque réponse pour supprimer toute balise d'image ![...](...) hallucinée inventée par Claude. Seules les URL provenant de vrais assets du catalogue lors de l'étape d'enrichissement sont autorisées.

Image proxy (/proxy/image)Proxy d'images (/proxy/image)

Fetches the upstream image URL (with EODMS Basic Auth if needed), detects format via magic bytes, and converts GeoTIFFs to 800×800 PNG using tifffile + numpy + Pillow. HTML responses (e.g. login redirects returned as 200) are detected and rejected.

Récupère l'URL d'image en amont (avec Basic Auth EODMS si nécessaire), détecte le format via les octets magiques et convertit les GeoTIFF en PNG 800×800 à l'aide de tifffile + numpy + Pillow. Les réponses HTML (ex. redirections de connexion retournées comme 200) sont détectées et rejetées.

Blocked domains: Some image hosts require session cookies or redirect to login pages and cannot be proxied. If a new collection's thumbnails are broken, check the pod logs for the raw upstream response — the domain may need to be added to the blocked list in server.py.

Domaines bloqués : Certains hôtes d'images nécessitent des cookies de session ou redirigent vers des pages de connexion et ne peuvent pas être proxifiés. Si les vignettes d'une nouvelle collection sont brisées, consultez les journaux du pod pour la réponse brute en amont — le domaine devra peut-être être ajouté à la liste bloquée dans server.py.

Performance note: The proxy downloads the full GeoTIFF before converting. For large COG files this can be slow. A future improvement is to use HTTP range requests for overview tiles only.

Note de performance : Le proxy télécharge le GeoTIFF complet avant de le convertir. Pour les grands fichiers COG, cela peut être lent. Une amélioration future consiste à utiliser des requêtes HTTP range pour les tuiles d'aperçu uniquement.

Speech-to-text (STT)Reconnaissance vocale (STT)

Voice input is handled by a separate AWS Lambda accessed via API Gateway. The frontend POSTs audio to /stt on the backend, which proxies it to the Lambda. The Lambda is managed separately from the Kubernetes deployment.

La saisie vocale est gérée par une fonction AWS Lambda distincte accessible via API Gateway. Le client envoie l'audio en POST à /stt sur le serveur, qui le proxifie vers la Lambda. La Lambda est gérée séparément du déploiement Kubernetes.

STT Lambda: https://lyrtolu416.execute-api.ca-central-1.amazonaws.com/stt

Docker imageImage Docker

The image is pre-baked — all Python dependencies are installed at build time, not on startup. The Python application files are not baked into the image; they are mounted from the ConfigMap at runtime. This means code changes only require a ConfigMap update + rollout restart, not an image rebuild. Only rebuild when adding or changing Python package dependencies.

L'image est préconstruite — toutes les dépendances Python sont installées au moment de la construction, pas au démarrage. Les fichiers de l'application Python ne sont pas intégrés dans l'image ; ils sont montés depuis le ConfigMap à l'exécution. Cela signifie que les modifications de code nécessitent uniquement une mise à jour du ConfigMap + un redémarrage du déploiement, pas une reconstruction de l'image. Ne reconstruisez que lors de l'ajout ou de la modification de dépendances de paquets Python.

ResourceRessourceValue
ECR repositoryRéférentiel ECR043309328117.dkr.ecr.ca-central-1.amazonaws.com/dec-chatbot-backend:latest
CodeBuild projectProjet CodeBuilddec-chatbot-backend-build (ca-central-1)

Conversation memoryMémoire de conversation

History is stored in an in-memory Python dict keyed by conversation_id, capped at 10 turns. Memory is lost when the pod restarts — any deployment or pod crash resets all active conversations. A DynamoDB-backed persistence layer is the planned solution but has not been implemented yet.

L'historique est stocké dans un dict Python en mémoire, indexé par conversation_id, limité à 10 échanges. La mémoire est perdue lors du redémarrage du pod — tout déploiement ou crash du pod réinitialise toutes les conversations actives. Une couche de persistance DynamoDB est la solution prévue mais n'a pas encore été mise en œuvre.

AuthenticationAuthentification

The API is currently completely open — there is no authentication on /chat/stream or /stt. Anyone who knows the URL can use it. Adding an API key header check is the minimum recommended step before broader rollout.

L'API est actuellement complètement ouverte — il n'y a pas d'authentification sur /chat/stream ou /stt. Quiconque connaît l'URL peut l'utiliser. L'ajout d'une vérification d'en-tête de clé API est l'étape minimale recommandée avant un déploiement plus large.

CostingCoûts

The chatbot's running costs are split between AWS Bedrock inference (the dominant cost) and shared infrastructure on the devdec-cluster EKS cluster. Prices are in USD and reflect AWS ca-central-1 / us-east-1 on-demand rates as of early 2026 — verify current rates on the Amazon Bedrock pricing page.

Les coûts d'exploitation du chatbot se répartissent entre l'inférence AWS Bedrock (poste de dépense dominant) et l'infrastructure partagée sur le cluster EKS devdec-cluster. Les prix sont en USD et reflètent les tarifs à la demande AWS ca-central-1 / us-east-1 du début 2026 — vérifiez les tarifs actuels sur la page de tarification Amazon Bedrock.

Bedrock model ratesTarifs des modèles Bedrock

ModelRoleInput (per 1M tokens)Output (per 1M tokens)
ca.amazon.nova-lite-v1:0 Intent extractor $0.06 $0.24
us.anthropic.claude-sonnet-4-6 Synthesizer (primary) $3.00 $15.00
anthropic.claude-3-sonnet-20240229-v1:0 Synthesizer (fallback) $3.00 $15.00
ModèleRôleEntrée (par 1M tokens)Sortie (par 1M tokens)
ca.amazon.nova-lite-v1:0 Extracteur d'intention 0,06 $ 0,24 $
us.anthropic.claude-sonnet-4-6 Synthétiseur (principal) 3,00 $ 15,00 $
anthropic.claude-3-sonnet-20240229-v1:0 Synthétiseur (secours) 3,00 $ 15,00 $

Cost per queryCoût par requête

Each user query triggers two Bedrock calls. The synthesizer call is the dominant cost — it receives the full STAC search results (up to 50 items) as context, so token counts vary with result set size.

Chaque requête utilisateur déclenche deux appels Bedrock. L'appel du synthétiseur est le poste dominant — il reçoit les résultats complets de la recherche STAC (jusqu'à 50 éléments) en contexte, donc le nombre de tokens varie selon la taille des résultats.

CallTypical input tokensTypical output tokensEst. cost / query
Nova Lite — intent extraction ~300 ~150 ~$0.00005
Claude Sonnet 4.6 — synthesis ~3,500 ~500 ~$0.018
Total per query ~$0.018 USD
AppelTokens d'entrée typiquesTokens de sortie typiquesCoût est. / requête
Nova Lite — extraction d'intention ~300 ~150 ~0,00005 $
Claude Sonnet 4.6 — synthèse ~3 500 ~500 ~0,018 $
Total par requête ~0,018 $ USD

Monthly Bedrock cost estimatesEstimations mensuelles des coûts Bedrock

Monthly queriesEst. Bedrock cost (USD)Notes
100~$1.80Light dev/testing usage
500~$9.00Active pilot usage
2,000~$36.00Moderate production load
10,000~$180.00High-traffic production
Requêtes / moisCoût Bedrock est. (USD)Remarques
100~1,80 $Utilisation légère (développement / tests)
500~9,00 $Utilisation active en phase pilote
2 000~36,00 $Charge de production modérée
10 000~180,00 $Production à fort trafic

Other infrastructure costsAutres coûts d'infrastructure

ServiceEst. monthly costNotes
EKS cluster (devdec-cluster) Shared — not attributable Cluster is shared across multiple workloads; chatbot pods run on existing nodes
Lambda — Speech-to-Text < $0.10 ~$0.20 per 1M requests + compute time; negligible at current usage
ECR — container image storage < $0.10 Image is ~few hundred MB; $0.10/GB/month
CloudWatch Logs $0.57/GB ingested Pod logs; low at current volume
CodeBuild — image rebuild Per build only ~$0.005 per build minute; only incurred on deployments
ServiceCoût mensuel est.Remarques
Cluster EKS (devdec-cluster) Partagé — non imputable Le cluster est partagé entre plusieurs charges de travail ; les pods du chatbot s'exécutent sur des nœuds existants
Lambda — Reconnaissance vocale < 0,10 $ ~0,20 $ par million de requêtes + temps de calcul ; négligeable à l'usage actuel
ECR — stockage de l'image conteneur < 0,10 $ Image de quelques centaines de Mo ; 0,10 $/Go/mois
CloudWatch Logs 0,57 $/Go ingéré Journaux des pods ; faible à l'usage actuel
CodeBuild — reconstruction de l'image Par compilation seulement ~0,005 $/minute de compilation ; engagé uniquement lors des déploiements
Cost tip: The synthesizer accounts for over 99 % of Bedrock spend. Reducing DEC_MAX_ITEMS (currently 50) shortens the context passed to the synthesizer and directly lowers per-query cost — at the trade-off of fewer results shown to the user. Conseil : Le synthétiseur représente plus de 99 % des dépenses Bedrock. Réduire DEC_MAX_ITEMS (actuellement 50) raccourcit le contexte transmis au synthétiseur et réduit directement le coût par requête — au détriment du nombre de résultats affichés à l'utilisateur.
Monitoring: Use AWS Cost Explorer (account 043309328117, ca-central-1) filtered by service Amazon Bedrock to track actual spend. Set a billing alert in CloudWatch if monthly costs need to be capped. Surveillance : Utilisez AWS Cost Explorer (compte 043309328117, ca-central-1) filtré sur le service Amazon Bedrock pour suivre les dépenses réelles. Créez une alerte de facturation dans CloudWatch si les coûts mensuels doivent être plafonnés.

Contacts

RoleNameOrgEmail
Project Manager Joey Martin ASC/CSA joey.martin@asc-csa.gc.ca
Engineering lead Hany Fawzy ASC/CSA hany.fawzy@asc-csa.gc.ca
AWS infrastructure & account Kevin White SSC/SPC kevin.white@ssc-spc.gc.ca
EODMS account / credentials NRCan EODMS support (contact via the EODMS portal)
RôleNomOrgCourriel
Gestionnaire de projet Joey Martin ASC/CSA joey.martin@asc-csa.gc.ca
Responsable technique Hany Fawzy ASC/CSA hany.fawzy@asc-csa.gc.ca
Infrastructure AWS et compte Kevin White SSC/SPC kevin.white@ssc-spc.gc.ca
Compte / identifiants EODMS Soutien EODMS de RNCan (contactez via le portail EODMS)