Evaluation Dashboards
evaluation_dashboards
Methods
Create a dashboard bound to exactly one evaluation or evaluation group.
The request must set exactly one of evaluation_id or evaluation_group_id
(enforced as XOR) — supplying both or neither is rejected, and the referenced
evaluation or group must already exist in the caller's account or the call fails
with a not-found error. If template_dashboard_id is provided, the new dashboard
copies that template's widget_order and synchronously computes a result for each
of those widgets against the new dashboard's evaluation data before returning. Any
widget_order supplied is validated to contain only existing, non-duplicate widget
IDs. The dashboard is created and returned immediately; individual widgets are added
afterward through the widget sub-endpoints.
List dashboards in the caller's account, paginated, with optional filters.
Filter to a single evaluation with evaluation_id or to a group with
evaluation_group_id; passing both is rejected, since a dashboard is bound to one
or the other. tags matches case-insensitively (values are lowercased before
lookup), created_by_ids filters by creator identity, and search matches the
dashboard name and tags. Archived dashboards are excluded unless include_archived
is true. The returned items carry only the dashboards' own fields — widgets and
widget results are never embedded here; use the get-by-id endpoint with the
widgets/widget_results views to load those.
Fetch a single dashboard by ID within the caller's account.
By default only the dashboard's own fields are returned. Pass views=widgets
and/or views=widget_results to eagerly load the dashboard's widgets and their
last-computed results as nested relationships; without those views the widgets
and widget_results fields are omitted from the response entirely. Set
include_archived=true to retrieve a soft-deleted dashboard. Returns a not-found
error if no matching dashboard exists in the account.
Partially update a dashboard's name, description, tags, or widget_order.
Only these mutable fields can change — the dashboard's bound evaluation or group is
fixed at creation and cannot be reassigned here, and unset fields are left untouched
(partial-update semantics). Reorder existing widgets by sending a new widget_order,
whose entries are validated to be existing, non-duplicate widget IDs before the
update is applied; creating and attaching new widgets is done through the widget
sub-endpoints, not by editing widget_order. Archived dashboards cannot be updated
and return a not-found error.
Soft-delete a dashboard by setting its archived timestamp.
The dashboard row is retained and marked archived rather than physically removed, so
it stops appearing in default listings but can still be fetched with
include_archived=true; the archived dashboard is returned by this call. Associated
widgets and widget results are not deleted or detached. Returns a not-found error if
the dashboard does not exist in the caller's account.
Domain types
Widgets
evaluation_dashboards.widgets
Methods
Create a new widget, append it to the dashboard, and compute its result in one call.
The widget is persisted as its own entity, its ID is appended to the dashboard's
widget_order, and — unless it is a markdown or heading widget — its result is
computed synchronously against the dashboard's evaluation (or evaluation-group) data
before the response returns. Validation is type-specific: markdown requires
config.content, bar/histogram/donut/scatter require exactly one of
config.x_column or config.x_column_group, table configs with conditional
formatting are schema-validated, and all other chart types require a query. The
dashboard must exist and not be archived. A computation failure does not fail the
request: the widget is still created and returned with a result whose
computation_status is failed and an error_message set, while markdown and
heading widgets return a null result.
Update a widget's fields within this dashboard, using copy-on-write for shared widgets.
If the widget belongs only to this dashboard it is updated in place; if it is
referenced by more than one dashboard, a new widget is created with the updates
applied and swapped into this dashboard's widget_order, leaving the other
dashboards' copy untouched. The widget must already be in this dashboard's
widget_order, otherwise the call is rejected. The result is recomputed
synchronously when the query changes or when the widget was cloned; otherwise the
existing cached result is returned. For table widgets, conditional-formatting
column references are re-resolved against the (possibly updated) query on each save.
The dashboard must exist and not be archived.
Detach a widget from this dashboard without deleting the widget itself.
This removes the widget's ID from the dashboard's widget_order only; the
underlying widget entity and any computed widget results are left intact, so a widget
shared with other dashboards continues to work there. The widget must currently be in
this dashboard's widget_order, otherwise a not-found error is returned. Responds
with 204 No Content on success.
Domain types
Computed result for a widget - used in widget creation response
Response model for widget creation - includes widget and computed result
Widget types for dashboard visualizations
Filter clause with conditions connected by logical operators.
Conditions are evaluated left-to-right without precedence (no nesting/parentheses). Example: condition1 AND condition2 OR condition3 evaluates as ((condition1 AND condition2) OR condition3)
Example: { "conditions": [ {"column": "score", "operator": ">", "value": 0.5}, {"column": "category", "operator": "=", "value": "test"} ], "logicalOperators": ["AND"] }
Query that returns a single metric value (used for metric widgets).
Used for widget type: metric. Enforces exactly 1 aggregation in select. Returns: {"type": "metric", "data": ...}
Example SQL equivalent: SELECT AVG(score) as average_score FROM evaluation_items
Column in SELECT clause
Query that returns a series of records (used for table/bar/histogram/donut/scatter widgets).
Used for widget types: table, bar, histogram, donut, scatter. Returns: {"type": "series", "data": [...]}
Example SQL equivalent: SELECT category, AVG(score) as avg_score, COUNT(*) as count FROM evaluation_items WHERE score > 0.5 AND category = 'test' GROUP BY category ORDER BY avg_score DESC LIMIT 100