""" app.py – Flask entry point for Semantic KG Diff Run: python backend/app.py """ import os, sys, traceback sys.path.insert(0, os.path.dirname(__file__)) from flask import Flask, request, jsonify, send_from_directory from flask_cors import CORS from semantic_diff import extract_entities_and_relations, compute_diff, summarise_diff from graph_utils import build_graph, visualise_diff, graph_to_json def create_app(): app = Flask( __name__, static_folder=os.path.join(os.path.dirname(__file__), 'frontend', 'static'), static_url_path='/static', template_folder=os.path.join(os.path.dirname(__file__), 'frontend'), ) CORS(app) @app.route('/') def index(): return send_from_directory(app.template_folder, 'index.html') @app.route('/api/diff', methods=['POST']) def diff(): data = request.get_json() v1_text = (data or {}).get('v1', '').strip() v2_text = (data or {}).get('v2', '').strip() api_key = (data or {}).get('api_key', '').strip() if not v1_text or not v2_text: return jsonify({'error': 'Both v1 and v2 text are required.'}), 400 if not api_key: return jsonify({'error': 'Groq API key is required.'}), 400 try: kg1 = extract_entities_and_relations(v1_text, api_key) kg2 = extract_entities_and_relations(v2_text, api_key) diff_result = compute_diff(kg1, kg2) summary = summarise_diff(diff_result, api_key) g1 = build_graph(kg1) g2 = build_graph(kg2) img_b64 = visualise_diff(g1, g2, diff_result) return jsonify({ 'kg1': kg1, 'kg2': kg2, 'diff': diff_result, 'summary': summary, 'graph_img': img_b64, 'graph_json': { 'v1': graph_to_json(g1), 'v2': graph_to_json(g2), }, }) except Exception as e: traceback.print_exc() return jsonify({'error': str(e)}), 500 return app if __name__ == '__main__': app = create_app() port = int(os.environ.get('PORT', 5050)) print(f'\nšŸ” Semantic KG Diff running at http://localhost:{port}\n') debug = os.environ.get('FLASK_DEBUG', '0') == '1' app.run(host='0.0.0.0', port=port, debug=debug)