Spaces:
Sleeping
Sleeping
import io | |
import base64 | |
import streamlit as st | |
import os | |
from openai import OpenAI | |
from PIL import Image | |
import requests | |
from io import BytesIO | |
import json | |
from streamlit_lottie import st_lottie | |
from streamlit_option_menu import option_menu | |
import time | |
# Set page configuration | |
st.set_page_config( | |
page_title="TeleGuide | AI Telecom Assistant", | |
page_icon="π°οΈ", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# Function to load Lottie animations | |
def load_lottie(url: str): | |
try: | |
r = requests.get(url) | |
if r.status_code != 200: | |
return None | |
return r.json() | |
except: | |
return None | |
# Apply custom CSS for styling and animations | |
st.markdown(""" | |
<style> | |
.stApp { | |
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); | |
} | |
.css-1r6slb0 { | |
background: white; | |
border-radius: 20px; | |
padding: 20px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
} | |
.main-header { | |
font-size: 2.5rem; | |
font-weight: 700; | |
color: #1E3D59; | |
text-align: center; | |
margin-bottom: 2rem; | |
animation: fadeIn 1.5s ease-in; | |
} | |
.stButton>button { | |
width: 100%; | |
border-radius: 10px; | |
background: linear-gradient(45deg, #2193b0, #6dd5ed); | |
color: white; | |
border: none; | |
padding: 0.5rem 1rem; | |
transition: all 0.3s ease; | |
} | |
.stButton>button:hover { | |
transform: translateY(-2px); | |
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | |
} | |
.stTextInput>div>div>input, | |
.stTextArea>div>div>textarea { | |
border-radius: 10px; | |
border: 2px solid #e0e0e0; | |
padding: 10px; | |
background-color: white; | |
} | |
.css-1d391kg { | |
background: linear-gradient(180deg, #1E3D59 0%, #2193b0 100%); | |
} | |
@keyframes fadeIn { | |
from { opacity: 0; transform: translateY(20px); } | |
to { opacity: 1; transform: translateY(0); } | |
} | |
.fade-in { | |
animation: fadeIn 1s ease-in; | |
} | |
.success-message { | |
padding: 1rem; | |
border-radius: 10px; | |
background-color: #d4edda; | |
color: #155724; | |
margin: 1rem 0; | |
} | |
.error-message { | |
padding: 1rem; | |
border-radius: 10px; | |
background-color: #f8d7da; | |
color: #721c24; | |
margin: 1rem 0; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Initialize OpenAI client with Hugging Face secrets for API key | |
def get_openai_client(): | |
try: | |
# Fetch the API key from Hugging Face secrets | |
api_key = st.secrets["api_key"] | |
return OpenAI(api_key=api_key, base_url="https://api.together.xyz") | |
except Exception as e: | |
st.error(f"Error initializing API client: {str(e)}") | |
return None | |
client = get_openai_client() | |
# Load animations | |
lottie_telecom = load_lottie("https://assets4.lottiefiles.com/packages/lf20_qz3tpn4w.json") | |
lottie_analysis = load_lottie("https://assets4.lottiefiles.com/packages/lf20_xh83pj1k.json") | |
# Process text query function | |
def process_text_query(query, model="meta-llama/Llama-3.2-3B-Instruct-Turbo"): | |
try: | |
with st.spinner("Processing your query..."): | |
response = client.chat.completions.create( | |
model=model, | |
messages=[ | |
{"role": "system", "content": "You are TeleGuide, an expert AI assistant specialized in telecommunication tasks. Provide detailed, practical, and accurate information."}, | |
{"role": "user", "content": query} | |
], | |
max_tokens=500, | |
temperature=0.7 | |
) | |
return response.choices[0].message.content | |
except Exception as e: | |
st.error(f"Error processing query: {str(e)}") | |
return None | |
# Process image query function | |
def process_image_query(image_base64, query, model="meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo"): | |
try: | |
with st.spinner("Analyzing image..."): | |
system_message = "You are TeleGuide, an expert AI assistant in telecommunications infrastructure analysis." | |
response = client.chat.completions.create( | |
model=model, | |
messages=[ | |
{"role": "system", "content": system_message}, | |
{ | |
"role": "user", | |
"content": [ | |
{"type": "text", "text": query}, | |
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"}} | |
] | |
} | |
], | |
max_tokens=500, | |
temperature=0.7 | |
) | |
return response.choices[0].message.content | |
except Exception as e: | |
st.error(f"Error analyzing image: {str(e)}") | |
return None | |
# Convert image to base64 | |
def image_to_base64(image): | |
try: | |
buffered = io.BytesIO() | |
image.save(buffered, format="JPEG") | |
return base64.b64encode(buffered.getvalue()).decode('utf-8') | |
except Exception as e: | |
st.error(f"Error converting image: {str(e)}") | |
return None | |
# Sidebar content | |
with st.sidebar: | |
st.title("π°οΈ TeleGuide") | |
st_lottie(lottie_telecom, height=200) | |
st.markdown("---") | |
st.info("Your AI-powered telecommunication assistant, providing expert analysis and insights.") | |
st.markdown("### Features") | |
st.markdown(""" | |
- π Text Analysis | |
- π Document Processing | |
- πΌοΈ Image Analysis | |
- π‘ Infrastructure Planning | |
""") | |
st.markdown("---") | |
st.markdown("#### Powered by Advanced AI") | |
st.caption("Using Llama 3.2 Models") | |
# Main content | |
st.markdown('<h1 class="main-header">Welcome to TeleGuide</h1>', unsafe_allow_html=True) | |
# Navigation menu | |
selected = option_menu( | |
menu_title=None, | |
options=["Text Analysis", "Document Processing", "Image Analysis"], | |
icons=["chat-dots", "file-text", "image"], | |
menu_icon="cast", | |
default_index=0, | |
orientation="horizontal", | |
styles={ | |
"container": {"padding": "0!important", "background-color": "transparent"}, | |
"icon": {"color": "#1E3D59", "font-size": "25px"}, | |
"nav-link": { | |
"font-size": "20px", | |
"text-align": "center", | |
"margin": "0px", | |
"--hover-color": "#eee", | |
}, | |
"nav-link-selected": {"background-color": "#2193b0", "color": "white"}, | |
} | |
) | |
# Handle different options from the navigation menu | |
if selected == "Text Analysis": | |
st.markdown("### π¬ Text Analysis") | |
st_lottie(lottie_analysis, height=200) | |
query = st.text_area("Enter your telecommunications query:", height=100) | |
if st.button("Process Query", key="text_query"): | |
if query: | |
response = process_text_query(query) | |
if response: | |
st.markdown('<div class="success-message">β Query processed successfully!</div>', unsafe_allow_html=True) | |
st.markdown("### Response:") | |
st.write(response) | |
else: | |
st.warning("Please enter a query.") | |
elif selected == "Document Processing": | |
st.markdown("### π Document Analysis") | |
document_type = st.selectbox( | |
"Select Document Type", | |
["Regulatory Document", "Technical Specification", "Network Planning", "Customer Inquiry"] | |
) | |
text_input = st.text_area("Enter document text:", height=150) | |
if st.button("Analyze Document"): | |
if text_input: | |
response = process_text_query(f"Analyze the following {document_type}: {text_input}") | |
if response: | |
st.markdown('<div class="success-message">β Document analyzed successfully!</div>', unsafe_allow_html=True) | |
st.markdown("### Response:") | |
st.write(response) | |
else: | |
st.warning("Please enter some text to analyze.") | |
elif selected == "Image Analysis": | |
st.markdown("### πΌοΈ Image Analysis") | |
image_file = st.file_uploader("Upload an image for analysis", type=["jpg", "jpeg", "png"]) | |
if image_file: | |
image = Image.open(image_file) | |
st.image(image, caption="Uploaded Image", use_column_width=True) | |
query = st.text_input("Enter your query about this image:") | |
if st.button("Analyze Image"): | |
image_base64 = image_to_base64(image) | |
if image_base64 and query: | |
response = process_image_query(image_base64, query) | |
if response: | |
st.markdown('<div class="success-message">β Image analyzed successfully!</div>', unsafe_allow_html=True) | |
st.markdown("### Response:") | |
st.write(response) | |
else: | |
st.warning("Please upload an image and enter a query.") | |
# Footer | |
st.markdown("---") | |
st.caption("π Powered by OpenAI | Streamlit | Llama Models") | |