Spaces:
Sleeping
Sleeping
# β Imports | |
from openai import OpenAI | |
import gradio as gr | |
import os | |
# β Load API key from Hugging Face Secrets (environment variables) | |
api_key = os.getenv("OPENROUTER_API_KEY") | |
if not api_key: | |
raise ValueError("β οΈ OPENROUTER_API_KEY not found. Add it in HF Spaces > Settings > Secrets.") | |
# β OpenRouter API client setup | |
client = OpenAI( | |
base_url="https://openrouter.ai/api/v1", | |
api_key=api_key, | |
) | |
# β Chat function using Kimi-K2 | |
def ask_kimi(prompt, history=None): | |
if history is None: | |
history = [] | |
messages = [{"role": "system", "content": "Wewe ni msaidizi mzuri wa kujifunza programu kwa Kiswahili."}] | |
for user, bot in history: | |
messages.append({"role": "user", "content": user}) | |
messages.append({"role": "assistant", "content": bot}) | |
messages.append({"role": "user", "content": prompt}) | |
completion = client.chat.completions.create( | |
model="moonshotai/kimi-k2:free", | |
messages=messages, | |
extra_headers={ | |
"HTTP-Referer": "https://your-site.com", | |
"X-Title": "NextDev Academy", | |
} | |
) | |
reply = completion.choices[0].message.content | |
history.append((prompt, reply)) | |
return reply, history | |
# β Optional inline CSS | |
custom_css = """ | |
<style> | |
body { | |
background-color: #f9f9f9; | |
} | |
.gradio-container { | |
max-width: 700px; | |
margin: auto; | |
} | |
.gradio-chatbot { | |
background-color: #eef2f7; | |
border-radius: 10px; | |
padding: 10px; | |
} | |
</style> | |
""" | |
# β Gradio UI with proper layout and "messages" type | |
with gr.Blocks() as demo: | |
gr.HTML(custom_css) # Inject custom styles | |
gr.Markdown("## π€ Kimi K2 Chatbot kwa Kiswahili (Powered by OpenRouter)") | |
chatbot = gr.Chatbot(label="Kimi K2", type="messages") | |
state = gr.State([]) | |
with gr.Row(): | |
msg = gr.Textbox( | |
placeholder="Uliza swali kuhusu programu au teknolojia...", | |
show_label=False, | |
scale=4 | |
) | |
submit = gr.Button("β‘οΈ Tuma", scale=1) | |
clear = gr.Button("π Anza upya") | |
# Chat submission logic - return updated chat history and clear input box | |
def user_submit(user_message, history): | |
response, updated_history = ask_kimi(user_message, history) | |
return updated_history, updated_history, "" | |
# Bind submit with Enter or button click | |
msg.submit(user_submit, [msg, state], [chatbot, state, msg]) | |
submit.click(user_submit, [msg, state], [chatbot, state, msg]) | |
clear.click(lambda: ([], [], ""), None, [chatbot, state, msg]) | |
# β Launch the app (do NOT use css= arg here) | |
demo.launch() | |