Spaces:
Paused
Paused
| import gradio as gr | |
| from gradio_awsbr_mmchatbot import MultiModalChatbot | |
| from gradio.data_classes import FileData | |
| from bedrock_utils import MultimodalInputHandler | |
| # A function to call the multi-modal input for Anthropic Claude v3 sonnet using Bedrock boto3 | |
| async def get_response(text, file): | |
| # If there is a file uploaded, then we will send it to Anthropic Claude v3 sonnet. | |
| # If there is no file uploaded, then we will send the text to Anthropic Claude v3 sonnet. | |
| try: | |
| userMsg = { | |
| "text": text, | |
| "files": [{"file": FileData(path=file)}] | |
| } | |
| except: | |
| userMsg = { | |
| "text": text, | |
| "files": [] | |
| } | |
| # Define a variable to store the response from the Anthropic Claude v3 sonnet | |
| llmResponse = "" | |
| # Loop through the response from Anthropic Claude v3 sonnet, and append it to our llmResponse variable. | |
| async for x in MultimodalInputHandler(text, file).handleInput(): | |
| llmResponse += x | |
| yield [[userMsg, {"text": llmResponse, "files": []}]] | |
| # Yield the response from Anthropic Claude v3 sonnet. This is unecessary as we can just yield the llmResponse variable in an iterative fashion as above. | |
| # But just in case.... let's yield the entire response object as well and overwrite the messages in the Chatbot. | |
| """ | |
| response = { | |
| "text": llmResponse, | |
| "files": [] | |
| } | |
| yield [[userMsg, response]] | |
| """ | |
| # Defining Gradio Interface using Blocks Structure | |
| with gr.Blocks() as demo: | |
| # Give it a Title | |
| gr.Markdown("## Gradio - MultiModal Chatbot") | |
| # Define the Chat Tab | |
| with gr.Tab(label="Chat"): | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| # Set a variable equal to our MultiModalChatBot class | |
| chatBot = MultiModalChatbot(height=700, render_markdown=True, bubble_full_width=True) | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| # Set a variable equal to our user message | |
| msg = gr.Textbox(placeholder='What is the meaning of life?', show_label=False) | |
| with gr.Column(scale=1): | |
| # Set a variable equal to our file upload | |
| fileInput = gr.File(label="Upload Files") | |
| with gr.Column(scale=1): | |
| # Define our submit button and invoke our 'get_response' function when it's clicked. | |
| gr.Button('Submit', variant='primary').click(get_response, inputs=[msg,fileInput], outputs=chatBot) | |
| # Same function as above, but with the 'enter' key being pressed inside the gr.Textbox() component instead of the 'submit' button. | |
| msg.submit(get_response, inputs=[msg, fileInput], outputs=chatBot) | |
| if __name__ == '__main__': | |
| demo.queue().launch(share=True) |