Files
ai-agents-masterclass/n8n-streamlit-agent/n8n-streamlit-agent.py

118 lines
3.8 KiB
Python

import streamlit as st
import requests
import uuid
from supabase import create_client, Client
# Supabase setup
SUPABASE_URL = "YOUR_SUPABASE_PROJECT_URL_HERE"
SUPABASE_KEY = "YOUR_SUPABASE_ANONYMOUS_API_KEY_HERE"
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
# Webhook URL (replace with your n8n webhook URL)
WEBHOOK_URL = "YOUR_N8N_WEBHOOK_URL_HERE"
def login(email: str, password: str):
try:
res = supabase.auth.sign_in_with_password({"email": email, "password": password})
return res
except Exception as e:
st.error(f"Login failed: {str(e)}")
return None
def signup(email: str, password: str):
try:
res = supabase.auth.sign_up({"email": email, "password": password})
return res
except Exception as e:
st.error(f"Signup failed: {str(e)}")
return None
def generate_session_id():
return str(uuid.uuid4())
def init_session_state():
if "auth" not in st.session_state:
st.session_state.auth = None
if "session_id" not in st.session_state:
st.session_state.session_id = None
if "messages" not in st.session_state:
st.session_state.messages = []
def display_chat():
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
def handle_logout():
st.session_state.auth = None
st.session_state.session_id = None
st.session_state.messages = []
st.rerun()
def auth_ui():
tab1, tab2 = st.tabs(["Login", "Sign Up"])
with tab1:
email = st.text_input("Email", key="login_email")
password = st.text_input("Password", type="password", key="login_password")
if st.button("Login"):
auth = login(email, password)
if auth:
st.session_state.auth = auth
st.session_state.session_id = generate_session_id()
st.rerun()
with tab2:
email = st.text_input("Email", key="signup_email")
password = st.text_input("Password", type="password", key="signup_password")
if st.button("Sign Up"):
auth = signup(email, password)
if auth:
st.success("Sign up successful! Please log in.")
def main():
st.title("AI Chat Interface")
init_session_state()
if st.session_state.auth is None:
auth_ui()
else:
st.sidebar.success(f"Logged in as {st.session_state.auth.user.email}")
st.sidebar.info(f"Session ID: {st.session_state.session_id}")
if st.sidebar.button("Logout"):
handle_logout()
display_chat()
if prompt := st.chat_input("What is your message?"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# Prepare the payload
payload = {
"chatInput": prompt,
"sessionId": st.session_state.session_id
}
# Get the access token from the session
access_token = st.session_state.auth.session.access_token
# Send request to webhook
headers = {
"Authorization": f"Bearer {access_token}"
}
with st.spinner("AI is thinking..."):
response = requests.post(WEBHOOK_URL, json=payload, headers=headers)
if response.status_code == 200:
ai_message = response.json().get("output", "Sorry, I couldn't generate a response.")
st.session_state.messages.append({"role": "assistant", "content": ai_message})
with st.chat_message("assistant"):
st.markdown(ai_message)
else:
st.error(f"Error: {response.status_code} - {response.text}")
if __name__ == "__main__":
main()