File size: 4,140 Bytes
94d49c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3cb63a5
 
 
 
 
 
 
94d49c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bbd8b79
 
 
 
 
94d49c9
 
 
 
 
bbd8b79
 
94d49c9
 
bbd8b79
 
 
94d49c9
 
 
 
 
 
 
 
3cb63a5
94d49c9
 
 
 
 
 
 
 
3cb63a5
94d49c9
 
 
 
3cb63a5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import streamlit as st
import requests
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Page configuration
st.set_page_config(
    page_title="DeepSeek Chatbot - ruslanmv.com",
    page_icon="🤖",
    layout="centered"
)

# Initialize session state for chat history
if "messages" not in st.session_state:
    st.session_state.messages = []

# Sidebar configuration
with st.sidebar:
    st.header("Model Configuration")

    # Dropdown to select model
    model_options = [
        "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
    ]
    selected_model = st.selectbox("Select Model", model_options, index=0)

    system_message = st.text_area(
        "System Message",
        value="You are a friendly Chatbot created by ruslanmv.com",
        height=100
    )

    max_tokens = st.slider(
        "Max Tokens",
        1, 4000, 512
    )

    temperature = st.slider(
        "Temperature",
        0.1, 4.0, 0.7
    )

    top_p = st.slider(
        "Top-p",
        0.1, 1.0, 0.9
    )

# Function to query the Hugging Face API
def query(payload, api_url):
    headers = {"Authorization": f"Bearer {st.secrets['HF_TOKEN']}"}
    logger.info(f"Sending request to {api_url} with payload: {payload}")
    response = requests.post(api_url, headers=headers, json=payload)
    try:
        response.raise_for_status()
        logger.info(f"Received response: {response.status_code}, {response.text}")
        return response.json()
    except requests.exceptions.RequestException as e:
        logger.error(f"HTTP Request failed: {e}")
        return None

# Chat interface
st.title("🤖 DeepSeek Chatbot")
st.caption("Powered by Hugging Face Inference API - Configure in sidebar")

# Display chat history
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# Handle input
if prompt := st.chat_input("Type your message..."):
    st.session_state.messages.append({"role": "user", "content": prompt})

    with st.chat_message("user"):
        st.markdown(prompt)

    try:
        with st.spinner("Generating response..."):
            # Prepare the payload for the API
            payload = {
                "inputs": {
                    "past_user_inputs": [msg["content"] for msg in st.session_state.messages if msg["role"] == "user"],
                    "generated_responses": [msg["content"] for msg in st.session_state.messages if msg["role"] == "assistant"],
                    "text": prompt
                },
                "parameters": {
                    "max_new_tokens": max_tokens,
                    "temperature": temperature,
                    "top_p": top_p,
                    "return_full_text": False
                },
                "system_prompt": system_message
            }

            # Log the full message parsed to the API
            logger.info(f"Full message sent to API: {payload}")

            # Dynamically construct the API URL based on the selected model
            api_url = f"https://api-inference.huggingface.co/models/{selected_model}"
            logger.info(f"Selected model: {selected_model}, API URL: {api_url}")

            # Query the Hugging Face API using the selected model
            output = query(payload, api_url)

            # Handle API response
            if output and isinstance(output, list) and len(output) > 0 and 'generated_text' in output[0]:
                assistant_response = output[0]['generated_text']
                logger.info(f"Generated response: {assistant_response}")

                with st.chat_message("assistant"):
                    st.markdown(assistant_response)

                st.session_state.messages.append({"role": "assistant", "content": assistant_response})
            else:
                logger.error(f"Unexpected API response or error: {output}")
                st.error("Error: Unable to generate a response. Please try again.")

    except Exception as e:
        logger.error(f"Application Error: {str(e)}", exc_info=True)
        st.error(f"Application Error: {str(e)}")