""" web_app.py — Terminal-style search UI Run: python GoogleDocumentOCR/web_app.py Then open: http://localhost:5000 """ import os, sys from pathlib import Path from flask import Flask, request, jsonify, render_template_string from dotenv import load_dotenv sys.path.insert(0, str(Path(__file__).parent)) load_dotenv() app = Flask(__name__) # ── HTML template ────────────────────────────────────────────────────────────── HTML = """ WAR DIARY SEARCH // HISTORICAL RECORDS SYSTEM
FILTERS:
HISTORICAL RECORDS RETRIEVAL SYSTEM v1.0
Corpus: Calgary Highlanders · 5 CIB · RHC Black Watch · Sep–Oct 1944
Embedding model: BAAI/bge-base-en-v1.5  |  LLM: Meta-Llama-3.1-8B
 
Type a question and press ENTER or [SEND].
Example: What was the Calgary Highlanders doing on October 23, 1944?
>
""" # ── API endpoint ─────────────────────────────────────────────────────────────── @app.route("/") def index(): return render_template_string(HTML) @app.route("/ask", methods=["POST"]) def ask(): from embed_and_store import embed_texts from db import semantic_search from openai import OpenAI data = request.get_json(force=True) question = (data.get("question") or "").strip() nationality = data.get("nationality") or None corpus = data.get("corpus") or None top_k = int(data.get("top_k", 5)) if not question: return jsonify({"error": "No question provided."}), 400 try: # 1. Embed + search embedding = embed_texts([question])[0] rows = semantic_search(embedding, top_k=top_k, nationality=nationality, corpus=corpus) if not rows: return jsonify({ "answer": "No relevant records found for that query with the current filters.", "sources": [] }) # 2. Build context context = "" sources = [] for filename, page_num, chunk_index, text, nat, corp, similarity in rows: context += f"[Source: {filename}, page {page_num}]\n{text}\n\n" sources.append({ "filename": filename, "page_num": page_num, "similarity": round(similarity, 4), "corpus": corp, }) # 3. LLM answer client = OpenAI( api_key=os.getenv("DEEPINFRA_API_KEY"), base_url="https://api.deepinfra.com/v1/openai", ) prompt = ( "You are a WWII military historian. Answer the question using only " "the provided source documents. Cite source file and page number " "for each claim.\n\n" f"QUESTION: {question}\n\n" f"SOURCE DOCUMENTS:\n{context}\n\nAnswer:" ) response = client.chat.completions.create( model="meta-llama/Meta-Llama-3.1-8B-Instruct", messages=[{"role": "user", "content": prompt}], max_tokens=1200, ) answer = response.choices[0].message.content.strip() return jsonify({"answer": answer, "sources": sources}) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == "__main__": print("\n WAR DIARY SEARCH — http://localhost:5000\n") app.run(debug=False, port=5000)