- Changed scrub_trace.sh to match field names recursively at any depth - Works with arrays and nested objects (e.g., "content" finds all content fields) - Simpler interface: just field names instead of dotted paths - Safer for PII: catches sensitive data in unexpected locations - Updated README with new usage examples and field list 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
3.0 KiB
LangSmith Trace Export & PII Scrubbing
Simple bash scripts to extract, scrub, and upload LangSmith traces.
Quick Start
Extract and Scrub PII
Customers extract their trace and scrub sensitive data before sending:
# 1. Extract trace
export LANGSMITH_API_KEY='your-api-key'
./extract_trace.sh 00000000-0000-0000-f319-b36446ca3f23
# 2. Scrub PII (recursively redacts field names)
./scrub_trace.sh trace_00000000-0000-0000-f319-b36446ca3f23.json "content,email"
# 3. Review scrubbed file manually
# 4. Send trace_00000000-0000-0000-f319-b36446ca3f23.scrubbed.json to support
Upload
LangChain team uploads the scrubbed trace:
export LANGSMITH_API_KEY='your-api-key'
./upload_trace.sh customer_trace.scrubbed.json "customer-issue-1234"
Requirements
bashcurljq(install:brew install jqorapt-get install jq)
Scripts
extract_trace.sh
Extract a trace by ID.
./extract_trace.sh <trace_id> [output_file]
Output: trace_<id>.json
scrub_trace.sh
Redact PII fields from trace using recursive field name matching.
./scrub_trace.sh <trace_file> "<field1>,<field2>,..."
Output: <trace_file>.scrubbed.json
Common fields to redact:
content- Message content (finds all content fields)email- Email addressesmessages- Entire message arraysquery- Search queriestext- Generated textsession_id- Session IDsuser_id- User IDsapi_key- API keys
Recursive matching: Field names are matched at any depth in the JSON structure, including inside arrays and nested objects. For example, specifying content will redact all fields named content anywhere in the trace.
upload_trace.sh
Upload scrubbed trace to LangSmith project.
./upload_trace.sh <trace_file> <project_name>
Complete Example
Extract and Scrub PII:
export LANGSMITH_API_KEY='lsv2_pt_...'
# Extract
./extract_trace.sh a1b2c3d4-5678-90ab-cdef-1234567890ab
# Scrub
./scrub_trace.sh trace_a1b2c3d4-5678-90ab-cdef-1234567890ab.json \
"content,email,session_id"
# Review and send trace_a1b2c3d4-5678-90ab-cdef-1234567890ab.scrubbed.json to support
Upload:
export LANGSMITH_API_KEY='lsv2_pt_...'
./upload_trace.sh trace_a1b2c3d4-5678-90ab-cdef-1234567890ab.scrubbed.json \
"customer-acme-issue-5678"
Help
Each script has a --help flag:
./extract_trace.sh --help
./scrub_trace.sh --help
./upload_trace.sh --help
EU Region
Set LANGSMITH_ENDPOINT for EU:
export LANGSMITH_ENDPOINT='https://eu.api.smith.langchain.com'
Troubleshooting
"jq required"
brew install jq # macOS
apt-get install jq # Linux
"No runs found"
- Trace ID doesn't exist
- Trace not fully ingested (wait a few seconds)
- Wrong API key
"Failed to create project"
- API key invalid or expired
- No write permissions
Important
Customers must manually review scrubbed files before sending to ensure all PII is removed.