Ask
You ask one question in natural language and get one combined answer with citations. The answer draws on the pack’s knowledge, connections, and data sources. You don’t choose between data and knowledge, and the pack doesn’t give you SQL to read.
Ask a question
Section titled “Ask a question”ask answers a question over one pack’s scope and returns it as an Action.
| Input | Type | Required | Meaning |
|---|---|---|---|
packId |
string | Yes | The pack’s id or slug, from list_packs. |
question |
string | Yes | The user’s question, word for word. Known questions are matched by their wording. A reworded question does not match. |
wait |
boolean | No | true waits up to about 55 seconds for the Action to stop running. false returns the Action as soon as it is created. The tool description gives the default for the connection. |
idempotencyKey |
string | No | A key you choose for this attempt, up to 200 characters. If you retry with the same key, you get back the Action the first attempt created, not a new one. |
Returns the Action with its actionId and status. A succeeded ask has the answer in output.answer with what it cites. An answer based on a query includes its rows in output.results, one entry per result the answer states. An answer based on a figure lists it in output.images.
A hard question can take longer than the wait and come back queued or running. This is normal. Call action_get with the actionId and waitSeconds (up to 55), and repeat until the status is final. declined is a deliberate refusal. error.message gives the reason.
Permission: any org member can ask the packs they can read.
“Ask the growth-metrics pack how many active wallets we had last week.”
edisyl ask <pack> "<question>" [flags]<pack> accepts a slug, a name (case-insensitive), or a UUID. Find one with edisyl pack list.
edisyl ask growth-metrics "What counts as an active wallet?" --waitedisyl ask <pack-uuid> "Which suppliers slipped on lead time?" --wait --timeout 10m| Flag | Behavior |
|---|---|
--wait |
Wait until the Action’s next stop and print the result. The result is the answer with its evidence, or a batch of clarifying questions. The server waits about 60 seconds. After that, the CLI keeps checking until --timeout. |
--timeout <duration> |
How long --wait keeps waiting after the server’s own wait ends. Default 5m. Increase it for slow data questions, for example --wait --timeout 20m. |
--id-only |
Print only the Action id. Use it in scripts, for example action_id=$(edisyl ask "$PACK" "…" --id-only). |
--cron "<expr>" |
Make this a recurring scheduled ask. 30-minute minimum interval. See Scheduling. |
--at <RFC3339> |
Run this ask once, at a future time. |
--name <label> |
Optional name for a schedule. Other schedule commands accept it or the id. |
-j, --json |
Machine-readable output. |
Without --wait, save the id and follow the Action:
action_id=$(edisyl ask "$PACK" "<slow data question>" --id-only)edisyl action watch "$action_id" # narrates progress, then prints the answeredisyl action get "$action_id" # read the final answer again, any timeAn ask ends with the same statuses as every Action. See Actions for the full lifecycle. An ask can also stop as waiting with a batch of clarifying questions.
ask does not make up answers. If a decline mentions a missing definition, it is a knowledge-miss. Fix it with teach. If a decline says it can’t find or resolve data (“no rows”, “couldn’t resolve”), it is a data-miss. Fix it with task. See Improving answers.
Answer a clarifying question
Section titled “Answer a clarifying question”When the pack cannot decide something by itself, the Action stops as waiting. It holds a batch of questions in waitingOn.request.questions. Each question has an id, a prompt, the options it allows (each with its own id), and whether free text is accepted. The answers must be the user’s own choices.
The assistant calls ask again, with your answer added to the question. It does not keep checking a waiting Action.
| Input | Type | Required | Meaning |
|---|---|---|---|
packId |
string | Yes | The same pack. |
question |
string | Yes | The original question, with only the user’s answer added to it. |
wait |
boolean | No | As for ask. |
idempotencyKey |
string | No | A new key for this attempt. A retried call with this key returns the Action this attempt created. |
Returns the Action, as for ask.
Permission: the same as ask: read access to the pack.
“I meant wallets that traded, not wallets that signed in.”
edisyl ask-reply <action-id> --request <request-id> --file answers.json [--wait]ask --wait and edisyl action get print the batch of questions with its request id:
edisyl ask growth-metrics "How many active wallets last week?" --wait# Status: waiting# Request: 7f2c…# [activity] Do you mean wallets that traded, or wallets that signed in?# Options:# traded Traded# signed_in Signed inAnswer the whole batch in one call. The same Action resumes where it stopped. The reply is not a new question, and it does not create a second Action.
edisyl ask-reply <action-id> --request <request-id> --file answers.json --waitecho '{"answers":[{"questionId":"activity","optionId":"traded","text":null}]}' \ | edisyl ask-reply <action-id> --request <request-id> --waitThe answers file looks like this:
{ "answers": [ { "questionId": "measure_basis", "optionId": "net", "text": null }, { "questionId": "window", "optionId": null, "text": "the last four weeks" } ]}Answer each question with an option id, with free text if the question accepts it, or with both. You don’t have to answer every question. For questions you skip, the run uses its own judgement. An Action asks at most two batches of questions.
| Flag | Behavior |
|---|---|
--request <id> |
Required. The id of the batch you are answering. ask and action get print it with the questions. The CLI refuses a reply to a batch that has been replaced, answered, or has expired. |
-f, --file <path> |
The answers JSON. Use - or a pipe to read it from stdin. |
--wait |
Wait until the next stop. That is the answer or a second batch. |
--timeout <duration> |
How long --wait keeps waiting after the server’s own wait ends. Default 5m. |
See why it answered that way
Section titled “See why it answered that way”The explanation shows:
- What to notice first, such as a period that falls outside the data.
- How each phrase of the question was read, and the field it became.
- The assumptions the pack made, and the gaps it could not fill.
- Each query it ran, with its SQL.
- The governed claims it relied on, quoted from their documents.
- The steps that ran, with their timings.
Only an ask on a pack that runs the current ask pipeline can be explained. For an earlier ask, the request is refused with a message that explains this.
explain_answer explains one ask. The assistant calls it when you ask why it gave an answer or you doubt an answer. It does not call it after every answer.
| Input | Type | Required | Meaning |
|---|---|---|---|
actionId |
string (UUID) | Yes | The actionId of the ask to explain. |
Returns the explanation, starting with its notices, and a url to the full page in edisyl. The assistant shows you the notices first and gives you the url.
“Why did it say 4,210 active wallets? That looks high.”
edisyl action explain <action-id> [flags]edisyl ask my_pack "What were net sales by channel last quarter?"edisyl action explain <action-id>edisyl action explain <action-id> --json # the whole explanation, for a scriptThe output ends with a link to the full explanation in edisyl. Each query shows its SQL, row count and time. Each stage shows its time, model calls and tokens.
| Flag | Behavior |
|---|---|
--quiet |
Print only the data: no hints, no banners. |
-j, --json |
The whole explanation as JSON. |
Read every row an answer rests on
Section titled “Read every row an answer rests on”An answer based on a query shows some of its rows next to the text. ask-rows reads all of them, up to the query’s row cap. Over MCP, an ask returns the rows it shows in output.results.
edisyl ask-rows <action-id> # every result the answer carriededisyl ask-rows <action-id> <query-run-id> --json # one resultWithout a query-run id, it reads every result in the answer, in the order the answer gives them. To find the query-run ids, read the answer’s results with edisyl action get <action-id> --json. A query-run id that the Action did not run returns not found. Anyone who can read the Action’s pack can read its rows. With --json, it prints {"actionId": "…", "results": [ … ]}. Each result has its columns, rows, rowCount, capped and truncated.
An answer based on a figure lists it under “Figures”. Download it with edisyl figures get.
Was this page helpful?
Thanks for the feedback.
