Models: T
TakeTriggerOwnerBody
Section titled “TakeTriggerOwnerBody”Who the trigger's runs act as from now: for a trigger whose owner left, or to make one shared or personal. Absent, or an empty body: the caller takes it over (today's behaviour). With runAsServiceAccountId: that service account becomes the owner. With runAsProject: the project's own account does. A take-over keeps the trigger's toolsAllowedUnattended: change that with PATCH.
run_as_service_account_id: str | None(runAsServiceAccountIdon the wire) (optional)run_as_project: bool | None(runAsProjecton the wire) (optional)
id: strtenant_id: str(tenantIdon the wire)org_id: str | None(orgIdon the wire) (optional)name: strslug: strdescription: str | None(optional)created_at: str(createdAton the wire)updated_at: str(updatedAton the wire)
TeamCollectionPage
Section titled “TeamCollectionPage”data: list[kindgi.client.Team]has_more: bool(hasMoreon the wire)next_cursor: str | None(nextCursoron the wire) (optional)
TeamMembership
Section titled “TeamMembership”team_id: str(teamIdon the wire)user_id: str(userIdon the wire)role: Union[Literal['admin', 'member'], str]joined_at: str(joinedAton the wire)
TeamMembershipCollectionPage
Section titled “TeamMembershipCollectionPage”data: list[kindgi.client.TeamMembership]has_more: bool(hasMoreon the wire)next_cursor: str | None(nextCursoron the wire) (optional)
TeamPatch
Section titled “TeamPatch”name: str | None(optional)slug: str | None(optional)description: str | None(optional)org_id: str | None(orgIdon the wire) (optional)
TeamProjectGrant
Section titled “TeamProjectGrant”A team's role on a project.
team_id: str(teamIdon the wire)project_id: str(projectIdon the wire)role: Union[Literal['viewer', 'editor', 'admin'], str]granted_at: AwareDatetime | None(grantedAton the wire) (optional)team_name: str | None(teamNameon the wire) (optional)project_name: str | None(projectNameon the wire) (optional)
TeamProjectGrantCollectionPage
Section titled “TeamProjectGrantCollectionPage”data: list[kindgi.client.TeamProjectGrant]has_more: bool(hasMoreon the wire)next_cursor: str | None(nextCursoron the wire) (optional)
TeamSpec
Section titled “TeamSpec”name: strslug: strdescription: str | None(optional)org_id: str | None(orgIdon the wire) (optional)
Tenant
Section titled “Tenant”id: uuid.UUIDname: strslug: strcreated_at: AwareDatetime(createdAton the wire)updated_at: AwareDatetime(updatedAton the wire)production_allowed: bool | None(productionAllowedon the wire) (optional)production_next: str | None(productionNexton the wire) (optional)state: Optional[Annotated[Union[Literal['active', 'suspended', 'closing'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](optional)limits: kindgi.client.TenantLimits | None(optional)egress: kindgi.client.EgressAddresses | None(optional)
TenantAdminContacts
Section titled “TenantAdminContacts”data: list[kindgi.client.Datum3]
TenantConfigCollectionPage
Section titled “TenantConfigCollectionPage”data: list[kindgi.client.TenantConfigEntry]has_more: bool(hasMoreon the wire)next_cursor: str | None(nextCursoron the wire) (optional)
TenantConfigEntry
Section titled “TenantConfigEntry”tenant_id: str(tenantIdon the wire)kind: Union[Literal['env', 'config', 'secret'], str]key: strvalue: strsensitive: boolrevision: intupdated_at: str(updatedAton the wire)
TenantLimits
Section titled “TenantLimits”The workspace's limits that are set. A limit that isn't set is absent, and isn't enforced.
api_requests_per_minute: int | None(apiRequestsPerMinuteon the wire) (optional)webhook_receives_per_minute: int | None(webhookReceivesPerMinuteon the wire) (optional)runs_at_once: int | None(runsAtOnceon the wire) (optional)runs_pending: int | None(runsPendingon the wire) (optional)tool_calls_in_flight: int | None(toolCallsInFlighton the wire) (optional)approvals_pending: int | None(approvalsPendingon the wire) (optional)projects_in_production: int | None(projectsInProductionon the wire) (optional)
TenantLimitsInUse
Section titled “TenantLimitsInUse”How much of each limit that counts something the tenant uses now, whether the limit is set or not: on GET …/limits only, and only from a runtime that counts it. A limit can be lowered below it: nothing is taken back, and the next one waits until the count is under the limit.
projects_in_production: int(projectsInProductionon the wire)
TenantLimitsResult
Section titled “TenantLimitsResult”tenant_id: uuid.UUID(tenantIdon the wire)limits: kindgi.client.TenantLimitsin_use: kindgi.client.TenantLimitsInUse | None(inUseon the wire) (optional)
TenantPatch
Section titled “TenantPatch”A new name, a new slug, or both; a field left out stays as it is. The id stays, so whatever names the workspace by its id keeps working.
name: str | None(optional)slug: str | None(optional)
TenantProductionAllowed
Section titled “TenantProductionAllowed”tenant_id: uuid.UUID(tenantIdon the wire)production_allowed: bool(productionAllowedon the wire)
TenantTableRows
Section titled “TenantTableRows”A tenant's rows in one table: the table's name and a count.
table: strrows: int
TestAdapterBody
Section titled “TestAdapterBody”TestCase
Section titled “TestCase”id: strkind: Union[Literal['correction', 'hand'], str]project_id: uuid.UUID(projectIdon the wire)run_id: str(runIdon the wire)made_on: str(madeOnon the wire)expect: kindgi.client.TestCaseExpectadded_by: kindgi.client.CorrectionMadeBy(addedByon the wire)added_at: AwareDatetime(addedAton the wire)updated_at: AwareDatetime(updatedAton the wire)retired: kindgi.client.TestCaseRetired | None(optional)expert: Optional[Literal[True]](optional)
TestCaseAnswer
Section titled “TestCaseAnswer”A judging model checks it. right: it says what the corrected run's answer said. wrong: it does what shouldSay or why asks.
verdict: Union[Literal['right', 'wrong'], str]should_say: str | None(shouldSayon the wire) (optional)why: str | None(optional)
TestCaseCollectionPage
Section titled “TestCaseCollectionPage”data: list[kindgi.client.TestCase]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
TestCaseDecisions
Section titled “TestCaseDecisions”right: it calls the same tools the corrected run called, by name, in any order (args aren't compared). wrong: it calls every shouldCall tool (with its args where given) and none of mustNotCall, checked exactly, without a model.
verdict: Union[Literal['right', 'wrong'], str]should_call: list[kindgi.client.ExpectedCall] | None(shouldCallon the wire) (optional)must_not_call: list[str] | None(mustNotCallon the wire) (optional)
TestCaseExpect
Section titled “TestCaseExpect”One part for each part its correction gave a verdict on; at least one.
decisions: kindgi.client.TestCaseDecisions | None(optional)answer: kindgi.client.TestCaseAnswer | None(optional)items: list[kindgi.client.CorrectedAnswerItem] | None(optional)
TestCaseRetired
Section titled “TestCaseRetired”reason: strby: kindgi.client.CorrectionMadeByat: AwareDatetime
TestRun
Section titled “TestRun”test_run_id: uuid.UUID(testRunIdon the wire)tenant_id: uuid.UUID(tenantIdon the wire)project_id: uuid.UUID | None(projectIdon the wire) (optional)test_set_id: str(testSetIdon the wire)test_set_version: str(testSetVersionon the wire)kind: Union[Literal['accuracy', 'pairwise', 'regression', 'human-review', 'benchmark', 'custom', 'corrections'], str]agent_ref: kindgi.client.TestRunAgentRef | None(agentRefon the wire) (optional)flow_ref: kindgi.client.TestRunFlowRef | None(flowRefon the wire) (optional)status: Union[Literal['pending', 'running', 'completed', 'failed', 'cancelled'], str]dry_run: bool(dryRunon the wire)started_at: AwareDatetime(startedAton the wire)completed_at: AwareDatetime | None(completedAton the wire) (optional)result: dict[str, Any] | None(optional)error: str | None(optional)cancel_reason: str | None(cancelReasonon the wire) (optional)correlation_id: str | None(correlationIdon the wire) (optional)comparison: kindgi.client.TestRunComparison | None(optional)
TestRunAgentRef
Section titled “TestRunAgentRef”agent_id: str(agentIdon the wire)version: str | None(optional)
TestRunBaseline1
Section titled “TestRunBaseline1”What a comparison compares the candidate against: 'recorded' (each case's recorded output, what was corrected), a version ({ agentId, version }, replayed under the same rules), or the version pinned in a scope ({ pinned: { projectId?, segments? } }, segments a path in the project, coarse to fine). Only 'recorded' runs today; the others are refused when the run starts.
agent_id: str(agentIdon the wire)version: str
TestRunBaseline2
Section titled “TestRunBaseline2”What a comparison compares the candidate against: 'recorded' (each case's recorded output, what was corrected), a version ({ agentId, version }, replayed under the same rules), or the version pinned in a scope ({ pinned: { projectId?, segments? } }, segments a path in the project, coarse to fine). Only 'recorded' runs today; the others are refused when the run starts.
pinned: kindgi.client.Pinned1
TestRunCollectionPage
Section titled “TestRunCollectionPage”data: list[kindgi.client.TestRun]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
TestRunComparison
Section titled “TestRunComparison”A comparison test run's settings (a corrections test set).
baseline: Union[Annotated[Union[Literal['recorded'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>], kindgi.client.TestRunBaseline1, kindgi.client.TestRunBaseline2]reads: Union[Literal['recorded', 'live'], str]repetitions: intk: intversions: kindgi.client.FlowVersionOverrides | None(optional)group_weights: Optional[Annotated[Union[Literal['as-recorded', 'experts-only'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](groupWeightson the wire) (optional)overrides: kindgi.client.TestRunOverrides | None(optional)sample: kindgi.client.TestRunSample | None(optional)rescore_of: str | None(rescoreOfon the wire) (optional)
TestRunFlowRef
Section titled “TestRunFlowRef”flow_id: str(flowIdon the wire)version: str | None(optional)
TestRunOverrides
Section titled “TestRunOverrides”For an agent candidate: block content its replays run instead of the version's pinned content (an Improve run's search). settings: values by settings block id, each a block the version pins, satisfying its schema. prompts: a template for the prompt block the version pins, which reads and names only what the agent has (its parameters, the variables the current template reads, the settings blocks it pins, its tools' and blocks' ids) and is at most twice as long. Anything else is 400 validation-failed. A comparison with overrides can't gate a pin.
settings: dict[str, dict[str, Any]] | None(optional)prompts: dict[str, kindgi.client.Prompts] | None(optional)
TestRunSample
Section titled “TestRunSample”Only part of the test set's cases: split once into a hold-out part (about holdOutShare of them) and a search part (the rest), stratified (the cases that carry a correction, then of the others the cases with a "no" and the rest, each split on its own, a stratum of two or more giving each part at least one, so both parts check a correction when two cases carry one), in the order of a hash of each case id and seed. The same seed always splits the same test set the same way. A release gate refuses a comparison on the search part (comparison.sample).
part: Union[Literal['search', 'hold-out'], str]seed: strhold_out_share: float(holdOutShareon the wire)
TestRunStatus
Section titled “TestRunStatus”root: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
TestSet
Section titled “TestSet”id: strtenant_id: uuid.UUID(tenantIdon the wire)project_id: uuid.UUID | None(projectIdon the wire) (optional)version: strkind: Union[Literal['accuracy', 'pairwise', 'regression', 'human-review', 'benchmark', 'custom', 'corrections'], str]description: str | None(optional)spec: dict[str, Any]unregistered_at: AwareDatetime | None(unregisteredAton the wire) (optional)
TestSetCaseCounts
Section titled “TestSetCaseCounts”active: intretired: int
TestSetCollectionPage
Section titled “TestSetCollectionPage”data: list[kindgi.client.TestSet]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
TestSetFrozenVersion
Section titled “TestSetFrozenVersion”The newest version frozen of this project's test set, which a test run checks: its cases are at GET /v1/test-sets/{testSetId}/versions/{version}/cases.
test_set_id: str(testSetIdon the wire)version: str
TimeRange
Section titled “TimeRange”from_: AwareDatetime(fromon the wire)to: AwareDatetime
TokenSignInResult
Section titled “TokenSignInResult”user_id: str(userIdon the wire)expires_at: AwareDatetime(expiresAton the wire)
id: strproject_id: uuid.UUID | None(projectIdon the wire) (optional)description: strversion: str | None(optional)input: dict[str, Any]output: dict[str, Any]needs: list[kindgi.client.ToolNeed] | None(optional)effects: list[kindgi.client.ToolEffect] | None(optional)transport: Optional[Annotated[Union[Literal['auto', 'native', 'mcp'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](optional)mcp_endpoint: str | None(mcpEndpointon the wire) (optional)metadata: dict[str, Any] | None(optional)mutating: bool | None(optional)needs_approval_when_unattended: bool | None(needsApprovalWhenUnattendedon the wire) (optional)pauses: bool | None(optional)stores_files: bool | None(storesFileson the wire) (optional)reads_files: bool | None(readsFileson the wire) (optional)result_is_outside_data: bool | None(resultIsOutsideDataon the wire) (optional)sandbox: Optional[Annotated[Union[Literal['none', 'context-isolated', 'strict'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](optional)limits: kindgi.client.RuntimeLimits | None(optional)network: Optional[Annotated[kindgi.client.NetworkPolicy1 | kindgi.client.NetworkPolicy2 | kindgi.client.NetworkPolicyUnrecognized, <kindgi.client._open.OpenUnion object at 0x108217150>]](optional)needs_spec: kindgi.client.TypedNeeds | None(needsSpecon the wire) (optional)code_artifact_ref: Optional[Annotated[kindgi.client.CodeArtifactRefOci | kindgi.client.CodeArtifactRefFilesystem | kindgi.client.CodeArtifactRefUnrecognized, <kindgi.client._open.OpenUnion object at 0x108217450>]](codeArtifactRefon the wire) (optional)spec: kindgi.client.ToolSpec | None(optional)unregistered_at: AwareDatetime | None(unregisteredAton the wire) (optional)secret_scopes: dict[str, Optional[Annotated[kindgi.client.RecordedSecretScopeTenant | kindgi.client.RecordedSecretScopeOrg | kindgi.client.RecordedSecretScopeProject | kindgi.client.RecordedSecretScopeUnrecognized, <kindgi.client._open.OpenUnion object at 0x108217850>]]] | None(secretScopeson the wire) (optional)
ToolCall
Section titled “ToolCall”tool_id: str(toolIdon the wire)invocation_id: str(invocationIdon the wire)
ToolCollectionPage
Section titled “ToolCollectionPage”data: list[kindgi.client.Tool]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
ToolEffect
Section titled “ToolEffect”kind: Union[Literal['reads', 'writes', 'deletes', 'network', 'spawns-run', 'emits-event', 'external-side-effect', 'sensitive-data-egress'], str]resource: str | None(optional)notes: str | None(optional)
ToolErrorsSpec
Section titled “ToolErrorsSpec”max_retries: int | None(maxRetrieson the wire) (optional)retry_on: list[Annotated[Union[Literal['invalid-arguments', 'unknown-tool', 'tool-error'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]] | None(retryOnon the wire) (optional)
ToolFileNotRead
Section titled “ToolFileNotRead”Why a pack tool's read of a stored file answered no bytes. The read's bytes come as application/octet-stream instead.
not_read: Literal['rule', 'gone', 'changed', 'size'](notReadon the wire)
ToolFileStoreAnswer
Section titled “ToolFileStoreAnswer”root: kindgi.client.ToolFileStoreAnswer1 | kindgi.client.ToolFileStoreAnswer2
ToolFileStoreAnswer1
Section titled “ToolFileStoreAnswer1”What a pack tool's file store answers: the stored file (file), for the tool to return in its result's top-level files, or why nothing was stored (notStored).
file: kindgi.client.FileValue
ToolFileStoreAnswer2
Section titled “ToolFileStoreAnswer2”What a pack tool's file store answers: the stored file (file), for the tool to return in its result's top-level files, or why nothing was stored (notStored).
not_stored: Literal['type', 'size', 'limit', 'storage'](notStoredon the wire)
ToolNeed
Section titled “ToolNeed”name: stroptional: bool | None(optional)
ToolRef
Section titled “ToolRef”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.
id: strversion: str
ToolSecretRef
Section titled “ToolSecretRef”env_name: str(envNameon the wire)name: str
ToolSpec
Section titled “ToolSpec”root: kindgi.client.HttpToolSpec
ToolVersionCollectionPage
Section titled “ToolVersionCollectionPage”data: list[kindgi.client.ToolVersionRow]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
ToolVersionRow
Section titled “ToolVersionRow”id: strproject_id: uuid.UUID | None(projectIdon the wire) (optional)description: strversion: str | None(optional)input: dict[str, Any]output: dict[str, Any]needs: list[kindgi.client.ToolNeed] | None(optional)effects: list[kindgi.client.ToolEffect] | None(optional)transport: Optional[Annotated[Union[Literal['auto', 'native', 'mcp'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](optional)mcp_endpoint: str | None(mcpEndpointon the wire) (optional)metadata: dict[str, Any] | None(optional)mutating: bool | None(optional)needs_approval_when_unattended: bool | None(needsApprovalWhenUnattendedon the wire) (optional)pauses: bool | None(optional)stores_files: bool | None(storesFileson the wire) (optional)reads_files: bool | None(readsFileson the wire) (optional)result_is_outside_data: bool | None(resultIsOutsideDataon the wire) (optional)sandbox: Optional[Annotated[Union[Literal['none', 'context-isolated', 'strict'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]](optional)limits: kindgi.client.RuntimeLimits | None(optional)network: Optional[Annotated[kindgi.client.NetworkPolicy1 | kindgi.client.NetworkPolicy2 | kindgi.client.NetworkPolicyUnrecognized, <kindgi.client._open.OpenUnion object at 0x108232a90>]](optional)needs_spec: kindgi.client.TypedNeeds | None(needsSpecon the wire) (optional)code_artifact_ref: Optional[Annotated[kindgi.client.CodeArtifactRefOci | kindgi.client.CodeArtifactRefFilesystem | kindgi.client.CodeArtifactRefUnrecognized, <kindgi.client._open.OpenUnion object at 0x108232d90>]](codeArtifactRefon the wire) (optional)spec: kindgi.client.ToolSpec | None(optional)unregistered_at: AwareDatetime | None(unregisteredAton the wire) (optional)secret_scopes: dict[str, Optional[Annotated[kindgi.client.RecordedSecretScopeTenant | kindgi.client.RecordedSecretScopeOrg | kindgi.client.RecordedSecretScopeProject | kindgi.client.RecordedSecretScopeUnrecognized, <kindgi.client._open.OpenUnion object at 0x108233190>]]] | None(secretScopeson the wire) (optional)
ToolsAllowedUnattendedItem
Section titled “ToolsAllowedUnattendedItem”root: str
yes_weight: float(yesWeighton the wire)total_weight: float(totalWeighton the wire)
Trigger
Section titled “Trigger”The improve schedule and fire that started it (GET /v1/schedules/{triggerId}/fires); absent for an Improve run a person started.
trigger_id: str(triggerIdon the wire)fire_id: str(fireIdon the wire)
TriggerOwner
Section titled “TriggerOwner”kind: Union[Literal['user', 'service'], str]id: strdisplay_name: str | None(displayNameon the wire) (optional)is_project_account: Optional[Literal[True]](isProjectAccounton the wire) (optional)
TrustSigningKeyBody
Section titled “TrustSigningKeyBody”key_id: str(keyIdon the wire)algorithm: Optional[Literal['ed25519']](optional)public_key: str(publicKeyon the wire)label: str | None(optional)
TrustedSigningKey
Section titled “TrustedSigningKey”A public key the workspace trusts to sign deployments (POST /v1/deployments). A revoked key stays readable, with revokedAt, so the deployments it signed can be audited; it verifies no new ones.
key_id: str(keyIdon the wire)tenant_id: uuid.UUID(tenantIdon the wire)algorithm: Union[Literal['ed25519'], str]public_key: str(publicKeyon the wire)label: str | None(optional)created_at: AwareDatetime(createdAton the wire)revoked_at: AwareDatetime | None(revokedAton the wire) (optional)revoked_reason: str | None(revokedReasonon the wire) (optional)
TrustedSigningKeyPage
Section titled “TrustedSigningKeyPage”data: list[kindgi.client.TrustedSigningKey]next_cursor: str | None(nextCursoron the wire) (optional)has_more: bool(hasMoreon the wire)
TurnBudget
Section titled “TurnBudget”max_steps: int | None(maxStepson the wire) (optional)max_cost_usd: float | None(maxCostUsdon the wire) (optional)max_wall_ms: int | None(maxWallMson the wire) (optional)
root: str
TypedNeeds
Section titled “TypedNeeds”Typed discriminated needs (env / secrets / config / capabilities / bindings / connections). Optional additive field.
env: dict[str, dict[str, Any]] | None(optional)secrets: dict[str, dict[str, Any]] | None(optional)config: dict[str, dict[str, Any]] | None(optional)capabilities: list[kindgi.client.Capability5] | None(optional)bindings: list[kindgi.client.Binding] | None(optional)connections: dict[Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern='^[a-z][a-zA-Z0-9_]{0,63}$', ascii_only=None)], kindgi.client.ConnectionNeed] | None(optional)