import gradio as gr from huggingface_hub import InferenceClient # SETS UP CLIENT INTERFACE API client = InferenceClient() # SVG VAMPIRE ANIMATION CODE VAMPIRE_SVG = ''' ''' # CSS CODE FOR PAGE FORMAT CSS_CODE = ''' body { background-color: black; background-image: url("https://cdn-lfs-us-1.hf.co/repos/a0/07/a007bba5c9653bf1095ea160af5a759fb61317b65bfe49e88620d0bba2b69850/9dfdaefaae989cacd7f5c2784fd275a66570aecb36df5ef6251cb7b257055fef?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27CastleBackground.jpg%3B+filename%3D%22CastleBackground.jpg%22%3B&response-content-type=image%2Fjpeg&Expires=1730070063&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTczMDA3MDA2M319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy11cy0xLmhmLmNvL3JlcG9zL2EwLzA3L2EwMDdiYmE1Yzk2NTNiZjEwOTVlYTE2MGFmNWE3NTlmYjYxMzE3YjY1YmZlNDllODg2MjBkMGJiYTJiNjk4NTAvOWRmZGFlZmFhZTk4OWNhY2Q3ZjVjMjc4NGZkMjc1YTY2NTcwYWVjYjM2ZGY1ZWY2MjUxY2I3YjI1NzA1NWZlZj9yZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uPSomcmVzcG9uc2UtY29udGVudC10eXBlPSoifV19&Signature=EAVuGglXsBUEO3zPGIlNYAhbpnD89Y7LDZ6wbtURENSvpv-HD8SFeTgLJwhy53XzfKBk7pKD3doAbgpp4sjLQ5f5go5pz2sD6MGuiQopnMep%7E4jWlLbIWZ07IY7ajqZFQDNfASW1JULyl1xypSLf2LIoc9DqsZDW749C6-WYsBttvDn2PGc4H3mmT98wm7jjj1-YTQZPKKElq0XCK--aNcHvTzV%7Eh6T1v%7EUYDBvCIUgwAcyfDU70cM%7EnNWoLFvR07o37nL9D1i0j4rzlj5ypEEhqyXfogl%7E%7ENbQfLY3rkxCtWrOoWkgNuM4-cx8wDXUJ3AMlAdjb9bhVZYfejgzrcQ__&Key-Pair-Id=K24J24Z295AEI9"); background-repeat: no-repeat; background-position: center; background-position-y: -100px; } .vampire-container { width: 400px; /* Increased from 300px */ position: sticky; top: 20px; align-self: flex-start; display: flex; flex-direction: column; align-items: center; } .main-content { display: flex; justify-content: center; width: 100%; margin: 0; gap: 30px; /* Increased gap between chat and vampire */ } .title { color: #cc0000; font-size: 5rem; font-family: "Gothic", serif; text-align: center; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } .subtitle { color: #cc0000; font-size: 1.5rem; font-family: "Gothic", serif; text-align: center; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); margin-bottom: 20px; } .vampire-svg { background: rgba(0, 0, 0, 0.6); padding: 30px; /* Increased padding */ border-radius: 15px; /* Slightly larger radius */ box-shadow: 0 0 30px rgba(204, 0, 0, 0.3); /* Larger shadow */ } ''' # SYSTEM MESSAGE USED TO GIVE BOT PERSONALITY FIRST_SYSTEM_MESSAGE = ''' You are Count Dracula, the legendary vampire. Speak in an elegant, sophisticated manner with occasional dark humor. Occasionally mention your thirst for blood in a playful manner. In words that begin with the letter "w", replace the letter "w" with a "v". Occasionally end sentences with "Bleh." Keep your responses short, a paragraph at most. ''' # FUNCTION FOR CALLING HUGGINGFACEH4 API AND GETTING RESPONSES def respond(prompt: str, history): if not history: history = [{"role": "system", "content": FIRST_SYSTEM_MESSAGE}] history.append({"role": "user", "content": prompt}) yield history response = {"role": "assistant", "content": ""} for message in client.chat_completion( history, temperature=0.75, top_p=0.9, max_tokens=512, stream=True, model="HuggingFaceH4/zephyr-7b-beta" ): response["content"] += message.choices[0].delta.content or "" yield history + [response] # GENERATES PAGE FOR BOT with gr.Blocks(css=CSS_CODE) as demo: with gr.Column(elem_classes="main-content"): #PAGE TITLE gr.HTML('''

DRACULABOT

A Dracula Themed AI ChatBot

''') # MAIN CONTENT with gr.Row(): # COLUMN FOR CHATBOT SECTION with gr.Group(): chatbot = gr.Chatbot( height=600, label="Dracula", type="messages" ) prompt = gr.Textbox( max_lines=1, label="Chat Message", placeholder="Ask your question, Mortal" ) prompt.submit(respond, [prompt, chatbot], [chatbot]) prompt.submit(lambda: "", None, [prompt]) # COLUMN FOR DRACULA AVATAR gr.HTML(f'''
{VAMPIRE_SVG}
''') # LAUNCHES PAGE if __name__ == "__main__": demo.launch()