Skip to content

Derive an agent version with data-block pins swapped

POST
/v1/agents/{agentId}/versions
curl --request POST \
--url https://example.com/v1/agents/example/versions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "from": "example", "pins": { "prompts": { "additionalProperty": "example" }, "settings": { "additionalProperty": "example" } }, "label": "example", "projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }'

An expert’s edit, without a code change: a new agent version that is from’s bag with some prompt or settings pins swapped (derivedFrom: { version, reason: 'edited', label, by }), numbered the next free patch after the agent’s highest version. Only blocks from already references swap, to a published, active version of the right kind (model settings for the model-settings block); tool pins come from code. Needs publish on the agent.

agentId
required
string

AgentId — dotted namespace (acme.drafting).

Idempotency-Key
string
>= 1 characters

Caller-supplied idempotency key, scoped to the caller: the same key from someone else in the tenant is their own request (from 0.1.5). Retries with the same key return the original response byte-identical (per docs/API-ROUTE-CONVENTIONS.md §3.1). A retry sent while the first request still runs is answered 409 idempotency-key-in-flight with Retry-After, on a runtime whose store holds keys (from 0.1.5); retry after it, and you get the first request’s answer. An answer that carries a secret (a new API key or public run token, a session token, a generated signing secret) isn’t kept: a retry gets 409 idempotency-key-replay-withheld, with the first request’s status and when it succeeded (from 0.1.5).

Media typeapplication/json

Derive a new agent version from a pinned one with some data-block pins swapped: an expert’s edit reaching an agent with no code change.

object
from
required

The version to derive from (it must be pinned).

string
pins
required

The data-block pins to swap, by block id → exact version. Only blocks the version already references; tool pins come from code.

object
prompts

Prompt block id → exact version.

object
key
additional properties
string
settings

Settings block id → exact version.

object
key
additional properties
string
label

A short label for the new version.

string
projectId

The agent’s project, when the runtime doesn’t record it on the version.

string format: uuid
Examplegenerated
{
"from": "example",
"pins": {
"prompts": {
"additionalProperty": "example"
},
"settings": {
"additionalProperty": "example"
}
},
"label": "example",
"projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
}

An active version already holds this definition and these pins (the same swap derived before, or a deploy that registered it): that version, unchanged.

Media typeapplication/json
object
id
required

AgentId — dotted namespace (e.g. acme.drafting).

string
version
required

Semver.

string
projectId

The agent’s project: every version of an agent is in the one project. Absent when the runtime doesn’t record it: a pack kindgi dev serves from disk, or a runtime before Kindgi 0.1.6.

string format: uuid
name
required
string
description
string
instructions
required
One of:
string
>= 1 characters
parameters
Array<object>
object
name
required
string
description
string
type
required
string
Allowed values: string number boolean date
required
boolean
default

Default value used when the caller omits this parameter.

settings

Settings blocks the agent reads, by range: tools read them as ToolContext.settings['<id>'], templates as settings["<id>"]. Pinned at publish (pins.settings).

Array<object>

A settings block an agent reads, by id and semver range.

object
id
required

The settings block id.

string
version
required

A semver range (^1.0.0, 1.2.0).

string
modelSettings

A model-settings block by range: its temperature and maxOutputTokens go into the turn’s model calls. Pinned at publish.

object
id
required

The settings block id.

string
version
required

A semver range (^1.0.0, 1.2.0).

string
capabilities
required
Array<object>

Capability declaration — see @kindgi/capabilities. Additional properties are permitted so new capability kinds do not require a wire change.

object
key
additional properties
any
tools
required
Array<object>

Typed tool reference. version is a semver range (npm-style: 1.2.3 exact pin, ^1.2.3 compatible-updates, ~1.2.3 patch-updates-only, >=1.0.0 <2.0.0 explicit range). Dispatch resolves the range to a concrete active version via semver.maxSatisfying at run start. No implicit “latest” — every tool ref names both id and range.

object
id
required
string
>= 1 characters
version
required
string
>= 1 characters
retrieval
required
Array<object>
object
source

What it reads: facts (the default), or messages of this agent’s earlier conversations, quoted in the turn’s <memory> block as earlier conversation, never as turns.

string
Allowed values: facts conversations
types

The fact types it retrieves: required for facts; not used for conversations.

Array<string>
>= 1 items
roles

For conversations: whose messages it recalls. Default ['user'], the people’s own words. Adding agent recalls the agent’s earlier answers too, which can carry its mistakes: they are quoted as unverified earlier answers, and publishing warns recall-agent-answers.

Array<string>
>= 1 items unique items
Allowed values: user agent
scope
required

