Agent memory and context

letta-ai/

trajectory

Normalizes agent session transcripts from 15 runtimes into one validated, model-ready record format for training, evaluation, analysis, and inference.

What’s new here

Trajectory takes raw transcripts from Claude Code, Codex, Cursor, OpenHands, Gemini CLI, Copilot CLI, and nine other runtimes, each with its own incompatible format, and produces one validated JSON record array. The output schema is documented and versioned; every conversational record carries an ISO timestamp and a typed role.

What it does

Call normalizeTranscript with a transcript string and a source identifier. You get back a records array and a diagnostics array. Records follow a fixed schema: one leading meta record, then user, assistant, tool, reasoning, and observation records in session order. Tool calls carry stable IDs and stringified JSON arguments. Tool results include an ok boolean when the source exposes a reliable success/error signal.

A companion listTrajectories function pages through a source’s local session store so you can discover transcripts before normalizing them. The Deep Agents adapter reads directly from a LangGraph SQLite store by thread ID; all other adapters accept a transcript string.

A separate normalizeConversation API handles Slack channel exports, which are multi-party conversations rather than agent execution traces, using an independent schema.

Who it’s for

Teams building training pipelines, evaluation harnesses, or analysis and inference systems on top of agents that run across multiple runtimes. If you collect Claude Code sessions on one machine, Codex rollouts on another, and OpenHands traces from CI, trajectory gives you one parsing layer instead of 15. Available as an npm package (@letta-ai/trajectory) and a Python wrapper (agent-trajectory).

Try it

npm install @letta-ai/trajectory
pip install agent-trajectory
import { normalizeTranscript } from "@letta-ai/trajectory";
 
const { records, diagnostics } = normalizeTranscript({
  source: "codex",
  transcript: rawJsonl,
});

How mature is it

274 stars, 26 forks, 12 contributors. 13 releases; latest is v0.4.3, tagged 2026-09-25. 97 commits in the last 90 days. Created 2026-07-10. 1 open issue and 8 open pull requests. Apache-2.0.