Skip to content

openhands values

Every value of chart openhands 0.10.0, read from values.yaml and values.schema.json. A map is listed with its keys; a map without a description of its own is listed by its keys only. Every value has a default: the chart installs with none given.

Value Type Default Description
team string "" Team of the tenant the app serves: the chart puts every object into <tenant>-<team>, a namespace the team already has. Empty: the release namespace
tenant string "" Tenant the app belongs to; required with team
image.repository string ghcr.io/openhands/agent-canvas upstream all-in-one image (frontend, agent-server, automation); used as is when build.enabled is false, else the base of the build
image.tag string 1.33.0
image.pullPolicy string IfNotPresent One of: Always, IfNotPresent, Never.
build.enabled boolean true build the image with the toolset below in the project
build.toolsImage string "" image whose /usr/local/bin binaries, /usr/local/go, /tools, /opt/sonar-scanner and Ansible collections are copied in, for example an opencode-agent image. Empty: only the Debian packages and the tools below
build.pullSecret string "" pull secret for toolsImage and the base image; empty: the builder's own
build.tools array [{"kind": "uv", "command": "mkdocs", "args": "mkdocs==1.6.1 --with mkdocs-mat... Python (uv), npm and pip tools; keep: true leaves the base image's own command in place (agent-canvas starts its automation server with its uvicorn). venv: pip in /opt/venv/<command>; tarball: args "<url> <sha256>", the member <command>
build.output object ImageStreamTag: push to an ImageStream in the project. DockerImage: push to output.name with output.pushSecret
build.output.kind string ImageStreamTag One of: ImageStreamTag, DockerImage.
build.output.name string ""
build.output.pushSecret string ""
build.nodeSelector object {} node labels for the build pod
build.resources.requests.cpu string 100m
build.resources.requests.memory string 256Mi
build.resources.limits.memory string 6Gi
route.host string "" empty: OpenShift assigns a host under the default application domain
route.labels object {} extra labels on the Route only, for example to pick a router shard
route.timeout string 3600s the UI holds long-lived WebSockets; the router must not cut idle streams
route.annotations object used when a host is set; certificate issued by cert-manager
route.annotations.cert-manager.io/issuer-kind string ClusterIssuer
route.annotations.cert-manager.io/issuer-name string letsencrypt
oauth.ownerEmail string "" OpenShift user name (an email) of the only person admitted. Empty: allowedGroups
oauth.allowedGroups array [] OpenShift groups admitted (with ownerEmail: the owner must be in one). Both empty: everyone who may edit the project
oauth.loginClusterRole string "" ClusterRole holding the verb login on services/proxy that allowedGroups are bound to. Empty: the chart's own Role, which only an installer holding that verb (a cluster admin) can create
secrets.type string kubernetes kubernetes: Secrets from the values below. externalSecret: from a secret store One of: kubernetes, externalSecret.
secrets.sessionApiKey string "" agent-server API key the browser enters once. Empty: generated once
secrets.secretKey string "" settings encryption key. Empty: generated once
secrets.cookieSecret string "" oauth-proxy cookie secret. Empty: generated once. A value that is not 16, 24 or 32 characters long is hashed to 32
secrets.gitToken string "" access token for git.host, also used by glab; glab merge requests need scope api
secrets.externalSecret.storeKind string ClusterSecretStore
secrets.externalSecret.storeName string ""
secrets.externalSecret.refreshInterval string 1h
secrets.externalSecret.items object one vault item per secret, value from the item's password. Empty name: <release>-<secret>
secrets.externalSecret.items.sessionApiKey string ""
secrets.externalSecret.items.secretKey string ""
secrets.externalSecret.items.cookieSecret string ""
secrets.externalSecret.items.gitToken string ""
git.host string "" Git host (no scheme) the token is sent to; empty: no token configured
git.uiSecretName string GITLAB_TOKEN secrets store name the UI reads to offer its git provider features (GITLAB_TOKEN, GITHUB_TOKEN, BITBUCKET_TOKEN or FORGEJO_TOKEN); empty: not written
git.userName string "" commit identity
git.userEmail string ""
gateway.upstream string "" model and MCP gateway the token proxy forwards to, for example https://api.example.com
gateway.audience string "" audience of the agent's ServiceAccount token. Empty: the host of upstream
llm.model string "" default model, in LiteLLM form, for example openai/<model> for an OpenAI-compatible gateway. Empty: chosen in the UI. Written into the settings when the pod starts after this value changed
llm.models array [] further models of the gateway offered under Settings > LLM, same form as model
llm.gatewayModels boolean true true: also a profile for every model the gateway lists at /v1/models, added at each pod start; profiles that exist are left as they are
llm.connection object provider connection to gateway.upstream listed under Settings > LLM, holding llm.model and llm.models as profiles. Empty name: no connection
llm.connection.name string Gateway
llm.connection.provider string openai LiteLLM provider of the gateway's API
mcpServers array [] MCP servers reached through the token proxy: {name, path, timeout, enabled, icon} with path on gateway.upstream, timeout in seconds (default 60), enabled (default true) and icon an image URL for its card, for example {name: public, path: /mcp/public}. Written like llm.model. The agent-server lists all enabled servers within 30 s together: one slow server leaves the agent without any MCP tools
agentSecrets object {} environment of the ACP agents the UI offers (Claude Code, Codex, Gemini CLI), written into the agent-server secrets store like llm.model; name: value. Point the base URLs at the token proxy (http://127.0.0.1:<tokenProxy.port>/...) to use gateway.upstream. Not for real credentials: the values sit in the pod spec
skills.marketplaces array [] skill marketplaces the agent loads, in Claude Code or OpenHands plugin format: {name, source, ref, repoPath, autoLoad} with source github:<owner>/<repo>, a git URL or a local path, and autoLoad true (all plugins, default) or a list of plugin names. Written like llm.model; replaces the marketplaces registered in the UI
agentProfiles object {} ACP agent profiles offered under "Switch agent profile": name: {acp_server, acp_model}, acp_server one of claude-code, codex, gemini-cli, ...; written like llm.model
mcp object MCP servers from the kagent RemoteMCPServers of every Project the ServiceAccount may list them in, kept in step every interval: a URL on gateway.upstream goes through the token proxy; one that needs headers from a Secret is skipped. A RemoteMCPServer annotated openhands.dev/auth: oauth2 is an OAuth server each user logs in to in the UI; see README. Entries the user added in the UI are left alone
mcp.enabled boolean true
mcp.interval integer 60 seconds between two passes
mcp.labelSelector string "" only RemoteMCPServers with these labels, for example key=value. Empty: all
mcp.labelDomain string mcp.openshift.eu prefix of the selection labels <labelDomain>/addon, /bundle and /server. A RemoteMCPServer labelled <labelDomain>/addon: "true" is an add-on, used only when its bundle is in bundles or its server name (label, else object name) in servers
mcp.bundles array [] add-on bundles to use, for example [google]
mcp.servers array [] add-on servers to use, for example [gmail]
mcp.clusterRole string kagent-remotemcpserver-view ClusterRole, installed with kagent, that reads RemoteMCPServers; bound in the release namespace. Empty: no binding (the ServiceAccount's edit role may cover it)
mcp.resources.requests.cpu string 5m
mcp.resources.requests.memory string 32Mi
mcp.resources.limits.memory string 96Mi
mcpDiscovery object {} deprecated former name of mcp, still read in this version: its keys override mcp
mcpPublish object Remote MCP servers a user adds in the UI become AgentgatewayBackends of the namespace, so the platform publishes them to the whole team. OAuth and in-pod servers stay personal. The ServiceAccount's edit role must cover AgentgatewayBackends
mcpPublish.enabled boolean true
mcpPublish.resync integer 600 seconds between two passes that also compare the stored credentials and retry refused servers
a2a object A2A server for the agent: other agents and kagent chat with it. The instance is one agent (a conversation per A2A context); every titled conversation is also a sub-agent "<release>/<title>" at /agents/<slug>/
a2a.enabled boolean true
a2a.port integer 8090 container port of the shim inside the pod
a2a.description string "" description on the agent card and in kagent
a2a.staticTokenSecret string "" Secret with key token, a static bearer credential besides the tenant JWTs. Empty: none
a2a.tenantAuth object admit bearer JWTs of the tenant: ServiceAccount tokens from a namespace <tenant> or <tenant>-, OIDC tokens whose groups claim holds <tenant> or <tenant>-
a2a.tenantAuth.enabled boolean true
a2a.tenantAuth.tenant string "" empty: the release namespace up to its first "-"
a2a.tenantAuth.kubernetesIssuer string https://kubernetes.default.svc the cluster's ServiceAccount token issuer; empty: none
a2a.tenantAuth.oidcIssuers array [] OIDC issuers, for example https://login.example/realms/<realm>
a2a.resources.requests.cpu string 10m
a2a.resources.requests.memory string 96Mi
a2a.resources.limits.memory string 256Mi
a2a.kagent object register the agent in kagent (BYO Agent named like the release) when kagent is installed
a2a.kagent.enabled boolean true
a2a.kagent.resources object the relay pod kagent runs in front of the shim
a2a.kagent.resources.requests.cpu string 5m
a2a.kagent.resources.requests.memory string 32Mi
a2a.kagent.resources.limits.memory string 96Mi
mcpOAuth object MCP servers added in the UI that log in with OAuth return to https://<route.host>/mcp-oauth/callback instead of localhost, which a hosted agent's browser cannot reach; needs build.enabled and route.host. One login runs at a time
mcpOAuth.callbackPort integer 18765 loopback port of the agent-server's callback listener; 0: upstream localhost redirect
kubernetesMcpServer.enabled boolean false local stdio MCP server "kubernetes" with the pod's ServiceAccount; needs /tools/kubernetes-mcp-server, which build.toolsImage provides
kubernetesMcpServer.deniedResources array [{"group": "", "version": "v1", "kind": "Secret"}] kinds the server refuses to read or write
env object {} extra environment for the agent-canvas container (name: value)
resources.requests.cpu string 250m
resources.requests.memory string 2Gi
resources.limits.cpu string 4
resources.limits.memory string 16Gi
oauthProxy.image string image-registry.openshift-image-registry.svc:5000/openshift/oauth-proxy:v4.4 OpenShift oauth-proxy in front of the UI; the cluster keeps this tag current
oauthProxy.port integer 4180
oauthProxy.resources.requests.cpu string 10m
oauthProxy.resources.requests.memory string 32Mi
oauthProxy.resources.limits.memory string 256Mi
tokenProxy.image string registry.access.redhat.com/ubi9/python-312-minimal image that runs the token proxy script
tokenProxy.port integer 8099 loopback port the agent sends model and MCP calls to
tokenProxy.agentToken object calls under paths carry the agent's own OpenID Connect token instead of the ServiceAccount token: a client_credentials grant at tokenUrl, authenticated with a ServiceAccount token for audience (federated client authentication). Empty: off
tokenProxy.agentToken.tokenUrl string ""
tokenProxy.agentToken.audience string "" usually the realm's issuer URL
tokenProxy.agentToken.paths array ["/mcp"]
tokenProxy.resources.requests.cpu string 10m
tokenProxy.resources.requests.memory string 32Mi
tokenProxy.resources.limits.memory string 256Mi
serviceAccount.labels object {} labels on the agent's ServiceAccount, for example the one a platform uses to register it as an OpenID Connect client
nodeSelector object {}
affinity object {}
storage.size string 20Gi the whole home: settings, conversations, workspace, logins and caches
storage.accessMode string ReadWriteOnce One of: ReadWriteOnce, ReadWriteMany.
storage.className string "" empty: the default storage class