{"_id":"@alexanderolsen/fetcher","_rev":"3-1acaa35a51287f097abd11cf670a5f4d","name":"@alexanderolsen/fetcher","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@alexanderolsen/fetcher","version":"0.1.0","keywords":["langsmith","langchain","traces","observability","cli","export"],"license":"MIT","_id":"@alexanderolsen/fetcher@0.1.0","maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"bin":{"fetcher":"dist/index.js"},"dist":{"shasum":"626cdcb38896046518f4cf6cf5dba26d471649c5","tarball":"https://registry.npmjs.org/@alexanderolsen/fetcher/-/fetcher-0.1.0.tgz","fileCount":29,"integrity":"sha512-uhV7r4RbOesVXFBZkoQeQ2j01hVA5gkCLUXKR9V4McWLLDXehBz3vAVLIww1ymHyeMAWSAHoT3Umj7rboNDWDg==","signatures":[{"sig":"MEUCICz7ptrqmgnFB28rIFmp42pfYPqhkzEE86MACu+ipgx+AiEA6mZI1WRaEsvxGn6/N4iy0dYXImHfJHqKWMef86rVcPg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118094},"type":"module","engines":{"node":">=20"},"exports":{"./package.json":"./package.json"},"scripts":{"build":"tsc","check":"tsc --noEmit","start":"node dist/index.js","prepare":"npm run build","install-cli":"sh scripts/install.sh","uninstall-cli":"sh scripts/uninstall.sh","prepublishOnly":"npm run check"},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"_npmVersion":"10.9.8","description":"Durable CLI for pulling trace data from LangSmith (v2 API)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/fetcher_0.1.0_1788624560064_0.9497506379221083","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alexanderolsen/fetcher","version":"0.1.1","keywords":["langsmith","langchain","traces","observability","cli","export"],"license":"MIT","_id":"@alexanderolsen/fetcher@0.1.1","maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"bin":{"fetcher":"dist/index.js"},"dist":{"shasum":"54e7f816167f1b490d4408712df338e26dd7f7e6","tarball":"https://registry.npmjs.org/@alexanderolsen/fetcher/-/fetcher-0.1.1.tgz","fileCount":29,"integrity":"sha512-XHeqSiLXNZPfEsZLyeonlA/ukM7H9Gy+e8nuGDe5lzQCxKfApex2evJJ1zlupX1imP4YCZsyGN0qQgomq1gs1g==","signatures":[{"sig":"MEUCIBbuZRLK9bLH5l0LOur1FJD6L9eRj1DzU1QT3gtavz8lAiEAiPHT2Li4CtRYyBOZLqz4SLrXG32S5rrYpfrSddF+Y5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120609},"type":"module","engines":{"node":">=20"},"exports":{"./package.json":"./package.json"},"scripts":{"build":"tsc","check":"tsc --noEmit","start":"node dist/index.js","prepare":"npm run build","install-cli":"sh scripts/install.sh","uninstall-cli":"sh scripts/uninstall.sh","prepublishOnly":"npm run check"},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"_npmVersion":"10.9.8","description":"Durable CLI for pulling trace data from LangSmith (v2 API)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/fetcher_0.1.1_1788626533237_0.7588291626351207","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alexanderolsen/fetcher","version":"0.1.2","description":"Durable CLI for pulling trace data from LangSmith (v2 API)","keywords":["langsmith","langchain","traces","observability","cli","export"],"type":"module","license":"MIT","bin":{"fetcher":"dist/index.js"},"exports":{"./package.json":"./package.json"},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","check":"tsc --noEmit","start":"node dist/index.js","install-cli":"sh scripts/install.sh","uninstall-cli":"sh scripts/uninstall.sh","prepare":"npm run build","prepublishOnly":"npm run check"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.0"},"dependencies":{"@clack/prompts":"^1.7.0"},"_id":"@alexanderolsen/fetcher@0.1.2","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-pzTKv66e86yQ8o30CzJmuogueAZLV+Tu6p4hT+IvI09pbHVPbG2bnrhOnXyFONfu/VEghZWSZ3RsJ4tFCPFOZQ==","shasum":"99d3f3352ec70147d9fff1ec2692e53bea149663","tarball":"https://registry.npmjs.org/@alexanderolsen/fetcher/-/fetcher-0.1.2.tgz","fileCount":29,"unpackedSize":129602,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCI02oelc+Ga+w4x7WKmHJnixyXhQO/Gf4tZCJusghmCgIhAMIc3K0fd+/bEN691dJ349manyb29PO8X3qSqPtrAtNT"}]},"_npmUser":{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"},"directories":{},"maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fetcher_0.1.2_1788629653438_0.27806158777124446"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-05T16:09:19.886Z","modified":"2026-09-05T17:34:13.745Z","0.1.0":"2026-09-05T16:09:20.199Z","0.1.1":"2026-09-05T16:42:13.384Z","0.1.2":"2026-09-05T17:34:13.566Z"},"license":"MIT","keywords":["langsmith","langchain","traces","observability","cli","export"],"description":"Durable CLI for pulling trace data from LangSmith (v2 API)","maintainers":[{"name":"alexanderolsen","email":"aolsenjazz@gmail.com"}],"readme":"# langsmith-fetcher\n\nDurable CLI for bulk-pulling trace data from LangSmith via the **v2 API**\n(`POST /api/v2/runs/query`), with a pleasant terminal experience.\n\nZero runtime dependencies. Node ≥ 20.\n\n## Install\n\n### Run instantly with npx (no install)\n\n```bash\nnpx @alexanderolsen/fetcher          # interactive wizard\nnpx @alexanderolsen/fetcher fetch --project <url> --last 24h\n```\n\n### From npm (global install)\n\n```bash\nnpm install -g @alexanderolsen/fetcher\nfetcher --help\n```\n\n### From source\n\nOne command — builds the CLI and puts a `fetcher` launcher on your PATH\n(at `~/.local/bin/fetcher`; override with `FETCHER_BIN_DIR`):\n\n```bash\ngit clone <repo-url> && cd fetcher\nnpm run install-cli\nfetcher --help\n```\n\nThe launcher points at the repo's `dist/`, so after pulling updates just run\n`npm run build` — no reinstall needed. To remove it: `npm run uninstall-cli`.\n\n### Alternatives\n\n- No install: `npm install && npm start -- fetch --project my-project --last 24h`\n- npm-style global link: `npm link` → `fetcher --help`\n- Straight from git (auto-builds via `prepare`): `npm install -g git+<repo-url>`\n\n## Quick start\n\n### Interactive mode (easiest)\n\nJust run `fetcher` with no arguments. It walks you through everything:\n\n1. **API key** — auto-detected from `LANGSMITH_API_KEY`, or prompted (masked)\n2. **Project URL** — open the project in your browser, copy the URL, paste it\n3. **Time window** — last 1h / 24h / 7d, or a custom start/end range\n4. **Output file** — sensible timestamped default\n5. **Data volume** — full payloads vs. slim (fast) mode\n6. **Filters** — optional LangSmith trace/tree filter expressions\n7. **Resume** — if a checkpoint exists at the output path, resume or start fresh\n\nYou'll get a summary to confirm before anything is pulled. Ctrl-C exits cleanly.\n\n### Flags mode (scripts & CI)\n\n```bash\nexport LANGSMITH_API_KEY=lsv2_pt_...        # auto-detected (LANGCHAIN_API_KEY also works)\n\n# Easiest: paste the project URL straight from the LangSmith UI\nfetcher fetch --project \"https://smith.langchain.com/o/<org-id>/projects/p/<project-id>\" --last 24h\n\n# ...or use a project name / UUID\nfetcher fetch --project my-project --from 2024-06-01T00:00:00Z --to 2024-06-03T00:00:00Z --out june.jsonl\n```\n\n`--project` accepts a UI URL, a project name, or a UUID. URLs from regional\nUIs (e.g. `eu.smith.langchain.com`) automatically target the matching API\nendpoint unless `--api-url` / `LANGSMITH_ENDPOINT` is set. `LANGSMITH_PROJECT`\nprovides a default project.\n\nEnv vars honored: `LANGSMITH_API_KEY`, `LANGSMITH_ENDPOINT` (EU/self-hosted),\n`LANGSMITH_WORKSPACE_ID`, `LANGSMITH_PROJECT`. CLI flags override.\n\n## What you get\n\n- `<out>` — flat runs, one JSON object per line (written + fsync'd incrementally)\n- `<base>.traces.jsonl` — one trace per line: `{trace_id, start_time, end_time, run_count, runs[]}`\n  with runs sorted by `dotted_order`. Includes full tool/LLM input & output payloads\n  (unless `--slim` or `--select` is used).\n\n## Durability\n\n- Every page checkpoints a cursor to `<out>.state.json` (atomic write).\n- Ctrl-C pauses cleanly; resume any interrupted pull with just its path:\n\n  ```bash\n  fetcher resume traces.jsonl          # or traces.jsonl.state.json\n  ```\n\n  The original project, time window, filters, selects, and endpoint are all\n  restored from the checkpoint — no flags needed. (`--api-url` overrides if\n  the instance moved.)\n- A crash leaves a valid truncated JSONL + resumable cursor. `--fresh` restarts.\n- Output paths are bound to job params — a mismatched window/project won't\n  silently append to the wrong file.\n\n## Rate limiting\n\nv2 rate limits are undocumented, so the client paces itself (`--rate`, default\n5 req/s), honors `Retry-After`, backs off exponentially on 429/5xx with\njitter, halves its pacing rate on 429 and recovers additively on success.\nRetries and rate-limit events surface in the terminal as they happen.\n\n## Notes / caveats\n\n- The v2 API is alpha — the request/response contract may change. All v2\n  traffic is isolated in `src/client.ts`.\n- The assembly pass (`runs.jsonl` → `traces.jsonl`) holds runs in memory.\n  For very large windows use `--flat` and group downstream.\n- `min_start_time` is inclusive, `max_start_time` exclusive.\n- `--filter` matches individual runs and can yield partial trees; prefer\n  `--trace-filter` / `--tree-filter` when you need whole traces.\n","readmeFilename":"README.md"}