What the intent selects within what the run may see. Facts: this conversation’s; the run’s end user’s only (same-user: none when the run names no participantId); the run’s project’s (none without a project); or every fact of the type it may see (tenant). Conversations: this end user’s other conversations with the agent (same-user: none when the run names no participantId); this conversation’s messages older than the history window (same-conversation); conversations in the run’s segment path (same-segment) or its project (same-project), whoever had them: those two quote other people’s conversations, so publishing warns and their messages are marked as another person’s. same-segment is for conversations only, tenant for facts only.

string
Allowed values: same-conversation same-user same-segment same-project tenant
limit
integer
>= 1
mode

With the user’s message as the query: full-text, by meaning (fails the turn with semantic-unavailable on a runtime without embeddings), or both fused by rank (without embeddings, the keyword half). Absent: the newest facts.

string
Allowed values: keyword semantic both
memory

How the agent uses what it retrieves.

object
instructionTypes

Fact types that are instructions for this agent: a retrieved, verified fact of one of these types goes into the system message under ‘Policies (verified)’. Default: none.

Array<string>
remember

Lets the agent remember: its turns offer the built-in tool kindgi_remember (built-in tools are kindgi_<verb>; an agent cannot list one in tools, and a published tool cannot use the prefix). The model picks the type, the text (up to 2,000 characters), an optional slot key and when it stops being true; the scope comes from here and the run. Every remembered fact is unverified, attributed to the agent version and the call that wrote it, and expires after keepDays unless a person verifies it. A person approves it before any read sees it when the scope is wider than one person (same-project, tenant) or the text reads like an instruction.

object
types
required

The fact types it may write.

Array<string>
>= 1 items
scope
required

Where its facts go: the conversation’s end user (else the user the run acts for), the conversation, the run’s project, or the tenant. Each but tenant includes the run’s project.

string
Allowed values: same-user same-conversation same-project tenant
keepDays

Days an unverified fact is kept. Default 30.

integer
>= 1 <= 3650
guardrails
required
Array<string>
preferredProvider

Soft hint — the router prefers this provider by id (e.g. anthropic) when at least one of its models satisfies capabilities.needs + tenant policy. Combine with preferredModel to pin the exact (provider, model) tuple. Falls back to capability-based ranking when the pinned provider is unregistered or filtered out.

string
>= 1 characters
preferredModel

Soft hint at the model level (ModelInfo.name, e.g. claude-sonnet-5-5). Combined with preferredProvider: both set → promote the exact tuple; only preferredModel → promote any provider exposing that model; only preferredProvider → promote every model of that provider.

string
>= 1 characters
conversationPolicy
object
historyLimit
integer
>= 1
autoCloseAfterInactiveSeconds
integer
>= 1
hitlAfterTurns
integer
>= 1
budget
object
maxSteps
integer
>= 1
maxCostUsd
number
maxWallMs
integer
>= 1
tags
Array<string>
output
object
schema
required

JSON Schema (draft 2020-12) the final answer must match.

object
name

A name for the output, shown to the model and in errors. Default output.

string
>= 1 characters
maxRepairs

How many times the model is asked to repair an invalid answer. Default 1.

integer
toolErrors
object
maxRetries

Failed calls sent back to the model per turn. Default 1.

integer
<= 10
retryOn

Which failures are sent back: arguments that don’t fit the input schema (invalid-arguments), a tool the agent doesn’t have (unknown-tool), a tool that ran and failed (tool-error). Default invalid-arguments, unknown-tool.

Array<string>
unique items
Allowed values: invalid-arguments unknown-tool tool-error
pins

The exact block versions an agent version runs: its lockfile. Set by the runtime when the version is published, never in the publish body: each tool range resolves once to the version every run of that agent version uses, so a new tool version reaches the agent only through a new agent version. Absent on a version published before pins existed (its ranges resolve per run).

object
tools
required

Tool id → exact version.

object
key
additional properties
string
prompts
required

Prompt block id → exact version.

object
key
additional properties
string
settings
required

Settings block id → exact version.

object
key
additional properties
string
derivedFrom

Set by the runtime on an agent or flow version a deploy registered in place of the definition’s version, which was registered already with other pins or content (versions never change). Never in the publish body.

object
version
required

The version the definition names.

string
reason
required

pins-changed: a block it uses has a new version; unpinned: the definition’s version was published before pins existed; version-taken: the definition’s version holds another definition; edited: derived from version with some data-block pins swapped (POST /v1/agents/{agentId}/versions).

string
Allowed values: pins-changed unpinned version-taken edited
label

For edited: a short label for the version.

string
by

For edited: who derived it (user:<id>).

string
proposalId

For edited: the improvement proposal it was derived for. Such a version serves no scope until a promotion makes it live.

string
unregisteredAt

Present only on an unregistered version (GET …/versions/{version} reads those too). Unregister stops a version being chosen, not the pins that hold it: a new run naming it is refused, while a resumed run and a published version that pins it still run it.

