import streamlit as st import os import time from groq import Groq import io import chardet import PyPDF2 import docx # Supported models SUPPORTED_MODELS = { "Llama 3 70B": "llama3-70b-8192", "Llama 3 8B": "llama3-8b-8192", "Llama 3.1 70B": "llama-3.1-70b-versatile", "Llama 3.1 8B": "llama-3.1-8b-instant", "Mixtral 8x7B": "mixtral-8x7b-32768", "Gemma 2 9B": "gemma2-9b-it" } # Initialize Groq client with API key groq_api_key = os.getenv("GROQ_API_KEY") if not groq_api_key: st.error("GROQ_API_KEY not found in environment variables. Please set it and restart the app.") st.stop() client = Groq(api_key=groq_api_key) # Function to extract text from uploaded files def extract_text_from_file(file_content, file_name): if file_name.endswith('.txt'): encoding = chardet.detect(file_content)['encoding'] return file_content.decode(encoding or 'utf-8', errors='replace') elif file_name.endswith('.pdf'): pdf_reader = PyPDF2.PdfReader(io.BytesIO(file_content)) return "\n".join(page.extract_text() for page in pdf_reader.pages) elif file_name.endswith('.docx'): doc = docx.Document(io.BytesIO(file_content)) return "\n".join(paragraph.text for paragraph in doc.paragraphs) else: return "Unsupported file type" # Enhanced System Prompt Logic def enhanced_system_prompt(query): prompt = f""" 1. Begin analyzing the question: "{query}" 2. Plan of action: a. Briefly outline the approach. b. Present a step-by-step reasoning process. c. Use "Chain of Thought" reasoning if needed, breaking it into steps. d. Consider alternative solutions if applicable. 1. Review reasoning. 2. Check for potential errors, optimizations, or enhancements. 3. Reflect on alternative approaches, if any. Provide final answer based on the above reasoning and reflection. """ return prompt # Function to handle multi-path reasoning using the ReAct framework def multi_path_reasoning(selected_task): if selected_task == "Research and Information Retrieval": return """ Thought 1: I need to gather detailed information about the impact of climate change on coastal cities. Act 1: Search["impact of climate change on coastal cities"] Obs 1: The search results include scientific articles, government reports, and case studies on the impact of rising sea levels on coastal cities. Thought 2: The information seems scattered. I need to focus on retrieving case studies from government reports. Act 2: Search["case studies from government reports on rising sea levels"] Obs 2: Found multiple case studies from NOAA and the EPA detailing the impact on specific cities. Thought 3: I have enough case studies but need to summarize key points. Act 3: Summarize["key points from case studies on rising sea levels"] Act 4: Finish[summary of key points] """ elif selected_task == "Code Debugging": return """ Thought 1: I need to debug a Python script that’s throwing a TypeError. Act 1: Review["Python script TypeError"] Obs 1: The TypeError is due to a mismatch in data types when calling a function. Thought 2: I should identify the exact line causing the error and check the data types involved. Act 2: Inspect["line of code causing TypeError and data types"] Obs 2: The error is occurring because an integer is being passed where a string is expected. Thought 3: I need to correct the data type mismatch and rerun the script. Act 3: Modify["correct data type from integer to string"] Act 4: Finish[rerun the script] """ elif selected_task == "Content Generation": return """ Thought 1: I need to write a blog post on the benefits of AI in healthcare. Act 1: Generate["outline for blog post on AI in healthcare"] Obs 1: The outline includes sections on diagnostic tools, personalized medicine, and operational efficiency. Thought 2: I should expand the section on personalized medicine with examples. Act 2: Research["examples of personalized medicine using AI"] Obs 2: Found examples of AI-driven treatments for cancer and diabetes. Thought 3: I can now draft the personalized medicine section with these examples. Act 3: Write["draft section on personalized medicine with AI examples"] Act 4: Finish[draft complete] """ elif selected_task == "Strategic Planning": return """ Thought 1: I need to develop a strategic plan for increasing customer retention. Act 1: Identify["key factors affecting customer retention"] Obs 1: Key factors include product satisfaction, customer support quality, and engagement strategies. Thought 2: I should focus on improving customer support and engagement strategies. Act 2: Develop["action plan for improving customer support and engagement"] Obs 2: Created a plan including personalized communication, regular feedback loops, and loyalty programs. Thought 3: I need to present this plan to the executive team. Act 3: Prepare["presentation for executive team on customer retention strategies"] Act 4: Finish[presentation ready] """ return "" # Function to handle advanced steps: prompt improvement, response, review, and analysis def advanced_steps(query, model_id): try: # Step 1: Improve the original prompt with st.spinner("Improving the prompt..."): improved_prompt_response = client.chat.completions.create( messages=[ {"role": "system", "content": "You are an expert at refining prompts."}, {"role": "user", "content": f"Please improve the following prompt for optimal results:\n{query}"} ], model=model_id, max_tokens=500, ) improved_prompt = improved_prompt_response.choices[0].message.content # Step 2: Get the response for the improved prompt with st.spinner("Generating response for the improved prompt..."): response = client.chat.completions.create( messages=[{"role": "user", "content": improved_prompt}], model=model_id, max_tokens=1000, ) generated_response = response.choices[0].message.content # Step 3: Review and grade the response with st.spinner("Reviewing and grading the response..."): review_response = client.chat.completions.create( messages=[ {"role": "system", "content": "You are an expert reviewer and grader."}, {"role": "user", "content": f"Please review and grade the following response:\n{generated_response}"} ], model=model_id, max_tokens=500, ) review_feedback = review_response.choices[0].message.content # Step 4: Analyze and summarize review points and responses with st.spinner("Analyzing and summarizing review points..."): analysis_response = client.chat.completions.create( messages=[ {"role": "system", "content": "You are an expert in summarizing and analyzing feedback."}, {"role": "user", "content": f"Please analyze and summarize the following review feedback:\n{review_feedback}"} ], model=model_id, max_tokens=500, ) analysis_summary = analysis_response.choices[0].message.content return improved_prompt, generated_response, review_feedback, analysis_summary except Exception as e: st.error(f"An error occurred during advanced steps: {str(e)}") return None, None, None, None # Function to search and summarize using Groq API def search_and_summarize(query, model_id, system_prompt, context="", reasoning_type="Single-path", selected_task=None): try: with st.spinner("Searching and summarizing..."): if reasoning_type == "Multi-path" and selected_task: prompt = multi_path_reasoning(selected_task) query = f"{query}\n\n{prompt}" messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"Context: {context}\n\nQuery: {query}\n\nReasoning Type: {reasoning_type}\n\nPlease provide a summary and details for this query, considering the given context if relevant."} ] chat_completion = client.chat.completions.create( messages=messages, model=model_id, max_tokens=1000, ) response = chat_completion.choices[0].message.content summary, details = response.split("\n\n", 1) if "\n\n" in response else (response, "No detailed information available.") return summary, details except Exception as e: st.error(f"An error occurred: {str(e)}") return None, None # Streamlit UI layout st.set_page_config(layout="wide", page_title="Enhanced Groq Search App") st.image("p1.png", width=160) # Initialize session state if "conversations" not in st.session_state: st.session_state.conversations = {"2024-04-15 15:27:16": {"summary": "", "details": "", "system_prompt": "You are a helpful assistant that provides summaries and details based on user queries and given context."}} if "files" not in st.session_state: st.session_state.files = {} if "selected_model" not in st.session_state: st.session_state.selected_model = "Mixtral 8x7B" if "active_conversation" not in st.session_state: st.session_state.active_conversation = "2024-04-15 15:27:16" if "reasoning_type" not in st.session_state: st.session_state.reasoning_type = "Single-path" if "selected_task" not in st.session_state: st.session_state.selected_task = "Research and Information Retrieval" # Sidebar for model selection, conversations, reasoning type, and file management with st.sidebar: st.header("Model Selection") st.session_state.selected_model = st.selectbox("Select a model", list(SUPPORTED_MODELS.keys())) st.header("Conversations") selected_conversation = st.selectbox("Select a conversation", list(st.session_state.conversations.keys()), index=list(st.session_state.conversations.keys()).index(st.session_state.active_conversation)) if st.button("New Conversation"): new_conv = time.strftime("%Y-%m-%d %H:%M:%S") st.session_state.conversations[new_conv] = {"summary": "", "details": "", "system_prompt": "You are a helpful assistant that provides summaries and details based on user queries and given context."} st.session_state.active_conversation = new_conv st.rerun() if st.button("Delete Conversation"): if len(st.session_state.conversations) > 1: del st.session_state.conversations[selected_conversation] st.session_state.active_conversation = list(st.session_state.conversations.keys())[0] st.rerun() else: st.warning("Cannot delete the last conversation.") new_name = st.text_input("Rename", value=selected_conversation) if new_name and new_name != selected_conversation: st.session_state.conversations[new_name] = st.session_state.conversations.pop(selected_conversation) st.session_state.active_conversation = new_name st.rerun() st.header("Advanced Prompt Reasoning") st.session_state.reasoning_type = st.radio( "Select Reasoning Type", ("Single-path", "Multi-path", "Advance Steps", "Enhanced System Prompt") ) if st.session_state.reasoning_type == "Multi-path": st.session_state.selected_task = st.selectbox( "Select Task Type", ("Research and Information Retrieval", "Code Debugging", "Content Generation", "Strategic Planning") ) st.header("File Upload") uploaded_file = st.file_uploader("Choose a file", type=["txt", "pdf", "docx"]) if uploaded_file is not None: file_contents = uploaded_file.read() text_content = extract_text_from_file(file_contents, uploaded_file.name) st.session_state.files[uploaded_file.name] = text_content st.success(f"File {uploaded_file.name} uploaded and processed successfully!") st.header("File Index") selected_file = st.selectbox("Select a file", list(st.session_state.files.keys())) if st.button("Generate Report") and selected_file: context = st.session_state.files[selected_file] model_id = SUPPORTED_MODELS[st.session_state.selected_model] reasoning_type = st.session_state.reasoning_type selected_task = st.session_state.selected_task if reasoning_type == "Multi-path" else None system_prompt = st.session_state.conversations[st.session_state.active_conversation].get("system_prompt", "") if reasoning_type == "Advance Steps": with st.spinner("Executing advanced steps..."): improved_prompt, generated_response, review_feedback, analysis_summary = advanced_steps(context, model_id) st.session_state.conversations[st.session_state.active_conversation]["summary"] = analysis_summary st.session_state.conversations[st.session_state.active_conversation]["details"] = f"Improved Prompt:\n{improved_prompt}\n\nGenerated Response:\n{generated_response}\n\nReview Feedback:\n{review_feedback}" elif reasoning_type == "Enhanced System Prompt": with st.spinner("Generating enhanced prompt response..."): system_prompt = enhanced_system_prompt(context) response = client.chat.completions.create( messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": context}], model=model_id, max_tokens=1000, ) generated_response = response.choices[0].message.content st.session_state.conversations[st.session_state.active_conversation]["summary"] = generated_response else: with st.spinner("Generating report..."): report_summary, report_details = search_and_summarize(f"Generate a detailed report for the file: {selected_file}", model_id, system_prompt, context, reasoning_type, selected_task) if report_summary and report_details: st.session_state.conversations[st.session_state.active_conversation]["summary"] = report_summary st.session_state.conversations[st.session_state.active_conversation]["details"] = report_details else: st.session_state.conversations[st.session_state.active_conversation]["summary"] = "Failed to generate report." st.session_state.conversations[st.session_state.active_conversation]["details"] = "An error occurred during report generation." st.rerun() # Main panel for displaying the search input and results col1, col2 = st.columns([1, 2]) with col1: st.subheader("Chat Input") user_input = st.text_input("Enter your query here...") if st.button("Send"): if user_input: context = st.session_state.files.get(selected_file, "") if selected_file else "" model_id = SUPPORTED_MODELS[st.session_state.selected_model] reasoning_type = st.session_state.reasoning_type selected_task = st.session_state.selected_task if reasoning_type == "Multi-path" else None system_prompt = st.session_state.conversations[st.session_state.active_conversation].get("system_prompt", "") if reasoning_type == "Advance Steps": with st.spinner("Executing advanced steps..."): improved_prompt, generated_response, review_feedback, analysis_summary = advanced_steps(user_input, model_id) st.session_state.conversations[st.session_state.active_conversation]["summary"] = analysis_summary st.session_state.conversations[st.session_state.active_conversation]["details"] = f"Improved Prompt:\n{improved_prompt}\n\nGenerated Response:\n{generated_response}\n\nReview Feedback:\n{review_feedback}" elif reasoning_type == "Enhanced System Prompt": with st.spinner("Generating enhanced prompt response..."): system_prompt = enhanced_system_prompt(user_input) response = client.chat.completions.create( messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": user_input}], model=model_id, max_tokens=1000, ) generated_response = response.choices[0].message.content st.session_state.conversations[st.session_state.active_conversation]["summary"] = generated_response st.session_state.conversations[st.session_state.active_conversation]["details"] = generated_response else: summary, details = search_and_summarize(user_input, model_id, system_prompt, context, reasoning_type, selected_task) if summary and details: st.session_state.conversations[st.session_state.active_conversation]["summary"] = summary st.session_state.conversations[st.session_state.active_conversation]["details"] = details else: st.warning("Please enter a query to search.") if st.button("Regenerate"): if st.session_state.conversations[st.session_state.active_conversation]["summary"]: context = st.session_state.files.get(selected_file, "") if selected_file else "" model_id = SUPPORTED_MODELS[st.session_state.selected_model] reasoning_type = st.session_state.reasoning_type selected_task = st.session_state.selected_task if reasoning_type == "Multi-path" else None system_prompt = st.session_state.conversations[st.session_state.active_conversation].get("system_prompt", "") if reasoning_type == "Advance Steps": with st.spinner("Executing advanced steps..."): improved_prompt, generated_response, review_feedback, analysis_summary = advanced_steps(user_input, model_id) st.session_state.conversations[st.session_state.active_conversation]["summary"] = analysis_summary st.session_state.conversations[st.session_state.active_conversation]["details"] = f"Improved Prompt:\n{improved_prompt}\n\nGenerated Response:\n{generated_response}\n\nReview Feedback:\n{review_feedback}" elif reasoning_type == "Enhanced System Prompt": with st.spinner("Generating enhanced prompt response..."): system_prompt = enhanced_system_prompt(user_input) response = client.chat.completions.create( messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": user_input}], model=model_id, max_tokens=1000, ) generated_response = response.choices[0].message.content st.session_state.conversations[st.session_state.active_conversation]["summary"] = generated_response st.session_state.conversations[st.session_state.active_conversation]["details"] = generated_response else: summary, details = search_and_summarize(user_input, model_id, system_prompt, context, reasoning_type, selected_task) if summary and details: st.session_state.conversations[st.session_state.active_conversation]["summary"] = summary st.session_state.conversations[st.session_state.active_conversation]["details"] = details st.text_area("Response", value=st.session_state.conversations[st.session_state.active_conversation].get("summary", ""), height=200, key="response_area") # Display the editable system prompt below the response box st.session_state.conversations[st.session_state.active_conversation]["system_prompt"] = st.text_area("System Prompt", value=st.session_state.conversations[st.session_state.active_conversation].get("system_prompt", ""), height=100, key="system_prompt_area") with col2: st.subheader("Information Panel") st.text_area("Details", value=st.session_state.conversations[st.session_state.active_conversation].get("details", ""), height=600, key="details_area") # Footer with additional options st.markdown("
Powered by Groq
", unsafe_allow_html=True) st.info("build by dw 9-12-24")