Spaces:
Sleeping
Sleeping
File size: 4,085 Bytes
af8b301 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | """
OSS Assistant — Streamlit app backed by Ollama (Qwen2.5 / Phi-3 / Llama3.2).
Run with:
streamlit run apps/oss_assistant.py
"""
from __future__ import annotations
import os
import sys
from pathlib import Path
# Ensure project root is on path
sys.path.insert(0, str(Path(__file__).parent.parent))
# Load .env if present
try:
from dotenv import load_dotenv
load_dotenv()
except ImportError:
pass
import streamlit as st
from apps.shared_ui import (
configure_page,
handle_chat_turn,
render_chat_history,
render_observability_dashboard,
render_sidebar_info,
)
from core.memory import ConversationMemory
from core.model_router import create_assistant
from core.observability import ObservabilityManager
from core.prompts import OSS_SYSTEM_PROMPT, PromptBuilder
from core.safety import SafetyFilter
from core.utils import setup_logging
setup_logging()
# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------
OSS_BACKEND = os.getenv("OSS_BACKEND", "ollama")
OSS_MODEL = os.getenv("OSS_MODEL", "qwen2.5:1.5b")
MAX_EXCHANGES = int(os.getenv("MAX_EXCHANGES", "8"))
# ---------------------------------------------------------------------------
# Page setup
# ---------------------------------------------------------------------------
configure_page("OSS Assistant — Qwen2.5", icon="🦙")
st.title("🦙 OSS Assistant")
st.caption(f"Powered by **{OSS_MODEL}** via **{OSS_BACKEND}**")
# ---------------------------------------------------------------------------
# Session state initialization
# ---------------------------------------------------------------------------
if "oss_memory" not in st.session_state:
st.session_state.oss_memory = ConversationMemory(
max_exchanges=MAX_EXCHANGES,
system_prompt=OSS_SYSTEM_PROMPT,
)
if "oss_obs" not in st.session_state:
st.session_state.oss_obs = ObservabilityManager()
if "oss_safety" not in st.session_state:
st.session_state.oss_safety = SafetyFilter(strict_mode=True)
if "oss_assistant" not in st.session_state:
with st.spinner(f"Loading {OSS_MODEL}..."):
try:
st.session_state.oss_assistant = create_assistant(
backend=OSS_BACKEND,
model_name=OSS_MODEL,
)
except Exception as e:
st.error(f"Failed to initialize OSS assistant: {e}")
st.stop()
memory: ConversationMemory = st.session_state.oss_memory
obs_manager: ObservabilityManager = st.session_state.oss_obs
safety_filter: SafetyFilter = st.session_state.oss_safety
assistant = st.session_state.oss_assistant
# ---------------------------------------------------------------------------
# Sidebar
# ---------------------------------------------------------------------------
settings = render_sidebar_info(
model_name=OSS_MODEL,
backend=OSS_BACKEND,
memory=memory,
obs_manager=obs_manager,
safety_filter=safety_filter,
)
# Apply safety mode setting
safety_filter.strict_mode = settings["strict_mode"]
# ---------------------------------------------------------------------------
# Main chat area
# ---------------------------------------------------------------------------
tab_chat, tab_obs = st.tabs(["💬 Chat", "📊 Observability"])
with tab_chat:
# Render existing conversation
render_chat_history(memory)
# Chat input
if user_input := st.chat_input("Ask me anything..."):
# Show user message immediately
with st.chat_message("user"):
st.markdown(user_input)
prompt_builder = PromptBuilder(system_prompt=OSS_SYSTEM_PROMPT)
handle_chat_turn(
user_input=user_input,
memory=memory,
prompt_builder=prompt_builder,
assistant=assistant,
safety_filter=safety_filter,
obs_manager=obs_manager,
backend=OSS_BACKEND,
stream=True,
)
with tab_obs:
render_observability_dashboard(obs_manager)
|