Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import requests | |
| import json | |
| import os | |
| # Set page config | |
| st.set_page_config(page_title="Military Plaques Chat Assistant", page_icon="📛") | |
| # Set up session state for chat history | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [{"role": "assistant", "content": "Hi! I'm the Military Plaques AI assistant. How can I help you today?"}] | |
| # Flowise API configuration | |
| FLOWISE_URL = os.getenv("FLOWISE_URL") | |
| FLOWISE_API_KEY = FLOWISE_URL | |
| def get_flowise_response(prompt): | |
| """Get response from Flowise API""" | |
| headers = { | |
| "Authorization": f"Bearer {FLOWISE_API_KEY}", | |
| "Content-Type": "application/json" | |
| } | |
| # Send only role and content in history | |
| payload = { | |
| "question": prompt, | |
| "history": [{"role": m["role"], "content": m["content"]} for m in st.session_state.messages] | |
| } | |
| try: | |
| response = requests.post(FLOWISE_URL, headers=headers, json=payload) | |
| response.raise_for_status() | |
| return response.json() | |
| except requests.exceptions.RequestException as e: | |
| return {"error": f"API request failed: {str(e)}"} | |
| except json.JSONDecodeError: | |
| return {"error": "Invalid JSON response from API"} | |
| # Display chat messages | |
| for index, message in enumerate(st.session_state.messages): | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| # Display sources if available | |
| if message["role"] == "assistant": | |
| sources = message.get("sources", []) | |
| if sources: | |
| st.markdown("**Check out the following links:**") | |
| for idx, source in enumerate(sources, 1): | |
| st.markdown(f"{idx}. {source}") | |
| else: | |
| pass | |
| # Starter prompts | |
| starter_prompts = [ | |
| "What types of plaques do you offer?", | |
| "Can I customize my plaque design?", | |
| "How long does it take to receive my order?", | |
| "Contact details" | |
| ] | |
| # Show starter buttons only if no user input yet | |
| if len(st.session_state.messages) == 1: | |
| cols = st.columns(2) | |
| for i, prompt in enumerate(starter_prompts): | |
| with cols[i % 2]: | |
| if st.button(prompt): | |
| # Add user message | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| # Get response | |
| with st.spinner("Thinking..."): | |
| flowise_response = get_flowise_response(prompt) | |
| if "error" in flowise_response: | |
| response_content = f"Error: {flowise_response['error']}" | |
| sources = [] | |
| follow_up_prompts = [] | |
| else: | |
| response_content = flowise_response.get("text", "Sorry, I didn't get that.") | |
| # Extract unique sources | |
| source_docs = flowise_response.get("sourceDocuments", []) | |
| sources = list(set( | |
| doc.get("metadata", {}).get("source", "") | |
| for doc in source_docs | |
| )) | |
| sources = [s for s in sources if s] # Remove empty strings | |
| # Parse follow-up prompts | |
| follow_up_str = flowise_response.get("followUpPrompts", "[]") | |
| try: | |
| # Handle double-encoded JSON string | |
| parsed = json.loads(follow_up_str) | |
| if isinstance(parsed, str): | |
| follow_up_prompts = json.loads(parsed) | |
| else: | |
| follow_up_prompts = parsed | |
| except json.JSONDecodeError: | |
| follow_up_prompts = [] | |
| # Add assistant response | |
| st.session_state.messages.append({ | |
| "role": "assistant", | |
| "content": response_content, | |
| "sources": sources, | |
| "follow_up_prompts": follow_up_prompts | |
| }) | |
| st.rerun() | |
| # Handle user input | |
| if prompt := st.chat_input("Type your message here..."): | |
| # Add user message | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| # Get response | |
| with st.chat_message("assistant"): | |
| with st.spinner("Thinking..."): | |
| flowise_response = get_flowise_response(prompt) | |
| if "error" in flowise_response: | |
| response_content = f"Error: {flowise_response['error']}" | |
| sources = [] | |
| follow_up_prompts = [] | |
| else: | |
| response_content = flowise_response.get("text", "Sorry, I didn't get that.") | |
| # Extract unique sources | |
| source_docs = flowise_response.get("sourceDocuments", []) | |
| sources = list(set( | |
| doc.get("metadata", {}).get("source", "") | |
| for doc in source_docs | |
| )) | |
| sources = [s for s in sources if s] # Remove empty strings | |
| # Parse follow-up prompts | |
| follow_up_str = flowise_response.get("followUpPrompts", "[]") | |
| try: | |
| # Handle double-encoded JSON string | |
| parsed = json.loads(follow_up_str) | |
| if isinstance(parsed, str): | |
| follow_up_prompts = json.loads(parsed) | |
| else: | |
| follow_up_prompts = parsed | |
| except json.JSONDecodeError: | |
| follow_up_prompts = [] | |
| # Display response | |
| st.markdown(response_content) | |
| # Display sources | |
| if sources: | |
| st.markdown("**Check out the following links:**") | |
| for idx, source in enumerate(sources, 1): | |
| st.markdown(f"{idx}. {source}") | |
| else: | |
| pass | |
| # Add assistant response to history | |
| st.session_state.messages.append({ | |
| "role": "assistant", | |
| "content": response_content, | |
| "sources": sources, | |
| "follow_up_prompts": follow_up_prompts | |
| }) |