-
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 the Standalone Server 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.
- Polly provides an AI assistant embedded in your LangSmith workspace to help you analyze traces, threads, prompts, and experiment results.
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 Polly
Fleet, Insights, and Polly require LangSmith Deployment to be enabled first.agentBootstrap component and a Fernet encryption key for each feature. You can enable all three features in a single Helm configuration.
Components
Enabling these features provisions the following components in your cluster:agentBootstrap: Job that deploys the LangSmith Deployment agent required by Fleet, Insights, and Polly.agentBuilder: The Fleet agent, consisting of:toolServer: Provides MCP tool execution for agents.triggerServer: Handles webhooks and scheduled triggers.agent: The main agent where all Fleet assistants are created.
insightsAgent: The main agent that handles Insights generation.polly(agent): The main agent that powers Polly across LangSmith (observability, threads, prompt playground, experiments).
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.agentBuilderToolServer and agentBuilderTriggerServer are required for Fleet.(Optional) Configure for Istio Gateway
langsmith_config.yaml before upgrading:Apply the changes
agentBootstrap Job completed successfully. Unlike Deployments, a failed Job produces no running pods and fails silently:agentBootstrap Job should show 1/1 in the COMPLETIONS column. If it shows 0/1, inspect the Job logs (replace <release-name> with your Helm release name, typically langsmith):(Optional) Enable OAuth tools and triggers for Fleet
To enable OAuth-based tools such as Gmail, Slack, or Linear in Fleet, configure theoauthProviderOrgId and add provider IDs for each integration you want to use. You can enable any combination of providers.
Available providers
| Provider | Tools enabled | Trigger enabled |
|---|---|---|
googleOAuthProvidersetup guide | Gmail, Google Calendar, Google Sheets, BigQuery | Gmail |
linearOAuthProvidersetup guide | Linear | - |
linkedinOAuthProvidersetup guide | - | |
microsoftOAuthProvidersetup guide | Outlook, Calendar, Teams, SharePoint, Word, Excel, PowerPoint | Outlook |
slackOAuthProvidersetup guide | Slack | Slack |
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>
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: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: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
Slack OAuth provider
Slack OAuth provider
Create a Slack app
Add scopes
channels:historychannels:readchat:writegroups:historygroups:readim:historyim:readim:writempim:historyteam:readusers:readusers:read.email
Copy credentials from Slack
Configure OAuth provider in LangSmith
- Client ID: from Slack app
- Client Secret: from Slack app
- Authorization URL:
https://slack.com/oauth/v2/authorize - Token URL:
https://slack.com/api/oauth.v2.access - Provider ID: Unique string, for example:
slack
Add redirect URI to Slack
<hostname> with your LangSmith hostname and <provider-id> with your provider ID (for example, slack):Get the bot ID
- Get the bot token from OAuth & Permissions in your Slack app.
- Run the following command:
- Copy the
bot_idfrom the response.
Apply the changes
Enable event subscriptions
- After deployment, go to Event Subscriptions in your Slack app and enable events.
-
Set the Request URL to:
The UUID is a fixed LangSmith identifier — do not replace it.
-
Add the following bot events:
message.channelsmessage.groupsmessage.immessage.mpim
(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
| Value | Where to find it | Environment variable |
|---|---|---|
| App ID | Numeric, at the top of the page | FLEET_GITHUB_APP_ID |
| Public link | For example, https://github.com/apps/acme-langsmith-fleet | FLEET_GITHUB_APP_PUBLIC_LINK |
| App slug | Last path segment of the public link | FLEET_GITHUB_APP_SLUG |
| Client ID | Under About | FLEET_GITHUB_APP_CLIENT_ID |
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 Polly, set the corresponding flags tofalse in your langsmith_config.yaml:
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.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.
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: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>:
