Ask the user to upload a file before continuing. If the user does not answer in time (see timeout), a TimeoutError will be raised or None will be returned depending on raise_on_timeout. If a project ID is configured, the messages will be uploaded to the cloud storage.

Attributes

content
str

Text displayed above the upload button.

accept
Union[List[str], Dict[str, List[str]]]

List of mime type to accept like ["text/csv", "application/pdf"] or a dict like {"text/plain": [".txt", ".py"]}. More infos here https://react-dropzone.org/#!/Accepting%20specific%20file%20types.

max_size_mb
int

Maximum file size in MB. Defaults to 2.

max_files
int

Maximum number of files to upload. Defaults to 1. Maximum value is 10.

timeout
int

The number of seconds to wait for an answer before raising a TimeoutError.

raise_on_timeout
bool

Whether to raise a socketio TimeoutError if the user does not answer in time.

Returns

response
List[AskFileResponse]
required

The files uploaded by the user.

Example

Ask for a text file
import chainlit as cl


@cl.on_chat_start
async def start():
    files = None

    # Wait for the user to upload a file
    while files == None:
        files = await cl.AskFileMessage(
            content="Please upload a text file to begin!", accept=["text/plain"]
        ).send()

    text_file = files[0]

    with open(text_file.path, "r", encoding="utf-8") as f:
        text = f.read()

    # Let the user know that the system is ready
    await cl.Message(
        content=f"`{text_file.name}` uploaded, it contains {len(text)} characters!"
    ).send()

You can also pass a dict to the accept parameter to precise the file extension for each mime type:

Ask for a python file
import chainlit as cl

file = await cl.AskFileMessage(
        content="Please upload a python file to begin!", accept={"text/plain": [".py"]}
      ).send()