Spaces:
Runtime error
Runtime error
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() |