From 566576637d742a7d179bb85e163bac87c89096f0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 20 Jan 2026 04:54:10 +0000 Subject: [PATCH] Initial commit: intelaide backend and frontend Co-Authored-By: Claude Opus 4.5 --- .gitignore | 54 + db.txt | 190 + doclink/.gitignore | 86 + doclink/README.md | 109 + doclink/app/__init__.py | 0 doclink/app/api/__init__.py | 0 doclink/app/api/core.py | 474 ++ doclink/app/api/endpoints.py | 846 ++++ doclink/app/db/__init__.py | 0 doclink/app/db/config.py | 18 + doclink/app/db/database.py | 740 +++ doclink/app/db/sql/database_reset.sql | 38 + doclink/app/db/sql/table_initialize.sql | 88 + doclink/app/functions/__init__.py | 0 doclink/app/functions/chatbot_functions.py | 83 + doclink/app/functions/embedding_functions.py | 36 + doclink/app/functions/export_functions.py | 126 + doclink/app/functions/indexing_functions.py | 12 + doclink/app/functions/reading_functions.py | 536 +++ doclink/app/functions/scraping_functions.py | 114 + doclink/app/main_dev.py | 214 + doclink/app/main_prod.py | 279 ++ doclink/app/redis_manager.py | 190 + doclink/app/static/css/app.css | 3592 +++++++++++++++ .../app/static/favicon/apple-touch-icon.png | Bin 0 -> 25779 bytes doclink/app/static/favicon/favicon-16x16.png | Bin 0 -> 543 bytes doclink/app/static/favicon/favicon-32x32.png | Bin 0 -> 1357 bytes doclink/app/static/favicon/site.webmanifest | 1 + doclink/app/static/js/app-api.js | 553 +++ doclink/app/static/js/app.js | 3659 +++++++++++++++ doclink/app/utils/prompts.yaml | 636 +++ doclink/doclink/app/__init__.py | 0 doclink/doclink/app/api/__init__.py | 0 doclink/doclink/app/api/core.py | 474 ++ doclink/doclink/app/api/endpoints.py | 870 ++++ doclink/doclink/app/db/__init__.py | 0 doclink/doclink/app/db/config.py | 18 + doclink/doclink/app/db/database.py | 750 +++ doclink/doclink/app/db/sql/database_reset.sql | 38 + .../doclink/app/db/sql/table_initialize.sql | 88 + doclink/doclink/app/functions/__init__.py | 0 .../app/functions/chatbot_functions.py | 83 + .../app/functions/embedding_functions.py | 36 + .../doclink/app/functions/export_functions.py | 126 + .../app/functions/indexing_functions.py | 12 + .../app/functions/reading_functions.py | 536 +++ .../app/functions/scraping_functions.py | 114 + doclink/doclink/app/m | 1 + doclink/doclink/app/main_dev.py | 214 + doclink/doclink/app/main_prod.py | 282 ++ doclink/doclink/app/redis_manager.py | 190 + doclink/doclink/app/static/css/app.css | 3592 +++++++++++++++ .../app/static/favicon/apple-touch-icon.png | Bin 0 -> 25779 bytes .../app/static/favicon/favicon-16x16.png | Bin 0 -> 543 bytes .../app/static/favicon/favicon-32x32.png | Bin 0 -> 1357 bytes .../app/static/favicon/site.webmanifest | 1 + doclink/doclink/app/static/js/app-api.js | 553 +++ doclink/doclink/app/static/js/app.js | 3660 +++++++++++++++ doclink/doclink/app/test_db_conn.py | 17 + doclink/doclink/app/utils/prompts.yaml | 636 +++ doclink/doclink/templates/app.html | 409 ++ doclink/doclink/templates/index.html | 19 + doclink/doclink/tests/__init__.py | 0 .../doclink/tests/test_redis_connection.py | 124 + doclink/filelist.txt | 28 + doclink/hold/README.md | 109 + doclink/hold/requirements.txt | 194 + doclink/licence.md | 17 + doclink/recreate_ai_files.sh | 3 + doclink/requirements.txt | 194 + doclink/templates/app.html | 409 ++ doclink/tests/__init__.py | 0 doclink/tests/test_redis_connection.py | 124 + intelaide-backend/config/db.js | 12 + .../controllers/assistantController.js | 155 + .../controllers/authController.js | 70 + .../controllers/embeddingController.js | 86 + .../controllers/fileController.js | 161 + .../controllers/ollamaController.js | 92 + .../controllers/userController.js | 67 + .../user_3/01_mission_vision_1755718653317.md | 21 + .../user_3/02_org_chart_1755718653316.md | 23 + .../03_employee_handbook_1755718653316.md | 22 + .../04_it_security_policies_1755718653316.md | 15 + .../05_code_of_conduct_1755718653316.md | 15 + .../user_3/06_strategic_plan_1755718653315.md | 23 + .../user_3/07_annual_report_1755718653315.md | 21 + ...dard_operating_procedures_1755718653315.md | 18 + .../09_training_onboarding_1755718653315.md | 16 + .../user_3/10_style_guide_1755718653314.md | 16 + .../user_3/about_advertising_1741802987918.md | 326 ++ .../user_3/about_advertising_1741803389122.md | 326 ++ .../user_3/assistant_2/faiss_index.bin | Bin 0 -> 2416134 bytes .../assistant_2/faiss_index_mapping.pkl | Bin 0 -> 740082 bytes .../user_3/assistant_3/faiss_index.bin | Bin 0 -> 1039606 bytes .../assistant_3/faiss_index_mapping.pkl | Bin 0 -> 1587424 bytes .../user_3/assistant_5/faiss_index.bin | Bin 0 -> 11434 bytes .../assistant_5/faiss_index_mapping.pkl | Bin 0 -> 4218 bytes .../user_3/assistant_6/faiss_index.bin | Bin 0 -> 86154 bytes .../assistant_6/faiss_index_mapping.pkl | Bin 0 -> 9387 bytes .../user_3/assistant_7/faiss_index.bin | Bin 0 -> 9566 bytes .../assistant_7/faiss_index_mapping.pkl | Bin 0 -> 896 bytes .../documents/user_3/page_0_1741377656205.txt | 19 + .../user_3/page_10_1741377712270.txt | 4 + .../user_3/page_11_1741377715811.txt | 28 + .../user_3/page_12_1741377720436.txt | 41 + .../user_3/page_13_1741377727523.txt | 307 ++ .../user_3/page_14_1741377732729.txt | 307 ++ .../user_3/page_15_1741377736703.txt | 79 + .../user_3/page_16_1741377740432.txt | 43 + .../user_3/page_17_1741377743782.txt | 118 + .../user_3/page_18_1741377747827.txt | 27 + .../user_3/page_19_1741377751177.txt | 16 + .../documents/user_3/page_1_1741377662163.txt | 118 + .../user_3/page_20_1741377755341.txt | 3 + .../user_3/page_21_1741377758684.txt | 80 + .../user_3/page_22_1741377762771.txt | 30 + .../user_3/page_23_1741377767807.txt | 44 + .../user_3/page_24_1741388857142.txt | 86 + .../user_3/page_25_1741388865902.txt | 21 + .../user_3/page_26_1741388879757.txt | 140 + .../user_3/page_27_1741388893949.txt | 50 + .../user_3/page_28_1741388901129.txt | 80 + .../user_3/page_29_1741388911352.txt | 118 + .../documents/user_3/page_2_1741377667491.txt | 84 + .../user_3/page_30_1741388919049.txt | 47 + .../user_3/page_31_1741388939620.txt | 80 + .../user_3/page_32_1741388946033.txt | 61 + .../user_3/page_33_1741388952311.txt | 84 + .../user_3/page_34_1741388959988.txt | 11 + .../user_3/page_35_1741388967424.txt | 158 + .../user_3/page_36_1741388974352.txt | 99 + .../user_3/page_37_1741388979308.txt | 68 + .../user_3/page_38_1741388983812.txt | 81 + .../user_3/page_39_1741388988962.txt | 61 + .../documents/user_3/page_3_1741377673593.txt | 307 ++ .../user_3/page_40_1741388993779.txt | 2 + .../user_3/page_41_1741388998581.txt | 84 + .../user_3/page_42_1741389019150.txt | 80 + .../user_3/page_43_1741389024763.txt | 47 + .../user_3/page_44_1741389029209.txt | 307 ++ .../user_3/page_45_1741389032613.txt | 222 + .../user_3/page_46_1741389036820.txt | 419 ++ .../user_3/page_47_1741389042309.txt | 307 ++ .../user_3/page_48_1741389045640.txt | 27 + .../user_3/page_49_1741389049526.txt | 19 + .../documents/user_3/page_4_1741377678959.txt | 90 + .../user_3/page_50_1741389053609.txt | 307 ++ .../user_3/page_51_1741389058005.txt | 155 + .../user_3/page_52_1741389061896.txt | 19 + .../user_3/page_53_1741389066500.txt | 15 + .../user_3/page_54_1741389074295.txt | 27 + .../user_3/page_55_1741389078190.txt | 118 + .../user_3/page_56_1741389081707.txt | 9 + .../user_3/page_57_1741389085926.txt | 154 + .../user_3/page_58_1741389090975.txt | 419 ++ .../user_3/page_59_1741389095009.txt | 134 + .../documents/user_3/page_5_1741377687248.txt | 463 ++ .../user_3/page_60_1741389098619.txt | 155 + .../user_3/page_61_1741389103314.txt | 13 + .../user_3/page_62_1741397568229.txt | 84 + .../user_3/page_63_1741397568230.txt | 19 + .../user_3/page_64_1741393207293.txt | 8 + .../user_3/page_65_1741393207293.txt | 28 + .../documents/user_3/page_6_1741377690835.txt | 76 + .../documents/user_3/page_7_1741377694298.txt | 11 + .../documents/user_3/page_8_1741377697879.txt | 4 + .../documents/user_3/page_9_1741377701847.txt | 93 + .../intelaide-ecosystem.config.cjs | 25 + .../middlewares/authMiddleware.js | 21 + intelaide-backend/models/Assistant.js | 51 + intelaide-backend/models/File.js | 35 + intelaide-backend/models/User.js | 69 + intelaide-backend/package-lock.json | 1298 ++++++ intelaide-backend/package.json | 24 + .../python/ai_gen_rag_mapping_postgresql.py | 305 ++ .../bkup_create_embeds_from_files_mapping.py | 193 + .../python/bkup_faiss_search_mapping.py | 308 ++ intelaide-backend/python/bkup_rid/about.txt | 1066 +++++ .../about_events_national-conference.txt | 6 + .../python/bkup_rid/about_governance.txt | 382 ++ .../python/bkup_rid/about_resources.txt | 1255 +++++ .../bkup_rid/about_volunteer-leadership.txt | 1542 +++++++ .../python/bkup_rid/bod-nomination-form.txt | 166 + .../bkup_rid/certification-maintenance.txt | 134 + .../python/bkup_rid/certification.txt | 368 ++ ...tification_alternative-pathway-program.txt | 274 ++ ...certification_available-certifications.txt | 659 +++ ...tification_certification-reinstatement.txt | 294 ++ ...rtification_credly-digital-credentials.txt | 299 ++ ...ertifications_available-certifications.txt | 365 ++ intelaide-backend/python/bkup_rid/cpc.txt | 254 + .../python/bkup_rid/eps-complaint-form.txt | 195 + intelaide-backend/python/bkup_rid/eps.txt | 921 ++++ intelaide-backend/python/bkup_rid/faqs.txt | 1553 +++++++ .../python/bkup_rid/membership.txt | 363 ++ .../python/bkup_rid/programs.txt | 37 + .../programs_certification-maintenance.txt | 130 + ...rograms_certification-maintenance_acet.txt | 111 + ...fication-maintenance_approved-sponsors.txt | 98 + ...rograms_certification-maintenance_ceus.txt | 253 + ...ertification-maintenance_ceus_ppo-ceus.txt | 64 + ...programs_certification-maintenance_cmp.txt | 296 ++ ...ntenance_workshop-presenters-and-hosts.txt | 141 + .../python/bkup_rid/programs_ethics.txt | 509 ++ ...ms_ethics_code-of-professional-conduct.txt | 23 + .../programs_ethics_eps-complaints.txt | 82 + .../programs_ethics_eps-procedures.txt | 150 + .../programs_ethics_eps-violations.txt | 73 + .../python/bkup_rid/programs_gap.txt | 113 + .../programs_gap_advocacy-toolkit.txt | 343 ++ ...rograms_gap_state-by-state-regulations.txt | 922 ++++ .../python/bkup_rid/programs_membership.txt | 396 ++ ...programs_membership_affiliate-chapters.txt | 327 ++ ...ams_membership_affiliate-chapters_acrc.txt | 955 ++++ .../programs_membership_publications.txt | 340 ++ .../python/bkup_rid/programs_webinars.txt | 202 + .../python/bkup_rid/rid-forms.txt | 158 + .../bkup_rid/scholarships-and-awards.txt | 211 + .../bkup_rid/volunteer-leadership-app.txt | 427 ++ .../create_embeds_from_files_mapping.py | 193 + .../python/faiss_search_mapping.py | 306 ++ intelaide-backend/python/files_oneline.sh | 25 + intelaide-backend/python/nltk_download.py | 6 + intelaide-backend/python/print_pickle.py | 12 + intelaide-backend/python/rag_mapping.py | 236 + intelaide-backend/python/requirements.txt | 52 + intelaide-backend/python/rid/about.txt | 1066 +++++ .../rid/about_events_national-conference.txt | 6 + .../python/rid/about_governance.txt | 382 ++ .../python/rid/about_resources.txt | 1255 +++++ .../python/rid/about_volunteer-leadership.txt | 1542 +++++++ .../python/rid/bod-nomination-form.txt | 166 + .../python/rid/certification-maintenance.txt | 134 + .../python/rid/certification.txt | 368 ++ ...tification_alternative-pathway-program.txt | 274 ++ ...tification_certification-reinstatement.txt | 294 ++ ...rtification_credly-digital-credentials.txt | 299 ++ intelaide-backend/python/rid/cpc.txt | 153 + .../python/rid/eps-complaint-form.txt | 195 + intelaide-backend/python/rid/faqs.txt | 1551 +++++++ intelaide-backend/python/rid/membership.txt | 363 ++ intelaide-backend/python/rid/programs.txt | 26 + .../programs_certification-maintenance.txt | 130 + ...rograms_certification-maintenance_acet.txt | 111 + ...fication-maintenance_approved-sponsors.txt | 98 + ...rograms_certification-maintenance_ceus.txt | 253 + ...ertification-maintenance_ceus_ppo-ceus.txt | 64 + ...programs_certification-maintenance_cmp.txt | 296 ++ ...ntenance_workshop-presenters-and-hosts.txt | 141 + .../python/rid/programs_ethics.txt | 509 ++ ...ms_ethics_code-of-professional-conduct.txt | 23 + .../rid/programs_ethics_eps-complaints.txt | 82 + .../rid/programs_ethics_eps-procedures.txt | 150 + .../rid/programs_ethics_eps-violations.txt | 73 + intelaide-backend/python/rid/programs_gap.txt | 113 + .../rid/programs_gap_advocacy-toolkit.txt | 343 ++ ...rograms_gap_state-by-state-regulations.txt | 922 ++++ .../python/rid/programs_membership.txt | 396 ++ ...programs_membership_affiliate-chapters.txt | 327 ++ ...ams_membership_affiliate-chapters_acrc.txt | 955 ++++ .../rid/programs_membership_publications.txt | 340 ++ .../python/rid/programs_webinars.txt | 202 + intelaide-backend/python/rid/rid-forms.txt | 158 + .../python/rid/scholarships-and-awards.txt | 211 + intelaide-backend/python/show_all.py | 88 + intelaide-backend/routes/assistantRoutes.js | 49 + intelaide-backend/routes/authRoutes.js | 10 + intelaide-backend/routes/fileRoutes.js | 14 + intelaide-backend/routes/ollamaRoutes.js | 12 + intelaide-backend/routes/userRoutes.js | 24 + intelaide-backend/server.js | 54 + intelaide-frontend/README.md | 12 + intelaide-frontend/eslint.config.js | 33 + intelaide-frontend/index.html | 13 + intelaide-frontend/package-lock.json | 4080 +++++++++++++++++ intelaide-frontend/package.json | 34 + intelaide-frontend/public/favicon.jpg | Bin 0 -> 76182 bytes intelaide-frontend/public/logo.jpg | Bin 0 -> 92229 bytes intelaide-frontend/public/vite.svg | 1 + intelaide-frontend/src/App.css | 42 + intelaide-frontend/src/App.jsx | 18 + intelaide-frontend/src/TestFileInput.jsx | 23 + intelaide-frontend/src/assets/logo.jpg | Bin 0 -> 92229 bytes intelaide-frontend/src/assets/react.svg | 1 + intelaide-frontend/src/bkup_App.jsx | 18 + .../src/components/LoginForm.jsx | 142 + intelaide-frontend/src/index.css | 70 + intelaide-frontend/src/main.jsx | 16 + .../src/pages/DashboardPage.css | 17 + .../src/pages/DashboardPage.jsx | 442 ++ intelaide-frontend/src/pages/HomePage.css | 36 + intelaide-frontend/src/pages/HomePage.jsx | 23 + intelaide-frontend/src/pages/LoginPage.jsx | 20 + .../src/pages/QueryAssistantPage.jsx | 104 + .../src/pages/bkup_DashboardPage.jsx | 389 ++ intelaide-frontend/vite.config.js | 14 + 297 files changed, 74281 insertions(+) create mode 100644 .gitignore create mode 100644 db.txt create mode 100644 doclink/.gitignore create mode 100644 doclink/README.md create mode 100644 doclink/app/__init__.py create mode 100644 doclink/app/api/__init__.py create mode 100644 doclink/app/api/core.py create mode 100644 doclink/app/api/endpoints.py create mode 100644 doclink/app/db/__init__.py create mode 100644 doclink/app/db/config.py create mode 100644 doclink/app/db/database.py create mode 100644 doclink/app/db/sql/database_reset.sql create mode 100644 doclink/app/db/sql/table_initialize.sql create mode 100644 doclink/app/functions/__init__.py create mode 100644 doclink/app/functions/chatbot_functions.py create mode 100644 doclink/app/functions/embedding_functions.py create mode 100644 doclink/app/functions/export_functions.py create mode 100644 doclink/app/functions/indexing_functions.py create mode 100644 doclink/app/functions/reading_functions.py create mode 100644 doclink/app/functions/scraping_functions.py create mode 100644 doclink/app/main_dev.py create mode 100644 doclink/app/main_prod.py create mode 100644 doclink/app/redis_manager.py create mode 100644 doclink/app/static/css/app.css create mode 100644 doclink/app/static/favicon/apple-touch-icon.png create mode 100644 doclink/app/static/favicon/favicon-16x16.png create mode 100644 doclink/app/static/favicon/favicon-32x32.png create mode 100644 doclink/app/static/favicon/site.webmanifest create mode 100644 doclink/app/static/js/app-api.js create mode 100644 doclink/app/static/js/app.js create mode 100644 doclink/app/utils/prompts.yaml create mode 100644 doclink/doclink/app/__init__.py create mode 100644 doclink/doclink/app/api/__init__.py create mode 100644 doclink/doclink/app/api/core.py create mode 100644 doclink/doclink/app/api/endpoints.py create mode 100644 doclink/doclink/app/db/__init__.py create mode 100644 doclink/doclink/app/db/config.py create mode 100644 doclink/doclink/app/db/database.py create mode 100644 doclink/doclink/app/db/sql/database_reset.sql create mode 100644 doclink/doclink/app/db/sql/table_initialize.sql create mode 100644 doclink/doclink/app/functions/__init__.py create mode 100644 doclink/doclink/app/functions/chatbot_functions.py create mode 100644 doclink/doclink/app/functions/embedding_functions.py create mode 100644 doclink/doclink/app/functions/export_functions.py create mode 100644 doclink/doclink/app/functions/indexing_functions.py create mode 100644 doclink/doclink/app/functions/reading_functions.py create mode 100644 doclink/doclink/app/functions/scraping_functions.py create mode 120000 doclink/doclink/app/m create mode 100644 doclink/doclink/app/main_dev.py create mode 100644 doclink/doclink/app/main_prod.py create mode 100644 doclink/doclink/app/redis_manager.py create mode 100644 doclink/doclink/app/static/css/app.css create mode 100644 doclink/doclink/app/static/favicon/apple-touch-icon.png create mode 100644 doclink/doclink/app/static/favicon/favicon-16x16.png create mode 100644 doclink/doclink/app/static/favicon/favicon-32x32.png create mode 100644 doclink/doclink/app/static/favicon/site.webmanifest create mode 100644 doclink/doclink/app/static/js/app-api.js create mode 100644 doclink/doclink/app/static/js/app.js create mode 100644 doclink/doclink/app/test_db_conn.py create mode 100644 doclink/doclink/app/utils/prompts.yaml create mode 100644 doclink/doclink/templates/app.html create mode 100644 doclink/doclink/templates/index.html create mode 100644 doclink/doclink/tests/__init__.py create mode 100644 doclink/doclink/tests/test_redis_connection.py create mode 100644 doclink/filelist.txt create mode 100644 doclink/hold/README.md create mode 100644 doclink/hold/requirements.txt create mode 100644 doclink/licence.md create mode 100755 doclink/recreate_ai_files.sh create mode 100644 doclink/requirements.txt create mode 100644 doclink/templates/app.html create mode 100644 doclink/tests/__init__.py create mode 100644 doclink/tests/test_redis_connection.py create mode 100644 intelaide-backend/config/db.js create mode 100644 intelaide-backend/controllers/assistantController.js create mode 100644 intelaide-backend/controllers/authController.js create mode 100644 intelaide-backend/controllers/embeddingController.js create mode 100644 intelaide-backend/controllers/fileController.js create mode 100644 intelaide-backend/controllers/ollamaController.js create mode 100644 intelaide-backend/controllers/userController.js create mode 100644 intelaide-backend/documents/user_3/01_mission_vision_1755718653317.md create mode 100644 intelaide-backend/documents/user_3/02_org_chart_1755718653316.md create mode 100644 intelaide-backend/documents/user_3/03_employee_handbook_1755718653316.md create mode 100644 intelaide-backend/documents/user_3/04_it_security_policies_1755718653316.md create mode 100644 intelaide-backend/documents/user_3/05_code_of_conduct_1755718653316.md create mode 100644 intelaide-backend/documents/user_3/06_strategic_plan_1755718653315.md create mode 100644 intelaide-backend/documents/user_3/07_annual_report_1755718653315.md create mode 100644 intelaide-backend/documents/user_3/08_standard_operating_procedures_1755718653315.md create mode 100644 intelaide-backend/documents/user_3/09_training_onboarding_1755718653315.md create mode 100644 intelaide-backend/documents/user_3/10_style_guide_1755718653314.md create mode 100644 intelaide-backend/documents/user_3/about_advertising_1741802987918.md create mode 100644 intelaide-backend/documents/user_3/about_advertising_1741803389122.md create mode 100644 intelaide-backend/documents/user_3/assistant_2/faiss_index.bin create mode 100644 intelaide-backend/documents/user_3/assistant_2/faiss_index_mapping.pkl create mode 100644 intelaide-backend/documents/user_3/assistant_3/faiss_index.bin create mode 100644 intelaide-backend/documents/user_3/assistant_3/faiss_index_mapping.pkl create mode 100644 intelaide-backend/documents/user_3/assistant_5/faiss_index.bin create mode 100644 intelaide-backend/documents/user_3/assistant_5/faiss_index_mapping.pkl create mode 100644 intelaide-backend/documents/user_3/assistant_6/faiss_index.bin create mode 100644 intelaide-backend/documents/user_3/assistant_6/faiss_index_mapping.pkl create mode 100644 intelaide-backend/documents/user_3/assistant_7/faiss_index.bin create mode 100644 intelaide-backend/documents/user_3/assistant_7/faiss_index_mapping.pkl create mode 100644 intelaide-backend/documents/user_3/page_0_1741377656205.txt create mode 100644 intelaide-backend/documents/user_3/page_10_1741377712270.txt create mode 100644 intelaide-backend/documents/user_3/page_11_1741377715811.txt create mode 100644 intelaide-backend/documents/user_3/page_12_1741377720436.txt create mode 100644 intelaide-backend/documents/user_3/page_13_1741377727523.txt create mode 100644 intelaide-backend/documents/user_3/page_14_1741377732729.txt create mode 100644 intelaide-backend/documents/user_3/page_15_1741377736703.txt create mode 100644 intelaide-backend/documents/user_3/page_16_1741377740432.txt create mode 100644 intelaide-backend/documents/user_3/page_17_1741377743782.txt create mode 100644 intelaide-backend/documents/user_3/page_18_1741377747827.txt create mode 100644 intelaide-backend/documents/user_3/page_19_1741377751177.txt create mode 100644 intelaide-backend/documents/user_3/page_1_1741377662163.txt create mode 100644 intelaide-backend/documents/user_3/page_20_1741377755341.txt create mode 100644 intelaide-backend/documents/user_3/page_21_1741377758684.txt create mode 100644 intelaide-backend/documents/user_3/page_22_1741377762771.txt create mode 100644 intelaide-backend/documents/user_3/page_23_1741377767807.txt create mode 100644 intelaide-backend/documents/user_3/page_24_1741388857142.txt create mode 100644 intelaide-backend/documents/user_3/page_25_1741388865902.txt create mode 100644 intelaide-backend/documents/user_3/page_26_1741388879757.txt create mode 100644 intelaide-backend/documents/user_3/page_27_1741388893949.txt create mode 100644 intelaide-backend/documents/user_3/page_28_1741388901129.txt create mode 100644 intelaide-backend/documents/user_3/page_29_1741388911352.txt create mode 100644 intelaide-backend/documents/user_3/page_2_1741377667491.txt create mode 100644 intelaide-backend/documents/user_3/page_30_1741388919049.txt create mode 100644 intelaide-backend/documents/user_3/page_31_1741388939620.txt create mode 100644 intelaide-backend/documents/user_3/page_32_1741388946033.txt create mode 100644 intelaide-backend/documents/user_3/page_33_1741388952311.txt create mode 100644 intelaide-backend/documents/user_3/page_34_1741388959988.txt create mode 100644 intelaide-backend/documents/user_3/page_35_1741388967424.txt create mode 100644 intelaide-backend/documents/user_3/page_36_1741388974352.txt create mode 100644 intelaide-backend/documents/user_3/page_37_1741388979308.txt create mode 100644 intelaide-backend/documents/user_3/page_38_1741388983812.txt create mode 100644 intelaide-backend/documents/user_3/page_39_1741388988962.txt create mode 100644 intelaide-backend/documents/user_3/page_3_1741377673593.txt create mode 100644 intelaide-backend/documents/user_3/page_40_1741388993779.txt create mode 100644 intelaide-backend/documents/user_3/page_41_1741388998581.txt create mode 100644 intelaide-backend/documents/user_3/page_42_1741389019150.txt create mode 100644 intelaide-backend/documents/user_3/page_43_1741389024763.txt create mode 100644 intelaide-backend/documents/user_3/page_44_1741389029209.txt create mode 100644 intelaide-backend/documents/user_3/page_45_1741389032613.txt create mode 100644 intelaide-backend/documents/user_3/page_46_1741389036820.txt create mode 100644 intelaide-backend/documents/user_3/page_47_1741389042309.txt create mode 100644 intelaide-backend/documents/user_3/page_48_1741389045640.txt create mode 100644 intelaide-backend/documents/user_3/page_49_1741389049526.txt create mode 100644 intelaide-backend/documents/user_3/page_4_1741377678959.txt create mode 100644 intelaide-backend/documents/user_3/page_50_1741389053609.txt create mode 100644 intelaide-backend/documents/user_3/page_51_1741389058005.txt create mode 100644 intelaide-backend/documents/user_3/page_52_1741389061896.txt create mode 100644 intelaide-backend/documents/user_3/page_53_1741389066500.txt create mode 100644 intelaide-backend/documents/user_3/page_54_1741389074295.txt create mode 100644 intelaide-backend/documents/user_3/page_55_1741389078190.txt create mode 100644 intelaide-backend/documents/user_3/page_56_1741389081707.txt create mode 100644 intelaide-backend/documents/user_3/page_57_1741389085926.txt create mode 100644 intelaide-backend/documents/user_3/page_58_1741389090975.txt create mode 100644 intelaide-backend/documents/user_3/page_59_1741389095009.txt create mode 100644 intelaide-backend/documents/user_3/page_5_1741377687248.txt create mode 100644 intelaide-backend/documents/user_3/page_60_1741389098619.txt create mode 100644 intelaide-backend/documents/user_3/page_61_1741389103314.txt create mode 100644 intelaide-backend/documents/user_3/page_62_1741397568229.txt create mode 100644 intelaide-backend/documents/user_3/page_63_1741397568230.txt create mode 100644 intelaide-backend/documents/user_3/page_64_1741393207293.txt create mode 100644 intelaide-backend/documents/user_3/page_65_1741393207293.txt create mode 100644 intelaide-backend/documents/user_3/page_6_1741377690835.txt create mode 100644 intelaide-backend/documents/user_3/page_7_1741377694298.txt create mode 100644 intelaide-backend/documents/user_3/page_8_1741377697879.txt create mode 100644 intelaide-backend/documents/user_3/page_9_1741377701847.txt create mode 100644 intelaide-backend/intelaide-ecosystem.config.cjs create mode 100644 intelaide-backend/middlewares/authMiddleware.js create mode 100644 intelaide-backend/models/Assistant.js create mode 100644 intelaide-backend/models/File.js create mode 100644 intelaide-backend/models/User.js create mode 100644 intelaide-backend/package-lock.json create mode 100644 intelaide-backend/package.json create mode 100644 intelaide-backend/python/ai_gen_rag_mapping_postgresql.py create mode 100644 intelaide-backend/python/bkup_create_embeds_from_files_mapping.py create mode 100644 intelaide-backend/python/bkup_faiss_search_mapping.py create mode 100644 intelaide-backend/python/bkup_rid/about.txt create mode 100644 intelaide-backend/python/bkup_rid/about_events_national-conference.txt create mode 100644 intelaide-backend/python/bkup_rid/about_governance.txt create mode 100644 intelaide-backend/python/bkup_rid/about_resources.txt create mode 100644 intelaide-backend/python/bkup_rid/about_volunteer-leadership.txt create mode 100644 intelaide-backend/python/bkup_rid/bod-nomination-form.txt create mode 100644 intelaide-backend/python/bkup_rid/certification-maintenance.txt create mode 100644 intelaide-backend/python/bkup_rid/certification.txt create mode 100644 intelaide-backend/python/bkup_rid/certification_alternative-pathway-program.txt create mode 100644 intelaide-backend/python/bkup_rid/certification_available-certifications.txt create mode 100644 intelaide-backend/python/bkup_rid/certification_certification-reinstatement.txt create mode 100644 intelaide-backend/python/bkup_rid/certification_credly-digital-credentials.txt create mode 100644 intelaide-backend/python/bkup_rid/certifications_available-certifications.txt create mode 100644 intelaide-backend/python/bkup_rid/cpc.txt create mode 100644 intelaide-backend/python/bkup_rid/eps-complaint-form.txt create mode 100644 intelaide-backend/python/bkup_rid/eps.txt create mode 100644 intelaide-backend/python/bkup_rid/faqs.txt create mode 100644 intelaide-backend/python/bkup_rid/membership.txt create mode 100644 intelaide-backend/python/bkup_rid/programs.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_acet.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_approved-sponsors.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_ceus.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_ceus_ppo-ceus.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_cmp.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_certification-maintenance_workshop-presenters-and-hosts.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_ethics.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_ethics_code-of-professional-conduct.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_ethics_eps-complaints.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_ethics_eps-procedures.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_ethics_eps-violations.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_gap.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_gap_advocacy-toolkit.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_gap_state-by-state-regulations.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_membership.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_membership_affiliate-chapters.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_membership_affiliate-chapters_acrc.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_membership_publications.txt create mode 100644 intelaide-backend/python/bkup_rid/programs_webinars.txt create mode 100644 intelaide-backend/python/bkup_rid/rid-forms.txt create mode 100644 intelaide-backend/python/bkup_rid/scholarships-and-awards.txt create mode 100644 intelaide-backend/python/bkup_rid/volunteer-leadership-app.txt create mode 100644 intelaide-backend/python/create_embeds_from_files_mapping.py create mode 100644 intelaide-backend/python/faiss_search_mapping.py create mode 100755 intelaide-backend/python/files_oneline.sh create mode 100644 intelaide-backend/python/nltk_download.py create mode 100755 intelaide-backend/python/print_pickle.py create mode 100644 intelaide-backend/python/rag_mapping.py create mode 100644 intelaide-backend/python/requirements.txt create mode 100644 intelaide-backend/python/rid/about.txt create mode 100644 intelaide-backend/python/rid/about_events_national-conference.txt create mode 100644 intelaide-backend/python/rid/about_governance.txt create mode 100644 intelaide-backend/python/rid/about_resources.txt create mode 100644 intelaide-backend/python/rid/about_volunteer-leadership.txt create mode 100644 intelaide-backend/python/rid/bod-nomination-form.txt create mode 100644 intelaide-backend/python/rid/certification-maintenance.txt create mode 100644 intelaide-backend/python/rid/certification.txt create mode 100644 intelaide-backend/python/rid/certification_alternative-pathway-program.txt create mode 100644 intelaide-backend/python/rid/certification_certification-reinstatement.txt create mode 100644 intelaide-backend/python/rid/certification_credly-digital-credentials.txt create mode 100644 intelaide-backend/python/rid/cpc.txt create mode 100644 intelaide-backend/python/rid/eps-complaint-form.txt create mode 100644 intelaide-backend/python/rid/faqs.txt create mode 100644 intelaide-backend/python/rid/membership.txt create mode 100644 intelaide-backend/python/rid/programs.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_acet.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_approved-sponsors.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_ceus.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_ceus_ppo-ceus.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_cmp.txt create mode 100644 intelaide-backend/python/rid/programs_certification-maintenance_workshop-presenters-and-hosts.txt create mode 100644 intelaide-backend/python/rid/programs_ethics.txt create mode 100644 intelaide-backend/python/rid/programs_ethics_code-of-professional-conduct.txt create mode 100644 intelaide-backend/python/rid/programs_ethics_eps-complaints.txt create mode 100644 intelaide-backend/python/rid/programs_ethics_eps-procedures.txt create mode 100644 intelaide-backend/python/rid/programs_ethics_eps-violations.txt create mode 100644 intelaide-backend/python/rid/programs_gap.txt create mode 100644 intelaide-backend/python/rid/programs_gap_advocacy-toolkit.txt create mode 100644 intelaide-backend/python/rid/programs_gap_state-by-state-regulations.txt create mode 100644 intelaide-backend/python/rid/programs_membership.txt create mode 100644 intelaide-backend/python/rid/programs_membership_affiliate-chapters.txt create mode 100644 intelaide-backend/python/rid/programs_membership_affiliate-chapters_acrc.txt create mode 100644 intelaide-backend/python/rid/programs_membership_publications.txt create mode 100644 intelaide-backend/python/rid/programs_webinars.txt create mode 100644 intelaide-backend/python/rid/rid-forms.txt create mode 100644 intelaide-backend/python/rid/scholarships-and-awards.txt create mode 100644 intelaide-backend/python/show_all.py create mode 100644 intelaide-backend/routes/assistantRoutes.js create mode 100644 intelaide-backend/routes/authRoutes.js create mode 100644 intelaide-backend/routes/fileRoutes.js create mode 100644 intelaide-backend/routes/ollamaRoutes.js create mode 100644 intelaide-backend/routes/userRoutes.js create mode 100644 intelaide-backend/server.js create mode 100644 intelaide-frontend/README.md create mode 100644 intelaide-frontend/eslint.config.js create mode 100644 intelaide-frontend/index.html create mode 100644 intelaide-frontend/package-lock.json create mode 100644 intelaide-frontend/package.json create mode 100644 intelaide-frontend/public/favicon.jpg create mode 100644 intelaide-frontend/public/logo.jpg create mode 100644 intelaide-frontend/public/vite.svg create mode 100644 intelaide-frontend/src/App.css create mode 100644 intelaide-frontend/src/App.jsx create mode 100644 intelaide-frontend/src/TestFileInput.jsx create mode 100644 intelaide-frontend/src/assets/logo.jpg create mode 100644 intelaide-frontend/src/assets/react.svg create mode 100644 intelaide-frontend/src/bkup_App.jsx create mode 100644 intelaide-frontend/src/components/LoginForm.jsx create mode 100644 intelaide-frontend/src/index.css create mode 100644 intelaide-frontend/src/main.jsx create mode 100644 intelaide-frontend/src/pages/DashboardPage.css create mode 100644 intelaide-frontend/src/pages/DashboardPage.jsx create mode 100644 intelaide-frontend/src/pages/HomePage.css create mode 100644 intelaide-frontend/src/pages/HomePage.jsx create mode 100644 intelaide-frontend/src/pages/LoginPage.jsx create mode 100644 intelaide-frontend/src/pages/QueryAssistantPage.jsx create mode 100644 intelaide-frontend/src/pages/bkup_DashboardPage.jsx create mode 100644 intelaide-frontend/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17569e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +# Dependencies +node_modules/ + +# Build output +dist/ + +# Python virtual environment +bin/ +include/ +lib/ +lib64 +share/ +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +pyvenv.cfg + +# Uploads +uploads/ + +# Logs +*.log + +# Environment files +.env +.env.local +.env.*.local + +# IDE/Editor +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store + +# OS files +Thumbs.db + +# Package manager +.npm +.yarn +*.tgz + +# Testing +coverage/ +.nyc_output/ + +# Misc +*.pid +*.seed +*.pid.lock diff --git a/db.txt b/db.txt new file mode 100644 index 0000000..83dfb9d --- /dev/null +++ b/db.txt @@ -0,0 +1,190 @@ +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump 10.19 Distrib 10.11.11-MariaDB, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: assist_hub +-- ------------------------------------------------------ +-- Server version 10.11.11-MariaDB-0ubuntu0.24.04.2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `ai_assistants` +-- + +DROP TABLE IF EXISTS `ai_assistants`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `ai_assistants` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `assistant_name` varchar(255) NOT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + `faiss_index_path` varchar(500) DEFAULT NULL, + `embedding_status` enum('not_generated','generating','completed','failed') DEFAULT 'not_generated', + PRIMARY KEY (`id`), + UNIQUE KEY `user_id` (`user_id`,`assistant_name`), + KEY `idx_assistant_name` (`assistant_name`), + CONSTRAINT `ai_assistants_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ai_assistants` +-- + +LOCK TABLES `ai_assistants` WRITE; +/*!40000 ALTER TABLE `ai_assistants` DISABLE KEYS */; +INSERT INTO `ai_assistants` VALUES +(2,3,'Office','2025-03-07 16:27:29','/root/intelaide-backend/documents/user_3/assistant_2/faiss_index.bin','completed'), +(3,3,'RID','2025-03-07 20:00:36','/root/intelaide-backend/documents/user_3/assistant_3/faiss_index.bin','completed'); +/*!40000 ALTER TABLE `ai_assistants` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `assistant_files` +-- + +DROP TABLE IF EXISTS `assistant_files`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `assistant_files` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `assistant_id` int(11) NOT NULL, + `file_id` int(11) NOT NULL, + `assigned_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + KEY `assistant_id` (`assistant_id`), + KEY `file_id` (`file_id`), + CONSTRAINT `assistant_files_ibfk_1` FOREIGN KEY (`assistant_id`) REFERENCES `ai_assistants` (`id`) ON DELETE CASCADE, + CONSTRAINT `assistant_files_ibfk_2` FOREIGN KEY (`file_id`) REFERENCES `files` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1090 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `assistant_files` +-- + +LOCK TABLES `assistant_files` WRITE; +/*!40000 ALTER TABLE `assistant_files` DISABLE KEYS */; +/*!40000 ALTER TABLE `assistant_files` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `files` +-- + +DROP TABLE IF EXISTS `files`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `files` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `file_name` varchar(255) NOT NULL, + `file_path` varchar(500) NOT NULL, + `file_type` enum('txt','pdf','md') NOT NULL, + `status` enum('uploaded','approved','excluded','deleted') DEFAULT 'uploaded', + `uploaded_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `idx_files_file_name` (`file_name`), + CONSTRAINT `files_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=616 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `files` +-- + +LOCK TABLES `files` WRITE; +/*!40000 ALTER TABLE `files` DISABLE KEYS */; +/*!40000 ALTER TABLE `files` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sessions` +-- + +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `session_token` varchar(255) NOT NULL, + `expires_at` timestamp NOT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `session_token` (`session_token`), + KEY `user_id` (`user_id`), + CONSTRAINT `sessions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sessions` +-- + +LOCK TABLES `sessions` WRITE; +/*!40000 ALTER TABLE `sessions` DISABLE KEYS */; +/*!40000 ALTER TABLE `sessions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `password_hash` varchar(255) NOT NULL, + `organization` varchar(255) DEFAULT NULL, + `first_name` varchar(100) DEFAULT NULL, + `last_name` varchar(100) DEFAULT NULL, + `address` varchar(255) DEFAULT NULL, + `city` varchar(100) DEFAULT NULL, + `state` char(2) DEFAULT NULL, + `zip_code` varchar(10) DEFAULT NULL, + `phone` varchar(15) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + KEY `idx_users_email` (`email`), + CONSTRAINT `users_chk_1` CHECK (`state` regexp '^[A-Z]{2}$'), + CONSTRAINT `users_chk_2` CHECK (`zip_code` regexp '^[0-9]{5}(-[0-9]{4})?$'), + CONSTRAINT `users_chk_3` CHECK (`phone` regexp '^(\\d{10}|\\d{3}-\\d{3}-\\d{4})$') +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users` +-- + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` VALUES +(3,'jnevans@gmail.com','$2b$10$Glx7ciFDCBGkBTJIr8ydZe/cwFBvIxLQ2EPYoIQ1aLlBf0f.SxZz2','Intelaide','Jared','Evans','11320 king George dr','Silver Spring','MD','20902','2028535544','2025-03-07 16:26:52'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-04-14 0:37:43 diff --git a/doclink/.gitignore b/doclink/.gitignore new file mode 100644 index 0000000..28df5f3 --- /dev/null +++ b/doclink/.gitignore @@ -0,0 +1,86 @@ +# Default rules +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Environments +.env* +.venv/ +venv/ +*.ipynb + +# VS Code +.vscode/ + +# Database +db_local/ +*.ini \ No newline at end of file diff --git a/doclink/README.md b/doclink/README.md new file mode 100644 index 0000000..6f06d0c --- /dev/null +++ b/doclink/README.md @@ -0,0 +1,109 @@ +# ๐Ÿ”— Doclink.io +Doclink is an AI document assistant that transforms how you interact with your documents. Upload your files, create custom folders, and ask questions to quickly retrieve relevant information across your entire document collection. Doclink connects related information between documents, making complex data analysis simple and intuitive. +We're on the early stage. And want to help everyone on their information processing. Thus, you can use doclink completely for free plus all of our implementation is open source. + +## โœจ Features + +- **๐Ÿ“Š Custom Knowledge Bases**: Create and organize multiple document collections for different topics or projects +- **๐Ÿ“‘ Multi-Format Support**: Upload and analyze PDF, DOCX, XLSX, PPTX, TXT, and web content +- **๐Ÿ” Intelligent Search**: Ask questions in natural language and get precise answers from your documents +- **๐Ÿง  Context-Aware Responses**: AI understands the relationships between your documents for comprehensive answers +- **๐Ÿ“Œ Source Citations**: Every answer includes references to specific document sources for easy verification +- **๐ŸŒ Web Interface**: Intuitive, responsive design works across all devices +- **๐Ÿ”’ Secure Authentication**: Google authentication ensures your document library remains private + +## ๐Ÿš€ Get Started + +1. **Sign Up**: Create an account using your google account on doclink.io +2. **Create a Folder**: Organize your documents into custom folders +3. **Upload Documents**: Add PDFs, Word documents, excel tables, and more +4. **Ask Questions**: Just ask to get information +5. **Analyze Responses**: Review AI-generated answers with source references +6. **Export Insights**: Save and share your findings + +# ๐Ÿ› ๏ธ Tech Stack + +We have a very lean tech stack. We mostly trust our from scratch RAG implementation and RAG understanding. On every benchmark, we have 95% relevancy level on our answers. +We're not very experienced web developers. But we trust our AI & RAG implementation. + +## ๐Ÿ–ฅ๏ธ Frontend +- Next.js +- Bootstrap & Custom CSS +- JavaScript + +## ๐Ÿ”ง Backend +- FastAPI +- PostgreSQL +- Redis + +## ๐Ÿง  AI & RAG +- OpenAI: Embeddings and answer generation +- FAISS: Semantic search + +## ๐Ÿ“ Document Processing +- PyMuPDF/Fitz: PDF processing and content extraction +- Docx/XLSX Processing: Support for Microsoft Office document formats +- Web Scraping: Ability to process and index web content + +# ๐Ÿ” RAG Implementation + +## ๐Ÿ“Š Relational Database Approach + +Doclink implements a custom Retrieval-Augmented Generation (RAG) system using PostgreSQL rather than specialized vector databases. This unique approach offers several advantages: + +- **๐Ÿงฉ Simplicity**: Using a single PostgreSQL database for both document metadata and embeddings simplifies the architecture and maintenance +- **๐Ÿ’ฐ Cost Efficiency**: Eliminates the need for additional vector database services or infrastructure +- **โš™๏ธ Flexibility**: Allows for complex queries that combine traditional SQL filtering with vector similarity search + +## ๐Ÿ—๏ธ How It Works + +Our RAG implementation functions through several key components: + +1. **๐Ÿ“„ Document Processing**: Documents are processed, split into meaningful chunks, and transformed into embeddings using OpenAI's embedding models +2. **๐Ÿ’พ Storage**: These embeddings are stored in PostgreSQL using the `BYTEA` data type, alongside document metadata and user information +3. **๐Ÿ”Ž Retrieval**: When a query is submitted, it's converted to an embedding and similarity search is performed against stored document embeddings +4. **๐Ÿง  Context Building**: The most relevant document chunks are assembled into a context window using custom logic that considers: + - Semantic relevance scores + - Document structure (headers, paragraphs, tables) + - User-selected file filters +5. **โœ๏ธ Response Generation**: The retrieved context is sent to the language model along with the original query to generate accurate, contextually relevant responses + +## ๐Ÿ” Security Layer + +Unlike many RAG implementations, Doclink adds an encryption layer to stored document content: + +- **๐Ÿ”’ AES-GCM Encryption**: Document content is encrypted before storage, with each file having a unique authentication tag +- **๐Ÿ”‘ Secure Decryption**: Content is only decrypted when needed for response generation +- **๐Ÿ›ก๏ธ Privacy Preservation**: Original document content remains protected even if the database is compromised + +This approach combines the power of modern vector search techniques with the reliability and familiarity of relational databases, creating a robust, secure, and maintainable RAG system. + +This architecture enables Doclink to securely handle document processing, embedding generation, and sophisticated question-answering capabilities while maintaining a responsive user experience. + +# ๐Ÿ‘ฅ Contributing + +We welcome contributions to Doclink! If you need a specific update, please open an issue we will be on it. +If you want to be part of our team, please reach us. + +# ๐Ÿ™ Acknowledgments + +Doclink stands on the shoulders of giants. We'd like to acknowledge the following projects and libraries that make our work possible: + +- **OpenAI** - For their powerful language models and embeddings +- **PyMuPDF (Fitz)** - Document processing library, licensed under GNU GPL v3 +- **FAISS** - Efficient similarity search library from Facebook Research +- **FastAPI** - Modern, fast web framework for building APIs +- **PostgreSQL** - Robust, open-source relational database +- **Next.js** - React framework for production-grade web applications +- **Spacy** - Industrial-strength natural language processing +- **Redis** - In-memory data structure store +- **Bootstrap** - Front-end framework for responsive web design + +Special thanks to: +- All contributors who have invested their time and expertise +- The open-source community for continued inspiration and support +- Our users for valuable feedback and suggestions + +# ๐Ÿ“œ License + +Doclink is released under the MIT License. diff --git a/doclink/app/__init__.py b/doclink/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/app/api/__init__.py b/doclink/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/app/api/core.py b/doclink/app/api/core.py new file mode 100644 index 0000000..4f3b49c --- /dev/null +++ b/doclink/app/api/core.py @@ -0,0 +1,474 @@ +from typing import List +import numpy as np +import bcrypt +import re +import base64 +import os +from dotenv import load_dotenv +from cryptography.hazmat.primitives.ciphers.aead import AESGCM + +from ..functions.reading_functions import ReadingFunctions +from ..functions.embedding_functions import EmbeddingFunctions +from ..functions.indexing_functions import IndexingFunctions +from ..functions.chatbot_functions import ChatbotFunctions +from ..functions.scraping_functions import Webscraper +from ..functions.export_functions import Exporter + + +class Authenticator: + def __init__(self): + pass + + def verify_password(self, plain_password: str, hashed_password: str) -> bool: + return bcrypt.checkpw( + plain_password.encode("utf-8"), hashed_password.encode("utf-8") + ) + + def hash_password(self, password: str) -> str: + salt = bcrypt.gensalt() + return bcrypt.hashpw(password.encode("utf-8"), salt).decode("utf-8") + + +class Encryptor: + def __init__(self): + load_dotenv() + self.key = os.getenv("ENCRYPTION_KEY") + self.email_auth = "EMAIL_AUTH_DATA_2025" + self.email_nonce = self.email_auth.encode("utf-8")[:12].ljust(12, b"\0") + self._key_bytes = base64.b64decode(self.key) + self.aesgcm = AESGCM(self._key_bytes) + + def encrypt(self, text: str, auth_data) -> str: + try: + nonce = os.urandom(12) + encrypted_data = self.aesgcm.encrypt( + nonce, text.encode("utf-8"), auth_data.encode("utf-8") + ) + combined_encrypt = nonce + encrypted_data + encrypted_sentence = base64.b64encode(combined_encrypt).decode("utf-8") + return encrypted_sentence + except Exception as e: + raise e + + def decrypt(self, encrypted_data: str, auth_data) -> str: + try: + decoded_text = base64.b64decode(encrypted_data.encode("utf-8")) + nonce = decoded_text[:12] + encrypted_text = decoded_text[12:] + decrypted_data = self.aesgcm.decrypt( + nonce, encrypted_text, auth_data.encode("utf-8") + ) + return decrypted_data.decode("utf-8") + except Exception as e: + raise e + + +class Processor: + def __init__( + self, + ): + self.ef = EmbeddingFunctions() + self.rf = ReadingFunctions() + self.indf = IndexingFunctions() + self.cf = ChatbotFunctions() + self.en = Encryptor() + self.ws = Webscraper() + self.ex = Exporter() + + def create_index(self, embeddings: np.ndarray, index_type: str = "flat"): + if index_type == "flat": + index = self.indf.create_flat_index(embeddings=embeddings) + return index + + def filter_search( + self, domain_content: dict, domain_embeddings: np.ndarray, file_ids: list + ): + filtered_indexes = [] + filtered_content = [] + + for i, content in enumerate(domain_content): + if content[4] in file_ids: + filtered_indexes.append(i) + filtered_content.append(content) + + filtered_embeddings = domain_embeddings[filtered_indexes] + + index = self.create_index(embeddings=filtered_embeddings) + boost_info = self.extract_boost_info( + domain_content=filtered_content, embeddings=filtered_embeddings + ) + + try: + index_header = self.create_index(embeddings=boost_info["header_embeddings"]) + except IndexError: + index_header = None + + return index, filtered_content, boost_info, index_header + + def search_index( + self, + user_query: str, + domain_content: dict, + boost_info: dict, + index, + index_header, + ): + file_lang = self.file_lang_detection(domain_content=domain_content) + queries, lang = self.query_preprocessing( + user_query=user_query, file_lang=file_lang + ) + if not queries: + if lang == "tr": + return ( + "Sorunu anlayamadฤฑm", + None, + None, + ) + else: + return ( + f"I didn't understand {user_query}", + None, + None, + ) + + query_embeddings = self.ef.create_embeddings_from_sentences( + sentences=queries[:-1] + ) + + boost_array = self._create_boost_array( + header_indexes=boost_info["header_indexes"], + sentence_amount=index.ntotal, + query_vector=query_embeddings[0], + index_header=index_header, + ) + + # Get search distances with occurrences + dict_resource = {} + for i, query_embedding in enumerate(query_embeddings): + D, I = index.search(query_embedding.reshape(1, -1), len(domain_content)) # noqa: E741 + if i == 0: + convergence_vector, distance_vector = I[0], D[0] + for i, match_index in enumerate(I[0]): + if match_index in dict_resource: + dict_resource[match_index].append(D[0][i]) + else: + dict_resource[match_index] = [D[0][i]] + + file_boost_array = self._create_file_boost_array( + domain_content=domain_content, + distance_vector=distance_vector, + convergence_vector=convergence_vector, + ) + + # Combine boost arrays + combined_boost_array = 0.25 * file_boost_array + 0.75 * boost_array + + # Get average occurrences + dict_resource = self._avg_resources(dict_resource) + + for key in dict_resource: + dict_resource[key] *= combined_boost_array[key] + + sorted_dict = dict( + sorted(dict_resource.items(), key=lambda item: item[1], reverse=True) + ) + + filtered_indexes = [ + sentence_index + for sentence_index in sorted_dict.keys() + if sorted_dict[sentence_index] >= 0.35 + ] + sorted_sentence_indexes = filtered_indexes[:10] + + # Early return with message + if not sorted_sentence_indexes: + if lang == "tr": + return ( + "SeรงtiฤŸin dokรผmanlarda bu sorunun cevabฤฑnฤฑ bulamadฤฑm", + None, + None, + ) + else: + return ( + "I couldn't find the answer of the question within the selected files", + None, + None, + ) + + # Sentences to context creation + context, context_windows, resources = self.context_creator( + sentence_index_list=sorted_sentence_indexes, + domain_content=domain_content, + header_indexes=boost_info["header_indexes"], + table_indexes=boost_info["table_indexes"], + ) + + answer = self.cf.response_generation( + query=user_query, context=context, intention=queries[-1] + ) + + return answer, resources, context_windows + + def query_preprocessing(self, user_query, file_lang): + generated_queries, lang = self.cf.query_generation( + query=user_query, file_lang=file_lang + ) + splitted_queries = generated_queries.split("\n") + + if len(splitted_queries) > 1: + return splitted_queries, lang + return None, lang + + def _create_boost_array( + self, + header_indexes: list, + sentence_amount: int, + query_vector: np.ndarray, + index_header, + ): + boost_array = np.ones(sentence_amount) + + if not index_header: + return boost_array + + D, I = index_header.search(query_vector.reshape(1, -1), 10) # noqa: E741 + filtered_header_indexes = [ + header_index + for index, header_index in enumerate(I[0]) + if D[0][index] > 0.30 + ] + + if not filtered_header_indexes: + return boost_array + else: + for i, filtered_index in enumerate(filtered_header_indexes): + try: + start = header_indexes[filtered_index] + 1 + end = header_indexes[filtered_index + 1] + if i > 2: + boost_array[start:end] *= 1.1 + elif i > 0: + boost_array[start:end] *= 1.2 + else: + boost_array[start:end] *= 1.3 + except IndexError as e: + print(f"List is out of range {e}") + continue + return boost_array + + # File boost function + def _create_file_boost_array( + self, + domain_content: list, + distance_vector: np.ndarray, + convergence_vector: np.ndarray, + ): + boost_array = np.ones(len(domain_content)) + sort_order = np.argsort(convergence_vector) + sorted_scores = distance_vector[sort_order] + file_counts = {} + + if not domain_content: + return boost_array + else: + for _, _, _, _, _, filename in domain_content: + file_counts[filename] = file_counts.get(filename, 0) + 1 + + file_sentence_counts = np.cumsum([0] + list(file_counts.values())) + + for i in range(len(file_sentence_counts) - 1): + start, end = file_sentence_counts[i], file_sentence_counts[i + 1] + if np.mean(sorted_scores[start:end]) > 0.30: + boost_array[start:end] *= 1.1 + + return boost_array + + def context_creator( + self, + sentence_index_list: list, + domain_content: List[tuple], + header_indexes: list, + table_indexes: list, + ): + context = "" + context_windows = [] + widened_indexes = [] + original_matches = set(sentence_index_list) + + for i, sentence_index in enumerate(sentence_index_list): + window_size = 4 if i < 3 else 2 + start = max(0, sentence_index - window_size) + end = min(len(domain_content) - 1, sentence_index + window_size) + + if table_indexes: + for table_index in table_indexes: + if sentence_index == table_index: + widened_indexes.append((table_index, table_index)) + table_indexes.remove(table_index) + break + + if not header_indexes: + widened_indexes.append((start, end)) + else: + for i, current_header in enumerate(header_indexes): + if sentence_index == current_header: + start = max(0, sentence_index) + if ( + i + 1 < len(header_indexes) + and abs(sentence_index - header_indexes[i + 1]) <= 20 + ): + end = min( + len(domain_content) - 1, header_indexes[i + 1] - 1 + ) + else: + end = min( + len(domain_content) - 1, sentence_index + window_size + ) + break + elif ( + i + 1 < len(header_indexes) + and current_header < sentence_index < header_indexes[i + 1] + ): + start = ( + current_header + if abs(sentence_index - current_header) <= 20 + else max(0, sentence_index - window_size) + ) + end = ( + header_indexes[i + 1] - 1 + if abs(header_indexes[i + 1] - sentence_index) <= 20 + else min( + len(domain_content) - 1, sentence_index + window_size + ) + ) + break + elif ( + i == len(header_indexes) - 1 + and current_header >= sentence_index + ): + start = ( + max(0, sentence_index) + if abs(current_header - sentence_index) <= 20 + else max(0, sentence_index - window_size) + ) + end = min(len(domain_content) - 1, sentence_index + window_size) + break + if (start, end) not in widened_indexes: + widened_indexes.append((start, end)) + + merged_truples = self.merge_tuples(widen_sentences=widened_indexes) + + used_indexes = [ + min(index for index in sentence_index_list if tuple[0] <= index <= tuple[1]) + for tuple in merged_truples + ] + resources = self._extract_resources( + sentence_indexes=used_indexes, domain_content=domain_content + ) + + for i, tuple in enumerate(merged_truples): + if tuple[0] == tuple[1]: + windened_sentence = " ".join( + self.en.decrypt( + domain_content[tuple[0]][0], domain_content[tuple[0]][4] + ) + ) + context += f"Context{i + 1}: File:{resources['file_names'][i]}, Confidence:{(len(sentence_index_list) - i) / len(sentence_index_list)}, Table\n{windened_sentence}\n" + context_windows.append(windened_sentence) + else: + highlighted_sentences = [] + + for index in range(tuple[0], tuple[1] + 1): + sentence_text = self.en.decrypt( + domain_content[index][0], domain_content[index][4] + ) + + # Highlight original matches + if index in original_matches: + highlighted_sentences.append(f"{sentence_text}") + else: + highlighted_sentences.append(sentence_text) + + windened_sentence = " ".join(highlighted_sentences) + context += f"Context{i + 1}: File:{resources['file_names'][i]}, Confidence:{(len(sentence_index_list) - i) / len(sentence_index_list)}, {windened_sentence}\n\n" + context_windows.append(windened_sentence) + + return context, context_windows, resources + + def _avg_resources(self, resources_dict): + for key, value in resources_dict.items(): + value_mean = sum(value) / len(value) + value_coefficient = value_mean + len(value) * 0.0025 + resources_dict[key] = value_coefficient + return resources_dict + + def _extract_resources(self, sentence_indexes: list, domain_content: List[tuple]): + resources = {"file_names": [], "page_numbers": []} + for index in sentence_indexes: + resources["file_names"].append(domain_content[index][5]) + resources["page_numbers"].append(domain_content[index][3]) + return resources + + def _create_dynamic_context(self, sentences): + context = "" + for i, sentence in enumerate(sentences): + context += f"{i + 1}: {sentence}\n" + return context + + def extract_boost_info(self, domain_content: List[tuple], embeddings: np.ndarray): + boost_info = { + "header_indexes": [], + "headers": [], + "header_embeddings": [], + "table_indexes": [], + } + for index in range(len(domain_content)): + if domain_content[index][1]: + boost_info["header_indexes"].append(index) + boost_info["headers"].append(domain_content[index][0]) + + if domain_content[index][2]: + boost_info["table_indexes"].append(index) + boost_info["header_embeddings"] = embeddings[boost_info["header_indexes"]] + return boost_info + + def merge_tuples(self, widen_sentences): + sorted_dict = {0: widen_sentences[0]} + + for sentence_tuple in widen_sentences[1:]: + tuple_range = range(sentence_tuple[0], sentence_tuple[1]) + is_in = 0 + for index, value in sorted_dict.items(): + current_range = range(value[0], value[1]) + if set(tuple_range) & set(current_range): + interval = ( + min(sorted_dict[index][0], sentence_tuple[0]), + max(sorted_dict[index][1], sentence_tuple[1]), + ) + sorted_dict[index] = interval + is_in = 1 + + if not is_in: + sorted_dict[index + 1] = sentence_tuple + + return list(dict.fromkeys(sorted_dict.values())) + + def file_lang_detection(self, domain_content: List[tuple]): + file_lang = {} + detected_sentence_amount = ( + 25 if len(domain_content) > 25 else len(domain_content) + ) + + for i in range(0, detected_sentence_amount): + decrypted_content = self.en.decrypt( + domain_content[i][0], domain_content[i][4] + ) + if re.match(r"\b[a-zA-Z]{" + str(4) + r",}\b", decrypted_content) or ( + decrypted_content[0] == "|" and decrypted_content[-1] == "|" + ): + lang = self.cf.detect_language(decrypted_content) + file_lang[lang] = file_lang.get(lang, 0) + 1 + try: + return max(file_lang, key=file_lang.get) + except ValueError: + return "en" diff --git a/doclink/app/api/endpoints.py b/doclink/app/api/endpoints.py new file mode 100644 index 0000000..f56b2c7 --- /dev/null +++ b/doclink/app/api/endpoints.py @@ -0,0 +1,846 @@ +from fastapi import APIRouter, UploadFile, HTTPException, Request, Query, File, Form +from fastapi.responses import JSONResponse, StreamingResponse +from google.oauth2.credentials import Credentials +from googleapiclient.discovery import build +from googleapiclient.http import MediaIoBaseDownload +from datetime import datetime + +import os +import logging +import uuid +import base64 +import psycopg2 +import io +import hmac +import hashlib + +from .core import Processor +from .core import Authenticator +from .core import Encryptor +from ..db.database import Database +from ..redis_manager import RedisManager, RedisConnectionError + +# services +router = APIRouter() +processor = Processor() +authenticator = Authenticator() +redis_manager = RedisManager() +encryptor = Encryptor() + +# logger +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# environment variables +GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID") +GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET") +GOOGLE_REDIRECT_URI = os.getenv("GOOGLE_REDIRECT_URI") +GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + + +# request functions +@router.post("/db/get_user_info") +async def get_user_info(request: Request): + try: + data = await request.json() + user_id = data.get("user_id") + with Database() as db: + user_info, domain_info = db.get_user_info_w_id(user_id) + + return JSONResponse( + content={ + "user_info": user_info, + "domain_info": domain_info, + }, + status_code=200, + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/rename_domain") +async def rename_domain(request: Request): + try: + data = await request.json() + selected_domain_id = data.get("domain_id") + new_name = data.get("new_name") + with Database() as db: + success = db.rename_domain(domain_id=selected_domain_id, new_name=new_name) + + if not success: + return JSONResponse( + content={"message": "error while renaming domain"}, + status_code=400, + ) + + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error renaming domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/create_domain") +async def create_domain( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + domain_name = data.get("domain_name") + domain_id = str(uuid.uuid4()) + with Database() as db: + result = db.create_domain( + user_id=userID, + domain_id=domain_id, + domain_name=domain_name, + domain_type=1, + ) + + if not result["success"]: + return JSONResponse( + content={"message": result["message"]}, + status_code=400, + ) + + return JSONResponse( + content={"message": "success", "domain_id": domain_id}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error renaming domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/delete_domain") +async def delete_domain(request: Request): + try: + data = await request.json() + domain_id = data.get("domain_id") + with Database() as db: + success = db.delete_domain(domain_id=domain_id) + + if success < 0: + return JSONResponse( + content={ + "message": "This is your default domain. You cannot delete it completely, instead you can delete the unnucessary files inside!" + }, + status_code=400, + ) + elif success == 0: + return JSONResponse( + content={ + "message": "Error while deleting domain. Please report this to us, using feedback on the bottom left." + }, + status_code=400, + ) + + db.conn.commit() + + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error while deleting domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/insert_feedback") +async def insert_feedback( + userID: str = Query(...), + feedback_type: str = Form(...), + feedback_description: str = Form(...), + feedback_screenshot: UploadFile = File(None), +): + try: + feedback_id = str(uuid.uuid4()) + screenshot_data = None + + if feedback_screenshot: + contents = await feedback_screenshot.read() + if len(contents) > 2 * 1024 * 1024: # 2MB limit + raise HTTPException( + status_code=400, detail="Screenshot size should be less than 2MB" + ) + screenshot_data = base64.b64encode(contents).decode("utf-8") + + with Database() as db: + db.insert_user_feedback( + feedback_id=feedback_id, + user_id=userID, + feedback_type=feedback_type, + description=feedback_description[:5000], + screenshot=screenshot_data, + ) + db.conn.commit() + + return JSONResponse( + content={"message": "Thanks for the feedback!"}, status_code=200 + ) + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/insert_rating") +async def insert_rating( + userID: str = Query(...), + rating: int = Form(...), + user_note: str = Form(""), +): + try: + rating_id = str(uuid.uuid4()) + with Database() as db: + db.insert_user_rating( + rating_id=rating_id, + user_id=userID, + rating=rating, + user_note=user_note if user_note else None, + ) + db.conn.commit() + + return JSONResponse( + content={"message": "Thank you for the rating!"}, status_code=200 + ) + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/qa/select_domain") +async def select_domain( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + selected_domain_id = data.get("domain_id") + _, _, success = update_selected_domain( + user_id=userID, domain_id=selected_domain_id + ) + + if not success: + return JSONResponse( + content={"message": "error while updating selected domain"}, + status_code=400, + ) + + redis_manager.refresh_user_ttl(userID) + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except RedisConnectionError as e: + logger.error(f"Redis connection error: {str(e)}") + raise HTTPException(status_code=503, detail="Service temporarily unavailable") + except Exception as e: + logger.error(f"Error in select_domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/qa/generate_answer") +async def generate_answer( + request: Request, + userID: str = Query(...), + sessionID: str = Query(...), +): + try: + data = await request.json() + user_message = data.get("user_message") + file_ids = data.get("file_ids") + + # Check if domain is selected + selected_domain_id = redis_manager.get_data(f"user:{userID}:selected_domain") + if not selected_domain_id: + return JSONResponse( + content={"message": "Please select a domain first..."}, + status_code=400, + ) + + if not file_ids: + return JSONResponse( + content={"message": "You didn't select any files..."}, + status_code=400, + ) + + with Database() as db: + update_result = db.upsert_session_info(user_id=userID, session_id=sessionID) + + if not update_result["success"]: + return JSONResponse( + content={"message": update_result["message"]}, + status_code=400, + ) + + # Get required data from Redis + index, filtered_content, boost_info, index_header = processor.filter_search( + domain_content=redis_manager.get_data(f"user:{userID}:domain_content"), + domain_embeddings=redis_manager.get_data( + f"user:{userID}:domain_embeddings" + ), + file_ids=file_ids, + ) + + if not index or not filtered_content: + return JSONResponse( + content={"message": "Nothing in here..."}, + status_code=400, + ) + + # Process search + answer, resources, resource_sentences = processor.search_index( + user_query=user_message, + domain_content=filtered_content, + boost_info=boost_info, + index=index, + index_header=index_header, + ) + + if not resources or not resource_sentences: + return JSONResponse( + content={ + "message": answer, + "daily_count": update_result["daily_count"], + }, + status_code=200, + ) + + redis_manager.refresh_user_ttl(userID) + + return JSONResponse( + content={ + "answer": answer, + "resources": resources, + "resource_sentences": resource_sentences, + "question_count": update_result["question_count"], + "daily_count": update_result["daily_count"], + }, + status_code=200, + ) + + except RedisConnectionError as e: + logger.error(f"Redis connection error: {str(e)}") + raise HTTPException(status_code=503, detail="Service temporarily unavailable") + except Exception as e: + logger.error(f"Error in generate_answer: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/io/store_file") +async def store_file( + userID: str = Query(...), + file: UploadFile = File(...), + lastModified: str = Form(...), +): + try: + file_bytes = await file.read() + if not file_bytes: + return JSONResponse( + content={ + "message": f"Empty file {file.filename}. If you think not, please report this to us!" + }, + status_code=400, + ) + + file_data = processor.rf.read_file( + file_bytes=file_bytes, file_name=file.filename + ) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {file.filename}. If there is please report this to us!" + }, + status_code=400, + ) + + # Create embeddings + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + # Store in Redis + redis_key = f"user:{userID}:upload:{file.filename}" + upload_data = { + "file_name": file.filename, + "last_modified": datetime.fromtimestamp(int(lastModified) / 1000).strftime( + "%Y-%m-%d" + )[:20], + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": file.filename}, + status_code=200, + ) + + except Exception as e: + logging.error(f"Error storing file {file.filename}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing file: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/store_drive_file") +async def store_drive_file( + userID: str = Query(...), + lastModified: str = Form(...), + driveFileId: str = Form(...), + driveFileName: str = Form(...), + accessToken: str = Form(...), +): + try: + credentials = Credentials( + token=accessToken, + client_id=GOOGLE_CLIENT_ID, + client_secret=GOOGLE_CLIENT_SECRET, + token_uri="https://oauth2.googleapis.com/token", + ) + + drive_service = build("drive", "v3", credentials=credentials) + + google_mime_types = { + "application/vnd.google-apps.document": ("application/pdf", ".pdf"), + "application/vnd.google-apps.spreadsheet": ( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlsx", + ), + "application/vnd.google-apps.presentation": ( + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".pptx", + ), + "application/vnd.google-apps.script": ("text/plain", ".txt"), + } + + file_metadata = ( + drive_service.files().get(fileId=driveFileId, fields="mimeType").execute() + ) + mime_type = file_metadata["mimeType"] + + if mime_type in google_mime_types: + export_mime_type, extension = google_mime_types[mime_type] + request = drive_service.files().export_media( + fileId=driveFileId, mimeType=export_mime_type + ) + + if not driveFileName.endswith(extension): + driveFileName += extension + else: + request = drive_service.files().get_media(fileId=driveFileId) + + file_stream = io.BytesIO() + downloader = MediaIoBaseDownload(file_stream, request) + + done = False + while not done: + _, done = downloader.next_chunk() + + file_stream.seek(0) + file_bytes = file_stream.read() + + if not file_bytes: + return JSONResponse( + content={ + "message": f"Empty file {driveFileName}. If you think not, please report this to us!" + }, + status_code=400, + ) + + file_data = processor.rf.read_file( + file_bytes=file_bytes, file_name=driveFileName + ) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {driveFileName}. If there is please report this to us!" + }, + status_code=400, + ) + + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + redis_key = f"user:{userID}:upload:{driveFileName}" + upload_data = { + "file_name": driveFileName, + "last_modified": datetime.fromtimestamp(int(lastModified) / 1000).strftime( + "%Y-%m-%d" + )[:20], + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": driveFileName}, status_code=200 + ) + + except Exception as e: + logging.error(f"Error storing Drive file {driveFileName}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing file: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/store_url") +async def store_url(userID: str = Query(...), url: str = Form(...)): + try: + if not processor.ws.url_validator(url): + return JSONResponse( + content={"message": "Invalid URL. Please enter a valid URL."}, + status_code=400, + ) + + html = processor.ws.request_creator(url) + if not html: + return JSONResponse( + content={"message": "Error fetching the URL. Please try again later."}, + status_code=400, + ) + + file_data = processor.rf.read_url(html_content=html) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {url}. If there is please report this to us!" + }, + status_code=400, + ) + + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + redis_key = f"user:{userID}:upload:{url}" + upload_data = { + "file_name": url, + "last_modified": datetime.now().strftime("%Y-%m-%d"), + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": url}, status_code=200 + ) + + except Exception as e: + logging.error(f"Error storing URL {url}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing URL: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/upload_files") +async def upload_files(userID: str = Query(...)): + try: + # Get domain info + selected_domain_id = redis_manager.get_data(f"user:{userID}:selected_domain") + + with Database() as db: + domain_info = db.get_domain_info( + user_id=userID, domain_id=selected_domain_id + ) + + if not domain_info: + return JSONResponse( + content={"message": "Invalid domain selected"}, status_code=400 + ) + + # Get all stored files from Redis + stored_files = redis_manager.get_keys_by_pattern(f"user:{userID}:upload:*") + if not stored_files: + return JSONResponse( + content={"message": "No files to process"}, status_code=400 + ) + + file_info_batch = [] + file_content_batch = [] + + # Process stored files + for redis_key in stored_files: + upload_data = redis_manager.get_data(redis_key) + if not upload_data: + continue + + file_id = str(uuid.uuid4()) + + # Prepare batches + file_info_batch.append( + ( + userID, + file_id, + selected_domain_id, + upload_data["file_name"], + upload_data["last_modified"], + ) + ) + + for i in range(len(upload_data["sentences"])): + file_content_batch.append( + ( + file_id, + encryptor.encrypt( + text=upload_data["sentences"][i], auth_data=file_id + ), + upload_data["page_numbers"][i], + upload_data["is_headers"][i], + upload_data["is_tables"][i], + psycopg2.Binary(upload_data["embeddings"][i]), + ) + ) + + # Clean up Redis + redis_manager.delete_data(redis_key) + + # Bulk insert with limit check + result = db.insert_file_batches(file_info_batch, file_content_batch) + if not result["success"]: + return JSONResponse( + content={"message": result["message"]}, status_code=400 + ) + db.conn.commit() + + # Update domain info + file_names, file_ids, success = update_selected_domain( + user_id=userID, domain_id=selected_domain_id + ) + if not success: + return JSONResponse( + content={ + "message": "Files uploaded but, domain could not be updated", + "file_names": None, + "file_ids": None, + }, + status_code=400, + ) + + return JSONResponse( + content={ + "message": "success", + "file_names": file_names, + "file_ids": file_ids, + }, + status_code=200, + ) + + except Exception as e: + logging.error(f"Error processing uploads: {str(e)}") + return JSONResponse( + content={"message": f"Error processing uploads: {str(e)}"}, status_code=500 + ) + + +@router.post("/db/remove_file_upload") +async def remove_file_upload( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + file_id = data.get("file_id") + domain_id = data.get("domain_id") + + with Database() as db: + success = db.clear_file_content(file_id=file_id) + if not success: + return JSONResponse( + content={ + "message": "Error deleting files", + }, + status_code=400, + ) + db.conn.commit() + + _, _, success = update_selected_domain(user_id=userID, domain_id=domain_id) + if not success: + return JSONResponse( + content={"message": "error"}, + status_code=200, + ) + + return JSONResponse( + content={ + "message": "success", + }, + status_code=200, + ) + except KeyError: + return JSONResponse( + content={"message": "Please select the domain number first"}, + status_code=200, + ) + except Exception as e: + db.conn.rollback() + logging.error(f"Error during file deletion: {str(e)}") + raise HTTPException( + content={"message": f"Failed deleting, error: {e}"}, status_code=500 + ) + + +@router.post("/io/export_response") +async def export_response(request: Request): + try: + data = await request.json() + text = data.get("contents", []) + + if not text: + raise ValueError("No content selected for export") + + formatted_text = "\n\n------------------\n\n".join(text) + + response = processor.ex.export_pdf(data=formatted_text) + + return StreamingResponse( + io.BytesIO(response.getvalue()), + media_type="application/pdf", + headers={ + "Content-Disposition": "attachment; filename=DoclinkExport.pdf", + "Content-Type": "application/pdf", + "Content-Length": str(len(response.getvalue())), + }, + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=500, detail=f"PDF generation failed Error: {e}") + + +@router.post("/auth/logout") +async def logout(request: Request): + try: + data = await request.json() + user_id = data.get("user_id") + session_id = data.get("session_id") + + response = JSONResponse(content={"message": "Logged out successfully"}) + + # Clear FastAPI session cookie + response.delete_cookie( + key="session_id", + path="/", + domain=None, # This will use the current domain + secure=True, + httponly=True, + samesite="lax", + ) + + # Delete user redis session + redis_key = f"user:{user_id}:session:{session_id}" + session_exists = redis_manager.client.exists(redis_key) + if session_exists: + redis_manager.client.delete(redis_key) + + return response + except Exception as e: + logging.error(f"Error during logout: {str(e)}") + raise HTTPException( + content={"message": f"Failed logout, error: {e}"}, status_code=500 + ) + + +@router.post("/webhooks/lemon-squeezy") +async def handle_webhook(request: Request): + try: + # Get the raw request body + body = await request.body() + payload = await request.json() + + # Get the signature from the header + signature = request.headers.get("X-Signature") + + # Signature verification + webhook_secret = os.getenv("LEMON_SQUEEZY_WEBHOOK_SECRET") + expected_signature = hmac.new( + webhook_secret.encode(), body, hashlib.sha256 + ).hexdigest() + + if not hmac.compare_digest(signature, expected_signature): + raise HTTPException(status_code=401, detail="Invalid signature") + + event_name = payload.get("meta", {}).get("event_name") + if not event_name == "order_created": + return JSONResponse( + status_code=400, content={"message": "Wrong event came!"} + ) + + # Upgrade user to the premium limits + data = payload.get("data", {}).get("attributes", {}) + customer_id = data.get("customer_id") + customer_email = data.get("user_email") + receipt_url = data.get("urls").get("receipt") + + with Database() as db: + db.update_user_subscription( + user_email=customer_email, + lemon_squeezy_customer_id=customer_id, + receipt_url=receipt_url, + ) + db.conn.commit() + return JSONResponse(status_code=200, content={"message": "Webhook received"}) + + except Exception as e: + logger.error(f"Webhook error: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +# local functions +def update_selected_domain(user_id: str, domain_id: str): + try: + redis_manager.set_data(f"user:{user_id}:selected_domain", domain_id) + + with Database() as db: + file_info = db.get_file_info_with_domain(user_id, domain_id) + + if not file_info: + # Clear any existing domain data + redis_manager.delete_data(f"user:{user_id}:domain_content") + redis_manager.delete_data(f"user:{user_id}:index") + redis_manager.delete_data(f"user:{user_id}:index_header") + redis_manager.delete_data(f"user:{user_id}:boost_info") + return None, None, 1 + + content, embeddings = db.get_file_content( + file_ids=[info["file_id"] for info in file_info] + ) + + if not content or not len(embeddings): + # Clear any existing domain data + redis_manager.delete_data(f"user:{user_id}:domain_content") + redis_manager.delete_data(f"user:{user_id}:index") + redis_manager.delete_data(f"user:{user_id}:index_header") + redis_manager.delete_data(f"user:{user_id}:boost_info") + return None, None, 0 + + # Store domain content in Redis + redis_manager.set_data(f"user:{user_id}:domain_content", content) + redis_manager.set_data(f"user:{user_id}:domain_embeddings", embeddings) + + file_names = [info["file_name"] for info in file_info] + file_ids = [info["file_id"] for info in file_info] + + return file_names, file_ids, 1 + + except Exception as e: + logger.error(f"Error in update_selected_domain: {str(e)}") + raise RedisConnectionError(f"Failed to update domain: {str(e)}") diff --git a/doclink/app/db/__init__.py b/doclink/app/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/app/db/config.py b/doclink/app/db/config.py new file mode 100644 index 0000000..f7fe2e0 --- /dev/null +++ b/doclink/app/db/config.py @@ -0,0 +1,18 @@ +from configparser import ConfigParser + + +class GenerateConfig: + def __init__(self) -> None: + pass + + def config(filename="app/db/database.ini", section="postgresql"): + parser = ConfigParser() + parser.read(filename) + db_config = {} + if parser.has_section(section): + params = parser.items(section) + for param in params: + db_config[param[0]] = param[1] + else: + raise Exception(f"Section {section} is not found in {filename} file.") + return db_config diff --git a/doclink/app/db/database.py b/doclink/app/db/database.py new file mode 100644 index 0000000..194df71 --- /dev/null +++ b/doclink/app/db/database.py @@ -0,0 +1,740 @@ +from psycopg2 import extras +from psycopg2 import DatabaseError +from pathlib import Path +import psycopg2 +import logging +import numpy as np +import uuid +from datetime import datetime + +from .config import GenerateConfig +from ..api.core import Encryptor + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) +encryptor = Encryptor() + + +class Database: + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(Database, cls).__new__(cls) + cls._instance.db_config = GenerateConfig.config() + return cls._instance + + def __enter__(self): + self.conn = psycopg2.connect(**self.db_config) + self.cursor = self.conn.cursor() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.cursor: + self.cursor.close() + if self.conn: + if exc_type is None: + self.conn.commit() + else: + self.conn.rollback() + self.conn.close() + + def initialize_tables(self): + sql_path = Path(__file__).resolve().parent / "sql" / "table_initialize.sql" + with sql_path.open("r") as file: + query = file.read() + try: + self.cursor.execute(query) + self.conn.commit() + except DatabaseError as e: + self.conn.rollback() + raise e + + def reset_database(self): + sql_path = Path(__file__).resolve().parent / "sql" / "database_reset.sql" + with sql_path.open("r") as file: + query = file.read() + try: + self.cursor.execute(query) + self.conn.commit() + except DatabaseError as e: + self.conn.rollback() + raise e + + def _bytes_to_embeddings(self, byte_array): + return np.frombuffer(byte_array.tobytes(), dtype=np.float16).reshape( + byte_array.shape[0], -1 + ) + + def get_user_info_w_id(self, user_id: str): + query_get_user_info = """ + SELECT DISTINCT user_name, user_surname, user_email, user_type, user_created_at, picture_url + FROM user_info + WHERE user_id = %s + """ + query_get_domain_ids = """ + SELECT DISTINCT domain_id + FROM domain_info + WHERE user_id = %s + """ + query_get_domain_info = """ + SELECT t1.domain_name, t1.domain_id, t2.file_name, t2.file_id + FROM domain_info t1 + LEFT JOIN file_info t2 ON t1.domain_id = t2.domain_id + WHERE t1.domain_id IN %s + """ + query_get_daily_count = """ + SELECT sum(question_count) + FROM session_info s + WHERE s.user_id = %s + AND s.created_at >= CURRENT_TIMESTAMP - INTERVAL '24 hours' AND s.created_at <= CURRENT_TIMESTAMP; + """ + + try: + self.cursor.execute(query_get_user_info, (user_id,)) + user_info_data = self.cursor.fetchone() + + self.cursor.execute(query_get_daily_count, (user_id,)) + user_daily_count = self.cursor.fetchone() + + if not user_info_data: + return None, None + + user_info = { + "user_name": user_info_data[0], + "user_surname": user_info_data[1], + "user_email": user_info_data[2], + "user_type": user_info_data[3], + "user_created_at": str(user_info_data[4]), + "user_daily_count": user_daily_count[0] if user_daily_count[0] else 0, + "user_picture_url": user_info_data[5], + } + + self.cursor.execute(query_get_domain_ids, (user_id,)) + domain_id_data = self.cursor.fetchall() + + if not domain_id_data: + return user_info, None + + domain_ids = [data[0] for data in domain_id_data] + self.cursor.execute(query_get_domain_info, (tuple(domain_ids),)) + domain_info_data = self.cursor.fetchall() + domain_info = {} + for data in domain_info_data: + if data[1] not in domain_info.keys(): + domain_info[data[1]] = { + "domain_name": data[0], + "file_names": [data[2]] if data[2] else [], + "file_ids": [data[3]] if data[3] else [], + } + else: + domain_info[data[1]]["file_names"].append(data[2]) + domain_info[data[1]]["file_ids"].append(data[3]) + + return user_info, domain_info + + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_file_info_with_domain(self, user_id: str, domain_id: str): + query_get_file_info = """ + SELECT DISTINCT file_id, file_name, file_modified_date, file_upload_date + FROM file_info + WHERE user_id = %s AND domain_id = %s + """ + try: + self.cursor.execute( + query_get_file_info, + ( + user_id, + domain_id, + ), + ) + data = self.cursor.fetchall() + return ( + [ + { + "file_id": row[0], + "file_name": row[1], + "file_modified_date": row[2], + "file_upload_date": row[3], + } + for row in data + ] + if data + else None + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_domain_info(self, user_id: str, domain_id: int): + query = """ + SELECT DISTINCT domain_name + FROM domain_info + WHERE user_id = %s AND domain_id = %s + """ + try: + self.cursor.execute( + query, + ( + user_id, + domain_id, + ), + ) + data = self.cursor.fetchone() + return {"domain_name": data[0]} if data else None + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_file_content(self, file_ids: list): + query_get_content = """ + SELECT t1.sentence AS sentence, t1.is_header AS is_header, t1.is_table AS is_table, t1.page_number AS page_number, t1.file_id AS file_id, t2.file_name AS file_name + FROM file_content t1 + LEFT JOIN file_info t2 ON t1.file_id = t2.file_id + WHERE t1.file_id IN %s + """ + query_get_embeddings = """ + SELECT array_agg(embedding) AS embeddings + FROM file_content + WHERE file_id IN %s + """ + try: + self.cursor.execute(query_get_content, (tuple(file_ids),)) + content = self.cursor.fetchall() + self.cursor.execute(query_get_embeddings, (tuple(file_ids),)) + byte_embeddings = self.cursor.fetchone() + if content and byte_embeddings and byte_embeddings[0]: + embeddings = self._bytes_to_embeddings(np.array(byte_embeddings[0])) + return content, embeddings + else: + return None, None + except DatabaseError as e: + self.conn.rollback() + print(f"Database error occurred: {e}") + return None, None + except Exception as e: + print(f"An unexpected error occurred: {e}") + return None, None + + def get_session_info(self, session_id: str): + query_get_session = """ + SELECT user_id, created_at + FROM session_info + WHERE session_id = %s + """ + self.cursor.execute(query_get_session, (session_id,)) + data = self.cursor.fetchone() + return {"user_id": data[0], "created_at": data[1]} if data else None + + def rename_domain(self, domain_id: str, new_name: str): + query = """ + UPDATE domain_info + SET domain_name = %s + WHERE domain_id = %s + """ + try: + self.cursor.execute(query, (new_name, domain_id)) + rows_affected = self.cursor.rowcount + return rows_affected > 0 + except DatabaseError as e: + self.conn.rollback() + raise e + + def insert_user_guide(self, user_id: str, domain_id: str): + """ + Insert default user guide content into user's default domain + using the file_id already present in default_content + """ + current_date = datetime.now().date() + file_id = str(uuid.uuid4()) + + try: + # Insert file info with the new file_id + query_insert_file_info = """ + INSERT INTO file_info + (user_id, domain_id, file_id, file_name, file_modified_date, file_upload_date) + VALUES + (%s, %s, %s, %s, %s, %s) + """ + + self.cursor.execute( + query_insert_file_info, + ( + user_id, + domain_id, + file_id, + "User Guide.pdf", + current_date, + current_date, + ), + ) + + query_get_guide_content = """ + SELECT sentence, is_header, is_table, page_number, embedding + FROM default_content + """ + self.cursor.execute(query_get_guide_content) + default_content = self.cursor.fetchall() + + for row in default_content: + sentence, is_header, is_table, page_number, embedding = row + encrypted_sentence = encryptor.encrypt(sentence, file_id) + + self.cursor.execute( + "INSERT INTO file_content (file_id, sentence, is_header, is_table, page_number, embedding) VALUES (%s, %s, %s, %s, %s, %s)", + ( + file_id, + encrypted_sentence, + is_header, + is_table, + page_number, + embedding, + ), + ) + + return True + + except DatabaseError as e: + self.conn.rollback() + logger.error(f"Error inserting user guide: {str(e)}") + raise e + except Exception as e: + self.conn.rollback() + logger.error(f"Unexpected error inserting user guide: {str(e)}") + raise e + + def delete_domain(self, domain_id: str): + get_domain_type_query = """ + SELECT domain_type + FROM domain_info + WHERE domain_id = %s + """ + get_files_query = """ + SELECT file_id + FROM file_info + WHERE domain_id = %s + """ + + delete_content_query = """ + DELETE FROM file_content + WHERE file_id IN %s + """ + + delete_files_query = """ + DELETE FROM file_info + WHERE domain_id = %s + """ + + delete_domain_query = """ + DELETE FROM domain_info + WHERE domain_id = %s + """ + + try: + self.cursor.execute(get_domain_type_query, (domain_id,)) + domain_type = self.cursor.fetchone() + if not domain_type[0]: + return -1 + + self.cursor.execute(get_files_query, (domain_id,)) + file_data = self.cursor.fetchall() + file_ids = [data[0] for data in file_data] + + # content -> files -> domain + if file_ids: + self.cursor.execute(delete_content_query, (tuple(file_ids),)) + self.cursor.execute(delete_files_query, (domain_id,)) + self.cursor.execute(delete_domain_query, (domain_id,)) + + rows_affected = self.cursor.rowcount + + return 1 if rows_affected else 0 + + except DatabaseError as e: + # Rollback in case of error + self.cursor.execute("ROLLBACK") + logger.error(f"Error deleting domain {domain_id}: {str(e)}") + raise e + + def insert_user_feedback( + self, + feedback_id: str, + user_id: str, + feedback_type: str, + description: str, + screenshot: str = None, + ): + query = """ + INSERT INTO user_feedback (feedback_id, user_id, feedback_type, description, screenshot) + VALUES (%s, %s, %s, %s, %s) + """ + try: + self.cursor.execute( + query, + ( + feedback_id, + user_id, + feedback_type, + description, + screenshot, + ), + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def insert_domain_info( + self, user_id: str, domain_id: str, domain_name: str, domain_type: int + ): + query_insert_domain_info = """ + INSERT INTO domain_info (user_id, domain_id, domain_name, domain_type) + VALUES (%s, %s, %s, %s) + """ + try: + self.cursor.execute( + query_insert_domain_info, + ( + user_id, + domain_id, + domain_name, + domain_type, + ), + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def create_domain( + self, user_id: str, domain_name: str, domain_id: str, domain_type: int + ): + query_count_domains = """ + SELECT COUNT(*), user_type + FROM domain_info d + JOIN user_info u ON d.user_id = u.user_id + WHERE u.user_id = %s + GROUP BY user_type + """ + + try: + self.cursor.execute(query_count_domains, (user_id,)) + result = self.cursor.fetchall() + + domain_count, user_type = result[0][0], result[0][1] + + if user_type == "free" and domain_count >= 3: + return { + "success": False, + "message": "Free users can only create up to 3 domains. Upgrade account to create more domains!", + } + + elif user_type == "premium" and domain_count >= 10: + return { + "success": False, + "message": "Premium users can only create up to 20 domains. Upgrade account to create more domains!", + } + + query_insert = """ + INSERT INTO domain_info (user_id, domain_id, domain_name, domain_type) + VALUES (%s, %s, %s, %s) + RETURNING domain_id + """ + + self.cursor.execute( + query_insert, (user_id, domain_id, domain_name, domain_type) + ) + created_domain_id = self.cursor.fetchone()[0] + + return { + "success": True, + "domain_id": created_domain_id, + "message": "success", + } + + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_user_total_file_count(self, user_id: str): + user_type_query = """ + SELECT user_type + FROM user_info + WHERE user_id = %s + """ + + file_count_query = """ + SELECT COUNT(file_id) + FROM file_info + WHERE user_id = %s + """ + + try: + # Get user type first + self.cursor.execute(user_type_query, (user_id,)) + user_type_result = self.cursor.fetchone() + + if not user_type_result: + logger.error(f"User {user_id} not found in database") + return False + + user_type = user_type_result[0] + + # Get file count + self.cursor.execute(file_count_query, (user_id,)) + file_count_result = self.cursor.fetchone() + file_count = file_count_result[0] if file_count_result else 0 + + return file_count, user_type + except Exception as e: + self.conn.rollback() + logger.error(f"Error in user total file processing: {str(e)}") + return False + + def insert_file_batches( + self, file_info_batch: list, file_content_batch: list + ) -> bool: + """Process both file info and content in a single transaction.""" + try: + user_id = file_info_batch[0][0] + file_count, user_type = self.get_user_total_file_count(user_id) + + if user_type == "free" and file_count + len(file_info_batch) > 10: + return { + "success": False, + "message": f"Free users can only have 10 total files. You currently have {file_count} files across all folders. Upgrade to add more!", + } + elif user_type == "premium" and file_count + len(file_info_batch) > 100: + return { + "success": False, + "message": f"Premium users can only have 100 total files. You currently have {file_count} files across all folders", + } + + self._insert_file_info_batch(file_info_batch) + self._insert_file_content_batch(file_content_batch) + + return {"success": True, "message": "Files uploaded successfully"} + except Exception as e: + self.conn.rollback() + logger.error(f"Error in batch processing: {str(e)}") + return False + + def _insert_file_info_batch(self, file_info_batch: list): + """Internal method for file info insertion.""" + query = """ + INSERT INTO file_info (user_id, file_id, domain_id, file_name, file_modified_date) + VALUES %s + """ + try: + extras.execute_values(self.cursor, query, file_info_batch) + logger.info( + f"Successfully inserted {len(file_info_batch)} file info records" + ) + + except Exception as e: + logger.error(f"Error while inserting file info: {str(e)}") + raise + + def _insert_file_content_batch(self, file_content_batch: list): + """Internal method for file content insertion.""" + query = """ + INSERT INTO file_content (file_id, sentence, page_number, is_header, is_table, embedding) + VALUES %s + """ + try: + extras.execute_values(self.cursor, query, file_content_batch) + logger.info( + f"Successfully inserted {len(file_content_batch)} content rows " + ) + + except Exception as e: + logger.error(f"Error while inserting file content: {str(e)}") + raise + + def upsert_session_info(self, user_id: str, session_id: str): + # First check if the session exists + check_session_query = """ + SELECT id FROM session_info + WHERE user_id = %s AND session_id = %s + """ + + # Query to get daily question count and user type + query_get_daily_count = """ + SELECT sum(question_count), u.user_type + FROM session_info s + JOIN user_info u ON s.user_id = u.user_id + WHERE s.user_id = %s + AND s.created_at >= CURRENT_TIMESTAMP - INTERVAL '24 hours' AND s.created_at <= CURRENT_TIMESTAMP + GROUP BY u.user_type; + """ + + # Query to insert new session + insert_session_query = """ + INSERT INTO session_info + (user_id, session_id, question_count, total_enterance, last_enterance) + VALUES (%s, %s, 0, 1, CURRENT_TIMESTAMP) + RETURNING id + """ + + # Query to update existing session + update_question_query = """ + UPDATE session_info + SET question_count = question_count + 1, + last_enterance = CURRENT_TIMESTAMP + WHERE user_id = %s AND session_id = %s + RETURNING question_count + """ + + try: + # Check if session exists + self.cursor.execute(check_session_query, (user_id, session_id)) + session_exists = self.cursor.fetchone() + + # If session doesn't exist, create it + if not session_exists: + self.cursor.execute(insert_session_query, (user_id, session_id)) + self.conn.commit() + + # Get daily count and user type + self.cursor.execute(query_get_daily_count, (user_id,)) + result = self.cursor.fetchall() + daily_count, user_type = result[0][0], result[0][1] + + # Check free user limits + if user_type == "free" and daily_count >= 25: + return { + "success": False, + "message": "Daily question limit reached for free user. Please try again tomorrow or upgrade your plan!", + "question_count": daily_count, + } + + # Increment question count + self.cursor.execute(update_question_query, (user_id, session_id)) + question_count = self.cursor.fetchone()[0] + self.conn.commit() + + return { + "success": True, + "message": "success", + "question_count": question_count, + "daily_count": daily_count, + } + except Exception as e: + self.conn.rollback() + print(f"Error updating session info: {str(e)}") + raise e + + def insert_user_rating( + self, rating_id: str, user_id: str, rating: int, user_note: str + ): + query = """ + INSERT INTO user_rating (rating_id, user_id, rating, user_note) + VALUES (%s, %s, %s, %s) + """ + try: + self.cursor.execute(query, (rating_id, user_id, rating, user_note)) + except Exception as e: + self.conn.rollback() + raise e + + def clear_file_info(self, user_id: str, file_ids: list): + query = """ + DELETE FROM file_info + WHERE user_id = %s AND file_id IN %s + """ + try: + self.cursor.execute( + query, + ( + user_id, + tuple( + file_ids, + ), + ), + ) + return 1 + except DatabaseError as e: + self.conn.rollback() + raise e + + def clear_file_content(self, file_id: list): + clear_content_query = """ + DELETE FROM file_content + WHERE file_id = %s + """ + clear_file_info_query = """ + DELETE FROM file_info + WHERE file_id = %s + """ + try: + self.cursor.execute( + clear_content_query, + (file_id,), + ) + + self.cursor.execute( + clear_file_info_query, + (file_id,), + ) + + rows_affected = self.cursor.rowcount + + return 1 if rows_affected else 0 + + except DatabaseError as e: + self.conn.rollback() + raise e + + def update_user_subscription( + self, + user_email: str, + lemon_squeezy_customer_id: str, + receipt_url: str, + ): + try: + query_get_user = """ + SELECT user_id FROM user_info + WHERE user_email = %s + LIMIT 1 + """ + self.cursor.execute(query_get_user, (user_email,)) + result = self.cursor.fetchone() + + if result: + # Insert user into the premium table + user_id = result[0] + query_insert_premium_user = """ + INSERT INTO premium_user_info (lemon_squeezy_customer_id, user_id, receipt_url) + VALUES (%s, %s, %s) + """ + self.cursor.execute( + query_insert_premium_user, + (lemon_squeezy_customer_id, user_id, receipt_url), + ) + + # Update user info within the user_info table + query_update_user_info = """ + UPDATE user_info + SET user_type = %s + WHERE user_id = %s + RETURNING user_id + """ + self.cursor.execute(query_update_user_info, ("premium", user_id)) + return + else: + # This is for handling webhooks before we've updated the user record + logger.warning( + f"Received webhook for unknown customer: {lemon_squeezy_customer_id}" + ) + return False + except Exception as e: + logger.error(f"Error updating subscription: {str(e)}") + self.conn.rollback() # Added rollback to prevent transaction errors + return False + + +if __name__ == "__main__": + with Database() as db: + db.reset_database() + db.initialize_tables() diff --git a/doclink/app/db/sql/database_reset.sql b/doclink/app/db/sql/database_reset.sql new file mode 100644 index 0000000..59558f2 --- /dev/null +++ b/doclink/app/db/sql/database_reset.sql @@ -0,0 +1,38 @@ +-- drop_all_tables.sql + +-- Disable foreign key checks to avoid dependency issues +SET session_replication_role = 'replica'; + +-- Drop all tables in the public schema +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP + EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; + END LOOP; +END $$; + +-- Re-enable foreign key checks +SET session_replication_role = 'origin'; + +-- Optionally, you can also drop sequences if you have any +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT sequencename FROM pg_sequences WHERE schemaname = 'public') LOOP + EXECUTE 'DROP SEQUENCE IF EXISTS ' || quote_ident(r.sequencename) || ' CASCADE'; + END LOOP; +END $$; + +-- If you want to reset the primary key sequences for all tables, you can add this: +-- (Note: Only necessary if you've inserted data and want to reset auto-incrementing ids) +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP + EXECUTE 'ALTER TABLE ' || quote_ident(r.tablename) || ' ALTER COLUMN id RESTART WITH 1;'; + END LOOP; +END $$; \ No newline at end of file diff --git a/doclink/app/db/sql/table_initialize.sql b/doclink/app/db/sql/table_initialize.sql new file mode 100644 index 0000000..2ff6a31 --- /dev/null +++ b/doclink/app/db/sql/table_initialize.sql @@ -0,0 +1,88 @@ +CREATE TABLE IF NOT EXISTS user_info ( + user_id UUID PRIMARY KEY, + google_id VARCHAR(255) NOT NULL, + user_name VARCHAR(50) NOT NULL, + user_surname VARCHAR(50) NOT NULL, + user_email VARCHAR(100) UNIQUE NOT NULL, + user_type VARCHAR(20) DEFAULT 'free', + picture_url VARCHAR(255), + user_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS premium_user_info ( + lemon_squeezy_customer_id VARCHAR(255) NOT NULL, + user_id UUID PRIMARY KEY, + receipt_url VARCHAR, + payment_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS user_feedback ( + feedback_id UUID PRIMARY KEY, + user_id UUID NOT NULL, + feedback_type VARCHAR(20) NOT NULL, + description TEXT NOT NULL, + screenshot TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS domain_info ( + user_id UUID NOT NULL, + domain_id UUID PRIMARY KEY, + domain_name VARCHAR(30) NOT NULL, + domain_type INTEGER, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS file_info ( + user_id UUID NOT NULL, + domain_id UUID NOT NULL, + file_id UUID PRIMARY KEY, + file_name VARCHAR(255) NOT NULL, + file_modified_date DATE, + file_upload_date DATE DEFAULT CURRENT_DATE, + FOREIGN KEY (user_id) REFERENCES user_info(user_id), + FOREIGN KEY (domain_id) REFERENCES domain_info(domain_id) +); + +CREATE TABLE IF NOT EXISTS file_content ( + content_id SERIAL PRIMARY KEY, + file_id UUID NOT NULL, + sentence TEXT NOT NULL, + is_header BOOLEAN DEFAULT FALSE, + is_table BOOLEAN DEFAULT FALSE, + page_number INTEGER, + embedding BYTEA, + FOREIGN KEY (file_id) REFERENCES file_info(file_id) +); + +CREATE TABLE IF NOT EXISTS session_info ( + id SERIAL PRIMARY KEY, + user_id UUID NOT NULL, + session_id UUID NOT NULL, + question_count INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + total_enterance INTEGER DEFAULT 0, + last_enterance TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS default_content ( + content_id SERIAL PRIMARY KEY, + file_id UUID NOT NULL, + sentence TEXT NOT NULL, + is_header BOOLEAN DEFAULT FALSE, + is_table BOOLEAN DEFAULT FALSE, + page_number INTEGER, + embedding BYTEA +); + +CREATE TABLE IF NOT EXISTS user_rating ( + rating_id UUID PRIMARY KEY, + user_id UUID NOT NULL, + rating INTEGER NOT NULL, + user_note TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); \ No newline at end of file diff --git a/doclink/app/functions/__init__.py b/doclink/app/functions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/app/functions/chatbot_functions.py b/doclink/app/functions/chatbot_functions.py new file mode 100644 index 0000000..25cd86e --- /dev/null +++ b/doclink/app/functions/chatbot_functions.py @@ -0,0 +1,83 @@ +from openai import OpenAI +from dotenv import load_dotenv +from langdetect import detect +import textwrap +import yaml +import re +from typing import Dict, Any, Match + + +class ChatbotFunctions: + def __init__(self): + load_dotenv() + self.client = OpenAI() + + with open("app/utils/prompts.yaml", "r", encoding="utf-8") as file: + self.prompt_data = yaml.safe_load(file) + + def _prompt_query_generation(self, query, file_lang): + return textwrap.dedent( + self.get_prompt(category="queries", query=query, file_lang=file_lang) + ) + + def _prompt_answer_generation(self, query, context, lang, intention): + return textwrap.dedent( + self.get_prompt(category=intention, query=query, context=context, lang=lang) + ) + + def response_generation(self, query, context, intention): + lang = self.detect_language(query=query) + prompt = self._prompt_answer_generation( + query=query, context=context, lang=lang, intention=intention + ) + response = self.client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": query}, + ], + temperature=0, + ) + answer = response.choices[0].message.content.strip() + return answer + + def query_generation(self, query, file_lang): + lang = self.detect_language(query=query) + prompt = self._prompt_query_generation(query, file_lang=file_lang) + response = self.client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": query}, + ], + temperature=0, + ) + new_queries = response.choices[0].message.content.strip() + return new_queries, lang + + def detect_language(self, query): + if query.isalpha(): + lang = detect(text=query) + return "tr" if lang == "tr" else "en" + return None + + def replace_variables(self, match: Match, kwargs: Dict[str, Any]): + variables = match.group(1) or match.group(2) + value = kwargs.get(variables) + return str(value) + + def get_prompt(self, category, **kwargs): + variable_pattern = r"\${?(\w+)}?|\{(\w+)\}" + try: + prompt = self.prompt_data["prompts"]["languages"]["en"][category.strip()][ + 0 + ]["text"] + + def replace_wrapper(match): + return self.replace_variables(match, kwargs) + + full_prompt = re.sub(variable_pattern, replace_wrapper, prompt) + return full_prompt + except KeyError: + print(f"No template found for {category}") + return None diff --git a/doclink/app/functions/embedding_functions.py b/doclink/app/functions/embedding_functions.py new file mode 100644 index 0000000..46d428f --- /dev/null +++ b/doclink/app/functions/embedding_functions.py @@ -0,0 +1,36 @@ +import numpy as np +from openai import OpenAI +from dotenv import load_dotenv +from typing import List + + +class EmbeddingFunctions: + def __init__(self): + load_dotenv() + self.client = OpenAI() + + def create_embeddings_from_sentences( + self, sentences: List[str], chunk_size: int = 2000 + ) -> List[np.ndarray]: + file_embeddings = [] + for chunk_index in range(0, len(sentences), chunk_size): + chunk_embeddings = self.client.embeddings.create( + model="text-embedding-3-small", + input=sentences[chunk_index : chunk_index + chunk_size], + ) + chunk_array = np.array( + [x.embedding for x in chunk_embeddings.data], dtype=np.float16 + ) + file_embeddings.append( + chunk_array / np.linalg.norm(chunk_array, axis=1)[:, np.newaxis] + ) + + return np.vstack(file_embeddings) + + def create_embedding_from_sentence(self, sentence: list) -> np.ndarray: + query_embedding = self.client.embeddings.create( + model="text-embedding-3-small", input=sentence + ) + return np.array(query_embedding.data[0].embedding, dtype=np.float16).reshape( + 1, -1 + ) diff --git a/doclink/app/functions/export_functions.py b/doclink/app/functions/export_functions.py new file mode 100644 index 0000000..f484562 --- /dev/null +++ b/doclink/app/functions/export_functions.py @@ -0,0 +1,126 @@ +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +from io import BytesIO +import re + + +class Exporter: + def __init__(self): + self.styles = getSampleStyleSheet() + self.setup_styles() + + def _register_fonts(self): + pdfmetrics.registerFont(TTFont("Helvetica", "Helvetica")) + pdfmetrics.registerFont(TTFont("Helvetica-Bold", "Helvetica-Bold")) + + def setup_styles(self): + self.styles.add( + ParagraphStyle( + name="Header", + fontSize=14, + textColor=colors.HexColor("#10B981"), + spaceAfter=12, + fontName="Helvetica-Bold", + encoding="utf-8", + ) + ) + + self.styles.add( + ParagraphStyle( + name="Content", + fontSize=11, + textColor=colors.black, + spaceAfter=8, + fontName="Helvetica", + encoding="utf-8", + ) + ) + + self.styles.add( + ParagraphStyle( + name="Bullet-Point", + fontSize=11, + leftIndent=20, + bulletIndent=10, + spaceAfter=5, + fontName="Helvetica", + encoding="utf-8", + ) + ) + + def clean_text(self, text: str) -> str: + if not isinstance(text, str): + text = text.decode("utf-8") + + text = text.replace("ฤฑ", "i").replace("ฤฐ", "I") + text = text.replace("ฤŸ", "g").replace("ฤž", "G") + text = text.replace("รผ", "u").replace("รœ", "U") + text = text.replace("ลŸ", "s").replace("ลž", "S") + text = text.replace("รถ", "o").replace("ร–", "O") + text = text.replace("รง", "c").replace("ร‡", "C") + + text = re.sub( + r"\[header\](.*?)\[/header\]", r'\1', text + ) + text = re.sub(r"\[bold\](.*?)\[/bold\]", r"\1", text) + return text + + def create_watermark(self, canvas, doc): + canvas.saveState() + canvas.setFillColor(colors.HexColor("#10B981")) + canvas.setFont("Helvetica", 8) + canvas.drawString(30, 20, "Generated by docklink.io") + canvas.restoreState() + + def export_pdf(self, data: str) -> BytesIO: + buffer = BytesIO() + content = [] + cleaned_text = self.clean_text(data) + + doc = SimpleDocTemplate( + buffer, + pagesize=A4, + rightMargin=30, + leftMargin=30, + topMargin=30, + bottomMargin=30, + ) + + lines = cleaned_text.split("\n") + + for line in lines: + if line.strip(): + if ( + line.startswith("

") + or line.startswith('') + or "header" in line + ): + # Header section + text = line.replace("

", "").replace("

", "") + content.append(Paragraph(text, self.styles["Header"])) + elif line.startswith("-"): + # Bullet point + text = line.strip() + content.append(Paragraph(f"- {text}", self.styles["Bullet-Point"])) + else: + # Normal text + content.append(Paragraph(line, self.styles["Content"])) + + content.append(Spacer(1, 2)) + + try: + doc.build( + content, + onFirstPage=self.create_watermark, + onLaterPages=self.create_watermark, + ) + buffer.seek(0) + return buffer + except Exception as e: + raise ValueError( + f"Error: {e} Content too large or complex to export to PDF" + ) diff --git a/doclink/app/functions/indexing_functions.py b/doclink/app/functions/indexing_functions.py new file mode 100644 index 0000000..5e2fc0c --- /dev/null +++ b/doclink/app/functions/indexing_functions.py @@ -0,0 +1,12 @@ +import faiss + + +class IndexingFunctions: + def __init__(self): + pass + + def create_flat_index(self, embeddings): + dimension = len(embeddings[0]) + index = faiss.IndexFlatIP(dimension) + index.add(embeddings) + return index diff --git a/doclink/app/functions/reading_functions.py b/doclink/app/functions/reading_functions.py new file mode 100644 index 0000000..1f8a463 --- /dev/null +++ b/doclink/app/functions/reading_functions.py @@ -0,0 +1,536 @@ +import fitz +import tempfile +import io +import re +import spacy +import pymupdf4llm +import xml.etree.ElementTree as ET +import zipfile +from pathlib import Path +from langchain_text_splitters import MarkdownHeaderTextSplitter +from docling.datamodel.base_models import InputFormat +from docling.pipeline.simple_pipeline import SimplePipeline +from docling.document_converter import ( + DocumentConverter, + WordFormatOption, + PowerpointFormatOption, + HTMLFormatOption, +) + + +class ReadingFunctions: + def __init__(self): + self.nlp = spacy.load( + "en_core_web_sm", + disable=[ + "tagger", + "attribute_ruler", + "lemmatizer", + "ner", + "textcat", + "custom", + ], + ) + self.max_file_size_mb = 50 + self.headers_to_split_on = [ + ("#", "Header 1"), + ("##", "Header 2"), + ("###", "Header 3"), + ("####", "Header 4"), + ] + self.markdown_splitter = MarkdownHeaderTextSplitter( + self.headers_to_split_on, strip_headers=False, return_each_line=True + ) + self.converter = DocumentConverter( + allowed_formats=[ + InputFormat.DOCX, + InputFormat.PPTX, + InputFormat.XLSX, + InputFormat.PDF, + InputFormat.HTML, + ], + format_options={ + InputFormat.DOCX: WordFormatOption(pipeline_cls=SimplePipeline), + InputFormat.PPTX: PowerpointFormatOption(pipeline_cls=SimplePipeline), + InputFormat.HTML: HTMLFormatOption(pipeline_cls=SimplePipeline), + }, + ) + + def read_file(self, file_bytes: bytes, file_name: str): + """Read and process file content from bytes""" + file_size_mb = self._get_file_size(file_bytes=file_bytes) + file_type = file_name.split(".")[-1].lower() + + if file_size_mb > self.max_file_size_mb: + raise ValueError(f"File size exceeds {self.max_file_size_mb}MB limit") + + try: + if file_type == "pdf": + return self._process_pdf(file_bytes=file_bytes) + elif file_type == "docx": + return self._process_docx(file_bytes=file_bytes) + elif file_type == "pptx": + return self._process_pptx(file_bytes=file_bytes) + elif file_type == "xlsx": + return self._process_xlsx(file_bytes=file_bytes) + elif file_type == "udf": + return self._process_udf(file_bytes=file_bytes) + elif file_type in ["txt", "rtf"]: + return self._process_txt(file_bytes=file_bytes) + else: + raise ValueError(f"Unsupported file type: {file_type}") + + except Exception as e: + raise ValueError(f"Error processing {file_name}: {str(e)}") + + def read_url(self, html_content: tuple): + html_data = { + "sentences": [], + "page_number": [], + "is_header": [], + "is_table": [], + } + + try: + with tempfile.NamedTemporaryFile(delete=True, suffix=".html") as temp_file: + temp_file.write(html_content.encode("utf-8")) + temp_file.flush() + html_path = Path(temp_file.name) + md_text = self.converter.convert( + html_path + ).document.export_to_markdown() + splits = self.markdown_splitter.split_text(md_text) + + for split in splits: + if ( + not len(split.page_content) > 5 + or re.match(r"^[^\w]*$", split.page_content) + or split.page_content[:4] == " + + + + + + + + + + + + + + + `; + + this.element.innerHTML += ` + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + // Search functionality + const searchInput = this.element.querySelector('#domainSearchInput'); + searchInput?.addEventListener('input', (e) => { + this.events.emit('domainSearch', e.target.value); + }); + + // New domain button + const newDomainBtn = this.element.querySelector('#newDomainBtn'); + newDomainBtn?.addEventListener('click', () => { + this.handleNewDomain(); + }); + + // Domain deletion + this.domainManager.events.on('domainFileCountUpdated', ({ domainId, newCount }) => { + const domainCard = this.element.querySelector(`[data-domain-id="${domainId}"]`); + if (domainCard) { + const fileCountElement = domainCard.querySelector('.file-count'); + if (fileCountElement) { + fileCountElement.textContent = `${newCount} files`; + } + } + }); + + // Select button + const selectButton = this.element.querySelector('.select-button'); + selectButton?.addEventListener('click', () => { + if (this.temporarySelectedId) { + this.events.emit('domainSelected', this.temporarySelectedId); + this.hide(); + } + }); + + // Close button + const closeButton = this.element.querySelector('.close-button'); + closeButton?.addEventListener('click', () => { + this.resetTemporarySelection(); + this.hide(); + }); + + // Handle modal hidden event + this.element.addEventListener('hidden.bs.modal', () => { + this.resetTemporarySelection(); + }); + } + + createDomainCard(domain) { + return ` +
+
+
+ + +
+
+
${domain.name}
+ ${domain.fileCount} files +
+
+
+ + +
+
+ `; + } + + setupDomainCardListeners() { + this.element.querySelectorAll('.domain-card').forEach(card => { + if (card.classList.contains('new-domain-input-card')) return; + + const domainId = card.dataset.domainId; + const checkbox = card.querySelector('.domain-checkbox'); + + // Handle entire card click for selection + card.addEventListener('click', (e) => { + if (!e.target.closest('.domain-actions') && !e.target.closest('.checkbox-wrapper')) { + checkbox.checked = !checkbox.checked; + this.handleDomainSelection(checkbox, domainId); + } + }); + + // Handle checkbox click + checkbox?.addEventListener('change', (e) => { + e.stopPropagation(); + this.handleDomainSelection(checkbox, domainId); + }); + + // Delete button + card.querySelector('.delete-button')?.addEventListener('click', (e) => { + e.stopPropagation(); + this.domainToDelete = domainId; + this.showDomainDeleteModal(); + }); + + // Edit button + card.querySelector('.edit-button')?.addEventListener('click', (e) => { + e.stopPropagation(); + this.enableDomainEditing(card); + }); + }); + } + + handleDomainSelection(checkbox, domainId) { + // Uncheck all other checkboxes + this.element.querySelectorAll('.domain-checkbox').forEach(cb => { + if (cb !== checkbox) { + cb.checked = false; + } + }); + + // Update temporary selection + this.temporarySelectedId = checkbox.checked ? domainId : null; + } + + resetTemporarySelection() { + this.temporarySelectedId = null; + this.element.querySelectorAll('.domain-checkbox').forEach(cb => { + cb.checked = false; + }); + } + + handleNewDomain() { + const template = document.getElementById('newDomainInputTemplate'); + const domainsContainer = this.element.querySelector('#domainsContainer'); + + if (template && domainsContainer) { + const clone = template.content.cloneNode(true); + domainsContainer.appendChild(clone); + + const inputCard = domainsContainer.querySelector('.new-domain-input-card'); + const input = inputCard.querySelector('.new-domain-input'); + + this.setupNewDomainHandlers(inputCard, input); + input.focus(); + } + } + + setupNewDomainHandlers(inputCard, input) { + const confirmBtn = inputCard.querySelector('.confirm-button'); + const cancelBtn = inputCard.querySelector('.cancel-button'); + + const handleConfirm = async () => { + const name = input.value.trim(); + if (name) { + if (name.length > 20) { + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
I can't do it...
+

Folder name must be 20 characters or less. Please try again with a shorter name!

+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + return; + } + + const result = await window.createDomain(window.serverData.userId, name); + if (result.success) { + this.events.emit('domainCreate', { + id: result.id, + name: name + }); + this.updateDomainCount(); + inputCard.remove(); + } else { + if (result.message && result.message.includes('up to 3 domains')) { + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
Folder Limit Reached
+

${result.message}

+
+ Domains Used: ${this.domainManager.getAllDomains().length}/3 +
+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 100); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + } else { + this.events.emit('warning', 'Failed to create folder. Please try again.'); + } + inputCard.remove(); + } + } + }; + + confirmBtn.addEventListener('click', handleConfirm); + cancelBtn.addEventListener('click', () => inputCard.remove()); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') handleConfirm(); + }); + + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') inputCard.remove(); + }); + } + + async enableDomainEditing(card) { + const domainInfo = card.querySelector('.domain-info'); + const domainNameElement = domainInfo.querySelector('h6'); + const currentName = domainNameElement.getAttribute('title') || domainNameElement.textContent; + const domainId = card.dataset.domainId; + + const wrapper = document.createElement('div'); + wrapper.className = 'domain-name-input-wrapper'; + wrapper.innerHTML = ` + +
+ + +
+ `; + + const input = wrapper.querySelector('.domain-name-input'); + const confirmBtn = wrapper.querySelector('.edit-confirm-button'); + const cancelBtn = wrapper.querySelector('.edit-cancel-button'); + + const handleConfirm = async () => { + const newName = input.value.trim(); + if (newName && newName !== currentName) { + if (newName.length > 20) { + this.events.emit('warning', 'Folder name must be less than 20 characters'); + return; + } + + const success = await window.renameDomain(domainId, newName); + + if (success) { + this.events.emit('domainEdit', { + id: domainId, + newName: newName + }); + wrapper.replaceWith(domainNameElement); + domainNameElement.textContent = newName; + domainNameElement.setAttribute('title', newName); + } else { + this.events.emit('warning', 'Failed to rename domain'); + } + } else { + wrapper.replaceWith(domainNameElement); + } + }; + + confirmBtn.addEventListener('click', handleConfirm); + cancelBtn.addEventListener('click', () => wrapper.replaceWith(domainNameElement)); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') handleConfirm(); + }); + + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') wrapper.replaceWith(domainNameElement); + }); + + domainNameElement.replaceWith(wrapper); + input.focus(); + input.select(); + } + + updateDomainsList(domains) { + const container = this.element.querySelector('#domainsContainer'); + if (container) { + container.innerHTML = domains.map(domain => this.createDomainCard(domain)).join(''); + this.setupDomainCardListeners(); + } + } + + updateDomainCount() { + const domains = this.domainManager.getAllDomains(); + const count = domains.length; + const percentage = (count / 3) * 100; + + const countElement = this.element.querySelector('.domains-count'); + const progressBar = this.element.querySelector('.progress-bar'); + + if (countElement && progressBar) { + countElement.textContent = `${count}/3`; + progressBar.style.width = `${percentage}%`; + + } + } + + show() { + const modal = new bootstrap.Modal(this.element); + this.resetTemporarySelection(); + this.updateDomainCount(); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + } + } + + initializeDeleteModal() { + const deleteModalElement = document.getElementById('deleteConfirmModal'); + if (deleteModalElement) { + this.deleteModal = new bootstrap.Modal(deleteModalElement, { + backdrop: 'static', + keyboard: false + }); + + deleteModalElement.addEventListener('show.bs.modal', () => { + document.getElementById('domainSelectModal').classList.add('delete-confirmation-open'); + }); + + deleteModalElement.addEventListener('hidden.bs.modal', () => { + document.getElementById('domainSelectModal').classList.remove('delete-confirmation-open'); + this.domainToDelete = null; // Clean up on hide + }); + + const confirmBtn = deleteModalElement.querySelector('#confirmDeleteBtn'); + confirmBtn?.addEventListener('click', async () => { + if (this.domainToDelete) { + await this.handleDomainDelete(this.domainToDelete); + this.domainToDelete = null; + this.deleteModal.hide(); + } + }); + + const cancelBtn = deleteModalElement.querySelector('.btn-outline-secondary'); + cancelBtn?.addEventListener('click', () => { + this.domainToDelete = null; + this.deleteModal.hide(); + }); + } + } + + showDomainDeleteModal() { + if (this.deleteModal) { + this.deleteModal.show(); + } + } + + hideDomainDeleteModal() { + if (this.deleteModal) { + this.deleteModal.hide(); + } + } + + async handleDomainDelete(domainId) { + const result = await window.deleteDomain(domainId); + + if (result.success) { + this.events.emit('domainDelete', domainId); + this.hideDomainDeleteModal(); + this.updateDomainCount(); + this.events.emit('message', { + text: 'Knowledege Base deleted!', + type: 'success' + }); + } else { + this.hideDomainDeleteModal(); + + const messageElement = document.getElementById('domainInfoMessage'); + if (messageElement) { + messageElement.textContent = result.message; + } + const infoModal = new bootstrap.Modal(document.getElementById('defaultDomainInfoModal')); + infoModal.show(); + } + } +} + +class FileUploadModal extends Component { + constructor(DomainManager) { + const element = document.createElement('div'); + element.id = 'fileUploadModal'; + element.className = 'modal fade'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.isUploading = false; + this.fileBasket = new FileBasket(); + this.urlInputModal = new URLInputModal() + this.domainManager = DomainManager; + + this.render(); + this.setupEventListeners(); + this.setupCloseButton(); + this.currentpicker = null; + } + + render() { + this.element.innerHTML = ` + + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + const dropZone = this.element.querySelector('#dropZone'); + const fileInput = this.element.querySelector('#fileInput'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const chooseText = this.element.querySelector('.choose-text'); + const uploadIcon = this.element.querySelector('.upload-icon-wrapper'); + const urlButton = this.element.querySelector('.url-input-btn'); + + // Drag and drop handlers + ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { + dropZone.addEventListener(eventName, (e) => { + e.preventDefault(); + e.stopPropagation(); + }); + }); + + ['dragenter', 'dragover'].forEach(eventName => { + dropZone.addEventListener(eventName, () => { + if (!this.isUploading) { + dropZone.classList.add('dragover'); + } + }); + }); + + ['dragleave', 'drop'].forEach(eventName => { + dropZone.addEventListener(eventName, () => { + dropZone.classList.remove('dragover'); + }); + }); + + // File drop handler + dropZone.addEventListener('drop', (e) => { + if (!this.isUploading) { + const files = e.dataTransfer.files; + this.handleFiles(files); + } + }); + + // Icon click handler + uploadIcon.addEventListener('click', () => { + if (!this.isUploading) { + fileInput.click(); + } + }); + + // File input handler + chooseText.addEventListener('click', () => { + if (!this.isUploading) { + fileInput.click(); + } + }); + + fileInput.addEventListener('change', () => { + this.handleFiles(fileInput.files); + }); + + // Upload button handler + uploadBtn.addEventListener('click', () => { + this.startUpload(); + }); + + urlButton.addEventListener('click', () => { + if (!this.isUploading) { + this.urlInputModal.show(); + } + }); + + this.urlInputModal.events.on('urlProcessed', (result) => { + if (result.files) { + this.handleFiles(result.files); + } + this.events.emit('message', result); + }); + + this.element.addEventListener('hidden.bs.modal', () => { + this.events.emit('modalClose'); + }); + } + + handleFiles(newFiles) { + if (this.isUploading) return; + + const fileList = this.element.querySelector('#fileList'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const uploadArea = this.element.querySelector('#dropZone'); + + let addFilesResult; + if (newFiles[0]?.mimeType) { + addFilesResult = this.fileBasket.addDriveFiles(newFiles); + } else { + addFilesResult = this.fileBasket.addFiles(newFiles); + } + + if (addFilesResult.duplicates > 0) { + this.events.emit('warning', `${addFilesResult.duplicates} files were skipped as they were already added`); + } + + // Update UI + fileList.innerHTML = ''; + this.fileBasket.getFileNames().forEach(fileName => { + const fileItem = this.createFileItem(fileName); + fileList.appendChild(fileItem); + }); + + this.updateUploadUI(fileList, uploadBtn, uploadArea); + this.updateSourceCount(); + } + + createFileItem(fileName) { + const fileItem = document.createElement('div'); + fileItem.className = 'file-item pending-upload'; + fileItem.dataset.fileName = fileName; + const driveFile = this.fileBasket.drivefiles.get(fileName); + + const icon = this.getFileIcon(fileName,driveFile?.mimeType); + fileItem.innerHTML = ` +
+ +
+
+
${fileName}
+
+
+
+
+
+ +
+ `; + + const removeButton = fileItem.querySelector('.file-remove'); + removeButton.addEventListener('click', () => { + if (!this.isUploading) { + this.fileBasket.removeFile(fileName); + fileItem.remove(); + this.updateUploadUI( + this.element.querySelector('#fileList'), + this.element.querySelector('#uploadBtn'), + this.element.querySelector('#dropZone') + ); + } + }); + + return fileItem; + } + + setupCloseButton() { + const closeButton = this.element.querySelector('.close-button'); + closeButton.addEventListener('click', () => { + console.log('Close button clicked'); + this.hide(); + }); + } + + setLoadingState(isLoading) { + const loadingOverlay = this.element.querySelector('.upload-loading-overlay'); + const closeButton = this.element.querySelector('.close-button'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const modal = bootstrap.Modal.getInstance(this.element); + + if (isLoading) { + loadingOverlay.style.display = 'flex'; + closeButton.style.display = 'none'; + uploadBtn.disabled = true; + modal._config.backdrop = 'static'; + modal._config.keyboard = false; + } else { + loadingOverlay.style.display = 'none'; + closeButton.style.display = 'block'; + uploadBtn.disabled = false; + modal._config.backdrop = true; + modal._config.keyboard = true; + } + } + + async startUpload() { + if (!this.fileBasket.hasFilesToUpload() || this.isUploading) return; + + this.isUploading = true; + const uploadBtn = this.element.querySelector('#uploadBtn'); + uploadBtn.disabled = true; + this.setLoadingState(true); + let successCount = 0; + + try { + while (this.fileBasket.hasFilesToUpload()) { + const batch = this.fileBasket.getBatch(); + const uploadPromises = batch.map(async (fileName) => { + try { + const result = await this.uploadFile(fileName); + if (result.success) successCount++; + } catch (error) { + console.error(`Failed to upload ${fileName}:`, error); + } + }); + await Promise.all(uploadPromises); + } + + if (successCount > 0) { + const uploadResult = await window.uploadFiles(window.serverData.userId); + + if (uploadResult.success) { + this.events.emit('filesUploaded', uploadResult.data); + this.resetUploadUI(); + this.updateSourceCount(); + this.events.emit('message', { + text: `Successfully uploaded ${successCount} files`, + type: 'success' + }); + setTimeout(() => { + this.hide(); + this.events.emit('modalClose'); + }, 500); + } else if (uploadResult.error && uploadResult.error.includes('Upgrade')) { + console.log('first') + console.log(uploadResult.error) + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
File Limit Reached
+

${uploadResult.error}

+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + } else { + console.log('second') + console.log(uploadResult.error) + throw new Error(uploadResult.error); + } + } + + } catch (error) { + console.error('Upload error:', error); + this.events.emit('error', error.message); + } finally { + this.isUploading = false; + this.fileBasket.clear(); + uploadBtn.disabled = false; + this.setLoadingState(false); + } + } + + resetUploadUI() { + const fileList = this.element.querySelector('#fileList'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const uploadArea = this.element.querySelector('#dropZone'); + + // Clear file list + fileList.innerHTML = ''; + + // Reset upload area + uploadArea.style.display = 'flex'; + uploadBtn.disabled = true; + + // Remove "Add More Files" button + this.removeAddMoreFilesButton(); + + // Clear FileBasket + this.fileBasket.clear(); + } + + async uploadFile(fileName) { + const fileItem = this.element.querySelector(`[data-file-name="${fileName}"]`); + const progressBar = fileItem.querySelector('.progress-bar'); + + try { + const formData = this.fileBasket.getFileFormData(fileName); + if (!formData) throw new Error('File not found'); + + fileItem.classList.remove('pending-upload'); + fileItem.classList.add('uploading'); + + let success; + if (formData.has('driveFileId')) { + success = await window.storedriveFile(window.serverData.userId, formData); + } else { + success = await window.storeFile(window.serverData.userId, formData); + } + + if (success) { + progressBar.style.width = '100%'; + fileItem.classList.remove('uploading'); + fileItem.classList.add('uploaded'); + return { success: true }; + } else { + throw new Error(result.error); + } + + } catch (error) { + fileItem.classList.remove('uploading'); + fileItem.classList.add('upload-error'); + return { success: false, error: error.message }; + } + } + + loadDrivePicker() { + if (typeof google === 'undefined') { + const script = document.createElement('script'); + script.src = 'https://apis.google.com/js/api.js'; + script.onload = () => { + window.gapi.load('picker', () => { + this.createPicker(); + }); + }; + document.body.appendChild(script); + } else { + this.createPicker(); + } + } + + createPicker() { + + if (this.currentPicker) { + this.currentPicker.dispose(); + this.currentPicker = null; + } + + const accessToken = document.cookie + .split('; ') + .find(row => row.startsWith('drive_access_token=')) + ?.split('=')[1]; + + if (!accessToken) { + const alertModal = document.createElement('div'); + alertModal.className = 'alert-modal'; + alertModal.innerHTML = ` +
+
+ +
+
Drive Access Required
+

To access your Google Drive files: +
1. Sign out +
2. Sign in with Google +
3. Allow Drive access when prompted +

+ +
+ `; + + document.body.appendChild(alertModal); + + requestAnimationFrame(() => { + alertModal.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + const closeButton = alertModal.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertModal.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertModal.remove(), 300); + }); + + return; + } + + const GOOGLE_API_KEY = document.cookie + .split('; ') + .find(row => row.startsWith('google_api_key=')) + ?.split('=')[1]; + + + const picker = new google.picker.PickerBuilder() + .addView(google.picker.ViewId.DOCS) + .setOAuthToken(accessToken) + .setDeveloperKey(GOOGLE_API_KEY) + .enableFeature(google.picker.Feature.SUPPORT_DRIVES) + .enableFeature(google.picker.Feature.MULTISELECT_ENABLED) + .setCallback((data) => { + if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED) { + const docs = data[google.picker.Response.DOCUMENTS]; + this.handleDriveSelection(docs); // Pass token to handler + } + }) + .build(); + picker.setVisible(true); + this.currentPicker = picker; + + setTimeout(() => { + const pickerFrame = document.querySelector('.picker-dialog-bg'); + const pickerDialog = document.querySelector('.picker-dialog'); + + if (pickerFrame && pickerDialog) { + document.querySelectorAll('.picker-dialog-bg, .picker-dialog').forEach(el => { + if (el !== pickerFrame && el !== pickerDialog) { + el.remove(); + } + }); + + pickerFrame.style.zIndex = '10000'; + pickerDialog.style.zIndex = '10001'; + } + }, 0); + + } + + handleDriveSelection(files) { + const supportedTypes = [ + 'application/pdf', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'text/plain', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.google-apps.document', + 'application/vnd.google-apps.document', + 'application/vnd.google-apps.spreadsheet', + 'application/vnd.google-apps.presentation', + 'application/vnd.google-apps.script', + ]; + + const filteredFiles = files.filter(file => { + return supportedTypes.includes(file.mimeType); + }); + + + if (filteredFiles.length === 0) { + this.events.emit('warning', 'No supported files selected. Please select PDF, DOCX, or TXT files.'); + return; + } + + if (filteredFiles.length < files.length) { + this.events.emit('warning', `${files.length - filteredFiles.length} files were skipped due to unsupported file types`); + } + + const fileList = this.element.querySelector('#fileList'); + this.fileBasket.files.clear(); + this.fileBasket.drivefiles.clear(); + this.fileBasket.uploadQueue = []; + + fileList.innerHTML = ''; + filteredFiles.forEach(file => { + const fileItem = this.createFileItem(file.name); + fileList.appendChild(fileItem); + }); + + this.updateUploadUI( + fileList, + this.element.querySelector('#uploadBtn'), + this.element.querySelector('#dropZone') + ); + + this.handleFiles(filteredFiles); + } + + getFileIcon(fileName, mimeType) { + const extension = fileName.split('.').pop().toLowerCase(); + + if (mimeType) { + switch (mimeType) { + case 'application/vnd.google-apps.document': + return 'bi-file-word'; + case 'application/vnd.google-apps.spreadsheet': + return 'bi-file-excel'; + case 'application/vnd.google-apps.presentation': + return 'bi-file-ppt'; + case 'application/vnd.google-apps.script': + return 'bi-file-text'; + } + } + + const iconMap = { + pdf: 'bi-file-pdf', + docx: 'bi-file-word', + doc: 'bi-file-word', + txt: 'bi-file-text', + pptx: 'bi-file-ppt', + xlsx: 'bi-file-excel', + udf: 'bi-file-post', + html: 'bi-file-code', + }; + return iconMap[extension] || 'bi-file'; + } + + updateUploadUI(fileList, uploadBtn, uploadArea) { + if (this.fileBasket.getFileNames().length > 0 || this.fileBasket.drivefiles.size > 0) { + uploadArea.style.display = 'none'; + uploadBtn.disabled = false; + this.ensureAddMoreFilesButton(fileList); + } else { + uploadArea.style.display = 'flex'; + uploadBtn.disabled = true; + this.removeAddMoreFilesButton(); + } + } + + ensureAddMoreFilesButton(fileList) { + let addFileBtn = this.element.querySelector('.add-file-btn'); + if (!addFileBtn) { + addFileBtn = document.createElement('button'); + addFileBtn.className = 'add-file-btn'; + addFileBtn.innerHTML = ` + + Add More Files + `; + addFileBtn.addEventListener('click', () => { + if (!this.isUploading) { + this.element.querySelector('#fileInput').click(); + } + }); + fileList.after(addFileBtn); + } + addFileBtn.disabled = this.isUploading; + addFileBtn.style.opacity = this.isUploading ? '0.5' : '1'; + } + + removeAddMoreFilesButton() { + const addFileBtn = this.element.querySelector('.add-file-btn'); + if (addFileBtn) { + addFileBtn.remove(); + } + } + + updateSourceCount() { + const domains = this.domainManager.getAllDomains(); + let totalSources = 0; + + domains.forEach(domain => { + if (domain.fileCount) { + totalSources += domain.fileCount; + } + }); + + const percentage = (totalSources / 20) * 100; + + const countElement = this.element.querySelector('.sources-count'); + const progressBar = this.element.querySelector('.progress-bar'); + + if (countElement && progressBar) { + countElement.textContent = `${totalSources}/20`; + progressBar.style.width = `${percentage}%`; + + } + } + + show(domainName = '') { + const domainNameElement = this.element.querySelector('.domain-name'); + if (domainNameElement) { + domainNameElement.textContent = domainName; + } + this.updateSourceCount(); + const modal = new bootstrap.Modal(this.element); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + this.events.emit('modalClose'); + this.fileBasket.clear(); + this.resetUploadUI(); + } + } +} + + +class ChatManager extends Component { + constructor() { + const element = document.querySelector('.chat-content'); + super(element); + + this.messageContainer = this.element.querySelector('.chat-messages'); + this.setupMessageInput(); + this.setupExportButton(); + } + + setupMessageInput() { + const container = document.querySelector('.message-input-container'); + container.innerHTML = ` + + + `; + + const input = container.querySelector('.message-input'); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + this.handleSendMessage(input); + } + }); + + } + + async handleSendMessage(input) { + const message = input.value.trim(); + if (!message) return; + + // Add user message + this.addMessage(message, 'user'); + input.value = ''; + + // Add loading message + const loadingMessage = this.addLoadingMessage(); + + // Disable chat + this.disableChat(); + + try { + const selectedFileIds = window.app.sidebar.getSelectedFileIds(); + + const response = await window.sendMessage( + message, + window.serverData.userId, + window.serverData.sessionId, + selectedFileIds + ); + + // Remove loading message + loadingMessage.remove(); + + if (response.status === 400) { + if (response.message.includes('Daily question limit')) { + // Show limit reached modal + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
Daily Limit Reached
+

${response.message}

+
+ Questions Used Today: 25/25 +
+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + } else { + this.addMessage(response.message, 'ai'); + } + return; + } + + if (response.answer && response.question_count == 10) { + this.addMessage(response.answer, 'ai'); + this.updateResources(response.resources, response.resource_sentences); + this.events.emit('ratingModalOpen'); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + else if (response.answer) { + this.addMessage(response.answer, 'ai'); + this.updateResources(response.resources, response.resource_sentences); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + else { + this.addMessage(response.message, 'ai'); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + + } catch (error) { + loadingMessage.remove(); + this.addMessage('Error generating message!', 'ai'); + console.error('Error:', error); + } finally { + this.enableChat(); + } + } + + addMessage(content, type) { + const message = document.createElement('div'); + message.className = `chat-message ${type}`; + + const bubble = document.createElement('div'); + bubble.className = `message-bubble ${type}-bubble`; + + const text = document.createElement('div'); + text.className = 'message-text'; + + if (type === 'ai') { + text.innerHTML = this.formatMessage(content); + bubble.appendChild(text); + + if (!content.includes('what can I find for you?')) { + message.setAttribute('data-exportable', 'true'); + + const actionBar = document.createElement('div'); + actionBar.className = 'message-actions'; + + const actionContainer = document.createElement('div'); + actionContainer.className = 'action-container'; + + const selectionMark = document.createElement('div'); + selectionMark.className = 'selection-mark'; + selectionMark.innerHTML = ''; + + const copyButton = document.createElement('button'); + copyButton.className = 'copy-button'; + copyButton.innerHTML = ` + + Copy`; + + copyButton.addEventListener('click', () => { + const messageContent = text.innerHTML; + this.copyToClipboard(messageContent); + + copyButton.innerHTML = ` + + Copied!`; + copyButton.classList.add('copied'); + + setTimeout(() => { + copyButton.innerHTML = ` + + Copy`; + copyButton.classList.remove('copied'); + }, 2000); + }); + + selectionMark.addEventListener('click', () => { + message.classList.toggle('selected'); + this.updateExportButton(); + }); + + actionContainer.appendChild(copyButton); + actionBar.appendChild(copyButton); + bubble.appendChild(selectionMark); + bubble.appendChild(actionBar); + message.appendChild(bubble); + } else { + message.appendChild(bubble); + bubble.appendChild(text); + message.appendChild(bubble); + } + } else { + text.textContent = content; + bubble.appendChild(text); + message.appendChild(bubble) + } + + bubble.appendChild(text); + message.appendChild(bubble); + this.messageContainer.appendChild(message); + this.scrollToBottom(); + + return message; + } + + setupExportButton() { + const exportButton = document.querySelector('.export-button'); + if (exportButton) { + exportButton.addEventListener('click', () => this.handleExportSelected()); + exportButton.disabled = true; + } + } + + updateExportButton() { + const exportButton = document.querySelector('.export-button'); + const selectedMessages = document.querySelectorAll('.chat-message.ai.selected'); + const count = selectedMessages.length; + + let counter = document.querySelector('.export-counter'); + if (!counter) { + counter = document.createElement('div'); + counter.className = 'export-counter'; + exportButton.parentElement.appendChild(counter); + } + + counter.textContent = `${count}/10`; + counter.style.color = count === 10 ? '#10B981' : 'white'; + + exportButton.disabled = count === 0; + + if (count > 10) { + const lastSelected = selectedMessages[selectedMessages.length - 1]; + lastSelected.classList.remove('selected'); + this.updateExportButton(); + } + } + + getSelectedMessages() { + const selectedMessages = document.querySelectorAll('.chat-message.ai.selected'); + return Array.from(selectedMessages).map(message => { + return message.querySelector('.message-text').innerHTML; + }); + } + + async handleExportSelected() { + const selectedContents = this.getSelectedMessages(); + if (selectedContents.length === 0 || selectedContents.length > 10 ) return; + + const exportButton = document.querySelector('.export-button'); + const originalHTML = exportButton.innerHTML; + + try { + // Show loading state + exportButton.innerHTML = `
`; + exportButton.disabled = true; + + const result = await window.exportResponse(selectedContents); + + if (result === true) { + // Success state + exportButton.innerHTML = ''; + setTimeout(() => { + // Reset state + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + + // Deselect all messages + document.querySelectorAll('.chat-message.ai.selected').forEach(msg => { + msg.classList.remove('selected'); + }); + this.updateExportButton(); + }, 2000); + } else { + // Error state + exportButton.innerHTML = ''; + setTimeout(() => { + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + }, 2000); + } + } catch (error) { + console.error('Export failed:', error); + exportButton.innerHTML = ''; + setTimeout(() => { + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + }, 2000); + } + } + + updateHeader(domainName = null) { + const headerTitle = document.querySelector('.header-title'); + if (!headerTitle) return; + + if (domainName) { + headerTitle.innerHTML = `Chat with ${domainName}`; + } else { + headerTitle.textContent = 'Chat'; + } + } + + addLoadingMessage() { + const message = document.createElement('div'); + message.className = 'chat-message ai'; + message.innerHTML = ` +
+
+
+ Loading... +
+
+
+ `; + this.messageContainer.appendChild(message); + this.scrollToBottom(); + return message; + } + + showDefaultMessage() { + this.messageContainer.innerHTML = ` +
+
+
+ Please select a folder to start chatting with your documents. + Click the settings icon to select a folder. +
+
+
+ `; + } + + formatMessage(text) { + // First process headers + let formattedText = text.replace(/\[header\](.*?)\[\/header\]/g, '
$1
'); + + // Handle nested lists with proper indentation + formattedText = formattedText.replace(/^-\s*(.*?)$/gm, '
$1
'); + formattedText = formattedText.replace(/^\s{2}-\s*(.*?)$/gm, '
$1
'); + formattedText = formattedText.replace(/^\s{4}-\s*(.*?)$/gm, '
$1
'); + + // Process bold terms + formattedText = formattedText.replace(/\*\*(.*?)\*\*/g, '$1'); + formattedText = formattedText.replace(/\[bold\](.*?)\[\/bold\]/g, '$1'); + + return `
${formattedText}
`; + } + + convertMarkdownToHtmlTable(content) { + if (!content.includes('|')) { + return content; + } + + let segments = []; + + + const startsWithTable = content.trimStart().startsWith('|'); + + if (startsWithTable) { + const tableEndIndex = findTableEndIndex(content); + if (tableEndIndex > 0) { + const tableContent = content.substring(0, tableEndIndex).trim(); + segments.push(processTableContent(tableContent)); + + if (tableEndIndex < content.length) { + const remainingText = content.substring(tableEndIndex).trim(); + if (remainingText) { + segments.push(convertMarkdownToHtmlTable(remainingText)); + } + } + } else { + segments.push(processTableContent(content)); + } + } else { + const tableRegex = /(\|[^\n]+\|(?:\r?\n\|[^\n]+\|)*)/g; + let lastIndex = 0; + let match; + + while ((match = tableRegex.exec(content)) !== null) { + if (match.index > lastIndex) { + const textContent = content.substring(lastIndex, match.index).trim(); + if (textContent) { + segments.push(`
${textContent}
`); + } + } + + segments.push(processTableContent(match[0])); + lastIndex = match.index + match[0].length; + } + + if (lastIndex < content.length) { + const remainingText = content.substring(lastIndex).trim(); + if (remainingText) { + segments.push(`
${remainingText}
`); + } + } + } + + return segments.join(''); + + function findTableEndIndex(text) { + const lines = text.split('\n'); + let lineIndex = 0; + + for (let i = 0; i < lines.length; i++) { + lineIndex += lines[i].length + 1; + if (!lines[i].trimStart().startsWith('|')) { + return lineIndex - 1; + } + } + + return -1; + } + + function processTableContent(tableContent) { + const rows = tableContent.split(/\r?\n/).filter(row => row.trim() && row.includes('|')); + + let htmlTable = '
'; + let hasSeparatorRow = rows.some(row => + row.replace(/[\|\-:\s]/g, '').length === 0 + ); + + rows.forEach((row, rowIndex) => { + if (row.replace(/[\|\-:\s]/g, '').length === 0) return; + + const cells = []; + let cellMatch; + const cellRegex = /\|(.*?)(?=\||$)/g; + + while ((cellMatch = cellRegex.exec(row + '|')) !== null) { + if (cellMatch[1] !== undefined) { + cells.push(cellMatch[1].trim()); + } + } + + if (cells.length === 0) return; + + htmlTable += ''; + cells.forEach(cell => { + const isHeader = (rowIndex === 0 && !hasSeparatorRow) || + (rowIndex === 0 && hasSeparatorRow); + const cellTag = isHeader ? 'th' : 'td'; + + htmlTable += `<${cellTag} class="align-left">${cell}`; + }); + htmlTable += ''; + }); + + htmlTable += '
'; + return htmlTable; + } + } + + updateResources(resources, sentences) { + const container = document.querySelector('.resources-list'); + container.innerHTML = ''; + + if (!resources || !sentences || !resources.file_names?.length) { + return; + } + + sentences.forEach((sentence, index) => { + const item = document.createElement('div'); + item.className = 'resource-item'; + const content = this.convertMarkdownToHtmlTable(sentence); + + item.innerHTML = ` +
+ ${resources.file_names[index]} + + + Page ${resources.page_numbers[index]} + +
+
+
+
+
${index + 1}
+
+
+ ${content} +
+
+ `; + + container.appendChild(item); + }); + } + + copyToClipboard(content) { + const cleanText = content.replace(/
(.*?)<\/div>/g, '$1\n') + .replace(/
(.*?)<\/div>/g, '- $1') + .replace(/
(.*?)<\/div>/g, ' - $1') + .replace(/
(.*?)<\/div>/g, ' - $1') + .replace(/(.*?)<\/strong>/g, '$1') + .replace(/<[^>]+>/g, '') + .replace(/\n\s*\n/g, '\n\n') + .trim(); + + navigator.clipboard.writeText(cleanText) + .catch(err => console.error('Failed to copy text:', err)); + } + + scrollToBottom() { + this.element.scrollTop = this.element.scrollHeight; + } + + enableChat() { + this.element.classList.remove('chat-disabled'); + const input = document.querySelector('.message-input'); + input.disabled = false; + input.placeholder = "Send message"; + } + + disableChat() { + this.element.classList.add('chat-disabled'); + const input = document.querySelector('.message-input'); + input.disabled = true; + input.placeholder = "Select your folder to start chat..."; + } + + clearDefaultMessage() { + this.messageContainer.innerHTML = ''; + } +} + +// Sidebar Component +class Sidebar extends Component { + constructor(domainManager) { + const element = document.createElement('div'); + element.className = 'sidebar-container open'; + super(element); + + this.domainManager = domainManager; + this.isOpen = true; + this.timeout = null; + this.selectedFiles = new Set(); + this.render(); + this.setupEventListeners(); + this.isModalOpen = false; + } + + render() { + this.element.innerHTML = ` + + `; + } + + setupEventListeners() { + // Existing event listeners + const settingsIcon = this.element.querySelector('.settings-icon'); + if (settingsIcon) { + settingsIcon.addEventListener('click', () => { + this.events.emit('settingsClick'); + }); + } + + const fileMenuBtn = this.element.querySelector('.open-file-btn'); + fileMenuBtn.addEventListener('click', () => { + this.events.emit('fileMenuClick'); + }); + + + // Add hover handlers for desktop + const menuTrigger = document.querySelector('.menu-trigger'); + if (menuTrigger) { + menuTrigger.addEventListener('click', () => { + this.toggle(); + }); + } + + this.events.on('modalOpen', () => { + this.isModalOpen = true; + }); + + this.events.on('modalClose', () => { + this.isModalOpen = false; + setTimeout(() => { + this.toggle(false); // Force close the sidebar + }, 200); + }); + + // Mobile menu trigger handler + this.events.on('menuTrigger', () => { + if (window.innerWidth < 992) { + const menuIcon = document.querySelector('.menu-trigger .bi-list'); + if (menuIcon) { + menuIcon.style.transform = this.isOpen ? 'rotate(0)' : 'rotate(45deg)'; + } + this.toggle(); + } + }); + + // Handle window resize + window.addEventListener('resize', () => { + if (window.innerWidth >= 992) { + document.body.style.overflow = ''; + const menuIcon = document.querySelector('.menu-trigger .bi-list'); + if (menuIcon) { + menuIcon.style.transform = 'rotate(0)'; + } + } + }); + + // User Profile Menu + const userSection = this.element.querySelector('#userProfileMenu'); + if (userSection) { + userSection.addEventListener('click', (e) => { + e.stopPropagation(); + userSection.classList.toggle('active'); + }); + + // Close menu when clicking outside + document.addEventListener('click', (e) => { + if (!userSection.contains(e.target)) { + userSection.classList.remove('active'); + } + }); + + // Handle menu items + userSection.querySelectorAll('.menu-item').forEach(item => { + item.addEventListener('click', (e) => { + e.stopPropagation(); + if (item.classList.contains('logout-item')) { + // Handle logout logic here + console.log('Logging out...'); + } + userSection.classList.remove('active'); + }); + }); + } + + // Premium and Feedback links + const premiumLink = this.element.querySelector('.premium-link'); + if (premiumLink) { + premiumLink.addEventListener('click', (e) => { + e.preventDefault(); + this.events.emit('premiumClick'); + }); + } + + const feedbackLink = this.element.querySelector('.bottom-links a:not(.premium-link)'); + if (feedbackLink) { + feedbackLink.addEventListener('click', (e) => { + e.preventDefault(); + this.events.emit('feedbackClick'); + }); + } + + const profileMenuItem = userSection.querySelector('.menu-item:first-child'); + if (profileMenuItem) { + profileMenuItem.addEventListener('click', (e) => { + e.stopPropagation(); + userSection.classList.remove('active'); + this.events.emit('showProfileLimits'); + }); + } + } + + toggle() { + this.isOpen = !this.isOpen; + this.element.classList.toggle('open', this.isOpen); + + // Toggle chat container margin + const chatContainer = document.querySelector('.chat-container'); + if (chatContainer) { + chatContainer.classList.toggle('sidebar-closed', !this.isOpen); + + const messageContainer = document.querySelector('.message-container'); + if (messageContainer) { + messageContainer.style.left = this.isOpen ? '294px' : '0'; + messageContainer.style.width = this.isOpen ? + 'calc(100% - 600px - 294px)' : + 'calc(100% - 600px)'; + } + } + + } + + updateDomainSelection(domain) { + const domainText = this.element.querySelector('.selected-domain-text'); + const folderIcon = this.element.querySelector('.bi-folder'); + const helperText = this.element.querySelector('.helper-text'); + + if (domain) { + domainText.textContent = domain.name; + domainText.title = domain.name; + folderIcon.className = 'bi bi-folder empty-folder'; + helperText.style.display = 'none'; + } else { + domainText.textContent = 'No Domain Selected'; + domainText.removeAttribute('title'); + folderIcon.className = 'bi bi-folder empty-folder'; + helperText.style.display = 'block'; + } + } + + updateFileList(files, fileIDS) { + const fileList = this.element.querySelector('#sidebarFileList'); + if (!fileList) return; + + fileList.innerHTML = ''; + + if (files.length > 0 && fileIDS.length > 0) { + files.forEach((file, index) => { + const fileItem = this.createFileListItem(file, fileIDS[index]); + + // Check the checkbox by default + const checkbox = fileItem.querySelector('.file-checkbox'); + if (checkbox) { + checkbox.checked = true; + } + + fileList.appendChild(fileItem); + }); + } + + this.updateFileMenuVisibility(); + } + + createFileListItem(fileName, fileID) { + const fileItem = document.createElement('li'); + let extension; + if (fileName.includes('http') || fileName.includes('www.')) { + extension = 'html'; + } else { + extension = fileName.split('.').pop().toLowerCase(); + } + const icon = this.getFileIcon(extension); + const truncatedName = this.truncateFileName(fileName); + + fileItem.innerHTML = ` +
+
+ + +
+ + +
+
+ ${truncatedName} +
+ + +
+
+ `; + + this.selectedFiles.add(fileID); + + const checkbox = fileItem.querySelector('.file-checkbox'); + checkbox.checked = true; + + // Handle checkbox changes + checkbox.addEventListener('change', () => { + if (checkbox.checked) { + this.selectedFiles.add(fileID); + } else { + this.selectedFiles.delete(fileID); + } + // Update sources count + window.app.updateSourcesCount(this.selectedFiles.size); + }); + + const deleteBtn = fileItem.querySelector('.delete-file-btn'); + const confirmActions = fileItem.querySelector('.delete-confirm-actions'); + + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + // Show confirmation actions + confirmActions.classList.add('show'); + deleteBtn.style.display = 'none'; + }); + + // Add confirm/cancel handlers + const confirmBtn = fileItem.querySelector('.confirm-delete-btn'); + const cancelBtn = fileItem.querySelector('.cancel-delete-btn'); + + confirmBtn.addEventListener('click', async (e) => { + e.stopPropagation(); + const selectedDomain = this.domainManager.getSelectedDomain(); + if (!selectedDomain) return; + + const success = await window.removeFile(fileID, selectedDomain.data.id, window.serverData.userId); + + if (success) { + // Remove file from UI + fileItem.remove(); + + // Update domain file count + selectedDomain.data.files = selectedDomain.data.files.filter(f => f !== fileName); + selectedDomain.data.fileIDS = selectedDomain.data.fileIDS.filter(id => id !== fileID); + this.domainManager.updateDomainFileCount(selectedDomain.data.id); + + // Update sources count + const sourcesCount = selectedDomain.data.files.length; + window.app.updateSourcesCount(sourcesCount); + } + }); + + cancelBtn.addEventListener('click', (e) => { + e.stopPropagation(); + confirmActions.classList.remove('show'); + deleteBtn.style.display = 'flex'; + }); + + return fileItem; + } + + truncateFileName(fileName, maxLength = 25) { + if (fileName.length <= maxLength) return fileName; + + let extension; + if (fileName.includes('http') || fileName.includes('www.')) { + extension = 'html'; + } else { + extension = fileName.split('.').pop().toLowerCase(); + } + + const nameWithoutExt = fileName.slice(0, fileName.lastIndexOf('.')); + + // Leave room for ellipsis and extension + const truncatedLength = maxLength - 3 - extension.length - 1; + return `${nameWithoutExt.slice(0, truncatedLength)}...${extension}`; + } + + getSelectedFileIds() { + return Array.from(this.selectedFiles); + } + + updateFileList(files, fileIDS) { + const fileList = this.element.querySelector('#sidebarFileList'); + if (!fileList) return; + + fileList.innerHTML = ''; + this.selectedFiles.clear(); // Clear existing selections + + if (files.length > 0 && fileIDS.length > 0) { + files.forEach((file, index) => { + const fileItem = this.createFileListItem(file, fileIDS[index]); + fileList.appendChild(fileItem); + }); + } + + this.updateFileMenuVisibility(); + // Update initial sources count + window.app.updateSourcesCount(this.selectedFiles.size); + } + + updatePlanBadge(userType) { + const planBadge = this.element.querySelector('.plan-badge'); + if (planBadge) { + if (userType === 'premium') { + planBadge.textContent = 'Premium Plan'; + } else { + planBadge.textContent = 'Free Plan'; + } + } + } + + hideDeleteConfirmations() { + this.element.querySelectorAll('.delete-confirm-actions').forEach(actions => { + actions.classList.remove('show'); + }); + this.element.querySelectorAll('.delete-file-btn').forEach(btn => { + btn.style.display = 'flex'; + }); + } + + clearFileSelections() { + this.selectedFiles.clear(); + window.app.updateSourcesCount(0); + } + + getFileIcon(extension) { + const iconMap = { + pdf: 'bi-file-pdf', + docx: 'bi-file-word', + doc: 'bi-file-word', + txt: 'bi-file-text', + pptx: 'bi-file-ppt', + xlsx: 'bi-file-excel', + udf: 'bi-file-post', + html: 'bi-file-earmark-code', + }; + return iconMap[extension] || 'bi-file'; + } + + updateFileMenuVisibility() { + const fileList = this.element.querySelector('#sidebarFileList'); + const helperText = this.element.querySelector('.helper-text'); + const fileMenuBtn = this.element.querySelector('.open-file-btn'); + const fileListContainer = this.element.querySelector('.file-list-container'); + + if (fileList.children.length > 0) { + helperText.style.display = 'none'; + helperText.style.height = '0'; + helperText.style.margin = '0'; + helperText.style.padding = '0'; + } else { + fileListContainer.style.height = 'auto'; + fileMenuBtn.style.position = 'static'; + fileMenuBtn.style.width = '100%'; + } + } + + +} + +class PremiumModal extends Component { + constructor() { + const element = document.getElementById('premiumAlert'); + super(element); + this.setupEventListeners(); + } + + setupEventListeners() { + const closeButton = this.element.querySelector('.alert-button'); + closeButton?.addEventListener('click', () => this.hide()); + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Feedback Modal Component +class FeedbackModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'feedback-modal'; + super(element); + + this.render(); + this.setupEventListeners(); + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + // Close button handlers + const closeButtons = this.element.querySelectorAll('.close-modal, .btn-cancel'); + closeButtons.forEach(button => { + button.addEventListener('click', () => this.hide()); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + + // Form submission + const form = this.element.querySelector('#feedback-form'); + form.addEventListener('submit', async (e) => { + e.preventDefault(); + await this.handleSubmit(e); + }); + + // File size validation + const fileInput = this.element.querySelector('#feedback-screenshot'); + fileInput.addEventListener('change', (e) => { + const file = e.target.files[0]; + if (file && file.size > 2 * 1024 * 1024) { + alert('File size must be less than 2MB'); + e.target.value = ''; + } + }); + } + + async handleSubmit(e) { + const form = e.target; + const submitButton = form.querySelector('.btn-submit'); + submitButton.disabled = true; + + try { + const formData = new FormData(form); + const result = await window.sendFeedback(formData, window.serverData.userId); + + if (result.success) { + this.hide(); + this.events.emit('success', result.message); + } else { + this.events.emit('error', result.message); + } + } catch (error) { + console.error('Error in feedback submission:', error); + this.events.emit('error', 'An unexpected error occurred'); + } finally { + submitButton.disabled = false; + form.reset(); + } + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + this.element.querySelector('#feedback-form').reset(); + } +} + +class SuccessAlert extends Component { + constructor() { + const element = document.getElementById('feedbackSuccessAlert'); + super(element); + this.setupEventListeners(); + } + + setupEventListeners() { + const closeButton = this.element.querySelector('.alert-button'); + closeButton?.addEventListener('click', () => this.hide()); + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Logout +class LogoutModal extends Component { + constructor() { + const element = document.getElementById('logoutConfirmModal'); + super(element); + this.setupEventListeners(); + + // Set URLs based on environment from serverData + this.WEB_URL = window.serverData.environment === 'dev' + ? 'http://localhost:3000' + : 'https://doclink.io'; + } + + setupEventListeners() { + const logoutButton = this.element.querySelector('.alert-button'); + const cancelButton = this.element.querySelector('.btn-cancel'); + + logoutButton?.addEventListener('click', () => { + this.handleLogout(); + }); + + cancelButton?.addEventListener('click', () => { + this.hide(); + }); + } + + handleLogout() { + try { + // 1. Clear client-side app state + localStorage.clear(); + sessionStorage.clear(); + + // 2. Call FastAPI logout endpoint + window.handleLogoutRequest(window.serverData.userId, window.serverData.sessionId) + .finally(() => { + // 3. Clear cookies manually as backup + this.clearCookies(); + // 4. Redirect to signout + window.location.href = `${this.WEB_URL}/api/auth/signout?callbackUrl=/`; + }); + + } catch (error) { + console.error('Logout error:', error); + window.location.href = this.WEB_URL; + } + } + + clearCookies() { + const cookies = document.cookie.split(';'); + const domain = window.location.hostname; + for (let cookie of cookies) { + const name = cookie.split('=')[0].trim(); + document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`; + document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.${domain}`; + } + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Rating Modal +class RatingModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'ratingModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.rating = 0; + + this.render(); + this.setupEventListeners(); + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + this.modal = new bootstrap.Modal(this.element); + } + + setupEventListeners() { + // Star rating handlers + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, index) => { + star.addEventListener('click', () => this.handleStarClick(index)); + star.addEventListener('mouseover', () => this.highlightStars(index)); + star.addEventListener('mouseout', () => this.updateStars()); + }); + + // Close button handler + const closeButton = this.element.querySelector('.close-button'); + closeButton.addEventListener('click', () => this.hide()); + + // Submit button handler + const submitButton = this.element.querySelector('.submit-button'); + submitButton.addEventListener('click', () => { + const feedbackInput = this.element.querySelector('.feedback-input'); + this.sendRating(this.rating,feedbackInput.value) + setTimeout(() => { + this.hide(); + }, 1000); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + } + + handleStarClick(index) { + this.rating = index + 1; + this.updateStars(); + } + + async sendRating(rating,user_note) { + try { + const result = await window.sendRating(rating, user_note, window.serverData.userId); + + if (result.success) { + this.hide() + this.events.emit('success', result.message); + } else { + this.events.emit('error', result.message); + } + } catch (error) { + console.error('Error in rating submission:', error); + this.events.emit('error', 'An unexpected error occurred'); + } finally { + this.reset(); + } + } + + highlightStars(index) { + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, i) => { + star.classList.remove('bi-star-fill', 'bi-star'); + if (i <= index) { + star.classList.add('bi-star-fill'); + star.classList.add('active'); + } else { + star.classList.add('bi-star'); + star.classList.remove('active'); + } + }); + } + + updateStars() { + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, i) => { + star.classList.remove('bi-star-fill', 'bi-star', 'active'); + if (i < this.rating) { + star.classList.add('bi-star-fill'); + star.classList.add('active'); + } else { + star.classList.add('bi-star'); + } + }); + } + + show() { + this.modal.show(); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.modal.hide(); + document.body.style.overflow = ''; + } + + reset() { + this.rating = 0; + this.updateStars(); + const feedbackInput = this.element.querySelector('.feedback-input'); + if (feedbackInput) { + feedbackInput.value = ''; + } + } +} + +// URLuploadModal +class URLInputModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'urlInputModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.render(); + this.setupEventListeners(); + this.modal = null; + + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + this.modal = new bootstrap.Modal(this.element); + } + + setupEventListeners() { + const urlInput = this.element.querySelector('.url-input'); + const addButton = this.element.querySelector('.add-url-btn'); + const closeButton = this.element.querySelector('.close-button'); + + // Enable/disable add button based on URL input + urlInput.addEventListener('input', () => { + addButton.disabled = !urlInput.value.trim(); + }); + + // URL processing + addButton.addEventListener('click', () => { + const url = urlInput.value; + this.startProcessing(url); + urlInput.value = ''; + }); + + // Close button handler + closeButton.addEventListener('click', () => { + this.hide(); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + + } + + async startProcessing(url) { + const clean_url = url.trim(); + if (!clean_url) return; + + this.setLoadingState(true); + + try { + const success = await window.storeURL(window.serverData.userId, clean_url); + + if (success === 1) { + this.handleFileBasketAddition(clean_url) + this.events.emit('urlProcessed', { + message: 'Successfully processed URL', + type: 'success' + }); + this.hide(); + } else { + throw new Error('Failed to process URL'); + } + + } catch (error) { + this.events.emit('error', error.message); + } finally { + this.setLoadingState(false); + } + } + + handleFileBasketAddition(url) { + try { + // Create a clean filename from the URL + const urlObj = new URL(url); + const fileName = `${urlObj.hostname}.html`; + + // Create URL file object similar to drive file object + const urlFile = { + name: fileName, + mimeType: 'text/html', + lastModified: Date.now() + }; + + // Emit event for FileUploadModal to handle + this.events.emit('urlProcessed', { + files: [urlFile], + message: 'Successfully processed URL', + type: 'success' + }); + + this.hide(); + return true; + + } catch (error) { + console.error('Error preparing URL file:', error); + return false; + } + } + + setLoadingState(isLoading) { + const loadingOverlay = this.element.querySelector('.upload-loading-overlay'); + const closeButton = this.element.querySelector('.close-button'); + const addButton = this.element.querySelector('.add-url-btn'); + + if (isLoading) { + loadingOverlay.style.display = 'flex'; + closeButton.style.display = 'none'; + addButton.disabled = true; + this.modal._config.backdrop = 'static'; + this.modal._config.keyboard = false; + } else { + loadingOverlay.style.display = 'none'; + closeButton.style.display = 'block'; + addButton.disabled = false; + this.modal._config.backdrop = true; + this.modal._config.keyboard = true; + } + } + + show() { + if (this.modal) { + this.modal.dispose(); + } + + this.modal = new bootstrap.Modal(this.element); + + this.element.style.zIndex = '9999'; + + this.modal.show(); + + setTimeout(() => { + const backdrop = document.querySelector('.modal-backdrop:last-child'); + if (backdrop) { + backdrop.style.zIndex = '9998'; + } + }, 0); + } + + hide() { + this.modal.hide(); + const urlInput = this.element.querySelector('.url-input'); + urlInput.value = ''; + } + +} + +// Add this class after other modal classes +class ProfileLimitsModal extends Component { + constructor(domainManager) { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'profileLimitsModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.domainManager = domainManager; + this.render(); + this.setupEventListeners(); + this.dailyQuestionsCount = 0; + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + } + + updateLimits() { + const domains = this.domainManager.getAllDomains(); + let totalSources = 0; + const userType = window.app?.userData?.user_info?.user_type || 'free'; + const upgradeButton = this.element.querySelector('.upgrade-section'); + + const limitsContainer = this.element.querySelector('.limits-container'); + if (limitsContainer) { + const limitIndicators = limitsContainer.querySelectorAll('.limit-indicator'); + const dailyQuestionBar = limitIndicators.length >= 3 ? limitIndicators[2] : null; + + if (upgradeButton) { + upgradeButton.style.display = userType === 'premium' ? 'none' : 'block'; + } + + if (dailyQuestionBar) { + dailyQuestionBar.style.display = userType === 'premium' ? 'none' : 'block'; + } + } + + domains.forEach(domain => { + if (domain.fileCount) { + totalSources += domain.fileCount; + } + }); + + if (userType === 'free') { + this.updateProgressBar('sources', totalSources, 10); + this.updateProgressBar('domains', domains.length, 3); + this.updateProgressBar('questions', this.dailyQuestionsCount, 25); + } else if (userType === 'premium') { + this.updateProgressBar('sources', totalSources, 100); + this.updateProgressBar('domains', domains.length, 20); + } + + } + + updateDailyCount(count) { + this.dailyQuestionsCount = count; + if (this.element.classList.contains('show')) { + this.updateProgressBar('questions', count, 25); + } + } + + updateProgressBar(type, current, max) { + const countElement = this.element.querySelector(`.${type}-count`); + const progressBar = countElement?.closest('.limit-indicator').querySelector('.progress-bar'); + + if (countElement && progressBar) { + const percentage = (current / max) * 100; + countElement.textContent = `${current}/${max}`; + progressBar.style.width = `${percentage}%`; + } + } + + setupEventListeners() { + const upgradeButton = this.element.querySelector('.upgrade-button'); + upgradeButton?.addEventListener('click', () => { + this.events.emit('upgradeClick'); + }); + } + + show() { + this.updateLimits(); + const modal = new bootstrap.Modal(this.element); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + } + } +} + +// Application +class App { + constructor() { + this.domainManager = new DomainManager(); + this.sidebar = new Sidebar(this.domainManager); + this.feedbackModal = new FeedbackModal(); + this.domainSettingsModal = new DomainSettingsModal(this.domainManager); + this.fileUploadModal = new FileUploadModal(this.domainManager); + this.events = new EventEmitter(); + this.userData = null; + this.sourcesCount = 0; + this.sourcesBox = document.querySelector('.sources-box'); + this.sourcesNumber = document.querySelector('.sources-number'); + this.chatManager = new ChatManager(); + this.premiumModal = new PremiumModal(); + this.successAlert = new SuccessAlert(); + this.logoutModal = new LogoutModal(); + this.ratingModal = new RatingModal(); + this.profileLimitsModal = new ProfileLimitsModal(this.domainManager); + this.chatManager.disableChat(); + this.setupEventListeners(); + } + + updateUserInterface() { + // Update user section in sidebar + const userEmail = this.sidebar.element.querySelector('.user-email'); + const userAvatar = this.sidebar.element.querySelector('.user-avatar'); + + userEmail.textContent = this.userData.user_info.user_email; + + if (this.userData.user_info.user_picture_url && this.userData.user_info.user_picture_url !== "null") { + userAvatar.innerHTML = `${this.userData.user_info.user_name}`; + userAvatar.classList.add('has-image'); + } else { + userAvatar.textContent = this.userData.user_info.user_name[0].toUpperCase(); + userAvatar.classList.remove('has-image'); + } + + this.sidebar.updatePlanBadge(this.userData.user_info.user_type); + } + + updateSourcesCount(count) { + this.sourcesCount = count; + if (this.sourcesNumber) { + this.sourcesNumber.textContent = count; + this.sourcesBox.setAttribute('count', count); + } + } + + updateDomainCount() { + this.domainSettingsModal.updateDomainCount(); + } + + setupEventListeners() { + // Sidebar events + this.sidebar.events.on('settingsClick', () => { + this.domainSettingsModal.show(); + }); + + this.sidebar.events.on('fileMenuClick', () => { + const selectedDomain = this.domainManager.getSelectedDomain(); + if (!selectedDomain) { + this.events.emit('warning', 'Please select a domain first'); + return; + } + this.fileUploadModal.show(selectedDomain.data.name); + this.sidebar.events.emit('modalOpen'); + }); + + this.sidebar.events.on('feedbackClick', () => { + this.feedbackModal.show(); + }); + + // Domain Settings Modal events + this.domainSettingsModal.events.on('domainCreate', async (domainData) => { + const domainCard = this.domainManager.addDomain({ + id: domainData.id, + name: domainData.name + }); + + // Update the domains list in the modal + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.updateDomainCount(); + + this.events.emit('message', { + text: `Successfully created folder ${domainData.name}`, + type: 'success' + }); + }); + + this.domainSettingsModal.events.on('domainSearch', (searchTerm) => { + const filteredDomains = this.domainManager.searchDomains(searchTerm); + this.domainSettingsModal.updateDomainsList(filteredDomains); + }); + + this.domainSettingsModal.events.on('domainSelected', async (domainId) => { + try { + const success = await window.selectDomain(domainId, window.serverData.userId); + + if (success) { + const domain = this.domainManager.getDomain(domainId); + if (!domain) return; + + // Update domain manager state and UI + this.domainManager.selectDomain(domainId); + this.sidebar.updateDomainSelection(domain.data); + + // Update header with domain name + this.chatManager.updateHeader(domain.data.name); + + const files = domain.data.files || []; + const fileIDS = domain.data.fileIDS || []; + this.sidebar.updateFileList(files, fileIDS); + + // Update sources count + this.updateSourcesCount(files.length); + + // Enable chat + this.chatManager.enableChat(); + + this.events.emit('message', { + text: `Successfully switched to folder ${domain.data.name}`, + type: 'success' + }); + } + } catch (error) { + this.events.emit('message', { + text: 'Failed to select folder', + type: 'error' + }); + } + }); + + const selectButton = this.domainSettingsModal.element.querySelector('.select-button'); + selectButton?.addEventListener('click', () => { + const selectedCheckbox = this.domainSettingsModal.element.querySelector('.domain-checkbox:checked'); + if (selectedCheckbox) { + const domainCard = selectedCheckbox.closest('.domain-card'); + const domainId = domainCard.dataset.domainId; + this.domainSettingsModal.events.emit('domainSelected', domainId); + } + }); + + this.domainSettingsModal.events.on('domainEdit', async ({ id, newName }) => { + const success = this.domainManager.renameDomain(id, newName); + if (success) { + // If this is the currently selected domain, update the sidebar + const selectedDomain = this.domainManager.getSelectedDomain(); + if (selectedDomain && selectedDomain.data.id === id) { + this.sidebar.updateDomainSelection(selectedDomain.data); + } + + // Update the domains list in the modal + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.events.emit('message', { + text: `Successfully renamed folder to ${newName}`, + type: 'success' + }); + } + }); + + this.domainSettingsModal.events.on('warning', (message) => { + this.events.emit('message', { + text: message, + type: 'warning' + }); + }); + + this.domainSettingsModal.events.on('domainDelete', async (domainId) => { + const wasSelected = this.domainManager.getSelectedDomain()?.data.id === domainId; + + if (this.domainManager.deleteDomain(domainId)) { + if (wasSelected) { + // Reset sidebar to default state + this.sidebar.updateDomainSelection(null); + this.sidebar.updateFileList([], []); + // Reset sources count + this.updateSourcesCount(0); + // Disable chat + this.chatManager.disableChat(); + } + + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.updateDomainCount(); + + this.events.emit('message', { + text: 'Folder successfully deleted', + type: 'success' + }); + } + }); + + this.chatManager.events.on('ratingModalOpen', () => { + setTimeout(() => { + this.ratingModal.show(); + }, 500); + }); + + // File Upload Modal events + this.fileUploadModal.events.on('filesUploaded', (data) => { + const selectedDomain = this.domainManager.getSelectedDomain(); + if (selectedDomain) { + // Access the nested data object + selectedDomain.data.files = data.file_names; + selectedDomain.data.fileIDS = data.file_ids; + this.sidebar.updateFileList(data.file_names, data.file_ids); + this.updateSourcesCount(data.file_names.length); + this.domainManager.updateDomainFileCount(selectedDomain.data.id); + } + }); + + this.fileUploadModal.events.on('warning', (message) => { + this.events.emit('message', { + text: message, + type: 'warning' + }); + }); + + this.fileUploadModal.events.on('error', (message) => { + this.events.emit('message', { + text: message, + type: 'error' + }); + }); + + this.fileUploadModal.events.on('modalClose', () => { + this.sidebar.events.emit('modalClose'); + }); + + // Feedback Modal events + this.feedbackModal.events.on('feedbackSubmitted', (message) => { + console.log(message); + }); + + this.feedbackModal.events.on('feedbackError', (error) => { + console.error(error); + }); + + this.feedbackModal.events.on('success', (message) => { + this.successAlert.show(); + }); + + // Premium Modal Events + const premiumLink = this.sidebar.element.querySelector('.premium-link'); + premiumLink?.addEventListener('click', (e) => { + e.preventDefault(); + this.initiateCheckout(); + }); + + this.profileLimitsModal.events.on('upgradeClick', () => { + this.initiateCheckout(); + }); + + // Logout event + const logoutItem = this.sidebar.element.querySelector('.logout-item'); + logoutItem?.addEventListener('click', (e) => { + e.preventDefault(); + this.logoutModal.show(); + }); + + this.sidebar.events.on('showProfileLimits', () => { + this.profileLimitsModal.show() + }); + + } + + // In App class initialization + async init() { + // Initialize + this.userData = await window.fetchUserInfo(window.serverData.userId); + if (!this.userData) { + throw new Error('Failed to load user data'); + } + + // Update user interface with user data + this.updateUserInterface() + + // Store domain data + Object.keys(this.userData.domain_info).forEach(key => { + const domainData = this.userData.domain_info[key]; + const domain = { + id: key, + name: domainData.domain_name, + fileCount: domainData.file_names.length, + files: domainData.file_names, + fileIDS: domainData.file_ids + }; + this.domainManager.addDomain(domain); + }); + + // Update UI with domain data + this.domainSettingsModal.updateDomainsList( + this.domainManager.getAllDomains() + ); + + window.user_type = this.userData.user_type + + // Add sidebar to DOM + document.body.appendChild(this.sidebar.element); + + // Setup menu trigger + const menuTrigger = document.querySelector('.menu-trigger'); + if (menuTrigger) { + menuTrigger.addEventListener('click', () => { + this.sidebar.events.emit('menuTrigger'); + }); + } + + window.app.profileLimitsModal.updateDailyCount(this.userData.user_info.user_daily_count); + + // Welcome operations + const isFirstTime = window.serverData.isFirstTime === 'True'; + if (1 === 1) { + localStorage.setItem('firstTime', 0); + const firstTimeMsg = `[header]Welcome to Doclink${this.userData.user_info.user_name ? `, ${this.userData.user_info.user_name}` : ''}๐Ÿ‘‹[/header]\nYour first folder with helpful guide settled up. You can always use this file to get information about Doclink!\n[header]To get started[/header]\n- Select your folder on navigation bar \n- Upload your documents or insert a link\n- Ask any question to get information\n- All answers will include sources on references\n\n[header]Quick Tips[/header]\n- Doclink is specialized to answer only from your files\n- Specialized questions can help Doclink to find information better\n- Doclink supports PDF, DOCX, Excel, PowerPoint, UDF and TXT file formats\n- You can create different folders for different topics and interact with them\n- You can also ask just selected files to get isolated information\n- You can select answers on the upper right of the message box and create report with clicking report icon on the chat`; + this.chatManager.addMessage(firstTimeMsg, 'ai'); + + const domains = this.domainManager.getAllDomains(); + if (domains.length > 0) { + this.domainSettingsModal.events.emit('domainSelected', domains[0].id); + } + + } else { + // Regular welcome message for returning users + this.chatManager.addMessage( + `Welcome ${this.userData.user_info.user_name}, what can I find for you?`, + 'ai' + ); + } + } + + // Initial Checkout + initiateCheckout() { + const checkoutUrl = 'https://doclinkio.lemonsqueezy.com/buy/0c0294bb-1cbe-4411-a9bc-800053d1580c'; + window.location.href = checkoutUrl; + } +} + +// Initialize when DOM is ready +document.addEventListener('DOMContentLoaded', () => { + window.app = new App(); + window.app.init(); + + const resourcesTrigger = document.querySelector('.resources-trigger'); + const resourcesContainer = document.querySelector('.resources-container'); + const mainContent = document.querySelector('.chat-container'); + + if (resourcesTrigger && resourcesContainer) { + resourcesTrigger.addEventListener('click', () => { + resourcesContainer.classList.toggle('show'); + mainContent.classList.toggle('blur-content'); + + if (resourcesContainer.classList.contains('show')) { + backdrop.classList.add('show'); + document.body.style.overflow = 'hidden'; + } else { + backdrop.classList.remove('show'); + document.body.style.overflow = ''; + } + }); + + // Escape tuลŸu ile kapatma + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && resourcesContainer.classList.contains('show')) { + resourcesContainer.classList.remove('show'); + mainContent.classList.remove('blur-content'); + backdrop.classList.remove('show'); + document.body.style.overflow = ''; + } + }); + } + +}); \ No newline at end of file diff --git a/doclink/app/utils/prompts.yaml b/doclink/app/utils/prompts.yaml new file mode 100644 index 0000000..62f241c --- /dev/null +++ b/doclink/app/utils/prompts.yaml @@ -0,0 +1,636 @@ +prompts: + languages: + en: + general_purpose: + - id: gp_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language and context.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata: \n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Informational: + - id: info_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language and context.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Identify factual knowledge, definitions, or explanations requested in the query.\n + 2. Focus on delivering concise, clear, and specific information.\n + 3. Include [b]key terms[/b] and definitions for clarity and emphasize relevant details.\n + 4. Avoid generalizations; prioritize extracting exact matches or relevant information from the context.\n + 5. Answer must be short as possible, on-point and clear as much as possible.\n + 6. Always prioritize contexts with higher confidence coefficients for accuracy, but cross-check lower-confidence contexts for supplementary or missing details to ensure completeness.\n + 7. Where appropriate, attribute information to its source file or section implicitly. For example: 'As described in the regulations...' or 'According to the provided report...' without directly mentioning the context window or file name unless explicitly required by the query.\n + 8. If contradictory information is found: Explicitly state the contradiction and its source(s). Suggest possible resolutions, clarifications, or factors that may explain the discrepancy (e.g., differing data sources, updates, or interpretations).\n + 9. If the query requests a more detailed response, expand your answer with additional explanations\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response \n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Comparison: + - id: comp_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Extract and compare relevant details from the context to highlight similarities and differences.\n + 2. If contradictory information is found, specify the contradictions and explain their sources.\n + 3. Present distinctions or parallels in a structured format, using headers like [header]Similarities[/header] and [header]Differences[/header].\n + 4. Provide a clear explanation of how the extracted information relates to the user's query.\n + 5. If consistent information appears across contexts, summarize it in the [header]Similarities[/header] section. For contradictory information: Specify conflicting points under [header]Differences[/header]. Attribute contradictions to their respective sources and explain their impact.\n + 6. For comparisons involving multiple attributes, organize data using a [bold]tabular format[/bold] or structured lists. Each row or bullet point should represent one attribute.\n + 7. If the required comparison data is missing, clearly state this under [header]Missing Information[/header]. Offer suggestions for refining the query or point out gaps in the context.\n + 8. For queries involving detailed or hierarchical comparisons: Use a primary section for high-level differences or similarities. Include nested sections for more granular points.\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Summarization: + - id: sum_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Identify and extract key points or main ideas from the context relevant to the query.\n + 2. Create a concise and well-structured summary, using bullet points or categories for clarity.\n + 3. Highlight overarching themes and provide an overview without including excessive details.\n + 4. Consolidate consistent information across contexts to avoid redundancy.\n + 5. If the query specifies a focus area (e.g., a section, file, or theme), prioritize summarizing content strictly relevant to that focus. Where no focus is specified, highlight the most critical and recurring themes or points.\n + 6. Where appropriate, illustrate key ideas with short examples or specific details from the context. Keep examples concise and relevant.\n + 7. If the context contains contradictions: Summarize both perspectives succinctly. Highlight the contradiction explicitly, and explain how it relates to the query.\n + 8. The summary should not exceed 200 tokens unless explicitly requested by the query. If required details exceed this limit, provide a prioritized or hierarchical overview.\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + queries: + - id: query_001 + text: " + Task: Analyze, Correct, and Generate Related Questions & Answers\n + Instructions:\n + You are given a user query.\n + + First, check the user question. If it has no meaning, return an empty string. If it is meaningful, do the following:\n + Correct any spelling or grammatical errors and return the corrected question as the first line of the output.\n + Generate 3 semantically similar queries that retain the same meaning as the corrected query.\n + Create 3 different questions that approach the original query from different angles but stay related.\n + Answer last 3 questions with concise responses, 1-2 sentences max each.\n + Then, analyze the corrected user query and determine its intent, intention list is and their keywords, examples are given below. If intent can't be determined return empty '' string.\n + Please respond in the file language, specified by the {file lang} variable (e.g., 'en' for English, 'tr' for Turkish) regardless of user query's language , ensuring the tone and style align with the file's language.\n + If file language is diferent than english look for the intention keywords that provided for intent detection below in file language.\n + + The possible intents are:\n + 1. Informational: Seeking factual knowledge, definitions, or explanations.\n + Intention Keywords: What, define, explain, details, specify, who, why, how.\n + Intention Examples: What is the penalty for breaking this rule? โ†’ Informational\n + 2. Summarization: Requesting a concise overview of complex information.\n + Intention Keywords: Summarize, overview, main points, key ideas, brief, concise, simplify.\n + Intention Examples: Can you summarize the key points of this document? โ†’ Summarization\n + 3. Comparison: Evaluating options, methods, or technologies.\n + Intention Keywords: Compare, difference, similarity, versus, contrast, better, alternative, pros and cons.\n + Intention Examples: Compare the benefits of these two methods. โ†’ Comparison\n + + Return the output **strictly** in the following format:\n + [corrected query]\n + [first semantically similar query]\n + [second semantically similar query]\n + [third semantically similar query]\n + [first different-angle question]\n + [second different-angle question]\n + [third different-angle question]\n + [first different-angle answer]\n + [second different-angle answer]\n + [third different-angle answer]\n + [user intention]\n + + User query: {query}\n + + File language:\n + {file_lang}\n + + Example:\n + User query: How does retrieval-augmented generation work in AI systems?\n + + File language: en\n + + Output: + How does retrieval-augmented generation work in AI systems?\n + What is the process of retrieval-augmented generation in AI?\n + How does RAG help AI systems retrieve and generate information?\n + Can you explain how retrieval-augmented generation functions in AI applications?\n + What are the key advantages of using RAG in AI?\n + How does RAG differ from traditional machine learning models?\n + What challenges does RAG face in implementation?\n + RAG enhances AI by providing more accurate responses by retrieving relevant external data.\n + Unlike traditional models, RAG integrates search capabilities to access external knowledge during inference.\n + Major challenges include latency in retrieval, ensuring relevance of fetched data, and maintaining up-to-date information.\n + Informational\n + " + tr: + general_purpose: + - id: gp_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + Bilgi Edinme: + - id: info_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Sorguda talep edilen gerรงek bilgilere, tanฤฑmlara veya aรงฤฑklamalara odaklanฤฑn.\n + 2. Kฤฑsa, net ve spesifik bilgiler sunmaya odaklanฤฑn.\n + 3. Aรงฤฑklฤฑk iรงin [b]รถnemli terimler[/b] ve tanฤฑmlarฤฑ ekleyin ve ilgili ayrฤฑntฤฑlarฤฑ vurgulayฤฑn.\n + 4. Genellemelerden kaรงฤฑnฤฑn; baฤŸlamdan tam eลŸleลŸmeleri veya ilgili bilgileri รงฤฑkarmayฤฑ รถnceliklendirin.\n + 5. Cevap mรผmkรผn olduฤŸunca kฤฑsa, net ve doฤŸrudan olmalฤฑ; 150 ile 200 token arasฤฑnda olmalฤฑdฤฑr.\n + 6. DoฤŸruluk iรงin her zaman daha yรผksek gรผven katsayฤฑsฤฑna sahip baฤŸlamlara รถncelik verin, ancak eksiksizliฤŸi saฤŸlamak iรงin ek veya eksik ayrฤฑntฤฑlar iรงin daha dรผลŸรผk gรผven katsayฤฑsฤฑna sahip baฤŸlamlarฤฑ รงapraz kontrol edin.\n + 7. Uygun olduฤŸunda, bilgiyi kaynak dosya veya bรถlรผme dolaylฤฑ olarak atfedin. ร–rneฤŸin: Yรถnetmeliklerde belirtildiฤŸi gibi... veya SaฤŸlanan rapora gรถre... ifadelerini kullanฤฑn, ancak sorguda aรงฤฑkรงa istenmediฤŸi sรผrece baฤŸlam penceresi veya dosya adฤฑnฤฑ doฤŸrudan belirtmeyin.\n + 8. ร‡eliลŸkili bilgiler bulunursa: ร‡eliลŸkiyi ve kaynaฤŸฤฑnฤฑ aรงฤฑkรงa belirtin. Olasฤฑ รงรถzรผm yollarฤฑnฤฑ, aรงฤฑklamalarฤฑ veya farklฤฑlฤฑklarฤฑ aรงฤฑklayabilecek faktรถrleri (รถrneฤŸin, farklฤฑ veri kaynaklarฤฑ, gรผncellemeler veya yorumlar) รถnerin.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + KarลŸฤฑlaลŸtฤฑrma: + - id: comp_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Benzerlikleri ve farklฤฑlฤฑklarฤฑ vurgulamak iรงin baฤŸlamdan ilgili detaylarฤฑ รงฤฑkarฤฑn ve karลŸฤฑlaลŸtฤฑrฤฑn.\n + 2. ร‡eliลŸkili bilgiler bulunursa, bu รงeliลŸkileri belirtin ve kaynaklarฤฑnฤฑ aรงฤฑklayฤฑn.\n + 3. Ayrฤฑmlarฤฑ veya paralellikleri, [header]Benzerlikler[/header] ve [header]Farklฤฑlฤฑklar[/header] gibi baลŸlฤฑklar kullanarak yapฤฑlandฤฑrฤฑlmฤฑลŸ bir formatta sunun.\n + 4. ร‡ฤฑkarฤฑlan bilgilerin kullanฤฑcฤฑnฤฑn sorgusuyla nasฤฑl iliลŸkili olduฤŸunu net bir ลŸekilde aรงฤฑklayฤฑn.\n + 5. EฤŸer baฤŸlamlar arasฤฑnda tutarlฤฑ bilgiler bulunuyorsa, bunlarฤฑ [header]Benzerlikler[/header] bรถlรผmรผnde รถzetleyin. ร‡eliลŸkili bilgiler iรงin: ร‡eliลŸen noktalarฤฑ [header]Farklฤฑlฤฑklar[/header] baลŸlฤฑฤŸฤฑ altฤฑnda belirtin. ร‡eliลŸkileri ilgili kaynaklarฤฑna atfedin ve bunlarฤฑn etkisini aรงฤฑklayฤฑn.\n + 6. Birden fazla รถzelliฤŸi kapsayan karลŸฤฑlaลŸtฤฑrmalar iรงin, verileri [bold]tablo formatฤฑnda[/bold] veya yapฤฑlandฤฑrฤฑlmฤฑลŸ listeler halinde dรผzenleyin. Her bir satฤฑr veya madde iลŸareti bir รถzelliฤŸi temsil etmelidir.\n + 7. Gerekli karลŸฤฑlaลŸtฤฑrma verileri eksikse, bunu [header]Eksik Bilgiler[/header] baลŸlฤฑฤŸฤฑ altฤฑnda aรงฤฑkรงa belirtin. Sorgunun nasฤฑl iyileลŸtirilebileceฤŸine dair รถnerilerde bulunun veya baฤŸlamdaki eksikliklere iลŸaret edin.\n + 8. Ayrฤฑntฤฑlฤฑ veya hiyerarลŸik karลŸฤฑlaลŸtฤฑrmalarฤฑ iรงeren sorgular iรงin: Genel farklฤฑlฤฑklar veya benzerlikler iรงin bir ana bรถlรผm kullanฤฑn. Daha ayrฤฑntฤฑlฤฑ noktalar iรงin iรง iรงe geรงmiลŸ bรถlรผmler ekleyin.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + ร–zetleme: + - id: sum_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Sorgu ile ilgili baฤŸlamdan anahtar noktalarฤฑ veya temel fikirleri belirleyin ve รงฤฑkarฤฑn.\n + 2. Netlik iรงin madde iลŸaretleri veya kategoriler kullanarak kฤฑsa ve iyi yapฤฑlandฤฑrฤฑlmฤฑลŸ bir รถzet oluลŸturun.\n + 3. Genel temalarฤฑ vurgulayฤฑn ve gereksiz ayrฤฑntฤฑlara yer vermeden genel bir bakฤฑลŸ saฤŸlayฤฑn.\n + 4. Tekrarlamalarฤฑ รถnlemek iรงin baฤŸlamlar arasฤฑndaki tutarlฤฑ bilgileri birleลŸtirin.\n + 5. EฤŸer sorgu belirli bir odak alanฤฑ (รถrneฤŸin, bir bรถlรผm, dosya veya tema) belirtiyorsa, yalnฤฑzca bu odakla ilgili iรงeriฤŸi รถzetlemeye รถncelik verin. Herhangi bir odak belirtilmemiลŸse, en kritik ve tekrar eden temalarฤฑ veya noktalarฤฑ vurgulayฤฑn.\n + 6. Uygun olduฤŸunda, baฤŸlamdan kฤฑsa รถrnekler veya belirli detaylarla ana fikirleri aรงฤฑklayฤฑn. ร–rnekleri kฤฑsa ve ilgili tutun.\n + 7. BaฤŸlamda รงeliลŸkiler varsa: Her iki bakฤฑลŸ aรงฤฑsฤฑnฤฑ da kฤฑsaca รถzetleyin. ร‡eliลŸkiyi aรงฤฑkรงa belirtin ve bunun sorguyla nasฤฑl iliลŸkili olduฤŸunu aรงฤฑklayฤฑn.\n + 8. ร–zet, sorgu tarafฤฑndan aรงฤฑkรงa talep edilmedikรงe 200 kelimeyi aลŸmamalฤฑdฤฑr. EฤŸer gerekli detaylar bu sฤฑnฤฑrฤฑ aลŸarsa, รถncelikli veya hiyerarลŸik bir genel bakฤฑลŸ saฤŸlayฤฑn.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + queries: + - id: query_tr_001 + text: " + Gรถrev: Analiz Et, Dรผzelt ve ฤฐlgili Sorular & Cevaplar OluลŸtur.\n + + Talimatlar:\n + Kullanฤฑcฤฑ sorgusu size verilmiลŸtir.\n + ร–ncelikle Kullanฤฑcฤฑ sorusunu kontrol edin. EฤŸer anlamsฤฑzsa, boลŸ bir string '' dรถndรผrรผn. Anlamlฤฑysa, ลŸu iลŸlemleri yapฤฑn:\n + Herhangi bir yazฤฑm veya dilbilgisi hatasฤฑ olup olmadฤฑฤŸฤฑnฤฑ kontrol edin ve dรผzeltilmiลŸ soruyu รงฤฑktฤฑdaki ilk soru olarak dรถndรผrรผn.\n + Ardฤฑndan, DรผzeltmiลŸ soruyla aynฤฑ anlamฤฑ koruyan 3 semantik olarak benzer sorgu oluลŸturun.\n + Orijinal soruyu farklฤฑ aรงฤฑlardan ele alan, ancak yine de ilgili kalan 3 farklฤฑ soru oluลŸturun.\n + Son 3 soruya, her biri 1-2 cรผmlelik kฤฑsa cevaplarla yanฤฑt verin.\n + Ardฤฑndan dรผzeltilmiลŸ kullanฤฑcฤฑ sorgusunu analiz edin ve niyetini belirleyin. Niyet listesi, anahtar kelimeler ve รถrnekler aลŸaฤŸฤฑda verilmiลŸtir. EฤŸer niyet tam olarak anlaลŸฤฑlmaz ise boลŸ bir string '' dรถndรผr.\n + + Olasฤฑ niyetler:\n + 1. Bilgi Edinme: Gerรงek bilgileri, tanฤฑmlarฤฑ veya aรงฤฑklamalarฤฑ รถฤŸrenme talebi.\n + Niyet Anahtar Kelimeleri: Ne, tanฤฑmla, aรงฤฑkla, detaylar, belirt, kim, neden, nasฤฑl.\n + Niyet ร–rnekleri: Bu kuralฤฑ ihlal etmenin cezasฤฑ nedir? โ†’ Bilgilendirme\n + 2. ร–zetleme: KarmaลŸฤฑk bilgilerin kฤฑsa bir รถzetini isteme.\n + Niyet Anahtar Kelimeleri: ร–zetle, genel bakฤฑลŸ, ana noktalar, temel fikirler, kฤฑsa, รถz, basitleลŸtir.\n + Niyet ร–rnekleri: Bu belgenin ana noktalarฤฑnฤฑ รถzetleyebilir misiniz? โ†’ ร–zetleme\n + 3. KarลŸฤฑlaลŸtฤฑrma: Seรงenekleri, yรถntemleri veya teknolojileri deฤŸerlendirme.\n + Niyet Anahtar Kelimeleri: KarลŸฤฑlaลŸtฤฑr, fark, benzerlik, karลŸฤฑlaลŸtฤฑrma, daha iyi, alternatif, artฤฑlar ve eksiler.\n + Niyet ร–rnekleri: Bu iki yรถntemin faydalarฤฑnฤฑ karลŸฤฑlaลŸtฤฑrฤฑn. โ†’ KarลŸฤฑlaลŸtฤฑrma\n + + ร‡ฤฑktฤฑyฤฑ **kesinlikle** ลŸu formatta dรถndรผrรผn:\n + [dรผzeltilmiลŸ sorgu]\n + [birinci semantik olarak benzer sorgu]\n + [ikinci semantik olarak benzer sorgu]\n + [รผรงรผncรผ semantik olarak benzer sorgu]\n + [birinci farklฤฑ-aรงฤฑdan soru]\n + [ikinci farklฤฑ-aรงฤฑdan soru]\n + [รผรงรผncรผ farklฤฑ-aรงฤฑdan soru]\n + [birinci farklฤฑ-aรงฤฑdan cevap]\n + [ikinci farklฤฑ-aรงฤฑdan cevap]\n + [รผรงรผncรผ farklฤฑ-aรงฤฑdan cevap]\n + [kullanฤฑcฤฑ niyeti]\n + + Kullanฤฑcฤฑ Sorgusu: {query}\n + + ร–rnek:\n + Kullanฤฑcฤฑ sorgusu: Retrieval-augmented generation yapay zeka sistemlerinde nasฤฑl รงalฤฑลŸฤฑr?\n + + ร‡ฤฑktฤฑ:\n + Retrieval-augmented generation yapay zeka sistemlerinde nasฤฑl รงalฤฑลŸฤฑr?\n + Retrieval-augmented generation sรผreci yapay zekada nasฤฑl iลŸler?\n + RAG, yapay zeka sistemlerine bilgi getirme ve oluลŸturma konusunda nasฤฑl yardฤฑmcฤฑ olur?\n + Retrieval-augmented generation yapay zeka uygulamalarฤฑnda nasฤฑl iลŸlev gรถrรผr?\n + RAG kullanmanฤฑn yapay zeka iรงin temel avantajlarฤฑ nelerdir?\n + RAG, geleneksel makine รถฤŸrenimi modellerinden nasฤฑl farklฤฑdฤฑr?\n + RAGโ€™in uygulanmasฤฑnda karลŸฤฑlaลŸฤฑlan zorluklar nelerdir?\n + RAG, yapay zekayฤฑ dฤฑลŸ verileri getirerek daha doฤŸru yanฤฑtlar saฤŸlamada geliลŸtirir.\n + RAG, geleneksel modellerden farklฤฑ olarak รงฤฑkarฤฑm sฤฑrasฤฑnda harici bilgilere eriลŸim saฤŸlar.\n + BaลŸlฤฑca zorluklar arasฤฑnda getirme gecikmesi, getirilen verilerin uygunluฤŸu ve bilgilerin gรผncel tutulmasฤฑ yer alฤฑr.\n + Bilgi Edinme\n + + Kullanฤฑcฤฑ sorusu: {query}\n + " + +metadata: + version: "1.0" + description: "Prompt type storages with language groups" \ No newline at end of file diff --git a/doclink/doclink/app/__init__.py b/doclink/doclink/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/doclink/app/api/__init__.py b/doclink/doclink/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/doclink/app/api/core.py b/doclink/doclink/app/api/core.py new file mode 100644 index 0000000..4f3b49c --- /dev/null +++ b/doclink/doclink/app/api/core.py @@ -0,0 +1,474 @@ +from typing import List +import numpy as np +import bcrypt +import re +import base64 +import os +from dotenv import load_dotenv +from cryptography.hazmat.primitives.ciphers.aead import AESGCM + +from ..functions.reading_functions import ReadingFunctions +from ..functions.embedding_functions import EmbeddingFunctions +from ..functions.indexing_functions import IndexingFunctions +from ..functions.chatbot_functions import ChatbotFunctions +from ..functions.scraping_functions import Webscraper +from ..functions.export_functions import Exporter + + +class Authenticator: + def __init__(self): + pass + + def verify_password(self, plain_password: str, hashed_password: str) -> bool: + return bcrypt.checkpw( + plain_password.encode("utf-8"), hashed_password.encode("utf-8") + ) + + def hash_password(self, password: str) -> str: + salt = bcrypt.gensalt() + return bcrypt.hashpw(password.encode("utf-8"), salt).decode("utf-8") + + +class Encryptor: + def __init__(self): + load_dotenv() + self.key = os.getenv("ENCRYPTION_KEY") + self.email_auth = "EMAIL_AUTH_DATA_2025" + self.email_nonce = self.email_auth.encode("utf-8")[:12].ljust(12, b"\0") + self._key_bytes = base64.b64decode(self.key) + self.aesgcm = AESGCM(self._key_bytes) + + def encrypt(self, text: str, auth_data) -> str: + try: + nonce = os.urandom(12) + encrypted_data = self.aesgcm.encrypt( + nonce, text.encode("utf-8"), auth_data.encode("utf-8") + ) + combined_encrypt = nonce + encrypted_data + encrypted_sentence = base64.b64encode(combined_encrypt).decode("utf-8") + return encrypted_sentence + except Exception as e: + raise e + + def decrypt(self, encrypted_data: str, auth_data) -> str: + try: + decoded_text = base64.b64decode(encrypted_data.encode("utf-8")) + nonce = decoded_text[:12] + encrypted_text = decoded_text[12:] + decrypted_data = self.aesgcm.decrypt( + nonce, encrypted_text, auth_data.encode("utf-8") + ) + return decrypted_data.decode("utf-8") + except Exception as e: + raise e + + +class Processor: + def __init__( + self, + ): + self.ef = EmbeddingFunctions() + self.rf = ReadingFunctions() + self.indf = IndexingFunctions() + self.cf = ChatbotFunctions() + self.en = Encryptor() + self.ws = Webscraper() + self.ex = Exporter() + + def create_index(self, embeddings: np.ndarray, index_type: str = "flat"): + if index_type == "flat": + index = self.indf.create_flat_index(embeddings=embeddings) + return index + + def filter_search( + self, domain_content: dict, domain_embeddings: np.ndarray, file_ids: list + ): + filtered_indexes = [] + filtered_content = [] + + for i, content in enumerate(domain_content): + if content[4] in file_ids: + filtered_indexes.append(i) + filtered_content.append(content) + + filtered_embeddings = domain_embeddings[filtered_indexes] + + index = self.create_index(embeddings=filtered_embeddings) + boost_info = self.extract_boost_info( + domain_content=filtered_content, embeddings=filtered_embeddings + ) + + try: + index_header = self.create_index(embeddings=boost_info["header_embeddings"]) + except IndexError: + index_header = None + + return index, filtered_content, boost_info, index_header + + def search_index( + self, + user_query: str, + domain_content: dict, + boost_info: dict, + index, + index_header, + ): + file_lang = self.file_lang_detection(domain_content=domain_content) + queries, lang = self.query_preprocessing( + user_query=user_query, file_lang=file_lang + ) + if not queries: + if lang == "tr": + return ( + "Sorunu anlayamadฤฑm", + None, + None, + ) + else: + return ( + f"I didn't understand {user_query}", + None, + None, + ) + + query_embeddings = self.ef.create_embeddings_from_sentences( + sentences=queries[:-1] + ) + + boost_array = self._create_boost_array( + header_indexes=boost_info["header_indexes"], + sentence_amount=index.ntotal, + query_vector=query_embeddings[0], + index_header=index_header, + ) + + # Get search distances with occurrences + dict_resource = {} + for i, query_embedding in enumerate(query_embeddings): + D, I = index.search(query_embedding.reshape(1, -1), len(domain_content)) # noqa: E741 + if i == 0: + convergence_vector, distance_vector = I[0], D[0] + for i, match_index in enumerate(I[0]): + if match_index in dict_resource: + dict_resource[match_index].append(D[0][i]) + else: + dict_resource[match_index] = [D[0][i]] + + file_boost_array = self._create_file_boost_array( + domain_content=domain_content, + distance_vector=distance_vector, + convergence_vector=convergence_vector, + ) + + # Combine boost arrays + combined_boost_array = 0.25 * file_boost_array + 0.75 * boost_array + + # Get average occurrences + dict_resource = self._avg_resources(dict_resource) + + for key in dict_resource: + dict_resource[key] *= combined_boost_array[key] + + sorted_dict = dict( + sorted(dict_resource.items(), key=lambda item: item[1], reverse=True) + ) + + filtered_indexes = [ + sentence_index + for sentence_index in sorted_dict.keys() + if sorted_dict[sentence_index] >= 0.35 + ] + sorted_sentence_indexes = filtered_indexes[:10] + + # Early return with message + if not sorted_sentence_indexes: + if lang == "tr": + return ( + "SeรงtiฤŸin dokรผmanlarda bu sorunun cevabฤฑnฤฑ bulamadฤฑm", + None, + None, + ) + else: + return ( + "I couldn't find the answer of the question within the selected files", + None, + None, + ) + + # Sentences to context creation + context, context_windows, resources = self.context_creator( + sentence_index_list=sorted_sentence_indexes, + domain_content=domain_content, + header_indexes=boost_info["header_indexes"], + table_indexes=boost_info["table_indexes"], + ) + + answer = self.cf.response_generation( + query=user_query, context=context, intention=queries[-1] + ) + + return answer, resources, context_windows + + def query_preprocessing(self, user_query, file_lang): + generated_queries, lang = self.cf.query_generation( + query=user_query, file_lang=file_lang + ) + splitted_queries = generated_queries.split("\n") + + if len(splitted_queries) > 1: + return splitted_queries, lang + return None, lang + + def _create_boost_array( + self, + header_indexes: list, + sentence_amount: int, + query_vector: np.ndarray, + index_header, + ): + boost_array = np.ones(sentence_amount) + + if not index_header: + return boost_array + + D, I = index_header.search(query_vector.reshape(1, -1), 10) # noqa: E741 + filtered_header_indexes = [ + header_index + for index, header_index in enumerate(I[0]) + if D[0][index] > 0.30 + ] + + if not filtered_header_indexes: + return boost_array + else: + for i, filtered_index in enumerate(filtered_header_indexes): + try: + start = header_indexes[filtered_index] + 1 + end = header_indexes[filtered_index + 1] + if i > 2: + boost_array[start:end] *= 1.1 + elif i > 0: + boost_array[start:end] *= 1.2 + else: + boost_array[start:end] *= 1.3 + except IndexError as e: + print(f"List is out of range {e}") + continue + return boost_array + + # File boost function + def _create_file_boost_array( + self, + domain_content: list, + distance_vector: np.ndarray, + convergence_vector: np.ndarray, + ): + boost_array = np.ones(len(domain_content)) + sort_order = np.argsort(convergence_vector) + sorted_scores = distance_vector[sort_order] + file_counts = {} + + if not domain_content: + return boost_array + else: + for _, _, _, _, _, filename in domain_content: + file_counts[filename] = file_counts.get(filename, 0) + 1 + + file_sentence_counts = np.cumsum([0] + list(file_counts.values())) + + for i in range(len(file_sentence_counts) - 1): + start, end = file_sentence_counts[i], file_sentence_counts[i + 1] + if np.mean(sorted_scores[start:end]) > 0.30: + boost_array[start:end] *= 1.1 + + return boost_array + + def context_creator( + self, + sentence_index_list: list, + domain_content: List[tuple], + header_indexes: list, + table_indexes: list, + ): + context = "" + context_windows = [] + widened_indexes = [] + original_matches = set(sentence_index_list) + + for i, sentence_index in enumerate(sentence_index_list): + window_size = 4 if i < 3 else 2 + start = max(0, sentence_index - window_size) + end = min(len(domain_content) - 1, sentence_index + window_size) + + if table_indexes: + for table_index in table_indexes: + if sentence_index == table_index: + widened_indexes.append((table_index, table_index)) + table_indexes.remove(table_index) + break + + if not header_indexes: + widened_indexes.append((start, end)) + else: + for i, current_header in enumerate(header_indexes): + if sentence_index == current_header: + start = max(0, sentence_index) + if ( + i + 1 < len(header_indexes) + and abs(sentence_index - header_indexes[i + 1]) <= 20 + ): + end = min( + len(domain_content) - 1, header_indexes[i + 1] - 1 + ) + else: + end = min( + len(domain_content) - 1, sentence_index + window_size + ) + break + elif ( + i + 1 < len(header_indexes) + and current_header < sentence_index < header_indexes[i + 1] + ): + start = ( + current_header + if abs(sentence_index - current_header) <= 20 + else max(0, sentence_index - window_size) + ) + end = ( + header_indexes[i + 1] - 1 + if abs(header_indexes[i + 1] - sentence_index) <= 20 + else min( + len(domain_content) - 1, sentence_index + window_size + ) + ) + break + elif ( + i == len(header_indexes) - 1 + and current_header >= sentence_index + ): + start = ( + max(0, sentence_index) + if abs(current_header - sentence_index) <= 20 + else max(0, sentence_index - window_size) + ) + end = min(len(domain_content) - 1, sentence_index + window_size) + break + if (start, end) not in widened_indexes: + widened_indexes.append((start, end)) + + merged_truples = self.merge_tuples(widen_sentences=widened_indexes) + + used_indexes = [ + min(index for index in sentence_index_list if tuple[0] <= index <= tuple[1]) + for tuple in merged_truples + ] + resources = self._extract_resources( + sentence_indexes=used_indexes, domain_content=domain_content + ) + + for i, tuple in enumerate(merged_truples): + if tuple[0] == tuple[1]: + windened_sentence = " ".join( + self.en.decrypt( + domain_content[tuple[0]][0], domain_content[tuple[0]][4] + ) + ) + context += f"Context{i + 1}: File:{resources['file_names'][i]}, Confidence:{(len(sentence_index_list) - i) / len(sentence_index_list)}, Table\n{windened_sentence}\n" + context_windows.append(windened_sentence) + else: + highlighted_sentences = [] + + for index in range(tuple[0], tuple[1] + 1): + sentence_text = self.en.decrypt( + domain_content[index][0], domain_content[index][4] + ) + + # Highlight original matches + if index in original_matches: + highlighted_sentences.append(f"{sentence_text}") + else: + highlighted_sentences.append(sentence_text) + + windened_sentence = " ".join(highlighted_sentences) + context += f"Context{i + 1}: File:{resources['file_names'][i]}, Confidence:{(len(sentence_index_list) - i) / len(sentence_index_list)}, {windened_sentence}\n\n" + context_windows.append(windened_sentence) + + return context, context_windows, resources + + def _avg_resources(self, resources_dict): + for key, value in resources_dict.items(): + value_mean = sum(value) / len(value) + value_coefficient = value_mean + len(value) * 0.0025 + resources_dict[key] = value_coefficient + return resources_dict + + def _extract_resources(self, sentence_indexes: list, domain_content: List[tuple]): + resources = {"file_names": [], "page_numbers": []} + for index in sentence_indexes: + resources["file_names"].append(domain_content[index][5]) + resources["page_numbers"].append(domain_content[index][3]) + return resources + + def _create_dynamic_context(self, sentences): + context = "" + for i, sentence in enumerate(sentences): + context += f"{i + 1}: {sentence}\n" + return context + + def extract_boost_info(self, domain_content: List[tuple], embeddings: np.ndarray): + boost_info = { + "header_indexes": [], + "headers": [], + "header_embeddings": [], + "table_indexes": [], + } + for index in range(len(domain_content)): + if domain_content[index][1]: + boost_info["header_indexes"].append(index) + boost_info["headers"].append(domain_content[index][0]) + + if domain_content[index][2]: + boost_info["table_indexes"].append(index) + boost_info["header_embeddings"] = embeddings[boost_info["header_indexes"]] + return boost_info + + def merge_tuples(self, widen_sentences): + sorted_dict = {0: widen_sentences[0]} + + for sentence_tuple in widen_sentences[1:]: + tuple_range = range(sentence_tuple[0], sentence_tuple[1]) + is_in = 0 + for index, value in sorted_dict.items(): + current_range = range(value[0], value[1]) + if set(tuple_range) & set(current_range): + interval = ( + min(sorted_dict[index][0], sentence_tuple[0]), + max(sorted_dict[index][1], sentence_tuple[1]), + ) + sorted_dict[index] = interval + is_in = 1 + + if not is_in: + sorted_dict[index + 1] = sentence_tuple + + return list(dict.fromkeys(sorted_dict.values())) + + def file_lang_detection(self, domain_content: List[tuple]): + file_lang = {} + detected_sentence_amount = ( + 25 if len(domain_content) > 25 else len(domain_content) + ) + + for i in range(0, detected_sentence_amount): + decrypted_content = self.en.decrypt( + domain_content[i][0], domain_content[i][4] + ) + if re.match(r"\b[a-zA-Z]{" + str(4) + r",}\b", decrypted_content) or ( + decrypted_content[0] == "|" and decrypted_content[-1] == "|" + ): + lang = self.cf.detect_language(decrypted_content) + file_lang[lang] = file_lang.get(lang, 0) + 1 + try: + return max(file_lang, key=file_lang.get) + except ValueError: + return "en" diff --git a/doclink/doclink/app/api/endpoints.py b/doclink/doclink/app/api/endpoints.py new file mode 100644 index 0000000..ba3c0ce --- /dev/null +++ b/doclink/doclink/app/api/endpoints.py @@ -0,0 +1,870 @@ +from fastapi import APIRouter, UploadFile, HTTPException, Request, Query, File, Form +from fastapi.responses import JSONResponse, StreamingResponse +from google.oauth2.credentials import Credentials +from googleapiclient.discovery import build +from googleapiclient.http import MediaIoBaseDownload +from datetime import datetime + +import os +import logging +import uuid +import base64 +import psycopg2 +import io +import hmac +import hashlib + +from .core import Processor +from .core import Authenticator +from .core import Encryptor +from ..db.database import Database +from ..redis_manager import RedisManager, RedisConnectionError + +# services +router = APIRouter() +processor = Processor() +authenticator = Authenticator() +redis_manager = RedisManager() +encryptor = Encryptor() + +# logger +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# environment variables +GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID") +GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET") +GOOGLE_REDIRECT_URI = os.getenv("GOOGLE_REDIRECT_URI") +GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + + +# request functions +@router.post("/db/get_user_info") +async def get_user_info(request: Request): + try: + data = await request.json() + user_id = data.get("user_id") + with Database() as db: + user_info, domain_info = db.get_user_info_w_id(user_id) + + return JSONResponse( + content={ + "user_info": user_info, + "domain_info": domain_info, + }, + status_code=200, + ) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/rename_domain") +async def rename_domain(request: Request): + try: + data = await request.json() + selected_domain_id = data.get("domain_id") + new_name = data.get("new_name") + with Database() as db: + success = db.rename_domain(domain_id=selected_domain_id, new_name=new_name) + + if not success: + return JSONResponse( + content={"message": "error while renaming domain"}, + status_code=400, + ) + + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error renaming domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/create_domain") +async def create_domain( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + domain_name = data.get("domain_name") + domain_id = str(uuid.uuid4()) + with Database() as db: + result = db.create_domain( + user_id=userID, + domain_id=domain_id, + domain_name=domain_name, + domain_type=1, + ) + + if not result["success"]: + return JSONResponse( + content={"message": result["message"]}, + status_code=400, + ) + + return JSONResponse( + content={"message": "success", "domain_id": domain_id}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error renaming domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/delete_domain") +async def delete_domain(request: Request): + try: + data = await request.json() + domain_id = data.get("domain_id") + with Database() as db: + success = db.delete_domain(domain_id=domain_id) + + if success < 0: + return JSONResponse( + content={ + "message": "This is your default domain. You cannot delete it completely, instead you can delete the unnucessary files inside!" + }, + status_code=400, + ) + elif success == 0: + return JSONResponse( + content={ + "message": "Error while deleting domain. Please report this to us, using feedback on the bottom left." + }, + status_code=400, + ) + + db.conn.commit() + + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except Exception as e: + logger.error(f"Error while deleting domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/insert_feedback") +async def insert_feedback( + userID: str = Query(...), + feedback_type: str = Form(...), + feedback_description: str = Form(...), + feedback_screenshot: UploadFile = File(None), +): + try: + feedback_id = str(uuid.uuid4()) + screenshot_data = None + + if feedback_screenshot: + contents = await feedback_screenshot.read() + if len(contents) > 2 * 1024 * 1024: # 2MB limit + raise HTTPException( + status_code=400, detail="Screenshot size should be less than 2MB" + ) + screenshot_data = base64.b64encode(contents).decode("utf-8") + + with Database() as db: + db.insert_user_feedback( + feedback_id=feedback_id, + user_id=userID, + feedback_type=feedback_type, + description=feedback_description[:5000], + screenshot=screenshot_data, + ) + db.conn.commit() + + return JSONResponse( + content={"message": "Thanks for the feedback!"}, status_code=200 + ) + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/db/insert_rating") +async def insert_rating( + userID: str = Query(...), + rating: int = Form(...), + user_note: str = Form(""), +): + try: + rating_id = str(uuid.uuid4()) + with Database() as db: + db.insert_user_rating( + rating_id=rating_id, + user_id=userID, + rating=rating, + user_note=user_note if user_note else None, + ) + db.conn.commit() + + return JSONResponse( + content={"message": "Thank you for the rating!"}, status_code=200 + ) + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/qa/select_domain") +async def select_domain( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + selected_domain_id = data.get("domain_id") + _, _, success = update_selected_domain( + user_id=userID, domain_id=selected_domain_id + ) + + if not success: + return JSONResponse( + content={"message": "error while updating selected domain"}, + status_code=400, + ) + + redis_manager.refresh_user_ttl(userID) + return JSONResponse( + content={"message": "success"}, + status_code=200, + ) + except RedisConnectionError as e: + logger.error(f"Redis connection error: {str(e)}") + raise HTTPException(status_code=503, detail="Service temporarily unavailable") + except Exception as e: + logger.error(f"Error in select_domain: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/qa/generate_answer") +async def generate_answer( + request: Request, + userID: str = Query(...), + sessionID: str = Query(...), +): + try: + data = await request.json() + user_message = data.get("user_message") + file_ids = data.get("file_ids") + + # Check if domain is selected + selected_domain_id = redis_manager.get_data(f"user:{userID}:selected_domain") + if not selected_domain_id: + return JSONResponse( + content={"message": "Please select a domain first..."}, + status_code=400, + ) + + if not file_ids: + return JSONResponse( + content={"message": "You didn't select any files..."}, + status_code=400, + ) + + with Database() as db: + update_result = db.upsert_session_info(user_id=userID, session_id=sessionID) + if not update_result["success"]: + return JSONResponse( + content={"message": update_result["message"]}, + status_code=400, + ) + + # Retrieve domain data from Redis + domain_content = redis_manager.get_data(f"user:{userID}:domain_content") + domain_embeddings = redis_manager.get_data(f"user:{userID}:domain_embeddings") + + # Log the retrieved data for debugging + logger.info(f"Domain content: {domain_content}") + logger.info(f"Domain embeddings: {domain_embeddings}") + + # Guard: if either domain content or embeddings is None, return an error + if domain_content is None or domain_embeddings is None: + logger.error("Domain data not found in Redis") + return JSONResponse( + content={"message": "Domain data not available. Please re-select your domain."}, + status_code=400, + ) + + # Call filter_search to filter the domain content + result = processor.filter_search( + domain_content=domain_content, + domain_embeddings=domain_embeddings, + file_ids=file_ids, + ) + if result is None: + logger.error("filter_search returned None") + return JSONResponse( + content={"message": "Nothing in here..."}, + status_code=400, + ) + + try: + index, filtered_content, boost_info, index_header = result + except Exception as e: + logger.error(f"Error unpacking filter_search result: {e}") + return JSONResponse( + content={"message": "Error processing domain data."}, + status_code=400, + ) + + # Process search with the filtered data + answer, resources, resource_sentences = processor.search_index( + user_query=user_message, + domain_content=filtered_content, + boost_info=boost_info, + index=index, + index_header=index_header, + ) + + if not resources or not resource_sentences: + return JSONResponse( + content={ + "message": answer, + "daily_count": update_result["daily_count"], + }, + status_code=200, + ) + + redis_manager.refresh_user_ttl(userID) + + return JSONResponse( + content={ + "answer": answer, + "resources": resources, + "resource_sentences": resource_sentences, + "question_count": update_result["question_count"], + "daily_count": update_result["daily_count"], + }, + status_code=200, + ) + + except RedisConnectionError as e: + logger.error(f"Redis connection error: {str(e)}") + raise HTTPException(status_code=503, detail="Service temporarily unavailable") + except Exception as e: + logger.error(f"Error in generate_answer: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + + +@router.post("/io/store_file") +async def store_file( + userID: str = Query(...), + file: UploadFile = File(...), + lastModified: str = Form(...), +): + try: + file_bytes = await file.read() + if not file_bytes: + return JSONResponse( + content={ + "message": f"Empty file {file.filename}. If you think not, please report this to us!" + }, + status_code=400, + ) + + file_data = processor.rf.read_file( + file_bytes=file_bytes, file_name=file.filename + ) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {file.filename}. If there is please report this to us!" + }, + status_code=400, + ) + + # Create embeddings + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + # Store in Redis + redis_key = f"user:{userID}:upload:{file.filename}" + upload_data = { + "file_name": file.filename, + "last_modified": datetime.fromtimestamp(int(lastModified) / 1000).strftime( + "%Y-%m-%d" + )[:20], + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": file.filename}, + status_code=200, + ) + + except Exception as e: + logging.error(f"Error storing file {file.filename}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing file: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/store_drive_file") +async def store_drive_file( + userID: str = Query(...), + lastModified: str = Form(...), + driveFileId: str = Form(...), + driveFileName: str = Form(...), + accessToken: str = Form(...), +): + try: + credentials = Credentials( + token=accessToken, + client_id=GOOGLE_CLIENT_ID, + client_secret=GOOGLE_CLIENT_SECRET, + token_uri="https://oauth2.googleapis.com/token", + ) + + drive_service = build("drive", "v3", credentials=credentials) + + google_mime_types = { + "application/vnd.google-apps.document": ("application/pdf", ".pdf"), + "application/vnd.google-apps.spreadsheet": ( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlsx", + ), + "application/vnd.google-apps.presentation": ( + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".pptx", + ), + "application/vnd.google-apps.script": ("text/plain", ".txt"), + } + + file_metadata = ( + drive_service.files().get(fileId=driveFileId, fields="mimeType").execute() + ) + mime_type = file_metadata["mimeType"] + + if mime_type in google_mime_types: + export_mime_type, extension = google_mime_types[mime_type] + request = drive_service.files().export_media( + fileId=driveFileId, mimeType=export_mime_type + ) + + if not driveFileName.endswith(extension): + driveFileName += extension + else: + request = drive_service.files().get_media(fileId=driveFileId) + + file_stream = io.BytesIO() + downloader = MediaIoBaseDownload(file_stream, request) + + done = False + while not done: + _, done = downloader.next_chunk() + + file_stream.seek(0) + file_bytes = file_stream.read() + + if not file_bytes: + return JSONResponse( + content={ + "message": f"Empty file {driveFileName}. If you think not, please report this to us!" + }, + status_code=400, + ) + + file_data = processor.rf.read_file( + file_bytes=file_bytes, file_name=driveFileName + ) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {driveFileName}. If there is please report this to us!" + }, + status_code=400, + ) + + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + redis_key = f"user:{userID}:upload:{driveFileName}" + upload_data = { + "file_name": driveFileName, + "last_modified": datetime.fromtimestamp(int(lastModified) / 1000).strftime( + "%Y-%m-%d" + )[:20], + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": driveFileName}, status_code=200 + ) + + except Exception as e: + logging.error(f"Error storing Drive file {driveFileName}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing file: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/store_url") +async def store_url(userID: str = Query(...), url: str = Form(...)): + try: + if not processor.ws.url_validator(url): + return JSONResponse( + content={"message": "Invalid URL. Please enter a valid URL."}, + status_code=400, + ) + + html = processor.ws.request_creator(url) + if not html: + return JSONResponse( + content={"message": "Error fetching the URL. Please try again later."}, + status_code=400, + ) + + file_data = processor.rf.read_url(html_content=html) + + if not file_data["sentences"]: + return JSONResponse( + content={ + "message": f"No content to extract in {url}. If there is please report this to us!" + }, + status_code=400, + ) + + file_embeddings = processor.ef.create_embeddings_from_sentences( + sentences=file_data["sentences"] + ) + + redis_key = f"user:{userID}:upload:{url}" + upload_data = { + "file_name": url, + "last_modified": datetime.now().strftime("%Y-%m-%d"), + "sentences": file_data["sentences"], + "page_numbers": file_data["page_number"], + "is_headers": file_data["is_header"], + "is_tables": file_data["is_table"], + "embeddings": file_embeddings, + } + + redis_manager.set_data(redis_key, upload_data, expiry=3600) + + return JSONResponse( + content={"message": "success", "file_name": url}, status_code=200 + ) + + except Exception as e: + logging.error(f"Error storing URL {url}: {str(e)}") + return JSONResponse( + content={"message": f"Error storing URL: {str(e)}"}, status_code=500 + ) + + +@router.post("/io/upload_files") +async def upload_files(userID: str = Query(...)): + try: + # Get domain info + selected_domain_id = redis_manager.get_data(f"user:{userID}:selected_domain") + + with Database() as db: + domain_info = db.get_domain_info( + user_id=userID, domain_id=selected_domain_id + ) + + if not domain_info: + return JSONResponse( + content={"message": "Invalid domain selected"}, status_code=400 + ) + + # Get all stored files from Redis + stored_files = redis_manager.get_keys_by_pattern(f"user:{userID}:upload:*") + if not stored_files: + return JSONResponse( + content={"message": "No files to process"}, status_code=400 + ) + + file_info_batch = [] + file_content_batch = [] + + # Process stored files + for redis_key in stored_files: + upload_data = redis_manager.get_data(redis_key) + if not upload_data: + continue + + file_id = str(uuid.uuid4()) + + # Prepare batches + file_info_batch.append( + ( + userID, + file_id, + selected_domain_id, + upload_data["file_name"], + upload_data["last_modified"], + ) + ) + + for i in range(len(upload_data["sentences"])): + file_content_batch.append( + ( + file_id, + encryptor.encrypt( + text=upload_data["sentences"][i], auth_data=file_id + ), + upload_data["page_numbers"][i], + upload_data["is_headers"][i], + upload_data["is_tables"][i], + psycopg2.Binary(upload_data["embeddings"][i]), + ) + ) + + # Clean up Redis + redis_manager.delete_data(redis_key) + + # Bulk insert with limit check + result = db.insert_file_batches(file_info_batch, file_content_batch) + if not result["success"]: + return JSONResponse( + content={"message": result["message"]}, status_code=400 + ) + db.conn.commit() + + # Update domain info + file_names, file_ids, success = update_selected_domain( + user_id=userID, domain_id=selected_domain_id + ) + if not success: + return JSONResponse( + content={ + "message": "Files uploaded but, domain could not be updated", + "file_names": None, + "file_ids": None, + }, + status_code=400, + ) + + return JSONResponse( + content={ + "message": "success", + "file_names": file_names, + "file_ids": file_ids, + }, + status_code=200, + ) + + except Exception as e: + logging.error(f"Error processing uploads: {str(e)}") + return JSONResponse( + content={"message": f"Error processing uploads: {str(e)}"}, status_code=500 + ) + + +@router.post("/db/remove_file_upload") +async def remove_file_upload( + request: Request, + userID: str = Query(...), +): + try: + data = await request.json() + file_id = data.get("file_id") + domain_id = data.get("domain_id") + + with Database() as db: + success = db.clear_file_content(file_id=file_id) + if not success: + return JSONResponse( + content={ + "message": "Error deleting files", + }, + status_code=400, + ) + db.conn.commit() + + _, _, success = update_selected_domain(user_id=userID, domain_id=domain_id) + if not success: + return JSONResponse( + content={"message": "error"}, + status_code=200, + ) + + return JSONResponse( + content={ + "message": "success", + }, + status_code=200, + ) + except KeyError: + return JSONResponse( + content={"message": "Please select the domain number first"}, + status_code=200, + ) + except Exception as e: + db.conn.rollback() + logging.error(f"Error during file deletion: {str(e)}") + raise HTTPException( + content={"message": f"Failed deleting, error: {e}"}, status_code=500 + ) + + +@router.post("/io/export_response") +async def export_response(request: Request): + try: + data = await request.json() + text = data.get("contents", []) + + if not text: + raise ValueError("No content selected for export") + + formatted_text = "\n\n------------------\n\n".join(text) + + response = processor.ex.export_pdf(data=formatted_text) + + return StreamingResponse( + io.BytesIO(response.getvalue()), + media_type="application/pdf", + headers={ + "Content-Disposition": "attachment; filename=DoclinkExport.pdf", + "Content-Type": "application/pdf", + "Content-Length": str(len(response.getvalue())), + }, + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=500, detail=f"PDF generation failed Error: {e}") + + +@router.post("/auth/logout") +async def logout(request: Request): + try: + data = await request.json() + user_id = data.get("user_id") + session_id = data.get("session_id") + + response = JSONResponse(content={"message": "Logged out successfully"}) + + # Clear FastAPI session cookie + response.delete_cookie( + key="session_id", + path="/", + domain=None, # This will use the current domain + secure=True, + httponly=True, + samesite="lax", + ) + + # Delete user redis session + redis_key = f"user:{user_id}:session:{session_id}" + session_exists = redis_manager.client.exists(redis_key) + if session_exists: + redis_manager.client.delete(redis_key) + + return response + except Exception as e: + logging.error(f"Error during logout: {str(e)}") + raise HTTPException( + content={"message": f"Failed logout, error: {e}"}, status_code=500 + ) + + +@router.post("/webhooks/lemon-squeezy") +async def handle_webhook(request: Request): + try: + # Get the raw request body + body = await request.body() + payload = await request.json() + + # Get the signature from the header + signature = request.headers.get("X-Signature") + + # Signature verification + webhook_secret = os.getenv("LEMON_SQUEEZY_WEBHOOK_SECRET") + expected_signature = hmac.new( + webhook_secret.encode(), body, hashlib.sha256 + ).hexdigest() + + if not hmac.compare_digest(signature, expected_signature): + raise HTTPException(status_code=401, detail="Invalid signature") + + event_name = payload.get("meta", {}).get("event_name") + if not event_name == "order_created": + return JSONResponse( + status_code=400, content={"message": "Wrong event came!"} + ) + + # Upgrade user to the premium limits + data = payload.get("data", {}).get("attributes", {}) + customer_id = data.get("customer_id") + customer_email = data.get("user_email") + receipt_url = data.get("urls").get("receipt") + + with Database() as db: + db.update_user_subscription( + user_email=customer_email, + lemon_squeezy_customer_id=customer_id, + receipt_url=receipt_url, + ) + db.conn.commit() + return JSONResponse(status_code=200, content={"message": "Webhook received"}) + + except Exception as e: + logger.error(f"Webhook error: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +# local functions +def update_selected_domain(user_id: str, domain_id: str): + try: + redis_manager.set_data(f"user:{user_id}:selected_domain", domain_id) + + with Database() as db: + file_info = db.get_file_info_with_domain(user_id, domain_id) + + if not file_info: + # Clear any existing domain data + redis_manager.delete_data(f"user:{user_id}:domain_content") + redis_manager.delete_data(f"user:{user_id}:index") + redis_manager.delete_data(f"user:{user_id}:index_header") + redis_manager.delete_data(f"user:{user_id}:boost_info") + return [], [], 1 + + content, embeddings = db.get_file_content( + file_ids=[info["file_id"] for info in file_info] + ) + + if not content or not len(embeddings): + # Clear any existing domain data + redis_manager.delete_data(f"user:{user_id}:domain_content") + redis_manager.delete_data(f"user:{user_id}:index") + redis_manager.delete_data(f"user:{user_id}:index_header") + redis_manager.delete_data(f"user:{user_id}:boost_info") + return [], [], 1 + + # Store domain content in Redis + redis_manager.set_data(f"user:{user_id}:domain_content", content) + redis_manager.set_data(f"user:{user_id}:domain_embeddings", embeddings) + + file_names = [info["file_name"] for info in file_info] + file_ids = [info["file_id"] for info in file_info] + + return file_names, file_ids, 1 + + except Exception as e: + logger.error(f"Error in update_selected_domain: {str(e)}") + raise RedisConnectionError(f"Failed to update domain: {str(e)}") + diff --git a/doclink/doclink/app/db/__init__.py b/doclink/doclink/app/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/doclink/app/db/config.py b/doclink/doclink/app/db/config.py new file mode 100644 index 0000000..f7fe2e0 --- /dev/null +++ b/doclink/doclink/app/db/config.py @@ -0,0 +1,18 @@ +from configparser import ConfigParser + + +class GenerateConfig: + def __init__(self) -> None: + pass + + def config(filename="app/db/database.ini", section="postgresql"): + parser = ConfigParser() + parser.read(filename) + db_config = {} + if parser.has_section(section): + params = parser.items(section) + for param in params: + db_config[param[0]] = param[1] + else: + raise Exception(f"Section {section} is not found in {filename} file.") + return db_config diff --git a/doclink/doclink/app/db/database.py b/doclink/doclink/app/db/database.py new file mode 100644 index 0000000..acc0715 --- /dev/null +++ b/doclink/doclink/app/db/database.py @@ -0,0 +1,750 @@ +from psycopg2 import extras +from psycopg2 import DatabaseError +from pathlib import Path +import psycopg2 +import logging +import numpy as np +import uuid +from datetime import datetime + +from .config import GenerateConfig +from ..api.core import Encryptor + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) +encryptor = Encryptor() + + +class Database: + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(Database, cls).__new__(cls) + # Ensure db_config is set even if _instance was already created + if not hasattr(cls._instance, 'db_config'): + cls._instance.db_config = GenerateConfig.config() + return cls._instance + + def __enter__(self): + self.conn = psycopg2.connect(**self.db_config) + self.cursor = self.conn.cursor() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.cursor: + self.cursor.close() + if self.conn: + if exc_type is None: + self.conn.commit() + else: + self.conn.rollback() + self.conn.close() + + def initialize_tables(self): + sql_path = Path(__file__).resolve().parent / "sql" / "table_initialize.sql" + with sql_path.open("r") as file: + query = file.read() + try: + self.cursor.execute(query) + self.conn.commit() + except DatabaseError as e: + self.conn.rollback() + raise e + + def reset_database(self): + sql_path = Path(__file__).resolve().parent / "sql" / "database_reset.sql" + with sql_path.open("r") as file: + query = file.read() + try: + self.cursor.execute(query) + self.conn.commit() + except DatabaseError as e: + self.conn.rollback() + raise e + + def _bytes_to_embeddings(self, byte_array): + return np.frombuffer(byte_array.tobytes(), dtype=np.float16).reshape( + byte_array.shape[0], -1 + ) + + def get_user_info_w_id(self, user_id: str): + query_get_user_info = """ + SELECT DISTINCT user_name, user_surname, user_email, user_type, user_created_at, picture_url + FROM user_info + WHERE user_id = %s + """ + query_get_domain_ids = """ + SELECT DISTINCT domain_id + FROM domain_info + WHERE user_id = %s + """ + query_get_domain_info = """ + SELECT t1.domain_name, t1.domain_id, t2.file_name, t2.file_id + FROM domain_info t1 + LEFT JOIN file_info t2 ON t1.domain_id = t2.domain_id + WHERE t1.domain_id IN %s + """ + query_get_daily_count = """ + SELECT sum(question_count) + FROM session_info s + WHERE s.user_id = %s + AND s.created_at >= CURRENT_TIMESTAMP - INTERVAL '24 hours' AND s.created_at <= CURRENT_TIMESTAMP; + """ + + try: + self.cursor.execute(query_get_user_info, (user_id,)) + user_info_data = self.cursor.fetchone() + + self.cursor.execute(query_get_daily_count, (user_id,)) + user_daily_count = self.cursor.fetchone() + + if not user_info_data: + return None, None + + user_info = { + "user_name": user_info_data[0], + "user_surname": user_info_data[1], + "user_email": user_info_data[2], + "user_type": user_info_data[3], + "user_created_at": str(user_info_data[4]), + "user_daily_count": user_daily_count[0] if user_daily_count[0] else 0, + "user_picture_url": user_info_data[5], + } + + self.cursor.execute(query_get_domain_ids, (user_id,)) + domain_id_data = self.cursor.fetchall() + + if not domain_id_data: + return user_info, None + + domain_ids = [data[0] for data in domain_id_data] + self.cursor.execute(query_get_domain_info, (tuple(domain_ids),)) + domain_info_data = self.cursor.fetchall() + domain_info = {} + for data in domain_info_data: + if data[1] not in domain_info.keys(): + domain_info[data[1]] = { + "domain_name": data[0], + "file_names": [data[2]] if data[2] else [], + "file_ids": [data[3]] if data[3] else [], + } + else: + domain_info[data[1]]["file_names"].append(data[2]) + domain_info[data[1]]["file_ids"].append(data[3]) + + return user_info, domain_info + + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_file_info_with_domain(self, user_id: str, domain_id: str): + query_get_file_info = """ + SELECT DISTINCT file_id, file_name, file_modified_date, file_upload_date + FROM file_info + WHERE user_id = %s AND domain_id = %s + """ + try: + self.cursor.execute( + query_get_file_info, + ( + user_id, + domain_id, + ), + ) + data = self.cursor.fetchall() + return ( + [ + { + "file_id": row[0], + "file_name": row[1], + "file_modified_date": row[2], + "file_upload_date": row[3], + } + for row in data + ] + if data + else None + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_domain_info(self, user_id: str, domain_id: int): + query = """ + SELECT DISTINCT domain_name + FROM domain_info + WHERE user_id = %s AND domain_id = %s + """ + try: + self.cursor.execute( + query, + ( + user_id, + domain_id, + ), + ) + data = self.cursor.fetchone() + return {"domain_name": data[0]} if data else None + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_file_content(self, file_ids: list): + query_get_content = """ + SELECT t1.sentence AS sentence, t1.is_header AS is_header, t1.is_table AS is_table, t1.page_number AS page_number, t1.file_id AS file_id, t2.file_name AS file_name + FROM file_content t1 + LEFT JOIN file_info t2 ON t1.file_id = t2.file_id + WHERE t1.file_id IN %s + """ + query_get_embeddings = """ + SELECT array_agg(embedding) AS embeddings + FROM file_content + WHERE file_id IN %s + """ + try: + self.cursor.execute(query_get_content, (tuple(file_ids),)) + content = self.cursor.fetchall() + self.cursor.execute(query_get_embeddings, (tuple(file_ids),)) + byte_embeddings = self.cursor.fetchone() + if content and byte_embeddings and byte_embeddings[0]: + embeddings = self._bytes_to_embeddings(np.array(byte_embeddings[0])) + return content, embeddings + else: + return None, None + except DatabaseError as e: + self.conn.rollback() + print(f"Database error occurred: {e}") + return None, None + except Exception as e: + print(f"An unexpected error occurred: {e}") + return None, None + + def get_session_info(self, session_id: str): + query_get_session = """ + SELECT user_id, created_at + FROM session_info + WHERE session_id = %s + """ + self.cursor.execute(query_get_session, (session_id,)) + data = self.cursor.fetchone() + return {"user_id": data[0], "created_at": data[1]} if data else None + + def rename_domain(self, domain_id: str, new_name: str): + query = """ + UPDATE domain_info + SET domain_name = %s + WHERE domain_id = %s + """ + try: + self.cursor.execute(query, (new_name, domain_id)) + rows_affected = self.cursor.rowcount + return rows_affected > 0 + except DatabaseError as e: + self.conn.rollback() + raise e + + def insert_user_info(self, user_id: str, google_id: str, user_name: str, user_surname: str, user_email: str, user_type: str, picture_url: str): + query = """ + INSERT INTO user_info (user_id, google_id, user_name, user_surname, user_email, user_type, picture_url) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """ + self.cursor.execute(query, (user_id, google_id, user_name, user_surname, user_email, user_type, picture_url)) + + + def insert_user_guide(self, user_id: str, domain_id: str): + """ + Insert default user guide content into user's default domain + using the file_id already present in default_content + """ + current_date = datetime.now().date() + file_id = str(uuid.uuid4()) + + try: + # Insert file info with the new file_id + query_insert_file_info = """ + INSERT INTO file_info + (user_id, domain_id, file_id, file_name, file_modified_date, file_upload_date) + VALUES + (%s, %s, %s, %s, %s, %s) + """ + + self.cursor.execute( + query_insert_file_info, + ( + user_id, + domain_id, + file_id, + "User Guide.pdf", + current_date, + current_date, + ), + ) + + query_get_guide_content = """ + SELECT sentence, is_header, is_table, page_number, embedding + FROM default_content + """ + self.cursor.execute(query_get_guide_content) + default_content = self.cursor.fetchall() + + for row in default_content: + sentence, is_header, is_table, page_number, embedding = row + encrypted_sentence = encryptor.encrypt(sentence, file_id) + + self.cursor.execute( + "INSERT INTO file_content (file_id, sentence, is_header, is_table, page_number, embedding) VALUES (%s, %s, %s, %s, %s, %s)", + ( + file_id, + encrypted_sentence, + is_header, + is_table, + page_number, + embedding, + ), + ) + + return True + + except DatabaseError as e: + self.conn.rollback() + logger.error(f"Error inserting user guide: {str(e)}") + raise e + except Exception as e: + self.conn.rollback() + logger.error(f"Unexpected error inserting user guide: {str(e)}") + raise e + + def delete_domain(self, domain_id: str): + get_domain_type_query = """ + SELECT domain_type + FROM domain_info + WHERE domain_id = %s + """ + get_files_query = """ + SELECT file_id + FROM file_info + WHERE domain_id = %s + """ + + delete_content_query = """ + DELETE FROM file_content + WHERE file_id IN %s + """ + + delete_files_query = """ + DELETE FROM file_info + WHERE domain_id = %s + """ + + delete_domain_query = """ + DELETE FROM domain_info + WHERE domain_id = %s + """ + + try: + self.cursor.execute(get_domain_type_query, (domain_id,)) + domain_type = self.cursor.fetchone() + if not domain_type[0]: + return -1 + + self.cursor.execute(get_files_query, (domain_id,)) + file_data = self.cursor.fetchall() + file_ids = [data[0] for data in file_data] + + # content -> files -> domain + if file_ids: + self.cursor.execute(delete_content_query, (tuple(file_ids),)) + self.cursor.execute(delete_files_query, (domain_id,)) + self.cursor.execute(delete_domain_query, (domain_id,)) + + rows_affected = self.cursor.rowcount + + return 1 if rows_affected else 0 + + except DatabaseError as e: + # Rollback in case of error + self.cursor.execute("ROLLBACK") + logger.error(f"Error deleting domain {domain_id}: {str(e)}") + raise e + + def insert_user_feedback( + self, + feedback_id: str, + user_id: str, + feedback_type: str, + description: str, + screenshot: str = None, + ): + query = """ + INSERT INTO user_feedback (feedback_id, user_id, feedback_type, description, screenshot) + VALUES (%s, %s, %s, %s, %s) + """ + try: + self.cursor.execute( + query, + ( + feedback_id, + user_id, + feedback_type, + description, + screenshot, + ), + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def insert_domain_info( + self, user_id: str, domain_id: str, domain_name: str, domain_type: int + ): + query_insert_domain_info = """ + INSERT INTO domain_info (user_id, domain_id, domain_name, domain_type) + VALUES (%s, %s, %s, %s) + """ + try: + self.cursor.execute( + query_insert_domain_info, + ( + user_id, + domain_id, + domain_name, + domain_type, + ), + ) + except DatabaseError as e: + self.conn.rollback() + raise e + + def create_domain( + self, user_id: str, domain_name: str, domain_id: str, domain_type: int + ): + query_count_domains = """ + SELECT COUNT(*), user_type + FROM domain_info d + JOIN user_info u ON d.user_id = u.user_id + WHERE u.user_id = %s + GROUP BY user_type + """ + + try: + self.cursor.execute(query_count_domains, (user_id,)) + result = self.cursor.fetchall() + + domain_count, user_type = result[0][0], result[0][1] + + if user_type == "free" and domain_count >= 10: + return { + "success": False, + "message": "Free users can only create up to 10 domains. Upgrade account to create more domains!", + } + + elif user_type == "premium" and domain_count >= 10: + return { + "success": False, + "message": "Premium users can only create up to 20 domains. Upgrade account to create more domains!", + } + + query_insert = """ + INSERT INTO domain_info (user_id, domain_id, domain_name, domain_type) + VALUES (%s, %s, %s, %s) + RETURNING domain_id + """ + + self.cursor.execute( + query_insert, (user_id, domain_id, domain_name, domain_type) + ) + created_domain_id = self.cursor.fetchone()[0] + + return { + "success": True, + "domain_id": created_domain_id, + "message": "success", + } + + except DatabaseError as e: + self.conn.rollback() + raise e + + def get_user_total_file_count(self, user_id: str): + user_type_query = """ + SELECT user_type + FROM user_info + WHERE user_id = %s + """ + + file_count_query = """ + SELECT COUNT(file_id) + FROM file_info + WHERE user_id = %s + """ + + try: + # Get user type first + self.cursor.execute(user_type_query, (user_id,)) + user_type_result = self.cursor.fetchone() + + if not user_type_result: + logger.error(f"User {user_id} not found in database") + return False + + user_type = user_type_result[0] + + # Get file count + self.cursor.execute(file_count_query, (user_id,)) + file_count_result = self.cursor.fetchone() + file_count = file_count_result[0] if file_count_result else 0 + + return file_count, user_type + except Exception as e: + self.conn.rollback() + logger.error(f"Error in user total file processing: {str(e)}") + return False + + def insert_file_batches( + self, file_info_batch: list, file_content_batch: list + ) -> bool: + """Process both file info and content in a single transaction.""" + try: + user_id = file_info_batch[0][0] + file_count, user_type = self.get_user_total_file_count(user_id) + + if user_type == "free" and file_count + len(file_info_batch) > 100: + return { + "success": False, + "message": f"Free users can only have 100 total files. You currently have {file_count} files across all folders. Upgrade to add more!", + } + elif user_type == "premium" and file_count + len(file_info_batch) > 100: + return { + "success": False, + "message": f"Premium users can only have 100 total files. You currently have {file_count} files across all folders", + } + + self._insert_file_info_batch(file_info_batch) + self._insert_file_content_batch(file_content_batch) + + return {"success": True, "message": "Files uploaded successfully"} + except Exception as e: + self.conn.rollback() + logger.error(f"Error in batch processing: {str(e)}") + return False + + def _insert_file_info_batch(self, file_info_batch: list): + """Internal method for file info insertion.""" + query = """ + INSERT INTO file_info (user_id, file_id, domain_id, file_name, file_modified_date) + VALUES %s + """ + try: + extras.execute_values(self.cursor, query, file_info_batch) + logger.info( + f"Successfully inserted {len(file_info_batch)} file info records" + ) + + except Exception as e: + logger.error(f"Error while inserting file info: {str(e)}") + raise + + def _insert_file_content_batch(self, file_content_batch: list): + """Internal method for file content insertion.""" + query = """ + INSERT INTO file_content (file_id, sentence, page_number, is_header, is_table, embedding) + VALUES %s + """ + try: + extras.execute_values(self.cursor, query, file_content_batch) + logger.info( + f"Successfully inserted {len(file_content_batch)} content rows " + ) + + except Exception as e: + logger.error(f"Error while inserting file content: {str(e)}") + raise + + def upsert_session_info(self, user_id: str, session_id: str): + # First check if the session exists + check_session_query = """ + SELECT id FROM session_info + WHERE user_id = %s AND session_id = %s + """ + + # Query to get daily question count and user type + query_get_daily_count = """ + SELECT sum(question_count), u.user_type + FROM session_info s + JOIN user_info u ON s.user_id = u.user_id + WHERE s.user_id = %s + AND s.created_at >= CURRENT_TIMESTAMP - INTERVAL '24 hours' AND s.created_at <= CURRENT_TIMESTAMP + GROUP BY u.user_type; + """ + + # Query to insert new session + insert_session_query = """ + INSERT INTO session_info + (user_id, session_id, question_count, total_enterance, last_enterance) + VALUES (%s, %s, 0, 1, CURRENT_TIMESTAMP) + RETURNING id + """ + + # Query to update existing session + update_question_query = """ + UPDATE session_info + SET question_count = question_count + 1, + last_enterance = CURRENT_TIMESTAMP + WHERE user_id = %s AND session_id = %s + RETURNING question_count + """ + + try: + # Check if session exists + self.cursor.execute(check_session_query, (user_id, session_id)) + session_exists = self.cursor.fetchone() + + # If session doesn't exist, create it + if not session_exists: + self.cursor.execute(insert_session_query, (user_id, session_id)) + self.conn.commit() + + # Get daily count and user type + self.cursor.execute(query_get_daily_count, (user_id,)) + result = self.cursor.fetchall() + daily_count, user_type = result[0][0], result[0][1] + + # Check free user limits + if user_type == "free" and daily_count >= 25: + return { + "success": False, + "message": "Daily question limit reached for free user. Please try again tomorrow or upgrade your plan!", + "question_count": daily_count, + } + + # Increment question count + self.cursor.execute(update_question_query, (user_id, session_id)) + question_count = self.cursor.fetchone()[0] + self.conn.commit() + + return { + "success": True, + "message": "success", + "question_count": question_count, + "daily_count": daily_count, + } + except Exception as e: + self.conn.rollback() + print(f"Error updating session info: {str(e)}") + raise e + + def insert_user_rating( + self, rating_id: str, user_id: str, rating: int, user_note: str + ): + query = """ + INSERT INTO user_rating (rating_id, user_id, rating, user_note) + VALUES (%s, %s, %s, %s) + """ + try: + self.cursor.execute(query, (rating_id, user_id, rating, user_note)) + except Exception as e: + self.conn.rollback() + raise e + + def clear_file_info(self, user_id: str, file_ids: list): + query = """ + DELETE FROM file_info + WHERE user_id = %s AND file_id IN %s + """ + try: + self.cursor.execute( + query, + ( + user_id, + tuple( + file_ids, + ), + ), + ) + return 1 + except DatabaseError as e: + self.conn.rollback() + raise e + + def clear_file_content(self, file_id: list): + clear_content_query = """ + DELETE FROM file_content + WHERE file_id = %s + """ + clear_file_info_query = """ + DELETE FROM file_info + WHERE file_id = %s + """ + try: + self.cursor.execute( + clear_content_query, + (file_id,), + ) + + self.cursor.execute( + clear_file_info_query, + (file_id,), + ) + + rows_affected = self.cursor.rowcount + + return 1 if rows_affected else 0 + + except DatabaseError as e: + self.conn.rollback() + raise e + + def update_user_subscription( + self, + user_email: str, + lemon_squeezy_customer_id: str, + receipt_url: str, + ): + try: + query_get_user = """ + SELECT user_id FROM user_info + WHERE user_email = %s + LIMIT 1 + """ + self.cursor.execute(query_get_user, (user_email,)) + result = self.cursor.fetchone() + + if result: + # Insert user into the premium table + user_id = result[0] + query_insert_premium_user = """ + INSERT INTO premium_user_info (lemon_squeezy_customer_id, user_id, receipt_url) + VALUES (%s, %s, %s) + """ + self.cursor.execute( + query_insert_premium_user, + (lemon_squeezy_customer_id, user_id, receipt_url), + ) + + # Update user info within the user_info table + query_update_user_info = """ + UPDATE user_info + SET user_type = %s + WHERE user_id = %s + RETURNING user_id + """ + self.cursor.execute(query_update_user_info, ("premium", user_id)) + return + else: + # This is for handling webhooks before we've updated the user record + logger.warning( + f"Received webhook for unknown customer: {lemon_squeezy_customer_id}" + ) + return False + except Exception as e: + logger.error(f"Error updating subscription: {str(e)}") + self.conn.rollback() # Added rollback to prevent transaction errors + return False + + +if __name__ == "__main__": + with Database() as db: + db.reset_database() + db.initialize_tables() diff --git a/doclink/doclink/app/db/sql/database_reset.sql b/doclink/doclink/app/db/sql/database_reset.sql new file mode 100644 index 0000000..ec93428 --- /dev/null +++ b/doclink/doclink/app/db/sql/database_reset.sql @@ -0,0 +1,38 @@ +-- drop_all_tables.sql + +-- Disable foreign key checks to avoid dependency issues +-- SET session_replication_role = 'replica'; + +-- Drop all tables in the public schema +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP + EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; + END LOOP; +END $$; + +-- Re-enable foreign key checks +-- SET session_replication_role = 'origin'; + +-- Optionally, you can also drop sequences if you have any +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT sequencename FROM pg_sequences WHERE schemaname = 'public') LOOP + EXECUTE 'DROP SEQUENCE IF EXISTS ' || quote_ident(r.sequencename) || ' CASCADE'; + END LOOP; +END $$; + +-- If you want to reset the primary key sequences for all tables, you can add this: +-- (Note: Only necessary if you've inserted data and want to reset auto-incrementing ids) +DO $$ +DECLARE + r RECORD; +BEGIN + FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP + EXECUTE 'ALTER TABLE ' || quote_ident(r.tablename) || ' ALTER COLUMN id RESTART WITH 1;'; + END LOOP; +END $$; diff --git a/doclink/doclink/app/db/sql/table_initialize.sql b/doclink/doclink/app/db/sql/table_initialize.sql new file mode 100644 index 0000000..2ff6a31 --- /dev/null +++ b/doclink/doclink/app/db/sql/table_initialize.sql @@ -0,0 +1,88 @@ +CREATE TABLE IF NOT EXISTS user_info ( + user_id UUID PRIMARY KEY, + google_id VARCHAR(255) NOT NULL, + user_name VARCHAR(50) NOT NULL, + user_surname VARCHAR(50) NOT NULL, + user_email VARCHAR(100) UNIQUE NOT NULL, + user_type VARCHAR(20) DEFAULT 'free', + picture_url VARCHAR(255), + user_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS premium_user_info ( + lemon_squeezy_customer_id VARCHAR(255) NOT NULL, + user_id UUID PRIMARY KEY, + receipt_url VARCHAR, + payment_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS user_feedback ( + feedback_id UUID PRIMARY KEY, + user_id UUID NOT NULL, + feedback_type VARCHAR(20) NOT NULL, + description TEXT NOT NULL, + screenshot TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS domain_info ( + user_id UUID NOT NULL, + domain_id UUID PRIMARY KEY, + domain_name VARCHAR(30) NOT NULL, + domain_type INTEGER, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS file_info ( + user_id UUID NOT NULL, + domain_id UUID NOT NULL, + file_id UUID PRIMARY KEY, + file_name VARCHAR(255) NOT NULL, + file_modified_date DATE, + file_upload_date DATE DEFAULT CURRENT_DATE, + FOREIGN KEY (user_id) REFERENCES user_info(user_id), + FOREIGN KEY (domain_id) REFERENCES domain_info(domain_id) +); + +CREATE TABLE IF NOT EXISTS file_content ( + content_id SERIAL PRIMARY KEY, + file_id UUID NOT NULL, + sentence TEXT NOT NULL, + is_header BOOLEAN DEFAULT FALSE, + is_table BOOLEAN DEFAULT FALSE, + page_number INTEGER, + embedding BYTEA, + FOREIGN KEY (file_id) REFERENCES file_info(file_id) +); + +CREATE TABLE IF NOT EXISTS session_info ( + id SERIAL PRIMARY KEY, + user_id UUID NOT NULL, + session_id UUID NOT NULL, + question_count INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + total_enterance INTEGER DEFAULT 0, + last_enterance TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); + +CREATE TABLE IF NOT EXISTS default_content ( + content_id SERIAL PRIMARY KEY, + file_id UUID NOT NULL, + sentence TEXT NOT NULL, + is_header BOOLEAN DEFAULT FALSE, + is_table BOOLEAN DEFAULT FALSE, + page_number INTEGER, + embedding BYTEA +); + +CREATE TABLE IF NOT EXISTS user_rating ( + rating_id UUID PRIMARY KEY, + user_id UUID NOT NULL, + rating INTEGER NOT NULL, + user_note TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES user_info(user_id) +); \ No newline at end of file diff --git a/doclink/doclink/app/functions/__init__.py b/doclink/doclink/app/functions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/doclink/app/functions/chatbot_functions.py b/doclink/doclink/app/functions/chatbot_functions.py new file mode 100644 index 0000000..25cd86e --- /dev/null +++ b/doclink/doclink/app/functions/chatbot_functions.py @@ -0,0 +1,83 @@ +from openai import OpenAI +from dotenv import load_dotenv +from langdetect import detect +import textwrap +import yaml +import re +from typing import Dict, Any, Match + + +class ChatbotFunctions: + def __init__(self): + load_dotenv() + self.client = OpenAI() + + with open("app/utils/prompts.yaml", "r", encoding="utf-8") as file: + self.prompt_data = yaml.safe_load(file) + + def _prompt_query_generation(self, query, file_lang): + return textwrap.dedent( + self.get_prompt(category="queries", query=query, file_lang=file_lang) + ) + + def _prompt_answer_generation(self, query, context, lang, intention): + return textwrap.dedent( + self.get_prompt(category=intention, query=query, context=context, lang=lang) + ) + + def response_generation(self, query, context, intention): + lang = self.detect_language(query=query) + prompt = self._prompt_answer_generation( + query=query, context=context, lang=lang, intention=intention + ) + response = self.client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": query}, + ], + temperature=0, + ) + answer = response.choices[0].message.content.strip() + return answer + + def query_generation(self, query, file_lang): + lang = self.detect_language(query=query) + prompt = self._prompt_query_generation(query, file_lang=file_lang) + response = self.client.chat.completions.create( + model="gpt-4o-mini", + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": query}, + ], + temperature=0, + ) + new_queries = response.choices[0].message.content.strip() + return new_queries, lang + + def detect_language(self, query): + if query.isalpha(): + lang = detect(text=query) + return "tr" if lang == "tr" else "en" + return None + + def replace_variables(self, match: Match, kwargs: Dict[str, Any]): + variables = match.group(1) or match.group(2) + value = kwargs.get(variables) + return str(value) + + def get_prompt(self, category, **kwargs): + variable_pattern = r"\${?(\w+)}?|\{(\w+)\}" + try: + prompt = self.prompt_data["prompts"]["languages"]["en"][category.strip()][ + 0 + ]["text"] + + def replace_wrapper(match): + return self.replace_variables(match, kwargs) + + full_prompt = re.sub(variable_pattern, replace_wrapper, prompt) + return full_prompt + except KeyError: + print(f"No template found for {category}") + return None diff --git a/doclink/doclink/app/functions/embedding_functions.py b/doclink/doclink/app/functions/embedding_functions.py new file mode 100644 index 0000000..46d428f --- /dev/null +++ b/doclink/doclink/app/functions/embedding_functions.py @@ -0,0 +1,36 @@ +import numpy as np +from openai import OpenAI +from dotenv import load_dotenv +from typing import List + + +class EmbeddingFunctions: + def __init__(self): + load_dotenv() + self.client = OpenAI() + + def create_embeddings_from_sentences( + self, sentences: List[str], chunk_size: int = 2000 + ) -> List[np.ndarray]: + file_embeddings = [] + for chunk_index in range(0, len(sentences), chunk_size): + chunk_embeddings = self.client.embeddings.create( + model="text-embedding-3-small", + input=sentences[chunk_index : chunk_index + chunk_size], + ) + chunk_array = np.array( + [x.embedding for x in chunk_embeddings.data], dtype=np.float16 + ) + file_embeddings.append( + chunk_array / np.linalg.norm(chunk_array, axis=1)[:, np.newaxis] + ) + + return np.vstack(file_embeddings) + + def create_embedding_from_sentence(self, sentence: list) -> np.ndarray: + query_embedding = self.client.embeddings.create( + model="text-embedding-3-small", input=sentence + ) + return np.array(query_embedding.data[0].embedding, dtype=np.float16).reshape( + 1, -1 + ) diff --git a/doclink/doclink/app/functions/export_functions.py b/doclink/doclink/app/functions/export_functions.py new file mode 100644 index 0000000..f484562 --- /dev/null +++ b/doclink/doclink/app/functions/export_functions.py @@ -0,0 +1,126 @@ +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +from io import BytesIO +import re + + +class Exporter: + def __init__(self): + self.styles = getSampleStyleSheet() + self.setup_styles() + + def _register_fonts(self): + pdfmetrics.registerFont(TTFont("Helvetica", "Helvetica")) + pdfmetrics.registerFont(TTFont("Helvetica-Bold", "Helvetica-Bold")) + + def setup_styles(self): + self.styles.add( + ParagraphStyle( + name="Header", + fontSize=14, + textColor=colors.HexColor("#10B981"), + spaceAfter=12, + fontName="Helvetica-Bold", + encoding="utf-8", + ) + ) + + self.styles.add( + ParagraphStyle( + name="Content", + fontSize=11, + textColor=colors.black, + spaceAfter=8, + fontName="Helvetica", + encoding="utf-8", + ) + ) + + self.styles.add( + ParagraphStyle( + name="Bullet-Point", + fontSize=11, + leftIndent=20, + bulletIndent=10, + spaceAfter=5, + fontName="Helvetica", + encoding="utf-8", + ) + ) + + def clean_text(self, text: str) -> str: + if not isinstance(text, str): + text = text.decode("utf-8") + + text = text.replace("ฤฑ", "i").replace("ฤฐ", "I") + text = text.replace("ฤŸ", "g").replace("ฤž", "G") + text = text.replace("รผ", "u").replace("รœ", "U") + text = text.replace("ลŸ", "s").replace("ลž", "S") + text = text.replace("รถ", "o").replace("ร–", "O") + text = text.replace("รง", "c").replace("ร‡", "C") + + text = re.sub( + r"\[header\](.*?)\[/header\]", r'\1', text + ) + text = re.sub(r"\[bold\](.*?)\[/bold\]", r"\1", text) + return text + + def create_watermark(self, canvas, doc): + canvas.saveState() + canvas.setFillColor(colors.HexColor("#10B981")) + canvas.setFont("Helvetica", 8) + canvas.drawString(30, 20, "Generated by docklink.io") + canvas.restoreState() + + def export_pdf(self, data: str) -> BytesIO: + buffer = BytesIO() + content = [] + cleaned_text = self.clean_text(data) + + doc = SimpleDocTemplate( + buffer, + pagesize=A4, + rightMargin=30, + leftMargin=30, + topMargin=30, + bottomMargin=30, + ) + + lines = cleaned_text.split("\n") + + for line in lines: + if line.strip(): + if ( + line.startswith("

") + or line.startswith('') + or "header" in line + ): + # Header section + text = line.replace("

", "").replace("

", "") + content.append(Paragraph(text, self.styles["Header"])) + elif line.startswith("-"): + # Bullet point + text = line.strip() + content.append(Paragraph(f"- {text}", self.styles["Bullet-Point"])) + else: + # Normal text + content.append(Paragraph(line, self.styles["Content"])) + + content.append(Spacer(1, 2)) + + try: + doc.build( + content, + onFirstPage=self.create_watermark, + onLaterPages=self.create_watermark, + ) + buffer.seek(0) + return buffer + except Exception as e: + raise ValueError( + f"Error: {e} Content too large or complex to export to PDF" + ) diff --git a/doclink/doclink/app/functions/indexing_functions.py b/doclink/doclink/app/functions/indexing_functions.py new file mode 100644 index 0000000..5e2fc0c --- /dev/null +++ b/doclink/doclink/app/functions/indexing_functions.py @@ -0,0 +1,12 @@ +import faiss + + +class IndexingFunctions: + def __init__(self): + pass + + def create_flat_index(self, embeddings): + dimension = len(embeddings[0]) + index = faiss.IndexFlatIP(dimension) + index.add(embeddings) + return index diff --git a/doclink/doclink/app/functions/reading_functions.py b/doclink/doclink/app/functions/reading_functions.py new file mode 100644 index 0000000..1f8a463 --- /dev/null +++ b/doclink/doclink/app/functions/reading_functions.py @@ -0,0 +1,536 @@ +import fitz +import tempfile +import io +import re +import spacy +import pymupdf4llm +import xml.etree.ElementTree as ET +import zipfile +from pathlib import Path +from langchain_text_splitters import MarkdownHeaderTextSplitter +from docling.datamodel.base_models import InputFormat +from docling.pipeline.simple_pipeline import SimplePipeline +from docling.document_converter import ( + DocumentConverter, + WordFormatOption, + PowerpointFormatOption, + HTMLFormatOption, +) + + +class ReadingFunctions: + def __init__(self): + self.nlp = spacy.load( + "en_core_web_sm", + disable=[ + "tagger", + "attribute_ruler", + "lemmatizer", + "ner", + "textcat", + "custom", + ], + ) + self.max_file_size_mb = 50 + self.headers_to_split_on = [ + ("#", "Header 1"), + ("##", "Header 2"), + ("###", "Header 3"), + ("####", "Header 4"), + ] + self.markdown_splitter = MarkdownHeaderTextSplitter( + self.headers_to_split_on, strip_headers=False, return_each_line=True + ) + self.converter = DocumentConverter( + allowed_formats=[ + InputFormat.DOCX, + InputFormat.PPTX, + InputFormat.XLSX, + InputFormat.PDF, + InputFormat.HTML, + ], + format_options={ + InputFormat.DOCX: WordFormatOption(pipeline_cls=SimplePipeline), + InputFormat.PPTX: PowerpointFormatOption(pipeline_cls=SimplePipeline), + InputFormat.HTML: HTMLFormatOption(pipeline_cls=SimplePipeline), + }, + ) + + def read_file(self, file_bytes: bytes, file_name: str): + """Read and process file content from bytes""" + file_size_mb = self._get_file_size(file_bytes=file_bytes) + file_type = file_name.split(".")[-1].lower() + + if file_size_mb > self.max_file_size_mb: + raise ValueError(f"File size exceeds {self.max_file_size_mb}MB limit") + + try: + if file_type == "pdf": + return self._process_pdf(file_bytes=file_bytes) + elif file_type == "docx": + return self._process_docx(file_bytes=file_bytes) + elif file_type == "pptx": + return self._process_pptx(file_bytes=file_bytes) + elif file_type == "xlsx": + return self._process_xlsx(file_bytes=file_bytes) + elif file_type == "udf": + return self._process_udf(file_bytes=file_bytes) + elif file_type in ["txt", "rtf"]: + return self._process_txt(file_bytes=file_bytes) + else: + raise ValueError(f"Unsupported file type: {file_type}") + + except Exception as e: + raise ValueError(f"Error processing {file_name}: {str(e)}") + + def read_url(self, html_content: tuple): + html_data = { + "sentences": [], + "page_number": [], + "is_header": [], + "is_table": [], + } + + try: + with tempfile.NamedTemporaryFile(delete=True, suffix=".html") as temp_file: + temp_file.write(html_content.encode("utf-8")) + temp_file.flush() + html_path = Path(temp_file.name) + md_text = self.converter.convert( + html_path + ).document.export_to_markdown() + splits = self.markdown_splitter.split_text(md_text) + + for split in splits: + if ( + not len(split.page_content) > 5 + or re.match(r"^[^\w]*$", split.page_content) + or split.page_content[:4] == " +

+ + + + +
+
+
+ + + + + + + `; + + this.element.innerHTML += ` + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + // Search functionality + const searchInput = this.element.querySelector('#domainSearchInput'); + searchInput?.addEventListener('input', (e) => { + this.events.emit('domainSearch', e.target.value); + }); + + // New domain button + const newDomainBtn = this.element.querySelector('#newDomainBtn'); + newDomainBtn?.addEventListener('click', () => { + this.handleNewDomain(); + }); + + // Domain deletion + this.domainManager.events.on('domainFileCountUpdated', ({ domainId, newCount }) => { + const domainCard = this.element.querySelector(`[data-domain-id="${domainId}"]`); + if (domainCard) { + const fileCountElement = domainCard.querySelector('.file-count'); + if (fileCountElement) { + fileCountElement.textContent = `${newCount} files`; + } + } + }); + + // Select button + const selectButton = this.element.querySelector('.select-button'); + selectButton?.addEventListener('click', () => { + if (this.temporarySelectedId) { + this.events.emit('domainSelected', this.temporarySelectedId); + this.hide(); + } + }); + + // Close button + const closeButton = this.element.querySelector('.close-button'); + closeButton?.addEventListener('click', () => { + this.resetTemporarySelection(); + this.hide(); + }); + + // Handle modal hidden event + this.element.addEventListener('hidden.bs.modal', () => { + this.resetTemporarySelection(); + }); + } + + createDomainCard(domain) { + return ` +
+
+
+ + +
+
+
${domain.name}
+ ${domain.fileCount} files +
+
+
+ + +
+
+ `; + } + + setupDomainCardListeners() { + this.element.querySelectorAll('.domain-card').forEach(card => { + if (card.classList.contains('new-domain-input-card')) return; + + const domainId = card.dataset.domainId; + const checkbox = card.querySelector('.domain-checkbox'); + + // Handle entire card click for selection + card.addEventListener('click', (e) => { + if (!e.target.closest('.domain-actions') && !e.target.closest('.checkbox-wrapper')) { + checkbox.checked = !checkbox.checked; + this.handleDomainSelection(checkbox, domainId); + } + }); + + // Handle checkbox click + checkbox?.addEventListener('change', (e) => { + e.stopPropagation(); + this.handleDomainSelection(checkbox, domainId); + }); + + // Delete button + card.querySelector('.delete-button')?.addEventListener('click', (e) => { + e.stopPropagation(); + this.domainToDelete = domainId; + this.showDomainDeleteModal(); + }); + + // Edit button + card.querySelector('.edit-button')?.addEventListener('click', (e) => { + e.stopPropagation(); + this.enableDomainEditing(card); + }); + }); + } + + handleDomainSelection(checkbox, domainId) { + // Uncheck all other checkboxes + this.element.querySelectorAll('.domain-checkbox').forEach(cb => { + if (cb !== checkbox) { + cb.checked = false; + } + }); + + // Update temporary selection + this.temporarySelectedId = checkbox.checked ? domainId : null; + } + + resetTemporarySelection() { + this.temporarySelectedId = null; + this.element.querySelectorAll('.domain-checkbox').forEach(cb => { + cb.checked = false; + }); + } + + handleNewDomain() { + const template = document.getElementById('newDomainInputTemplate'); + const domainsContainer = this.element.querySelector('#domainsContainer'); + + if (template && domainsContainer) { + const clone = template.content.cloneNode(true); + domainsContainer.appendChild(clone); + + const inputCard = domainsContainer.querySelector('.new-domain-input-card'); + const input = inputCard.querySelector('.new-domain-input'); + + this.setupNewDomainHandlers(inputCard, input); + input.focus(); + } + } + + setupNewDomainHandlers(inputCard, input) { + const confirmBtn = inputCard.querySelector('.confirm-button'); + const cancelBtn = inputCard.querySelector('.cancel-button'); + + const handleConfirm = async () => { + const name = input.value.trim(); + if (name) { + if (name.length > 20) { + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
I can't do it...
+

Folder name must be 20 characters or less. Please try again with a shorter name!

+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + return; + } + + const result = await window.createDomain(window.serverData.userId, name); + if (result.success) { + this.events.emit('domainCreate', { + id: result.id, + name: name + }); + this.updateDomainCount(); + inputCard.remove(); + } else { + if (result.message && result.message.includes('up to 3 domains')) { + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
Folder Limit Reached
+

${result.message}

+
+ Domains Used: ${this.domainManager.getAllDomains().length}/3 +
+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 100); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + } else { + this.events.emit('warning', 'Failed to create folder. Please try again.'); + } + inputCard.remove(); + } + } + }; + + confirmBtn.addEventListener('click', handleConfirm); + cancelBtn.addEventListener('click', () => inputCard.remove()); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') handleConfirm(); + }); + + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') inputCard.remove(); + }); + } + + async enableDomainEditing(card) { + const domainInfo = card.querySelector('.domain-info'); + const domainNameElement = domainInfo.querySelector('h6'); + const currentName = domainNameElement.getAttribute('title') || domainNameElement.textContent; + const domainId = card.dataset.domainId; + + const wrapper = document.createElement('div'); + wrapper.className = 'domain-name-input-wrapper'; + wrapper.innerHTML = ` + +
+ + +
+ `; + + const input = wrapper.querySelector('.domain-name-input'); + const confirmBtn = wrapper.querySelector('.edit-confirm-button'); + const cancelBtn = wrapper.querySelector('.edit-cancel-button'); + + const handleConfirm = async () => { + const newName = input.value.trim(); + if (newName && newName !== currentName) { + if (newName.length > 20) { + this.events.emit('warning', 'Folder name must be less than 20 characters'); + return; + } + + const success = await window.renameDomain(domainId, newName); + + if (success) { + this.events.emit('domainEdit', { + id: domainId, + newName: newName + }); + wrapper.replaceWith(domainNameElement); + domainNameElement.textContent = newName; + domainNameElement.setAttribute('title', newName); + } else { + this.events.emit('warning', 'Failed to rename domain'); + } + } else { + wrapper.replaceWith(domainNameElement); + } + }; + + confirmBtn.addEventListener('click', handleConfirm); + cancelBtn.addEventListener('click', () => wrapper.replaceWith(domainNameElement)); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') handleConfirm(); + }); + + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') wrapper.replaceWith(domainNameElement); + }); + + domainNameElement.replaceWith(wrapper); + input.focus(); + input.select(); + } + + updateDomainsList(domains) { + const container = this.element.querySelector('#domainsContainer'); + if (container) { + container.innerHTML = domains.map(domain => this.createDomainCard(domain)).join(''); + this.setupDomainCardListeners(); + } + } + + updateDomainCount() { + const domains = this.domainManager.getAllDomains(); + const count = domains.length; + const percentage = (count / 3) * 100; + + const countElement = this.element.querySelector('.domains-count'); + const progressBar = this.element.querySelector('.progress-bar'); + + if (countElement && progressBar) { + countElement.textContent = `${count}/3`; + progressBar.style.width = `${percentage}%`; + + } + } + + show() { + const modal = new bootstrap.Modal(this.element); + this.resetTemporarySelection(); + this.updateDomainCount(); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + } + } + + initializeDeleteModal() { + const deleteModalElement = document.getElementById('deleteConfirmModal'); + if (deleteModalElement) { + this.deleteModal = new bootstrap.Modal(deleteModalElement, { + backdrop: 'static', + keyboard: false + }); + + deleteModalElement.addEventListener('show.bs.modal', () => { + document.getElementById('domainSelectModal').classList.add('delete-confirmation-open'); + }); + + deleteModalElement.addEventListener('hidden.bs.modal', () => { + document.getElementById('domainSelectModal').classList.remove('delete-confirmation-open'); + this.domainToDelete = null; // Clean up on hide + }); + + const confirmBtn = deleteModalElement.querySelector('#confirmDeleteBtn'); + confirmBtn?.addEventListener('click', async () => { + if (this.domainToDelete) { + await this.handleDomainDelete(this.domainToDelete); + this.domainToDelete = null; + this.deleteModal.hide(); + } + }); + + const cancelBtn = deleteModalElement.querySelector('.btn-outline-secondary'); + cancelBtn?.addEventListener('click', () => { + this.domainToDelete = null; + this.deleteModal.hide(); + }); + } + } + + showDomainDeleteModal() { + if (this.deleteModal) { + this.deleteModal.show(); + } + } + + hideDomainDeleteModal() { + if (this.deleteModal) { + this.deleteModal.hide(); + } + } + + async handleDomainDelete(domainId) { + const result = await window.deleteDomain(domainId); + + if (result.success) { + this.events.emit('domainDelete', domainId); + this.hideDomainDeleteModal(); + this.updateDomainCount(); + this.events.emit('message', { + text: 'Knowledege Base deleted!', + type: 'success' + }); + } else { + this.hideDomainDeleteModal(); + + const messageElement = document.getElementById('domainInfoMessage'); + if (messageElement) { + messageElement.textContent = result.message; + } + const infoModal = new bootstrap.Modal(document.getElementById('defaultDomainInfoModal')); + infoModal.show(); + } + } +} + +class FileUploadModal extends Component { + constructor(DomainManager) { + const element = document.createElement('div'); + element.id = 'fileUploadModal'; + element.className = 'modal fade'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.isUploading = false; + this.fileBasket = new FileBasket(); + this.urlInputModal = new URLInputModal() + this.domainManager = DomainManager; + + this.render(); + this.setupEventListeners(); + this.setupCloseButton(); + this.currentpicker = null; + } + + render() { + this.element.innerHTML = ` + + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + const dropZone = this.element.querySelector('#dropZone'); + const fileInput = this.element.querySelector('#fileInput'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const chooseText = this.element.querySelector('.choose-text'); + const uploadIcon = this.element.querySelector('.upload-icon-wrapper'); + const urlButton = this.element.querySelector('.url-input-btn'); + + // Drag and drop handlers + ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { + dropZone.addEventListener(eventName, (e) => { + e.preventDefault(); + e.stopPropagation(); + }); + }); + + ['dragenter', 'dragover'].forEach(eventName => { + dropZone.addEventListener(eventName, () => { + if (!this.isUploading) { + dropZone.classList.add('dragover'); + } + }); + }); + + ['dragleave', 'drop'].forEach(eventName => { + dropZone.addEventListener(eventName, () => { + dropZone.classList.remove('dragover'); + }); + }); + + // File drop handler + dropZone.addEventListener('drop', (e) => { + if (!this.isUploading) { + const files = e.dataTransfer.files; + this.handleFiles(files); + } + }); + + // Icon click handler + uploadIcon.addEventListener('click', () => { + if (!this.isUploading) { + fileInput.click(); + } + }); + + // File input handler + chooseText.addEventListener('click', () => { + if (!this.isUploading) { + fileInput.click(); + } + }); + + fileInput.addEventListener('change', () => { + this.handleFiles(fileInput.files); + }); + + // Upload button handler + uploadBtn.addEventListener('click', () => { + this.startUpload(); + }); + + urlButton.addEventListener('click', () => { + if (!this.isUploading) { + this.urlInputModal.show(); + } + }); + + this.urlInputModal.events.on('urlProcessed', (result) => { + if (result.files) { + this.handleFiles(result.files); + } + this.events.emit('message', result); + }); + + this.element.addEventListener('hidden.bs.modal', () => { + this.events.emit('modalClose'); + }); + } + + handleFiles(newFiles) { + if (this.isUploading) return; + + const fileList = this.element.querySelector('#fileList'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const uploadArea = this.element.querySelector('#dropZone'); + + let addFilesResult; + if (newFiles[0]?.mimeType) { + addFilesResult = this.fileBasket.addDriveFiles(newFiles); + } else { + addFilesResult = this.fileBasket.addFiles(newFiles); + } + + if (addFilesResult.duplicates > 0) { + this.events.emit('warning', `${addFilesResult.duplicates} files were skipped as they were already added`); + } + + // Update UI + fileList.innerHTML = ''; + this.fileBasket.getFileNames().forEach(fileName => { + const fileItem = this.createFileItem(fileName); + fileList.appendChild(fileItem); + }); + + this.updateUploadUI(fileList, uploadBtn, uploadArea); + this.updateSourceCount(); + } + + createFileItem(fileName) { + const fileItem = document.createElement('div'); + fileItem.className = 'file-item pending-upload'; + fileItem.dataset.fileName = fileName; + const driveFile = this.fileBasket.drivefiles.get(fileName); + + const icon = this.getFileIcon(fileName,driveFile?.mimeType); + fileItem.innerHTML = ` +
+ +
+
+
${fileName}
+
+
+
+
+
+ +
+ `; + + const removeButton = fileItem.querySelector('.file-remove'); + removeButton.addEventListener('click', () => { + if (!this.isUploading) { + this.fileBasket.removeFile(fileName); + fileItem.remove(); + this.updateUploadUI( + this.element.querySelector('#fileList'), + this.element.querySelector('#uploadBtn'), + this.element.querySelector('#dropZone') + ); + } + }); + + return fileItem; + } + + setupCloseButton() { + const closeButton = this.element.querySelector('.close-button'); + closeButton.addEventListener('click', () => { + console.log('Close button clicked'); + this.hide(); + }); + } + + setLoadingState(isLoading) { + const loadingOverlay = this.element.querySelector('.upload-loading-overlay'); + const closeButton = this.element.querySelector('.close-button'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const modal = bootstrap.Modal.getInstance(this.element); + + if (isLoading) { + loadingOverlay.style.display = 'flex'; + closeButton.style.display = 'none'; + uploadBtn.disabled = true; + modal._config.backdrop = 'static'; + modal._config.keyboard = false; + } else { + loadingOverlay.style.display = 'none'; + closeButton.style.display = 'block'; + uploadBtn.disabled = false; + modal._config.backdrop = true; + modal._config.keyboard = true; + } + } + + async startUpload() { + if (!this.fileBasket.hasFilesToUpload() || this.isUploading) return; + + this.isUploading = true; + const uploadBtn = this.element.querySelector('#uploadBtn'); + uploadBtn.disabled = true; + this.setLoadingState(true); + let successCount = 0; + + try { + while (this.fileBasket.hasFilesToUpload()) { + const batch = this.fileBasket.getBatch(); + const uploadPromises = batch.map(async (fileName) => { + try { + const result = await this.uploadFile(fileName); + if (result.success) successCount++; + } catch (error) { + console.error(`Failed to upload ${fileName}:`, error); + } + }); + await Promise.all(uploadPromises); + } + + if (successCount > 0) { + const uploadResult = await window.uploadFiles(window.serverData.userId); + + if (uploadResult.success) { + this.events.emit('filesUploaded', uploadResult.data); + this.resetUploadUI(); + this.updateSourceCount(); + this.events.emit('message', { + text: `Successfully uploaded ${successCount} files`, + type: 'success' + }); + setTimeout(() => { + this.hide(); + this.events.emit('modalClose'); + }, 500); + } else if (uploadResult.error && uploadResult.error.includes('Upgrade')) { + console.log('first') + console.log(uploadResult.error) + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
File Limit Reached
+

${uploadResult.error}

+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + } else { + console.log('second') + console.log(uploadResult.error) + throw new Error(uploadResult.error); + } + } + + } catch (error) { + console.error('Upload error:', error); + this.events.emit('error', error.message); + } finally { + this.isUploading = false; + this.fileBasket.clear(); + uploadBtn.disabled = false; + this.setLoadingState(false); + } + } + + resetUploadUI() { + const fileList = this.element.querySelector('#fileList'); + const uploadBtn = this.element.querySelector('#uploadBtn'); + const uploadArea = this.element.querySelector('#dropZone'); + + // Clear file list + fileList.innerHTML = ''; + + // Reset upload area + uploadArea.style.display = 'flex'; + uploadBtn.disabled = true; + + // Remove "Add More Files" button + this.removeAddMoreFilesButton(); + + // Clear FileBasket + this.fileBasket.clear(); + } + + async uploadFile(fileName) { + const fileItem = this.element.querySelector(`[data-file-name="${fileName}"]`); + const progressBar = fileItem.querySelector('.progress-bar'); + + try { + const formData = this.fileBasket.getFileFormData(fileName); + if (!formData) throw new Error('File not found'); + + fileItem.classList.remove('pending-upload'); + fileItem.classList.add('uploading'); + + let success; + if (formData.has('driveFileId')) { + success = await window.storedriveFile(window.serverData.userId, formData); + } else { + success = await window.storeFile(window.serverData.userId, formData); + } + + if (success) { + progressBar.style.width = '100%'; + fileItem.classList.remove('uploading'); + fileItem.classList.add('uploaded'); + return { success: true }; + } else { + throw new Error(result.error); + } + + } catch (error) { + fileItem.classList.remove('uploading'); + fileItem.classList.add('upload-error'); + return { success: false, error: error.message }; + } + } + + loadDrivePicker() { + if (typeof google === 'undefined') { + const script = document.createElement('script'); + script.src = 'https://apis.google.com/js/api.js'; + script.onload = () => { + window.gapi.load('picker', () => { + this.createPicker(); + }); + }; + document.body.appendChild(script); + } else { + this.createPicker(); + } + } + + createPicker() { + + if (this.currentPicker) { + this.currentPicker.dispose(); + this.currentPicker = null; + } + + const accessToken = document.cookie + .split('; ') + .find(row => row.startsWith('drive_access_token=')) + ?.split('=')[1]; + + if (!accessToken) { + const alertModal = document.createElement('div'); + alertModal.className = 'alert-modal'; + alertModal.innerHTML = ` +
+
+ +
+
Drive Access Required
+

To access your Google Drive files: +
1. Sign out +
2. Sign in with Google +
3. Allow Drive access when prompted +

+ +
+ `; + + document.body.appendChild(alertModal); + + requestAnimationFrame(() => { + alertModal.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + + const closeButton = alertModal.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertModal.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertModal.remove(), 300); + }); + + return; + } + + const GOOGLE_API_KEY = document.cookie + .split('; ') + .find(row => row.startsWith('google_api_key=')) + ?.split('=')[1]; + + + const picker = new google.picker.PickerBuilder() + .addView(google.picker.ViewId.DOCS) + .setOAuthToken(accessToken) + .setDeveloperKey(GOOGLE_API_KEY) + .enableFeature(google.picker.Feature.SUPPORT_DRIVES) + .enableFeature(google.picker.Feature.MULTISELECT_ENABLED) + .setCallback((data) => { + if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED) { + const docs = data[google.picker.Response.DOCUMENTS]; + this.handleDriveSelection(docs); // Pass token to handler + } + }) + .build(); + picker.setVisible(true); + this.currentPicker = picker; + + setTimeout(() => { + const pickerFrame = document.querySelector('.picker-dialog-bg'); + const pickerDialog = document.querySelector('.picker-dialog'); + + if (pickerFrame && pickerDialog) { + document.querySelectorAll('.picker-dialog-bg, .picker-dialog').forEach(el => { + if (el !== pickerFrame && el !== pickerDialog) { + el.remove(); + } + }); + + pickerFrame.style.zIndex = '10000'; + pickerDialog.style.zIndex = '10001'; + } + }, 0); + + } + + handleDriveSelection(files) { + const supportedTypes = [ + 'application/pdf', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'text/plain', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.google-apps.document', + 'application/vnd.google-apps.document', + 'application/vnd.google-apps.spreadsheet', + 'application/vnd.google-apps.presentation', + 'application/vnd.google-apps.script', + ]; + + const filteredFiles = files.filter(file => { + return supportedTypes.includes(file.mimeType); + }); + + + if (filteredFiles.length === 0) { + this.events.emit('warning', 'No supported files selected. Please select PDF, DOCX, or TXT files.'); + return; + } + + if (filteredFiles.length < files.length) { + this.events.emit('warning', `${files.length - filteredFiles.length} files were skipped due to unsupported file types`); + } + + const fileList = this.element.querySelector('#fileList'); + this.fileBasket.files.clear(); + this.fileBasket.drivefiles.clear(); + this.fileBasket.uploadQueue = []; + + fileList.innerHTML = ''; + filteredFiles.forEach(file => { + const fileItem = this.createFileItem(file.name); + fileList.appendChild(fileItem); + }); + + this.updateUploadUI( + fileList, + this.element.querySelector('#uploadBtn'), + this.element.querySelector('#dropZone') + ); + + this.handleFiles(filteredFiles); + } + + getFileIcon(fileName, mimeType) { + const extension = fileName.split('.').pop().toLowerCase(); + + if (mimeType) { + switch (mimeType) { + case 'application/vnd.google-apps.document': + return 'bi-file-word'; + case 'application/vnd.google-apps.spreadsheet': + return 'bi-file-excel'; + case 'application/vnd.google-apps.presentation': + return 'bi-file-ppt'; + case 'application/vnd.google-apps.script': + return 'bi-file-text'; + } + } + + const iconMap = { + pdf: 'bi-file-pdf', + docx: 'bi-file-word', + doc: 'bi-file-word', + txt: 'bi-file-text', + pptx: 'bi-file-ppt', + xlsx: 'bi-file-excel', + udf: 'bi-file-post', + html: 'bi-file-code', + }; + return iconMap[extension] || 'bi-file'; + } + + updateUploadUI(fileList, uploadBtn, uploadArea) { + if (this.fileBasket.getFileNames().length > 0 || this.fileBasket.drivefiles.size > 0) { + uploadArea.style.display = 'none'; + uploadBtn.disabled = false; + this.ensureAddMoreFilesButton(fileList); + } else { + uploadArea.style.display = 'flex'; + uploadBtn.disabled = true; + this.removeAddMoreFilesButton(); + } + } + + ensureAddMoreFilesButton(fileList) { + let addFileBtn = this.element.querySelector('.add-file-btn'); + if (!addFileBtn) { + addFileBtn = document.createElement('button'); + addFileBtn.className = 'add-file-btn'; + addFileBtn.innerHTML = ` + + Add More Files + `; + addFileBtn.addEventListener('click', () => { + if (!this.isUploading) { + this.element.querySelector('#fileInput').click(); + } + }); + fileList.after(addFileBtn); + } + addFileBtn.disabled = this.isUploading; + addFileBtn.style.opacity = this.isUploading ? '0.5' : '1'; + } + + removeAddMoreFilesButton() { + const addFileBtn = this.element.querySelector('.add-file-btn'); + if (addFileBtn) { + addFileBtn.remove(); + } + } + + updateSourceCount() { + const domains = this.domainManager.getAllDomains(); + let totalSources = 0; + + domains.forEach(domain => { + if (domain.fileCount) { + totalSources += domain.fileCount; + } + }); + + const percentage = (totalSources / 20) * 100; + + const countElement = this.element.querySelector('.sources-count'); + const progressBar = this.element.querySelector('.progress-bar'); + + if (countElement && progressBar) { + countElement.textContent = `${totalSources}/20`; + progressBar.style.width = `${percentage}%`; + + } + } + + show(domainName = '') { + const domainNameElement = this.element.querySelector('.domain-name'); + if (domainNameElement) { + domainNameElement.textContent = domainName; + } + this.updateSourceCount(); + const modal = new bootstrap.Modal(this.element); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + this.events.emit('modalClose'); + this.fileBasket.clear(); + this.resetUploadUI(); + } + } +} + + +class ChatManager extends Component { + constructor() { + const element = document.querySelector('.chat-content'); + super(element); + + this.messageContainer = this.element.querySelector('.chat-messages'); + this.setupMessageInput(); + this.setupExportButton(); + } + + setupMessageInput() { + const container = document.querySelector('.message-input-container'); + container.innerHTML = ` + + + `; + + const input = container.querySelector('.message-input'); + + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + this.handleSendMessage(input); + } + }); + + } + + async handleSendMessage(input) { + const message = input.value.trim(); + if (!message) return; + + // Add user message + this.addMessage(message, 'user'); + input.value = ''; + + // Add loading message + const loadingMessage = this.addLoadingMessage(); + + // Disable chat + this.disableChat(); + + try { + const selectedFileIds = window.app.sidebar.getSelectedFileIds(); + + const response = await window.sendMessage( + message, + window.serverData.userId, + window.serverData.sessionId, + selectedFileIds + ); + + // Remove loading message + loadingMessage.remove(); + + if (response.status === 400) { + if (response.message.includes('Daily question limit')) { + // Show limit reached modal + const alertElement = document.createElement('div'); + alertElement.className = 'alert-modal'; + alertElement.innerHTML = ` +
+
+ +
+
Daily Limit Reached
+

${response.message}

+
+ Questions Used Today: 25/25 +
+ +
+ `; + + document.body.appendChild(alertElement); + + const closeButton = alertElement.querySelector('.alert-button'); + closeButton.addEventListener('click', () => { + alertElement.classList.remove('show'); + document.body.style.overflow = ''; + setTimeout(() => alertElement.remove(), 300); + }); + + requestAnimationFrame(() => { + alertElement.classList.add('show'); + document.body.style.overflow = 'hidden'; + }); + } else { + this.addMessage(response.message, 'ai'); + } + return; + } + + if (response.answer && response.question_count == 10) { + this.addMessage(response.answer, 'ai'); + this.updateResources(response.resources, response.resource_sentences); + this.events.emit('ratingModalOpen'); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + else if (response.answer) { + this.addMessage(response.answer, 'ai'); + this.updateResources(response.resources, response.resource_sentences); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + else { + this.addMessage(response.message, 'ai'); + window.app.profileLimitsModal.updateDailyCount(response.daily_count); + } + + } catch (error) { + loadingMessage.remove(); + this.addMessage('Error generating message!', 'ai'); + console.error('Error:', error); + } finally { + this.enableChat(); + } + } + + addMessage(content, type) { + const message = document.createElement('div'); + message.className = `chat-message ${type}`; + + const bubble = document.createElement('div'); + bubble.className = `message-bubble ${type}-bubble`; + + const text = document.createElement('div'); + text.className = 'message-text'; + + if (type === 'ai') { + text.innerHTML = this.formatMessage(content); + bubble.appendChild(text); + + if (!content.includes('what can I find for you?')) { + message.setAttribute('data-exportable', 'true'); + + const actionBar = document.createElement('div'); + actionBar.className = 'message-actions'; + + const actionContainer = document.createElement('div'); + actionContainer.className = 'action-container'; + + const selectionMark = document.createElement('div'); + selectionMark.className = 'selection-mark'; + selectionMark.innerHTML = ''; + + const copyButton = document.createElement('button'); + copyButton.className = 'copy-button'; + copyButton.innerHTML = ` + + Copy`; + + copyButton.addEventListener('click', () => { + const messageContent = text.innerHTML; + this.copyToClipboard(messageContent); + + copyButton.innerHTML = ` + + Copied!`; + copyButton.classList.add('copied'); + + setTimeout(() => { + copyButton.innerHTML = ` + + Copy`; + copyButton.classList.remove('copied'); + }, 2000); + }); + + selectionMark.addEventListener('click', () => { + message.classList.toggle('selected'); + this.updateExportButton(); + }); + + actionContainer.appendChild(copyButton); + actionBar.appendChild(copyButton); + bubble.appendChild(selectionMark); + bubble.appendChild(actionBar); + message.appendChild(bubble); + } else { + message.appendChild(bubble); + bubble.appendChild(text); + message.appendChild(bubble); + } + } else { + text.textContent = content; + bubble.appendChild(text); + message.appendChild(bubble) + } + + bubble.appendChild(text); + message.appendChild(bubble); + this.messageContainer.appendChild(message); + this.scrollToBottom(); + + return message; + } + + setupExportButton() { + const exportButton = document.querySelector('.export-button'); + if (exportButton) { + exportButton.addEventListener('click', () => this.handleExportSelected()); + exportButton.disabled = true; + } + } + + updateExportButton() { + const exportButton = document.querySelector('.export-button'); + const selectedMessages = document.querySelectorAll('.chat-message.ai.selected'); + const count = selectedMessages.length; + + let counter = document.querySelector('.export-counter'); + if (!counter) { + counter = document.createElement('div'); + counter.className = 'export-counter'; + exportButton.parentElement.appendChild(counter); + } + + counter.textContent = `${count}/10`; + counter.style.color = count === 10 ? '#10B981' : 'white'; + + exportButton.disabled = count === 0; + + if (count > 10) { + const lastSelected = selectedMessages[selectedMessages.length - 1]; + lastSelected.classList.remove('selected'); + this.updateExportButton(); + } + } + + getSelectedMessages() { + const selectedMessages = document.querySelectorAll('.chat-message.ai.selected'); + return Array.from(selectedMessages).map(message => { + return message.querySelector('.message-text').innerHTML; + }); + } + + async handleExportSelected() { + const selectedContents = this.getSelectedMessages(); + if (selectedContents.length === 0 || selectedContents.length > 10 ) return; + + const exportButton = document.querySelector('.export-button'); + const originalHTML = exportButton.innerHTML; + + try { + // Show loading state + exportButton.innerHTML = `
`; + exportButton.disabled = true; + + const result = await window.exportResponse(selectedContents); + + if (result === true) { + // Success state + exportButton.innerHTML = ''; + setTimeout(() => { + // Reset state + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + + // Deselect all messages + document.querySelectorAll('.chat-message.ai.selected').forEach(msg => { + msg.classList.remove('selected'); + }); + this.updateExportButton(); + }, 2000); + } else { + // Error state + exportButton.innerHTML = ''; + setTimeout(() => { + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + }, 2000); + } + } catch (error) { + console.error('Export failed:', error); + exportButton.innerHTML = ''; + setTimeout(() => { + exportButton.innerHTML = originalHTML; + exportButton.disabled = false; + }, 2000); + } + } + + updateHeader(domainName = null) { + const headerTitle = document.querySelector('.header-title'); + if (!headerTitle) return; + + if (domainName) { + headerTitle.innerHTML = `Chat with ${domainName}`; + } else { + headerTitle.textContent = 'Chat'; + } + } + + addLoadingMessage() { + const message = document.createElement('div'); + message.className = 'chat-message ai'; + message.innerHTML = ` +
+
+
+ Loading... +
+
+
+ `; + this.messageContainer.appendChild(message); + this.scrollToBottom(); + return message; + } + + showDefaultMessage() { + this.messageContainer.innerHTML = ` +
+
+
+ Please select a folder to start chatting with your documents. + Click the settings icon to select a folder. +
+
+
+ `; + } + + formatMessage(text) { + // First process headers + let formattedText = text.replace(/\[header\](.*?)\[\/header\]/g, '
$1
'); + + // Handle nested lists with proper indentation + formattedText = formattedText.replace(/^-\s*(.*?)$/gm, '
$1
'); + formattedText = formattedText.replace(/^\s{2}-\s*(.*?)$/gm, '
$1
'); + formattedText = formattedText.replace(/^\s{4}-\s*(.*?)$/gm, '
$1
'); + + // Process bold terms + formattedText = formattedText.replace(/\*\*(.*?)\*\*/g, '$1'); + formattedText = formattedText.replace(/\[bold\](.*?)\[\/bold\]/g, '$1'); + + return `
${formattedText}
`; + } + + convertMarkdownToHtmlTable(content) { + if (!content.includes('|')) { + return content; + } + + let segments = []; + + + const startsWithTable = content.trimStart().startsWith('|'); + + if (startsWithTable) { + const tableEndIndex = findTableEndIndex(content); + if (tableEndIndex > 0) { + const tableContent = content.substring(0, tableEndIndex).trim(); + segments.push(processTableContent(tableContent)); + + if (tableEndIndex < content.length) { + const remainingText = content.substring(tableEndIndex).trim(); + if (remainingText) { + segments.push(convertMarkdownToHtmlTable(remainingText)); + } + } + } else { + segments.push(processTableContent(content)); + } + } else { + const tableRegex = /(\|[^\n]+\|(?:\r?\n\|[^\n]+\|)*)/g; + let lastIndex = 0; + let match; + + while ((match = tableRegex.exec(content)) !== null) { + if (match.index > lastIndex) { + const textContent = content.substring(lastIndex, match.index).trim(); + if (textContent) { + segments.push(`
${textContent}
`); + } + } + + segments.push(processTableContent(match[0])); + lastIndex = match.index + match[0].length; + } + + if (lastIndex < content.length) { + const remainingText = content.substring(lastIndex).trim(); + if (remainingText) { + segments.push(`
${remainingText}
`); + } + } + } + + return segments.join(''); + + function findTableEndIndex(text) { + const lines = text.split('\n'); + let lineIndex = 0; + + for (let i = 0; i < lines.length; i++) { + lineIndex += lines[i].length + 1; + if (!lines[i].trimStart().startsWith('|')) { + return lineIndex - 1; + } + } + + return -1; + } + + function processTableContent(tableContent) { + const rows = tableContent.split(/\r?\n/).filter(row => row.trim() && row.includes('|')); + + let htmlTable = '
'; + let hasSeparatorRow = rows.some(row => + row.replace(/[\|\-:\s]/g, '').length === 0 + ); + + rows.forEach((row, rowIndex) => { + if (row.replace(/[\|\-:\s]/g, '').length === 0) return; + + const cells = []; + let cellMatch; + const cellRegex = /\|(.*?)(?=\||$)/g; + + while ((cellMatch = cellRegex.exec(row + '|')) !== null) { + if (cellMatch[1] !== undefined) { + cells.push(cellMatch[1].trim()); + } + } + + if (cells.length === 0) return; + + htmlTable += ''; + cells.forEach(cell => { + const isHeader = (rowIndex === 0 && !hasSeparatorRow) || + (rowIndex === 0 && hasSeparatorRow); + const cellTag = isHeader ? 'th' : 'td'; + + htmlTable += `<${cellTag} class="align-left">${cell}`; + }); + htmlTable += ''; + }); + + htmlTable += '
'; + return htmlTable; + } + } + + updateResources(resources, sentences) { + const container = document.querySelector('.resources-list'); + container.innerHTML = ''; + + if (!resources || !sentences || !resources.file_names?.length) { + return; + } + + sentences.forEach((sentence, index) => { + const item = document.createElement('div'); + item.className = 'resource-item'; + const content = this.convertMarkdownToHtmlTable(sentence); + + item.innerHTML = ` +
+ ${resources.file_names[index]} + + + Page ${resources.page_numbers[index]} + +
+
+
+
+
${index + 1}
+
+
+ ${content} +
+
+ `; + + container.appendChild(item); + }); + } + + copyToClipboard(content) { + const cleanText = content.replace(/
(.*?)<\/div>/g, '$1\n') + .replace(/
(.*?)<\/div>/g, '- $1') + .replace(/
(.*?)<\/div>/g, ' - $1') + .replace(/
(.*?)<\/div>/g, ' - $1') + .replace(/(.*?)<\/strong>/g, '$1') + .replace(/<[^>]+>/g, '') + .replace(/\n\s*\n/g, '\n\n') + .trim(); + + navigator.clipboard.writeText(cleanText) + .catch(err => console.error('Failed to copy text:', err)); + } + + scrollToBottom() { + this.element.scrollTop = this.element.scrollHeight; + } + + enableChat() { + this.element.classList.remove('chat-disabled'); + const input = document.querySelector('.message-input'); + input.disabled = false; + input.placeholder = "Send message"; + } + + disableChat() { + this.element.classList.add('chat-disabled'); + const input = document.querySelector('.message-input'); + input.disabled = true; + input.placeholder = "Select your folder to start chat..."; + } + + clearDefaultMessage() { + this.messageContainer.innerHTML = ''; + } +} + +// Sidebar Component +class Sidebar extends Component { + constructor(domainManager) { + const element = document.createElement('div'); + element.className = 'sidebar-container open'; + super(element); + + this.domainManager = domainManager; + this.isOpen = true; + this.timeout = null; + this.selectedFiles = new Set(); + this.render(); + this.setupEventListeners(); + this.isModalOpen = false; + } + + render() { + this.element.innerHTML = ` + + `; + } + + setupEventListeners() { + // Existing event listeners + const settingsIcon = this.element.querySelector('.settings-icon'); + if (settingsIcon) { + settingsIcon.addEventListener('click', () => { + this.events.emit('settingsClick'); + }); + } + + const fileMenuBtn = this.element.querySelector('.open-file-btn'); + fileMenuBtn.addEventListener('click', () => { + this.events.emit('fileMenuClick'); + }); + + + // Add hover handlers for desktop + const menuTrigger = document.querySelector('.menu-trigger'); + if (menuTrigger) { + menuTrigger.addEventListener('click', () => { + this.toggle(); + }); + } + + this.events.on('modalOpen', () => { + this.isModalOpen = true; + }); + + this.events.on('modalClose', () => { + this.isModalOpen = false; + setTimeout(() => { + this.toggle(false); // Force close the sidebar + }, 200); + }); + + // Mobile menu trigger handler + this.events.on('menuTrigger', () => { + if (window.innerWidth < 992) { + const menuIcon = document.querySelector('.menu-trigger .bi-list'); + if (menuIcon) { + menuIcon.style.transform = this.isOpen ? 'rotate(0)' : 'rotate(45deg)'; + } + this.toggle(); + } + }); + + // Handle window resize + window.addEventListener('resize', () => { + if (window.innerWidth >= 992) { + document.body.style.overflow = ''; + const menuIcon = document.querySelector('.menu-trigger .bi-list'); + if (menuIcon) { + menuIcon.style.transform = 'rotate(0)'; + } + } + }); + + // User Profile Menu + const userSection = this.element.querySelector('#userProfileMenu'); + if (userSection) { + userSection.addEventListener('click', (e) => { + e.stopPropagation(); + userSection.classList.toggle('active'); + }); + + // Close menu when clicking outside + document.addEventListener('click', (e) => { + if (!userSection.contains(e.target)) { + userSection.classList.remove('active'); + } + }); + + // Handle menu items + userSection.querySelectorAll('.menu-item').forEach(item => { + item.addEventListener('click', (e) => { + e.stopPropagation(); + if (item.classList.contains('logout-item')) { + // Handle logout logic here + console.log('Logging out...'); + } + userSection.classList.remove('active'); + }); + }); + } + + // Premium and Feedback links + const premiumLink = this.element.querySelector('.premium-link'); + if (premiumLink) { + premiumLink.addEventListener('click', (e) => { + e.preventDefault(); + this.events.emit('premiumClick'); + }); + } + + const feedbackLink = this.element.querySelector('.bottom-links a:not(.premium-link)'); + if (feedbackLink) { + feedbackLink.addEventListener('click', (e) => { + e.preventDefault(); + this.events.emit('feedbackClick'); + }); + } + + const profileMenuItem = userSection.querySelector('.menu-item:first-child'); + if (profileMenuItem) { + profileMenuItem.addEventListener('click', (e) => { + e.stopPropagation(); + userSection.classList.remove('active'); + this.events.emit('showProfileLimits'); + }); + } + } + + toggle() { + this.isOpen = !this.isOpen; + this.element.classList.toggle('open', this.isOpen); + + // Toggle chat container margin + const chatContainer = document.querySelector('.chat-container'); + if (chatContainer) { + chatContainer.classList.toggle('sidebar-closed', !this.isOpen); + + const messageContainer = document.querySelector('.message-container'); + if (messageContainer) { + messageContainer.style.left = this.isOpen ? '294px' : '0'; + messageContainer.style.width = this.isOpen ? + 'calc(100% - 600px - 294px)' : + 'calc(100% - 600px)'; + } + } + + } + + updateDomainSelection(domain) { + const domainText = this.element.querySelector('.selected-domain-text'); + const folderIcon = this.element.querySelector('.bi-folder'); + const helperText = this.element.querySelector('.helper-text'); + + if (domain) { + domainText.textContent = domain.name; + domainText.title = domain.name; + folderIcon.className = 'bi bi-folder empty-folder'; + helperText.style.display = 'none'; + } else { + domainText.textContent = 'No Domain Selected'; + domainText.removeAttribute('title'); + folderIcon.className = 'bi bi-folder empty-folder'; + helperText.style.display = 'block'; + } + } + + updateFileList(files, fileIDS) { + const fileList = this.element.querySelector('#sidebarFileList'); + if (!fileList) return; + + fileList.innerHTML = ''; + + if (files.length > 0 && fileIDS.length > 0) { + files.forEach((file, index) => { + const fileItem = this.createFileListItem(file, fileIDS[index]); + + // Check the checkbox by default + const checkbox = fileItem.querySelector('.file-checkbox'); + if (checkbox) { + checkbox.checked = true; + } + + fileList.appendChild(fileItem); + }); + } + + this.updateFileMenuVisibility(); + } + + createFileListItem(fileName, fileID) { + const fileItem = document.createElement('li'); + let extension; + if (fileName.includes('http') || fileName.includes('www.')) { + extension = 'html'; + } else { + extension = fileName.split('.').pop().toLowerCase(); + } + const icon = this.getFileIcon(extension); + const truncatedName = this.truncateFileName(fileName); + + fileItem.innerHTML = ` +
+
+ + +
+ + +
+
+ ${truncatedName} +
+ + +
+
+ `; + + this.selectedFiles.add(fileID); + + const checkbox = fileItem.querySelector('.file-checkbox'); + checkbox.checked = true; + + // Handle checkbox changes + checkbox.addEventListener('change', () => { + if (checkbox.checked) { + this.selectedFiles.add(fileID); + } else { + this.selectedFiles.delete(fileID); + } + // Update sources count + window.app.updateSourcesCount(this.selectedFiles.size); + }); + + const deleteBtn = fileItem.querySelector('.delete-file-btn'); + const confirmActions = fileItem.querySelector('.delete-confirm-actions'); + + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + // Show confirmation actions + confirmActions.classList.add('show'); + deleteBtn.style.display = 'none'; + }); + + // Add confirm/cancel handlers + const confirmBtn = fileItem.querySelector('.confirm-delete-btn'); + const cancelBtn = fileItem.querySelector('.cancel-delete-btn'); + + confirmBtn.addEventListener('click', async (e) => { + e.stopPropagation(); + const selectedDomain = this.domainManager.getSelectedDomain(); + if (!selectedDomain) return; + + const success = await window.removeFile(fileID, selectedDomain.data.id, window.serverData.userId); + + if (success) { + // Remove file from UI + fileItem.remove(); + + // Update domain file count + selectedDomain.data.files = selectedDomain.data.files.filter(f => f !== fileName); + selectedDomain.data.fileIDS = selectedDomain.data.fileIDS.filter(id => id !== fileID); + this.domainManager.updateDomainFileCount(selectedDomain.data.id); + + // Update sources count + const sourcesCount = selectedDomain.data.files.length; + window.app.updateSourcesCount(sourcesCount); + } + }); + + cancelBtn.addEventListener('click', (e) => { + e.stopPropagation(); + confirmActions.classList.remove('show'); + deleteBtn.style.display = 'flex'; + }); + + return fileItem; + } + + truncateFileName(fileName, maxLength = 25) { + if (fileName.length <= maxLength) return fileName; + + let extension; + if (fileName.includes('http') || fileName.includes('www.')) { + extension = 'html'; + } else { + extension = fileName.split('.').pop().toLowerCase(); + } + + const nameWithoutExt = fileName.slice(0, fileName.lastIndexOf('.')); + + // Leave room for ellipsis and extension + const truncatedLength = maxLength - 3 - extension.length - 1; + return `${nameWithoutExt.slice(0, truncatedLength)}...${extension}`; + } + + getSelectedFileIds() { + return Array.from(this.selectedFiles); + } + + updateFileList(files, fileIDS) { + const fileList = this.element.querySelector('#sidebarFileList'); + if (!fileList) return; + + fileList.innerHTML = ''; + this.selectedFiles.clear(); // Clear existing selections + + if (files.length > 0 && fileIDS.length > 0) { + files.forEach((file, index) => { + const fileItem = this.createFileListItem(file, fileIDS[index]); + fileList.appendChild(fileItem); + }); + } + + this.updateFileMenuVisibility(); + // Update initial sources count + window.app.updateSourcesCount(this.selectedFiles.size); + } + + updatePlanBadge(userType) { + const planBadge = this.element.querySelector('.plan-badge'); + if (planBadge) { + if (userType === 'premium') { + planBadge.textContent = 'Premium Plan'; + } else { + planBadge.textContent = 'Standard Plan'; + } + } + } + + hideDeleteConfirmations() { + this.element.querySelectorAll('.delete-confirm-actions').forEach(actions => { + actions.classList.remove('show'); + }); + this.element.querySelectorAll('.delete-file-btn').forEach(btn => { + btn.style.display = 'flex'; + }); + } + + clearFileSelections() { + this.selectedFiles.clear(); + window.app.updateSourcesCount(0); + } + + getFileIcon(extension) { + const iconMap = { + pdf: 'bi-file-pdf', + docx: 'bi-file-word', + doc: 'bi-file-word', + txt: 'bi-file-text', + pptx: 'bi-file-ppt', + xlsx: 'bi-file-excel', + udf: 'bi-file-post', + html: 'bi-file-earmark-code', + }; + return iconMap[extension] || 'bi-file'; + } + + updateFileMenuVisibility() { + const fileList = this.element.querySelector('#sidebarFileList'); + const helperText = this.element.querySelector('.helper-text'); + const fileMenuBtn = this.element.querySelector('.open-file-btn'); + const fileListContainer = this.element.querySelector('.file-list-container'); + + if (fileList.children.length > 0) { + helperText.style.display = 'none'; + helperText.style.height = '0'; + helperText.style.margin = '0'; + helperText.style.padding = '0'; + } else { + fileListContainer.style.height = 'auto'; + fileMenuBtn.style.position = 'static'; + fileMenuBtn.style.width = '100%'; + } + } + + +} + +class PremiumModal extends Component { + constructor() { + const element = document.getElementById('premiumAlert'); + super(element); + this.setupEventListeners(); + } + + setupEventListeners() { + const closeButton = this.element.querySelector('.alert-button'); + closeButton?.addEventListener('click', () => this.hide()); + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Feedback Modal Component +class FeedbackModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'feedback-modal'; + super(element); + + this.render(); + this.setupEventListeners(); + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + } + + setupEventListeners() { + // Close button handlers + const closeButtons = this.element.querySelectorAll('.close-modal, .btn-cancel'); + closeButtons.forEach(button => { + button.addEventListener('click', () => this.hide()); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + + // Form submission + const form = this.element.querySelector('#feedback-form'); + form.addEventListener('submit', async (e) => { + e.preventDefault(); + await this.handleSubmit(e); + }); + + // File size validation + const fileInput = this.element.querySelector('#feedback-screenshot'); + fileInput.addEventListener('change', (e) => { + const file = e.target.files[0]; + if (file && file.size > 2 * 1024 * 1024) { + alert('File size must be less than 2MB'); + e.target.value = ''; + } + }); + } + + async handleSubmit(e) { + const form = e.target; + const submitButton = form.querySelector('.btn-submit'); + submitButton.disabled = true; + + try { + const formData = new FormData(form); + const result = await window.sendFeedback(formData, window.serverData.userId); + + if (result.success) { + this.hide(); + this.events.emit('success', result.message); + } else { + this.events.emit('error', result.message); + } + } catch (error) { + console.error('Error in feedback submission:', error); + this.events.emit('error', 'An unexpected error occurred'); + } finally { + submitButton.disabled = false; + form.reset(); + } + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + this.element.querySelector('#feedback-form').reset(); + } +} + +class SuccessAlert extends Component { + constructor() { + const element = document.getElementById('feedbackSuccessAlert'); + super(element); + this.setupEventListeners(); + } + + setupEventListeners() { + const closeButton = this.element.querySelector('.alert-button'); + closeButton?.addEventListener('click', () => this.hide()); + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Logout +class LogoutModal extends Component { + constructor() { + const element = document.getElementById('logoutConfirmModal'); + super(element); + this.setupEventListeners(); + + // Set URLs based on environment from serverData + this.WEB_URL = window.serverData.environment === 'dev' + ? 'http://localhost:3000' + : 'https://doclink.io'; + } + + setupEventListeners() { + const logoutButton = this.element.querySelector('.alert-button'); + const cancelButton = this.element.querySelector('.btn-cancel'); + + logoutButton?.addEventListener('click', () => { + this.handleLogout(); + }); + + cancelButton?.addEventListener('click', () => { + this.hide(); + }); + } + + handleLogout() { + try { + // 1. Clear client-side app state + localStorage.clear(); + sessionStorage.clear(); + + // 2. Call FastAPI logout endpoint + window.handleLogoutRequest(window.serverData.userId, window.serverData.sessionId) + .finally(() => { + // 3. Clear cookies manually as backup + this.clearCookies(); + // 4. Redirect to signout + window.location.href = `${this.WEB_URL}/api/auth/signout?callbackUrl=/`; + }); + + } catch (error) { + console.error('Logout error:', error); + window.location.href = this.WEB_URL; + } + } + + clearCookies() { + const cookies = document.cookie.split(';'); + const domain = window.location.hostname; + for (let cookie of cookies) { + const name = cookie.split('=')[0].trim(); + document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`; + document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.${domain}`; + } + } + + show() { + this.element.classList.add('show'); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.element.classList.remove('show'); + document.body.style.overflow = ''; + } +} + +// Rating Modal +class RatingModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'ratingModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.rating = 0; + + this.render(); + this.setupEventListeners(); + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + this.modal = new bootstrap.Modal(this.element); + } + + setupEventListeners() { + // Star rating handlers + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, index) => { + star.addEventListener('click', () => this.handleStarClick(index)); + star.addEventListener('mouseover', () => this.highlightStars(index)); + star.addEventListener('mouseout', () => this.updateStars()); + }); + + // Close button handler + const closeButton = this.element.querySelector('.close-button'); + closeButton.addEventListener('click', () => this.hide()); + + // Submit button handler + const submitButton = this.element.querySelector('.submit-button'); + submitButton.addEventListener('click', () => { + const feedbackInput = this.element.querySelector('.feedback-input'); + this.sendRating(this.rating,feedbackInput.value) + setTimeout(() => { + this.hide(); + }, 1000); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + } + + handleStarClick(index) { + this.rating = index + 1; + this.updateStars(); + } + + async sendRating(rating,user_note) { + try { + const result = await window.sendRating(rating, user_note, window.serverData.userId); + + if (result.success) { + this.hide() + this.events.emit('success', result.message); + } else { + this.events.emit('error', result.message); + } + } catch (error) { + console.error('Error in rating submission:', error); + this.events.emit('error', 'An unexpected error occurred'); + } finally { + this.reset(); + } + } + + highlightStars(index) { + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, i) => { + star.classList.remove('bi-star-fill', 'bi-star'); + if (i <= index) { + star.classList.add('bi-star-fill'); + star.classList.add('active'); + } else { + star.classList.add('bi-star'); + star.classList.remove('active'); + } + }); + } + + updateStars() { + const stars = this.element.querySelectorAll('.stars i'); + stars.forEach((star, i) => { + star.classList.remove('bi-star-fill', 'bi-star', 'active'); + if (i < this.rating) { + star.classList.add('bi-star-fill'); + star.classList.add('active'); + } else { + star.classList.add('bi-star'); + } + }); + } + + show() { + this.modal.show(); + document.body.style.overflow = 'hidden'; + } + + hide() { + this.modal.hide(); + document.body.style.overflow = ''; + } + + reset() { + this.rating = 0; + this.updateStars(); + const feedbackInput = this.element.querySelector('.feedback-input'); + if (feedbackInput) { + feedbackInput.value = ''; + } + } +} + +// URLuploadModal +class URLInputModal extends Component { + constructor() { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'urlInputModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.render(); + this.setupEventListeners(); + this.modal = null; + + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + this.modal = new bootstrap.Modal(this.element); + } + + setupEventListeners() { + const urlInput = this.element.querySelector('.url-input'); + const addButton = this.element.querySelector('.add-url-btn'); + const closeButton = this.element.querySelector('.close-button'); + + // Enable/disable add button based on URL input + urlInput.addEventListener('input', () => { + addButton.disabled = !urlInput.value.trim(); + }); + + // URL processing + addButton.addEventListener('click', () => { + const url = urlInput.value; + this.startProcessing(url); + urlInput.value = ''; + }); + + // Close button handler + closeButton.addEventListener('click', () => { + this.hide(); + }); + + // Click outside to close + this.element.addEventListener('click', (e) => { + if (e.target === this.element) { + this.hide(); + } + }); + + } + + async startProcessing(url) { + const clean_url = url.trim(); + if (!clean_url) return; + + this.setLoadingState(true); + + try { + const success = await window.storeURL(window.serverData.userId, clean_url); + + if (success === 1) { + this.handleFileBasketAddition(clean_url) + this.events.emit('urlProcessed', { + message: 'Successfully processed URL', + type: 'success' + }); + this.hide(); + } else { + throw new Error('Failed to process URL'); + } + + } catch (error) { + this.events.emit('error', error.message); + } finally { + this.setLoadingState(false); + } + } + + handleFileBasketAddition(url) { + try { + // Create a clean filename from the URL + const urlObj = new URL(url); + const fileName = `${urlObj.hostname}.html`; + + // Create URL file object similar to drive file object + const urlFile = { + name: fileName, + mimeType: 'text/html', + lastModified: Date.now() + }; + + // Emit event for FileUploadModal to handle + this.events.emit('urlProcessed', { + files: [urlFile], + message: 'Successfully processed URL', + type: 'success' + }); + + this.hide(); + return true; + + } catch (error) { + console.error('Error preparing URL file:', error); + return false; + } + } + + setLoadingState(isLoading) { + const loadingOverlay = this.element.querySelector('.upload-loading-overlay'); + const closeButton = this.element.querySelector('.close-button'); + const addButton = this.element.querySelector('.add-url-btn'); + + if (isLoading) { + loadingOverlay.style.display = 'flex'; + closeButton.style.display = 'none'; + addButton.disabled = true; + this.modal._config.backdrop = 'static'; + this.modal._config.keyboard = false; + } else { + loadingOverlay.style.display = 'none'; + closeButton.style.display = 'block'; + addButton.disabled = false; + this.modal._config.backdrop = true; + this.modal._config.keyboard = true; + } + } + + show() { + if (this.modal) { + this.modal.dispose(); + } + + this.modal = new bootstrap.Modal(this.element); + + this.element.style.zIndex = '9999'; + + this.modal.show(); + + setTimeout(() => { + const backdrop = document.querySelector('.modal-backdrop:last-child'); + if (backdrop) { + backdrop.style.zIndex = '9998'; + } + }, 0); + } + + hide() { + this.modal.hide(); + const urlInput = this.element.querySelector('.url-input'); + urlInput.value = ''; + } + +} + +// Add this class after other modal classes +class ProfileLimitsModal extends Component { + constructor(domainManager) { + const element = document.createElement('div'); + element.className = 'modal fade'; + element.id = 'profileLimitsModal'; + element.setAttribute('tabindex', '-1'); + element.setAttribute('aria-hidden', 'true'); + super(element); + + this.domainManager = domainManager; + this.render(); + this.setupEventListeners(); + this.dailyQuestionsCount = 0; + } + + render() { + this.element.innerHTML = ` + + `; + + document.body.appendChild(this.element); + } + + updateLimits() { + const domains = this.domainManager.getAllDomains(); + let totalSources = 0; + const userType = window.app?.userData?.user_info?.user_type || 'free'; + const upgradeButton = this.element.querySelector('.upgrade-section'); + + const limitsContainer = this.element.querySelector('.limits-container'); + if (limitsContainer) { + const limitIndicators = limitsContainer.querySelectorAll('.limit-indicator'); + const dailyQuestionBar = limitIndicators.length >= 3 ? limitIndicators[2] : null; + + if (upgradeButton) { + upgradeButton.style.display = userType === 'premium' ? 'none' : 'block'; + } + + if (dailyQuestionBar) { + dailyQuestionBar.style.display = userType === 'premium' ? 'none' : 'block'; + } + } + + domains.forEach(domain => { + if (domain.fileCount) { + totalSources += domain.fileCount; + } + }); + + if (userType === 'free') { + this.updateProgressBar('sources', totalSources, 10); + this.updateProgressBar('domains', domains.length, 3); + this.updateProgressBar('questions', this.dailyQuestionsCount, 25); + } else if (userType === 'premium') { + this.updateProgressBar('sources', totalSources, 100); + this.updateProgressBar('domains', domains.length, 20); + } + + } + + updateDailyCount(count) { + this.dailyQuestionsCount = count; + if (this.element.classList.contains('show')) { + this.updateProgressBar('questions', count, 25); + } + } + + updateProgressBar(type, current, max) { + const countElement = this.element.querySelector(`.${type}-count`); + const progressBar = countElement?.closest('.limit-indicator').querySelector('.progress-bar'); + + if (countElement && progressBar) { + const percentage = (current / max) * 100; + countElement.textContent = `${current}/${max}`; + progressBar.style.width = `${percentage}%`; + } + } + + setupEventListeners() { + const upgradeButton = this.element.querySelector('.upgrade-button'); + upgradeButton?.addEventListener('click', () => { + this.events.emit('upgradeClick'); + }); + } + + show() { + this.updateLimits(); + const modal = new bootstrap.Modal(this.element); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(this.element); + if (modal) { + modal.hide(); + } + } +} + +// Application +class App { + constructor() { + this.domainManager = new DomainManager(); + this.sidebar = new Sidebar(this.domainManager); + this.feedbackModal = new FeedbackModal(); + this.domainSettingsModal = new DomainSettingsModal(this.domainManager); + this.fileUploadModal = new FileUploadModal(this.domainManager); + this.events = new EventEmitter(); + this.userData = null; + this.sourcesCount = 0; + this.sourcesBox = document.querySelector('.sources-box'); + this.sourcesNumber = document.querySelector('.sources-number'); + this.chatManager = new ChatManager(); + this.premiumModal = new PremiumModal(); + this.successAlert = new SuccessAlert(); + this.logoutModal = new LogoutModal(); + this.ratingModal = new RatingModal(); + this.profileLimitsModal = new ProfileLimitsModal(this.domainManager); + this.chatManager.disableChat(); + this.setupEventListeners(); + } + + updateUserInterface() { + // Update user section in sidebar + const userEmail = this.sidebar.element.querySelector('.user-email'); + const userAvatar = this.sidebar.element.querySelector('.user-avatar'); + + userEmail.textContent = this.userData.user_info.user_email; + + if (this.userData.user_info.user_picture_url && this.userData.user_info.user_picture_url !== "null") { + userAvatar.innerHTML = `${this.userData.user_info.user_name}`; + userAvatar.classList.add('has-image'); + } else { + userAvatar.textContent = this.userData.user_info.user_name[0].toUpperCase(); + userAvatar.classList.remove('has-image'); + } + + this.sidebar.updatePlanBadge(this.userData.user_info.user_type); + } + + updateSourcesCount(count) { + this.sourcesCount = count; + if (this.sourcesNumber) { + this.sourcesNumber.textContent = count; + this.sourcesBox.setAttribute('count', count); + } + } + + updateDomainCount() { + this.domainSettingsModal.updateDomainCount(); + } + + setupEventListeners() { + // Sidebar events + this.sidebar.events.on('settingsClick', () => { + this.domainSettingsModal.show(); + }); + + this.sidebar.events.on('fileMenuClick', () => { + const selectedDomain = this.domainManager.getSelectedDomain(); + if (!selectedDomain) { + this.events.emit('warning', 'Please select a domain first'); + return; + } + this.fileUploadModal.show(selectedDomain.data.name); + this.sidebar.events.emit('modalOpen'); + }); + + this.sidebar.events.on('feedbackClick', () => { + this.feedbackModal.show(); + }); + + // Domain Settings Modal events + this.domainSettingsModal.events.on('domainCreate', async (domainData) => { + const domainCard = this.domainManager.addDomain({ + id: domainData.id, + name: domainData.name + }); + + // Update the domains list in the modal + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.updateDomainCount(); + + this.events.emit('message', { + text: `Successfully created folder ${domainData.name}`, + type: 'success' + }); + }); + + this.domainSettingsModal.events.on('domainSearch', (searchTerm) => { + const filteredDomains = this.domainManager.searchDomains(searchTerm); + this.domainSettingsModal.updateDomainsList(filteredDomains); + }); + + this.domainSettingsModal.events.on('domainSelected', async (domainId) => { + try { + const success = await window.selectDomain(domainId, window.serverData.userId); + + if (success) { + const domain = this.domainManager.getDomain(domainId); + if (!domain) return; + + // Update domain manager state and UI + this.domainManager.selectDomain(domainId); + this.sidebar.updateDomainSelection(domain.data); + + // Update header with domain name + this.chatManager.updateHeader(domain.data.name); + + const files = domain.data.files || []; + const fileIDS = domain.data.fileIDS || []; + this.sidebar.updateFileList(files, fileIDS); + + // Update sources count + this.updateSourcesCount(files.length); + + // Enable chat + this.chatManager.enableChat(); + + this.events.emit('message', { + text: `Successfully switched to folder ${domain.data.name}`, + type: 'success' + }); + } + } catch (error) { + this.events.emit('message', { + text: 'Failed to select folder', + type: 'error' + }); + } + }); + + const selectButton = this.domainSettingsModal.element.querySelector('.select-button'); + selectButton?.addEventListener('click', () => { + const selectedCheckbox = this.domainSettingsModal.element.querySelector('.domain-checkbox:checked'); + if (selectedCheckbox) { + const domainCard = selectedCheckbox.closest('.domain-card'); + const domainId = domainCard.dataset.domainId; + this.domainSettingsModal.events.emit('domainSelected', domainId); + } + }); + + this.domainSettingsModal.events.on('domainEdit', async ({ id, newName }) => { + const success = this.domainManager.renameDomain(id, newName); + if (success) { + // If this is the currently selected domain, update the sidebar + const selectedDomain = this.domainManager.getSelectedDomain(); + if (selectedDomain && selectedDomain.data.id === id) { + this.sidebar.updateDomainSelection(selectedDomain.data); + } + + // Update the domains list in the modal + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.events.emit('message', { + text: `Successfully renamed folder to ${newName}`, + type: 'success' + }); + } + }); + + this.domainSettingsModal.events.on('warning', (message) => { + this.events.emit('message', { + text: message, + type: 'warning' + }); + }); + + this.domainSettingsModal.events.on('domainDelete', async (domainId) => { + const wasSelected = this.domainManager.getSelectedDomain()?.data.id === domainId; + + if (this.domainManager.deleteDomain(domainId)) { + if (wasSelected) { + // Reset sidebar to default state + this.sidebar.updateDomainSelection(null); + this.sidebar.updateFileList([], []); + // Reset sources count + this.updateSourcesCount(0); + // Disable chat + this.chatManager.disableChat(); + } + + this.domainSettingsModal.updateDomainsList(this.domainManager.getAllDomains()); + + this.updateDomainCount(); + + this.events.emit('message', { + text: 'Folder successfully deleted', + type: 'success' + }); + } + }); + + this.chatManager.events.on('ratingModalOpen', () => { + setTimeout(() => { + this.ratingModal.show(); + }, 500); + }); + + // File Upload Modal events + this.fileUploadModal.events.on('filesUploaded', (data) => { + const selectedDomain = this.domainManager.getSelectedDomain(); + if (selectedDomain) { + // Access the nested data object + selectedDomain.data.files = data.file_names; + selectedDomain.data.fileIDS = data.file_ids; + this.sidebar.updateFileList(data.file_names, data.file_ids); + this.updateSourcesCount(data.file_names.length); + this.domainManager.updateDomainFileCount(selectedDomain.data.id); + } + }); + + this.fileUploadModal.events.on('warning', (message) => { + this.events.emit('message', { + text: message, + type: 'warning' + }); + }); + + this.fileUploadModal.events.on('error', (message) => { + this.events.emit('message', { + text: message, + type: 'error' + }); + }); + + this.fileUploadModal.events.on('modalClose', () => { + this.sidebar.events.emit('modalClose'); + }); + + // Feedback Modal events + this.feedbackModal.events.on('feedbackSubmitted', (message) => { + console.log(message); + }); + + this.feedbackModal.events.on('feedbackError', (error) => { + console.error(error); + }); + + this.feedbackModal.events.on('success', (message) => { + this.successAlert.show(); + }); + + // Premium Modal Events + const premiumLink = this.sidebar.element.querySelector('.premium-link'); + premiumLink?.addEventListener('click', (e) => { + e.preventDefault(); + this.initiateCheckout(); + }); + + this.profileLimitsModal.events.on('upgradeClick', () => { + this.initiateCheckout(); + }); + + // Logout event + const logoutItem = this.sidebar.element.querySelector('.logout-item'); + logoutItem?.addEventListener('click', (e) => { + e.preventDefault(); + this.logoutModal.show(); + }); + + this.sidebar.events.on('showProfileLimits', () => { + this.profileLimitsModal.show() + }); + + } + + // In App class initialization + async init() { + // Initialize + this.userData = await window.fetchUserInfo(window.serverData.userId); + if (!this.userData) { + throw new Error('Failed to load user data'); + } + + // Update user interface with user data + this.updateUserInterface() + + // Store domain data + Object.keys(this.userData.domain_info).forEach(key => { + const domainData = this.userData.domain_info[key]; + const domain = { + id: key, + name: domainData.domain_name, + fileCount: domainData.file_names.length, + files: domainData.file_names, + fileIDS: domainData.file_ids + }; + this.domainManager.addDomain(domain); + }); + + // Update UI with domain data + this.domainSettingsModal.updateDomainsList( + this.domainManager.getAllDomains() + ); + + window.user_type = this.userData.user_type + + // Add sidebar to DOM + document.body.appendChild(this.sidebar.element); + + // Setup menu trigger + const menuTrigger = document.querySelector('.menu-trigger'); + if (menuTrigger) { + menuTrigger.addEventListener('click', () => { + this.sidebar.events.emit('menuTrigger'); + }); + } + + window.app.profileLimitsModal.updateDailyCount(this.userData.user_info.user_daily_count); + + // Welcome operations + const isFirstTime = window.serverData.isFirstTime === 'True'; + if (isFirstTime) { + localStorage.setItem('firstTime', 0); + const firstTimeMsg = `[header]Welcome to Doclink${this.userData.user_info.user_name ? `, ${this.userData.user_info.user_name}` : ''}๐Ÿ‘‹[/header]\nYour first folder with helpful guide settled up. You can always use this file to get information about Doclink!\n[header]To get started[/header]\n- Select your folder on navigation bar \n- Upload your documents or insert a link\n- Ask any question to get information\n- All answers will include sources on references\n\n[header]Quick Tips[/header]\n- Doclink is specialized to answer only from your files\n- Specialized questions can help Doclink to find information better\n- Doclink supports PDF, DOCX, Excel, PowerPoint, UDF and TXT file formats\n- You can create different folders for different topics and interact with them\n- You can also ask just selected files to get isolated information\n- You can select answers on the upper right of the message box and create report with clicking report icon on the chat`; + this.chatManager.addMessage(firstTimeMsg, 'ai'); + + const domains = this.domainManager.getAllDomains(); + if (domains.length > 0) { + this.domainSettingsModal.events.emit('domainSelected', domains[0].id); + } + + } else { + // Regular welcome message for returning users + this.chatManager.addMessage( + `Welcome ${this.userData.user_info.user_name}, what can I find for you?`, + 'ai' + ); + } + } + + // Initial Checkout + initiateCheckout() { + // const checkoutUrl = 'https://doclinkio.lemonsqueezy.com/buy/0c0294bb-1cbe-4411-a9bc-800053d1580c'; + const checkoutUrl = 'https://test.jarednevans.com'; + window.location.href = checkoutUrl; + } +} + +// Initialize when DOM is ready +document.addEventListener('DOMContentLoaded', () => { + window.app = new App(); + window.app.init(); + + const resourcesTrigger = document.querySelector('.resources-trigger'); + const resourcesContainer = document.querySelector('.resources-container'); + const mainContent = document.querySelector('.chat-container'); + + if (resourcesTrigger && resourcesContainer) { + resourcesTrigger.addEventListener('click', () => { + resourcesContainer.classList.toggle('show'); + mainContent.classList.toggle('blur-content'); + + if (resourcesContainer.classList.contains('show')) { + backdrop.classList.add('show'); + document.body.style.overflow = 'hidden'; + } else { + backdrop.classList.remove('show'); + document.body.style.overflow = ''; + } + }); + + // Escape tuลŸu ile kapatma + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape' && resourcesContainer.classList.contains('show')) { + resourcesContainer.classList.remove('show'); + mainContent.classList.remove('blur-content'); + backdrop.classList.remove('show'); + document.body.style.overflow = ''; + } + }); + } + +}); diff --git a/doclink/doclink/app/test_db_conn.py b/doclink/doclink/app/test_db_conn.py new file mode 100644 index 0000000..7dc0bc3 --- /dev/null +++ b/doclink/doclink/app/test_db_conn.py @@ -0,0 +1,17 @@ +import os, psycopg2 +from dotenv import load_dotenv + +load_dotenv() + +try: + conn = psycopg2.connect( + host=os.getenv("DB_HOST"), + port=os.getenv("DB_PORT"), + database=os.getenv("DB_NAME"), + user=os.getenv("DB_USER"), + password=os.getenv("DB_PASSWORD") + ) + print("Connection successful!") + conn.close() +except Exception as e: + print("Connection failed:", e) diff --git a/doclink/doclink/app/utils/prompts.yaml b/doclink/doclink/app/utils/prompts.yaml new file mode 100644 index 0000000..62f241c --- /dev/null +++ b/doclink/doclink/app/utils/prompts.yaml @@ -0,0 +1,636 @@ +prompts: + languages: + en: + general_purpose: + - id: gp_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language and context.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata: \n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Informational: + - id: info_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language and context.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Identify factual knowledge, definitions, or explanations requested in the query.\n + 2. Focus on delivering concise, clear, and specific information.\n + 3. Include [b]key terms[/b] and definitions for clarity and emphasize relevant details.\n + 4. Avoid generalizations; prioritize extracting exact matches or relevant information from the context.\n + 5. Answer must be short as possible, on-point and clear as much as possible.\n + 6. Always prioritize contexts with higher confidence coefficients for accuracy, but cross-check lower-confidence contexts for supplementary or missing details to ensure completeness.\n + 7. Where appropriate, attribute information to its source file or section implicitly. For example: 'As described in the regulations...' or 'According to the provided report...' without directly mentioning the context window or file name unless explicitly required by the query.\n + 8. If contradictory information is found: Explicitly state the contradiction and its source(s). Suggest possible resolutions, clarifications, or factors that may explain the discrepancy (e.g., differing data sources, updates, or interpretations).\n + 9. If the query requests a more detailed response, expand your answer with additional explanations\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response \n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Comparison: + - id: comp_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Extract and compare relevant details from the context to highlight similarities and differences.\n + 2. If contradictory information is found, specify the contradictions and explain their sources.\n + 3. Present distinctions or parallels in a structured format, using headers like [header]Similarities[/header] and [header]Differences[/header].\n + 4. Provide a clear explanation of how the extracted information relates to the user's query.\n + 5. If consistent information appears across contexts, summarize it in the [header]Similarities[/header] section. For contradictory information: Specify conflicting points under [header]Differences[/header]. Attribute contradictions to their respective sources and explain their impact.\n + 6. For comparisons involving multiple attributes, organize data using a [bold]tabular format[/bold] or structured lists. Each row or bullet point should represent one attribute.\n + 7. If the required comparison data is missing, clearly state this under [header]Missing Information[/header]. Offer suggestions for refining the query or point out gaps in the context.\n + 8. For queries involving detailed or hierarchical comparisons: Use a primary section for high-level differences or similarities. Include nested sections for more granular points.\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + Summarization: + - id: sum_001 + text: " + Your task is to analyze the given context windows, extract relevant data based on the user's query, and use file information to enhance your response. Your primary goal is to provide a comprehensive, structured, and user-friendly answer using solely the information provided in the context window.\n + Please respond in the language of the user's query, specified by the {lang} variable (e.g., 'en' for English, 'tr' for Turkish), ensuring the tone and style align with the query's language.\n + + Instructions:\n + You will be provided with context windows, each containing several sentences along with the two following metadata:\n + File: Specifies source of each context.\n + Confidence coefficient: A number between 0 and 1, indicating the priority of the context (higher numbers mean higher priority).\n + + 1. Identify and extract key points or main ideas from the context relevant to the query.\n + 2. Create a concise and well-structured summary, using bullet points or categories for clarity.\n + 3. Highlight overarching themes and provide an overview without including excessive details.\n + 4. Consolidate consistent information across contexts to avoid redundancy.\n + 5. If the query specifies a focus area (e.g., a section, file, or theme), prioritize summarizing content strictly relevant to that focus. Where no focus is specified, highlight the most critical and recurring themes or points.\n + 6. Where appropriate, illustrate key ideas with short examples or specific details from the context. Keep examples concise and relevant.\n + 7. If the context contains contradictions: Summarize both perspectives succinctly. Highlight the contradiction explicitly, and explain how it relates to the query.\n + 8. The summary should not exceed 200 tokens unless explicitly requested by the query. If required details exceed this limit, provide a prioritized or hierarchical overview.\n + + Extracting Relevant Information:\n + Carefully analyze the user's query to determine the specific information being requested.\n + Use all relevant context windows, prioritizing those with higher confidence levels for accuracy.\n + If the query references a specific file, extract information only from the specified file(s).\n + If the query does not specify a file, aggregate information from all available files.\n + If the context contains consistent information across multiple files, consolidate the data and indicate consistency.\n + If the context contains contradictory information: Highlight the contradictions, specify their sources, and explain how they differ.\n + If the context contains similar or different information, summarize the distinctions or similarities and relate them to the query.\n + Present your response using bullet points or topic-based sections for better readability.\n + Prioritize clarity and conciseness. Use subheadings or categories for complex queries.\n + If the required information is not found in the context, state this clearly and offer suggestions or clarifications if possible.\n + Do not specify the confidence coefficient in response.\n + Do not mention about the 'context windows'. 'Use according to resources' instead.\n + + Respond *strictly* in the following format:\n + + [header]Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed. Use the following list format for any points:\n + - Main point\n + - Sub-point\n + - Further nested point\n + + [header]Another Section Name[/header]\n + Content with [bold]bold terms[/bold] when needed\n + - Main point\n + - Sub-point\n + - Further nested point\n + + Rules:\n + 1. Each major section must start with [header]...[/header]\n + 2. Use [bold]...[/bold] for important terms or emphasis within content\n + 3. Headers should be one of: Definition, Purpose, Key Features, Operation, Context\n + 4. Use single dash (-) for all list items\n + 5. Indent nested list items with exactly 2 spaces per level\n + 6. Place one empty line between major sections\n + 7. Do not use any other list markers (bullets, dots, numbers)\n + 8. Keep indentation consistent throughout the response\n + + Context Windows:\n + {context}\n + + User Query:\n + {query}\n + + User Query language:\n + {lang}\n + " + + queries: + - id: query_001 + text: " + Task: Analyze, Correct, and Generate Related Questions & Answers\n + Instructions:\n + You are given a user query.\n + + First, check the user question. If it has no meaning, return an empty string. If it is meaningful, do the following:\n + Correct any spelling or grammatical errors and return the corrected question as the first line of the output.\n + Generate 3 semantically similar queries that retain the same meaning as the corrected query.\n + Create 3 different questions that approach the original query from different angles but stay related.\n + Answer last 3 questions with concise responses, 1-2 sentences max each.\n + Then, analyze the corrected user query and determine its intent, intention list is and their keywords, examples are given below. If intent can't be determined return empty '' string.\n + Please respond in the file language, specified by the {file lang} variable (e.g., 'en' for English, 'tr' for Turkish) regardless of user query's language , ensuring the tone and style align with the file's language.\n + If file language is diferent than english look for the intention keywords that provided for intent detection below in file language.\n + + The possible intents are:\n + 1. Informational: Seeking factual knowledge, definitions, or explanations.\n + Intention Keywords: What, define, explain, details, specify, who, why, how.\n + Intention Examples: What is the penalty for breaking this rule? โ†’ Informational\n + 2. Summarization: Requesting a concise overview of complex information.\n + Intention Keywords: Summarize, overview, main points, key ideas, brief, concise, simplify.\n + Intention Examples: Can you summarize the key points of this document? โ†’ Summarization\n + 3. Comparison: Evaluating options, methods, or technologies.\n + Intention Keywords: Compare, difference, similarity, versus, contrast, better, alternative, pros and cons.\n + Intention Examples: Compare the benefits of these two methods. โ†’ Comparison\n + + Return the output **strictly** in the following format:\n + [corrected query]\n + [first semantically similar query]\n + [second semantically similar query]\n + [third semantically similar query]\n + [first different-angle question]\n + [second different-angle question]\n + [third different-angle question]\n + [first different-angle answer]\n + [second different-angle answer]\n + [third different-angle answer]\n + [user intention]\n + + User query: {query}\n + + File language:\n + {file_lang}\n + + Example:\n + User query: How does retrieval-augmented generation work in AI systems?\n + + File language: en\n + + Output: + How does retrieval-augmented generation work in AI systems?\n + What is the process of retrieval-augmented generation in AI?\n + How does RAG help AI systems retrieve and generate information?\n + Can you explain how retrieval-augmented generation functions in AI applications?\n + What are the key advantages of using RAG in AI?\n + How does RAG differ from traditional machine learning models?\n + What challenges does RAG face in implementation?\n + RAG enhances AI by providing more accurate responses by retrieving relevant external data.\n + Unlike traditional models, RAG integrates search capabilities to access external knowledge during inference.\n + Major challenges include latency in retrieval, ensuring relevance of fetched data, and maintaining up-to-date information.\n + Informational\n + " + tr: + general_purpose: + - id: gp_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + Bilgi Edinme: + - id: info_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Sorguda talep edilen gerรงek bilgilere, tanฤฑmlara veya aรงฤฑklamalara odaklanฤฑn.\n + 2. Kฤฑsa, net ve spesifik bilgiler sunmaya odaklanฤฑn.\n + 3. Aรงฤฑklฤฑk iรงin [b]รถnemli terimler[/b] ve tanฤฑmlarฤฑ ekleyin ve ilgili ayrฤฑntฤฑlarฤฑ vurgulayฤฑn.\n + 4. Genellemelerden kaรงฤฑnฤฑn; baฤŸlamdan tam eลŸleลŸmeleri veya ilgili bilgileri รงฤฑkarmayฤฑ รถnceliklendirin.\n + 5. Cevap mรผmkรผn olduฤŸunca kฤฑsa, net ve doฤŸrudan olmalฤฑ; 150 ile 200 token arasฤฑnda olmalฤฑdฤฑr.\n + 6. DoฤŸruluk iรงin her zaman daha yรผksek gรผven katsayฤฑsฤฑna sahip baฤŸlamlara รถncelik verin, ancak eksiksizliฤŸi saฤŸlamak iรงin ek veya eksik ayrฤฑntฤฑlar iรงin daha dรผลŸรผk gรผven katsayฤฑsฤฑna sahip baฤŸlamlarฤฑ รงapraz kontrol edin.\n + 7. Uygun olduฤŸunda, bilgiyi kaynak dosya veya bรถlรผme dolaylฤฑ olarak atfedin. ร–rneฤŸin: Yรถnetmeliklerde belirtildiฤŸi gibi... veya SaฤŸlanan rapora gรถre... ifadelerini kullanฤฑn, ancak sorguda aรงฤฑkรงa istenmediฤŸi sรผrece baฤŸlam penceresi veya dosya adฤฑnฤฑ doฤŸrudan belirtmeyin.\n + 8. ร‡eliลŸkili bilgiler bulunursa: ร‡eliลŸkiyi ve kaynaฤŸฤฑnฤฑ aรงฤฑkรงa belirtin. Olasฤฑ รงรถzรผm yollarฤฑnฤฑ, aรงฤฑklamalarฤฑ veya farklฤฑlฤฑklarฤฑ aรงฤฑklayabilecek faktรถrleri (รถrneฤŸin, farklฤฑ veri kaynaklarฤฑ, gรผncellemeler veya yorumlar) รถnerin.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + KarลŸฤฑlaลŸtฤฑrma: + - id: comp_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Benzerlikleri ve farklฤฑlฤฑklarฤฑ vurgulamak iรงin baฤŸlamdan ilgili detaylarฤฑ รงฤฑkarฤฑn ve karลŸฤฑlaลŸtฤฑrฤฑn.\n + 2. ร‡eliลŸkili bilgiler bulunursa, bu รงeliลŸkileri belirtin ve kaynaklarฤฑnฤฑ aรงฤฑklayฤฑn.\n + 3. Ayrฤฑmlarฤฑ veya paralellikleri, [header]Benzerlikler[/header] ve [header]Farklฤฑlฤฑklar[/header] gibi baลŸlฤฑklar kullanarak yapฤฑlandฤฑrฤฑlmฤฑลŸ bir formatta sunun.\n + 4. ร‡ฤฑkarฤฑlan bilgilerin kullanฤฑcฤฑnฤฑn sorgusuyla nasฤฑl iliลŸkili olduฤŸunu net bir ลŸekilde aรงฤฑklayฤฑn.\n + 5. EฤŸer baฤŸlamlar arasฤฑnda tutarlฤฑ bilgiler bulunuyorsa, bunlarฤฑ [header]Benzerlikler[/header] bรถlรผmรผnde รถzetleyin. ร‡eliลŸkili bilgiler iรงin: ร‡eliลŸen noktalarฤฑ [header]Farklฤฑlฤฑklar[/header] baลŸlฤฑฤŸฤฑ altฤฑnda belirtin. ร‡eliลŸkileri ilgili kaynaklarฤฑna atfedin ve bunlarฤฑn etkisini aรงฤฑklayฤฑn.\n + 6. Birden fazla รถzelliฤŸi kapsayan karลŸฤฑlaลŸtฤฑrmalar iรงin, verileri [bold]tablo formatฤฑnda[/bold] veya yapฤฑlandฤฑrฤฑlmฤฑลŸ listeler halinde dรผzenleyin. Her bir satฤฑr veya madde iลŸareti bir รถzelliฤŸi temsil etmelidir.\n + 7. Gerekli karลŸฤฑlaลŸtฤฑrma verileri eksikse, bunu [header]Eksik Bilgiler[/header] baลŸlฤฑฤŸฤฑ altฤฑnda aรงฤฑkรงa belirtin. Sorgunun nasฤฑl iyileลŸtirilebileceฤŸine dair รถnerilerde bulunun veya baฤŸlamdaki eksikliklere iลŸaret edin.\n + 8. Ayrฤฑntฤฑlฤฑ veya hiyerarลŸik karลŸฤฑlaลŸtฤฑrmalarฤฑ iรงeren sorgular iรงin: Genel farklฤฑlฤฑklar veya benzerlikler iรงin bir ana bรถlรผm kullanฤฑn. Daha ayrฤฑntฤฑlฤฑ noktalar iรงin iรง iรงe geรงmiลŸ bรถlรผmler ekleyin.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + ร–zetleme: + - id: sum_tr_001 + text: " + Gรถreviniz verilen baฤŸlam pencerelerini analiz etmek, kullanฤฑcฤฑnฤฑn sorgusuna gรถre ilgili verileri รงฤฑkarmak ve yanฤฑtฤฑnฤฑzฤฑ geliลŸtirmek iรงin dosya bilgilerini kullanmaktฤฑr. Birincil amacฤฑnฤฑz, yalnฤฑzca baฤŸlam penceresinde saฤŸlanan bilgileri kullanarak kapsamlฤฑ, yapฤฑlandฤฑrฤฑlmฤฑลŸ ve kullanฤฑcฤฑ dostu bir yanฤฑt sunmaktฤฑr.\n + + Talimatlar:\n + Size, her biri birkaรง cรผmle ve ลŸu iki meta veriyi iรงeren baฤŸlam pencereleri saฤŸlanacaktฤฑr:\n + Dosya: Her baฤŸlamฤฑn kaynaฤŸฤฑnฤฑ belirtir.\n + Gรผven katsayฤฑsฤฑ: 0 ile 1 arasฤฑnda bir sayฤฑ olup, baฤŸlamฤฑn รถncelik seviyesini ifade eder (daha yรผksek sayฤฑlar daha yรผksek รถncelik anlamฤฑna gelir).\n + + 1. Sorgu ile ilgili baฤŸlamdan anahtar noktalarฤฑ veya temel fikirleri belirleyin ve รงฤฑkarฤฑn.\n + 2. Netlik iรงin madde iลŸaretleri veya kategoriler kullanarak kฤฑsa ve iyi yapฤฑlandฤฑrฤฑlmฤฑลŸ bir รถzet oluลŸturun.\n + 3. Genel temalarฤฑ vurgulayฤฑn ve gereksiz ayrฤฑntฤฑlara yer vermeden genel bir bakฤฑลŸ saฤŸlayฤฑn.\n + 4. Tekrarlamalarฤฑ รถnlemek iรงin baฤŸlamlar arasฤฑndaki tutarlฤฑ bilgileri birleลŸtirin.\n + 5. EฤŸer sorgu belirli bir odak alanฤฑ (รถrneฤŸin, bir bรถlรผm, dosya veya tema) belirtiyorsa, yalnฤฑzca bu odakla ilgili iรงeriฤŸi รถzetlemeye รถncelik verin. Herhangi bir odak belirtilmemiลŸse, en kritik ve tekrar eden temalarฤฑ veya noktalarฤฑ vurgulayฤฑn.\n + 6. Uygun olduฤŸunda, baฤŸlamdan kฤฑsa รถrnekler veya belirli detaylarla ana fikirleri aรงฤฑklayฤฑn. ร–rnekleri kฤฑsa ve ilgili tutun.\n + 7. BaฤŸlamda รงeliลŸkiler varsa: Her iki bakฤฑลŸ aรงฤฑsฤฑnฤฑ da kฤฑsaca รถzetleyin. ร‡eliลŸkiyi aรงฤฑkรงa belirtin ve bunun sorguyla nasฤฑl iliลŸkili olduฤŸunu aรงฤฑklayฤฑn.\n + 8. ร–zet, sorgu tarafฤฑndan aรงฤฑkรงa talep edilmedikรงe 200 kelimeyi aลŸmamalฤฑdฤฑr. EฤŸer gerekli detaylar bu sฤฑnฤฑrฤฑ aลŸarsa, รถncelikli veya hiyerarลŸik bir genel bakฤฑลŸ saฤŸlayฤฑn.\n + + ฤฐlgili Bilgilerin ร‡ฤฑkarฤฑlmasฤฑ:\n + Kullanฤฑcฤฑnฤฑn sorgusunda istenen belirli bilgileri belirlemek iรงin dikkatlice analiz yapฤฑn.\n + DoฤŸruluk iรงin daha yรผksek gรผven seviyelerine sahip baฤŸlamlara รถncelik vererek tรผm ilgili baฤŸlam pencerelerini kullanฤฑn.\n + Sorgu belirli bir dosyayฤฑ referans alฤฑyorsa, yalnฤฑzca belirtilen dosya(lar)dan bilgi รงฤฑkarฤฑn.\n + Sorgu herhangi bir dosya belirtmiyorsa, mevcut tรผm dosyalardan bilgileri birleลŸtirin.\n + BaฤŸlam birden fazla dosyada tutarlฤฑ bilgiler iรงeriyorsa, verileri birleลŸtirin ve tutarlฤฑlฤฑฤŸฤฑ belirtin.\n + BaฤŸlam รงeliลŸkili bilgiler iรงeriyorsa: ร‡eliลŸkileri vurgulayฤฑn, kaynaklarฤฑnฤฑ belirtin ve nasฤฑl farklฤฑlฤฑk gรถsterdiklerini aรงฤฑklayฤฑn.\n + BaฤŸlam benzer veya farklฤฑ bilgiler iรงeriyorsa, farklฤฑlฤฑklarฤฑ veya benzerlikleri รถzetleyin ve bunlarฤฑ sorguyla iliลŸkilendirin.\n + Yanฤฑtฤฑnฤฑzฤฑ daha iyi okunabilirlik iรงin madde iลŸaretleri veya konuya dayalฤฑ bรถlรผmler kullanarak sunun.\n + Netlik ve รถzlรผlรผฤŸe รถncelik verin. KarmaลŸฤฑk sorgular iรงin alt baลŸlฤฑklar veya kategoriler kullanฤฑn.\n + Gerekli bilgi baฤŸlamda bulunmuyorsa, bunu aรงฤฑkรงa belirtin ve mรผmkรผnse รถneriler veya aรงฤฑklamalar sunun.\n + Yanฤฑtta gรผven katsayฤฑsฤฑnฤฑ belirtmeyin.\n + + AลŸaฤŸฤฑdaki formata *kesinlikle* uygun ลŸekilde yanฤฑt verin:\n + + [header]Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik. Maddeler iรงin ลŸu format kullanฤฑlmalฤฑ:\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + [header]DiฤŸer Bรถlรผm Adฤฑ[/header]\n + GerektiฤŸinde [bold]kalฤฑn terimler[/bold] ile iรงerik\n + - Ana madde\n + - Alt madde\n + - Daha alt madde\n + + Kurallar:\n + 1. Her ana bรถlรผm [header]...[/header] ile baลŸlamalฤฑ\n + 2. ร–nemli terimler veya vurgulamalar iรงin [bold]...[/bold] kullanฤฑn\n + 3. Bรถlรผm baลŸlฤฑklarฤฑ ลŸunlardan biri olmalฤฑ: Tanฤฑm, Amaรง, Temel ร–zellikler, ฤฐลŸleyiลŸ, BaฤŸlam\n + 4. Tรผm liste maddeleri iรงin tek tire (-) kullanฤฑn\n + 5. Alt maddelerde tam olarak 2 boลŸluk ile girintileme yapฤฑn\n + 6. Ana bรถlรผmler arasฤฑnda bir boลŸ satฤฑr bฤฑrakฤฑn\n + 7. BaลŸka liste iลŸaretleri kullanmayฤฑn (nokta, sayฤฑ vb.)\n + 8. Yanฤฑt boyunca tutarlฤฑ girintileme kullanฤฑn\n + + BaฤŸlam Pencereleri:\n + {context}\n + + Kullanฤฑcฤฑ Sorgusu:\n + {query}\n + " + + queries: + - id: query_tr_001 + text: " + Gรถrev: Analiz Et, Dรผzelt ve ฤฐlgili Sorular & Cevaplar OluลŸtur.\n + + Talimatlar:\n + Kullanฤฑcฤฑ sorgusu size verilmiลŸtir.\n + ร–ncelikle Kullanฤฑcฤฑ sorusunu kontrol edin. EฤŸer anlamsฤฑzsa, boลŸ bir string '' dรถndรผrรผn. Anlamlฤฑysa, ลŸu iลŸlemleri yapฤฑn:\n + Herhangi bir yazฤฑm veya dilbilgisi hatasฤฑ olup olmadฤฑฤŸฤฑnฤฑ kontrol edin ve dรผzeltilmiลŸ soruyu รงฤฑktฤฑdaki ilk soru olarak dรถndรผrรผn.\n + Ardฤฑndan, DรผzeltmiลŸ soruyla aynฤฑ anlamฤฑ koruyan 3 semantik olarak benzer sorgu oluลŸturun.\n + Orijinal soruyu farklฤฑ aรงฤฑlardan ele alan, ancak yine de ilgili kalan 3 farklฤฑ soru oluลŸturun.\n + Son 3 soruya, her biri 1-2 cรผmlelik kฤฑsa cevaplarla yanฤฑt verin.\n + Ardฤฑndan dรผzeltilmiลŸ kullanฤฑcฤฑ sorgusunu analiz edin ve niyetini belirleyin. Niyet listesi, anahtar kelimeler ve รถrnekler aลŸaฤŸฤฑda verilmiลŸtir. EฤŸer niyet tam olarak anlaลŸฤฑlmaz ise boลŸ bir string '' dรถndรผr.\n + + Olasฤฑ niyetler:\n + 1. Bilgi Edinme: Gerรงek bilgileri, tanฤฑmlarฤฑ veya aรงฤฑklamalarฤฑ รถฤŸrenme talebi.\n + Niyet Anahtar Kelimeleri: Ne, tanฤฑmla, aรงฤฑkla, detaylar, belirt, kim, neden, nasฤฑl.\n + Niyet ร–rnekleri: Bu kuralฤฑ ihlal etmenin cezasฤฑ nedir? โ†’ Bilgilendirme\n + 2. ร–zetleme: KarmaลŸฤฑk bilgilerin kฤฑsa bir รถzetini isteme.\n + Niyet Anahtar Kelimeleri: ร–zetle, genel bakฤฑลŸ, ana noktalar, temel fikirler, kฤฑsa, รถz, basitleลŸtir.\n + Niyet ร–rnekleri: Bu belgenin ana noktalarฤฑnฤฑ รถzetleyebilir misiniz? โ†’ ร–zetleme\n + 3. KarลŸฤฑlaลŸtฤฑrma: Seรงenekleri, yรถntemleri veya teknolojileri deฤŸerlendirme.\n + Niyet Anahtar Kelimeleri: KarลŸฤฑlaลŸtฤฑr, fark, benzerlik, karลŸฤฑlaลŸtฤฑrma, daha iyi, alternatif, artฤฑlar ve eksiler.\n + Niyet ร–rnekleri: Bu iki yรถntemin faydalarฤฑnฤฑ karลŸฤฑlaลŸtฤฑrฤฑn. โ†’ KarลŸฤฑlaลŸtฤฑrma\n + + ร‡ฤฑktฤฑyฤฑ **kesinlikle** ลŸu formatta dรถndรผrรผn:\n + [dรผzeltilmiลŸ sorgu]\n + [birinci semantik olarak benzer sorgu]\n + [ikinci semantik olarak benzer sorgu]\n + [รผรงรผncรผ semantik olarak benzer sorgu]\n + [birinci farklฤฑ-aรงฤฑdan soru]\n + [ikinci farklฤฑ-aรงฤฑdan soru]\n + [รผรงรผncรผ farklฤฑ-aรงฤฑdan soru]\n + [birinci farklฤฑ-aรงฤฑdan cevap]\n + [ikinci farklฤฑ-aรงฤฑdan cevap]\n + [รผรงรผncรผ farklฤฑ-aรงฤฑdan cevap]\n + [kullanฤฑcฤฑ niyeti]\n + + Kullanฤฑcฤฑ Sorgusu: {query}\n + + ร–rnek:\n + Kullanฤฑcฤฑ sorgusu: Retrieval-augmented generation yapay zeka sistemlerinde nasฤฑl รงalฤฑลŸฤฑr?\n + + ร‡ฤฑktฤฑ:\n + Retrieval-augmented generation yapay zeka sistemlerinde nasฤฑl รงalฤฑลŸฤฑr?\n + Retrieval-augmented generation sรผreci yapay zekada nasฤฑl iลŸler?\n + RAG, yapay zeka sistemlerine bilgi getirme ve oluลŸturma konusunda nasฤฑl yardฤฑmcฤฑ olur?\n + Retrieval-augmented generation yapay zeka uygulamalarฤฑnda nasฤฑl iลŸlev gรถrรผr?\n + RAG kullanmanฤฑn yapay zeka iรงin temel avantajlarฤฑ nelerdir?\n + RAG, geleneksel makine รถฤŸrenimi modellerinden nasฤฑl farklฤฑdฤฑr?\n + RAGโ€™in uygulanmasฤฑnda karลŸฤฑlaลŸฤฑlan zorluklar nelerdir?\n + RAG, yapay zekayฤฑ dฤฑลŸ verileri getirerek daha doฤŸru yanฤฑtlar saฤŸlamada geliลŸtirir.\n + RAG, geleneksel modellerden farklฤฑ olarak รงฤฑkarฤฑm sฤฑrasฤฑnda harici bilgilere eriลŸim saฤŸlar.\n + BaลŸlฤฑca zorluklar arasฤฑnda getirme gecikmesi, getirilen verilerin uygunluฤŸu ve bilgilerin gรผncel tutulmasฤฑ yer alฤฑr.\n + Bilgi Edinme\n + + Kullanฤฑcฤฑ sorusu: {query}\n + " + +metadata: + version: "1.0" + description: "Prompt type storages with language groups" \ No newline at end of file diff --git a/doclink/doclink/templates/app.html b/doclink/doclink/templates/app.html new file mode 100644 index 0000000..5dc3cae --- /dev/null +++ b/doclink/doclink/templates/app.html @@ -0,0 +1,409 @@ + + + + + + + + + + + Doclink + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+
+ +

Chat

+ + +
+
+ +
+
+ +
+
+
+
+
+ 0 + Sources +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
+

Resources

+
+
+ +
+
+
+ Document sources and page references will appear here +
+
+ +
+
+
+ +
+ + + + + + + + + +
+
+
+ +
+
No Premium Plan Yet!
+

.

+ +
+
+ + +
+
+
+ +
+
Thank You!
+

Your feedback has been successfully submitted. We appreciate your help in making Doclink better!

+ +
+
+ +
+
+
+ +
+
Log out of Doclink?
+

You can always log back in at any time.

+
+ + +
+
+
+ + + + + + + + + + + diff --git a/doclink/doclink/templates/index.html b/doclink/doclink/templates/index.html new file mode 100644 index 0000000..d539af1 --- /dev/null +++ b/doclink/doclink/templates/index.html @@ -0,0 +1,19 @@ + + + + + Doclink - Sign In + + + +
+

Welcome to Doclink

+

Please sign in to continue

+ + + + +
+ + + diff --git a/doclink/doclink/tests/__init__.py b/doclink/doclink/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/doclink/tests/test_redis_connection.py b/doclink/doclink/tests/test_redis_connection.py new file mode 100644 index 0000000..59d921e --- /dev/null +++ b/doclink/doclink/tests/test_redis_connection.py @@ -0,0 +1,124 @@ +# tests/integration/test_redis_connection.py +import pytest +from app.redis_manager import RedisManager +import numpy as np + + +class TestRedisConnection: + @pytest.fixture(scope="class") + def redis_manager(self): + """Fixture to provide Redis manager instance""" + return RedisManager() + + @pytest.fixture(scope="function") + def cleanup(self, redis_manager): + """Fixture to cleanup after each test""" + yield + test_keys = redis_manager.client.keys("test:*") + if test_keys: + redis_manager.client.delete(*test_keys) + + def test_connection(self, redis_manager): + """Test basic Redis connection""" + assert redis_manager.is_connected(), "Redis connection failed" + + def test_basic_operations(self, redis_manager, cleanup): + """Test basic Redis operations with simple data""" + test_data = {"string": "value", "number": 42} + + # Test set operation + assert redis_manager.set_data("test:basic", test_data), "Failed to set data" + + # Test get operation + retrieved_data = redis_manager.get_data("test:basic") + assert retrieved_data == test_data, "Retrieved data doesn't match original" + + # Test delete operation + assert redis_manager.delete_data("test:basic"), "Failed to delete data" + assert ( + redis_manager.get_data("test:basic") is None + ), "Data still exists after deletion" + + def test_complex_data_operations(self, redis_manager, cleanup): + """Test Redis operations with complex data structures""" + test_data = { + "array": np.array([1, 2, 3]), + "nested": {"dict": {"a": 1}, "list": [1, 2, 3], "tuple": (4, 5, 6)}, + } + + # Test set operation + assert redis_manager.set_data( + "test:complex", test_data + ), "Failed to set complex data" + + # Test get operation + retrieved_data = redis_manager.get_data("test:complex") + assert isinstance( + retrieved_data["array"], np.ndarray + ), "NumPy array not preserved" + assert np.array_equal( + retrieved_data["array"], test_data["array"] + ), "NumPy array data mismatch" + assert ( + retrieved_data["nested"] == test_data["nested"] + ), "Nested structure mismatch" + + def test_expiry(self, redis_manager, cleanup): + """Test data expiration""" + import time + + test_data = {"test": "value"} + + # Set data with 1 second expiry + assert redis_manager.set_data( + "test:expiry", test_data, expiry=1 + ), "Failed to set data with expiry" + + # Verify data exists + assert ( + redis_manager.get_data("test:expiry") is not None + ), "Data not set properly" + + # Wait for expiration + time.sleep(1.1) + + # Verify data has expired + assert redis_manager.get_data("test:expiry") is None, "Data did not expire" + + def test_concurrent_access(self, redis_manager, cleanup): + """Test concurrent access to Redis""" + import threading + + def worker(worker_id: int): + for i in range(10): + key = f"test:concurrent:{worker_id}:{i}" + data = {"worker": worker_id, "iteration": i} + assert redis_manager.set_data(key, data) + retrieved = redis_manager.get_data(key) + assert retrieved == data + + threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] + for t in threads: + t.start() + for t in threads: + t.join() + + def test_performance(self, redis_manager, cleanup): + """Test performance of Redis operations""" + import time + + # Test write performance + start_time = time.time() + for i in range(1000): + redis_manager.set_data(f"test:perf:write:{i}", {"data": i}) + write_time = time.time() - start_time + + # Test read performance + start_time = time.time() + for i in range(1000): + redis_manager.get_data(f"test:perf:write:{i}") + read_time = time.time() - start_time + + # Assert reasonable performance (adjust thresholds as needed) + assert write_time < 5.0, f"Write performance too slow: {write_time:.2f}s" + assert read_time < 5.0, f"Read performance too slow: {read_time:.2f}s" diff --git a/doclink/filelist.txt b/doclink/filelist.txt new file mode 100644 index 0000000..fbc9c9f --- /dev/null +++ b/doclink/filelist.txt @@ -0,0 +1,28 @@ +./app/functions/chatbot_functions.py +./app/functions/scraping_functions.py +./app/functions/embedding_functions.py +./app/functions/indexing_functions.py +./app/functions/reading_functions.py +./app/functions/export_functions.py +./app/test_db_conn.py +./app/main_dev.py +./app/api/core.py +./app/api/endpoints.py +./app/db/database.ini +./app/db/sql/database_reset.sql +./app/db/sql/table_initialize.sql +./app/db/database.py +./app/db/config.py +./app/static/favicon/site.webmanifest +./app/static/js/app-api.js +./app/static/js/app.js +./app/static/css/app.css +./app/redis_manager.py +./app/utils/prompts.yaml +./app/main_prod.py +./.env +./templates/bkup_app.html +./templates/app.html +./templates/index.html +./test_user_info.sh +./tests/test_redis_connection.py diff --git a/doclink/hold/README.md b/doclink/hold/README.md new file mode 100644 index 0000000..6f06d0c --- /dev/null +++ b/doclink/hold/README.md @@ -0,0 +1,109 @@ +# ๐Ÿ”— Doclink.io +Doclink is an AI document assistant that transforms how you interact with your documents. Upload your files, create custom folders, and ask questions to quickly retrieve relevant information across your entire document collection. Doclink connects related information between documents, making complex data analysis simple and intuitive. +We're on the early stage. And want to help everyone on their information processing. Thus, you can use doclink completely for free plus all of our implementation is open source. + +## โœจ Features + +- **๐Ÿ“Š Custom Knowledge Bases**: Create and organize multiple document collections for different topics or projects +- **๐Ÿ“‘ Multi-Format Support**: Upload and analyze PDF, DOCX, XLSX, PPTX, TXT, and web content +- **๐Ÿ” Intelligent Search**: Ask questions in natural language and get precise answers from your documents +- **๐Ÿง  Context-Aware Responses**: AI understands the relationships between your documents for comprehensive answers +- **๐Ÿ“Œ Source Citations**: Every answer includes references to specific document sources for easy verification +- **๐ŸŒ Web Interface**: Intuitive, responsive design works across all devices +- **๐Ÿ”’ Secure Authentication**: Google authentication ensures your document library remains private + +## ๐Ÿš€ Get Started + +1. **Sign Up**: Create an account using your google account on doclink.io +2. **Create a Folder**: Organize your documents into custom folders +3. **Upload Documents**: Add PDFs, Word documents, excel tables, and more +4. **Ask Questions**: Just ask to get information +5. **Analyze Responses**: Review AI-generated answers with source references +6. **Export Insights**: Save and share your findings + +# ๐Ÿ› ๏ธ Tech Stack + +We have a very lean tech stack. We mostly trust our from scratch RAG implementation and RAG understanding. On every benchmark, we have 95% relevancy level on our answers. +We're not very experienced web developers. But we trust our AI & RAG implementation. + +## ๐Ÿ–ฅ๏ธ Frontend +- Next.js +- Bootstrap & Custom CSS +- JavaScript + +## ๐Ÿ”ง Backend +- FastAPI +- PostgreSQL +- Redis + +## ๐Ÿง  AI & RAG +- OpenAI: Embeddings and answer generation +- FAISS: Semantic search + +## ๐Ÿ“ Document Processing +- PyMuPDF/Fitz: PDF processing and content extraction +- Docx/XLSX Processing: Support for Microsoft Office document formats +- Web Scraping: Ability to process and index web content + +# ๐Ÿ” RAG Implementation + +## ๐Ÿ“Š Relational Database Approach + +Doclink implements a custom Retrieval-Augmented Generation (RAG) system using PostgreSQL rather than specialized vector databases. This unique approach offers several advantages: + +- **๐Ÿงฉ Simplicity**: Using a single PostgreSQL database for both document metadata and embeddings simplifies the architecture and maintenance +- **๐Ÿ’ฐ Cost Efficiency**: Eliminates the need for additional vector database services or infrastructure +- **โš™๏ธ Flexibility**: Allows for complex queries that combine traditional SQL filtering with vector similarity search + +## ๐Ÿ—๏ธ How It Works + +Our RAG implementation functions through several key components: + +1. **๐Ÿ“„ Document Processing**: Documents are processed, split into meaningful chunks, and transformed into embeddings using OpenAI's embedding models +2. **๐Ÿ’พ Storage**: These embeddings are stored in PostgreSQL using the `BYTEA` data type, alongside document metadata and user information +3. **๐Ÿ”Ž Retrieval**: When a query is submitted, it's converted to an embedding and similarity search is performed against stored document embeddings +4. **๐Ÿง  Context Building**: The most relevant document chunks are assembled into a context window using custom logic that considers: + - Semantic relevance scores + - Document structure (headers, paragraphs, tables) + - User-selected file filters +5. **โœ๏ธ Response Generation**: The retrieved context is sent to the language model along with the original query to generate accurate, contextually relevant responses + +## ๐Ÿ” Security Layer + +Unlike many RAG implementations, Doclink adds an encryption layer to stored document content: + +- **๐Ÿ”’ AES-GCM Encryption**: Document content is encrypted before storage, with each file having a unique authentication tag +- **๐Ÿ”‘ Secure Decryption**: Content is only decrypted when needed for response generation +- **๐Ÿ›ก๏ธ Privacy Preservation**: Original document content remains protected even if the database is compromised + +This approach combines the power of modern vector search techniques with the reliability and familiarity of relational databases, creating a robust, secure, and maintainable RAG system. + +This architecture enables Doclink to securely handle document processing, embedding generation, and sophisticated question-answering capabilities while maintaining a responsive user experience. + +# ๐Ÿ‘ฅ Contributing + +We welcome contributions to Doclink! If you need a specific update, please open an issue we will be on it. +If you want to be part of our team, please reach us. + +# ๐Ÿ™ Acknowledgments + +Doclink stands on the shoulders of giants. We'd like to acknowledge the following projects and libraries that make our work possible: + +- **OpenAI** - For their powerful language models and embeddings +- **PyMuPDF (Fitz)** - Document processing library, licensed under GNU GPL v3 +- **FAISS** - Efficient similarity search library from Facebook Research +- **FastAPI** - Modern, fast web framework for building APIs +- **PostgreSQL** - Robust, open-source relational database +- **Next.js** - React framework for production-grade web applications +- **Spacy** - Industrial-strength natural language processing +- **Redis** - In-memory data structure store +- **Bootstrap** - Front-end framework for responsive web design + +Special thanks to: +- All contributors who have invested their time and expertise +- The open-source community for continued inspiration and support +- Our users for valuable feedback and suggestions + +# ๐Ÿ“œ License + +Doclink is released under the MIT License. diff --git a/doclink/hold/requirements.txt b/doclink/hold/requirements.txt new file mode 100644 index 0000000..153a0e3 --- /dev/null +++ b/doclink/hold/requirements.txt @@ -0,0 +1,194 @@ +annotated-types==0.7.0 +anyio==4.6.2.post1 +appdirs==1.4.4 +async-timeout==5.0.1 +attrs==24.2.0 +autoflake==2.3.1 +bcrypt==4.2.0 +beautifulsoup4==4.12.3 +blis==0.7.11 +bs4==0.0.2 +cachetools==5.5.0 +catalogue==2.0.10 +certifi==2024.8.30 +cffi==1.17.1 +chardet==5.2.0 +charset-normalizer==3.4.0 +click==8.1.7 +cloudpathlib==0.20.0 +confection==0.1.5 +cryptography==44.0.0 +cssselect==1.2.0 +cymem==2.0.8 +deepsearch-glm==1.0.0 +dill==0.3.9 +distro==1.9.0 +docling==2.10.0 +docling-core==2.9.0 +docling-ibm-models==2.0.7 +docling-parse==3.0.0 +easyocr==1.7.2 +ecdsa==0.19.0 +en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1-py3-none-any.whl#sha256=86cc141f63942d4b2c5fcee06630fd6f904788d2f0ab005cce45aadb8fb73889 +et_xmlfile==2.0.0 +exceptiongroup==1.2.2 +faiss-cpu==1.8.0.post1 +fake-useragent==2.0.3 +fastapi==0.112.1 +filelock==3.16.1 +filetype==1.2.0 +fsspec==2024.10.0 +google-api-core==2.24.1 +google-api-python-client==2.160.0 +google-auth==2.37.0 +google-auth-httplib2==0.2.0 +google-auth-oauthlib==1.2.1 +googleapis-common-protos==1.66.0 +h11==0.14.0 +httpcore==1.0.6 +httplib2==0.22.0 +httpx==0.27.2 +huggingface-hub==0.26.5 +idna==3.10 +imageio==2.36.1 +importlib_metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +Jinja2==3.1.4 +jiter==0.6.1 +jsonlines==3.1.0 +jsonpatch==1.33 +jsonpointer==3.0.0 +jsonref==1.1.0 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 +jwt==1.3.1 +langchain-core==0.3.21 +langchain-text-splitters==0.3.2 +langcodes==3.4.1 +langdetect==1.0.9 +langsmith==0.1.145 +language_data==1.2.0 +lazy_loader==0.4 +lxml==5.3.0 +lxml_html_clean==0.4.1 +marisa-trie==1.2.1 +markdown-it-py==3.0.0 +marko==2.1.2 +MarkupSafe==3.0.2 +mdurl==0.1.2 +mpire==2.10.2 +mpmath==1.3.0 +multiprocess==0.70.17 +murmurhash==1.0.10 +networkx==3.4.2 +ninja==1.11.1.2 +numpy==1.26.4 +nvidia-cublas-cu12==12.4.5.8 +nvidia-cuda-cupti-cu12==12.4.127 +nvidia-cuda-nvrtc-cu12==12.4.127 +nvidia-cuda-runtime-cu12==12.4.127 +nvidia-cudnn-cu12==9.1.0.70 +nvidia-cufft-cu12==11.2.1.3 +nvidia-curand-cu12==10.3.5.147 +nvidia-cusolver-cu12==11.6.1.9 +nvidia-cusparse-cu12==12.3.1.170 +nvidia-nccl-cu12==2.21.5 +nvidia-nvjitlink-cu12==12.4.127 +nvidia-nvtx-cu12==12.4.127 +oauthlib==3.2.2 +openai==1.41.1 +opencv-python-headless==4.10.0.84 +openpyxl==3.1.5 +orjson==3.10.12 +packaging==24.1 +pandas==2.2.3 +parse==1.20.2 +pillow==10.4.0 +pluggy==1.5.0 +preshed==3.0.9 +proto-plus==1.26.0 +protobuf==5.29.3 +psycopg2-binary==2.9.9 +pyasn1==0.6.1 +pyasn1_modules==0.4.1 +pyclipper==1.3.0.post6 +pycparser==2.22 +pydantic==2.9.2 +pydantic-settings==2.6.1 +pydantic_core==2.23.4 +pyee==11.1.1 +pyflakes==3.2.0 +Pygments==2.18.0 +PyJWT==2.10.1 +PyMuPDF==1.24.11 +pymupdf4llm==0.0.17 +pyparsing==3.2.1 +PyPDF2==3.0.1 +pypdfium2==4.30.0 +pyppeteer==2.0.0 +pyquery==2.0.1 +pytest==8.3.3 +python-bidi==0.6.3 +python-dateutil==2.9.0.post0 +python-docx==1.1.2 +python-dotenv==1.0.1 +python-jose==3.3.0 +python-multipart==0.0.9 +python-pptx==1.0.2 +pytz==2024.2 +PyYAML==6.0.2 +ratelimit==2.2.1 +redis==5.2.0 +referencing==0.35.1 +regex==2024.11.6 +reportlab==4.3.1 +requests==2.32.3 +requests-html==0.10.0 +requests-oauthlib==2.0.0 +requests-toolbelt==1.0.0 +rich==13.9.3 +rpds-py==0.22.3 +rsa==4.9 +Rtree==1.3.0 +safetensors==0.4.5 +scikit-image==0.24.0 +scipy==1.14.1 +semchunk==2.2.0 +shapely==2.0.6 +shellingham==1.5.4 +six==1.16.0 +smart-open==7.0.5 +sniffio==1.3.1 +soupsieve==2.6 +spacy==3.7.6 +spacy-legacy==3.0.12 +spacy-loggers==1.0.5 +srsly==2.4.8 +starlette==0.38.6 +sympy==1.13.1 +tabulate==0.9.0 +tenacity==9.0.0 +thinc==8.2.5 +tifffile==2024.9.20 +tokenizers==0.21.0 +tomli==2.1.0 +torch==2.5.1 +torchvision==0.20.1 +tqdm==4.66.5 +transformers==4.47.0 +triton==3.1.0 +typer==0.12.5 +typing_extensions==4.12.2 +tzdata==2024.2 +uritemplate==4.1.1 +urllib3==1.26.20 +uvicorn==0.30.6 +validators==0.34.0 +w3lib==2.3.1 +wasabi==1.1.3 +weasel==0.4.1 +websockets==10.4 +wrapt==1.16.0 +XlsxWriter==3.2.0 +zipp==3.21.0 diff --git a/doclink/licence.md b/doclink/licence.md new file mode 100644 index 0000000..b8b7bdb --- /dev/null +++ b/doclink/licence.md @@ -0,0 +1,17 @@ +MIT License +Copyright (c) 2025 Doclink +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doclink/recreate_ai_files.sh b/doclink/recreate_ai_files.sh new file mode 100755 index 0000000..b408d88 --- /dev/null +++ b/doclink/recreate_ai_files.sh @@ -0,0 +1,3 @@ +#!/bin/sh +~/bin/cat_doclink_files.sh > ai_files.txt +~/bin/cat_skipped_doclink_files.sh > ai_skipped_files.txt diff --git a/doclink/requirements.txt b/doclink/requirements.txt new file mode 100644 index 0000000..153a0e3 --- /dev/null +++ b/doclink/requirements.txt @@ -0,0 +1,194 @@ +annotated-types==0.7.0 +anyio==4.6.2.post1 +appdirs==1.4.4 +async-timeout==5.0.1 +attrs==24.2.0 +autoflake==2.3.1 +bcrypt==4.2.0 +beautifulsoup4==4.12.3 +blis==0.7.11 +bs4==0.0.2 +cachetools==5.5.0 +catalogue==2.0.10 +certifi==2024.8.30 +cffi==1.17.1 +chardet==5.2.0 +charset-normalizer==3.4.0 +click==8.1.7 +cloudpathlib==0.20.0 +confection==0.1.5 +cryptography==44.0.0 +cssselect==1.2.0 +cymem==2.0.8 +deepsearch-glm==1.0.0 +dill==0.3.9 +distro==1.9.0 +docling==2.10.0 +docling-core==2.9.0 +docling-ibm-models==2.0.7 +docling-parse==3.0.0 +easyocr==1.7.2 +ecdsa==0.19.0 +en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1-py3-none-any.whl#sha256=86cc141f63942d4b2c5fcee06630fd6f904788d2f0ab005cce45aadb8fb73889 +et_xmlfile==2.0.0 +exceptiongroup==1.2.2 +faiss-cpu==1.8.0.post1 +fake-useragent==2.0.3 +fastapi==0.112.1 +filelock==3.16.1 +filetype==1.2.0 +fsspec==2024.10.0 +google-api-core==2.24.1 +google-api-python-client==2.160.0 +google-auth==2.37.0 +google-auth-httplib2==0.2.0 +google-auth-oauthlib==1.2.1 +googleapis-common-protos==1.66.0 +h11==0.14.0 +httpcore==1.0.6 +httplib2==0.22.0 +httpx==0.27.2 +huggingface-hub==0.26.5 +idna==3.10 +imageio==2.36.1 +importlib_metadata==8.6.1 +iniconfig==2.0.0 +itsdangerous==2.2.0 +Jinja2==3.1.4 +jiter==0.6.1 +jsonlines==3.1.0 +jsonpatch==1.33 +jsonpointer==3.0.0 +jsonref==1.1.0 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 +jwt==1.3.1 +langchain-core==0.3.21 +langchain-text-splitters==0.3.2 +langcodes==3.4.1 +langdetect==1.0.9 +langsmith==0.1.145 +language_data==1.2.0 +lazy_loader==0.4 +lxml==5.3.0 +lxml_html_clean==0.4.1 +marisa-trie==1.2.1 +markdown-it-py==3.0.0 +marko==2.1.2 +MarkupSafe==3.0.2 +mdurl==0.1.2 +mpire==2.10.2 +mpmath==1.3.0 +multiprocess==0.70.17 +murmurhash==1.0.10 +networkx==3.4.2 +ninja==1.11.1.2 +numpy==1.26.4 +nvidia-cublas-cu12==12.4.5.8 +nvidia-cuda-cupti-cu12==12.4.127 +nvidia-cuda-nvrtc-cu12==12.4.127 +nvidia-cuda-runtime-cu12==12.4.127 +nvidia-cudnn-cu12==9.1.0.70 +nvidia-cufft-cu12==11.2.1.3 +nvidia-curand-cu12==10.3.5.147 +nvidia-cusolver-cu12==11.6.1.9 +nvidia-cusparse-cu12==12.3.1.170 +nvidia-nccl-cu12==2.21.5 +nvidia-nvjitlink-cu12==12.4.127 +nvidia-nvtx-cu12==12.4.127 +oauthlib==3.2.2 +openai==1.41.1 +opencv-python-headless==4.10.0.84 +openpyxl==3.1.5 +orjson==3.10.12 +packaging==24.1 +pandas==2.2.3 +parse==1.20.2 +pillow==10.4.0 +pluggy==1.5.0 +preshed==3.0.9 +proto-plus==1.26.0 +protobuf==5.29.3 +psycopg2-binary==2.9.9 +pyasn1==0.6.1 +pyasn1_modules==0.4.1 +pyclipper==1.3.0.post6 +pycparser==2.22 +pydantic==2.9.2 +pydantic-settings==2.6.1 +pydantic_core==2.23.4 +pyee==11.1.1 +pyflakes==3.2.0 +Pygments==2.18.0 +PyJWT==2.10.1 +PyMuPDF==1.24.11 +pymupdf4llm==0.0.17 +pyparsing==3.2.1 +PyPDF2==3.0.1 +pypdfium2==4.30.0 +pyppeteer==2.0.0 +pyquery==2.0.1 +pytest==8.3.3 +python-bidi==0.6.3 +python-dateutil==2.9.0.post0 +python-docx==1.1.2 +python-dotenv==1.0.1 +python-jose==3.3.0 +python-multipart==0.0.9 +python-pptx==1.0.2 +pytz==2024.2 +PyYAML==6.0.2 +ratelimit==2.2.1 +redis==5.2.0 +referencing==0.35.1 +regex==2024.11.6 +reportlab==4.3.1 +requests==2.32.3 +requests-html==0.10.0 +requests-oauthlib==2.0.0 +requests-toolbelt==1.0.0 +rich==13.9.3 +rpds-py==0.22.3 +rsa==4.9 +Rtree==1.3.0 +safetensors==0.4.5 +scikit-image==0.24.0 +scipy==1.14.1 +semchunk==2.2.0 +shapely==2.0.6 +shellingham==1.5.4 +six==1.16.0 +smart-open==7.0.5 +sniffio==1.3.1 +soupsieve==2.6 +spacy==3.7.6 +spacy-legacy==3.0.12 +spacy-loggers==1.0.5 +srsly==2.4.8 +starlette==0.38.6 +sympy==1.13.1 +tabulate==0.9.0 +tenacity==9.0.0 +thinc==8.2.5 +tifffile==2024.9.20 +tokenizers==0.21.0 +tomli==2.1.0 +torch==2.5.1 +torchvision==0.20.1 +tqdm==4.66.5 +transformers==4.47.0 +triton==3.1.0 +typer==0.12.5 +typing_extensions==4.12.2 +tzdata==2024.2 +uritemplate==4.1.1 +urllib3==1.26.20 +uvicorn==0.30.6 +validators==0.34.0 +w3lib==2.3.1 +wasabi==1.1.3 +weasel==0.4.1 +websockets==10.4 +wrapt==1.16.0 +XlsxWriter==3.2.0 +zipp==3.21.0 diff --git a/doclink/templates/app.html b/doclink/templates/app.html new file mode 100644 index 0000000..ab72374 --- /dev/null +++ b/doclink/templates/app.html @@ -0,0 +1,409 @@ + + + + + + + + + + + Doclink + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+
+ +

Chat

+ + +
+
+ +
+
+ +
+
+
+
+
+ 0 + Sources +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
+

Resources

+
+
+ +
+
+
+ Document sources and page references will appear here +
+
+ +
+
+
+ +
+ + + + + + + + + +
+
+
+ +
+
No Premium Plan Yet!
+

We don't have a premium plan yet. You can you Doclink for free! Just don't forget to send us your feedbacks!

+ +
+
+ + +
+
+
+ +
+
Thank You!
+

Your feedback has been successfully submitted. We appreciate your help in making Doclink better!

+ +
+
+ +
+
+
+ +
+
Log out of Doclink?
+

You can always log back in at any time.

+
+ + +
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/doclink/tests/__init__.py b/doclink/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/doclink/tests/test_redis_connection.py b/doclink/tests/test_redis_connection.py new file mode 100644 index 0000000..59d921e --- /dev/null +++ b/doclink/tests/test_redis_connection.py @@ -0,0 +1,124 @@ +# tests/integration/test_redis_connection.py +import pytest +from app.redis_manager import RedisManager +import numpy as np + + +class TestRedisConnection: + @pytest.fixture(scope="class") + def redis_manager(self): + """Fixture to provide Redis manager instance""" + return RedisManager() + + @pytest.fixture(scope="function") + def cleanup(self, redis_manager): + """Fixture to cleanup after each test""" + yield + test_keys = redis_manager.client.keys("test:*") + if test_keys: + redis_manager.client.delete(*test_keys) + + def test_connection(self, redis_manager): + """Test basic Redis connection""" + assert redis_manager.is_connected(), "Redis connection failed" + + def test_basic_operations(self, redis_manager, cleanup): + """Test basic Redis operations with simple data""" + test_data = {"string": "value", "number": 42} + + # Test set operation + assert redis_manager.set_data("test:basic", test_data), "Failed to set data" + + # Test get operation + retrieved_data = redis_manager.get_data("test:basic") + assert retrieved_data == test_data, "Retrieved data doesn't match original" + + # Test delete operation + assert redis_manager.delete_data("test:basic"), "Failed to delete data" + assert ( + redis_manager.get_data("test:basic") is None + ), "Data still exists after deletion" + + def test_complex_data_operations(self, redis_manager, cleanup): + """Test Redis operations with complex data structures""" + test_data = { + "array": np.array([1, 2, 3]), + "nested": {"dict": {"a": 1}, "list": [1, 2, 3], "tuple": (4, 5, 6)}, + } + + # Test set operation + assert redis_manager.set_data( + "test:complex", test_data + ), "Failed to set complex data" + + # Test get operation + retrieved_data = redis_manager.get_data("test:complex") + assert isinstance( + retrieved_data["array"], np.ndarray + ), "NumPy array not preserved" + assert np.array_equal( + retrieved_data["array"], test_data["array"] + ), "NumPy array data mismatch" + assert ( + retrieved_data["nested"] == test_data["nested"] + ), "Nested structure mismatch" + + def test_expiry(self, redis_manager, cleanup): + """Test data expiration""" + import time + + test_data = {"test": "value"} + + # Set data with 1 second expiry + assert redis_manager.set_data( + "test:expiry", test_data, expiry=1 + ), "Failed to set data with expiry" + + # Verify data exists + assert ( + redis_manager.get_data("test:expiry") is not None + ), "Data not set properly" + + # Wait for expiration + time.sleep(1.1) + + # Verify data has expired + assert redis_manager.get_data("test:expiry") is None, "Data did not expire" + + def test_concurrent_access(self, redis_manager, cleanup): + """Test concurrent access to Redis""" + import threading + + def worker(worker_id: int): + for i in range(10): + key = f"test:concurrent:{worker_id}:{i}" + data = {"worker": worker_id, "iteration": i} + assert redis_manager.set_data(key, data) + retrieved = redis_manager.get_data(key) + assert retrieved == data + + threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)] + for t in threads: + t.start() + for t in threads: + t.join() + + def test_performance(self, redis_manager, cleanup): + """Test performance of Redis operations""" + import time + + # Test write performance + start_time = time.time() + for i in range(1000): + redis_manager.set_data(f"test:perf:write:{i}", {"data": i}) + write_time = time.time() - start_time + + # Test read performance + start_time = time.time() + for i in range(1000): + redis_manager.get_data(f"test:perf:write:{i}") + read_time = time.time() - start_time + + # Assert reasonable performance (adjust thresholds as needed) + assert write_time < 5.0, f"Write performance too slow: {write_time:.2f}s" + assert read_time < 5.0, f"Read performance too slow: {read_time:.2f}s" diff --git a/intelaide-backend/config/db.js b/intelaide-backend/config/db.js new file mode 100644 index 0000000..ce5f1ca --- /dev/null +++ b/intelaide-backend/config/db.js @@ -0,0 +1,12 @@ +import mysql from 'mysql2/promise'; +import dotenv from 'dotenv'; +dotenv.config(); + +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, +}); + +export default pool; diff --git a/intelaide-backend/controllers/assistantController.js b/intelaide-backend/controllers/assistantController.js new file mode 100644 index 0000000..2b14244 --- /dev/null +++ b/intelaide-backend/controllers/assistantController.js @@ -0,0 +1,155 @@ +// backend/controllers/assistantController.js +import pool from '../config/db.js'; + +export const createAssistant = async (req, res) => { + const { assistant_name } = req.body; + const user_id = req.userId; // Extracted from auth middleware + + if (!assistant_name) { + return res.status(400).json({ message: 'Assistant name is required' }); + } + + try { + const [result] = await pool.execute( + 'INSERT INTO ai_assistants (user_id, assistant_name) VALUES (?, ?)', + [user_id, assistant_name] + ); + res.status(201).json({ id: result.insertId, message: 'Assistant created successfully' }); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + +export const getAssistantById = async (req, res) => { + const { id } = req.params; + const user_id = req.userId; // comes from auth middleware + try { + const [rows] = await pool.execute( + 'SELECT id, assistant_name, created_at FROM ai_assistants WHERE id = ? AND user_id = ?', + [id, user_id] + ); + if (rows.length === 0) { + return res.status(404).json({ message: 'Assistant not found' }); + } + res.json(rows[0]); + } catch (error) { + console.error('Error retrieving assistant:', error); + res.status(500).json({ message: 'Error retrieving assistant. Please try again later.' }); + } +}; + +export const getAssistants = async (req, res) => { + const user_id = req.userId; + try { + const [assistants] = await pool.execute( + 'SELECT id, assistant_name, created_at FROM ai_assistants WHERE user_id = ?', + [user_id] + ); + res.json(assistants); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + +export const deleteAssistant = async (req, res) => { + const { id } = req.params; + const user_id = req.userId; + try { + const [result] = await pool.execute( + 'DELETE FROM ai_assistants WHERE id = ? AND user_id = ?', + [id, user_id] + ); + if (result.affectedRows === 0) { + return res.status(404).json({ message: 'Assistant not found or unauthorized' }); + } + res.json({ message: 'Assistant deleted successfully' }); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + +export const assignFileToAssistant = async (req, res) => { + const { assistantId, fileId } = req.params; + const user_id = req.userId; + try { + const [existingAssignment] = await pool.execute( + 'SELECT * FROM assistant_files WHERE assistant_id = ? AND file_id = ?', + [assistantId, fileId] + ); + if (existingAssignment.length > 0) { + return res.status(400).json({ message: 'File is already assigned to this assistant' }); + } + await pool.execute( + 'INSERT INTO assistant_files (assistant_id, file_id) VALUES (?, ?)', + [assistantId, fileId] + ); + res.json({ message: 'File assigned to assistant successfully' }); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + +export const getFilesByAssistant = async (req, res) => { + const { assistantId } = req.params; + const user_id = req.userId; + try { + const [files] = await pool.execute( + `SELECT f.id, f.file_name, f.file_path, f.file_type, f.status + FROM assistant_files af + JOIN files f ON af.file_id = f.id + WHERE af.assistant_id = ? AND f.user_id = ?`, + [assistantId, user_id] + ); + if (files.length === 0) { + return res.json([]); // Return an empty array + } + res.json(files); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + +export const assignMultipleFilesToAssistant = async (req, res) => { + const { assistantId } = req.params; + const { fileIds } = req.body; // Expect an array of file IDs + + if (!fileIds || !Array.isArray(fileIds) || fileIds.length === 0) { + return res.status(400).json({ message: 'No files selected' }); + } + + try { + for (let fileId of fileIds) { + await pool.execute( + 'INSERT INTO assistant_files (assistant_id, file_id) VALUES (?, ?)', + [assistantId, fileId] + ); + } + res.json({ message: 'Files assigned successfully' }); + } catch (error) { + console.error('Error assigning files:', error); + res.status(500).json({ message: 'Database error. Please try again.' }); + } +}; + +export const removeFileFromAssistant = async (req, res) => { + const { assistantId, fileId } = req.params; + try { + const [result] = await pool.execute( + 'DELETE FROM assistant_files WHERE assistant_id = ? AND file_id = ?', + [assistantId, fileId] + ); + if (result.affectedRows === 0) { + return res.status(404).json({ message: 'File not found in assistant or unauthorized' }); + } + res.json({ message: 'File removed from assistant successfully' }); + } catch (error) { + console.error('Database Error:', error); + res.status(500).json({ message: 'An unexpected error occurred. Please try again.' }); + } +}; + diff --git a/intelaide-backend/controllers/authController.js b/intelaide-backend/controllers/authController.js new file mode 100644 index 0000000..b41d9e5 --- /dev/null +++ b/intelaide-backend/controllers/authController.js @@ -0,0 +1,70 @@ +// backend/controllers/authController.js +import jwt from 'jsonwebtoken'; +import bcrypt from 'bcryptjs'; +import User from '../models/User.js'; + +export const register = async (req, res) => { + const { email, password, first_name, last_name, organization, address, city, state, zip_code, phone } = req.body; + // Input validation + if (!email || !password || !first_name || !last_name) { + return res.status(400).json({ message: 'Required fields are missing' }); + } + try { + // Check for existing user by email + const existingUser = await User.findByEmail(email); + if (existingUser) { + return res.status(400).json({ message: 'Email is already registered' }); + } + // Hash the password before storing it + const password_hash = await bcrypt.hash(password, 10); + // Prepare user data for insertion + const userData = { + email, + password_hash, + organization: organization || null, + first_name, + last_name, + address: address || null, + city: city || null, + state: state || null, + zip_code: zip_code || null, + phone: phone || null, + }; + // Insert user into database + await User.createUser(userData); + res.status(201).json({ message: 'User registered successfully' }); + } catch (error) { + console.error('Error registering user:', error.sqlMessage || error.message); + res.status(500).json({ message: 'Error registering user. Please try again later.' }); + } +}; + +export const login = async (req, res) => { + const { email, password } = req.body; + if (!email || !password) { + return res.status(400).json({ message: 'Email and password are required' }); + } + try { + // Find user by email + const user = await User.findByEmail(email); + if (!user) { + return res.status(401).json({ message: 'Invalid credentials' }); + } + // Compare passwords + const isMatch = await bcrypt.compare(password, user.password_hash); + if (!isMatch) { + return res.status(401).json({ message: 'Invalid credentials' }); + } + // Generate JWT token + const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN || '1h' }); + res.json({ + token, + expiresIn: 3600, + message: 'Login successful', + }); + } catch (error) { + console.error('Error logging in user:', error); + res.status(500).json({ message: 'Error logging in. Please try again later.' }); + } +}; + diff --git a/intelaide-backend/controllers/embeddingController.js b/intelaide-backend/controllers/embeddingController.js new file mode 100644 index 0000000..9138f8d --- /dev/null +++ b/intelaide-backend/controllers/embeddingController.js @@ -0,0 +1,86 @@ +// backend/controllers/embeddingController.js +import { spawn } from 'child_process'; +import path from 'path'; +import fs from 'fs'; +import pool from '../config/db.js'; + +export const generateEmbeddings = async (req, res) => { + const { assistantId } = req.params; + const userId = req.userId; + + try { + // Retrieve file paths assigned to this assistant for the current user. + const [filesResult] = await pool.execute( + `SELECT f.file_path + FROM assistant_files af + JOIN files f ON af.file_id = f.id + WHERE af.assistant_id = ? AND f.user_id = ?`, + [assistantId, userId] + ); + + if (filesResult.length === 0) { + return res.status(400).json({ message: 'No files assigned to this assistant' }); + } + + // Create a directory for the assistantโ€™s FAISS index: + // e.g., documents/user_{userId}/assistant_{assistantId} + const indexDir = path.join(process.cwd(), 'documents', `user_${userId}`, `assistant_${assistantId}`); + fs.mkdirSync(indexDir, { recursive: true }); + + // Define the output index file path (e.g., faiss_index.bin). + const outputPath = path.join(indexDir, 'faiss_index.bin'); + + // Prepare an array of file paths to pass to the Python script. + const filePaths = filesResult.map(row => row.file_path); + + // Define the full path to the Python executable inside your venv. + const pythonExecutable = "/root/intelaide-backend/python/bin/python3"; + + // Build the full path to the generate_embeddings.py script. + const pythonScriptPath = path.join(process.cwd(), 'python', 'create_embeds_from_files_mapping.py'); + + + // Spawn the Python process with the full path to the Python executable. + const pythonProcess = spawn(pythonExecutable, [ + pythonScriptPath, + '--files', + ...filePaths, + '--index_output', + outputPath, + ]); + +// console.log(`Filepaths: ${filePaths}`); +// console.log(`Creating index: ${outputPath}`); + + + let scriptOutput = ''; + let scriptError = ''; + + pythonProcess.stdout.on('data', data => { + scriptOutput += data.toString(); + }); + pythonProcess.stderr.on('data', data => { + scriptError += data.toString(); + }); + + pythonProcess.on('close', async (code) => { + if (code !== 0) { + console.error('Python script error:', scriptError); + return res.status(500).json({ message: 'Error generating embeddings', error: scriptError }); + } + // Update the assistant record with the FAISS index path and mark embeddings as completed. + await pool.execute( + 'UPDATE ai_assistants SET faiss_index_path = ?, embedding_status = ? WHERE id = ? AND user_id = ?', + [outputPath, 'completed', assistantId, userId] + ); + res.json({ message: 'Embeddings generated successfully', output: scriptOutput }); + }); + + } catch (error) { + console.error('Error in generateEmbeddings:', error); + res.status(500).json({ message: 'Error generating embeddings' }); + } +}; + +export default generateEmbeddings; + diff --git a/intelaide-backend/controllers/fileController.js b/intelaide-backend/controllers/fileController.js new file mode 100644 index 0000000..1c186ee --- /dev/null +++ b/intelaide-backend/controllers/fileController.js @@ -0,0 +1,161 @@ +// backend/controllers/fileController.js +import multer from 'multer'; +import path from 'path'; +import fs from 'fs'; +import pool from '../config/db.js'; +import File from '../models/File.js'; + +// Configure Multer storage with a dynamic destination based on req.userId +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + // Create a directory like "documents/user_{userId}" + const userId = req.userId; + const dest = path.join(process.cwd(), 'documents', `user_${userId}`); + fs.mkdirSync(dest, { recursive: true }); + cb(null, dest); + }, + filename: (req, file, cb) => { + // Sanitize the original file name and append a timestamp to avoid collisions + const parsed = path.parse(file.originalname); + const sanitizedName = parsed.name.replace(/[^a-zA-Z0-9]/g, '_'); + const fileName = `${sanitizedName}_${Date.now()}${parsed.ext}`; + cb(null, fileName); + }, +}); + +const upload = multer({ + storage, + limits: { fileSize: 5 * 1024 * 1024 }, // 5MB max file size +}); + +const allowedExtensions = ['txt', 'md']; + +/** + * Upload multiple files. + * The files will be stored in a directory based on the authenticated user's ID. + */ +export const uploadFiles = (req, res) => { + // Use multer's array middleware to handle multiple files under the field 'files' + upload.array('files')(req, res, async (err) => { + if (err) { + return res.status(400).json({ message: err.message }); + } + + try { + // Process each uploaded file + for (let file of req.files) { + console.log('Uploaded file:', file); + console.log('User ID from token:', req.userId); + + // Check if the file extension is allowed + const fileExtension = path.extname(file.originalname) + .substring(1) + .toLowerCase(); + if (!allowedExtensions.includes(fileExtension)) { + return res.status(400).json({ message: 'Only .txt and .md files are allowed' }); + } + + // Prepare file data for the database; file_path includes the user-specific folder + const fileData = { + user_id: req.userId, + file_name: file.filename, + file_path: file.path, + file_type: fileExtension, + status: 'uploaded', + }; + + await File.createFile(fileData); + } + res.json({ + message: 'Files uploaded successfully', + files: req.files.map(file => file.filename) + }); + } catch (error) { + console.error('Error uploading files:', error); + res.status(500).json({ message: 'Database error. Please try again.' }); + } + }); +}; + +/** + * Get all files for the authenticated user. + */ +export const getUserFiles = async (req, res) => { + try { + const files = await File.getUserFiles(req.userId); + if (!files.length) { + return res.status(404).json({ message: 'No files found' }); + } + res.json(files); + } catch (error) { + console.error('Error retrieving files:', error); + res.status(500).json({ message: 'Database error. Please try again.' }); + } +}; + +/** + * Get a single file by its ID (if needed). + */ +export const getFileById = async (req, res) => { + const { id } = req.params; + try { + const file = await File.findById(id, req.userId); + if (!file) { + return res.status(404).json({ message: 'File not found or unauthorized' }); + } + res.json(file); + } catch (error) { + console.error('Error retrieving file:', error); + res.status(500).json({ message: 'Database error. Please try again.' }); + } +}; + +export const previewFile = (req, res) => { + // Use the authenticated user's ID from the token + const userId = req.userId; + // Get the filename from the route parameter + const { filename } = req.params; + // Construct the full file path (matches the location used in the multer storage) + const filePath = path.join(process.cwd(), 'documents', `user_${userId}`, filename); + console.log(`Previewing file for user ${userId} from path: ${filePath}`); + + res.sendFile(filePath, (err) => { + if (err) { + console.error('Error sending file:', err); + return res.status(404).send('File not found'); + } + }); +}; + +/** + * Delete a file. + * This endpoint removes the file from the filesystem and then deletes its record from the database. + */ +export const deleteFile = async (req, res) => { + const { id } = req.params; + const user_id = req.userId; + try { + // Retrieve the file's path from the database + const [file] = await pool.execute( + 'SELECT file_path FROM files WHERE id = ? AND user_id = ?', + [id, user_id] + ); + if (file.length === 0) { + return res.status(404).json({ message: 'File not found or unauthorized' }); + } + // Remove the file from the filesystem + fs.unlink(path.resolve(file[0].file_path), async (err) => { + if (err) { + console.error('Error deleting file from disk:', err); + return res.status(500).json({ message: 'Error deleting file from disk' }); + } + // Delete the file record from the database + await pool.execute('DELETE FROM files WHERE id = ? AND user_id = ?', [id, user_id]); + res.json({ message: 'File deleted successfully' }); + }); + } catch (error) { + console.error('Error deleting file:', error); + res.status(500).json({ message: 'Database error. Please try again.' }); + } +}; + diff --git a/intelaide-backend/controllers/ollamaController.js b/intelaide-backend/controllers/ollamaController.js new file mode 100644 index 0000000..4e2b516 --- /dev/null +++ b/intelaide-backend/controllers/ollamaController.js @@ -0,0 +1,92 @@ +// backend/controllers/ollamaController.js +import ollama from 'ollama'; +import { spawn } from 'child_process'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import pool from '../config/db.js'; + +// Define __filename and __dirname for ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export const queryAssistant = async (req, res) => { + try { + const { prompt, model, assistantId } = req.body; + if (!prompt) { + return res.status(400).json({ message: 'Prompt is required' }); + } + if (!assistantId) { + return res.status(400).json({ message: 'assistantId is required' }); + } + + // Use provided model or default to 'llama3.2:3b-instruct-q8_0' + const usedModel = model || 'llama3.2:3b-instruct-q8_0'; + + // Retrieve the assistantโ€™s FAISS index path from the database. + const [assistantRows] = await pool.execute( + 'SELECT faiss_index_path FROM ai_assistants WHERE id = ? AND user_id = ?', + [assistantId, req.userId] + ); + if (assistantRows.length === 0) { + return res.status(404).json({ message: 'Assistant not found or unauthorized' }); + } + const faissIndexPath = assistantRows[0].faiss_index_path; + + // Build the full path to the FAISS search script using __dirname. + const pythonScriptPath = path.join(__dirname, '../python', 'faiss_search_mapping.py'); + + // Define the Python executable path (update as needed) + const pythonExecutable = "/root/intelaide-backend/python/bin/python3"; + + // Build the arguments to pass to the Python script. + // The new script expects: + // --faiss_index_path --query --k + const searchArgs = [ + '--faiss_index_path', faissIndexPath, + '--query', prompt + ]; + + let pyOutput = ""; + await new Promise((resolve, reject) => { + const pyProc = spawn(pythonExecutable, [pythonScriptPath, ...searchArgs]); + let stdoutData = ""; + let stderrData = ""; + + pyProc.stdout.on('data', (data) => { + stdoutData += data.toString(); + }); + pyProc.stderr.on('data', (data) => { + stderrData += data.toString(); + }); + pyProc.on('close', (code) => { + if (code !== 0) { + console.error('FAISS search script error:', stderrData); + return reject(new Error(`FAISS search script error: ${stderrData}`)); + } + // Optionally, if the Python script logs extra info before printing the final prompt, + // you can parse stdoutData to extract only the desired content. + pyOutput = stdoutData.trim(); + resolve(); + }); + }); + + // Create the augmented prompt using the output from Python. + const augmentedPrompt = `${pyOutput}`; + console.log('Prompt sent: ', augmentedPrompt); + + // Send the augmented prompt to Ollama. + const response = await ollama.chat({ + model: usedModel, + messages: [{ role: 'user', content: augmentedPrompt }], + }); + + console.log('Ollama chat response:', response); + return res.json({ response }); + } catch (error) { + console.error('Error querying assistant:', error); + return res.status(500).json({ message: 'Error querying assistant', error: error.message }); + } +}; + +export default queryAssistant; + diff --git a/intelaide-backend/controllers/userController.js b/intelaide-backend/controllers/userController.js new file mode 100644 index 0000000..86b76ae --- /dev/null +++ b/intelaide-backend/controllers/userController.js @@ -0,0 +1,67 @@ +// backend/controllers/userController.js +import User from '../models/User.js'; + +export const getCurrentUser = async (req, res) => { +// console.log('User controller: Fetching user with ID:', req.userId); + try { + const user = await User.findById(req.userId); + if (!user) { + return res.status(404).json({ message: 'User not found.' }); + } + res.json({ + first_name: user.first_name, + last_name: user.last_name, + email: user.email, + }); + } catch (error) { + console.error('Error fetching user:', error.message); + res.status(500).json({ message: 'Error fetching user information' }); + } +}; + +export const getUserById = async (req, res) => { + const { id } = req.params; + try { + const user = await User.findById(id); + if (!user) { + return res.status(404).json({ message: 'User not found' }); + } + // Remove sensitive data before sending the response + delete user.password_hash; + res.json(user); + } catch (error) { + console.error('Error retrieving user by ID:', error.message); + res.status(500).json({ message: 'Error retrieving user. Please try again later.' }); + } +}; + +export const getUserByEmail = async (req, res) => { + const { email } = req.params; + try { + const user = await User.findByEmail(email); + if (!user) { + return res.status(404).json({ message: 'User not found' }); + } + // Remove sensitive data before sending the response + delete user.password_hash; + res.json(user); + } catch (error) { + console.error('Error retrieving user by email:', error.message); + res.status(500).json({ message: 'Error retrieving user. Please try again later.' }); + } +}; + +export const getAllUsers = async (req, res) => { + try { + const users = await User.getAllUsers(); + if (!users.length) { + return res.status(404).json({ message: 'No users found' }); + } + users.forEach((user) => delete user.password_hash); + res.json(users); + } catch (error) { + console.error('Error retrieving all users:', error.message); + res.status(500).json({ message: 'Error retrieving users. Please try again later.' }); + } +}; + diff --git a/intelaide-backend/documents/user_3/01_mission_vision_1755718653317.md b/intelaide-backend/documents/user_3/01_mission_vision_1755718653317.md new file mode 100644 index 0000000..bc603f0 --- /dev/null +++ b/intelaide-backend/documents/user_3/01_mission_vision_1755718653317.md @@ -0,0 +1,21 @@ +# Mission & Vision Statement - Registry of Interpreters for the Deaf, Inc. (RID) + +## Mission +RID serves equally our members, profession, and the public by promoting and advocating for qualified and effective interpreters in all spaces where intersectional diverse Deaf lives are impacted. + +## Vision +RID envisions qualified interpreters as partners in universal communication access and forward-thinking, effective communication solutions while honoring intersectional diverse spaces. + +## Core Values +- Intersectionality and diversity of communities served +- Diversity, Equity, Inclusion, Accessibility, and Belonging (DEIAB) +- Professional contribution of volunteer leadership +- Adaptability and advancement of the interpreting profession +- Ethical practices with an emphasis on โ€œdo no harmโ€ +- Advocacy for accessible, effective communication + +## Diversity Statement +RID embraces diversity across a wide spectrum (gender identity, race, disability, geographic location, certification status, etc.) and integrates these values throughout the organization. + +--- +The national certifying body of ASL Interpreters fostering the professional growth of interpreting. diff --git a/intelaide-backend/documents/user_3/02_org_chart_1755718653316.md b/intelaide-backend/documents/user_3/02_org_chart_1755718653316.md new file mode 100644 index 0000000..3ae37be --- /dev/null +++ b/intelaide-backend/documents/user_3/02_org_chart_1755718653316.md @@ -0,0 +1,23 @@ +# Organizational Chart - Registry of Interpreters for the Deaf, Inc. (RID) + +## Board of Directors +- Chief Executive Officer (CEO) +- Region Representatives (Iโ€“V) +- At-Large Directors +- Treasurer +- Secretary + +## Staff Leadership +- Certification Department +- Professional Development Department +- Membership Department +- Ethics & Standards Department +- Finance & Operations +- Communications & Outreach + +## Affiliate Chapters +- 54 Affiliate Chapters (ACs) across 5 regions +- Supported by Affiliate Chapter Liaison +- AC Relations Committee in development + +*(Affiliate Chapters act as local professional networks, provide professional development, and advocate at the state level.)* diff --git a/intelaide-backend/documents/user_3/03_employee_handbook_1755718653316.md b/intelaide-backend/documents/user_3/03_employee_handbook_1755718653316.md new file mode 100644 index 0000000..75b2113 --- /dev/null +++ b/intelaide-backend/documents/user_3/03_employee_handbook_1755718653316.md @@ -0,0 +1,22 @@ +# Employee Handbook - Registry of Interpreters for the Deaf, Inc. (RID) + +## Introduction +Welcome to Registry of Interpreters for the Deaf, Inc. (RID). This handbook outlines policies, procedures, and expectations for staff, contractors, and volunteers. + +## Workplace Policies +- Equal Opportunity Employment +- Anti-Harassment Policy +- Attendance & Leave +- Compliance with RIDโ€™s Mission and Vision + +## Benefits +- Health Insurance +- Retirement Plan +- Paid Time Off +- Professional Development Opportunities + +## Expectations +Employees are expected to: +- Uphold RIDโ€™s mission and vision +- Support interpretersโ€™ professional growth +- Abide by the NAD-RID Code of Professional Conduct (CPC) diff --git a/intelaide-backend/documents/user_3/04_it_security_policies_1755718653316.md b/intelaide-backend/documents/user_3/04_it_security_policies_1755718653316.md new file mode 100644 index 0000000..7420506 --- /dev/null +++ b/intelaide-backend/documents/user_3/04_it_security_policies_1755718653316.md @@ -0,0 +1,15 @@ +# IT & Security Policies - Registry of Interpreters for the Deaf, Inc. (RID) + +## Acceptable Use +All staff, members, and contractors must use IT resources responsibly and for professional purposes only. + +## Data Protection +- Encrypt sensitive data (e.g., member info, certification records) +- Use strong, unique passwords +- Report security incidents immediately + +## Remote Work +Remote access to RID systems must use secure VPN and comply with cybersecurity best practices. + +## Confidentiality +All certification exam data, ethics cases, and member information must be protected according to RID policies. diff --git a/intelaide-backend/documents/user_3/05_code_of_conduct_1755718653316.md b/intelaide-backend/documents/user_3/05_code_of_conduct_1755718653316.md new file mode 100644 index 0000000..a82dbab --- /dev/null +++ b/intelaide-backend/documents/user_3/05_code_of_conduct_1755718653316.md @@ -0,0 +1,15 @@ +# Code of Conduct - Registry of Interpreters for the Deaf, Inc. (RID) + +## Professional Standards +All staff, members, and certificants must act with integrity, fairness, and professionalism. + +## Ethical Practices System (EPS) +The EPS enforces professional standards through two processes: +- **Complaints** (named, formal cases) +- **Reports** (anonymous, informational submissions) + +## Conflicts of Interest +Conflicts related to certification, membership, or governance must be disclosed. + +## Compliance +Follow all organizational bylaws, policies, and the NAD-RID Code of Professional Conduct (CPC). diff --git a/intelaide-backend/documents/user_3/06_strategic_plan_1755718653315.md b/intelaide-backend/documents/user_3/06_strategic_plan_1755718653315.md new file mode 100644 index 0000000..fa8befd --- /dev/null +++ b/intelaide-backend/documents/user_3/06_strategic_plan_1755718653315.md @@ -0,0 +1,23 @@ +# Strategic Plan (2025-2030) - Registry of Interpreters for the Deaf, Inc. (RID) + +## Strategic Pillars +1. Diversity, Equity, Inclusion, Accessibility & Belonging +2. Organizational Transformation +3. Organizational Relevance +4. Organizational Effectiveness + +## Goals +- Strengthen certification programs +- Expand professional development opportunities +- Increase member engagement +- Advocate for the Deaf and interpreting communities + +## Key Initiatives +- Digital transformation of certification systems +- Expanded continuing education programs +- Diversity, equity, and inclusion initiatives +- Partnerships with Deaf organizations +- Revitalizing Affiliate Chapters (liaison, handbook, committees) + +## Metrics +Annual review of certification pass rates, membership growth, and impact reports. diff --git a/intelaide-backend/documents/user_3/07_annual_report_1755718653315.md b/intelaide-backend/documents/user_3/07_annual_report_1755718653315.md new file mode 100644 index 0000000..2cf9db2 --- /dev/null +++ b/intelaide-backend/documents/user_3/07_annual_report_1755718653315.md @@ -0,0 +1,21 @@ +# Annual Report - Registry of Interpreters for the Deaf, Inc. (RID) + +## Executive Summary +Registry of Interpreters for the Deaf, Inc. (RID) achieved significant milestones this year, continuing its leadership as the national certifying body of ASL interpreters. + +## Key Highlights +- Certification exams administered: XXXX +- Continuing education workshops: XXXX +- Advocacy campaigns: XXXX +- Publications: VIEWS magazine, Journal of Interpretation + +## Financial Overview +*(Insert charts/tables summarizing revenue and expenses)* + +## Organizational Impact +- Expanded Affiliate Chapter engagement +- Enhanced DEIAB initiatives +- Strengthened interpreter standards nationwide + +--- +The national certifying body of ASL Interpreters fostering the professional growth of interpreting. diff --git a/intelaide-backend/documents/user_3/08_standard_operating_procedures_1755718653315.md b/intelaide-backend/documents/user_3/08_standard_operating_procedures_1755718653315.md new file mode 100644 index 0000000..c5fac25 --- /dev/null +++ b/intelaide-backend/documents/user_3/08_standard_operating_procedures_1755718653315.md @@ -0,0 +1,18 @@ +# Standard Operating Procedures (SOPs) - Registry of Interpreters for the Deaf, Inc. (RID) + +## Example: Certification Exam Administration +1. Candidate registers online +2. RID verifies eligibility +3. Candidate schedules exam with testing partner +4. Scores are reviewed and certified + +## Example: Ethics Complaint Process +1. Complaint submitted (named) +2. Ethics Committee reviews case +3. Decision issued and communicated +4. Records documented securely + +## Example: Affiliate Chapter Engagement +1. AC requests support or resources +2. Affiliate Chapter Liaison provides guidance +3. AC Handbook referenced for standard processes diff --git a/intelaide-backend/documents/user_3/09_training_onboarding_1755718653315.md b/intelaide-backend/documents/user_3/09_training_onboarding_1755718653315.md new file mode 100644 index 0000000..d34ebfd --- /dev/null +++ b/intelaide-backend/documents/user_3/09_training_onboarding_1755718653315.md @@ -0,0 +1,16 @@ +# Training & Onboarding Guide - Registry of Interpreters for the Deaf, Inc. (RID) + +## Welcome Message +Welcome to Registry of Interpreters for the Deaf, Inc. (RID)! We are proud to be the national certifying body of ASL interpreters. + +## Orientation +- Introduction to mission, vision, and values +- Overview of departments and leadership +- Required compliance and ethics training +- Introduction to Affiliate Chapter network + +## Resources +- RID Member Portal +- Certification Handbook +- RID Press publications +- IT & Security Helpdesk diff --git a/intelaide-backend/documents/user_3/10_style_guide_1755718653314.md b/intelaide-backend/documents/user_3/10_style_guide_1755718653314.md new file mode 100644 index 0000000..fb388bb --- /dev/null +++ b/intelaide-backend/documents/user_3/10_style_guide_1755718653314.md @@ -0,0 +1,16 @@ +# Marketing & Communications Style Guide - Registry of Interpreters for the Deaf, Inc. (RID) + +## Brand Voice +- Professional, inclusive, and advocacy-driven +- Accessible to both interpreters and the Deaf community + +## Visual Identity +- RID Logo usage rules +- Approved color palette +- Typography standards + +## Writing Guidelines +- Use people-first and community-preferred language +- Be consistent in terminology (e.g., "ASL interpreters" not "signers") +- Respectfully reference the Deaf community +- Reflect RIDโ€™s DEIAB values in all communication diff --git a/intelaide-backend/documents/user_3/about_advertising_1741802987918.md b/intelaide-backend/documents/user_3/about_advertising_1741802987918.md new file mode 100644 index 0000000..b1f8c69 --- /dev/null +++ b/intelaide-backend/documents/user_3/about_advertising_1741802987918.md @@ -0,0 +1,326 @@ +# https://rid.org/about/advertising/#ridjobboard + +Skip to content + +[![](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no- +bg.png)](https://rid.org/) + +Toggle Navigation + + * [Member Login](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [Careers](https://rid.org/careers/) + * [FAQs](https://rid.org/faqs/) + +Toggle Navigation + + * [ __Contact Us](https://rid.org/contact/) + * [ Donate](https://www.paypal.com/donate/?hosted_button_id=XV4M85ST7DGGS) + * [RID Forms](https://rid.org/rid-forms/) + +Toggle Navigation + + * [Search the Registry](https://myaccount.rid.org/Public/Search/Member.aspx) + +Menu + + * [Certification](https://rid.org/certification/) + * [Available Certifications](https://rid.org/certification/available-certifications/) + * [Newly Certified](https://rid.org/certifications/available-certifications/#newlycertified) + * [Alternative Pathway Program](https://rid.org/certification/alternative-pathway-program/) + * [Credly Digital Credentials](https://rid.org/certification/credly-digital-credentials/) + * [Certification Reinstatement](https://rid.org/certification/certification-reinstatement/) + * [Testing at CASLI](https://www.casli.org/exam-preparations/) + * [Programs](https://rid.org/programs/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [CMP](https://rid.org/programs/certification-maintenance/cmp/) + * [ACET](https://rid.org/programs/certification-maintenance/acet/) + * [Earning RID CEUs](https://rid.org/programs/certification-maintenance/ceus/) + * [PPO CEUs](https://rid.org/programs/certification-maintenance/ceus/ppo-ceus/) + * [RID Approved Sponsors](https://rid.org/programs/certification-maintenance/approved-sponsors/) + * [Workshop Presenters & Hosts](https://rid.org/programs/certification-maintenance/workshop-presenters-and-hosts/) + * [Membership](https://rid.org/programs/membership/) + * [Member Benefits](https://rid.org/membership/#memberbenefits) + * [Member Sections](https://rid.org/about/volunteer-leadership/#membersections) + * [Freelance Insurance Program](https://rid.org/membership/#freelanceprogram) + * [Publications](https://rid.org/programs/membership/publications/) + * [Membership Renewal](https://rid.org/programs/membership/#membershiprenewal) + * [Affiliate Chapters](https://rid.org/programs/membership/affiliate-chapters/) + * [Affiliate Chapter Resource Center](https://rid.org/programs/membership/affiliate-chapters/acrc/) + * [Scholarships and Awards](https://rid.org/scholarships-and-awards/) + * [ __Join RID!](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [ Ethics](https://rid.org/programs/ethics/) + * [CPC](https://rid.org/programs/ethics/code-of-professional-conduct/) + * [EPS Policy](https://rid.org/wp-content/uploads/2024/09/EPS-Policy-and-Enforcement-Procedures_Updated-July-2024.pdf) + * [EPS Complaints](https://rid.org/programs/ethics/eps-complaints/) + * [EPS Procedures](https://rid.org/programs/ethics/eps-procedures/) + * [EPS Violations](https://rid.org/programs/ethics/eps-violations/) + * [ __File a Complaint](https://rid.org/eps-complaint-form/) + * [ Govโ€™t Affairs](https://rid.org/programs/gap/) + * [Advocacy Toolkit](https://rid.org/programs/gap/advocacy-toolkit/) + * [State-by-State Regulations](https://rid.org/programs/gap/state-by-state-regulations/) + * [Ongoing Advocacy Efforts](https://rid.org/programs/gap/ongoing-advocacy-efforts/) + * [Webinars](https://rid.org/programs/webinars/) + * [ __RID CEC](https://education.rid.org/) + * [ About Us](https://rid.org/about/) + * [Our Team](https://rid.org/about/#ourteam) + * [Board of Directors](https://rid.org/about/#bod) + * [Board Meetings](https://rid.org/about/governance/#boardmeetings) + * [Board of Directors Nominations Form](https://rid.org/bod-nomination-form/) + * [Nominations Process](https://rid.org/bod-nomination-form/#nominationprocess) + * [2025 National Conference](https://rid.org/about/events/national-conference/) + * [RID Regions](https://rid.org/about/#ridregions) + * [Careers](https://rid.org/careers/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + * [RID Bookstore](https://ridpress.org/) + * [Governance](https://rid.org/about/governance/) + * [Guiding Documents](https://rid.org/about/governance/#guidingdocuments) + * [Volunteer Leadership](https://rid.org/about/volunteer-leadership/) + * [Volunteer Leadership Application](https://rid.org/volunteer-leadership-app/) + * [Resources](https://rid.org/about/resources/) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Annual Reports](https://rid.org/about/governance/#guidingdocuments) + * [Advertising](https://rid.org/about/advertising/) + * [Resources](https://rid.org/about/resources/) + * [For the Consumer](https://rid.org/about/resources/#fortheconsumer) + * [For the Interpreter](https://rid.org/about/resources/#fortheinterpreter) + * [Standard Practice Papers](https://rid.org/about/resources/#spp) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Position Statements](https://rid.org/about/resources/#positionstatements) + * Search for: + +[![](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no- +bg.png)](https://rid.org/) + + * [__Contact Us](https://rid.org/contact/) + * [ Donate](https://www.paypal.com/donate/?hosted_button_id=XV4M85ST7DGGS) + * [RID Forms](https://rid.org/rid-forms/) + +Toggle Navigation + + * [Certification](https://rid.org/certification/) + * [Available Certifications](https://rid.org/certification/available-certifications/) + * [Newly Certified](https://rid.org/certifications/available-certifications/#newlycertified) + * [Alternative Pathway Program](https://rid.org/certification/alternative-pathway-program/) + * [Credly Digital Credentials](https://rid.org/certification/credly-digital-credentials/) + * [Certification Reinstatement](https://rid.org/certification/certification-reinstatement/) + * [Testing at CASLI](https://www.casli.org/exam-preparations/) + * [Programs](https://rid.org/programs/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [CMP](https://rid.org/programs/certification-maintenance/cmp/) + * [ACET](https://rid.org/programs/certification-maintenance/acet/) + * [Earning RID CEUs](https://rid.org/programs/certification-maintenance/ceus/) + * [PPO CEUs](https://rid.org/programs/certification-maintenance/ceus/ppo-ceus/) + * [RID Approved Sponsors](https://rid.org/programs/certification-maintenance/approved-sponsors/) + * [Workshop Presenters & Hosts](https://rid.org/programs/certification-maintenance/workshop-presenters-and-hosts/) + * [Membership](https://rid.org/programs/membership/) + * [Member Benefits](https://rid.org/membership/#memberbenefits) + * [Member Sections](https://rid.org/about/volunteer-leadership/#membersections) + * [Freelance Insurance Program](https://rid.org/membership/#freelanceprogram) + * [Publications](https://rid.org/programs/membership/publications/) + * [Membership Renewal](https://rid.org/programs/membership/#membershiprenewal) + * [Affiliate Chapters](https://rid.org/programs/membership/affiliate-chapters/) + * [Affiliate Chapter Resource Center](https://rid.org/programs/membership/affiliate-chapters/acrc/) + * [Scholarships and Awards](https://rid.org/scholarships-and-awards/) + * [ __Join RID!](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [ Ethics](https://rid.org/programs/ethics/) + * [CPC](https://rid.org/programs/ethics/code-of-professional-conduct/) + * [EPS Policy](https://rid.org/wp-content/uploads/2024/09/EPS-Policy-and-Enforcement-Procedures_Updated-July-2024.pdf) + * [EPS Complaints](https://rid.org/programs/ethics/eps-complaints/) + * [EPS Procedures](https://rid.org/programs/ethics/eps-procedures/) + * [EPS Violations](https://rid.org/programs/ethics/eps-violations/) + * [ __File a Complaint](https://rid.org/eps-complaint-form/) + * [ Govโ€™t Affairs](https://rid.org/programs/gap/) + * [Advocacy Toolkit](https://rid.org/programs/gap/advocacy-toolkit/) + * [State-by-State Regulations](https://rid.org/programs/gap/state-by-state-regulations/) + * [Ongoing Advocacy Efforts](https://rid.org/programs/gap/ongoing-advocacy-efforts/) + * [Webinars](https://rid.org/programs/webinars/) + * [ __RID CEC](https://education.rid.org/) + * [ About Us](https://rid.org/about/) + * [Our Team](https://rid.org/about/#ourteam) + * [Board of Directors](https://rid.org/about/#bod) + * [Board Meetings](https://rid.org/about/governance/#boardmeetings) + * [Board of Directors Nominations Form](https://rid.org/bod-nomination-form/) + * [Nominations Process](https://rid.org/bod-nomination-form/#nominationprocess) + * [2025 National Conference](https://rid.org/about/events/national-conference/) + * [RID Regions](https://rid.org/about/#ridregions) + * [Careers](https://rid.org/careers/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + * [RID Bookstore](https://ridpress.org/) + * [Governance](https://rid.org/about/governance/) + * [Guiding Documents](https://rid.org/about/governance/#guidingdocuments) + * [Volunteer Leadership](https://rid.org/about/volunteer-leadership/) + * [Volunteer Leadership Application](https://rid.org/volunteer-leadership-app/) + * [Resources](https://rid.org/about/resources/) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Annual Reports](https://rid.org/about/governance/#guidingdocuments) + * [Advertising](https://rid.org/about/advertising/) + * [Resources](https://rid.org/about/resources/) + * [For the Consumer](https://rid.org/about/resources/#fortheconsumer) + * [For the Interpreter](https://rid.org/about/resources/#fortheinterpreter) + * [Standard Practice Papers](https://rid.org/about/resources/#spp) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Position Statements](https://rid.org/about/resources/#positionstatements) + * Search for: + +#### Advertising + +# Maximize Your Exposure. + +Advertise with RID and reach thousands. + +![](https://rid.org/wp-content/uploads/2023/03/Advertising-Header.jpg) + +Advertising[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2024-07-05T17:55:01+00:00 + +![363](https://rid.org/wp-content/uploads/2022/09/363.jpg) + +## Advertise & build your network and reach + +With over 14,000 members in the U.S. and abroad, RID is the largest, +comprehensive registry of American Sign Language (ASL) interpreters in the +country! Easily reach our members through our eNEWS, VIEWS, and website/ +social media platforms for your company or organizationโ€™s job announcements, +events, and promotions. Interactive opportunities available to engage your +potential customers and clients in a way that is unmatched. + +__ + +## Job Ad + +Give your job opportunities a boost on our website and social media platforms + +__ + +## eNews Insert + +Delivered monthly to the inbox of over 12k members + +__ + +## VIEWS Ad + +Our quarterly publication with the ability to add an interactive flair + +[Advertising Options](https://rid.org/wp- +content/uploads/2023/04/RID-2023-Advertising-Media-Kit.pdf) + +# + +Job Board + + * ![](https://rid.org/wp-content/uploads/2025/03/University-of-Rochester-Logo-320x202.png) + +[](https://rid.org/rochester-director-of-deaf-professional-interpreter- +services/) + +## [U of Rochester Director of Deaf Professional Interpreter +Services](https://rid.org/rochester-director-of-deaf-professional-interpreter- +services/) + +The Director of Deaf Professional Interpreter Services (DPIS) is [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-03-12T15:59:14+00:00March 12, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on U of Rochester +Director of Deaf Professional Interpreter Services + +[Read More](https://rid.org/rochester-director-of-deaf-professional- +interpreter-services/) + + * ![](https://rid.org/wp-content/uploads/2025/03/occ-logo-open-graph-320x202.png) + +[](https://rid.org/occ-asl-interpreting-instructor/) + +## [Oakland Community College ASL-Interpreting +Instructor](https://rid.org/occ-asl-interpreting-instructor/) + +Oakland Community College in Auburn Hills, Michigan, is seeking [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-03-12T13:50:08+00:00March 12, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on Oakland Community +College ASL-Interpreting Instructor + +[Read More](https://rid.org/occ-asl-interpreting-instructor/) + + * ![](https://rid.org/wp-content/uploads/2024/12/AMN-Healthcare-Logo-Smaller-320x202.png) + +[](https://rid.org/amn-medical-vri/) + +## [AMN Healthcare Medical VR Interpreter](https://rid.org/amn-medical-vri/) + +The ASL Medical Video Remote Interpreter (VRI) will cover a wide range [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-02-21T14:48:40+00:00February 21, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on AMN Healthcare +Medical VR Interpreter + +[Read More](https://rid.org/amn-medical-vri/) + + * ![](data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27887%27%20height%3D%27380%27%20viewBox%3D%270%200%20887%20380%27%3E%3Crect%20width%3D%27887%27%20height%3D%27380%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E) + +[](https://rid.org/uc-santa-barbara-asl-interpreter/) + +## [UC Santa Barbara ASL Interpreter](https://rid.org/uc-santa-barbara-asl- +interpreter/) + +The Interpreter works between spoken English and American Sign [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-02-14T21:54:55+00:00February 14, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on UC Santa Barbara +ASL Interpreter + +[Read More](https://rid.org/uc-santa-barbara-asl-interpreter/) + +[Submit a Job Listing!](mailto:advertising@rid.org) + +__ + +![Registry of Interpreters for the Deaf, Inc. Logo](https://rid.org/wp- +content/uploads/2023/04/RID-big-i-Logo-no-bg.png)![Registry of Interpreters +for the Deaf, Inc. Logo](https://rid.org/wp-content/uploads/2023/04/RID-big-i- +Logo-no-bg.png)![Registry of Interpreters for the Deaf, Inc. +Logo](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no-bg.png) + +RIDโ€™s purpose is to serve equally our members, profession, and the public by +promoting and advocating for qualified and effective interpreters in all +spaces where intersectional diverse Deaf lives are impacted. + + * [Certification](https://rid.org/certification/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [Membership](https://rid.org/programs/membership/) + * [Ethics](https://rid.org/programs/ethics/) + * [About Us](https://rid.org/about/) + + * [Member Login](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [Careers](https://rid.org/careers/) + * [FAQs](https://rid.org/faqs/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + +### + +### Business Info + +Registry of Interpreters for the Deaf, Inc. +PO Box 17581 +Arlington, VA 22216-7581 + +__703-838-0030 + +[ __Contact Us](https://rid.org/contact/) + +RID, Inc. ยฉ 2025 + +[](https://www.facebook.com/RIDInc +"Facebook")[](https://www.instagram.com/ridinc/ +"Instagram")[](https://www.youtube.com/RIDOfficialChannel +"YouTube")[](https://www.linkedin.com/company/registry-of-interpreters-for- +the-deaf-inc. "LinkedIn") + +Back to top + +Page load link + diff --git a/intelaide-backend/documents/user_3/about_advertising_1741803389122.md b/intelaide-backend/documents/user_3/about_advertising_1741803389122.md new file mode 100644 index 0000000..b1f8c69 --- /dev/null +++ b/intelaide-backend/documents/user_3/about_advertising_1741803389122.md @@ -0,0 +1,326 @@ +# https://rid.org/about/advertising/#ridjobboard + +Skip to content + +[![](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no- +bg.png)](https://rid.org/) + +Toggle Navigation + + * [Member Login](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [Careers](https://rid.org/careers/) + * [FAQs](https://rid.org/faqs/) + +Toggle Navigation + + * [ __Contact Us](https://rid.org/contact/) + * [ Donate](https://www.paypal.com/donate/?hosted_button_id=XV4M85ST7DGGS) + * [RID Forms](https://rid.org/rid-forms/) + +Toggle Navigation + + * [Search the Registry](https://myaccount.rid.org/Public/Search/Member.aspx) + +Menu + + * [Certification](https://rid.org/certification/) + * [Available Certifications](https://rid.org/certification/available-certifications/) + * [Newly Certified](https://rid.org/certifications/available-certifications/#newlycertified) + * [Alternative Pathway Program](https://rid.org/certification/alternative-pathway-program/) + * [Credly Digital Credentials](https://rid.org/certification/credly-digital-credentials/) + * [Certification Reinstatement](https://rid.org/certification/certification-reinstatement/) + * [Testing at CASLI](https://www.casli.org/exam-preparations/) + * [Programs](https://rid.org/programs/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [CMP](https://rid.org/programs/certification-maintenance/cmp/) + * [ACET](https://rid.org/programs/certification-maintenance/acet/) + * [Earning RID CEUs](https://rid.org/programs/certification-maintenance/ceus/) + * [PPO CEUs](https://rid.org/programs/certification-maintenance/ceus/ppo-ceus/) + * [RID Approved Sponsors](https://rid.org/programs/certification-maintenance/approved-sponsors/) + * [Workshop Presenters & Hosts](https://rid.org/programs/certification-maintenance/workshop-presenters-and-hosts/) + * [Membership](https://rid.org/programs/membership/) + * [Member Benefits](https://rid.org/membership/#memberbenefits) + * [Member Sections](https://rid.org/about/volunteer-leadership/#membersections) + * [Freelance Insurance Program](https://rid.org/membership/#freelanceprogram) + * [Publications](https://rid.org/programs/membership/publications/) + * [Membership Renewal](https://rid.org/programs/membership/#membershiprenewal) + * [Affiliate Chapters](https://rid.org/programs/membership/affiliate-chapters/) + * [Affiliate Chapter Resource Center](https://rid.org/programs/membership/affiliate-chapters/acrc/) + * [Scholarships and Awards](https://rid.org/scholarships-and-awards/) + * [ __Join RID!](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [ Ethics](https://rid.org/programs/ethics/) + * [CPC](https://rid.org/programs/ethics/code-of-professional-conduct/) + * [EPS Policy](https://rid.org/wp-content/uploads/2024/09/EPS-Policy-and-Enforcement-Procedures_Updated-July-2024.pdf) + * [EPS Complaints](https://rid.org/programs/ethics/eps-complaints/) + * [EPS Procedures](https://rid.org/programs/ethics/eps-procedures/) + * [EPS Violations](https://rid.org/programs/ethics/eps-violations/) + * [ __File a Complaint](https://rid.org/eps-complaint-form/) + * [ Govโ€™t Affairs](https://rid.org/programs/gap/) + * [Advocacy Toolkit](https://rid.org/programs/gap/advocacy-toolkit/) + * [State-by-State Regulations](https://rid.org/programs/gap/state-by-state-regulations/) + * [Ongoing Advocacy Efforts](https://rid.org/programs/gap/ongoing-advocacy-efforts/) + * [Webinars](https://rid.org/programs/webinars/) + * [ __RID CEC](https://education.rid.org/) + * [ About Us](https://rid.org/about/) + * [Our Team](https://rid.org/about/#ourteam) + * [Board of Directors](https://rid.org/about/#bod) + * [Board Meetings](https://rid.org/about/governance/#boardmeetings) + * [Board of Directors Nominations Form](https://rid.org/bod-nomination-form/) + * [Nominations Process](https://rid.org/bod-nomination-form/#nominationprocess) + * [2025 National Conference](https://rid.org/about/events/national-conference/) + * [RID Regions](https://rid.org/about/#ridregions) + * [Careers](https://rid.org/careers/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + * [RID Bookstore](https://ridpress.org/) + * [Governance](https://rid.org/about/governance/) + * [Guiding Documents](https://rid.org/about/governance/#guidingdocuments) + * [Volunteer Leadership](https://rid.org/about/volunteer-leadership/) + * [Volunteer Leadership Application](https://rid.org/volunteer-leadership-app/) + * [Resources](https://rid.org/about/resources/) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Annual Reports](https://rid.org/about/governance/#guidingdocuments) + * [Advertising](https://rid.org/about/advertising/) + * [Resources](https://rid.org/about/resources/) + * [For the Consumer](https://rid.org/about/resources/#fortheconsumer) + * [For the Interpreter](https://rid.org/about/resources/#fortheinterpreter) + * [Standard Practice Papers](https://rid.org/about/resources/#spp) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Position Statements](https://rid.org/about/resources/#positionstatements) + * Search for: + +[![](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no- +bg.png)](https://rid.org/) + + * [__Contact Us](https://rid.org/contact/) + * [ Donate](https://www.paypal.com/donate/?hosted_button_id=XV4M85ST7DGGS) + * [RID Forms](https://rid.org/rid-forms/) + +Toggle Navigation + + * [Certification](https://rid.org/certification/) + * [Available Certifications](https://rid.org/certification/available-certifications/) + * [Newly Certified](https://rid.org/certifications/available-certifications/#newlycertified) + * [Alternative Pathway Program](https://rid.org/certification/alternative-pathway-program/) + * [Credly Digital Credentials](https://rid.org/certification/credly-digital-credentials/) + * [Certification Reinstatement](https://rid.org/certification/certification-reinstatement/) + * [Testing at CASLI](https://www.casli.org/exam-preparations/) + * [Programs](https://rid.org/programs/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [CMP](https://rid.org/programs/certification-maintenance/cmp/) + * [ACET](https://rid.org/programs/certification-maintenance/acet/) + * [Earning RID CEUs](https://rid.org/programs/certification-maintenance/ceus/) + * [PPO CEUs](https://rid.org/programs/certification-maintenance/ceus/ppo-ceus/) + * [RID Approved Sponsors](https://rid.org/programs/certification-maintenance/approved-sponsors/) + * [Workshop Presenters & Hosts](https://rid.org/programs/certification-maintenance/workshop-presenters-and-hosts/) + * [Membership](https://rid.org/programs/membership/) + * [Member Benefits](https://rid.org/membership/#memberbenefits) + * [Member Sections](https://rid.org/about/volunteer-leadership/#membersections) + * [Freelance Insurance Program](https://rid.org/membership/#freelanceprogram) + * [Publications](https://rid.org/programs/membership/publications/) + * [Membership Renewal](https://rid.org/programs/membership/#membershiprenewal) + * [Affiliate Chapters](https://rid.org/programs/membership/affiliate-chapters/) + * [Affiliate Chapter Resource Center](https://rid.org/programs/membership/affiliate-chapters/acrc/) + * [Scholarships and Awards](https://rid.org/scholarships-and-awards/) + * [ __Join RID!](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [ Ethics](https://rid.org/programs/ethics/) + * [CPC](https://rid.org/programs/ethics/code-of-professional-conduct/) + * [EPS Policy](https://rid.org/wp-content/uploads/2024/09/EPS-Policy-and-Enforcement-Procedures_Updated-July-2024.pdf) + * [EPS Complaints](https://rid.org/programs/ethics/eps-complaints/) + * [EPS Procedures](https://rid.org/programs/ethics/eps-procedures/) + * [EPS Violations](https://rid.org/programs/ethics/eps-violations/) + * [ __File a Complaint](https://rid.org/eps-complaint-form/) + * [ Govโ€™t Affairs](https://rid.org/programs/gap/) + * [Advocacy Toolkit](https://rid.org/programs/gap/advocacy-toolkit/) + * [State-by-State Regulations](https://rid.org/programs/gap/state-by-state-regulations/) + * [Ongoing Advocacy Efforts](https://rid.org/programs/gap/ongoing-advocacy-efforts/) + * [Webinars](https://rid.org/programs/webinars/) + * [ __RID CEC](https://education.rid.org/) + * [ About Us](https://rid.org/about/) + * [Our Team](https://rid.org/about/#ourteam) + * [Board of Directors](https://rid.org/about/#bod) + * [Board Meetings](https://rid.org/about/governance/#boardmeetings) + * [Board of Directors Nominations Form](https://rid.org/bod-nomination-form/) + * [Nominations Process](https://rid.org/bod-nomination-form/#nominationprocess) + * [2025 National Conference](https://rid.org/about/events/national-conference/) + * [RID Regions](https://rid.org/about/#ridregions) + * [Careers](https://rid.org/careers/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + * [RID Bookstore](https://ridpress.org/) + * [Governance](https://rid.org/about/governance/) + * [Guiding Documents](https://rid.org/about/governance/#guidingdocuments) + * [Volunteer Leadership](https://rid.org/about/volunteer-leadership/) + * [Volunteer Leadership Application](https://rid.org/volunteer-leadership-app/) + * [Resources](https://rid.org/about/resources/) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Annual Reports](https://rid.org/about/governance/#guidingdocuments) + * [Advertising](https://rid.org/about/advertising/) + * [Resources](https://rid.org/about/resources/) + * [For the Consumer](https://rid.org/about/resources/#fortheconsumer) + * [For the Interpreter](https://rid.org/about/resources/#fortheinterpreter) + * [Standard Practice Papers](https://rid.org/about/resources/#spp) + * [Newsroom](https://rid.org/resources/newsroom/) + * [Position Statements](https://rid.org/about/resources/#positionstatements) + * Search for: + +#### Advertising + +# Maximize Your Exposure. + +Advertise with RID and reach thousands. + +![](https://rid.org/wp-content/uploads/2023/03/Advertising-Header.jpg) + +Advertising[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2024-07-05T17:55:01+00:00 + +![363](https://rid.org/wp-content/uploads/2022/09/363.jpg) + +## Advertise & build your network and reach + +With over 14,000 members in the U.S. and abroad, RID is the largest, +comprehensive registry of American Sign Language (ASL) interpreters in the +country! Easily reach our members through our eNEWS, VIEWS, and website/ +social media platforms for your company or organizationโ€™s job announcements, +events, and promotions. Interactive opportunities available to engage your +potential customers and clients in a way that is unmatched. + +__ + +## Job Ad + +Give your job opportunities a boost on our website and social media platforms + +__ + +## eNews Insert + +Delivered monthly to the inbox of over 12k members + +__ + +## VIEWS Ad + +Our quarterly publication with the ability to add an interactive flair + +[Advertising Options](https://rid.org/wp- +content/uploads/2023/04/RID-2023-Advertising-Media-Kit.pdf) + +# + +Job Board + + * ![](https://rid.org/wp-content/uploads/2025/03/University-of-Rochester-Logo-320x202.png) + +[](https://rid.org/rochester-director-of-deaf-professional-interpreter- +services/) + +## [U of Rochester Director of Deaf Professional Interpreter +Services](https://rid.org/rochester-director-of-deaf-professional-interpreter- +services/) + +The Director of Deaf Professional Interpreter Services (DPIS) is [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-03-12T15:59:14+00:00March 12, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on U of Rochester +Director of Deaf Professional Interpreter Services + +[Read More](https://rid.org/rochester-director-of-deaf-professional- +interpreter-services/) + + * ![](https://rid.org/wp-content/uploads/2025/03/occ-logo-open-graph-320x202.png) + +[](https://rid.org/occ-asl-interpreting-instructor/) + +## [Oakland Community College ASL-Interpreting +Instructor](https://rid.org/occ-asl-interpreting-instructor/) + +Oakland Community College in Auburn Hills, Michigan, is seeking [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-03-12T13:50:08+00:00March 12, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on Oakland Community +College ASL-Interpreting Instructor + +[Read More](https://rid.org/occ-asl-interpreting-instructor/) + + * ![](https://rid.org/wp-content/uploads/2024/12/AMN-Healthcare-Logo-Smaller-320x202.png) + +[](https://rid.org/amn-medical-vri/) + +## [AMN Healthcare Medical VR Interpreter](https://rid.org/amn-medical-vri/) + +The ASL Medical Video Remote Interpreter (VRI) will cover a wide range [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-02-21T14:48:40+00:00February 21, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on AMN Healthcare +Medical VR Interpreter + +[Read More](https://rid.org/amn-medical-vri/) + + * ![](data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27887%27%20height%3D%27380%27%20viewBox%3D%270%200%20887%20380%27%3E%3Crect%20width%3D%27887%27%20height%3D%27380%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E) + +[](https://rid.org/uc-santa-barbara-asl-interpreter/) + +## [UC Santa Barbara ASL Interpreter](https://rid.org/uc-santa-barbara-asl- +interpreter/) + +The Interpreter works between spoken English and American Sign [...] + +[Jenelle Bloom](https://rid.org/author/jbloom/ "Posts by Jenelle +Bloom")2025-02-14T21:54:55+00:00February 14, 2025|Categories: [Job +Board](https://rid.org/category/job-board/)|Comments Off on UC Santa Barbara +ASL Interpreter + +[Read More](https://rid.org/uc-santa-barbara-asl-interpreter/) + +[Submit a Job Listing!](mailto:advertising@rid.org) + +__ + +![Registry of Interpreters for the Deaf, Inc. Logo](https://rid.org/wp- +content/uploads/2023/04/RID-big-i-Logo-no-bg.png)![Registry of Interpreters +for the Deaf, Inc. Logo](https://rid.org/wp-content/uploads/2023/04/RID-big-i- +Logo-no-bg.png)![Registry of Interpreters for the Deaf, Inc. +Logo](https://rid.org/wp-content/uploads/2023/04/RID-big-i-Logo-no-bg.png) + +RIDโ€™s purpose is to serve equally our members, profession, and the public by +promoting and advocating for qualified and effective interpreters in all +spaces where intersectional diverse Deaf lives are impacted. + + * [Certification](https://rid.org/certification/) + * [Certification Maintenance](https://rid.org/programs/certification-maintenance/) + * [Membership](https://rid.org/programs/membership/) + * [Ethics](https://rid.org/programs/ethics/) + * [About Us](https://rid.org/about/) + + * [Member Login](https://myaccount.rid.org/Login.aspx?ReturnUrl=%2f) + * [Careers](https://rid.org/careers/) + * [FAQs](https://rid.org/faqs/) + * [Job Board](https://rid.org/about/advertising/#ridjobboard) + +### + +### Business Info + +Registry of Interpreters for the Deaf, Inc. +PO Box 17581 +Arlington, VA 22216-7581 + +__703-838-0030 + +[ __Contact Us](https://rid.org/contact/) + +RID, Inc. ยฉ 2025 + +[](https://www.facebook.com/RIDInc +"Facebook")[](https://www.instagram.com/ridinc/ +"Instagram")[](https://www.youtube.com/RIDOfficialChannel +"YouTube")[](https://www.linkedin.com/company/registry-of-interpreters-for- +the-deaf-inc. "LinkedIn") + +Back to top + +Page load link + diff --git a/intelaide-backend/documents/user_3/assistant_2/faiss_index.bin b/intelaide-backend/documents/user_3/assistant_2/faiss_index.bin new file mode 100644 index 0000000000000000000000000000000000000000..e79cafb9aaf27e749794682325a0f41c69c7df7f GIT binary patch literal 2416134 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⪻Ki(Z%Kka?l^!oN$MJ7@w8pTE&S~Gyd@;O&qkFeP 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

RH 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
X`!^))g@vy(8mOM&yj9Ri2wY3!z( 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
PcYLrA0tIu?kCmUck^Z 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

-jrEy*JfSo`@{Cs(gT`dvjse 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%0AW%g*fOZyS`o` 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