ai_assistant / app.py
thabang077's picture
Update app.py
733c136 verified
Raw
History Blame Contribute Delete
6.35 kB
import gradio as gr
import random
from ai_module import (
ask_ai, PROVIDERS, DEFAULT_PROVIDER,
detect_suggested_provider,
)
from main import (
get_ai_joke, get_ai_roast,
MOODS,
)
VERSION = "1.3.0"
def chat(message, history, provider, mood):
msg = message.strip()
if not msg:
return "", history
lower = msg.lower()
if lower in ("joke", "jokes"):
setup, punchline = get_ai_joke()
reply = f"πŸ˜‚ **{setup}**\n\n{punchline}"
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": reply})
return "", history
if lower in ("roast", "roast me") or lower.startswith("roast "):
target = msg[6:].strip() if lower.startswith("roast ") and lower != "roast me" else "you"
roast = get_ai_roast(target)
reply = f"πŸ”₯ **[{target}]** {roast}"
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": reply})
return "", history
if lower == "providers":
lines = ["**Available AI Providers:**\n"]
for key, info in PROVIDERS.items():
active = " β—€ **active**" if key == provider else ""
lines.append(f"{info['icon']} **{info['label']}** β€” {info['tagline']} `{key}`{active}")
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": "\n".join(lines)})
return "", history
if lower == "moods":
lines = ["**Available Moods:**\n"]
for m, desc in MOODS.items():
lines.append(f"β€’ **{m}** β€” {desc[:60] + '…' if len(desc) > 60 else desc or 'Default tone'}")
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": "\n".join(lines)})
return "", history
if lower == "version":
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": f"πŸ€– AI CLI Assistant v{VERSION}"})
return "", history
if lower == "help":
help_text = (
"**Commands:**\n"
"β€’ `joke` β€” Get a random joke\n"
"β€’ `roast me` β€” Get roasted πŸ”₯\n"
"β€’ `roast <name>` β€” Roast someone by name\n"
"β€’ `providers` β€” List all AI providers\n"
"β€’ `moods` β€” List all moods\n"
"β€’ `version` β€” Show version\n\n"
"---\n\n"
"**πŸ”€ AI Providers β€” which one to use?**\n\n"
"🟒 **GPT-4o (chatgpt)** β€” Best all-rounder. Great for writing, research, summaries, and general questions. Use this when you're unsure.\n\n"
"🟑 **Qwen3 Coder 30B (mini)** β€” Built for code. Use it for writing functions, fixing bugs, explaining code, or anything programming-related.\n\n"
"πŸ”΅ **HuggingSpace Command-A (reasoning)** β€” Best for heavy thinking. Use it for math problems, logic puzzles, equations, and step-by-step reasoning.\n\n"
"πŸ’‘ **How to switch providers:** Use the **Provider** dropdown in the sidebar β€” just click it and pick one. "
"The assistant will also suggest the best provider automatically based on what you type."
)
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": help_text})
return "", history
# ── Smart provider suggestion ─────────────────────────────────
suggested = detect_suggested_provider(msg)
note = ""
if suggested and suggested != provider:
sug = PROVIDERS[suggested]
note = f"> πŸ’‘ *Tip: **{sug['icon']} {sug['label']}** is better for {sug['best_for']}. Switch AI provider in the sidebar.*\n\n"
# ── Ask AI ────────────────────────────────────────────────────
query = MOODS[mood] + msg
try:
response = ask_ai(query, provider=provider)
except Exception as e:
response = f"Error: {e}"
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": note + response})
return "", history
# ── UI β€” Gradio 6 compatible ──────────────────────────────────────
with gr.Blocks(title="πŸ€– AI CLI Assistant") as demo:
gr.Markdown("# πŸ€– AI CLI Assistant\nChat with multiple AI providers. Try `joke`, `roast me`, or `help`.")
with gr.Row():
with gr.Column(scale=1):
provider_dd = gr.Dropdown(
choices=list(PROVIDERS.keys()),
value=DEFAULT_PROVIDER,
label="πŸ”€ Provider",
info="Switch AI provider",
allow_custom_value=False,
)
mood_dd = gr.Dropdown(
choices=list(MOODS.keys()),
value="default",
label="🎭 Mood",
info="Change response style",
allow_custom_value=False,
)
gr.Markdown("**Quick Commands:**")
joke_btn = gr.Button("πŸ˜‚ Joke")
roast_btn = gr.Button("πŸ”₯ Roast Me")
help_btn = gr.Button("❓ Help")
with gr.Column(scale=3):
chatbot = gr.Chatbot(height=480, label="Chat")
with gr.Row():
msg_box = gr.Textbox(
placeholder="Ask anything or type a command…",
show_label=False,
scale=5
)
send_btn = gr.Button("Send", variant="primary", scale=1)
send_btn.click(chat, [msg_box, chatbot, provider_dd, mood_dd], [msg_box, chatbot])
msg_box.submit(chat, [msg_box, chatbot, provider_dd, mood_dd], [msg_box, chatbot])
joke_btn.click( lambda h, p, m: chat("joke", h, p, m), [chatbot, provider_dd, mood_dd], [msg_box, chatbot])
roast_btn.click(lambda h, p, m: chat("roast me", h, p, m), [chatbot, provider_dd, mood_dd], [msg_box, chatbot])
help_btn.click( lambda h, p, m: chat("help", h, p, m), [chatbot, provider_dd, mood_dd], [msg_box, chatbot])
demo.launch()