Actions
Actions are curated AI operations you run over a bucket’s data. Highlight an object, a set of objects, a table, or a vector collection, pick an action — summarize, classify, extract entities, translate, answer a question — and K3 runs it and hands back a structured result. Under the hood each action is a Scriptum template, filtered to the ones that fit what you selected and dispatched with the bucket, service account, org, and user context injected for you.
Actions are a control-plane surface: they live on k3-api, under the dodil.data.actions.v1 package and the ActionsService, reached over the same HTTP/JSON (api.data.dodil.io) and gRPC (rpc.data.dodil.io:443) doors as every other control op. K3 owns the selection model, context injection, and the run lifecycle; Scriptum stays the generic execution substrate underneath.
This is the action menu, not a chat agent. The proto once also declared a conversational
ChatTurnagent — it was never built and has been removed. The shipping surface is the curated-action menu:ListAvailableActions+RunAction, plus the queued dispatch and run-history calls below. Nothing on the site should point you at a chat RPC.
Where actions sit
| Plane | Control plane (k3-api) — the same host as buckets, sources, and pipelines |
| Package · service | dodil.data.actions.v1 · ActionsService |
| Proto | k3_actions.proto |
| Doors | https://api.data.dodil.io (HTTP/JSON) · rpc.data.dodil.io:443 (gRPC) |
| CLI | dodil data actions list · dodil data actions run |
An action’s inputs are resolved from two sources: the fields K3 fills from your selection (bucket, key(s), collection, table) and the per-action form params you supply (question, target_language, llm_model, …). K3 merges the form params on top of the selection-derived inputs before dispatch — you never assemble presigned URLs or fetch schemas yourself.
Selection — what you run an action over
Every action runs against a selection. The selection’s shape decides which actions are even offered (ListAvailableActions filters the catalog to actions whose (pillar, unit, cardinality) and content-type accept-lists match), and it maps to the action’s K3-filled inputs:
| Selection shape | Pillar | What it is | Example actions |
|---|---|---|---|
| Object (single key) | objects | One file/key in a bucket | object_qa, summarization, classification, invoice_parsing |
| Objects (N keys) | objects | N keys in the same bucket | objects_compare (N ≥ 2), objects_synthesis |
| Collection | vectors | A whole vector collection | collection_topic_map |
| Chunks (N chunk ids) | vectors | N chunks from one collection | chunks_synthesize_answer |
| Table | tables | A whole table in a bucket | table_qa |
| None (bucket only) | "" | Agentic — no highlighted target | plan_and_run |
The set of actions is server-driven — it comes from the Scriptum catalog filtered per selection, not a fixed list baked into the client. Enumerate it live rather than hard-coding ids; see Catalog.
Sync vs async, and the queued path
Every action carries an invoke hint:
sync— completes inline (default ~30s K3 deadline). The extraction/classification family runs this way.async— long-running (default ~10min); the caller streams progress and gets a terminal event when it finishes. Q&A, synthesis, and the agenticplan_and_runrun this way.
There are two dispatch styles for the same action:
- Streaming —
RunAction(POST /actions/run) keeps the dispatch on the HTTP connection and emits an NDJSON event stream (started→progress…→completed|failed). Good for one click. - Queued —
EnqueueAction/EnqueueBulkActionspublish the dispatch onto a work queue and returnrun_id(s) immediately. Built for fan-out — “100 files × 1 translation” is one bulk call returning 100run_ids. Watch a queued run withWatchActionRun, or pollListActiveRunsfor the in-flight snapshot.
Run history
Every dispatch — streamed or queued — writes a run manifest into the bucket under _actions/runs/{reverse_ts}_{run_id}/manifest.json. Small outputs land inline in the manifest; larger ones as a sibling output.{ext}; self-routing templates point at a warehouse table or an S3 key instead. A reverse-timestamp prefix makes “most recent N” a single ordered listing.
ListRecentActions/GetActionRunread the history (newest first).SaveActionOutputpromotes an ephemeral run’s output to a permanent S3 key or a warehouse table — the temp copy has a TTL, the promoted copy does not.
See API Reference for the full manifest and lifecycle.
In this section
- API Reference — every
ActionsServiceRPC + HTTP route, withproto/jsonpairs and the NDJSON stream shape - CLI Guide —
dodil data actions list·run - Catalog — the 13 shipping actions: id, purpose, selection kind, invoke mode
See also
- Pipelines — the automatic side of the same intelligence: rules that run templates on every upload, rather than on demand
- Object Storage — where object-selection actions read from
- Vector — collections and chunks that
collection_topic_map/chunks_synthesize_answerrun over - Conventions — auth headers, error envelope, using gRPC
- CLI Basics — install + common flags