Modals collect text input from the user. Open one with ctx.interaction.send_modal and handle the submission with @plugin.on_modal_submit:
Required manifest flag: Discord only accepts a modal as the first response, and the platform normally acknowledges slash commands for you before your handler runs. A command that opens a modal must opt out of that acknowledgement on its slash_commands entry:
{ "name": "feedback", "description": "Send feedback", "defer_on_dispatch": false }
With the flag set, call send_modal promptly (within Discord's 3-second window). Without it the modal is rejected with an API error.
from yourbot_sdk import TextInput
@plugin.on_slash_command("feedback")
def feedback_cmd(ctx: Context, event: dict):
ctx.interaction.send_modal(
title="Send Feedback",
custom_id="feedback_form",
fields=[
TextInput(
label="Subject",
custom_id="subject",
style="short", # "short" | "paragraph"
placeholder="Quick summary",
required=True,
max_length=100,
),
TextInput(
label="Details",
custom_id="details",
style="paragraph",
required=False,
max_length=2000,
# also available: value="…" to prefill, min_length=
),
],
)
@plugin.on_modal_submit("feedback_form")
def feedback_submitted(ctx: Context, event: dict):
values = event["modal_values"] # {"subject": "...", "details": "..."}
ctx.kv.set(f"feedback:{event['interaction_id']}", values)
ctx.interaction.respond(content="Thanks for the feedback!", ephemeral=True)