import gradio as gr import os from huggingface_hub import InferenceClient import huggingface_hub import logging from typing import List, Tuple logging.basicConfig(level=logging.INFO) # Debugging info hf_token = os.environ.get("ZEPHYR_BRIGHTSIDE_TOKEN") print("Hugging Face Hub version:", huggingface_hub.__version__) if not hf_token: print("❌ Hugging Face token not loaded. Check your Space secrets.") else: print("✅ Token loaded successfully.") client = InferenceClient("HuggingFaceH4/zephyr-7b-beta", token=hf_token) MAX_HISTORY_LENGTH = 20 MEMORY_WINDOW = 5 MAX_TOKENS = 1024 TEMPERATURE = 0.7 TOP_P = 0.95 def get_conversation_prompt(): return """You are Mr. Brightside, an endlessly positive, caring, and upbeat AI. Your job is to help the user see the bright side of any situation, no matter how bad it seems. Respond warmly and naturally. Use humor, kindness, or optimism to shift their perspective. Never dismiss their feelings — acknowledge them first, then gently guide them toward something good. Keep your replies short (2–4 sentences). Ask light questions or offer hopeful thoughts to keep the conversation going. You are not a therapist — you are a supportive and sunny companion who always looks on the bright side.""" def respond(message: str, chat_history: List[Tuple[str, str]]) -> Tuple[str, List[Tuple[str, str]]]: if not message.strip(): return "", chat_history try: api_messages = [{"role": "system", "content": get_conversation_prompt()}] for user_msg, bot_msg in chat_history[-MEMORY_WINDOW:]: api_messages.extend([ {"role": "user", "content": user_msg}, {"role": "assistant", "content": bot_msg} ]) api_messages.append({"role": "user", "content": message}) response = client.chat_completion( messages=api_messages, max_tokens=MAX_TOKENS, temperature=TEMPERATURE, top_p=TOP_P ) bot_message = response.choices[0].message.content updated_history = chat_history + [(message, bot_message)] return "", updated_history except Exception as e: import traceback traceback.print_exc() error_msg = f"[ERROR] {type(e).__name__}: {str(e)}" return "", chat_history + [(message, error_msg)] def get_avatar_url(): return "https://api.dicebear.com/7.x/lorelei/svg?seed=sunshine" custom_css = """ #voice-controls { margin-top: 1em; text-align: center; opacity: 0.5; font-size: 0.9rem; font-style: italic; } """ with gr.Blocks(theme=gr.themes.Soft(), css=custom_css) as demo: gr.Markdown(""" # ☀️ Mr. Brightside – Your Optimism Coach Talk to Mr. Brightside when things feel rough — he’s here to help you find the silver lining in any situation. """) avatar = get_avatar_url() chatbot = gr.Chatbot( height=400, bubble_full_width=True, show_copy_button=True, avatar_images=[None, avatar], scale=1, min_width=800 ) msg = gr.Textbox(placeholder="Tell Mr. Brightside what's going on...") with gr.Row(): submit = gr.Button("Send", variant="primary") clear = gr.Button("New Chat") msg.submit(fn=respond, inputs=[msg, chatbot], outputs=[msg, chatbot]) submit.click(fn=respond, inputs=[msg, chatbot], outputs=[msg, chatbot]) clear.click(lambda: [], None, chatbot, queue=False) clear.click(lambda: "", None, msg, queue=False) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)