- Infrastructure: Terraform provisions VPC, GKE, Cloud SQL, Memorystore, GCS, and Workload Identity.
- Application: the LangSmith chart, installed with the deploy script or the Terraform
applayer.
Prerequisites
Required tools
| Tool | Version | Purpose |
|---|---|---|
Google Cloud SDK (gcloud) | 450 | Authenticate, query GCP resources, manage GKE credentials |
| Terraform | 1.5 | Run the infrastructure modules |
kubectl | 1.28 | Inspect the GKE cluster |
| Helm | 3.12 | Install and manage the LangSmith chart |
Required GCP APIs
Terraform enables these automatically on first apply, butcloudresourcemanager.googleapis.com must be enabled first so Terraform can enable the rest. Enable everything manually for fast first runs:
Required IAM roles
The principal running Terraform needs the following roles on the target project. Trim to least-privilege after the initial deployment is stable.| Role | Purpose |
|---|---|
roles/container.admin | Create and manage GKE clusters |
roles/compute.networkAdmin | Create VPC, subnets, firewall rules |
roles/iam.serviceAccountAdmin | Create service accounts for Workload Identity |
roles/cloudsql.admin | Create and manage Cloud SQL instances |
roles/redis.admin | Create and manage Memorystore Redis |
roles/storage.admin | Create GCS buckets and lifecycle policies |
roles/resourcemanager.projectIamAdmin | Grant IAM bindings during provisioning |
roles/servicenetworking.networksAdmin | Create private service connections (required for Cloud SQL and Redis) |
Authenticate
Quickstart
For the fastest path from zero to a running LangSmith instance, run these commands in order:Provision infrastructure
Terraform provisions the following GCP resources:| Resource | Purpose |
|---|---|
| VPC + subnet + Cloud NAT | Private network for the cluster and managed services |
| Private service connection | VPC peering for Cloud SQL and Memorystore private IPs |
| GKE cluster (Standard or Autopilot) | Kubernetes compute, Workload Identity enabled |
| Cloud SQL PostgreSQL | LangSmith operational data, HA standby, private IP |
| Memorystore Redis | Queue and cache, STANDARD_HA tier, private IP |
| GCS bucket | Trace payload blob storage, lifecycle rules |
| Workload Identity service account | Per-pod GCP access without static keys |
| cert-manager, KEDA, Envoy Gateway | Bootstrap workloads installed alongside infrastructure |
Clone and configure
modules/gcp/. Run make help for the full target list.
Generate terraform.tfvars with the interactive wizard:
infra/terraform.tfvars. Re-running preselects existing values; press Enter at each prompt to keep the current config.
Prefer to edit manually:
Load secrets into Secret Manager
terraform.tfvars, derives the secret prefix, and for each secret either reuses an exported value, reads the existing Secret Manager secret, auto-generates one (for salts and Fernet keys), or prompts you. The license key and admin password are the two values you supply interactively. The script must be sourced because make cannot export environment variables back to the parent shell.
Verify the secrets are present:
Preflight checks
make preflight validates that the active gcloud credentials can perform each required action, that the required GCP APIs are enabled, and that the target region has the SKUs the modules request. Catching gaps here is faster than discovering them mid-terraform apply.
Apply
Provisioning the GCP cloud foundation takes 25 to 35 minutes on a clean project. Do not interrupt the apply.
make plan shows the proposed diff. Review the output before applying. make apply provisions in dependency order: VPC and networking, then GKE (about 10 to 15 minutes), private service connection, Cloud SQL (about 10 minutes with HA), Memorystore, GCS, and the bootstrap workloads.
Equivalent direct Terraform flow:
Configure kubectl
Ready.
Verify bootstrap components
Deploy LangSmith
Use one of the three supported deployment paths:| Path | Command | When to use |
|---|---|---|
| Script-driven Helm deploy (recommended) | make init-values && make deploy | Interactive output, kubeconfig refresh, preflight checks. Best for first-time deploys and day-2 re-deploys. |
| Terraform-managed Helm release | make init-app && make apply-app | Helm release managed in Terraform state alongside infrastructure. Best for GitOps and CI/CD pipelines. |
| Manual Helm install | helm upgrade --install langsmith langchain/langsmith ... | Direct helm usage without the wrapper scripts. Best for teams with existing Helm tooling. |
Script-driven Helm deploy (recommended)
Two commands install the LangSmith chart with sensible defaults wired from Terraform outputs:init-values.sh prompts for the admin email, then reads sizing_profile and the enable_* flags from terraform.tfvars and copies matching values files from helm/values/examples/ into helm/values/. It also generates values-overrides.yaml with your hostname, Workload Identity annotations, and GCS bucket name.
make deploy runs helm/scripts/deploy.sh, which refreshes the kubeconfig, runs preflight checks, applies the layered values files, and runs helm upgrade --install.
Expect 8 to 12 minutes for the chart to install and pods to become ready.
If you completed the script-driven deploy, skip to Verify and configure DNS. The following two paths are alternatives to the script-driven deploy.
Terraform-managed Helm release
Keep the entire deployment under Terraform. Theapp layer wraps the same chart and layered values files as the deploy script, managed as a helm_release resource.
app/terraform.tfvars (admin_email is required; hostname, chart_version, sizing, and the enable_* flags are optional). The app layer uses its own variable names: sizing (not sizing_profile) and enable_agent_deploys (not enable_deployments). make init-app populates the infra-derived inputs (cluster, bucket, Workload Identity annotation) into app/infra.auto.tfvars.json.
The release is applied with wait = false because operator-spawned agents can take 10+ minutes on a cold cluster; a passing terraform apply means the release was accepted, not that every pod is ready.
If you completed the Terraform-managed Helm release, skip to Verify and configure DNS. The following path is an alternative.
Manual Helm install
Best for teams runninghelm directly without the scripts. Generate the required secrets first:
helm/values/values.yaml sets config.blobStorage.engine: GCS (native GCS mode), so blob storage authenticates through Workload Identity with no HMAC keys. The per-component Workload Identity annotations live in values-overrides.yaml; generate it with make init-values, or add each component’s serviceAccount.annotations."iam.gke.io/gcp-service-account" by hand.
To use S3-compatible blob storage instead of Workload Identity, add
--set config.blobStorage.engine=S3 and pass HMAC keys with --set config.blobStorage.accessKey=<key> and --set config.blobStorage.accessKeySecret=<secret>. Create the HMAC key under Cloud Storage → Settings → Interoperability.Verify and configure DNS
Sizing profiles
Setsizing_profile in terraform.tfvars, then re-run make init-values && make deploy.
| Profile | When to use |
|---|---|
default | Chart defaults, no overlay applied |
minimum | Absolute floor, fits e2-standard-4. Cost parking or CI smoke tests |
dev | Single replica, minimal resources |
production | Multi-replica with HPA. Recommended for real workloads |
production-large | High memory, high CPU. 50+ users or 1000+ traces/sec |
Expected pods
Enable add-ons
Each add-on is gated by a flag ininfra/terraform.tfvars. Set the flag, re-apply Terraform, then re-run make init-values && make deploy.
LangSmith Deployment
Addshost-backend, listener, and operator. Required before enabling Agent Builder or Insights. KEDA is installed automatically when enable_langsmith_deployment = true.
Fleet
Fleet is the current form of the feature formerly called Agent Builder, deployed as a standalone service (chart v0.15+).
enable_fleet. Unlike the deprecated enable_agent_builder path, it does not require LangSmith Deployment. Terraform provisions a dedicated fleet database on Cloud SQL and wires the langsmith-fleet-postgres and langsmith-fleet-redis secrets to the existing Cloud SQL and Memorystore instances. Fleet reuses langsmith_agent_builder_encryption_key, so migrating from enable_agent_builder keeps the same key and data.
Fleet requires the LangSmith Helm chart
>=0.15.0 and the Agent Builder or Fleet entitlement in your license.Agent Builder (deprecated)
On GCP,
enable_agent_builder is deprecated in favor of Fleet (enable_fleet, chart v0.15+). Use Fleet for new deployments. This section documents the older path for existing installs.agent-builder-tool-server, agent-builder-trigger-server, and an agentBootstrap Job that registers the Polly agent URL.
agentBootstrap completes so it picks up the langsmith-polly-config ConfigMap:
Insights and Polly
Prerequisite: Agent Builder healthy. Insights enables ClickHouse-backed trace analytics. Polly is the AI eval and monitoring agent. Enable both together.Expected pods by add-on
LangSmith Deployment adds:langsmith-host-backend, langsmith-listener, langsmith-operator.
Fleet adds: standalone-fleet-api-server, standalone-fleet-tool-server, standalone-fleet-trigger-server, standalone-fleet-queue.
Agent Builder adds: langsmith-agent-builder-tool-server, langsmith-agent-builder-trigger-server, langsmith-agent-builder-bootstrap (Completed), agent-builder-<hash> (operator-spawned).
Insights and Polly add: clio-<hash> (Insights analytics), smith-polly-<hash> (Polly agent), lg-<hash>-0 (LangGraph StatefulSet).
Key watchouts
config.deployment.urlmust includehttps://. Without it, operator-spawned agents stay stuck inDEPLOYING.config.deployment.enabled: trueis required for LangSmith Deployment. Setting only the URL withoutenabled: truecauses the chart to silently skiplistenerandoperator.- Encryption keys must never change after first enable. Rotating
insights_encryption_keyorpolly_encryption_keypermanently breaks existing encrypted data. - Roll the frontend after first Polly enable.
agentBootstrapcreates thelangsmith-polly-configConfigMap after registering. Frontend pods started before bootstrap completes do not pick it up automatically. - Envoy Gateway IP changes on teardown. GCP releases the external IP when the Gateway is deleted. After a re-apply, a new IP is issued, so update your DNS A record.
langsmith-ksaannotation is not permanent. The operator createslangsmith-ksaat runtime; it does not survive namespace deletion.deploy.shre-annotates it idempotently. Re-runmake deployif operator pods lose GCS access after a cluster rebuild.
Next steps
- Reference the GCP variables and the quick reference.
- Review the GCP architecture for module structure, traffic flow, and Workload Identity.
- When something breaks, check the GCP troubleshooting guide.
- Enable agent deployment in the UI with LangSmith Deployment.
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

