Skip to main content

Streamlit component that allows you to create a chat prompt with paste and image attachment support

Project description

Streamlit Chat Prompt

PyPI PyPI - Downloads GitHub

A Streamlit component that provides a modern chat-style prompt with image attachment and paste support. This component was built to mimic the style of streamlit.chat_input while expanding functionality with images. Future work may include addition of speech-to-text input.

Author: Tyler House (@tahouse)

Demo

Features

  • 📝 Chat-style text input with multi-line support
  • 📎 Image attachment support via button or drag-and-drop
  • 📋 Paste image support (paste images directly from clipboard)
  • 🖼️ Image preview with ability to remove attached images
  • ⌨️ Submit with Enter key (Shift+Enter for new line)
  • 🎨 Automatic theme integration with Streamlit
  • 📱 Responsive design that works well on mobile and desktop
  • 🗜️ Automatic image compression/scaling to stay under size limits (customizable, default 5MB)
  • 📌 Optional pinned-to-bottom placement for main chat interface (one per app)
  • 🔄 Flexible positioning for use in dialogs, sidebars, or anywhere in the app flow
  • ✏️ Support for default/editable content - perfect for message editing workflows
  • 🔤 Smart focus management - automatically returns to text input after interactions

Installation

pip install streamlit-chat-prompt

Usage

import streamlit as st
from streamlit_chat_prompt import prompt

# Create a chat prompt
response = prompt(
    name="chat",  # Unique name for the prompt
    key="chat",   # Unique key for the component instance
    placeholder="Hi there! What should we talk about?",  # Optional placeholder text
    main_bottom=True,  # Pin prompt to bottom of main area
    max_image_size=5 * 1024 * 1024,  # Maximum image size (5MB default)
    disabled=False,  # Optionally disable the prompt
)

# Handle the response
if response:
    if response.message:
        st.write(f"Message: {response.message}")
    
    if response.images:
        for i, img in enumerate(response.images):
            st.write(f"Image {i+1}: {img.type} ({img.format})")

Examples

Here are some usage patterns, or check out rocktalk for a full working example.

  1. Main Chat Interface Main Chat Interface

    import base64
    from io import BytesIO
    import streamlit as st
    from streamlit_chat_prompt import PromptReturn, prompt, ImageData
    from PIL import Image
    
    
    st.chat_message("assistant").write("Hi there! What should we chat about?")
    
    prompt_return: PromptReturn | None = prompt(
        name="foo",
        key="chat_prompt",
        placeholder="Hi there! What should we chat about?",
        main_bottom=True,
    )
    
    if prompt_return:
        with st.chat_message("user"):
            st.write(prompt_return.message)
            if prompt_return.images:
                for image in prompt_return.images:
                    st.divider()
                    image_data: bytes = base64.b64decode(image.data)
                    st.markdown("Ussng `st.image`")
                    st.image(Image.open(BytesIO(image_data)))
    
                    # or use markdown
                    st.divider()
                    st.markdown("Using `st.markdown`")
                    st.markdown(f"![Hello World](data:image/png;base64,{image.data})")
    
  2. Dialog Usage and Starting From Existing Message Dialog Interface

    import base64
    from io import BytesIO
    import streamlit as st
    from streamlit_chat_prompt import PromptReturn, prompt, ImageData
    from PIL import Image
    
    with st.sidebar:
        st.header("Sidebar")
    
        if st.button("Dialog Prompt", key=f"dialog_prompt_button"):
            test_dg()
    
        if st.button(
            "Dialog Prompt with Default Value", key=f"dialog_prompt_with_default_button"
        ):
            with open("example_images/vangogh.png", "rb") as f:
                image_data = f.read()
                image = Image.open(BytesIO(image_data))
                base64_image = base64.b64encode(image_data).decode("utf-8")
                test_dg(
                    default_input=PromptReturn(
                        message="This is a test message with an image",
                        images=[
                            ImageData(data=base64_image, type="image/png", format="base64")
                        ],
                    ),
                    key="dialog_with_default",
                )
    

Component API

prompt()

Main function to create a chat prompt.

Parameters:

  • name (str): Unique name for this prompt instance
  • key (str): Unique key for the component instance
  • placeholder (str, optional): Placeholder text shown in input field
  • default (Union[str, PromptReturn], optional): Default value for the prompt. Can include text and images using the PromptReturn object type.
  • main_bottom (bool, optional): Pin prompt to bottom of main area (default: True)
  • max_image_size (int, optional): Maximum image size in bytes (default: 5MB)
  • disabled (bool, optional): Disable the prompt (default: False)

Returns:

Optional[PromptReturn]: Object containing message and images if submitted, None otherwise

PromptReturn

Object returned when user submits the prompt.

Properties:

  • message (Optional[str]): Text message entered by user
  • images (Optional[List[ImageData]]): List of attached images

ImageData

Object representing an attached image.

Properties:

  • type (str): Image MIME type (e.g. "image/jpeg")
  • format (str): Image format (e.g. "base64")
  • data (str): Image data as base64 string

Development

This repository is based on the Streamlit Component template system. If you want to modify or develop the component:

  1. Clone the repository

  2. Install development dependencies:

    pip install -e ".[devel]"
    
  3. Start the frontend development server:

    cd streamlit_chat_prompt/frontend
    npm install
    npm run start
    
  4. In a separate terminal, run your Streamlit app:

    streamlit run your_app.py
    

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

streamlit_chat_prompt-0.1.6.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

streamlit_chat_prompt-0.1.6-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file streamlit_chat_prompt-0.1.6.tar.gz.

File metadata

  • Download URL: streamlit_chat_prompt-0.1.6.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for streamlit_chat_prompt-0.1.6.tar.gz
Algorithm Hash digest
SHA256 d2f62a5b75e3e427cb4864f0939a0259540d9945e0960af871d30a92d9a47a3a
MD5 2b33e198ac1fd72bfd7c1f4be8de3847
BLAKE2b-256 e61b49b029b2646f7e8d4cc984bc975415de24440d05586ea65300d7512c6462

See more details on using hashes here.

Provenance

The following attestation bundles were made for streamlit_chat_prompt-0.1.6.tar.gz:

Publisher: workflow.yaml on tahouse/streamlit-chat-prompt

Attestations:

File details

Details for the file streamlit_chat_prompt-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for streamlit_chat_prompt-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 b2d9053262d7001d3d0222e523c0557374e78efee56341ff0e45903aa66ebd38
MD5 0d26428bea101c7fb3bb73f06f9b9abb
BLAKE2b-256 a65e8b976f0710a3314e33f5b0215d4a8f69a4adf0733566b4423aca24bfb416

See more details on using hashes here.

Provenance

The following attestation bundles were made for streamlit_chat_prompt-0.1.6-py3-none-any.whl:

Publisher: workflow.yaml on tahouse/streamlit-chat-prompt

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page