trubrics / streamlit-feedback

Collect user feedback from within your Streamlit app
MIT License
128 stars 13 forks source link

On submit is not working (it is not calling handle_feedback method) #35

Closed sivankumar86 closed 5 months ago

sivankumar86 commented 5 months ago

I am trying to add feedback button and capturing in the logs

Package streamlit==1.32.2 requests==2.31.0 streamlit-feedback==0.1.3

Code :

def handle_feedback(user_response, emoji=None):
    st.toast(f"Feedback submitted: {user_response}", icon=emoji)
    print(f"test : {user_response}")
    return user_response.update({"some metadata": 123})

feedback_kwargs = {
        "feedback_type": "thumbs",
        "on_submit":handle_feedback
        }
# Generate a new response if last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant" and st.session_state.messages[-1]["role"] != "system":
    with st.chat_message("assistant"):
        with st.spinner("Thinking..."):
            # log question
            # get response
            chat_history, output = generate_response(prompt)
            placeholder = st.empty()
            full_model_response = ''
            for item in output:
                full_model_response += item
                placeholder.markdown(full_model_response)
            placeholder.markdown(full_model_response)
            streamlit_feedback(
            **feedback_kwargs, key=f"feedback_{int(len(st.session_state.messages)/2)}")

    message = {"role": "assistant", "content": full_model_response}
    st.session_state.messages.append(message)
    streamlit_root_logger.info('=====================================================\n')
sivankumar86 commented 5 months ago

Adding code for testing " print("called upon feedback") " is not printing . i.e it is not getting called upon feedback



import streamlit as st

from streamlit_feedback import streamlit_feedback

def _submit_feedback(user_response, emoji=None):
    print("called upon feedback")
    st.toast(f"Feedback submitted: {user_response}", icon=emoji)
    return user_response.update({"some metadata": 123})

def chatbot_thumbs_app(streamlit_feedback, debug=False):
    st.title("💬 Chatbot")

    if "messages" not in st.session_state:
        st.session_state["messages"] = [
            {"role": "assistant", "content": "How can I help you?"}
        ]

    messages = st.session_state.messages

    for n, msg in enumerate(messages):
        st.chat_message(msg["role"]).write(msg["content"])

        if msg["role"] == "assistant" and n > 1:
            feedback_key = f"feedback_{int(n/2)}"

            if feedback_key not in st.session_state:
                st.session_state[feedback_key] = None

            streamlit_feedback(
                feedback_type="thumbs",
                optional_text_label="Please provide extra information",
                on_submit=_submit_feedback,
                key=feedback_key,
            )

    if prompt := st.chat_input():
        messages.append({"role": "user", "content": prompt})
        st.chat_message("user").write(prompt)

        if debug:
            st.session_state["response"] = "dummy response"
        else:
            if not openai_api_key:
                st.info("Please add your OpenAI API key to continue.")
                st.stop()
            else:
                openai.api_key = openai_api_key
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo", messages=messages
            )
            st.session_state["response"] = response.choices[0].message.content
        with st.chat_message("assistant"):
            messages.append(
                {"role": "assistant", "content": st.session_state["response"]}
            )
            st.write(st.session_state["response"])
            st.rerun()

