Aller au contenu

API du tableau de bord opérationnel

Guida expose une petite API opérationnelle en lecture seule pour superviser les crawls longs et les exécutions d’indexation sans ouvrir l’interface desktop. Elle vise les scripts, agents, tableaux de bord légers et clients de supervision sur réseau privé.

Ce n’est pas une surface de contrôle distant. L’API du tableau de bord ne démarre pas les processus, ne les arrête pas, ne réessaie pas des éléments, ne supprime pas d’entrées de file, n’envoie pas de travail vers la file des rejets, n’exécute pas de scripts, ne navigue pas dans les onglets et n’appelle pas d’outils MCP.

Utilisez l’API Remote Ops lorsqu’un client sur réseau privé a besoin d’un contrôle distant explicite. Utilisez cette API de tableau de bord lorsque le client doit seulement observer l’état.

Pour des harnais de test déterministes avec endpoints d’automatisation protégés par jeton, utilisez le mode d’automatisation. Pour les outils IA locaux avec autorisations et traçabilité, utilisez l’intégration MCP.

Par défaut, le serveur intégré écoute sur l’interface de bouclage :

http://127.0.0.1:9315

Lorsqu’une adresse d’écoute privée sûre est configurée dans Settings, Guida garde l’interface de bouclage disponible et expose aussi l’API de tableau de bord en lecture seule sur cette adresse privée. C’est utile pour une supervision via NetBird ou LAN, par exemple :

http://100.68.25.200:9315

La charge utile de statut inclut dashboardUrl, dashboardBindAddress, dashboardPort, applicationVersion et des champs stables d’identité de nœud afin qu’un client puisse afficher l’adresse et le nœud Guida qu’il supervise.

L’API du tableau de bord est volontairement plus étroite que MCP.

