# Models: E

> API models starting with E.

## `Edge`

- `from_: str` (`from` on the wire)
- `to: str`
- `kind: Union[Literal['caused-by', 'influenced-by', 'retrieved-from', 'invoked', 'produced', 'checked-against', 'waited-on', 'resumed-from'], str]`

## `EgressAddresses`

The IP addresses this deployment's calls to other sites come from, for a site that admits only known addresses. They're the same for every tenant on the deployment, so admitting them admits every tenant's calls: a site still checks its own credentials. They say where calls come from, not where they go. Absent when the deployment publishes none. An empty list: none of that kind.

- `server: list[str]`
- `deployments: list[str]`

## `EmailLink`

Present when the deployment emails sign-in links: a sign-in page offers "Email me a sign-in link". With `captchaSiteKey`, the request needs a Cloudflare Turnstile token (`x-captcha-response`).

- `captcha_site_key: str | None` (`captchaSiteKey` on the wire) (optional)

## `EnrollSiteBody`

- `code: str`
- `public_key: dict[str, Any]` (`publicKey` on the wire)

## `EnrollSiteResult`

- `site_id: uuid.UUID` (`siteId` on the wire)
- `audience: str`

## `EnvCollectionPage`

- `data: list[kindgi.client.EnvRecord]`
- `has_more: bool | None` (`hasMore` on the wire) (optional)
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `EnvDeleteResult`

- `deleted: bool`

## `EnvListPage`

- `data: list[kindgi.client.EnvRecord]`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `EnvRecord`

- `scope: kindgi.client.ScopeTenant | kindgi.client.ScopeOrg | kindgi.client.ScopeProject | kindgi.client.ScopeUnrecognized`
- `env_name: str` (`envName` on the wire)
- `name: str`
- `value: str`
- `revision: int`
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `updated_at: AwareDatetime` (`updatedAt` on the wire)
- `tags: dict[str, str] | None` (optional)

## `EnvSetInput`

- `scope: kindgi.client.ScopeTenant | kindgi.client.ScopeOrg | kindgi.client.ScopeProject | kindgi.client.ScopeUnrecognized`
- `env_name: str` (`envName` on the wire)
- `name: str`
- `value: str`
- `tags: dict[str, str] | None` (optional)
- `if_revision: int | None` (`ifRevision` on the wire) (optional)

## `EnvSetOutcome`

- `root: kindgi.client.EnvSetOutcomeOk | kindgi.client.EnvSetOutcomeRevisionConflict | kindgi.client.EnvSetOutcomeError`

## `EnvSetOutcomeError`

- `kind: Literal['error']`
- `code: str`
- `message: str`

## `EnvSetOutcomeOk`

- `kind: Literal['ok']`
- `record: kindgi.client.EnvRecord`

## `EnvSetOutcomeRevisionConflict`

- `kind: Literal['revision-conflict']`
- `current_revision: int` (`currentRevision` on the wire)

## `EnvSetRequest`

- `scope: Optional[Annotated[kindgi.client.ScopeTenant | kindgi.client.ScopeOrg | kindgi.client.ScopeProject | kindgi.client.ScopeUnrecognized, <kindgi.client._open.OpenUnion object at 0x108760490>]]` (optional)
- `env_name: str | None` (`envName` on the wire) (optional)
- `name: str | None` (optional)
- `value: str`
- `tags: dict[str, str] | None` (optional)
- `if_revision: int | None` (`ifRevision` on the wire) (optional)

## `Environment`

- `env_name: str` (`envName` on the wire)

## `EnvironmentOrder`

- `parent: kindgi.client.EnvironmentOrderParentTenant | kindgi.client.EnvironmentOrderParentOrg | kindgi.client.EnvironmentOrderParentUnrecognized`
- `entries: list[kindgi.client.EnvironmentOrderEntry]`

## `EnvironmentOrderEntry`

- `position: int`
- `project_id: str | None` (`projectId` on the wire) (optional)

## `EnvironmentOrderPage`

- `data: list[kindgi.client.EnvironmentOrder]`
- `has_more: bool` (`hasMore` on the wire)
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `EnvironmentOrderParentOrg`

- `kind: Literal['org']`
- `org_id: str` (`orgId` on the wire)

## `EnvironmentOrderParentTenant`

- `kind: Literal['tenant']`

## `EnvironmentOrderParentUnrecognized`

A `kind` this client doesn't know yet, from a newer runtime: the object as it came, every field kept.

- `kind: str`

## `EnvironmentOrderSetRequest`

- `project_ids: list[str]` (`projectIds` on the wire)

## `EnvironmentPage`

- `data: list[kindgi.client.Environment]`
- `has_more: bool` (`hasMore` on the wire)
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `Error`