string format: date-time
pinsDigest

Set by the runtime with pins: sha256:<hex> of the pins’ canonical JSON (sorted keys, no whitespace). Two agent versions with the same digest run the same blocks.

string
/^sha256:[0-9a-f]{64}$/
Example
{
"parameters": [
{
"type": "string"
}
],
"retrieval": [
{
"source": "facts",
"roles": [
"user"
],
"scope": "same-conversation",
"mode": "keyword"
}
],
"memory": {
"remember": {
"scope": "same-user"
}
},
"toolErrors": {
"retryOn": [
"invalid-arguments"
]
},
"derivedFrom": {
"reason": "pins-changed"
}
}

The derived agent version.

Media typeapplication/json
object
id
required

AgentId — dotted namespace (e.g. acme.drafting).

string
version
required

Semver.

string
projectId

The agent’s project: every version of an agent is in the one project. Absent when the runtime doesn’t record it: a pack kindgi dev serves from disk, or a runtime before Kindgi 0.1.6.

string format: uuid
name
required
string
description
string
instructions
required
One of:
string
>= 1 characters
parameters
Array<object>
object
name
required
string
description
string
type
required
string
Allowed values: string number boolean date
required
boolean
default

Default value used when the caller omits this parameter.

settings

Settings blocks the agent reads, by range: tools read them as ToolContext.settings['<id>'], templates as settings["<id>"]. Pinned at publish (pins.settings).

Array<object>

A settings block an agent reads, by id and semver range.

object
id
required

The settings block id.

string
version
required

A semver range (^1.0.0, 1.2.0).

string
modelSettings

A model-settings block by range: its temperature and maxOutputTokens go into the turn’s model calls. Pinned at publish.

object
id
required

The settings block id.

string
version
required

A semver range (^1.0.0, 1.2.0).

string
capabilities
required
Array<object>

Capability declaration — see @kindgi/capabilities. Additional properties are permitted so new capability kinds do not require a wire change.

object
key
additional properties
any
tools
required
Array<object>

Typed tool reference. version is a semver range (npm-style: 1.2.3 exact pin, ^1.2.3 compatible-updates, ~1.2.3 patch-updates-only, >=1.0.0 <2.0.0 explicit range). Dispatch resolves the range to a concrete active version via semver.maxSatisfying at run start. No implicit “latest” — every tool ref names both id and range.

object
id
required
string
>= 1 characters
version
required
string
>= 1 characters
retrieval
required
Array<object>
object
source

What it reads: facts (the default), or messages of this agent’s earlier conversations, quoted in the turn’s <memory> block as earlier conversation, never as turns.

string
Allowed values: facts conversations
types

The fact types it retrieves: required for facts; not used for conversations.

Array<string>
>= 1 items
roles

For conversations: whose messages it recalls. Default ['user'], the people’s own words. Adding agent recalls the agent’s earlier answers too, which can carry its mistakes: they are quoted as unverified earlier answers, and publishing warns recall-agent-answers.

Array<string>
>= 1 items unique items
Allowed values: user agent
scope
required

What the intent selects within what the run may see. Facts: this conversation’s; the run’s end user’s only (same-user: none when the run names no participantId); the run’s project’s (none without a project); or every fact of the type it may see (tenant). Conversations: this end user’s other conversations with the agent (same-user: none when the run names no participantId); this conversation’s messages older than the history window (same-conversation); conversations in the run’s segment path (same-segment) or its project (same-project), whoever had them: those two quote other people’s conversations, so publishing warns and their messages are marked as another person’s. same-segment is for conversations only, tenant for facts only.

string
Allowed values: same-conversation same-user same-segment same-project tenant
limit
integer
>= 1
mode

With the user’s message as the query: full-text, by meaning (fails the turn with semantic-unavailable on a runtime without embeddings), or both fused by rank (without embeddings, the keyword half). Absent: the newest facts.

string
Allowed values: keyword semantic both
memory

How the agent uses what it retrieves.

object
instructionTypes

Fact types that are instructions for this agent: a retrieved, verified fact of one of these types goes into the system message under ‘Policies (verified)’. Default: none.

Array<string>
remember

Lets the agent remember: its turns offer the built-in tool kindgi_remember (built-in tools are kindgi_<verb>; an agent cannot list one in tools, and a published tool cannot use the prefix). The model picks the type, the text (up to 2,000 characters), an optional slot key and when it stops being true; the scope comes from here and the run. Every remembered fact is unverified, attributed to the agent version and the call that wrote it, and expires after keepDays unless a person verifies it. A person approves it before any read sees it when the scope is wider than one person (same-project, tenant) or the text reads like an instruction.

object
types
required

The fact types it may write.

Array<string>
>= 1 items
scope
required

