LangSmith
snapshot-20260831 commercialLangSmith is a platform for debugging, testing, and monitoring LLM applications built with LangChain.
resource "aws_iam_role" "langsmith_bulk_export" {
name = "langsmith-bulk-export"
max_session_duration = 43200
assume_role_policy = jsonencode({
Principal = {
Federated = "accounts.google.com"
}
Action = "sts:AssumeRoleWithWebIdentity"
Condition = {
StringEquals = {
"accounts.google.com:oaud" = "langsmith-bulk-export"
"accounts.google.com:sub" = [
"110136955440523778103",
"116331607438151298187",
"115251468294701876731"
]
}
}
})
}
curl -X PATCH https://api.smith.langchain.com/api/v1/export-destinations/<destination_id> \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <your_api_key>' \
-d '{"aws_role_arn": "arn:aws:iam::123456789012:role/LangSmithBulkExportRole"}'
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-Api-Key: <your-api-key>' \
-d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": {"type": "thread", "code": "..."}}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=u_12345,deployment.environment=production"
# Traces will appear in LangSmith with metadata keys otel.resource.user.id and otel.resource.deployment.environment
export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <api-key>' \
-d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>"}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production"
python my_langchain_app.py
export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
OTEL_RESOURCE_ATTRIBUTES="user.id=u-1234,deployment.environment=production" python my_agent.py
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-Api-Key: <your-api-key>' \
-d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>", "evaluator": { ... }}'
FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production"
# Traces will carry these as otel.resource.user.id and otel.resource.deployment.environment metadata in LangSmith
FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-d '{"test_thread_id": "<thread_id>", "session_id": "<session_id>"}'
curl -X POST 'https://<langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <api-key>' \
-d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip docker compose up
OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production" python my_agent.py
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <your-api-key>' \
-d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": { ... }}'
export OTEL_RESOURCE_ATTRIBUTES='service.name=my-agent,user.id=u_12345'
export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <your-api-key>' \
-d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=user-123,deployment.environment=production"
export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'x-api-key: <LANGSMITH_API_KEY>' \
-d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": {"type": "thread", "prompt_id": "<prompt-id>"}}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=u_12345,deployment.environment=production,service.version=2.1.0"
export LANGSMITH_ENDPOINT="https://<your-byoc-endpoint>"
# Run your application — resource attributes appear as otel.resource.user.id, etc. in LangSmith traces
curl -X POST 'https://<langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-Api-Key: <api-key>' \
-d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>", "evaluator": { ... }}'
OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,service.version=2.1.0" python my_langsmith_app.py
FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <api-key>' \
-d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=usr_123,deployment.environment=production"
export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip
curl -X POST 'https://<langsmith-host>/runs/rules/validate' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: <your-api-key>' \
-d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>"}'
export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production"
python my_agent.py
FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip docker compose up Summary
LangSmith is a platform for debugging, testing, and monitoring LLM applications built with LangChain.
Release history
- docs update
LangSmith SaaS (GCP-hosted) can now export to S3 via AWS IAM role assumption, eliminating static credential storage.
└──▷ USE ITBootstrap the required AWS trust policy for GCP-hosted LangSmith to assume a role for S3 export — avoids storing long-lived AWS credentials in LangSmith.resource "aws_iam_role" "langsmith_bulk_export" { name = "langsmith-bulk-export" max_session_duration = 43200 assume_role_policy = jsonencode({ Principal = { Federated = "accounts.google.com" } Action = "sts:AssumeRoleWithWebIdentity" Condition = { StringEquals = { "accounts.google.com:oaud" = "langsmith-bulk-export" "accounts.google.com:sub" = [ "110136955440523778103", "116331607438151298187", "115251468294701876731" ] } } }) }- ›Adds AWS IAM role assumption support for S3 bulk-export destinations on GCP-hosted LangSmith SaaS, allowing credential-free exports using a trusted AWS role ARN instead of static AWS credentials.
- ›Supports switching an existing S3 export destination between static credentials and IAM role assumption without recreating the destination.
- docs update
LangSmith lets you add threads directly to a dataset from the UI.
- ›Adds the ability to add threads to a dataset from the LangSmith UI.
- docs update
LangSmith adds a Chat interface on the Engine page to investigate detected issues and linked traces via natural language.
└──▷ HOW TO FIND ITWhen triaging flagged traces in LangSmith Engine, open Chat to quickly understand a detected issue without manually inspecting each linked trace.📍In LangSmith, go to Engine › (select an issue) › Chat, then ask 'What went wrong?' or 'Explain the proposed fix'.- ›New Chat interface on the Engine page lets practitioners ask natural-language questions about detected issues and their linked traces, such as 'What went wrong?', 'Why was this flagged?', 'Explain the proposed fix', 'What are my most pressing issues?', and 'How many new issues do I have?'
- docs update
LangSmith S3 export destinations now support switching between static credentials and AWS IAM role assumption via PATCH.
└──▷ TRY ITSwitch an existing S3 export destination from static credentials to IAM role assumption so no long-lived keys are stored in LangSmith.$ curl -X PATCH https://api.smith.langchain.com/api/v1/export-destinations/<destination_id> \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <your_api_key>' \ -d '{"aws_role_arn": "arn:aws:iam::123456789012:role/LangSmithBulkExportRole"}'
- ›Adds
aws_role_arnfield to the PATCH body for S3 export destinations, enabling LangSmith to assume an AWS IAM role instead of storing static credentials — available on GCP SaaS deployments only. - ›Switching authentication modes (static credentials ↔ IAM role assumption) is now possible without recreating the destination: supplying
aws_role_arnclears stored credentials, and supplying static credentials clears the stored role ARN. - ›LangSmith validates any authentication-mode switch with a test write to the destination bucket before saving, returning an error if the new configuration lacks sufficient write permissions.
- ›Adds
- snapshot-20260831└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, to confirm it grades correctly on live thread data.
$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-Api-Key: <your-api-key>' \ -d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": {"type": "thread", "code": "..."}}'
Attach user IDs and environment metadata to every trace without changing span emission code, using standard OpenTelemetry resource attributes.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=u_12345,deployment.environment=production" # Traces will appear in LangSmith with metadata keys otel.resource.user.id and otel.resource.deployment.environmentRetain gzip bulk export compression on a self-hosted LangSmith deployment instead of accepting the new zstd default.$ export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Adds
POST /v2/datasets/{dataset_id}/experiment-runsas the supported public API for paginated experiment comparison. - ›Introduces the
FF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable to retaingzipcompression on self-hosted deployments; all other deployments now default bulk export compression tozstandard(zstd). - ›OpenTelemetry resource attributes set via
OTEL_RESOURCE_ATTRIBUTESnow appear on traces as metadata namespaced underotel.resource.*, enabling attachment of fields like user IDs without changing span emission. - ›LangSmith MCP tools that fetch runs or thread history now accept project UUIDs in addition to project names.
- ›Enforces user-defined monthly trace limits scoped to individual projects and users; new traces exceeding a configured limit are rejected while patches and feedback for accepted traces continue to flow.
+12 moreshow less
- ›Adds a reorderable 'Splits (latest)' column to the experiment comparison view showing each example's current dataset split assignments as chips reflecting live membership.
- ›Each split chip in the Splits cell of experiment results and comparison views is now interactive, with an 'Edit splits' action that opens the single-example split picker inline.
- ›Thread evaluator config preview now shows only the thread message formats the evaluator actually maps, and displays a locked 'Trace count ≥ 2' filter for managed thread evaluators.
- ›Vercel AI SDK traces sent over raw OpenTelemetry now render in the Messages view.
- ›Native OpenTelemetry child spans are no longer dropped when they arrive before an SDK-attributed parent span; they are buffered and correctly nested regardless of arrival order.
- ›Bulk export of a dataset comparison view now returns a clear 'file is too large to export' error instead of a generic server error when the export exceeds internal size limits.
- ›LangSmith now caps reusable evaluators per workspace to prevent unbounded resource growth; contact support for higher limits.
- ›When a runs query times out, the runs table now shows a timeout banner instead of a silent failure.
- ›LangSmith now preserves traces in multipart ingestion batches when one run has oversized inputs or outputs, replacing oversized fields with a placeholder instead of rejecting the entire batch.
- ›Thread pages now show an explicit access-control message when trace loading is denied by ABAC, instead of a generic retrieval error.
- ›Authenticated users viewing public runs now see sidebar navigation for their last selected workspace.
- ›Thread stats requests that opt into streaming now return main stats first and append feedback stats when ready.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work only for LangSmith UI clients.
- !Bulk export compression now defaults to
zstandard(zstd) on all deployments except self-hosted environments, which retaingzipvia theFF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable.
- ›Adds
- snapshot-20260830
LangSmith adds bulk split editing, thread evaluator testing, per-project trace limits, zstd export compression, and OTEL resource attribute tracing.
└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it to catch mapping or logic errors early.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <api-key>' \ -d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>"}'
Attach OpenTelemetry resource attributes (e.g. user ID, environment) to LangSmith traces without changing span emission code.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production" python my_langchain_app.pyKeep gzip bulk export compression on a self-hosted LangSmith deployment instead of the new zstd default.$ export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Adds
test_thread_idandsession_idparameters to the/runs/rules/validateendpoint to test multi-turn thread evaluators against a real conversation before saving. - ›Supports
OTEL_RESOURCE_ATTRIBUTESvalues on traces as metadata namespaced underotel.resource.*, enabling user IDs and other resource attributes to appear without changing span emission. - ›Adds
FF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable to override bulk export compression on self-hosted deployments (default is nowzstd; self-hosted retainsgzipvia this flag). - ›Enforces user-defined monthly trace limits scoped to individual projects and users, rejecting new traces that exceed the configured limit while allowing patches and feedback on accepted traces to continue.
- ›Each split chip in experiment results and comparison views now has an interactive 'Edit splits' action to reassign splits without leaving the table.
+4 moreshow less
- ›Bulk export compression now defaults to zstandard (
zstd) for improved performance. - ›LangSmith now returns clearer
409 Conflictmessages distinguishing duplicate run create from run update payloads. - ›Code evaluator upload now accepts Python entrypoints annotated with PEP 604 union return types (e.g.
-> dict | None). - ›Native OpenTelemetry child spans are now buffered and correctly nested when they arrive before an SDK-attributed parent span.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work only for LangSmith UI clients.
- ›Adds
- snapshot-20260829
LangSmith adds project/user trace limits, OTEL resource metadata, thread evaluator testing, bulk split editing, and zstd export compression.
└──▷ TRY ITAttach OpenTelemetry resource attributes — such as a user ID or environment tag — so they appear on LangSmith traces underotel.resource.*without changing your tracer code.$ OTEL_RESOURCE_ATTRIBUTES="user.id=u-1234,deployment.environment=production" python my_agent.pyTest a multi-turn thread evaluator against a real conversation thread before saving it, to verify it grades correctly.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-Api-Key: <your-api-key>' \ -d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>", "evaluator": { ... }}'
On self-hosted deployments, keep gzip compression for bulk exports instead of the new zstd default.$ FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Adds bulk split management in experiment views — select multiple rows (or all matching current filters) to add, replace, or remove dataset splits, or copy selected examples to another dataset in one action.
- ›Custom code evaluators that time out or fail on a run now record an error on that run instead of silently leaving it without feedback.
- ›LangSmith returns clearer
409 Conflictmessages when duplicate run create or update payloads are submitted, indicating whether the duplicate was a create or update request. - ›Sharing, viewing, or unsharing any run in a trace now operates on the trace root, making every run in a shared trace publicly viewable and opening public run links within the shared trace context.
- ›The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID, preventing structured-log aggregators from exhausting dynamic field limits.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs (existing HTTP routes continue to work for LangSmith UI clients).
- snapshot-20260828
LangSmith adds project/user trace limits, zstd bulk export, OTEL resource metadata, and thread evaluator improvements
└──▷ TRY ITAttach OpenTelemetry resource attributes (e.g., user ID, environment) to LangSmith traces without modifying span emission code.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production" # Traces will carry these as otel.resource.user.id and otel.resource.deployment.environment metadata in LangSmithOverride the default bulk export compression on a self-hosted deployment to keep gzip instead of the new zstd default.$ FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzipTest a multi-turn thread evaluator against a real conversation before saving it.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -d '{"test_thread_id": "<thread_id>", "session_id": "<session_id>"}'
- ›Adds
POST /v2/datasets/{dataset_id}/experiment-runsas the supported public API for paginated experiment comparison. - ›Bulk export compression now defaults to zstandard (
zstd) for improved performance; self-hosted environments retain the gzip default via theFF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable. - ›OpenTelemetry resource attributes set via
OTEL_RESOURCE_ATTRIBUTESnow appear on traces as metadata namespaced underotel.resource.*, enabling attachment of details like user IDs without changing span emission. - ›LangSmith MCP tools that fetch runs or thread history now accept project UUIDs in addition to project names.
- ›Vercel AI SDK traces sent over raw OpenTelemetry now render in the Messages view.
+9 moreshow less
- ›Adds an interactive split chip with an 'Edit splits' action in experiment results and comparison views, enabling per-example split reassignment without leaving the table.
- ›Adds an optional, reorderable 'Splits (latest)' column in experiment comparison view showing each example's current dataset split assignments as chips.
- ›Enables bulk selection of experiment rows to add, replace, or remove dataset splits, or copy selected examples to another dataset, in one action.
- ›Native OpenTelemetry child spans arriving before an SDK-attributed parent span are now buffered and correctly nested regardless of arrival order.
- ›LangSmith now preserves traces in multipart ingestion batches when one run has oversized inputs or outputs, replacing oversized fields with a placeholder instead of rejecting the entire batch.
- ›The
/runs/rules/validateendpoint now supports thread evaluators. - ›The evaluator config now shows a locked 'Trace count >= 2' filter for managed thread evaluators, making it clear they only run on threads with multiple turns.
- ›Thread stats requests that opt into streaming now return main stats first and append feedback stats when ready.
- ›All time filters in tracing views now query the full retention window instead of falling back to a shorter backend default.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work only for LangSmith UI clients.
- !The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID.
- ›Adds
- snapshot-20260826└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, to validate scoring logic end-to-end.
$ curl -X POST 'https://<langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <api-key>' \ -d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
Retain gzip compression for bulk exports on a self-hosted LangSmith deployment instead of the new zstd default.$ FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip docker compose upAttach OpenTelemetry resource attributes (e.g., user ID, environment) to LangSmith traces asotel.resource.*metadata without changing span emission code.$ OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production" python my_agent.py- ›Adds
test_thread_idandsession_idparameters to the/runs/rules/validateendpoint to test multi-turn thread evaluators against real conversations before saving. - ›New
POST /v2/datasets/{dataset_id}/experiment-runspublic API endpoint for paginated experiment comparison (legacy dataset comparison helpers removed from public OpenAPI spec and generated SDKs). - ›Enforces user-defined monthly trace limits scoped to individual projects and users; new traces exceeding a configured limit are rejected while patches and feedback for already-accepted traces continue.
- ›Bulk row actions in experiments now allow selecting multiple (or all filtered) rows to add, replace, or remove dataset splits in one action, or copy selected examples to another dataset.
- ›Each split chip in Splits cells across experiment results and comparison views now has an interactive 'Edit splits' action to reassign splits without leaving the table.
+1 moreshow less
- ›Workspace-level cap on reusable evaluators introduced to prevent unbounded resource growth.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs (existing HTTP routes continue to work for LangSmith UI clients only).
- ›Adds
- snapshot-20260825└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, to catch mapping or logic errors early.
$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <your-api-key>' \ -d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": { ... }}'
Attach deployment metadata (e.g. user ID, service name) to every trace without modifying span emission logic, then filter onotel.resource.*fields in LangSmith.$ export OTEL_RESOURCE_ATTRIBUTES='service.name=my-agent,user.id=u_12345'Keep the legacy gzip compression for bulk exports on a self-hosted deployment instead of the new zstd default.$ export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Adds per-project and per-user monthly trace limits: new traces exceeding a configured limit are rejected, while patches and feedback for already-accepted traces continue to flow through.
- ›Bulk row actions in experiment views now let you select multiple rows (or all rows matching current filters) and add, replace, or remove dataset splits in one action, or copy selected examples to another dataset.
- ›LangSmith now returns clearer
409 Conflictmessages when duplicate run create or update payloads are submitted, indicating whether the duplicate was a create or update request. - ›Custom code evaluators that time out or fail on a run now record an error on that run instead of silently leaving it without feedback.
- ›Code evaluator upload now accepts Python entrypoints annotated with PEP 604 union return types (e.g.
-> dict | None).
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work only for LangSmith UI clients.
- snapshot-20260824
LangSmith adds thread evaluator API testing, project/user trace limits, zstd bulk export, and OpenTelemetry resource attribute tracing.
└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, to validate logic without running a full experiment.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <your-api-key>' \ -d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
Attach OpenTelemetry resource attributes — such as a user ID — so they appear on LangSmith traces underotel.resource.*without modifying span emission code.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=user-123,deployment.environment=production"Keep gzip compression for bulk exports on a self-hosted LangSmith deployment instead of adopting the new zstd default.$ export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›The
POST /v2/datasets/{dataset_id}/experiment-runsendpoint is now the supported public API for paginated experiment comparison. - ›The
/runs/rules/validateendpoint now supports thread evaluators — passtest_thread_idandsession_idto test a multi-turn evaluator against a real conversation before saving. - ›OpenTelemetry resource attributes set via
OTEL_RESOURCE_ATTRIBUTESnow appear on traces as metadata namespaced underotel.resource.*, enabling user IDs and other span metadata without changing tracer emit logic. - ›Bulk export compression now defaults to zstandard (
zstd); self-hosted environments retaingzipas the default via theFF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable. - ›LangSmith now enforces user-defined monthly trace limits scoped to individual projects and users, rejecting new traces that exceed a configured limit while allowing patches and feedback for already-accepted traces.
+13 moreshow less
- ›LangSmith MCP tools that fetch runs or thread history now accept project UUIDs in addition to project names.
- ›Vercel AI SDK traces sent over raw OpenTelemetry now render in the Messages view.
- ›Adds a reorderable 'Splits (latest)' column to the experiment comparison view showing each example's current dataset split assignments as chips.
- ›Bulk row actions in an experiment now allow adding, replacing, or removing dataset splits, or copying selected examples to another dataset, across multiple rows at once.
- ›Each split chip in a row's Splits cell in experiment results and comparison views is now interactive, with an 'Edit splits' action opening the single-example split picker.
- ›Native OpenTelemetry child spans are no longer dropped when they arrive before an SDK-attributed parent span; they are buffered and correctly nested regardless of arrival order.
- ›Sharing, viewing, or unsharing any run in a trace now operates on the trace root, making every run in a shared trace publicly viewable.
- ›Thread stats requests that opt into streaming now return the main stats first and add feedback stats incrementally when ready.
- ›The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID, preventing structured-log aggregators from exhausting dynamic field limits. - ›LangSmith now preserves traces in multipart ingestion batches when one run has oversized inputs or outputs, replacing oversized fields with a placeholder instead of rejecting the entire batch.
- ›LangSmith now returns clearer
409 Conflictmessages indicating whether a duplicate was a run create or run update request when duplicate payloads are submitted. - ›All time filters in tracing views now query the full retention window instead of falling back to a shorter backend default.
- ›Thread pages now show an explicit access-control message when trace loading is denied by ABAC, instead of a generic retrieval error.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work only for LangSmith UI clients.
- ›The
- snapshot-20260823
LangSmith adds per-project trace limits, OTEL resource metadata, thread evaluator testing, bulk zstd export, and paginated experiment comparison API.
└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, using/runs/rules/validatewith the new thread evaluator parameters.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'x-api-key: <LANGSMITH_API_KEY>' \ -d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>", "evaluator": {"type": "thread", "prompt_id": "<prompt-id>"}}'
Attach OpenTelemetry resource attributes so user IDs and environment tags surface asotel.resource.*metadata on every trace without changing span emission code.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=u_12345,deployment.environment=production,service.version=2.1.0" export LANGSMITH_ENDPOINT="https://<your-byoc-endpoint>" # Run your application — resource attributes appear as otel.resource.user.id, etc. in LangSmith traces- ›Adds support for
test_thread_idandsession_idparameters on the/runs/rules/validateendpoint to test a multi-turn thread evaluator against a real conversation before saving. - ›Self-hosted deployments can retain gzip bulk export compression by setting the
FF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable; bulk export now defaults to zstandard (zstd) for improved performance. - ›Enables bulk split management in experiment views: select multiple rows (or all rows matching current filters) and add, replace, or remove their dataset splits in one action, or copy selected examples to another dataset.
- ›The
/runs/rules/validateendpoint now supports thread evaluators. - ›The thread evaluator config preview now shows only the thread message formats the evaluator actually maps, rather than every available format.
+1 moreshow less
- ›Model, prompt, and tool chips in the Experiments table config cells now include a clickable
+Noverflow badge whose entries expose filter, group-by, open-in-playground, and details actions.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs (existing HTTP routes continue to work for LangSmith UI clients only).
- !The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID — structured-log aggregators parsing the old map shape will need to update their parsers.
- ›Adds support for
- snapshot-20260822└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it to catch misconfiguration early.
$ curl -X POST 'https://<langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-Api-Key: <api-key>' \ -d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>", "evaluator": { ... }}'
Attach structured metadata (e.g., user IDs, service version) to every trace from a service without modifying span emission code.$ OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,service.version=2.1.0" python my_langsmith_app.pyKeep gzip bulk export compression on a self-hosted deployment when upgrading, since the new default is zstd.$ FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Adds
POST /v2/datasets/{dataset_id}/experiment-runsas the supported public API for paginated experiment comparison; legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs. - ›Code evaluator upload now accepts Python entrypoints annotated with PEP 604 union return types (e.g.,
-> dict | None). - ›Authenticated users viewing public runs now see sidebar navigation for their last selected workspace.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; code using those SDK methods must migrate to
POST /v2/datasets/{dataset_id}/experiment-runs. - !The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID, which will break structured-log aggregators or pipelines that expected the previous map format.
- ›Adds
- snapshot-20260821
LangSmith adds thread evaluator APIs, per-project trace limits, zstd bulk export, and OpenTelemetry resource attribute tracing.
└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, using the updated/runs/rules/validateendpoint.$ curl -X POST 'https://<your-langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <api-key>' \ -d '{"test_thread_id": "<thread-id>", "session_id": "<session-id>"}'
Attach OpenTelemetry resource attributes (e.g. user ID, environment) so they appear on LangSmith traces underotel.resource.*without modifying span emission.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=usr_123,deployment.environment=production"Retain gzip compression for bulk exports on a self-hosted LangSmith deployment instead of the new zstd default.$ export FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip- ›Bulk export compression now defaults to zstandard (
zstd); self-hosted environments retain thegzipdefault via theFF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable. - ›Enables bulk selection of multiple experiment rows to add, replace, or remove dataset splits in one action, or copy selected examples to another dataset.
- ›Native OpenTelemetry child spans are no longer dropped when they arrive before an SDK-attributed parent span; they are buffered and correctly nested regardless of arrival order.
- ›Thread stats requests that opt into streaming now return main stats first and append feedback stats when ready.
- ›Each example's dataset splits now render as chips in the dataset Examples table with a clickable overflow menu.
+5 moreshow less
- ›Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs (existing HTTP routes continue to work for LangSmith UI clients).
- ›Custom code evaluators that time out or fail now record an error on the run instead of silently leaving it without feedback.
- ›When a runs query times out, the runs table now shows a timeout banner.
- ›LangSmith now preserves traces in multipart ingestion batches when one run has oversized inputs or outputs, replacing oversized fields with a placeholder instead of rejecting the entire batch.
- ›Returns clearer 409 Conflict messages when duplicate run create or update payloads are submitted, indicating whether the duplicate was a create or update request.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; code using those SDK methods must migrate to
POST /v2/datasets/{dataset_id}/experiment-runs. - !Bulk export compression defaults changed from
gziptozstdon cloud deployments; setFF_BULK_EXPORT_DEFAULT_COMPRESSIONto retaingzipon self-hosted environments. - !The batched-run ingestion log now emits
run_verbsas a list ofrun_idandverbsobjects instead of a map keyed by run UUID; structured-log aggregators parsing the old map format will need to be updated.
- ›Bulk export compression now defaults to zstandard (
- snapshot-20260820
LangSmith adds bulk split management, thread evaluator testing via API, zstd export compression, project-scoped trace limits, and OpenTelemetry metadata namespacing.
└──▷ TRY ITTest a multi-turn thread evaluator against a real conversation before saving it, to verify it grades correctly on live thread data.$ curl -X POST 'https://<langsmith-host>/runs/rules/validate' \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <your-api-key>' \ -d '{"test_thread_id": "<thread-uuid>", "session_id": "<session-uuid>"}'
Attach user ID and environment metadata to every trace without changing how your tracer emits spans, by setting OpenTelemetry resource attributes at process start.$ export OTEL_RESOURCE_ATTRIBUTES="user.id=u_123,deployment.environment=production" python my_agent.pyKeep gzip compression for bulk exports on a self-hosted deployment after the default changes to zstd.$ FF_BULK_EXPORT_DEFAULT_COMPRESSION=gzip docker compose up- ›Adds
POST /v2/datasets/{dataset_id}/experiment-runsas the supported public API for paginated experiment comparison. - ›The
/runs/rules/validateendpoint now acceptstest_thread_idandsession_idparameters to test multi-turn thread evaluators against a real conversation before saving. - ›Adds
FF_BULK_EXPORT_DEFAULT_COMPRESSIONenvironment variable so self-hosted deployments can retaingzipwhen bulk export compression defaults tozstd. - ›OpenTelemetry resource attributes set via
OTEL_RESOURCE_ATTRIBUTESnow appear on traces as metadata namespaced underotel.resource.*, enabling user ID and other context attachment without tracer changes. - ›LangSmith now enforces user-defined monthly trace limits scoped to individual projects and users, rejecting new traces over the limit while allowing patches and feedback on already-accepted traces.
+13 moreshow less
- ›Bulk export compression now defaults to zstandard (
zstd) for improved performance. - ›Adds a reorderable 'Splits (latest)' column to experiment comparison views, showing each example's live dataset split assignments as chips.
- ›Enables bulk split management in experiment views: select multiple rows (or all rows matching current filters) and add, replace, or remove dataset splits, or copy selected examples to another dataset, in one action.
- ›Each split chip in experiment results and comparison view rows now exposes an 'Edit splits' action opening the single-example split picker inline.
- ›LangSmith MCP tools that fetch runs or thread history now accept project UUIDs in addition to project names.
- ›Vercel AI SDK traces sent over raw OpenTelemetry now render in the Messages view.
- ›Native OpenTelemetry child spans are buffered and correctly nested when they arrive before an SDK-attributed parent span.
- ›Sharing, viewing, or unsharing any run in a trace now operates on the trace root, making every run in a shared trace publicly viewable via a shared link.
- ›Thread pages now show an explicit ABAC access-control message when trace loading is denied, instead of a generic error.
- ›All time filters in tracing views now query the full retention window instead of falling back to a shorter backend default.
- ›Dataset export now returns a clear 'file is too large to export' error instead of a generic server error when the export exceeds internal size limits.
- ›The thread evaluator config now shows a locked 'Trace count >= 2' filter for managed thread evaluators, making eligibility criteria explicit.
- ›Experiment statistics now refresh promptly for recently run experiments while keeping historical experiment scans bounded.
└──▷ BREAKING ON UPGRADE- !Legacy dataset comparison helpers are removed from the public OpenAPI spec and generated SDKs; existing HTTP routes continue to work for LangSmith UI clients only.
- ›Adds