grokk / app.py
noumanjavaid's picture
Update app.py
9e6746e verified
import os
import streamlit as st
from openai import OpenAI
from typing import List, Dict, Optional
import random
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Advanced Styling and Cosmic Theme
st.set_page_config(
page_title="Grok Cosmic Companion",
page_icon="πŸš€",
layout="wide",
initial_sidebar_state="expanded"
)
def get_cosmic_background() -> str:
"""Generate a random cosmic gradient background."""
colors = [
"linear-gradient(135deg, #1e2ad2, #8e2de2)",
"linear-gradient(135deg, #ff6a00, #ee0979)",
"linear-gradient(135deg, #000428, #004e92)",
"linear-gradient(135deg, #2c3e50, #3498db)"
]
return random.choice(colors)
# Advanced CSS with Cosmic Design
st.markdown(f"""
<style>
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700&display=swap');
* {{
font-family: 'Orbitron', sans-serif !important;
}}
.stApp {{
background: {get_cosmic_background()};
background-attachment: fixed;
background-size: cover;
color: white;
}}
section[data-testid="stSidebar"] {{
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
}}
.main .block-container {{
background: rgba(0, 0, 0, 0.3);
border-radius: 15px;
padding: 20px;
backdrop-filter: blur(10px);
}}
/* Chat message styling */
.chat-message {{
background: rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 15px;
margin-bottom: 10px;
transition: all 0.3s ease;
}}
.chat-message:hover {{
transform: scale(1.02);
box-shadow: 0 0 20px rgba(255, 255, 255, 0.2);
}}
/* Input field styling */
.stTextInput > div > div > input {{
background: rgba(255, 255, 255, 0.1);
color: white;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 10px;
}}
/* Button styling */
.stButton > button {{
background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
color: white;
border: none;
padding: 10px 20px;
border-radius: 20px;
transition: all 0.3s ease;
text-transform: uppercase;
letter-spacing: 1px;
}}
.stButton > button:hover {{
transform: scale(1.1);
box-shadow: 0 0 20px rgba(255, 255, 255, 0.3);
}}
/* Title styling */
.cosmic-title {{
text-align: center;
font-size: 2.5rem;
margin-bottom: 2rem;
color: white;
text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
animation: glow 2s ease-in-out infinite alternate;
font-weight: 700;
}}
/* Header styling */
[data-testid="stHeader"] {{
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
}}
/* Select box styling */
.stSelectbox label,
.stSelectbox div[data-baseweb="select"] span {{
color: white !important;
}}
/* Markdown text styling */
div[data-testid="stMarkdownContainer"] {{
color: white;
}}
/* Sidebar text */
.sidebar .sidebar-content {{
font-weight: 500;
}}
/* Chat input styling */
.stChatInputContainer {{
padding-bottom: 20px;
}}
/* Chat message text */
.stChatMessage {{
font-weight: 400;
letter-spacing: 0.5px;
}}
/* Spinner text */
.stSpinner {{
font-weight: 500;
letter-spacing: 1px;
}}
@keyframes glow {{
from {{
text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
}}
to {{
text-shadow: 0 0 20px rgba(255, 255, 255, 0.8),
0 0 30px rgba(255, 255, 255, 0.6);
}}
}}
/* Additional elements */
button, input, optgroup, select, textarea {{
font-family: 'Orbitron', sans-serif !important;
}}
.streamlit-expanderHeader {{
font-family: 'Orbitron', sans-serif !important;
letter-spacing: 1px;
}}
.stAlert {{
font-family: 'Orbitron', sans-serif !important;
letter-spacing: 0.5px;
}}
</style>
""", unsafe_allow_html=True)
class AdvancedGrokChatApp:
def __init__(self):
"""Initialize the chat application with API configuration and personality modes."""
self.XAI_API_KEY: str = "xai-1HSpHLqxC3LnInrYpwAobgEVsjchUG0PP0adniSXWGQXwq6YfvcPto9MhsS6ouQtC4a4Dh2qqXmERgQQ"
try:
self.client = OpenAI(
api_key=self.XAI_API_KEY,
base_url="https://api.x.ai/v1"
)
except Exception as e:
st.error(f"πŸ›Έ Failed to initialize OpenAI client: {str(e)}")
st.stop()
self.personality_modes: Dict[str, str] = {
"Cosmic Philosopher": "You are a wise AI that speaks like a blend of Douglas Adams and Carl Sagan.",
"Intergalactic Comedian": "You are a witty AI that makes jokes about the universe's absurdities.",
"Scientific Oracle": "You provide deep scientific insights with poetic eloquence.",
"Space Explorer": "You are an adventurous AI exploring the mysteries of the cosmos."
}
self.current_mode: str = "Cosmic Philosopher"
self.messages: List[Dict[str, str]] = []
def generate_response(self, user_input: str) -> str:
"""Generate AI response based on user input and conversation history."""
try:
system_prompt = (
f"{self.personality_modes[self.current_mode]} "
"Respond creatively, with depth and a touch of cosmic wonder."
)
conversation = [
{"role": "system", "content": system_prompt}
] + self.messages + [
{"role": "user", "content": user_input}
]
response = self.client.chat.completions.create(
model="grok-beta",
messages=conversation,
temperature=0,
max_tokens=4096
)
return response.choices[0].message.content
except Exception as e:
st.error(f"πŸŒ‹ Cosmic Disruption: {str(e)}")
return "I apologize, but I'm experiencing a cosmic disturbance. Please try again."
def add_message(self, role: str, content: str) -> None:
"""Add a message to the conversation history."""
self.messages.append({"role": role, "content": content})
def save_conversation(self) -> str:
"""Save the conversation history to a string format."""
return "\n".join([f"{msg['role']}: {msg['content']}" for msg in self.messages])
def initialize_session_state() -> None:
"""Initialize or reset the session state."""
if 'chat_app' not in st.session_state:
st.session_state.chat_app = AdvancedGrokChatApp()
def main() -> None:
"""Main application function."""
st.markdown('<h1 class="cosmic-title">πŸš€ Grok: Cosmic Companion</h1>', unsafe_allow_html=True)
initialize_session_state()
# Sidebar with Advanced Controls
with st.sidebar:
st.header("🌌 Cosmic Controls")
# Personality Mode Selector
mode = st.selectbox(
"Choose Grok's Personality",
list(st.session_state.chat_app.personality_modes.keys())
)
st.session_state.chat_app.current_mode = mode
# Conversation Management
col1, col2 = st.columns(2)
with col1:
if st.button("πŸ”„ Reset Chat"):
st.session_state.chat_app.messages = []
st.success("✨ Conversation reset to cosmic zero!")
with col2:
if st.button("πŸ’Ύ Save Chat"):
conversation_text = st.session_state.chat_app.save_conversation()
st.download_button(
label="πŸ“₯ Download",
data=conversation_text,
file_name="cosmic_conversation.txt",
mime="text/plain"
)
# Chat Interface
chat_container = st.container()
with chat_container:
for msg in st.session_state.chat_app.messages:
with st.chat_message(msg['role'], avatar='πŸ€–' if msg['role'] == 'assistant' else 'πŸ‘€'):
st.markdown(msg['content'])
# User Input
if user_input := st.chat_input("🌟 Whisper your cosmic query..."):
# User Message
st.session_state.chat_app.add_message("user", user_input)
with st.chat_message("user", avatar='πŸ‘€'):
st.markdown(user_input)
# AI Response
with st.chat_message("assistant", avatar='πŸš€'):
with st.spinner("🌌 Traversing cosmic data streams..."):
response = st.session_state.chat_app.generate_response(user_input)
st.markdown(response)
st.session_state.chat_app.add_message("assistant", response)
if __name__ == "__main__":
main()