1 line
4.6 KiB
JSON
1 line
4.6 KiB
JSON
{"repo": "abdur-rehmansaeed/research-decoder", "files": {"app.py": {"81630aa2054c11465e855edb5c7cae26eca775fb": {"t": 1785674394.2341166, "n": 4361, "h": "a42207445b62e221", "c": "import os\nimport tempfile\nimport mimetypes\nfrom flask import Flask, request, jsonify\nfrom dotenv import load_dotenv\nfrom langchain_community.document_loaders import PyMuPDFLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_huggingface import HuggingFaceEmbeddings\nfrom langchain_groq import ChatGroq\nfrom langchain_community.vectorstores import FAISS\nfrom langchain_classic.chains import create_retrieval_chain\nfrom langchain_classic.chains.combine_documents import create_stuff_documents_chain\nfrom langchain_core.prompts import ChatPromptTemplate\n\n# --- FORCE MIME TYPES FOR WINDOWS ---\nmimetypes.add_type('text/css', '.css')\nmimetypes.add_type('application/javascript', '.jsx')\n\n\napp = Flask(__name__, static_folder='frontend', static_url_path='/')\nglobal_vector_store = None\n\n# --- LLM ---\nload_dotenv()\ngroq_api_key = os.getenv(\"GROQ_API_KEY\")\n\nif not groq_api_key:\n raise ValueError(\"🚨 CRITICAL ERROR: Groq API Key not found. Ensure your .env contains GROQ_API_KEY=gsk_...\")\n\nembeddings = HuggingFaceEmbeddings(model_name=\"BAAI/bge-small-en-v1.5\")\nllm = ChatGroq(\n temperature=0.1,\n model_name=\"llama-3.3-70b-versatile\",\n groq_api_key=groq_api_key\n)\n\n@app.route('/')\ndef serve_index():\n return app.send_static_file('index.html')\n\n# --- UPLOAD & PROCESS PDF ---\n@app.route('/upload', methods=['POST'])\ndef upload_file():\n global global_vector_store\n \n if 'file' not in request.files:\n return jsonify({\"error\": \"No file part\"}), 400\n \n file = request.files['file']\n if file.filename == '':\n return jsonify({\"error\": \"No selected file\"}), 400\n\n try:\n with tempfile.NamedTemporaryFile(delete=False, suffix=\".pdf\") as tmp_file:\n file.save(tmp_file.name)\n tmp_file_path = tmp_file.name\n\n loader = PyMuPDFLoader(tmp_file_path)\n documents = loader.load()\n\n text_splitter = RecursiveCharacterTextSplitter(\n separators=[\"\\n\\n\", \"\\n\", \" \", \"\"],\n chunk_size=1000,\n chunk_overlap=200\n )\n chunks = text_splitter.split_documents(documents)\n\n global_vector_store = FAISS.from_documents(chunks, embeddings)\n \n intro_text = \" \".join([doc.page_content for doc in chunks[:4]])\n extraction_prompt = f\"\"\"\n Based on the following introductory text from a research paper, provide:\n 1. A 2-sentence summary of the paper.\n 2. The core problem the authors are trying to solve.\n 3. The primary methodology or model architecture proposed.\n \n Text: {intro_text}\n \"\"\"\n \n response = llm.invoke([(\"human\", extraction_prompt)])\n os.remove(tmp_file_path)\n \n return jsonify({\"insights\": response.content}), 200\n\n except Exception as e:\n return jsonify({\"error\": str(e)}), 500\n\n# --- CHAT WITH PDF ---\n@app.route('/chat', methods=['POST'])\ndef chat():\n global global_vector_store\n \n if not global_vector_store:\n return jsonify({\"error\": \"Please upload a document first.\"}), 400\n\n data = request.json\n user_message = data.get('message')\n\n if not user_message:\n return jsonify({\"error\": \"No message provided.\"}), 400\n\n try:\n retriever = global_vector_store.as_retriever(search_kwargs={\"k\": 4})\n \n system_prompt = (\n \"You are a highly technical AI assistant helping a machine learning engineer understand a research paper. \"\n \"Use the following pieces of retrieved context to answer the question. \"\n \"If the answer is not in the context, state clearly that the paper does not mention it. \"\n \"Keep the answer concise and highly technical.\\n\\n\"\n \"Context: {context}\"\n )\n \n prompt = ChatPromptTemplate.from_messages([\n (\"system\", system_prompt),\n (\"human\", \"{input}\"),\n ])\n \n question_answer_chain = create_stuff_documents_chain(llm, prompt)\n rag_chain = create_retrieval_chain(retriever, question_answer_chain)\n \n response = rag_chain.invoke({\"input\": user_message})\n \n return jsonify({\"answer\": response[\"answer\"]}), 200\n\n except Exception as e:\n return jsonify({\"error\": str(e)}), 500\n\nif __name__ == '__main__':\n app.run(host='0.0.0.0', port=7860, debug=True)"}}}} |