Streamlit聊天机器人:将发送触发方式改为Enter键并保留原有功能的代码修改咨询
Streamlit聊天机器人:将发送触发方式改为Enter键并保留原有功能的代码修改咨询
我明白你想要把Streamlit聊天机器人的发送方式从点击按钮改成按Enter键,同时保留现有的混合输入(文本+文件)、文件仅首次处理、发送后清空文本这些功能。咱们可以通过调整text_input的触发逻辑,把原来按钮的功能整合到回车触发的函数里,同时修正代码里的一些小问题,下面是具体的修改方案:
先修正原代码的变量问题,再整合回车触发逻辑
原代码里存在一些变量名不匹配的情况(比如定义了send_b但判断时用send_button,document和document_file混用),先统一这些变量,再把发送逻辑迁移到回车触发的函数中:
import streamlit as st # 假设你已经实现了以下文本提取函数 # from your_utils import extract_text_from_pdf, extract_text_from_docx # 初始化Session State if "user_input" not in st.session_state: st.session_state.user_input = [] if "document_processed" not in st.session_state: st.session_state.document_processed = False if "generated_document" not in st.session_state: st.session_state.generated_document = None if "last_uploaded_document" not in st.session_state: st.session_state.last_uploaded_document = None if "messages" not in st.session_state: st.session_state.messages = [] def submit_and_send(): input_text = st.session_state.widget.strip() # 检查是否有可发送的内容(文本或未处理的文件) has_valid_content = input_text or (st.session_state.file is not None and not st.session_state.document_processed) if not has_valid_content: return # 空内容不执行发送逻辑 combined_input = "" document = st.session_state.file # 处理文件:仅新上传或未处理的文件才提取文本 if document is not None and not st.session_state.document_processed: if document.type == "application/pdf": document_text = extract_text_from_pdf(document) elif document.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document": document_text = extract_text_from_docx(document) else: st.error("Unsupported file type.") document_text = "" combined_input += document_text st.session_state.document_processed = True # 标记文件为已处理 # 添加文本输入内容 if input_text: # 如果已有文件内容,换行分隔文本和文件内容 combined_input = f"{combined_input}\n{input_text}" if combined_input else input_text # 保存用户输入到消息历史 st.session_state.messages.append({"role": "user", "text": combined_input}) # log_user_action(f"User sent a message: {combined_input}", username) # 保留你的日志逻辑 # 清空文本输入框 st.session_state.widget = "" # 文本输入框:绑定回车触发的函数,按Enter就会执行submit_and_send st.text_input("Type your message...", key="widget", on_change=submit_and_send) # 文件上传器 st.file_uploader("", type=["pdf", "docx"], label_visibility="collapsed", key="file", help="Upload your file.") # 追踪文件上传状态:新文件重置处理标记 current_file = st.session_state.file if current_file != st.session_state.last_uploaded_document: st.session_state.document_processed = False st.session_state.last_uploaded_document = current_file # 移除原来的Send按钮,现在用Enter键即可发送 # send_b = st.button("Send", on_click=submit)
关键修改点说明
- 回车触发逻辑:给
st.text_input添加on_change=submit_and_send参数,用户输入文本后按Enter会自动触发发送函数,完全替代原有的Send按钮。 - 整合发送逻辑:把原Send按钮里的组合输入、文件文本提取、消息历史存储等逻辑全部整合到
submit_and_send函数中,确保回车触发时执行所有必要操作。 - 保留核心功能:
- 依然会追踪上传的文件,只有新文件才重置
document_processed状态,避免重复处理同一文件; - 发送后自动清空文本输入框;
- 支持文本+文件的混合输入,自动组合成统一内容发送给Agent。
- 依然会追踪上传的文件,只有新文件才重置
- 修正变量混乱:统一了代码中的变量名(比如直接用
st.session_state.file关联文件上传器),让代码逻辑更清晰易维护。
这样修改后,你就可以直接按Enter键发送混合内容,同时完全保留原来的所有功能啦。
备注:内容来源于stack exchange,提问作者Thiyo fernando
相关产品推荐
相关产品推荐

