File size: 4,486 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
138
139
140
141
142
143
144
"""
Frontier Assistant — Streamlit app backed by Groq API (Llama 3.1-8B-Instant).

Run with:
    streamlit run apps/frontier_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 FRONTIER_SYSTEM_PROMPT, PromptBuilder
from core.safety import SafetyFilter
from core.utils import setup_logging

setup_logging()

# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------

FRONTIER_BACKEND = os.getenv("FRONTIER_BACKEND", "openai")
FRONTIER_MODEL = os.getenv("FRONTIER_MODEL", "llama-3.1-8b-instant")
MAX_EXCHANGES = int(os.getenv("MAX_EXCHANGES", "8"))

# ---------------------------------------------------------------------------
# Page setup
# ---------------------------------------------------------------------------

configure_page("Frontier Assistant — Llama 3.1-8B (Groq)", icon="🚀")

st.title("🚀 Frontier Assistant")
st.caption(f"Powered by **{FRONTIER_MODEL}** via **{FRONTIER_BACKEND} API**")

# ---------------------------------------------------------------------------
# API key check
# ---------------------------------------------------------------------------

api_key = os.getenv("OPENAI_API_KEY", "")
if not api_key:
    st.warning(
        "⚠️ **OPENAI_API_KEY not set.** "
        "Add it to your `.env` file or set it as an environment variable. "
        "The assistant will not work without it."
    )

# ---------------------------------------------------------------------------
# Session state initialization
# ---------------------------------------------------------------------------

if "frontier_memory" not in st.session_state:
    st.session_state.frontier_memory = ConversationMemory(
        max_exchanges=MAX_EXCHANGES,
        system_prompt=FRONTIER_SYSTEM_PROMPT,
    )

if "frontier_obs" not in st.session_state:
    st.session_state.frontier_obs = ObservabilityManager()

if "frontier_safety" not in st.session_state:
    st.session_state.frontier_safety = SafetyFilter(strict_mode=True)

if "frontier_assistant" not in st.session_state:
    try:
        st.session_state.frontier_assistant = create_assistant(
            backend=FRONTIER_BACKEND,
            model_name=FRONTIER_MODEL,
        )
    except Exception as e:
        st.error(f"Failed to initialize Frontier assistant: {e}")
        st.stop()

memory: ConversationMemory = st.session_state.frontier_memory
obs_manager: ObservabilityManager = st.session_state.frontier_obs
safety_filter: SafetyFilter = st.session_state.frontier_safety
assistant = st.session_state.frontier_assistant

# ---------------------------------------------------------------------------
# Sidebar
# ---------------------------------------------------------------------------

settings = render_sidebar_info(
    model_name=FRONTIER_MODEL,
    backend=FRONTIER_BACKEND,
    memory=memory,
    obs_manager=obs_manager,
    safety_filter=safety_filter,
)

safety_filter.strict_mode = settings["strict_mode"]

# ---------------------------------------------------------------------------
# Main chat area
# ---------------------------------------------------------------------------

tab_chat, tab_obs = st.tabs(["💬 Chat", "📊 Observability"])

with tab_chat:
    render_chat_history(memory)

    if user_input := st.chat_input("Ask me anything..."):
        with st.chat_message("user"):
            st.markdown(user_input)

        prompt_builder = PromptBuilder(system_prompt=FRONTIER_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=FRONTIER_BACKEND,
            stream=True,
        )

with tab_obs:
    render_observability_dashboard(obs_manager)