00 — Aperçu

v0.3.0 · Apache-2.0 · Windows · macOS · Linux

Voyez ce que votre agent a réellement fait.

ThreadlineLM lit les journaux d’audit que votre agent écrit déjà — compatibles OpenAI, OpenTelemetry GenAI ou LiteLLM — et reconstruit l’exécution : chaque appel, chaque appel d’outil, chaque nouvelle tentative. L’analyse se fait sur votre machine.

Build portable Windows · 5,2 Mo · sans compte ni télémétrie

audit.log
Vue chat de ThreadlineLM : un échec de CI reconstruit comme une conversation, avec appel d’outil, résultat, bloc de raisonnement et réponse finale.
p50 1 840 ms · p95 4 100 ms
5,2 Mo build portable Windows
0 appel réseau à l’exécution
6 formats, détectés au contenu
Ctrl+1…5 une touche par vue
01 — Le fichier

L’exécution est passée. Le journal reste.

Un agent échoue et laisse un fichier : requêtes, chunks en streaming, appels d’outils, nouvelles tentatives, un 429 à 14:02:31. Grep vous donne des lignes. Il ne dit pas à quelle session elles appartiennent, quel appel a modifié le fichier ni où la boucle a commencé.

ThreadlineLM analyse ce fichier et reconstruit l’exécution : la conversation vue par le modèle, les outils appelés, le coût de chaque appel. La même preuve, lisible.

inputExample/audit.log · synthétique · 9 événements evt_0009

        01
        {
      
        02
          "id": "evt_0009",
      
        03
          "ts": "2026-05-17T15:30:09.000Z",
      
        04
          "client": "eval-runner",
      
        05
          "model": "gemini/gemini-2.0-flash",
      
        06
          "status": 429,
      
        07
          "duration_ms": 95,
      
        08
          "upstream": { "status": 429 },
      
        09
          "req_body": {
      
        10
            "messages": [
      
        11
              {
      
        12
                "role": "user",
      
        13
                "content": "Translate to Spanish: good night."
      
        14
              }
      
        15
            ]
      
        16
          },
      
        17
          "resp_body": {
      
        18
            "error": {
      
        19
              "code": 429,
      
        20
              "status": "RESOURCE_EXHAUSTED"
      
        21
            }
      
        22
          }
      
        23
        }
      
429 · limite en amont · 95 ms
02 — Vues

Quatre lectures du même fichier.

La chronologie est l’index. Le reste tient à une touche : les mêmes événements, lus de quatre façons, sans réimport.

Chaque appel, dans l’ordre

01 Chronologie

Chaque appel, dans l’ordre

Fournisseur, modèle, statut, latence et tokens entrée/sortie. Une requête en échec garde son code HTTP au lieu de disparaître dans une stack trace.

8 sessions · plus récentes d’abord

Compare est le cinquième onglet : placez un appel qui marche à côté d’un appel cassé et comparez requête et réponse, champ par champ.

Ctrl+1…5
03 — Entrée

Six formats. Détectés au contenu, pas à l’extension.

Déposez le fichier sur la fenêtre. Le parseur est choisi d’après les premiers enregistrements : .log, .jsonl et .json fonctionnent tous.

Format Ce qu’il lit Exemple Événements
Audit JSONL compatible OpenAI Appels d’outils, flux SSE, raisonnement, tool_use d’Anthropic, erreurs 429 audit.log 9
Enregistrements d’audit en tableau JSON Les mêmes enregistrements dans un seul tableau audit-array.json 3
Spans OpenTelemetry GenAI Un span par ligne ; les spans non GenAI sont ignorés otel-genai-spans.jsonl 3
Enveloppe OTLP/JSON resourceSpans avec attributs KeyValue otel-genai-otlp.json 2
StandardLoggingPayload LiteLLM Réponse en streaming, tool use, embedding, échec litellm.jsonl 5
Journal de proxy en texte brut JSON d’audit intégré aux lignes de journal proxy-raw.log 2

Tous les exemples sont synthétiques et fournis dans inputExample/. Un enregistrement par ligne : le JSON multiligne formaté n’est pas encore détecté.

Watch
Exécutions en cours

Relit le fichier toutes les 500 ms pendant que l’agent travaille, pour suivre une exécution en direct.

Compare
Exécution saine contre exécution cassée

Requête et réponse de deux appels, côte à côte, champ par champ.

Export
Du Markdown pour le ticket

Recherche floue entre les appels, puis export de la session à coller dans le rapport de bug.

04 — Frontière

Rien ne quitte la machine.

Sans compte, sans télémétrie, sans cloud, sans vérification de mise à jour. L’analyse tourne en Rust, en mémoire. Le journal n’est jamais envoyé et rien n’est écrit, sauf le Markdown demandé.

Aucun appel réseau

L’application n’ouvre aucune socket. La chronologie se construit avec le câble débranché.

En mémoire

Le fichier est lu, analysé puis oublié à la fermeture. Ni cache, ni copie sur disque.

Auditable

Apache-2.0. Les parseurs et les commandes IPC tiennent en quelques fichiers Rust : lisez-les, ou compilez le binaire vous-même.

05 — À l’intérieur

Du fichier à la chronologie.

L’analyse et le regroupement des sessions restent dans le backend Rust ; l’interface reçoit des résultats typés via Tauri IPC.

01 Détecter

Les premiers enregistrements choisissent le parseur. Les lignes inconnues sont ignorées, pas fatales.

Rust
02 Analyser

Requêtes, réponses, appels d’outils, raisonnement, usage et statut.

4 parseurs
03 Regrouper

Les appels deviennent des sessions par client et fenêtre de 10 minutes.

session.rs
04 Reconstruire

Ordre du chat, résultats d’outils et arêtes du graphe par session.

store.ts
05 Inspecter

Listes virtualisées, recherche floue, export Markdown.

React · IPC
06 — Télécharger

Essayez sur une exécution.

Déposez inputExample/audit.log sur la fenêtre : 9 appels dans la chronologie, le chat reconstruit, le graphe et la latence p50/p95.

Les builds ne sont pas encore signés. Sous Windows, SmartScreen demande Plus d’informations → Exécuter quand même. Sous macOS, retirez la quarantaine une fois : xattr -dr com.apple.quarantine /Applications/ThreadlineLM.app

Début : v0.3.0. Formats et vues suffisent au débogage quotidien ; une forme de journal inhabituelle peut encore dérouter un parseur. Une issue avec un échantillon expurgé est le meilleur rapport.

Ou compilez-le

Node 20+, pnpm 10+, une toolchain Rust stable et les dépendances système de Tauri.

$ git clone https://github.com/aralde/ThreadlineLM
$ cd ThreadlineLM && pnpm install
$ pnpm tauri dev