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 |