Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import openai | |
| import os | |
| import PyPDF2 | |
| import re | |
| from typing import List, Tuple | |
| # Configuration | |
| OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") | |
| OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-3.5-turbo") | |
| MAX_TOKENS = int(os.getenv("MAX_TOKENS", "500")) | |
| TEMPERATURE = float(os.getenv("TEMPERATURE", "0.7")) | |
| # Validate API key | |
| if not OPENAI_API_KEY: | |
| print("❌ OPENAI_API_KEY environment variable is required") | |
| exit(1) | |
| # Initialize OpenAI client | |
| client = openai.OpenAI(api_key=OPENAI_API_KEY) | |
| # Simple PDF processing | |
| class SimplePDFHelper: | |
| def __init__(self, pdf_path="Health Tech Hub Copenhagen.pdf"): | |
| self.pdf_path = pdf_path | |
| self.pdf_text = "" | |
| self.loaded = False | |
| def load_pdf(self): | |
| """Load and extract text from PDF""" | |
| if self.loaded: | |
| return True | |
| try: | |
| if not os.path.exists(self.pdf_path): | |
| print(f"⚠️ PDF file not found: {self.pdf_path}") | |
| return False | |
| text = "" | |
| with open(self.pdf_path, 'rb') as file: | |
| pdf_reader = PyPDF2.PdfReader(file) | |
| for page in pdf_reader.pages: | |
| text += page.extract_text() + "\n" | |
| self.pdf_text = text | |
| self.loaded = True | |
| print(f"✅ PDF loaded successfully ({len(text)} characters)") | |
| return True | |
| except Exception as e: | |
| print(f"❌ Error loading PDF: {e}") | |
| return False | |
| def search_text(self, query: str, max_length: int = 500) -> str: | |
| """Simple text search in PDF content""" | |
| if not self.loaded: | |
| if not self.load_pdf(): | |
| return "" | |
| # Simple keyword search | |
| query_words = set(re.findall(r'\b\w+\b', query.lower())) | |
| # Split text into sentences | |
| sentences = re.split(r'[.!?]+', self.pdf_text) | |
| # Find sentences with matching keywords | |
| relevant_sentences = [] | |
| for sentence in sentences: | |
| sentence_words = set(re.findall(r'\b\w+\b', sentence.lower())) | |
| if query_words.intersection(sentence_words): | |
| relevant_sentences.append(sentence.strip()) | |
| # Return first few relevant sentences | |
| if relevant_sentences: | |
| result = ". ".join(relevant_sentences[:3]) + "." | |
| return result[:max_length] | |
| return "" | |
| # Initialize PDF helper | |
| pdf_helper = SimplePDFHelper() | |
| def chat_with_bot(message: str, history: List[Tuple[str, str]]) -> Tuple[str, List[Tuple[str, str]]]: | |
| """Chat function with simple PDF integration""" | |
| if not message.strip(): | |
| return "", history | |
| # Search for relevant PDF content | |
| pdf_context = pdf_helper.search_text(message) | |
| # Prepare system message | |
| system_message = ( | |
| "You are a helpful AI assistant with knowledge about Health Tech Hub Copenhagen. " | |
| "Use the provided PDF information when relevant to answer questions accurately. " | |
| "Keep your responses concise and engaging." | |
| ) | |
| # Prepare conversation history | |
| messages = [{"role": "system", "content": system_message}] | |
| # Add conversation history | |
| for human, assistant in history: | |
| messages.append({"role": "user", "content": human}) | |
| messages.append({"role": "assistant", "content": assistant}) | |
| # Add current message with PDF context | |
| full_message = message | |
| if pdf_context: | |
| full_message = f"{message}\n\nRelevant information from the Health Tech Hub Copenhagen document:\n{pdf_context}" | |
| messages.append({"role": "user", "content": full_message}) | |
| try: | |
| # Get response from OpenAI | |
| response = client.chat.completions.create( | |
| model=OPENAI_MODEL, | |
| messages=messages, | |
| max_tokens=MAX_TOKENS, | |
| temperature=TEMPERATURE | |
| ) | |
| assistant_response = response.choices[0].message.content | |
| # Update history | |
| history.append((message, assistant_response)) | |
| return "", history | |
| except Exception as e: | |
| error_message = f"Sorry, I encountered an error: {str(e)}" | |
| history.append((message, error_message)) | |
| return "", history | |
| def clear_chat(): | |
| """Clear the chat history""" | |
| return [] | |
| # Create Gradio interface | |
| with gr.Blocks( | |
| title="AI Chatbot with PDF Knowledge", | |
| theme=gr.themes.Soft(), | |
| css=""" | |
| .gradio-container { | |
| max-width: 800px; | |
| margin: auto; | |
| } | |
| """ | |
| ) as demo: | |
| gr.Markdown( | |
| """ | |
| Chatbot overskrift | |
| """ | |
| ) | |
| # Chat interface | |
| chatbot = gr.Chatbot( | |
| height=500, | |
| show_label=False, | |
| container=True, | |
| bubble_full_width=False | |
| ) | |
| # Message input | |
| msg = gr.Textbox( | |
| placeholder="Type your message here...", | |
| show_label=False, | |
| container=False | |
| ) | |
| # Clear button | |
| clear = gr.Button("Clear Chat", variant="secondary") | |
| # Set up event handlers | |
| msg.submit( | |
| chat_with_bot, | |
| inputs=[msg, chatbot], | |
| outputs=[msg, chatbot] | |
| ) | |
| clear.click( | |
| clear_chat, | |
| outputs=chatbot | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch() |