def single_prediction_faces_app(streamlit_feedback, debug=False):
    st.title("LLM User Feedback with Trubrics")

    if "response" not in st.session_state:
        st.session_state["response"] = ""
    if "feedback_key" not in st.session_state:
        st.session_state.feedback_key = 0

    with st.sidebar:
        openai_api_key = st.text_input(
            "OpenAI API Key",
            key="chatbot_api_key",
            type="password",
            value=st.secrets.get("OPENAI_API_KEY"),
        )

    if not openai_api_key:
        st.info("Please add your OpenAI API key to continue.")
        st.stop()
    else:
        openai.api_key = openai_api_key

    prompt = st.text_area(
        label="Prompt",
        label_visibility="collapsed",
        placeholder="What would you like to know?",
    )
    button = st.button(f"Ask text-davinci-002")

    if button:
        if debug:
            st.session_state["response"] = "dummy response: " + prompt.strip()
        else:
            st.session_state["response"] = openai.Completion.create(
                model="text-davinci-002", prompt=prompt, temperature=0.5, max_tokens=200
            )
            st.session_state["response"] = (
                st.session_state["response"].choices[0].text.replace("\n", "")
            )
        st.session_state.feedback_key += 1  # overwrite feedback component

    if st.session_state["response"]:
        st.markdown(f"#### :violet[{st.session_state['response']}]")

        streamlit_feedback(
            feedback_type="faces",
            optional_text_label="Please provide extra information",
            align="flex-start",
            on_submit=_submit_feedback,
            key=f"feedback_{st.session_state.feedback_key}",
        )

def basic_app(streamlit_feedback, debug):
    st.title("Component demo")

    if "feedback_key" not in st.session_state:
        st.session_state.feedback_key = 0

    st.button("Random button")

    if st.button("Refresh feedback component"):
        st.session_state.feedback_key += 1  # overwrite feedback component

    multiline = st.toggle("Multiline", value=False)

    if multiline:
        feedback = streamlit_feedback(
            feedback_type="faces",
            # on_submit=_submit_feedback,
            key=f"feedback_{st.session_state.feedback_key}",
            optional_text_label="Please provide some more information",
            max_text_length=500,
            args=["✅"],
        )
    else:
        feedback = streamlit_feedback(
            feedback_type="faces",
            # on_submit=_submit_feedback,
            key=f"feedback_{st.session_state.feedback_key}",
            optional_text_label="Please provide some more information",
            args=["✅"],
        )

    if feedback:
        st.write(":orange[Component output:]")
        st.write(feedback)

def bare_bones_app(streamlit_feedback, debug):
    feedback = streamlit_feedback(feedback_type="faces", on_submit=_submit_feedback)

    if feedback:
        st.write(":orange[Component output:]")
        st.write(feedback)

def streaming_chatbot(streamlit_feedback, debug):

    st.title("💬 Streaming Chatbot")

    if "openai_model" not in st.session_state:
        st.session_state["openai_model"] = "gpt-3.5-turbo"

    if "messages" not in st.session_state:
        st.session_state.messages = []
    if "feedback_key" not in st.session_state:
        st.session_state.feedback_key = 0

    feedback_kwargs = {
        "feedback_type": "thumbs",
        "on_submit": _submit_feedback,
    }

    for n, msg in enumerate(st.session_state.messages):
        st.chat_message(msg["role"]).write(msg["content"])

        if msg["role"] == "assistant" and n > 1:
            feedback_key = f"feedback_{int(n/2)}"

            if feedback_key not in st.session_state:
                st.session_state[feedback_key] = None

            disable_with_score = (
                st.session_state[feedback_key].get("score")
                if st.session_state[feedback_key]
                else None
            )
            streamlit_feedback(
                **feedback_kwargs,
                key=feedback_key,
                disable_with_score=disable_with_score,
            )

    if prompt := st.chat_input("What is up?"):
        st.session_state.messages.append({"role": "user", "content": prompt})
        with st.chat_message("user"):
            st.markdown(prompt)
        with st.chat_message("assistant"):
            message_placeholder = st.empty()
            full_response = ""

            for response in ["helo"]:
                full_response += response
                message_placeholder.markdown(full_response + "▌")
            message_placeholder.markdown(full_response)
        st.session_state.messages.append(
            {"role": "assistant", "content": full_response}
        )
        streamlit_feedback(
            **feedback_kwargs, key=f"feedback_{int(len(st.session_state.messages)/2)}"
        )

streaming_chatbot(streamlit_feedback,debug=False)
``
sivankumar86 commented 5 months ago

need to add during msg update as well