- `code: str`
- `message: str`
- `details: dict[str, Any] | None` (optional)
- `request_id: str` (`requestId` on the wire)

## `EvalBaseline1`

What a comparison compares the candidate against: `'recorded'` (each case's recorded output, what was judged), a version (`{ agentId, version }`, replayed under the same rules), or the version live in a scope (`{ live: { 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`

## `EvalBaseline2`

What a comparison compares the candidate against: `'recorded'` (each case's recorded output, what was judged), a version (`{ agentId, version }`, replayed under the same rules), or the version live in a scope (`{ live: { projectId?, segments? } }`, `segments` a path in the project, coarse to fine). Only `'recorded'` runs today; the others are refused when the run starts.

- `live: kindgi.client.Live`

## `EvalComparison`

A comparison eval run's settings (a `judged` suite).

- `baseline: Union[Annotated[Union[Literal['recorded'], str], <kindgi.client._open.OpenEnum object at 0x107c4bdd0>], kindgi.client.EvalBaseline1, kindgi.client.EvalBaseline2]`
- `reads: Union[Literal['recorded', 'live'], str]`
- `repetitions: int`
- `k: int`
- `versions: kindgi.client.FlowVersionOverrides | None` (optional)
- `class_weights: Optional[Annotated[Union[Literal['as-recorded', 'restricted-only'], str], <kindgi.client._open.OpenEnum object at 0x107c4bdd0>]]` (`classWeights` on the wire) (optional)
- `overrides: kindgi.client.EvalOverrides | None` (optional)
- `sample: kindgi.client.EvalSample | None` (optional)
- `rescore_of: str | None` (`rescoreOf` on the wire) (optional)

## `EvalOverrides`

For an agent candidate: block content its replays run instead of the version's pinned content (an improvement pass'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 promotion.

- `settings: dict[str, dict[str, Any]] | None` (optional)
- `prompts: dict[str, kindgi.client.Prompts] | None` (optional)

## `EvalRun`

- `run_id: uuid.UUID` (`runId` on the wire)
- `tenant_id: uuid.UUID` (`tenantId` on the wire)
- `project_id: uuid.UUID | None` (`projectId` on the wire) (optional)
- `suite_id: str` (`suiteId` on the wire)
- `suite_version: str` (`suiteVersion` on the wire)
- `kind: Union[Literal['accuracy', 'pairwise', 'regression', 'human-review', 'benchmark', 'custom', 'judged'], str]`
- `agent_ref: kindgi.client.EvalRunAgentRef | None` (`agentRef` on the wire) (optional)
- `flow_ref: kindgi.client.EvalRunFlowRef | 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.EvalComparison | None` (optional)

## `EvalRunAgentRef`

- `agent_id: str` (`agentId` on the wire)
- `version: str | None` (optional)

## `EvalRunCollectionPage`

- `data: list[kindgi.client.EvalRun]`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)
- `has_more: bool` (`hasMore` on the wire)

## `EvalRunFlowRef`

- `flow_id: str` (`flowId` on the wire)
- `version: str | None` (optional)

## `EvalRunStatus`

- `root: Literal['pending', 'running', 'completed', 'failed', 'cancelled']`

## `EvalSample`

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 by judgment (the cases with a "no" and the others are split on their own, a stratum of two or more giving each part at least 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 promotion 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)

## `EvalSuite`

- `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', 'judged'], str]`
- `description: str | None` (optional)
- `spec: dict[str, Any]`
- `unregistered_at: AwareDatetime | None` (`unregisteredAt` on the wire) (optional)

## `EvalSuiteCollectionPage`

- `data: list[kindgi.client.EvalSuite]`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)
- `has_more: bool` (`hasMore` on the wire)

## `EvaluateProposalBody`

Compare the proposal's candidate on a test set. The first evaluation publishes the block version and derives the agent version (both serve nowhere until promoted).

- `suite_id: str` (`suiteId` on the wire)
- `objective: Optional[Literal['weightedYesShare', 'weightedPrecisionAtK']]` (optional)
- `reads: Optional[Literal['recorded', 'live']]` (optional)
- `repetitions: int | None` (optional)
- `k: int | None` (optional)
- `class_weights: Optional[Literal['as-recorded', 'restricted-only']]` (`classWeights` on the wire) (optional)
- `sample: kindgi.client.EvalSample | None` (optional)

## `Evidence`

The judged evidence behind each gated metric; for a metric with `maxDrop`, the baseline's too.

- `min_cases: int | None` (`minCases` on the wire) (optional)
- `min_weight: float | None` (`minWeight` on the wire) (optional)

## `Evidence1`

