Spaces:
Sleeping
Sleeping
File size: 11,730 Bytes
29b6bc4 7eb1fb9 1359a02 a245ee7 29b6bc4 7eb1fb9 f565471 5bf6ac7 653b1c0 5af0503 42de6fe d385e4b 5af0503 42de6fe 6da6133 5af0503 42de6fe d385e4b 42de6fe 5af0503 befce47 42de6fe 481e164 42de6fe 481e164 42de6fe 5af0503 42de6fe 3411c78 f565471 42de6fe f565471 befce47 5af0503 42de6fe f565471 ff8ac04 1a5e59e 42de6fe 653b1c0 2827a07 befce47 f565471 5bf6ac7 42de6fe 7eb1fb9 7d7d5bc 7eb1fb9 3029284 7eb1fb9 5c97131 7eb1fb9 42de6fe 7eb1fb9 42de6fe 7eb1fb9 bfc9a54 2827a07 00deb4e 42de6fe 5af0503 21504b7 b229b6a 21504b7 b229b6a 21504b7 b229b6a 21504b7 b229b6a 0d6e774 beb2493 4993b9c 0d6e774 4993b9c 0d6e774 4993b9c 0d6e774 21504b7 4993b9c 42de6fe 4993b9c 16a6f01 05d2323 e35061d 554e803 4993b9c 42de6fe 554e803 653b1c0 a47df97 aa7b3a1 e4ba9f3 653b1c0 6f1e86c 653b1c0 f630f1d 653b1c0 2827a07 befce47 653b1c0 0f46d61 653b1c0 2827a07 57ccf2c 5af0503 e36689f 00bd42e e36689f 94c332d d98fb67 653b1c0 bfc9a54 83bfc19 8000fad 00bd42e 8000fad 29b6bc4 8000fad 00bd42e 8000fad 0f46d61 81d4e26 653b1c0 0f46d61 1a5e59e 426dc72 5bf6ac7 5e06b4e 83bfc19 e4acc40 00bd42e e4acc40 1a5e59e 653b1c0 5e06b4e e4acc40 8de58dc befce47 5e06b4e befce47 5e06b4e befce47 5e06b4e c011795 1a5e59e d1ea71a eec8e5f 1571e20 42de6fe |
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
import gradio as gr
import requests
import json
import os
import markdown
from markdown.extensions.codehilite import CodeHiliteExtension
import markdown.extensions.fenced_code
API_URL = "https://host.palple.polrambora.com/pmsq"
sessions = {}
PRIMARY_SYSTEM_INSTRUCTIONS = "You are P-MSQ (Messaging Service Query), a friendly AI Chatbot that can help in any situations"
ASSISTANT_PIC_PATH = "https://huggingface.co/spaces/PLRMB/P-MSQ-API-PREVIEW/resolve/main/API.png"
USER_PIC_PATH = "https://huggingface.co/spaces/PLRMB/P-MSQ-API-PREVIEW/resolve/main/usr.png"
def render_avatars(userid):
try:
response = requests.post(
'https://host.palple.polrambora.com/userexistence',
json={
'userid': userid
},
timeout=10
)
if response.status_code == 200:
response_json = response.json()
return response_json["avatar"]["link"]
except Exception as e:
return None
except requests.exceptions.Timeout:
return None
def authorize(user, api_key, system_message):
test_data = {
"user": user,
"key": api_key
}
try:
response = requests.post(
"https://host.palple.polrambora.com/check_key_impv",
json=test_data,
)
if response.status_code == 200:
response_json = response.json()
avatar = render_avatars(user) or USER_PIC_PATH
if api_key not in sessions:
sessions[api_key] = {
"history": [],
"headers": {
"authorization": api_key,
"Content-Type": 'application/json'
},
"avatar": avatar,
"system_message": system_message
}
return True
elif response.status_code == 403:
return 403
else:
return False
except Exception as e:
return False
def respond(message, api_key, max_tokens, top_p, temperature):
session = sessions.get(api_key, {})
history = session.get("history", [])
headers = session.get("headers", {})
system_message = session.get("system_message", PRIMARY_SYSTEM_INSTRUCTIONS)
messages = []
for user_message, assistant_message, user_profile, assistant_profile, user_pic, assistant_pic in history:
if user_message:
messages.append({
"role": "user",
"content": user_message,
"profile": user_profile,
"picture": user_pic
})
if assistant_message:
messages.append({
"role": "assistant",
"content": assistant_message,
"profile": assistant_profile,
"picture": assistant_pic
})
data = {
"preferences": {
"max_char": max_tokens,
"temperature": temperature,
"top_p": top_p,
"system_message": system_message
},
"conversation_history": messages,
"input": message
}
response = requests.post(API_URL, headers=headers, data=json.dumps(data))
if response.status_code == 200:
response_json = response.json()
assistant_reply = response_json["msq"]["message"][0]
history.append((message, assistant_reply, "You", "P-ALPLE", sessions[api_key]["avatar"], ASSISTANT_PIC_PATH))
sessions[api_key]["history"] = history
return history, assistant_reply
else:
return history, "Error: " + response.json().get("error", "Unknown error occurred.")
def render_message(history):
messages_html = """
<div id="chatbox-container" class="chatbox" style="height: 400px; overflow: auto; border: 1px solid #262626; padding: 10px; background-color: #171717; display: flex; flex-direction: column-reverse;">
<div id="messages" style="display: block; margin-bottom: 10px;">"""
for user_message, assistant_message, user_profile, assistant_profile, user_pic, assistant_pic in history:
if user_message:
user_message_html = markdown.markdown(
user_message, extensions=["fenced_code", CodeHiliteExtension()]
)
messages_html += f"""
<div style='display: flex; align-items: center; margin-bottom: 10px;'>
<img src='{user_pic}' style='width: 40px; height: 40px; border-radius: 50%; margin-right: 10px;'>
<span style='color: white;'>{user_message_html}</span>
</div>"""
if assistant_message:
assistant_message_html = markdown.markdown(
assistant_message, extensions=["fenced_code", CodeHiliteExtension()]
)
messages_html += f"""
<div style='display: flex; align-items: center; margin-bottom: 10px;'>
<img src='{assistant_pic}' style='width: 40px; height: 40px; border-radius: 50%; margin-right: 10px;'>
<span style='color: white;'>{assistant_message_html}</span>
</div>"""
messages_html += """
</div>
</div>
<script>
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
let messages = document.querySelectorAll('#message-content');
messages.forEach((message) => {
message.innerHTML = DOMPurify.sanitize(message.innerHTML); // Sanitize HTML content
});
MathJax.typeset();
</script>
"""
return messages_html
def escape_html(unsafe_text):
return (
unsafe_text.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace('"', """)
.replace("'", "'")
)
js = """
console.log("hello")
"""
css="""
.chatbox {height: 400px; overflow: auto; border: 1px solid #262626; padding: 10px; background-color: #171717; display: flex; flex-direction: column-reverse;}
"""
with gr.Blocks(css=css, js=js) as demo:
with gr.Column(visible=True) as auth_view:
gr.Markdown("## P-MSQ Authorization")
gr.Markdown("P-MSQ is in closed alpha test! The model, api and more are subject to change.")
api_user_input = gr.Textbox(placeholder="snowflake", label="UserID", type='email')
api_key_input = gr.Textbox(placeholder="Enter your API key", label="Token", type='password')
auth_button = gr.Button("Authorize")
auth_status = gr.Textbox(label="Authorization Status", interactive=False)
with gr.Column(visible=False) as chat_view:
gr.HTML("""
<script type="text/javascript" id="MathJax-script" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.js">
</script>
""")
gr.Markdown("## P-MSQ Chat Interface")
chatbot_output = gr.HTML(elem_id="chatbox-container")
msg_input = gr.Text(
show_label=False,
placeholder="Type your message and press Shift+Enter...",
lines=2,
elem_id="input-text"
)
send_btn = gr.Button("Send")
regen_btn = gr.Button("Clear")
system_instructions_input = gr.Textbox(placeholder="Enter custom instructions (optional)",
label="Custom System Instructions",
lines=2)
save_instructions_btn = gr.Button("Save Instructions")
gr.Markdown("### Settings")
max_tokens = gr.Slider(minimum=1, maximum=2048, value=1024, step=1, label="Max new tokens")
top_p = gr.Slider(minimum=0, maximum=2, value=0.8, step=0.1, label="Top P")
temperature = gr.Slider(minimum=0.1, maximum=1, value=0.7, step=0.1, label="Temperature")
history_state = gr.State([])
last_message_state = gr.State("")
def user_interaction(message, history, api_key, max_tokens, top_p, temperature):
loading_message = history + [(message, "Loading...", "You", "P-ALPLE", sessions[api_key]["avatar"], ASSISTANT_PIC_PATH)]
yield render_message(loading_message), loading_message, ""
history, assistant_reply = respond(message, api_key, max_tokens, top_p, temperature)
yield render_message(history), history, ""
def regenerate_response(history, last_message, max_tokens, top_p, temperature):
return "", []
def clear_history(api_key):
if api_key in sessions:
sessions[api_key]["history"] = []
return "", []
def load_conversation(api_key):
session = sessions.get(api_key, {})
history = session.get("history", [])
return render_message(history), history
msg_input.submit(
user_interaction,
inputs=[msg_input, history_state, api_key_input, max_tokens, top_p, temperature],
outputs=[chatbot_output, history_state, msg_input],
)
send_btn.click(
user_interaction,
inputs=[msg_input, history_state, api_key_input, max_tokens, top_p, temperature],
outputs=[chatbot_output, history_state, msg_input],
)
regen_btn.click(clear_history,
inputs=[api_key_input],
outputs=[chatbot_output, history_state])
with gr.Column(visible=False) as blacklist_view:
gr.Markdown("## P-MSQ Authorization")
gr.Markdown("Your linked ID appears to be blacklisted, and your API Key is pending on removal, if you believe this is a mistake, please try reaching us out.")
def authorize_and_proceed(user, api_key):
if authorize(user, api_key, PRIMARY_SYSTEM_INSTRUCTIONS):
gr.Info("Loading, please wait.")
messages_html, history = load_conversation(api_key)
return (
gr.update(visible=False),
gr.update(visible=True),
messages_html,
history
)
elif authorize(user, api_key, PRIMARY_SYSTEM_INSTRUCTIONS) == 403:
return (
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
)
else:
gr.Warning("Incorrect userid/token")
return (
gr.update(visible=True),
gr.update(visible=False),
auth_status.update(value="Invalid userid/token")
)
def save_custom_instructions(api_key, custom_instructions):
if api_key in sessions:
gr.Info("Instructions updated, we recommend to start the new conversation to make it more efficient.")
sessions[api_key]["system_message"] = custom_instructions
return "Instructions updated!", gr.update(value="")
else:
gr.Warning("Your session has been expired, please refresh the page and login again.")
return "Session not found.", gr.update(value="")
auth_button.click(authorize_and_proceed, inputs=[api_user_input, api_key_input], outputs=[auth_view, chat_view, chatbot_output, history_state])
save_instructions_btn.click(save_custom_instructions, inputs=[api_key_input, system_instructions_input], outputs=auth_status)
demo.launch(show_api=False)
if __name__ == "__main__":
demo.queue = False |