@deepseek-ai/dsh-tool-ask-user
Model-facing ask_user_question tool over ctx.userInteraction. It lets the model ask the human a concise question when it needs confirmation, a choice, or missing information before continuing.
Tool
ask_user_question accepts:
questions— required non-empty array of question objects.id— required stable id on each question, echoed in the answer.question— required question text for each question.header— optional short heading.options— optional choices withlabelanddescription. If recommending a choice, put it first and append(Recommended)to that label.multi_select— whether that question may return more than one selected option.
The tool calls ctx.userInteraction.ask() and returns JSON text shaped as { "answers": [{ "id": "...", "selected": ["..."], "custom": "..." }] }. selected contains option labels; custom is present only for a free-form answer and overrides selected choices.
Role
This is the consumer package for the user-interaction seam. It does not render UI and does not know how input is collected; it only translates model arguments into AskUserQuestionRequest and returns the human answer to the agent loop.
Model Experience
Tool schema
What the model sees: The model sees the generated ask_user_question schema, including question ids, prompts, headings, options, and multi-select flags.
Token effect: Fixed schema cost on every request where the tool is visible.
Tool-call history and result
What the model sees: The model's full questions remain in the assistant tool-call arguments. After the human answers, the next step sees compact JSON in the exact shape {"answers":[{"id":"<id>","selected":["<label>"],"custom":"<text>"}]}; custom is omitted when unused and selected can contain zero, one, or several labels. UI interaction while the call is pending is not model context.
Token effect: Arguments and answer JSON are data-dependent retained tokens; there is no token cost while waiting for the human.
Known Limitations and Deferred Work
- A pending question blocks the tool call until the human answers — the tool declares no
timeout-policybudget; cancellation rides the turn'sexec.signalonly. - Answers return as JSON text — the seam's structured
AskUserQuestionAnsweris serialized into the tool result rather than carried as typed content blocks.