# agent: Add ask_user tool using elicitation forms \(\#61497\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/632d805d64808179ebd45dd9dda6b2299f5691c5)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 632d805d64808179ebd45dd9dda6b2299f5691c5

Requested commit: 632d805d64808179ebd45dd9dda6b2299f5691c5

Commit: 632d805d64808179ebd45dd9dda6b2299f5691c5

Tree: 7316eaff7cb48e71d4b6304f8a633949e7b61555

Author: Ethan Williams

Committer: GitHub

## Message

```
agent: Add ask_user tool using elicitation forms (#61497)

## Summary

Adds a first-party `ask_user` tool to Zed's native agent
(`crates/agent`) that lets the agent ask the user a question and get an
answer back through a proper **elicitation form** rather than free-form
chat text.

This is a step towards the interactive-question experience requested in
[discussion
#48784](https://github.com/zed-industries/zed/discussions/48784)
(implement the ACP elicitation spec for agent questions). Zed already
renders elicitation forms client-side; this wires the native agent up to
that existing rail so the agent can drive single-select and/or free-text
prompts.

## What it does

The tool takes:

- `question` — the prompt shown to the user
- `options` — optional list of selectable choices (single-select)
- `allow_free_text` — whether the user may type a custom answer instead
of picking an option

The agent decides the shape of each question:

| `options` | `allow_free_text` | Result |
| --- | --- | --- |
| 2+ | `false` | Single-select only |
| 2+ | `true` | Single-select with a free-text "other" field |
| empty | `true` | Free-text only |

A typed answer takes precedence over a selected option, and the tool
always resolves (a cancelled or failed elicitation is reported back to
the agent rather than hanging).

## Demo



https://github.com/user-attachments/assets/9d438d87-af65-4fa2-b500-b1232007d0a0


## Implementation

- `thread.rs` — new `ThreadEvent::Elicitation(ElicitationRequest)`
variant plus `ToolCallEventStream::request_elicitation`, mirroring the
existing `prompt_for_decision` permission rail.
- `agent.rs` — handles the elicitation event by building a
session-scoped `acp::CreateElicitationRequest` and routing it through
`AcpThread::request_elicitation`, piping the response back to the tool.
- `tools/ask_user_tool.rs` — the tool itself, including schema
construction and response extraction.
- Registered in the `write` and `ask` profiles and excluded from the
tool-permissions setup UI.

No client-side UI changes were needed — the existing elicitation form
rendering handles it.

## Tests

`cargo test -p agent ask_user` — 5 unit tests covering schema
construction, validation, and accept/decline/cancel handling.

Release Notes:

- Added an `ask_user` tool that lets the agent ask the user a question
with selectable options and/or free-text input, rendered as an
elicitation form
```

## Parents

- [6c706fb928a70ccd298545c96a573987ab2d34db](https://git.cafe/gitcafe/zed/commit/6c706fb928a70ccd298545c96a573987ab2d34db?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/632d805d64808179ebd45dd9dda6b2299f5691c5?format=markdown)
