Exploiter les metadata
Vous attachez des labels et des annotations (données JSON libres) côté SDK (voir Labels & annotations). Cette page explique comment les exploiter dans la plateforme : colonnes Explore, filtres, recherche, onglet Metadata d'une session, sélection des juges et triage. C'est la question la plus fréquente une fois l'instrumentation en place : « j'envoie des metadata, maintenant j'en fais quoi ? ».
payload(step, "input", data, content,
annotations={
"user.email": "ana@acme.io",
"request.intent": "refund",
})colonne custom · filtre · recherche plein-texte
Rappel : deux mécanismes, deux usages
| Rôle | Exploitation | |
|---|---|---|
| Labels | Sélectionner (clés courtes, stables, custom préfixées x.) | Filtres, regroupement, ciblage des juges, indexation |
| Annotations | Décrire (JSON libre : contexte métier, config) | Colonnes custom, recherche plein-texte, contexte de triage |
La règle d'or
Une valeur sur laquelle vous voulez filtrer ou router → un label (x.). Une valeur que
vous voulez lire, chercher ou afficher → une annotation. Dans le doute, mettez-la en
annotation : c'est réversible, une annotation ne coûte rien au moteur de sélection.
De l'annotation à la colonne Explore
Toute annotation peut devenir une colonne personnalisée dans Explore (affichable, triable et filtrable) en pointant son chemin JSON.
- 1
Ouvrir le sélecteur de colonnes
Dans Explore, ouvrez Colonnes (le sélecteur en haut de la table). Trois familles y cohabitent : colonnes standard, métriques découvertes, et champs custom.
- 2
Choisir un champ custom
Parcourez les chemins d'annotation découverts sur vos events (regroupés par racine, ex.
flow › branch › group) ou saisissez le chemin directement, par exempleannotations.user.email. - 3
Exploiter la colonne
La colonne apparaît dans la table, avec un libellé humanisé (
user_email→ « User Email »). Elle devient triable, alimente les filtres et la recherche. Réordonnez par glisser-déposer ; retirez-la d'un clic.
Limites du sélecteur
Le sélecteur borne le nombre de colonnes actives (par défaut une vingtaine au total, réparties entre champs custom, métriques et juges) pour garder la table lisible et les requêtes rapides. Gardez les colonnes qui portent une décision, pas toutes vos annotations.
Filtrer, trier, chercher
Le panneau Filtres (à côté de la recherche) adapte son contrôle au type de la colonne :
| Type de colonne | Contrôle de filtre |
|---|---|
| Numérique | Curseur de plage min–max (bornes déduites des données) |
| Texte / catégorie | Multi-sélection des valeurs distinctes |
| Liste (array) | Opérateur « contient » — sélection parmi les valeurs présentes |
| Date / heure | Plage de dates, bornée par la fenêtre de la page |
| Métrique | Seuil sur une métrique agrégée (somme, moyenne, p95…) |
| Juge | Filtrer par verdict ou score d'un juge |
- Recherche plein-texte : par id, contenu, ou valeur d'annotation (indexée par Typesense).
Tapez
refundpour retrouver toutes les traces dont une annotation vaut « refund ». - Les filtres suivent vos colonnes : seules les colonnes actives sont filtrables. Ajoutez la colonne d'abord, puis filtrez dessus.
L'onglet Metadata d'une session
Ouvrez une session (Explore → Sessions), puis l'onglet Metadata. Il répond à « quelle est la metadata de cette conversation, et qu'est-ce qui change d'un tour à l'autre ? ».
| Zone | Contenu |
|---|---|
| Contexte commun (gauche) | Ce qui est constant sur toute la session, affiché une seule fois : Annotations, Context, Labels. |
| Variations par tour (droite) | Uniquement ce qui diffère du contexte commun, tour par tour, avec statut, phase et trace_id. |
- Les trois ensembles, Annotations, Context et Labels, reflètent exactement ce que votre SDK a envoyé, après propagation flow → step → event.
- Chaque carte de tour est cliquable : le bouton « aller au tour » bascule sur l'onglet Conversation et met le tour en surbrillance. Inversement, depuis la Conversation, un tour renvoie vers sa metadata (saut conversation → metadata).
- L'onglet Models voisin fait la même lecture pour les modèles appelés par tour (fournisseur, tokens, coût, latence, paramètres d'échantillonnage).
Contexte commun vs variations
Posez le contexte stable (utilisateur, segment, locale) au niveau du flow : il remonte dans le contexte commun, sans bruit. Ne mettez au niveau event que ce qui varie réellement d'un tour à l'autre : c'est ce que la colonne « variations » met en avant.
Router la sélection par label
Les labels ne servent pas qu'à filtrer l'affichage : ils pilotent la sélection système.
- Ciblage des juges : une liaison de juge se scope à un SIA, un asset et un déclencheur, et peut
cibler des labels (ex. n'évaluer que les events
x.crm.segment = vip). Voir Juges. - Regroupement & indexation : les labels réservés (
env,team,flow.phase,asset.role…) structurent l'agrégation des KPIs et l'indexation ; vos labelsx.s'y ajoutent.
Label, pas annotation, pour router
Le routage (juges, regroupement) se fait sur des labels. Une annotation décrit, elle ne
sélectionne pas. Si vous vous surprenez à vouloir filtrer un juge sur une annotation, c'est
probablement un label déguisé : promouvez-la en label x..
Metadata au moment du triage
Les alertes se déclenchent sur des métriques et des verdicts de juge, pas sur des annotations arbitraires. Mais quand une alerte ou un score faible vous amène sur une trace, ce sont vos annotations et votre contexte qui donnent le sens métier : quel utilisateur, quel segment, quelle intention. C'est ce qui transforme « une latence a dépassé le seuil » en « le parcours refund des clients vip ralentit ». Enrichissez pour trier vite. Voir Alerting.
Patterns courants
| Cas d'usage | Où | Clé | Exploitation |
|---|---|---|---|
| Segmentation client | Label | x.crm.segment | Filtre Explore + ciblage de juge sur les VIP |
| Feature flag / variante | Label | x.feature.variant | Comparer deux variantes dans Explore |
| A/B & expérimentation | Label | x.experiment.arm | Regrouper les KPIs par bras d'expérience |
| Suivi utilisateur | Annotation | user.email | Colonne custom + recherche plein-texte |
| Intention métier | Annotation | request.intent | Colonne + filtre « toutes les demandes refund » |
Dépannage
| Symptôme | Cause probable & correctif |
|---|---|
| Ma colonne custom reste vide | Le chemin JSON ne correspond pas, ou l'annotation n'a pas été émise sur ces events. Vérifiez le chemin exact dans l'onglet Metadata ; l'indexation peut prendre un court instant. |
| Mon label custom est ignoré | Préfixe x. obligatoire, en minuscules. Sans x., une clé custom est rejetée. |
| La recherche ne trouve pas ma valeur | Seules les annotations sont indexées (pas les gros blobs de payload). Mettez la valeur en annotation, pas en contenu brut. |
| Trop de valeurs / cardinalité | Ne mettez jamais d'IDs ni de gros JSON en label (trace_id, prompt complet) — utilisez une annotation pour ça. |