import gradio as gr
import requests
import json
import os
import markdown
import gradio as gr
import re
import markdown
from pygments import highlight
from pygments.lexers import HtmlLexer, PythonLexer, TextLexer
from pygments.formatters import HtmlFormatter
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 detect_content_type(message):
"""
Automatically detect whether the message contains Math, HTML, or plain Markdown.
Returns a tuple: (is_math, is_html)
"""
is_math = bool(re.search(r"(\$\$.*?\$\$|\$.*?\$)", message, re.DOTALL))
is_html = bool(re.search(r"<\/?[a-z][\s\S]*?>", message))
return is_math, is_html
def render_message(message):
"""
Render a message dynamically, detecting if it's Math, HTML, or Markdown with code.
"""
is_math, is_html = detect_content_type(message)
if is_math:
return gr.HTML(f"""
{message}
""")
elif is_html:
formatter = HtmlFormatter(style="default", noclasses=True)
highlighted_html = highlight(message, HtmlLexer(), formatter)
return gr.HTML(f"""
{highlighted_html}
""")
else:
def markdown_with_code_blocks(md):
html = markdown.markdown(md, extensions=["fenced_code"])
return html
formatted_message = markdown_with_code_blocks(message)
return gr.HTML(f"""
{formatted_message}
""")
def escape_html(unsafe_text):
"""Escape HTML special characters to prevent code injection."""
return (
unsafe_text.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace('"', """)
.replace("'", "'")
)
js = """
function HTMLClean() {
alert("This page is in-dev stage, expect lots of restarts, the interface is open-sourced (not the backend that is responsible for API Keys)")
}
"""
css="""
.chatbox {height: 400px; overflow: auto; border: 1px solid #262626; padding: 10px; background-color: #171717; display: flex; flex-direction: column-reverse;}
#chatbox-container .katex-display { display: inline; }
#chatbox-container .katex-display>.katex { display: inline; }
#chatbox-container .katex-display>.katex>.katex-html { display: inline; }
"""
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.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