You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:13:07