For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
Upgrade from 0.x
Move an existing kagent 0.10.x installation to 1.0 by standing up a new installation and recreating your resources on it.
kagent 1.0 has no in-place upgrade path from the 0.10.x line. Moving to 1.0 means installing kagent fresh against a new database, and recreating your resources on it. When your installation runs 1.0, you can perform regular in-place upgrades for later minor releases. To review upgrade paths and versions, see Version support. For a summary of what 1.0 changes before you plan the move, see Release notes.
In-place upgrade blockers
Three independent changes each rule out helm upgrade, so working around any one of them does not help.
| Change | Consequence |
|---|---|
| The database schema is a clean baseline | 1.0 replaces golang-migrate with goose and starts from a single baseline migration. An existing 0.10.x database has no bridge to it, and 1.0 refuses to run against one. |
| The custom resources serve one API version | The 1.0 CRDs serve v1alpha3 alone and declare no conversion strategy, so objects stored as v1alpha2 cannot be read through them. |
| The resource model is replaced | The Agent resource is gone. What it described is now split between an AgentTemplate and a HarnessHarnessA Kubernetes custom resource defining how an agent is allowed to run: its runtime, workload image, WorkerPool and snapshot storage, and which AgentTemplates it accepts.Learn more, and a conversation is an AgentInstanceAgentInstanceA running, conversational pairing of a Harness and an AgentTemplate. Unlike the two, it is not a Kubernetes resource: kagent's gRPC API creates it and its database tracks it.Learn more created from that pair. For the model itself, see Core concepts. |
The two releases also cannot run side by side on one cluster. modelconfigs.kagent.dev, modelproviderconfigs.kagent.dev, and remotemcpservers.kagent.dev exist in both, and a CRD is cluster-scoped, so installing 1.0’s CRDs replaces 0.10.x’s. A second cluster keeps the old installation intact while you work.
Warning
Downgrading from 1.0 back to 0.10.x is unsupported. Treat the cutover as one-way, and keep the 0.10.x installation running until you have verified the new one.
Before you begin
Read the kagent releases for the breaking changes in the version that you are moving to, and Version support for what 1.0 does and does not promise.
Decide where you will install 1.0. A second cluster is the safer choice, because it leaves your 0.10.x installation untouched. Installing on the same cluster means uninstalling 0.10.x first, and that step is not reversible.
Provision an empty PostgreSQL database for 1.0. It must be a new database rather than a new schema in the old one, and pointing 1.0 at a 0.10.x database fails at startup with a clear error.
source core uses an unsupported migration table. Use a new PostgreSQL databaseBack up your 0.10.x database. The backup is a restore point for the old installation rather than an input to the new one, because no procedure loads it into 1.0.
pg_dump "postgres://<user>:<password>@<host>:5432/<dbname>" \ --format=custom \ --file=kagent-0.10-backup.dump
Export your 0.10.x resources
Your Kubernetes resources do carry forward, so export them before anything replaces the CRDs. Conversation history does not carry forward.
Export every kagent resource in your namespace.
kubectl get agents,agentharnesses,sandboxagents,memories,toolservers,remotemcpservers,modelconfigs,modelproviderconfigs \ -n kagent -o yaml > kagent-0.10-resources.yamlNote which Secrets your ModelConfigs reference. Secrets are ordinary Kubernetes resources that kagent does not own, so recreate them on the new cluster by whatever means you created them originally.
kubectl get modelconfigs -n kagent \ -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.apiKeySecret}{"\n"}{end}'
Install kagent 1.0
Install 1.0 the same way as a first-time installation, with one addition: point it at the empty database that you provisioned. The full procedure covers Agent Substrate and the identity material that it needs before you install kagent 1.0.
Follow all steps in the 1.0 installation guide. Set the following Helm values on the kagent install, rather than changing them afterward.
Value Why database.postgres.urlYour new database’s connection string. Setting it takes precedence over the bundled instance. Use urlFileinstead to read the string from a file.database.postgres.bundled.enabled=falseTurns off the bundled PostgreSQL instance. The bundled instance is for development and evaluation, and it is not suitable for production. database.postgres.vectorEnabled=trueApplies the pgvector migrations, which long-term memory depends on. Your database must have the pgvector extension installed. The controller applies migrations at startup. To apply them from a pipeline instead, set
database.postgres.skipMigrations=trueand runkagent db migrate upyourself. The controller then verifies the schema and fails if it is not already current. For sizing and connection guidance on the database itself, see Use an external PostgreSQL instance.Verify the schema before continuing.
kagent db migrate status --db-url "postgres://<user>:<password>@<host>:5432/<dbname>"
Recreate your resources
The export splits into three groups: resources that need only an apiVersion change, agents that need rewriting, and resources with no 1.0 equivalent. Work through them in that order, because an AgentTemplate refers to the ModelConfigs and RemoteMCPServers that the first group creates.
Resources that carry forward
ModelConfig, ModelProviderConfig, and RemoteMCPServer have identical fields in v1alpha2 and v1alpha3.
Recreate the Secrets that your ModelConfigs name before you apply them, or the ModelConfigs resolve to nothing.
Change the
apiVersionand apply the resources unchanged.sed 's|^apiVersion: kagent.dev/v1alpha2$|apiVersion: kagent.dev/v1alpha3|' \ kagent-0.10-resources.yaml > kagent-1.0-resources.yaml
Agents become an AgentTemplate and a Harness
A 0.10.x Agent described both what the agent does and how it runs. In 1.0 these concepts are separated into two resources: an AgentTemplate holds the agent’s behavior, and a Harness holds the runtime and infrastructure. One Harness serves many AgentTemplates, so expect fewer Harnesses than you had Agents.
0.10.x Agent field | Equivalent field in 1.0 |
|---|---|
spec.description | AgentTemplate.spec.description |
spec.declarative.systemMessage | AgentTemplate.spec.systemPrompt |
spec.declarative.systemMessageFrom | AgentTemplate.spec.systemPromptFrom |
spec.declarative.promptTemplate | AgentTemplate.spec.promptTemplate, unchanged |
spec.declarative.modelConfig | AgentTemplate.spec.modelConfig, now an object with a name rather than a bare string |
spec.declarative.tools | AgentTemplate.spec.tools, reshaped. See the following note. |
spec.declarative.memory | Harness.spec.kagent.memory, so memory is now a property of the runtime rather than of one agent |
spec.declarative.runtime | Harness.spec.workload.image, through the runtime that the Harness selects |
spec.declarative.deployment | Harness.spec.workload and Harness.spec.substrate. Agents no longer run as Deployments. |
spec.type, spec.byo | The byo runtime on a Harness. For more information, see Bring your own agent. |
spec.declarative.a2aConfig | Nothing. A2A is always on, and callers address an AgentInstance by ID. |
spec.iconUrl, spec.documentationUrl, spec.version, spec.provider | Nothing. kagent builds the agent card from the AgentTemplate’s name and description. |
spec.declarative.stream, executeCodeBlocks, shareTools, context | Nothing. v1alpha3 has no equivalent field. |
Note
Tool bindings changed shape. A 0.10.x tool set type: McpServer or type: Agent alongside a matching block. A 1.0 ToolBinding carries an mcp or agent block and no discriminator, so the block you set is the binding’s kind. For what each binding does, see About tools.
Write one Harness for each distinct runtime and infrastructure combination that your agents need, then label each AgentTemplate so that a Harness admits it. A Harness admits nothing until its allowedAgentTemplates.selector matches, and an AgentTemplate has no field naming a Harness. For the full field reference, see Agent harness, and for a worked pair, see Your first agent.
Resources with no 1.0 equivalent
Four resource kinds are removed rather than replaced, so plan for each one before you cut over.
| Removed resource | What to do |
|---|---|
AgentHarness | No equivalent. It provisioned OpenClaw and Hermes coding-agent sandboxes with Slack and Telegram channels. 1.0’s Harness shares part of the name and nothing else. |
Memory | Configure memory on the Harness with spec.kagent.memory instead. For more information, see Agent memory. |
SandboxAgent | No equivalent, and none is needed. Every 1.0 agent runs in a gVisor sandbox by default. |
ToolServer | Use RemoteMCPServer, which 0.10.x already served alongside it. |
Verify the new installation
Confirm that the resources resolved before you retire anything, because a Harness that is missing a dependency reports the reason on itself.
Check that each Harness is ready. A Harness that is not ready most often names a WorkerPool that does not exist.
kubectl get harness -n kagentCheck that each AgentTemplate compiled against the Harness that admits it.
status.harnessescarries one entry per admitting Harness, each ending in aReadycondition. An AgentTemplate has no status print column, so read the conditions rather than the table.kagent get agent-template <template-name> -o jsonCreate an AgentInstance from a migrated pair and send it a message. A reply confirms the whole path, from the compiled revision to the model credentials.
kagent create agent-instance --harness <harness-name> --agent-template <template-name>
Retire the 0.10.x installation
Once the new installation answers correctly, remove the old one. Follow the 0.x procedure rather than the one in these docs: a 0.10.x installation has no Agent Substrate, no ate.dev resources, and no identity material to clean up. For those steps, see Uninstall kagent in the 0.x documentation.
Keep the database backup after the uninstall for your own records. It is the only remaining copy of the 0.10.x conversation history, and nothing in 1.0 can read it.