본문으로 건너뛰기

스키마

📄️ AgentStepSpec

Workflow-agent call spec for an agent step. ``timeout_seconds`` is bounded on both ends deliberately. Without a lower bound a 0 or negative value passes storage validation and then fails the moment it reaches ``httpx``; without the upper bound a value above 300 is stored while never taking effect, because the agent control plane forwards with a fixed ``httpx.AsyncClient(timeout=300)`` and returns 504 first. Both are caught here as a 422 at save time rather than mid-batch. The 300 comes from that control-plane constant — if it moves, this moves with it.

📄️ Column

``default`` is the value that applies when nothing constrains this column: ``compile_query`` injects it as an ``op="="`` condition unless the query already constrains the column (a ``conditions`` entry or a clause of a named ``filters`` entry, whatever the operator). Engine-neutral — it lands in ``WHERE`` on a SQL target and in the ``$filter`` / service-parameter segment on the OData ones — and its main use is a control parameter whose value never varies with the question (a SAP BW scaling/currency variable, ``visible=False`` so the LLM can neither see nor fill it). It is a **canonical** value, never a natural-language surface form: value linking runs before compile, so an injected default never passes through it.

📄️ EntityParameter

Shared request and response schema. Request: Action parameter accepted in an action definition that selects rows of one entity type. The caller names the rows by primary key (one value, or a list of up to 200 when `cardinality` is `many`), or the parameter selects them with its `set` definition and the call sends no value. The rows are read again when the action runs, and `derive` adds computed columns to each row. Response: Action parameter returned in an action definition that selects rows of one entity type. The caller names the rows by primary key (one value, or a list of up to 200 when `cardinality` is `many`), or the parameter selects them with its `set` definition and the call sends no value. The rows are read again when the action runs, and `derive` adds computed columns to each row.

📄️ LinkRef

One co-retrieval ``links`` target — always explicit about what it points at. - ``{"category": "semantic.table", "id": "semantic.table.…"}`` — that table. - ``{"category": "semantic.ontology", "id": "semantic.ontology.…", "name": "contract"}`` — that one entity of it. The two halves are checked against each other: an ontology link without ``name`` is refused (there is no spelling for "the whole ontology"), and a table link with one is refused (the id already addresses the whole table).

📄️ OntologyAttribute

One entity attribute as the catalog shows it. ``key`` is server-derived from the EntityType schema (``metadata.keys``) and can never be hidden — the join axis has to stay in the frame. ``visible=False`` narrows the LLM surface only (catalog / ``match`` / result frame); traversal still reads the column. ``dictionary`` sits on the *display* attribute people type, never on the key: a matched surface resolves to the key (D6 — measured 0/2 with the dictionary on the key, the model matches aliases on ``label``). ``description`` is imported from the EntityType field's ``metadata.description`` and may be overridden by curation, which is what a model whose fields carry no metadata depends on: without it the catalog hands the LLM a bare physical name (``hbp_knd_cd``) and the only way to learn what its codes mean is to query for them. ``values`` / ``samples`` are the value-grounding pair ``Column`` already has and carry the same meanings — ``values`` the exhaustive low-card domain, ``samples`` illustrative examples that ground the literal format. Both are curator-owned: an EntityType schema has no such concept, so an import never supplies them and a sync never overwrites them. Both are suppressed in the catalog for a dictionary-backed attribute, exactly as they are on a column, because one leaked canonical code primes the model to emit codes instead of surface forms.

📄️ OntologyCondition

Shared request and response schema. Request: Ontology trigger condition accepted in a request. `target_id` names the subject entity or relation type whose row the trigger carries, `where` declares the membership predicate, and `evaluation` selects whether the condition wakes on a row event or on a `schedule` occurrence. Response: Ontology trigger condition returned by the API, reporting the subject type, the membership predicate, the trigger source, and the read-only `engine` derived from the declaration.

📄️ Op

Shared request and response schema. Request: One step of the `ops` list accepted in an ontology request. Set exactly one of `where`, `traverse`, `union`, `intersect`, `subtract`, or `derive`; `direction`, `depth`, `to`, and `alias` apply only with `traverse`. Response: One step of the `ops` list returned in a stored ontology request. Exactly one of `where`, `traverse`, `union`, `intersect`, `subtract`, or `derive` is set; `direction`, `depth`, `to`, and `alias` apply only with `traverse`.

📄️ Pin

``versions`` names the reading point exactly, per mirror table, for a reader going back to a state it has read before. A stamp is resolved to a version each time, and a later writer can put another version under a stamp that was already read — a resync stamps what it scanned with the LSN it read BEFORE scanning — so the same ``txn`` can come back as other rows. A version cannot. ``txn`` stays: it gates the read on the watermark, and it resolves a table ``versions`` does not name. What a bookmark is to every log reader — Kafka's offset, Iceberg's snapshot id, Delta's ``versionAsOf`` beside ``timestampAsOf``.

📄️ PipelineData

Shared request and response schema. Request: Pipeline port reference accepted in a pipeline definition. Exactly one of `dataset`, `entity`, `relation`, `source`, `view`, or `variable` must be set. Sources and views are input-only and are rejected for output ports. Variables are limited to Python steps, cannot be named `event` or `objects`, and do not support `version`, `row_filters`, or `column_masks`. Response: Pipeline port reference returned in a pipeline definition. Exactly one of `dataset`, `entity`, `relation`, or `variable` must be set because `source` and `view` are input-only. Variables are limited to Python steps, cannot be named `event` or `objects`, and do not support `version`, `row_filters`, or `column_masks`.

📄️ TemplateQuery

One sub-query within a compute TemplateItem. ``name`` addresses it in ``fetch`` (unique within the item); ``table_id`` binds it to the SemanticTable it compiles against; ``body`` is the parameterized query-object JSON (``QueryMetrics``/``QueryRows`` shape per ``tool``) with ``{{slot}}``/``{{param}}`` placeholders. ``body`` was ``query`` until. A field named ``query`` inside a thing the whole stack calls a query — the list is ``queries``, the entry is a "query spec", the errors say "sub-query" — leaves "the query" naming both the entry and its contents, and a caller composing one puts everything in the inner field: measured that for ``tool`` (125/164 recorded tool errors) and the ``table_id`` addendum measured it again.