- `judgment_ids: list[str] | None` (`judgmentIds` on the wire) (optional)

## `EvidenceActor`

- `kind: Optional[Literal['user', 'agent', 'system', 'admin', 'external']]` (optional)
- `id: str | None` (optional)
- `ip_address: str | None` (`ipAddress` on the wire) (optional)
- `user_agent: str | None` (`userAgent` on the wire) (optional)

## `EvidenceKind`

- `root: str`

## `EvidenceOutcome`

- `root: Literal['allowed', 'denied', 'succeeded', 'failed', 'escalated']`

## `EvidenceProvenanceRef`

- `run_id: str | None` (`runId` on the wire) (optional)
- `node_id: str | None` (`nodeId` on the wire) (optional)
- `record_id: str | None` (`recordId` on the wire) (optional)

## `EvidenceSignature`

- `algorithm: Literal['ed25519']`
- `key_id: str` (`keyId` on the wire)
- `value: str`
- `signed_at: AwareDatetime` (`signedAt` on the wire)

## `EvidenceSubject`

- `kind: str | None` (optional)
- `id: str | None` (optional)

## `ExportAuditBundleBody`

Body for `POST /v1/approvals/{approvalId}/audit-bundle`, optional: no body signs with the active key. `includeMessages` adds the conversation messages of the approval's run.

- `signing_key_id: str | None` (`signingKeyId` on the wire) (optional)
- `include_messages: bool | None` (`includeMessages` on the wire) (optional)

## `ExportAuditBundleResult`

A decided approval's signed audit bundle. Body: `{ bundleSchemaVersion, approvalId, tenantId, subjectKind, subjectRef, requiredRole, status, createdAt, decidedAt?, decision, evidence: { guardrailResults?, messages? }, exportedAt }`.

- `approval_id: uuid.UUID` (`approvalId` on the wire)
- `kind: Optional[Literal['audit-bundle']]` (optional)
- `bundle: str`
- `bundle_schema_version: str` (`bundleSchemaVersion` on the wire)
- `algorithm: Union[Literal['ed25519', 'ecdsa-p256-sha256'], str]`
- `signing_key_id: str` (`signingKeyId` on the wire)
- `signature: str`
- `public_key: str` (`publicKey` on the wire)
- `canonicalization: Literal['sorted-key-json']`
- `exported_at: AwareDatetime` (`exportedAt` on the wire)

## `ExportComplianceEvidenceBody`

Optional: no body exports every exportable kind, signed with the active key.

- `signing_key_id: str | None` (`signingKeyId` on the wire) (optional)
- `filter: kindgi.client.Filter | None` (optional)

## `ExportComplianceEvidenceFilter`

Optional filter narrowing the export set. Composition is AND — every populated field must match. Absent / empty filter exports every record for the tenant.

- `run_id: str | None` (`runId` on the wire) (optional)
- `agent_id: str | None` (`agentId` on the wire) (optional)
- `flow_id: str | None` (`flowId` on the wire) (optional)
- `kind: str | None` (optional)
- `from_: AwareDatetime | None` (`from` on the wire) (optional)
- `to: AwareDatetime | None` (optional)

## `ExportProvenanceBody`

Optional: no body signs with the active key.

- `signing_key_id: str | None` (`signingKeyId` on the wire) (optional)
- `include_messages: bool | None` (`includeMessages` on the wire) (optional)

## `ExportProvenanceResult`

A run's signed provenance. Body: `{ bundleSchemaVersion, provenanceId, runId, tenantId, version, createdAt, flowRef?, dag: { nodes, edges }, messages?, callUsage?, exportedAt }`; `callUsage` is each model call's usage from the cost ledger, as it stood when signed.

- `run_id: uuid.UUID` (`runId` on the wire)
- `kind: Optional[Literal['provenance']]` (optional)
- `bundle: str`
- `bundle_schema_version: str` (`bundleSchemaVersion` on the wire)
- `algorithm: Union[Literal['ed25519', 'ecdsa-p256-sha256'], str]`
- `signing_key_id: str` (`signingKeyId` on the wire)
- `signature: str`
- `public_key: str` (`publicKey` on the wire)
- `canonicalization: Literal['sorted-key-json']`
- `exported_at: AwareDatetime` (`exportedAt` on the wire)

## `ExportSigningKey`

A public key this deployment signs exports with.

- `key_id: str` (`keyId` on the wire)
- `algorithm: Union[Literal['ed25519', 'ecdsa-p256-sha256'], str]`
- `public_key_pem: str` (`publicKeyPem` on the wire)
- `fingerprint: str`
- `active: bool`

## `ExportSigningKeyList`

- `data: list[kindgi.client.ExportSigningKey]`