Where its facts go: the conversation’s end user (else the user the run acts for), the conversation, the run’s project, or the tenant. Each but tenant includes the run’s project.

string
Allowed values: same-user same-conversation same-project tenant
keepDays

Days an unverified fact is kept. Default 30.

integer
>= 1 <= 3650
guardrails
required
Array<string>
preferredProvider

Soft hint — the router prefers this provider by id (e.g. anthropic) when at least one of its models satisfies capabilities.needs + tenant policy. Combine with preferredModel to pin the exact (provider, model) tuple. Falls back to capability-based ranking when the pinned provider is unregistered or filtered out.

string
>= 1 characters
preferredModel

Soft hint at the model level (ModelInfo.name, e.g. claude-sonnet-5-5). Combined with preferredProvider: both set → promote the exact tuple; only preferredModel → promote any provider exposing that model; only preferredProvider → promote every model of that provider.

string
>= 1 characters
conversationPolicy
object
historyLimit
integer
>= 1
autoCloseAfterInactiveSeconds
integer
>= 1
hitlAfterTurns
integer
>= 1
budget
object
maxSteps
integer
>= 1
maxCostUsd
number
maxWallMs
integer
>= 1
tags
Array<string>
output
object
schema
required

JSON Schema (draft 2020-12) the final answer must match.

object
name

A name for the output, shown to the model and in errors. Default output.

string
>= 1 characters
maxRepairs

How many times the model is asked to repair an invalid answer. Default 1.

integer
toolErrors
object
maxRetries

Failed calls sent back to the model per turn. Default 1.

integer
<= 10
retryOn

Which failures are sent back: arguments that don’t fit the input schema (invalid-arguments), a tool the agent doesn’t have (unknown-tool), a tool that ran and failed (tool-error). Default invalid-arguments, unknown-tool.

Array<string>
unique items
Allowed values: invalid-arguments unknown-tool tool-error
pins

The exact block versions an agent version runs: its lockfile. Set by the runtime when the version is published, never in the publish body: each tool range resolves once to the version every run of that agent version uses, so a new tool version reaches the agent only through a new agent version. Absent on a version published before pins existed (its ranges resolve per run).

object
tools
required

Tool id → exact version.

object
key
additional properties
string
prompts
required

Prompt block id → exact version.

object
key
additional properties
string
settings
required

Settings block id → exact version.

object
key
additional properties
string
derivedFrom

Set by the runtime on an agent or flow version a deploy registered in place of the definition’s version, which was registered already with other pins or content (versions never change). Never in the publish body.

object
version
required

The version the definition names.

string
reason
required

pins-changed: a block it uses has a new version; unpinned: the definition’s version was published before pins existed; version-taken: the definition’s version holds another definition; edited: derived from version with some data-block pins swapped (POST /v1/agents/{agentId}/versions).

string
Allowed values: pins-changed unpinned version-taken edited
label

For edited: a short label for the version.

string
by

For edited: who derived it (user:<id>).

string
proposalId

For edited: the improvement proposal it was derived for. Such a version serves no scope until a promotion makes it live.

string
unregisteredAt

Present only on an unregistered version (GET …/versions/{version} reads those too). Unregister stops a version being chosen, not the pins that hold it: a new run naming it is refused, while a resumed run and a published version that pins it still run it.

string format: date-time
pinsDigest

Set by the runtime with pins: sha256:<hex> of the pins’ canonical JSON (sorted keys, no whitespace). Two agent versions with the same digest run the same blocks.

string
/^sha256:[0-9a-f]{64}$/
Example
{
"parameters": [
{
"type": "string"
}
],
"retrieval": [
{
"source": "facts",
"roles": [
"user"
],
"scope": "same-conversation",
"mode": "keyword"
}
],
"memory": {
"remember": {
"scope": "same-user"
}
},
"toolErrors": {
"retryOn": [
"invalid-arguments"
]
},
"derivedFrom": {
"reason": "pins-changed"
}
}

validation-failed: from has no pins, a swap names a block it doesn’t reference, or a version that isn’t published, active or the right kind (see details.issues); or projectId isn’t a project id (a UUID).

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

Missing / malformed / expired / revoked bearer token.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

agent-not-found: no agent at from; or projectId names no project of this tenant (project-not-found).

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

Idempotency-Key was reused with a different body, or resource-state conflict. Or agent-project-mismatch: the agent belongs to another project than the body’s projectId (agents never move; the message doesn’t name the project). Or registry-read-only: this registry takes no writes (under kindgi dev, the pack’s files are the source); the message says what to do instead.

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}

Server error (unmapped domain code or framework crash).

Media typeapplication/json
object
error
required
object
code
required

Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).

string
message
required
string
details

Optional, kind-specific.

object
key
additional properties
any
requestId
required

Server-assigned request id; also echoed via X-Request-Id header.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {},
"requestId": "example"
}
}