Skip to content

Models: T

View as Markdown

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 (runAsServiceAccountId on the wire) (optional)
  • run_as_project: bool | None (runAsProject on the wire) (optional)
  • id: str
  • tenant_id: str (tenantId on the wire)
  • org_id: str | None (orgId on the wire) (optional)
  • name: str
  • slug: str
  • description: str | None (optional)
  • created_at: str (createdAt on the wire)
  • updated_at: str (updatedAt on the wire)
  • data: list[kindgi.client.Team]
  • has_more: bool (hasMore on the wire)
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • team_id: str (teamId on the wire)
  • user_id: str (userId on the wire)
  • role: Union[Literal['admin', 'member'], str]
  • joined_at: str (joinedAt on the wire)
  • data: list[kindgi.client.TeamMembership]
  • has_more: bool (hasMore on the wire)
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • name: str | None (optional)
  • slug: str | None (optional)
  • description: str | None (optional)
  • org_id: str | None (orgId on the wire) (optional)

A team's role on a project.

  • team_id: str (teamId on the wire)
  • project_id: str (projectId on the wire)
  • role: Union[Literal['viewer', 'editor', 'admin'], str]
  • granted_at: AwareDatetime | None (grantedAt on the wire) (optional)
  • team_name: str | None (teamName on the wire) (optional)
  • project_name: str | None (projectName on the wire) (optional)
  • data: list[kindgi.client.TeamProjectGrant]
  • has_more: bool (hasMore on the wire)
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • name: str
  • slug: str
  • description: str | None (optional)
  • org_id: str | None (orgId on the wire) (optional)
  • id: uuid.UUID
  • name: str
  • slug: str
  • created_at: AwareDatetime (createdAt on the wire)
  • updated_at: AwareDatetime (updatedAt on the wire)
  • production_allowed: bool | None (productionAllowed on the wire) (optional)
  • production_next: str | None (productionNext on 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)
  • data: list[kindgi.client.Datum3]
  • data: list[kindgi.client.TenantConfigEntry]
  • has_more: bool (hasMore on the wire)
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • tenant_id: str (tenantId on the wire)
  • kind: Union[Literal['env', 'config', 'secret'], str]
  • key: str
  • value: str
  • sensitive: bool
  • revision: int
  • updated_at: str (updatedAt on the wire)

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 (apiRequestsPerMinute on the wire) (optional)
  • webhook_receives_per_minute: int | None (webhookReceivesPerMinute on the wire) (optional)
  • runs_at_once: int | None (runsAtOnce on the wire) (optional)
  • runs_pending: int | None (runsPending on the wire) (optional)
  • tool_calls_in_flight: int | None (toolCallsInFlight on the wire) (optional)
  • approvals_pending: int | None (approvalsPending on the wire) (optional)
  • projects_in_production: int | None (projectsInProduction on the wire) (optional)

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 (projectsInProduction on the wire)
  • tenant_id: uuid.UUID (tenantId on the wire)
  • limits: kindgi.client.TenantLimits
  • in_use: kindgi.client.TenantLimitsInUse | None (inUse on the wire) (optional)

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)
  • tenant_id: uuid.UUID (tenantId on the wire)
  • production_allowed: bool (productionAllowed on the wire)

A tenant's rows in one table: the table's name and a count.

  • table: str
  • rows: int
  • id: str
  • kind: Union[Literal['correction', 'hand'], str]
  • project_id: uuid.UUID (projectId on the wire)
  • run_id: str (runId on the wire)
  • made_on: str (madeOn on the wire)
  • expect: kindgi.client.TestCaseExpect
  • added_by: kindgi.client.CorrectionMadeBy (addedBy on the wire)
  • added_at: AwareDatetime (addedAt on the wire)
  • updated_at: AwareDatetime (updatedAt on the wire)
  • retired: kindgi.client.TestCaseRetired | None (optional)
  • expert: Optional[Literal[True]] (optional)

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 (shouldSay on the wire) (optional)
  • why: str | None (optional)
  • data: list[kindgi.client.TestCase]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)

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 (shouldCall on the wire) (optional)
  • must_not_call: list[str] | None (mustNotCall on the wire) (optional)

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)
  • reason: str
  • by: kindgi.client.CorrectionMadeBy
  • at: AwareDatetime
  • test_run_id: uuid.UUID (testRunId on the wire)
  • tenant_id: uuid.UUID (tenantId on the wire)
  • project_id: uuid.UUID | None (projectId on the wire) (optional)
  • test_set_id: str (testSetId on the wire)
  • test_set_version: str (testSetVersion on the wire)
  • kind: Union[Literal['accuracy', 'pairwise', 'regression', 'human-review', 'benchmark', 'custom', 'corrections'], str]
  • agent_ref: kindgi.client.TestRunAgentRef | None (agentRef on the wire) (optional)
  • flow_ref: kindgi.client.TestRunFlowRef | None (flowRef on the wire) (optional)
  • status: Union[Literal['pending', 'running', 'completed', 'failed', 'cancelled'], str]
  • dry_run: bool (dryRun on the wire)
  • started_at: AwareDatetime (startedAt on the wire)
  • completed_at: AwareDatetime | None (completedAt on the wire) (optional)
  • result: dict[str, Any] | None (optional)
  • error: str | None (optional)
  • cancel_reason: str | None (cancelReason on the wire) (optional)
  • correlation_id: str | None (correlationId on the wire) (optional)
  • comparison: kindgi.client.TestRunComparison | None (optional)
  • agent_id: str (agentId on the wire)
  • version: str | None (optional)

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 (agentId on the wire)
  • version: str

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
  • data: list[kindgi.client.TestRun]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)

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: int
  • k: int
  • versions: kindgi.client.FlowVersionOverrides | None (optional)
  • group_weights: Optional[Annotated[Union[Literal['as-recorded', 'experts-only'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]] (groupWeights on the wire) (optional)
  • overrides: kindgi.client.TestRunOverrides | None (optional)
  • sample: kindgi.client.TestRunSample | None (optional)
  • rescore_of: str | None (rescoreOf on the wire) (optional)
  • flow_id: str (flowId on the wire)
  • version: str | None (optional)

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)

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: str
  • hold_out_share: float (holdOutShare on the wire)
  • root: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
  • id: str
  • tenant_id: uuid.UUID (tenantId on the wire)
  • project_id: uuid.UUID | None (projectId on the wire) (optional)
  • version: str
  • kind: Union[Literal['accuracy', 'pairwise', 'regression', 'human-review', 'benchmark', 'custom', 'corrections'], str]
  • description: str | None (optional)
  • spec: dict[str, Any]
  • unregistered_at: AwareDatetime | None (unregisteredAt on the wire) (optional)
  • active: int
  • retired: int
  • data: list[kindgi.client.TestSet]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)

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 (testSetId on the wire)
  • version: str
  • from_: AwareDatetime (from on the wire)
  • to: AwareDatetime
  • user_id: str (userId on the wire)
  • expires_at: AwareDatetime (expiresAt on the wire)
  • id: str
  • project_id: uuid.UUID | None (projectId on the wire) (optional)
  • description: str
  • version: 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 (mcpEndpoint on the wire) (optional)
  • metadata: dict[str, Any] | None (optional)
  • mutating: bool | None (optional)
  • needs_approval_when_unattended: bool | None (needsApprovalWhenUnattended on the wire) (optional)
  • pauses: bool | None (optional)
  • stores_files: bool | None (storesFiles on the wire) (optional)
  • reads_files: bool | None (readsFiles on the wire) (optional)
  • result_is_outside_data: bool | None (resultIsOutsideData on 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 (needsSpec on the wire) (optional)
  • code_artifact_ref: Optional[Annotated[kindgi.client.CodeArtifactRefOci | kindgi.client.CodeArtifactRefFilesystem | kindgi.client.CodeArtifactRefUnrecognized, <kindgi.client._open.OpenUnion object at 0x108217450>]] (codeArtifactRef on the wire) (optional)
  • spec: kindgi.client.ToolSpec | None (optional)
  • unregistered_at: AwareDatetime | None (unregisteredAt on 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 (secretScopes on the wire) (optional)
  • tool_id: str (toolId on the wire)
  • invocation_id: str (invocationId on the wire)
  • data: list[kindgi.client.Tool]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)
  • 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)
  • max_retries: int | None (maxRetries on the wire) (optional)
  • retry_on: list[Annotated[Union[Literal['invalid-arguments', 'unknown-tool', 'tool-error'], str], <kindgi.client._open.OpenEnum object at 0x1073beed0>]] | None (retryOn on the wire) (optional)

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'] (notRead on the wire)
  • root: kindgi.client.ToolFileStoreAnswer1 | kindgi.client.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).

  • file: kindgi.client.FileValue

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'] (notStored on the wire)
  • name: str
  • optional: bool | None (optional)

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: str
  • version: str
  • env_name: str (envName on the wire)
  • name: str
  • root: kindgi.client.HttpToolSpec
  • data: list[kindgi.client.ToolVersionRow]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)
  • id: str
  • project_id: uuid.UUID | None (projectId on the wire) (optional)
  • description: str
  • version: 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 (mcpEndpoint on the wire) (optional)
  • metadata: dict[str, Any] | None (optional)
  • mutating: bool | None (optional)
  • needs_approval_when_unattended: bool | None (needsApprovalWhenUnattended on the wire) (optional)
  • pauses: bool | None (optional)
  • stores_files: bool | None (storesFiles on the wire) (optional)
  • reads_files: bool | None (readsFiles on the wire) (optional)
  • result_is_outside_data: bool | None (resultIsOutsideData on 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 (needsSpec on the wire) (optional)
  • code_artifact_ref: Optional[Annotated[kindgi.client.CodeArtifactRefOci | kindgi.client.CodeArtifactRefFilesystem | kindgi.client.CodeArtifactRefUnrecognized, <kindgi.client._open.OpenUnion object at 0x108232d90>]] (codeArtifactRef on the wire) (optional)
  • spec: kindgi.client.ToolSpec | None (optional)
  • unregistered_at: AwareDatetime | None (unregisteredAt on 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 (secretScopes on the wire) (optional)
  • root: str
  • yes_weight: float (yesWeight on the wire)
  • total_weight: float (totalWeight on the wire)

The improve schedule and fire that started it (GET /v1/schedules/{triggerId}/fires); absent for an Improve run a person started.

  • trigger_id: str (triggerId on the wire)
  • fire_id: str (fireId on the wire)
  • kind: Union[Literal['user', 'service'], str]
  • id: str
  • display_name: str | None (displayName on the wire) (optional)
  • is_project_account: Optional[Literal[True]] (isProjectAccount on the wire) (optional)
  • key_id: str (keyId on the wire)
  • algorithm: Optional[Literal['ed25519']] (optional)
  • public_key: str (publicKey on the wire)
  • label: str | None (optional)

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 (keyId on the wire)
  • tenant_id: uuid.UUID (tenantId on the wire)
  • algorithm: Union[Literal['ed25519'], str]
  • public_key: str (publicKey on the wire)
  • label: str | None (optional)
  • created_at: AwareDatetime (createdAt on the wire)
  • revoked_at: AwareDatetime | None (revokedAt on the wire) (optional)
  • revoked_reason: str | None (revokedReason on the wire) (optional)
  • data: list[kindgi.client.TrustedSigningKey]
  • next_cursor: str | None (nextCursor on the wire) (optional)
  • has_more: bool (hasMore on the wire)
  • max_steps: int | None (maxSteps on the wire) (optional)
  • max_cost_usd: float | None (maxCostUsd on the wire) (optional)
  • max_wall_ms: int | None (maxWallMs on the wire) (optional)
  • root: str

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)