-
LangSmith Deployment adds a control plane and data plane that let you deploy, scale, and manage agents and applications directly through the LangSmith UI.
If you don’t need the full UI-based setup, see standalone servers for a lightweight alternative.
- Fleet allows you to create, deploy, and manage AI agents directly within LangSmith with no code.
- Insights provides AI-powered analysis of your traces and application data within LangSmith.
- Chat provides an in-workspace chat experience to help you analyze traces, threads, prompts, and experiment results.
- Sandboxes let users run code, expose temporary services, and create memory snapshots from LangSmith.
- Engine finds recurring issues in a tracing project, diagnoses them against your source code, and proposes fixes. Engine requires Sandboxes.
Prerequisites
Install the base LangSmith platform
Install KEDA
KEDA on your cluster:Configure an ingress
hostname in your langsmith_config.yaml.Verify cluster capacity
Verify storage
PROVISIONER value (not kubernetes.io/no-provisioner) and be marked (default), or you must configure one before proceeding.Verify egress
https://beacon.langchain.com is available. See the egress documentation.Enable LangSmith Deployment
Components
Enabling LangSmith Deployment provisions the following resources in your cluster:listener: Listens to the control plane for changes to your deployments and creates or updates downstream CRDs.LangGraphPlatform CRD: Manages instances of LangSmith Deployment.operator: Handles changes to your LangSmith CRDs.host-backend: The control plane.
Enable the feature
To enable LangSmith Deployment, update yourlangsmith_config.yaml:
Enable deployment in your config
langsmith_config.yaml, enable the deployment option. You must also have a valid ingress configured.langgraphPlatform option is deprecated. Use config.deployment for any version after v0.12.0.(Optional) Configure image mirroring
hostBackendImage and operatorImage options in your langsmith_config.yaml. Use the image tags specified in the latest LangSmith Helm chart release.(Optional) Configure base agent templates
values.yaml if you need to customize how the operator creates agent Kubernetes resources. The most common use case is adding imagePullSecrets to authenticate with a private container registry. See Configure authentication for private registries for details.Apply the changes
<version> and <namespace> with your values:Enable Fleet, Insights, and Chat
Components
Enabling these features provisions the following components in your cluster for each feature (Fleet, Insights, Chat):api-server: The main API server that handles requests for the feature.queue: Background task processing queue.postgres: Dedicated PostgreSQL instance for the feature’s data. Can be replaced with an external PostgreSQL instance.redis: Dedicated Redis instance for the feature’s caching and pub/sub. Can be replaced with an external Redis instance.
toolServer: Provides MCP tool execution for agents.triggerServer: Handles webhooks and scheduled triggers.
Generate encryption keys
Each feature uses its own Fernet encryption key to encrypt feature-specific secrets such as credentials and tokens. Separate keys allow independent rotation and limit exposure if a key is compromised. Generate one key per feature using Python:agent_builder_encryption_key, insights_encryption_key, and polly_encryption_key.
Enable features
Add the configuration to your langsmith_config.yaml
- Using Kubernetes secrets (recommended)
- Using inline values
agent_builder_encryption_key, insights_encryption_key, and polly_encryption_key from it automatically.fleetToolServer and fleetTriggerServer are required for Fleet. These replaced the deprecated agentBuilderToolServer and agentBuilderTriggerServer keys as of v15 of the Helm chart.postgres.external and redis.external sections under each feature. For example:Apply the changes
(Optional) Enable OAuth tools and triggers for Fleet
To enable OAuth-based tools such as Gmail, Slack, or Linear in Fleet, configure theproviderOrgId and add provider IDs for each integration you want to use. You can enable any combination of providers.
Available providers
General configuration
Add the following to yourlangsmith_config.yaml. Include only the providers you need.
Provider setup guides
Google OAuth provider
Google OAuth provider
Create OAuth client in GCP
Add URLs to GCP
<hostname> with your LangSmith hostname and <provider-id> with the provider ID you’ll use (for example, google):Authorized JavaScript origins:https://<hostname>
https://<hostname>/api-host/v2/auth/callback/<provider-id>https://<hostname>/host-oauth-callback/<provider-id>
Copy credentials
Configure OAuth provider in LangSmith
- Client ID: from GCP
- Client Secret: from GCP
- Authorization URL:
https://accounts.google.com/o/oauth2/auth - Token URL:
https://oauth2.googleapis.com/token - Provider ID: Unique string, for example:
google
Apply the changes
Microsoft OAuth provider
Microsoft OAuth provider
Create an Azure app registration
Choose supported account types
Add the redirect URI
<hostname> with your LangSmith hostname and <provider-id> with your provider ID:Create a client secret
Add Microsoft Graph delegated permissions
Mail.ReadWriteMail.SendCalendars.ReadWriteTeam.ReadBasic.AllChannel.ReadBasic.AllChannel.CreateChannelMessage.SendChannelMessage.Read.AllChat.CreateChat.ReadWriteUser.ReadBasic.AllFiles.ReadWrite.AllSites.ReadWrite.All
offline_access for Microsoft providers so users can receive refresh tokens.Grant tenant consent
Configure OAuth provider in LangSmith
- Name: For example,
Microsoft - Provider ID: Unique string, for example:
microsoft-oauth-provider - Client ID: Application (client) ID from Azure
- Client Secret: Client secret value from Azure
- Authorization URL:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize - Token URL:
https://login.microsoftonline.com/common/oauth2/v2.0/token - Provider Type:
microsoft - Token endpoint auth method:
client_secret_post
common in the authorization and token URLs with your tenant ID.Apply the changes
Linear OAuth provider
Linear OAuth provider
Create a Linear OAuth app
Add callback URL
<hostname> with your LangSmith hostname and <provider-id> with your provider ID:Copy credentials
Configure OAuth provider in LangSmith
- Client ID: from Linear app
- Client Secret: from Linear app
- Authorization URL:
https://linear.app/oauth/authorize - Token URL:
https://api.linear.app/oauth/token - Provider ID: Unique string, for example:
linear
Apply the changes
LinkedIn OAuth provider
LinkedIn OAuth provider
Create a LinkedIn OAuth app
Add redirect URI
<hostname> with your LangSmith hostname and <provider-id> with your provider ID:Copy credentials
Configure OAuth provider in LangSmith
- Client ID: from LinkedIn app
- Client Secret: from LinkedIn app
- Authorization URL:
https://www.linkedin.com/oauth/v2/authorization - Token URL:
https://www.linkedin.com/oauth/v2/accessToken - Provider ID: Unique string, for example:
linkedin
Apply the changes
Salesforce OAuth provider
Salesforce OAuth provider
Create an External Client App
- External Client App Name: for example,
LangSmith Fleet - Contact Email: an admin email address
- Distribution State: Local
Enable OAuth and configure the OAuth settings
- Callback URL, replacing
<hostname>with your LangSmith hostname and<provider-id>with your provider ID:
- Selected OAuth Scopes: add Manage user data via APIs (api) and Perform requests at any time (refresh_token, offline_access).
- Keep Require Secret for the Web Server Flow selected.
- Leave Enable Authorization Code and Credentials Flow and Enable Client Credentials Flow unselected. Fleet uses the standard web server (authorization code) flow.
Set the OAuth policies
- Refresh Token Policy: select Refresh token is valid until revoked.
- Permitted Users: leave All users may self-authorize. If you choose Admin approved users are pre-authorized instead, you must first assign the app to a permission set or profile, or authorization fails.
Copy the credentials
Configure OAuth provider in LangSmith
- Provider ID: Unique string, for example:
salesforce-oauth-provider. Use this same value forsalesforceOAuthProviderin the next step. - Display Name: For example,
Salesforce - Client ID: Consumer Key from Salesforce
- Client Secret: Consumer Secret from Salesforce
- Authorization URL:
https://<MyDomain>.my.salesforce.com/services/oauth2/authorize - Token URL:
https://<MyDomain>.my.salesforce.com/services/oauth2/token
<MyDomain> with your org’s My Domain, found under Setup > My Domain. For a sandbox, use https://<MyDomain>--<SandboxName>.sandbox.my.salesforce.com/services/oauth2/authorize and the matching token URL.Apply the changes
Slack OAuth provider
Slack OAuth provider
(Optional) Enable GitHub App for Fleet
Fleet integrates with GitHub through a dedicated GitHub App (not an OAuth app). The GitHub App provides repository access for Fleet’s GitHub tools and supports the user authorization flow required for private repository access. Setup involves creating a GitHub App, gathering its credentials, storing them as Kubernetes secrets, and referencing them from yourlangsmith_config.yaml.
Create a GitHub App
Fill in basic details
- GitHub App name: Any unique name, for example
acme-langsmith-fleet. Make a note of the slug GitHub generates (the lowercased, hyphenated form of the name), as this is the value you’ll use forFLEET_GITHUB_APP_SLUG. - Homepage URL: Your LangSmith hostname, for example
https://langsmith.acme.com. - Deselect Active under Webhook for now. You’ll enable it in a later step after generating a webhook secret.
Set callback URLs
<hostname> with your LangSmith hostname:Set webhook URL and generate a webhook secret
- Select Active.
-
Set the Webhook URL to:
- Paste the generated value into Webhook secret. Save it, as you’ll need the same value when creating the Kubernetes secret in a later step.
Set repository permissions
- Contents: Read and write
- Issues: Read and write
- Pull requests: Read and write
- Metadata: Read-only (automatically selected)
Choose install visibility
Create the app
Generate a client secret
FLEET_GITHUB_APP_CLIENT_SECRET. GitHub only shows it once.Generate a private key
.pem file. Keep this file secure, as it grants full access to the GitHub App. The PEM contents are FLEET_GITHUB_APP_PRIVATE_KEY.Generate a state JWT secret
FLEET_GITHUB_APP_STATE_JWT_SECRET.Create a Kubernetes secret
Add the configuration to your langsmith_config.yaml
FLEET_GITHUB_APP_ENABLED must be set on the tool server so the GitHub tools are registered. The remaining FLEET_GITHUB_APP_* variables are consumed by the platform backend and live under commonEnv.Deploy and install the app on repositories
- In LangSmith, open a Fleet agent and go to the GitHub integration in the agent editor.
- Click Connect GitHub to install the app on the repositories Fleet should access.
- For private repositories, you must explicitly select each repository during installation.
Disable features
To disable any combination of Fleet, Insights, and Chat, set the corresponding flags tofalse in your langsmith_config.yaml:
Enable Sandboxes
0.16.0 or later.Supported platforms
Self-hosted Sandboxes are supported on:- Amazon Elastic Kubernetes Service (EKS)
- Google Kubernetes Engine (GKE)
Components
Enabling Sandboxes provisions the following resources:- Sandbox runtime pods that run sandbox workloads on KVM-capable nodes.
- The JuiceFS CSI driver and a JuiceFS-backed volume for sandbox files and snapshots.
- A JuiceFS metadata store backed by Redis and object storage backed by S3 or GCS.
- Optional wildcard ingress for services exposed from inside Sandboxes.
Prerequisites
Install the base LangSmith platform
Add KVM-capable nodes
/dev/kvm.These can be bare-metal machines or supported cloud instances with nested virtualization enabled. On AWS and GCP, use x86_64 Linux instances that expose /dev/kvm to the sandbox runtime.The default Helm scheduling values expect these nodes to have the following label and taint:sandboxes.sandboxHost.deployment.nodeSelector and sandboxes.sandboxHost.deployment.tolerations.Configure JuiceFS storage
- A Redis-compatible metadata store.
- An object storage bucket or bucket root.
- A JuiceFS CSI configuration Secret, or enough Helm values for the chart to create one.
sandboxes.juicefs.name. Use a flat name, such as sandbox-juicefs. JuiceFS stores objects under that name inside the configured bucket.Configure sandbox secrets
- Using Kubernetes secrets (recommended)
- Using inline values
config.existingSecretName, add the sandbox keys to the same LangSmith app Secret. Do not set the secret values directly in Helm.Choose a proxy CA mode
existingSecret. The generatedSecret mode uses Helm’s live lookup behavior to reuse the generated Secret on upgrades; pure render workflows cannot read the live Secret and may produce new cert material on each render.Enable with Helm
Add the following values to yourlangsmith_config.yaml, along with the sandbox secret values described in the Prerequisites. Replace placeholders with your deployment-specific values.
sandboxes.juicefs.csi.existingSecretName and omit sandboxes.juicefs.name, storage, bucket, and redis.metaURL from the Helm values:
Enable with Terraform
The LangSmith Terraform modules can provision the required AWS and GCP infrastructure and generate the corresponding Helm values.AWS
Inmodules/aws/infra/terraform.tfvars, enable Sandboxes and configure the sandbox node capacity:
redis_source = "external". The Terraform module:
- Creates a dedicated ElastiCache Redis instance for JuiceFS sandbox metadata.
- Configures that dedicated instance with the recommended
noevictionpolicy. - Reuses the LangSmith S3 bucket for sandbox object storage.
- Creates the JuiceFS CSI config Secret.
- Adds the expected node label and taint.
modules/aws/app/terraform.tfvars as well:
enable_sandboxes = true, the Terraform app module requires an explicit LangSmith Helm chart version 0.16.0 or later and a sandbox runtime image tag.
Run the normal AWS flow:
GCP
Inmodules/gcp/infra/terraform.tfvars, enable Sandboxes and configure a Standard GKE node pool:
redis_source = "external". The Terraform module:
- Creates a dedicated Memorystore Redis instance for JuiceFS sandbox metadata.
- Configures that dedicated instance with the recommended
noevictionpolicy. - Reuses the LangSmith GCS bucket for sandbox object storage.
- Creates the JuiceFS CSI config Secret.
- Adds the expected node label and taint.
modules/gcp/app/terraform.tfvars as well:
enable_sandboxes = true, the Terraform app module requires an explicit LangSmith Helm chart version 0.16.0 or later and a sandbox runtime image tag.
Run the normal GCP flow:
Optional: enable service URLs
Setsandboxes.serviceUrlBaseUrl when users need browser or programmatic access to HTTP services running inside Sandboxes.
*.sandbox-services.example.com. When ingress.enabled is true, the chart also adds a wildcard ingress rule that routes these service URLs to the LangSmith platform backend.
Verify the installation
After the upgrade completes, verify that the sandbox runtime pods and JuiceFS volumes are ready:- Create a sandbox from a public image, such as a Python image.
- Start a Python HTTP server inside the sandbox.
- Snapshot the sandbox with memory enabled.
- Create a new sandbox from the snapshot.
- Verify that the HTTP server is still running in the restored sandbox.
Upgrade notes
Sandbox runtime image changes roll out through thesandbox-host Kubernetes Deployment. The chart uses a no-surge rolling update strategy by default, so hosts are replaced one at a time.
During a normal Helm upgrade, a terminating host stops accepting new Sandboxes, attempts to save each running Sandbox’s VM memory to JuiceFS, and then stops those VMs before the pod exits. This shutdown is bounded by the sandbox-host pod termination grace period, which defaults to 300 seconds. This is not live migration: Sandboxes on that host are interrupted during the restart.
Sandboxes are not proactively restarted. They start again when a user or API action starts the Sandbox, or when a request path wakes it. LangSmith then places the Sandbox on an available host and restores from the saved memory image if the shutdown capture completed. If the memory image is absent or incomplete, the Sandbox starts from the saved root filesystem.
Enable Engine
0.16.0 or later and a license that includes the Engine entitlement. Contact your account team to have it added to your order.- Sandboxes: Every Engine run executes in one. Enable Sandboxes first. The chart refuses to render when
engine.enabledis set without them. - Insights: Engine and Insights are served by the same image and share one deployment. Insights is not an Engine prerequisite. On an install that already runs Insights, enabling Engine adds configuration rather than new pods.
Components
Enabling Engine provisions or reuses:standalone-insights-api-server: serves both theengineandinsightsgraphs.standalone-insights-queue: background run processing for Engine and Insights.- A dedicated PostgreSQL and Redis instance for the shared deployment, each replaceable with an external instance.
- The sandbox components described under Enable Sandboxes.
platform-backend and ingest-queue, which dispatch and schedule its runs.
Prerequisites
Enable Sandboxes
engine.sandboxTenantId.Confirm the license entitlement
https://beacon.langchain.com at startup and periodically thereafter, so the entitlement takes effect without you changing any configuration once it is added to your order.Allow egress to LangSmith Intelligence
engine.intelligenceBaseUrl below.Verify your hostname is externally reachable
langsmith CLI, so config.hostname must be reachable from the sandbox network. The chart rejects localhost and in-cluster *.svc addresses.Serve that hostname through your ingress with TLS, as described in Set up an ingress. Engine does not require you to expose anything beyond the address your own users already reach. Sandbox egress is allowlisted to your LangSmith hostname, github.com, api.github.com, and the Python package registries. Per-run credentials are injected by a proxy outside the sandbox rather than being readable inside it.Generate the Engine encryption key
engine_encryption_key rather than in your config file. See Use an existing secret.To rotate the key later, copy the current value to engine_encryption_key_previous and set the new key as engine_encryption_key. The previous key is accepted for decryption only, so runs encrypted just before the swap still complete.Enable with Helm
Add the following to yourlangsmith_config.yaml, alongside the Sandboxes values from Enable Sandboxes:
- Using Kubernetes secrets (recommended)
- Using inline values
engine_encryption_key from it automatically.Verify the installation
Confirm the shared Engine and Insights deployment is running:Running. Then confirm platform-backend is healthy, since it dispatches Engine runs:
Turn on Engine in LangSmith
Enabling Engine in Helm makes the feature available; it does not start any scans. Two in-product steps remain, both covered in Find and fix issues:- An Organization Admin turns Engine on for the organization under Settings > Engine enablement.
- Any user sets Engine up for a tracing project from the project’s Engine tab.
host-backend, which the chart does not yet expose as Helm values. Contact technical support through the Support Portal to set it up.
Disable Engine
Setengine.enabled to false and re-apply:
standalone-insights pods keep running when insights.enabled is true.
Optional configuration
Configure additional data planes
In addition to the data plane created above, you can create more data planes in different Kubernetes clusters or in the same cluster under a different namespace. There are different ways to achieve this, so implement the solution that works best for your use case.Prerequisites
Review cluster organization
Verify hybrid prerequisites
https://api.host.langchain.com and https://api.smith.langchain.com.Enable the feature in Postgres
Deploy to a different cluster
Follow the hybrid setup guide
config.langsmithWorkspaceId to the workspace ID from the previous step.(Optional) Add more data planes to the same cluster
Deploy to a different namespace in the same cluster
Update your config
langsmith_config.yaml, make the following modifications:- Set
operator.watchNamespacesto the current namespace your self-hosted LangSmith instance is running in. This prevents conflicts with the operator added by the new data plane. - Use the Gateway API or an Istio Gateway. Adjust your
langsmith_config.yamlaccordingly.
Apply the changes
Follow the hybrid setup guide
config.langsmithWorkspaceId to the workspace ID from the previous step. Set config.watchNamespaces to a different namespace than the one used by the existing data plane.(Optional) Configure log access
Configure authentication for private registries
If your Agent Server deployments will use images from private container registries (for example, AWS ECR, Azure ACR, or GCP Artifact Registry), configure image pull secrets. This configuration applies to all deployments automatically, allowing them to authenticate with your private registry.Create a Kubernetes image pull secret
myregistry.com: Your registry URLyour-username: Your registry usernameyour-password: Your registry password or access tokenlangsmith: The Kubernetes namespace where LangSmith is installed
Configure the deployment template in your langsmith_config.yaml
imagePullSecrets to the operator’s deployment template:Apply the changes
Read Agent Server logs from other namespaces
For deployments where the control plane and data plane are in the same cluster, ensure the control plane Kubernetes deployment (host-backend) has permission to get, list, and watch Kubernetes deployments, pods, replicasets, and logs from the namespace where the Agent Server deployment exists. There are different ways to achieve this. The following example uses Kubernetes RBAC, but use the approach that best fits your use case:
Create a Role with the required permissions
Role in the Agent Server namespace. Replace <data_plane_namespace>:Get the control plane ServiceAccount
<control_plane_namespace>:Bind the Role to the control plane ServiceAccount
<data_plane_namespace>, <control_plane_namespace>, and <control_plane_service_account>:
