Alibrown's picture
Rename app.py to _zip_app.py
14a41b1 verified
import streamlit as st
import google.generativeai as genai
from PIL import Image
import io
import base64
import pandas as pd
import zipfile
import PyPDF2
st.set_page_config(page_title="Gemini AI Chat", layout="wide")
st.title("🤖 Gemini AI Chat Interface")
st.markdown("""
**Welcome to the Gemini AI Chat Interface!**
Chat seamlessly with Google's advanced Gemini AI models, supporting multiple input types.
🔗 [GitHub Profile](https://github.com/volkansah) |
📂 [Project Repository](https://github.com/volkansah/gemini-ai-chat) |
💬 [Soon](https://aicodecraft.io)
""")
# Session State Management
if "messages" not in st.session_state:
st.session_state.messages = []
if "uploaded_content" not in st.session_state:
st.session_state.uploaded_content = None
# File Processing Functions
def encode_image(image):
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')
def process_file(uploaded_file):
file_type = uploaded_file.name.split('.')[-1].lower()
if file_type in ["jpg", "jpeg", "png"]:
return {"type": "image", "content": Image.open(uploaded_file).convert('RGB')}
code_extensions = ["html", "css", "php", "js", "py", "java", "c", "cpp"]
if file_type in ["txt"] + code_extensions:
return {"type": "text", "content": uploaded_file.read().decode("utf-8")}
if file_type in ["csv", "xlsx"]:
df = pd.read_csv(uploaded_file) if file_type == "csv" else pd.read_excel(uploaded_file)
return {"type": "text", "content": df.to_string()}
if file_type == "pdf":
reader = PyPDF2.PdfReader(uploaded_file)
return {"type": "text", "content": "".join(page.extract_text() for page in reader.pages if page.extract_text())}
if file_type == "zip":
with zipfile.ZipFile(uploaded_file) as z:
# Fix: Define newline character outside f-string
newline = "\n"
return {"type": "text", "content": f"ZIP Contents:{newline}{newline.join(z.namelist())}"}
return {"type": "error", "content": "Unsupported file format"}
# Sidebar Configuration
with st.sidebar:
api_key = st.text_input("Google AI API Key", type="password")
model = st.selectbox("Model", [
"gemini-1.5-flash",
"gemini-1.5-pro",
"gemini-1.5-flash-8B",
"gemini-1.5-pro-vision-latest",
"gemini-1.0-pro",
"gemini-1.0-pro-vision-latest",
"gemini-2.0-pro-exp-02-05",
"gemini-2.0-flash-lite",
"gemini-2.0-flash-exp-image-generation",
"gemini-2.0-flash",
"gemini-2.0-flash-thinking-exp-01-21"
])
temperature = st.slider("Temperature", 0.0, 1.0, 0.7)
max_tokens = st.slider("Max Tokens", 1, 2048, 1000)
# File Upload Section
uploaded_file = st.file_uploader("Upload File (Image/Text/PDF/ZIP)",
type=["jpg", "jpeg", "png", "txt", "pdf", "zip",
"csv", "xlsx", "html", "css", "php", "js", "py"])
if uploaded_file:
processed = process_file(uploaded_file)
st.session_state.uploaded_content = processed
if processed["type"] == "image":
st.image(processed["content"], caption="Uploaded Image", use_container_width=True)
elif processed["type"] == "text":
st.text_area("File Preview", processed["content"], height=200)
# Chat History Display
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Chat Input Processing
if prompt := st.chat_input("Your message..."):
if not api_key:
st.warning("API Key benötigt!")
st.stop()
try:
# Configure Gemini
genai.configure(api_key=api_key)
model_instance = genai.GenerativeModel(model)
# Build content payload
content = []
# Add text input
content.append({"text": prompt})
# Add file content
if st.session_state.uploaded_content:
if st.session_state.uploaded_content["type"] == "image":
content.append({
"inline_data": {
"mime_type": "image/jpeg",
"data": encode_image(st.session_state.uploaded_content["content"])
}
})
elif st.session_state.uploaded_content["type"] == "text":
content[0]["text"] += f"\n\n[File Content]\n{st.session_state.uploaded_content['content']}"
# Add to chat history
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# Generate response
response = model_instance.generate_content(
content,
generation_config=genai.types.GenerationConfig(
temperature=temperature,
max_output_tokens=max_tokens
)
)
# Display response
with st.chat_message("assistant"):
st.markdown(response.text)
st.session_state.messages.append({"role": "assistant", "content": response.text})
except Exception as e:
st.error(f"API Error: {str(e)}")
if "vision" not in model and st.session_state.uploaded_content["type"] == "image":
st.error("Für Bilder einen Vision-fähigen Modell auswählen!")
# Instructions in the sidebar
with st.sidebar:
st.markdown("""
## 📝 Instructions:
1. Enter your Google AI API key
2. Select a model (use vision models for image analysis)
3. Adjust temperature and max tokens if needed
4. Optional: Set a system prompt
5. Upload an image (optional)
6. Type your message and press Enter
### About
🔗 [GitHub Profile](https://github.com/volkansah) |
📂 [Project Repository](https://github.com/volkansah/gemini-ai-chat) |
💬 [Soon](https://aicodecraft.io)
""")