Skip to main content

SDK for importing and transforming agent traces into Trajectory format

Project description

trajectory-sdk

Import agent traces from LangSmith (and other providers) into a standardized Trajectory format.

Install

pip install trajectory-sdk

Quick Start

Individual conversation import

import trajectory_sdk as tj

tj.init(provider="langsmith", api_key="lsv2_pt_...", project_id="...")

# List available conversations
conversations = tj.list_conversations()

# Import and save all conversations
trajectories = tj.import_conversations(conversations)
tj.save(trajectories, "./exports")

Bulk export (E2E)

Export all conversations from a LangSmith project, parse into Trajectories, and upload to GCS + BigQuery in three lines:

import trajectory_sdk as tj

tj.init(
    provider="langsmith",
    api_key="lsv2_pt_...",
    project_id="...",
    workspace_id="...",
    destination_id="...",
)
trajectories = tj.import_conversations(bulk=True)
tj.upload(trajectories, dataset="my_dataset")

This automatically discovers all trace IDs, triggers a LangSmith bulk export, downloads the parquet from GCS, and parses it into Trajectory objects.

API

tj.init(*, provider, api_key, project_id, storage_dir, debug)

Configure the SDK. Call once before other functions.

tj.init(
    provider="langsmith",        # trace provider (default: "langsmith")
    api_key="lsv2_pt_...",       # provider API key (or set LANGSMITH_API_KEY env var)
    project_id="...",            # provider project/session ID
    workspace_id="...",          # LangSmith workspace/tenant ID (required for bulk export)
    destination_id="...",        # bulk export destination ID (required for bulk export)
    storage_dir="~/.trajectory", # local staging directory (default)
    debug=False,                 # enable debug logging (default: False)
)

tj.list_conversations(*, limit) -> list[ConversationSummary]

List available conversations from the configured provider.

conversations = tj.list_conversations(limit=100)
for c in conversations:
    print(c.conversation_id, c.num_turns)

tj.import_conversations(conversations, *, stage, redactor) -> list[Trajectory]

Import conversations and return one Trajectory per conversation. Accepts a list of conversation ID strings or ConversationSummary objects.

# By ID
trajectories = tj.import_conversations(["cc_abc123", "cc_def456"])

# By ConversationSummary (from list_conversations)
conversations = tj.list_conversations()
trajectories = tj.import_conversations(conversations)

# Bulk export from a local parquet file
trajectories = tj.import_conversations(bulk=True, source="export.parquet")

# Live bulk export (triggers export, downloads, parses)
trajectories = tj.import_conversations(bulk=True)

# With optional PII redaction
trajectories = tj.import_conversations(["cc_abc123"], redactor=my_redactor)

# Without local staging
trajectories = tj.import_conversations(["cc_abc123"], stage=False)

tj.upload(trajectories, dataset)

Upload trajectories to GCS and BigQuery.

tj.upload(trajectories, dataset="my_dataset")

tj.save(trajectories, output_dir)

Save trajectories to local JSON files. Each trajectory is written to {output_dir}/{conversation_id}.json.

# Save all
tj.save(trajectories, "./exports")

Save a single trajectory

tj.save(trajectories[0], "./exports")


## Full Example

```python
import trajectory_sdk as tj

tj.init(
    provider="langsmith",
    api_key="lsv2_pt_...",
    project_id="...",
    workspace_id="...",
    destination_id="...",
)

# Bulk export everything and upload
trajectories = tj.import_conversations(bulk=True)
tj.upload(trajectories, dataset="production_traces")

print(f"Exported {len(trajectories)} trajectories")
for t in trajectories:
    print(f"  {t.task.conversation_id}: {t.task.num_turns} turns, {len(t.steps)} steps")

CLI: harness extraction

trajectory extract harness extracts an AI agent's harness — the scaffolding around the model (system prompts, tool definitions, the agentic loop, retry/compaction logic) — into a structured, reviewable spec. Run it from inside the agent's repo:

cd ~/code/my-agent
trajectory extract harness "the support-bot harness (prompts in app/prompts, loop in app/agent.py)"

This runs a read-only agent session that traces the codebase outward from the model call and writes .trajectory/harness.md. The flow:

  1. Discover — walk cwd to the .git root.
  2. Extract — a pluggable BaseAgent (Claude Code first) runs the bundled extract-harness skill with a read-only tool profile.
  3. Persist — write the harness spec to .trajectory/harness.md.

The Claude Code backend requires ANTHROPIC_API_KEY (or a logged-in Claude Code install).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

trajectory_sdk-0.3.0.tar.gz (100.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

trajectory_sdk-0.3.0-py3-none-any.whl (93.9 kB view details)

Uploaded Python 3

File details

Details for the file trajectory_sdk-0.3.0.tar.gz.

File metadata

  • Download URL: trajectory_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 100.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for trajectory_sdk-0.3.0.tar.gz
Algorithm Hash digest
SHA256 ba160ebe6a1308c28c8c6d14a3fb1815561a47aa76e5c743e9188213dcb2afff
MD5 c566987cb16392669beaac8dcac1bd62
BLAKE2b-256 60ce6caa7d0fce9ccad3d7867f79894939e04461ffe0cd61e71b7bbcb4cf72f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for trajectory_sdk-0.3.0.tar.gz:

Publisher: publish-sdk.yml on Trajectorylabs/trajectory-platform

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file trajectory_sdk-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: trajectory_sdk-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 93.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for trajectory_sdk-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1c58bfb4c2fc284101827c10f4414f0ba4155ffccbac12d0c7bf84ad307742a5
MD5 ec65567582c1e654c1fcca93046abe53
BLAKE2b-256 8e8bf8243e4f18afbc7f25717ef4002c5823f3acff8f17711d2672f25cf64c64

See more details on using hashes here.

Provenance

The following attestation bundles were made for trajectory_sdk-0.3.0-py3-none-any.whl:

Publisher: publish-sdk.yml on Trajectorylabs/trajectory-platform

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page