import streamlit as st import os from peft import PeftModel from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline st.set_page_config(page_title="MSC Multi-Agent", page_icon="đŸ€–", layout="wide") BASE = "Qwen/Qwen2.5-0.5B" MODEL_MAP = { "zeus-style": "Finish-him/zeus-style-sft-v1", "zeus-tools": "Finish-him/zeus-tools-sft-v1", "arquimedes-tutor": "MSC-Company/arquimedes-tutor-sft-v1", "atlas-dirtic": "Finish-him/atlas-dirtic-rag-v2", "pi-ai-knowledge": "Finish-him/pi-ai-knowledge-v1", "absurd-agent": "Finish-him/absurd-agent-sft-v1", "pi-claude-sessions": "Finish-him/pi-claude-sessions-rag-v1", } SYSTEMS = { "zeus-style": "VocĂȘ Ă© o Zeus, assistente pessoal amigĂĄvel. Use humor leve, empatia e proximidade. Frases curtas e diretas.", "zeus-tools": "VocĂȘ Ă© o Zeus com acesso a ferramentas. Responda com clareza tĂ©cnica e objetividade.", "arquimedes-tutor": "VocĂȘ Ă© o Arquimedes, tutor educacional paciente. ExplicaçÔes claras passo a passo. Seja didĂĄtico.", "atlas-dirtic": "VocĂȘ Ă© o Atlas, especialista DETRAN-RJ. Formal, preciso e detalhado. Terminologia tĂ©cnica.", "pi-ai-knowledge": "VocĂȘ Ă© o Alexandria, agente de contexto operacional. Analise logs e configuraçÔes.", "absurd-agent": "VocĂȘ Ă© o Absurd Agent, especialista em workflows durĂĄveis Postgres. TĂ©cnico e comparado.", "pi-claude-sessions": "VocĂȘ Ă© o Alexandria, conhece padrĂ”es do Pi Coding Agent. Analise CLI e sessĂ”es.", } @st.cache_resource def load_model(key): repo = MODEL_MAP.get(key, MODEL_MAP["zeus-style"]) with st.spinner(f"Carregando {key}..."): base = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype="auto", device_map="auto") tok = AutoTokenizer.from_pretrained(BASE) m = PeftModel.from_pretrained(base, repo) return pipeline("text-generation", model=m, tokenizer=tok, max_new_tokens=256, temperature=0.7, top_p=0.9) st.title("đŸ›ïž MSC Company — Specialist AI Agents") st.markdown("**Modelo base**: `Qwen/Qwen2.5-0.5B` + LoRA adapters | **Treinamento**: via HuggingFace Jobs (~40min/dia)") col1, col2 = st.columns([1, 3]) with col1: st.markdown("### đŸ€– Agente") model_key = st.selectbox("Selecionar", list(MODEL_MAP.keys()), index=0, key="model_select") st.markdown("---") st.markdown(f"**Estilo**: {SYSTEMS.get(model_key, 'Assistente Ăștil')[:100]}...") st.markdown(f"**RepositĂłrio**: `{MODEL_MAP[model_key]}`") st.markdown("---") st.caption("Powered by Qwen2.5-0.5B + LoRA") if st.button("🔄 Trocar Agente"): st.rerun() with col2: pipe = load_model(model_key) sys_p = SYSTEMS.get(model_key, "Assistente.") if "messages" not in st.session_state: st.session_state.messages = [] for msg in st.session_state.messages: with st.chat_message(msg["role"]): st.markdown(msg["content"]) if prompt := st.chat_input("Pergunte para o agente..."): st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) msgs = [{"role": "system", "content": sys_p}] for m in st.session_state.messages[:-1]: msgs.append({"role": m["role"], "content": m["content"]}) msgs.append({"role": "user", "content": prompt}) text = pipe.tokenizer.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True) out = pipe(text, return_full_text=False) response = out[0]["generated_text"] st.session_state.messages.append({"role": "assistant", "content": response}) with st.chat_message("assistant"): st.markdown(response) if st.button("đŸ—‘ïž Limpar Conversa"): st.session_state.messages = [] st.rerun()