ClientAutorisé
Client local sur boucle localeMCP plus endpoints de tableau de bord
Client distant sur réseau privéEndpoints de tableau de bord en lecture seule uniquement
POST, PUT, DELETE, etc. distants vers les chemins du tableau de bordRejetés
Chemins MCP distants sur réseau privéRejetés
/api/ops/* distant sur réseau privéDisponible seulement si l’API Remote Ops est activée explicitement
Liaison wildcard publique comme 0.0.0.0Rejetée par la validation des paramètres

Les clients distants du tableau de bord doivent utiliser des requêtes GET. HEAD est aussi traité comme lecture seule. Le preflight OPTIONS est accepté seulement si la méthode demandée est en lecture seule.

Les appels d’outils MCP utilisent POST sur la surface MCP locale. Remote Ops utilise POST /api/ops/rpc uniquement lorsque cette fonctionnalité est activée. Les clients du tableau de bord ne doivent pas utiliser POST ; cette API ne contient aucune mutation.

Les adresses d’écoute sûres incluent la boucle locale, les plages IPv4 privées RFC1918, la plage NetBird/CGNAT 100.64.0.0/10, l’IPv4 link-local, les adresses IPv6 locales uniques et les adresses IPv6 link-local. Les adresses wildcard et publiques retombent sur la boucle locale.

Toutes les lectures du tableau de bord définissent des en-têtes no-cache. Les lectures d’instantané sont protégées par un court délai ; une lecture lente renvoie une réponse problème 503 plutôt que de bloquer indéfiniment le travail de crawl.

Tous les endpoints principaux vivent sous /api/dashboard.

EndpointUsage
GET /api/dashboard/statusPulsation compacte de l’application, de l’espace de travail, du flux, de l’exécution active, des processus et du runtime
GET /api/dashboard/snapshotInstantané opérationnel combiné et borné
GET /api/dashboard/runsExécutions récentes de flux de travail
GET /api/dashboard/runs/{runId}Détail d’une exécution
GET /api/dashboard/runs/{runId}/countsCompteurs étape/état sur toute l’exécution
GET /api/dashboard/queuesCompteurs de files et totaux de files
GET /api/dashboard/workersÉtat des pools de processus
GET /api/dashboard/failuresRaisons récentes de tâches et exécutions en échec
GET /api/dashboard/attentionÉléments d’attention courants
GET /api/dashboard/reconcile/{runId}Synthèse du passage fetch/parse/index pour une exécution
GET /api/dashboard/eventsFlux Server-Sent Events pour invalidations et pulsations en direct

Les propriétés JSON utilisent camel case.

Beaucoup d’endpoints renvoient des listes bornées. Une réponse de liste bornée utilise cette enveloppe :

{
"items": [],
"totalCount": 0,
"limit": 50,
"truncated": false,
"degraded": false,
"errors": []
}

Lorsque truncated vaut true, l’endpoint a renvoyé la première page ou un échantillon borné, mais totalCount indique toujours le total connu par le dépôt ou service. Pour les questions agrégées, utilisez les champs d’agrégat, pas la longueur de items.

Lorsque degraded vaut true, une partie de l’instantané n’a pas pu être collectée. La réponse reste un état partiel utile, et errors explique ce qui a échoué.

Renvoie une pulsation compacte pour l’instance Guida en cours d’exécution.

Utilisez cet endpoint pour contrôles de santé, titres de fenêtre, diagnostics entre pairs et cartes « Guida est-il vivant ? ».

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/status

Exemple de réponse :

{
"generatedAt": "2026-05-24T18:30:20.082Z",
"workspaceOpen": true,
"workspaceName": "btbrowser-workspace",
"workspacePath": "C:\\dev\\btbrowser-workspace",
"activeWorkflowName": "careers-crawl",
"workersRunning": true,
"workersPaused": false,
"runningTaskCount": 4,
"unreadNotificationCount": 0,
"activeRun": {
"id": "92d987e072ab4649a5a7f1846446a420",
"workflowName": "careers-crawl",
"status": "running",
"source": "manual",
"startedAt": "2026-05-23T08:12:00Z",
"finishedAt": null,
"lastError": null
},
"degraded": false,
"errors": [],
"version": 9,
"applicationVersion": "0.7.3-alpha.0",
"applicationStartedAt": "2026-05-24T18:28:05.264Z",
"dashboardBindAddress": "100.68.25.200",
"dashboardPort": 9315,
"dashboardUrl": "http://100.68.25.200:9315",
"nodeIdentity": {
"nodeId": "guida-b20ba90d102443c8a74f4c9903dce78d",
"nodeName": "desktop-crawler",
"nodeRole": "crawler",
"machineName": "DESKTOP-QGUCB5J"
},
"nodeId": "guida-b20ba90d102443c8a74f4c9903dce78d",
"nodeName": "desktop-crawler",
"nodeRole": "crawler",
"machineName": "DESKTOP-QGUCB5J",
"workerCountsByStatus": {
"running": 2,
"idle": 1,
"stopped": 4
},
"workerRunningCount": 2,
"workerPausedCount": 0,
"workerFailedCount": 0,
"workerIdleCount": 1,
"workerStoppedCount": 4,
"workerStalledCount": 0
}

Champs importants :

ChampSignification
workspaceOpenIndique si un espace de travail est ouvert
activeWorkflowNameSélection courante de flux dans l’espace de travail
workersRunningAu moins un processus ou une tâche run-one est actif
workersPausedAu moins un pool de processus est en pause
runningTaskCountNombre de tâches de script en cours
activeRunExécution de flux en cours si elle existe, sinon exécution la plus récente
degraded, errorsIndique si une partie de la lecture a échoué et pourquoi
versionVersion monotone d’invalidation du tableau de bord
applicationVersionVersion sémantique de l’application Guida, par exemple 0.7.3-alpha.0 ; ne parsez pas de métadonnées de commit
applicationStartedAtHorodatage de démarrage du processus
dashboardBindAddress, dashboardPort, dashboardUrlAdresse que Guida pense servir
nodeIdentity, nodeId, nodeName, nodeRole, machineNameMétadonnées stables de nœud pour observateurs multi-nœuds
workerCountsByStatus, workerRunningCount, workerPausedCount, workerFailedCount, workerIdleCount, workerStoppedCount, workerStalledCountAgrégats d’état des pools de processus

Renvoie un instantané opérationnel combiné. Utilisez-le pour les chargements initiaux et les actions de resynchronisation forcée.

Fenêtre de terminal
curl "http://127.0.0.1:9315/api/dashboard/snapshot?forceReload=true"

Paramètres de requête :

ParamètreTypeSignification
forceReloadbooleanSi true, contourne le cache court et recharge depuis la vérité du dépôt/service

L’instantané inclut :

ChampSignification
version, generatedAtIdentité et horodatage de l’instantané
workspaceName, workspacePath, activeWorkflowNameContexte courant de l’espace de travail
queuesLignes de files bornées
workerPoolsLignes de processus bornées
taskCountsByStatusCompteurs de tâches de script groupés par statut
workflowLedgerAgrégats complets du registre
recentRunsListe bornée d’exécutions récentes
recentFailuresListe bornée d’échecs de tâches/exécutions
attentionItemsListe bornée d’éléments d’attention
activeRunRésumé de l’exécution active ou la plus récente
activeRunReconciliationSynthèse du passage fetch/parse/index pour l’exécution active
queuePendingCount, queueCheckedOutCount, queueCompletedCount, queueDeadLetterCountTotaux complets des files
queueTotalsByStateTotaux de files groupés par état
totalQueueCount, queueLimit, queuesTruncatedBornes de la liste des files
totalWorkerPoolCount, workerPoolLimit, workerPoolsTruncatedBornes de la liste des pools
workerPoolCountsByStatus, workerPoolRunningCount, workerPoolPausedCount, workerPoolFailedCount, workerPoolIdleCount, workerPoolStoppedCount, workerPoolStalledCountAgrégats complets d’état des processus
recentRunsTotalCount, recentRunsLimit, recentRunsTruncatedBornes de la liste des exécutions récentes
recentFailuresTotalCount, recentFailuresLimit, recentFailuresTruncatedBornes de la liste d’échecs
attentionItemsTotalCount, attentionItemsLimit, attentionItemsTruncatedBornes de la liste d’attention
nodeIdentity, nodeId, nodeName, nodeRole, machineNameMétadonnées stables de nœud
degraded, errorsMétadonnées d’échec partiel

L’objet workflowLedger contient des données agrégées, pas un échantillon :

{
"totalRuns": 12,
"totalItems": 12242,
"runCountsByStatus": {
"running": 1,
"completed": 10,
"failed": 1
},
"itemCountsByState": {
"queued": 923,
"running": 21,
"completed": 11189,
"dead": 9
},
"itemCountsByStage": {
"fetch": 285,
"parse_index": 11672
},
"retryReadyCount": 0,
"activeLeaseCount": 21,
"expiredLeaseCount": 0,
"attentionCount": 38
}

Les compteurs proviennent de requêtes d’agrégat du dépôt. Ils ne sont pas calculés depuis la première page d’éléments.

Renvoie les exécutions récentes du flux actif.

Fenêtre de terminal
curl "http://127.0.0.1:9315/api/dashboard/runs?take=10"
ParamètreTypeDéfautMaxSignification
takeinteger25100Nombre d’exécutions récentes à renvoyer

Forme de réponse :

{
"items": [
{
"id": "92d987e072ab4649a5a7f1846446a420",
"workflowName": "careers-crawl",
"status": "running",
"source": "manual",
"startedAt": "2026-05-23T08:12:00Z",
"finishedAt": null,
"lastError": null
}
],
"totalCount": 12,
"limit": 10,
"truncated": true,
"degraded": false,
"errors": []
}

Renvoie le détail d’une exécution.

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/runs/92d987e072ab4649a5a7f1846446a420
ChampSignification
runRésumé d’exécution
stageStateCountsCompteurs étape/état groupés sur toute l’exécution
reconciliationSynthèse du passage fetch/parse/index
attentionItemsÉchantillon borné d’attention limité à cette exécution

Si l’exécution n’existe pas, l’endpoint renvoie 404.

Renvoie les compteurs groupés par étape et état sur toute l’exécution.

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/runs/92d987e072ab4649a5a7f1846446a420/counts

Exemple :

[
{
"stage": "fetch",
"state": "queued",
"count": 238,
"problemCount": 0
},
{
"stage": "parse_index",
"state": "completed",
"count": 11189,
"problemCount": 0
}
]

problemCount indique le nombre d’éléments de ce groupe qui sont en échec, prêts à réessayer, rejetés ou porteurs de métadonnées d’erreur. Cet endpoint est la bonne source pour les matrices étape/état. Il n’est pas limité par la taille de page des listes d’éléments.

Si l’exécution n’existe pas, l’endpoint renvoie 404.

Renvoie des lignes de files bornées et les totaux complets.

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/queues
ChampSignification
itemsJusqu’à 100 lignes de files
totalCountNombre de files
limitLimite de lignes de files, actuellement 100
truncatedIndique si certaines lignes ont été omises
totalPendingCountÉléments en attente sur toutes les files
totalCheckedOutCountÉléments pris en charge/en cours sur toutes les files
totalCompletedCountÉléments terminés sur toutes les files
totalDeadLetterCountÉléments dans la file des rejets sur toutes les files
totalsByStateTotaux complets groupés par état de file
degraded, errorsMétadonnées d’échec partiel

Chaque ligne de file ressemble à ceci :

{
"name": "careers_fetch",
"pendingCount": 471,
"countsByState": {
"Pending": 471,
"CheckedOut": 21,
"DeadLetter": 3
},
"checkedOutCount": 21,
"completedCount": 0,
"deadLetterCount": 3
}

Renvoie des lignes bornées d’état des pools de processus et les compteurs agrégés.

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/workers

Champs d’une ligne de processus :

ChampSignification
queueFile traitée par ce pool
scriptChemin du script de processus
dequeueStrategyStratégie facultative de dépilage
concurrencyConcurrence configurée
activeWorkersBoucles de processus en cours
processedÉléments traités dans l’état courant du pool
failedÉléments en échec dans l’état courant du pool
remainingÉléments restants selon l’état du processus
pausedIndique si le pool est en pause
activeRunOneCountExécutions one-off actives
statusrunning, paused, stalled, failed, idle ou stopped
scopeglobal, workflow ou dynamic
checkedOutCountÉléments pris en charge pour la file du pool

Les définitions de processus configurées apparaissent même lorsqu’elles sont arrêtées. Une définition arrêtée avec des éléments pris en charge dans la file est signalée comme stalled.

La réponse inclut aussi des agrégats :

ChampSignification
countsByStatusCompteurs de pools groupés par statut
runningCount, pausedCount, failedCount, idleCount, stoppedCount, stalledCountTotaux complets par statut
activeWorkerCountSomme des boucles de processus actives
activeRunOneCountSomme des exécutions one-off actives

Renvoie les tâches de script récemment en échec et les exécutions de flux échouées.

Fenêtre de terminal
curl "http://127.0.0.1:9315/api/dashboard/failures?take=5"
ParamètreTypeDéfautMaxSignification
takeinteger25100Nombre de lignes d’échec à renvoyer

Champs d’une ligne d’échec :

ChampSignification
taskIdID de tâche de script ou ID d’exécution
nameNom de tâche ou libellé d’exécution
originOrigine de tâche, comme Worker, ou WorkflowLedger pour les exécutions échouées
statusStatut d’échec
startTime, endTimeHorodatages de tâche/exécution
errorMessage d’échec
queueName, queueItemKey, workerIndexContexte de processus si disponible
mcpToolName, triggerEventContexte MCP/déclencheur si disponible
kindtask ou workflow_run
workflowName, runIdContexte de flux si disponible

Renvoie les éléments d’attention pour le flux actif, ou pour une exécution sélectionnée lorsque runId est fourni.

Fenêtre de terminal
curl "http://127.0.0.1:9315/api/dashboard/attention?take=20"
curl "http://127.0.0.1:9315/api/dashboard/attention?runId=92d987e072ab4649a5a7f1846446a420&take=20"
ParamètreTypeDéfautMaxSignification
runIdstringaucunn/aLimite l’attention à une exécution
takeinteger50200Nombre de lignes d’attention à renvoyer

Champs d’une ligne d’attention :

ChampSignification
kindexpired_lease, dead_item, failed_item, retry_ready ou failed_run
severitycritical, error ou warning
workflowName, runIdContexte de flux/exécution
itemId, itemKeyIdentité de l’élément lorsque l’attention porte sur un élément
stage, stateEmplacement de l’élément de flux
messageExplication courte pour l’opérateur
timestampHorodatage pertinent d’événement ou de mise à jour
lastErrorDernière erreur enregistrée si disponible

Renvoie une réconciliation compacte du pipeline pour une exécution de flux.

Fenêtre de terminal
curl http://127.0.0.1:9315/api/dashboard/reconcile/92d987e072ab4649a5a7f1846446a420

Exemple de réponse :

{
"runId": "92d987e072ab4649a5a7f1846446a420",
"workflowName": "careers-crawl",
"totalItems": 12235,
"stageStateCounts": [
{
"stage": "parse_index",
"state": "completed",
"count": 11189,
"problemCount": 0
}
],
"fetchProcessedCount": 0,
"fetchSkippedCount": 17,
"fetchDeadCount": 9,
"fetchRetryReadyCount": 0,
"fetchRunningCount": 21,
"fetchLeasedCount": 21,
"parseIndexQueuedCount": 483,
"parseIndexCompletedCount": 11189,
"parseIndexReceivedCount": 11672,
"fetchToParseMissingCount": 0,
"parseIndexBacklogCount": 483,
"handoffAttentionCount": 0,
"handoffStatus": "backlog"
}

Utilisez cet endpoint pour répondre à des questions de passage :

  • Combien d’éléments fetch sont encore en file, en cours, pris en charge, ignorés, rejetés ou prêts à réessayer ?
  • Combien d’éléments parse/index sont en file ?
  • Combien d’éléments parse/index sont terminés ?
  • Combien d’éléments parse/index ont été reçus depuis fetch ?
  • Existe-t-il un écart fetch-to-parse ou un backlog parse/index ?
  • Le comptage complet étape/état correspond-il à la forme attendue du pipeline ?

Si l’exécution n’existe pas, l’endpoint renvoie 404.

Ouvre un flux Server-Sent Events pour les mises à jour en direct du tableau de bord.

Fenêtre de terminal
curl -N http://127.0.0.1:9315/api/dashboard/events

Le flux envoie seulement des indices compacts. Il n’envoie pas d’instantanés complets. Un client doit traiter les événements comme « quelque chose a changé » puis appeler l’endpoint ciblé dont il a besoin, généralement /api/dashboard/status, /api/dashboard/snapshot?forceReload=true ou un endpoint d’exécution sélectionnée.

Événement de connexion initial :

event: status
data: {"occurredAt":"2026-05-24T18:36:00.0398288+00:00","version":9,"status":"connected","workspaceOpen":true,"workspaceName":"btbrowser-workspace","activeWorkflowName":"careers-crawl","workersRunning":true,"workersPaused":false,"runningTaskCount":4,"unreadNotificationCount":0,"degraded":false,"errors":[],"applicationVersion":"0.7.3-alpha.0","applicationStartedAt":"2026-05-24T18:28:05.2641123+00:00","dashboardBindAddress":"100.68.25.200","dashboardPort":9315,"dashboardUrl":"http://100.68.25.200:9315","nodeIdentity":{"nodeId":"guida-b20ba90d102443c8a74f4c9903dce78d","nodeName":"desktop-crawler","nodeRole":"crawler","machineName":"DESKTOP-QGUCB5J"},"nodeId":"guida-b20ba90d102443c8a74f4c9903dce78d","nodeName":"desktop-crawler","nodeRole":"crawler","machineName":"DESKTOP-QGUCB5J"}

Événement de pulsation :

event: status
data: {"occurredAt":"2026-05-24T18:36:47.6112429+00:00","version":9,"status":"heartbeat","workspaceOpen":true,"workersRunning":true,"degraded":false,"errors":[],"applicationVersion":"0.7.3-alpha.0","nodeIdentity":{"nodeId":"guida-b20ba90d102443c8a74f4c9903dce78d","nodeName":"desktop-crawler","nodeRole":"crawler","machineName":"DESKTOP-QGUCB5J"},"nodeId":"guida-b20ba90d102443c8a74f4c9903dce78d","nodeName":"desktop-crawler","machineName":"DESKTOP-QGUCB5J"}

Événement d’invalidation :

event: invalidation
data: {"occurredAt":"2026-05-24T18:36:12.1000000+00:00","version":10,"reason":"operational_event"}

Types d’événements :

ÉvénementSignification
status avec status: "connected"Flux ouvert avec succès
status avec status: "heartbeat"Flux encore actif ; l’intervalle par défaut est de 15 secondes
invalidationÉtat de l’espace de travail, des files, processus, tâches, registre ou notifications modifié

Les événements de statut incluent les mêmes champs compacts d’application, espace de travail et identité de nœud que /api/dashboard/status. Ils restent des instantanés de statut, pas des instantanés complets du tableau de bord.

Le canal SSE est borné. Si beaucoup d’invalidations arrivent rapidement, Guida peut abandonner les anciens indices d’invalidation. C’est sûr, car les événements sont des indices et les dépôts restent la source de vérité.

StatutSignification
200Réponse JSON ou flux SSE réussi
403Un client distant a tenté un chemin hors tableau de bord ou une méthode non lecture
404L’exécution sélectionnée n’existe pas, ou une route inexistante comme /dashboard a été demandée localement
499Le client s’est déconnecté avant la fin de la lecture
503La lecture du tableau de bord a expiré
500La lecture du tableau de bord a échoué de façon inattendue
  • Utilisez /api/dashboard/status pour les contrôles de présence peu coûteux.
  • Utilisez /api/dashboard/snapshot?forceReload=true pour les chargements initiaux et resynchronisations explicites.
  • Utilisez /api/dashboard/events pour savoir quand recharger l’état ciblé.
  • Utilisez /api/dashboard/runs/{runId}/counts pour les matrices étape/état.
  • Utilisez /api/dashboard/reconcile/{runId} pour les questions de passage fetch-to-parse/index.
  • Utilisez applicationVersion comme version sémantique de l’application et nodeId comme identité stable du nœud Guida.
  • Traitez les listes bornées comme des échantillons ou pages ; utilisez totalCount, les agrégats et truncated pour la vue complète.
  • Ne sondez pas agressivement lorsqu’une connexion SSE est ouverte. Laissez les événements d’invalidation déclencher des rechargements ciblés.
  • Ne supposez pas que les charges utiles d’événements sont un état durable. Rechargez depuis les endpoints JSON.