khoj 1.33.3.dev32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- khoj/__init__.py +0 -0
- khoj/app/README.md +94 -0
- khoj/app/__init__.py +0 -0
- khoj/app/asgi.py +16 -0
- khoj/app/settings.py +218 -0
- khoj/app/urls.py +25 -0
- khoj/configure.py +452 -0
- khoj/database/__init__.py +0 -0
- khoj/database/adapters/__init__.py +1821 -0
- khoj/database/admin.py +417 -0
- khoj/database/apps.py +6 -0
- khoj/database/management/__init__.py +0 -0
- khoj/database/management/commands/__init__.py +0 -0
- khoj/database/management/commands/change_default_model.py +116 -0
- khoj/database/management/commands/change_generated_images_url.py +61 -0
- khoj/database/management/commands/convert_images_png_to_webp.py +99 -0
- khoj/database/migrations/0001_khojuser.py +98 -0
- khoj/database/migrations/0002_googleuser.py +32 -0
- khoj/database/migrations/0003_vector_extension.py +10 -0
- khoj/database/migrations/0004_content_types_and_more.py +181 -0
- khoj/database/migrations/0005_embeddings_corpus_id.py +19 -0
- khoj/database/migrations/0006_embeddingsdates.py +33 -0
- khoj/database/migrations/0007_add_conversation.py +27 -0
- khoj/database/migrations/0008_alter_conversation_conversation_log.py +17 -0
- khoj/database/migrations/0009_khojapiuser.py +24 -0
- khoj/database/migrations/0010_chatmodeloptions_and_more.py +83 -0
- khoj/database/migrations/0010_rename_embeddings_entry_and_more.py +30 -0
- khoj/database/migrations/0011_merge_20231102_0138.py +14 -0
- khoj/database/migrations/0012_entry_file_source.py +21 -0
- khoj/database/migrations/0013_subscription.py +37 -0
- khoj/database/migrations/0014_alter_googleuser_picture.py +17 -0
- khoj/database/migrations/0015_alter_subscription_user.py +21 -0
- khoj/database/migrations/0016_alter_subscription_renewal_date.py +17 -0
- khoj/database/migrations/0017_searchmodel.py +32 -0
- khoj/database/migrations/0018_searchmodelconfig_delete_searchmodel.py +30 -0
- khoj/database/migrations/0019_alter_googleuser_family_name_and_more.py +27 -0
- khoj/database/migrations/0020_reflectivequestion.py +36 -0
- khoj/database/migrations/0021_speechtotextmodeloptions_and_more.py +42 -0
- khoj/database/migrations/0022_texttoimagemodelconfig.py +25 -0
- khoj/database/migrations/0023_usersearchmodelconfig.py +33 -0
- khoj/database/migrations/0024_alter_entry_embeddings.py +18 -0
- khoj/database/migrations/0025_clientapplication_khojuser_phone_number_and_more.py +46 -0
- khoj/database/migrations/0025_searchmodelconfig_embeddings_inference_endpoint_and_more.py +22 -0
- khoj/database/migrations/0026_searchmodelconfig_cross_encoder_inference_endpoint_and_more.py +22 -0
- khoj/database/migrations/0027_merge_20240118_1324.py +13 -0
- khoj/database/migrations/0028_khojuser_verified_phone_number.py +17 -0
- khoj/database/migrations/0029_userrequests.py +27 -0
- khoj/database/migrations/0030_conversation_slug_and_title.py +38 -0
- khoj/database/migrations/0031_agent_conversation_agent.py +53 -0
- khoj/database/migrations/0031_alter_googleuser_locale.py +30 -0
- khoj/database/migrations/0032_merge_20240322_0427.py +14 -0
- khoj/database/migrations/0033_rename_tuning_agent_personality.py +17 -0
- khoj/database/migrations/0034_alter_chatmodeloptions_chat_model.py +32 -0
- khoj/database/migrations/0035_processlock.py +26 -0
- khoj/database/migrations/0036_alter_processlock_name.py +19 -0
- khoj/database/migrations/0036_delete_offlinechatprocessorconversationconfig.py +15 -0
- khoj/database/migrations/0036_publicconversation.py +42 -0
- khoj/database/migrations/0037_chatmodeloptions_openai_config_and_more.py +51 -0
- khoj/database/migrations/0037_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +32 -0
- khoj/database/migrations/0038_merge_20240425_0857.py +14 -0
- khoj/database/migrations/0038_merge_20240426_1640.py +12 -0
- khoj/database/migrations/0039_merge_20240501_0301.py +12 -0
- khoj/database/migrations/0040_alter_processlock_name.py +26 -0
- khoj/database/migrations/0040_merge_20240504_1010.py +14 -0
- khoj/database/migrations/0041_merge_20240505_1234.py +14 -0
- khoj/database/migrations/0042_serverchatsettings.py +46 -0
- khoj/database/migrations/0043_alter_chatmodeloptions_model_type.py +21 -0
- khoj/database/migrations/0044_conversation_file_filters.py +17 -0
- khoj/database/migrations/0045_fileobject.py +37 -0
- khoj/database/migrations/0046_khojuser_email_verification_code_and_more.py +22 -0
- khoj/database/migrations/0047_alter_entry_file_type.py +31 -0
- khoj/database/migrations/0048_voicemodeloption_uservoicemodelconfig.py +52 -0
- khoj/database/migrations/0049_datastore.py +38 -0
- khoj/database/migrations/0049_texttoimagemodelconfig_api_key_and_more.py +58 -0
- khoj/database/migrations/0050_alter_processlock_name.py +25 -0
- khoj/database/migrations/0051_merge_20240702_1220.py +14 -0
- khoj/database/migrations/0052_alter_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +27 -0
- khoj/database/migrations/0053_agent_style_color_agent_style_icon.py +61 -0
- khoj/database/migrations/0054_alter_agent_style_color.py +38 -0
- khoj/database/migrations/0055_alter_agent_style_icon.py +37 -0
- khoj/database/migrations/0056_chatmodeloptions_vision_enabled.py +17 -0
- khoj/database/migrations/0056_searchmodelconfig_cross_encoder_model_config.py +17 -0
- khoj/database/migrations/0057_merge_20240816_1409.py +13 -0
- khoj/database/migrations/0057_remove_serverchatsettings_default_model_and_more.py +51 -0
- khoj/database/migrations/0058_alter_chatmodeloptions_chat_model.py +17 -0
- khoj/database/migrations/0059_searchmodelconfig_bi_encoder_confidence_threshold.py +17 -0
- khoj/database/migrations/0060_merge_20240905_1828.py +14 -0
- khoj/database/migrations/0061_alter_chatmodeloptions_model_type.py +26 -0
- khoj/database/migrations/0061_alter_texttoimagemodelconfig_model_type.py +21 -0
- khoj/database/migrations/0062_merge_20240913_0222.py +14 -0
- khoj/database/migrations/0063_conversation_temp_id.py +36 -0
- khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +86 -0
- khoj/database/migrations/0065_remove_agent_avatar_remove_agent_public_and_more.py +49 -0
- khoj/database/migrations/0066_remove_agent_tools_agent_input_tools_and_more.py +69 -0
- khoj/database/migrations/0067_alter_agent_style_icon.py +50 -0
- khoj/database/migrations/0068_alter_agent_output_modes.py +24 -0
- khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +89 -0
- khoj/database/migrations/0070_alter_agent_input_tools_alter_agent_output_modes.py +46 -0
- khoj/database/migrations/0071_subscription_enabled_trial_at_and_more.py +32 -0
- khoj/database/migrations/0072_entry_search_model.py +24 -0
- khoj/database/migrations/0073_delete_usersearchmodelconfig.py +15 -0
- khoj/database/migrations/0074_alter_conversation_title.py +17 -0
- khoj/database/migrations/0075_migrate_generated_assets_and_validate.py +85 -0
- khoj/database/migrations/0076_rename_openaiprocessorconversationconfig_aimodelapi_and_more.py +26 -0
- khoj/database/migrations/0077_chatmodel_alter_agent_chat_model_and_more.py +62 -0
- khoj/database/migrations/0078_khojuser_email_verification_code_expiry.py +17 -0
- khoj/database/migrations/__init__.py +0 -0
- khoj/database/models/__init__.py +725 -0
- khoj/database/tests.py +3 -0
- khoj/interface/compiled/404/index.html +1 -0
- khoj/interface/compiled/_next/static/Tg-vU1p1B-YKT5Qv8KSHt/_buildManifest.js +1 -0
- khoj/interface/compiled/_next/static/Tg-vU1p1B-YKT5Qv8KSHt/_ssgManifest.js +1 -0
- khoj/interface/compiled/_next/static/chunks/1010-8f39bb4648b5ba10.js +1 -0
- khoj/interface/compiled/_next/static/chunks/182-f1c48a203dc91e0e.js +20 -0
- khoj/interface/compiled/_next/static/chunks/1915-d3c36ad6ce697ce7.js +1 -0
- khoj/interface/compiled/_next/static/chunks/2117-165ef4747a5b836b.js +2 -0
- khoj/interface/compiled/_next/static/chunks/2581-455000f8aeb08fc3.js +1 -0
- khoj/interface/compiled/_next/static/chunks/3727.dcea8f2193111552.js +1 -0
- khoj/interface/compiled/_next/static/chunks/3789-a09e37a819171a9d.js +1 -0
- khoj/interface/compiled/_next/static/chunks/4124-6c28322ce218d2d5.js +1 -0
- khoj/interface/compiled/_next/static/chunks/5427-b52d95253e692bfa.js +1 -0
- khoj/interface/compiled/_next/static/chunks/5473-b1cf56dedac6577a.js +1 -0
- khoj/interface/compiled/_next/static/chunks/5477-0bbddb79c25a54a7.js +1 -0
- khoj/interface/compiled/_next/static/chunks/6065-64db9ad305ba0bcd.js +1 -0
- khoj/interface/compiled/_next/static/chunks/6293-469dd16402ea8a6f.js +3 -0
- khoj/interface/compiled/_next/static/chunks/688-b5b4391bbc0376f1.js +1 -0
- khoj/interface/compiled/_next/static/chunks/8667-b6bf63c72b2d76eb.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9259-1172dbaca0515237.js +1 -0
- khoj/interface/compiled/_next/static/chunks/94ca1967.1d9b42d929a1ee8c.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9597.83583248dfbf6e73.js +1 -0
- khoj/interface/compiled/_next/static/chunks/964ecbae.51d6faf8801d15e6.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9665-391df1e5c51c960a.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/_not-found/page-a834eddae3e235df.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/page-28ce086a1129bca2.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/automations/layout-1fe1537449f43496.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/automations/page-bf365a60829d347f.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/chat/layout-33934fc2d6ae6838.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/chat/page-0e476e57eb2015e3.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/layout-30e7fda7262713ce.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/page-a5515ea71aec5ef0.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/search/layout-c02531d586972d7d.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/search/page-9140541e67ea307d.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/settings/layout-d09d6510a45cd4bd.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/settings/page-951ba40b5b94b23a.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/share/chat/page-1beb80d8d741c932.js +1 -0
- khoj/interface/compiled/_next/static/chunks/d3ac728e-44ebd2a0c99b12a0.js +1 -0
- khoj/interface/compiled/_next/static/chunks/fd9d1056-4482b99a36fd1673.js +1 -0
- khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
- khoj/interface/compiled/_next/static/chunks/main-app-de1f09df97a3cfc7.js +1 -0
- khoj/interface/compiled/_next/static/chunks/main-db4bfac6b0a8d00b.js +1 -0
- khoj/interface/compiled/_next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
- khoj/interface/compiled/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
- khoj/interface/compiled/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- khoj/interface/compiled/_next/static/chunks/webpack-a03962458328b163.js +1 -0
- khoj/interface/compiled/_next/static/css/089de1d8526b96e9.css +1 -0
- khoj/interface/compiled/_next/static/css/37a73b87f02df402.css +1 -0
- khoj/interface/compiled/_next/static/css/4e4e6a4a1c920d06.css +1 -0
- khoj/interface/compiled/_next/static/css/8d02837c730f8d13.css +25 -0
- khoj/interface/compiled/_next/static/css/8e6a3ca11a60b189.css +1 -0
- khoj/interface/compiled/_next/static/css/9c164d9727dd8092.css +1 -0
- khoj/interface/compiled/_next/static/css/dac88c17aaee5fcf.css +1 -0
- khoj/interface/compiled/_next/static/css/df4b47a2d0d85eae.css +1 -0
- khoj/interface/compiled/_next/static/css/e4eb883b5265d372.css +1 -0
- khoj/interface/compiled/_next/static/media/1d8a05b60287ae6c-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/6f22fce21a7c433c-s.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/77c207b095007c34-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/82ef96de0e8f4d8c-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- khoj/interface/compiled/_next/static/media/a6ecd16fa044d500-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/bd82c78e5b7b3fe9-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/c32c8052c071fc42-s.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/c4250770ab8708b6-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/e098aaaecc9cfbb2-s.p.woff2 +0 -0
- khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp +0 -0
- khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp +0 -0
- khoj/interface/compiled/_next/static/media/globe.98e105ca.webp +0 -0
- khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp +0 -0
- khoj/interface/compiled/agents/index.html +1 -0
- khoj/interface/compiled/agents/index.txt +7 -0
- khoj/interface/compiled/agents.svg +6 -0
- khoj/interface/compiled/assets/icons/khoj_lantern.ico +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern.svg +100 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_1200x1200.png +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_128x128.png +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_128x128_dark.png +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_256x256.png +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_512x512.png +0 -0
- khoj/interface/compiled/assets/icons/khoj_lantern_logomarktype_1200x630.png +0 -0
- khoj/interface/compiled/assets/samples/desktop-browse-draw-sample.png +0 -0
- khoj/interface/compiled/assets/samples/desktop-plain-chat-sample.png +0 -0
- khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png +0 -0
- khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png +0 -0
- khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png +0 -0
- khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png +0 -0
- khoj/interface/compiled/automation.svg +37 -0
- khoj/interface/compiled/automations/index.html +1 -0
- khoj/interface/compiled/automations/index.txt +8 -0
- khoj/interface/compiled/chat/index.html +1 -0
- khoj/interface/compiled/chat/index.txt +7 -0
- khoj/interface/compiled/chat.svg +24 -0
- khoj/interface/compiled/close.svg +5 -0
- khoj/interface/compiled/copy-button-success.svg +6 -0
- khoj/interface/compiled/copy-button.svg +5 -0
- khoj/interface/compiled/index.html +1 -0
- khoj/interface/compiled/index.txt +7 -0
- khoj/interface/compiled/khoj.webmanifest +76 -0
- khoj/interface/compiled/logo.svg +24 -0
- khoj/interface/compiled/search/index.html +1 -0
- khoj/interface/compiled/search/index.txt +7 -0
- khoj/interface/compiled/send.svg +1 -0
- khoj/interface/compiled/settings/index.html +1 -0
- khoj/interface/compiled/settings/index.txt +9 -0
- khoj/interface/compiled/share/chat/index.html +1 -0
- khoj/interface/compiled/share/chat/index.txt +7 -0
- khoj/interface/compiled/share.svg +8 -0
- khoj/interface/compiled/thumbs-down.svg +6 -0
- khoj/interface/compiled/thumbs-up.svg +6 -0
- khoj/interface/email/feedback.html +34 -0
- khoj/interface/email/magic_link.html +40 -0
- khoj/interface/email/task.html +37 -0
- khoj/interface/email/welcome.html +90 -0
- khoj/interface/web/.well-known/assetlinks.json +11 -0
- khoj/interface/web/assets/icons/agents.svg +19 -0
- khoj/interface/web/assets/icons/automation.svg +43 -0
- khoj/interface/web/assets/icons/chat.svg +24 -0
- khoj/interface/web/assets/icons/github.svg +1 -0
- khoj/interface/web/assets/icons/khoj-logo-sideways-200.png +0 -0
- khoj/interface/web/assets/icons/khoj-logo-sideways-500.png +0 -0
- khoj/interface/web/assets/icons/khoj-logo-sideways.svg +32 -0
- khoj/interface/web/assets/icons/khoj.svg +26 -0
- khoj/interface/web/assets/icons/logotype.svg +1 -0
- khoj/interface/web/assets/icons/search.svg +57 -0
- khoj/interface/web/assets/icons/sync.svg +4 -0
- khoj/interface/web/assets/khoj.css +237 -0
- khoj/interface/web/assets/utils.js +33 -0
- khoj/interface/web/base_config.html +445 -0
- khoj/interface/web/content_source_github_input.html +208 -0
- khoj/interface/web/login.html +310 -0
- khoj/interface/web/utils.html +48 -0
- khoj/main.py +249 -0
- khoj/manage.py +22 -0
- khoj/migrations/__init__.py +0 -0
- khoj/migrations/migrate_offline_chat_default_model.py +69 -0
- khoj/migrations/migrate_offline_chat_default_model_2.py +71 -0
- khoj/migrations/migrate_offline_chat_schema.py +83 -0
- khoj/migrations/migrate_offline_model.py +29 -0
- khoj/migrations/migrate_processor_config_openai.py +67 -0
- khoj/migrations/migrate_server_pg.py +132 -0
- khoj/migrations/migrate_version.py +17 -0
- khoj/processor/__init__.py +0 -0
- khoj/processor/content/__init__.py +0 -0
- khoj/processor/content/docx/__init__.py +0 -0
- khoj/processor/content/docx/docx_to_entries.py +111 -0
- khoj/processor/content/github/__init__.py +0 -0
- khoj/processor/content/github/github_to_entries.py +226 -0
- khoj/processor/content/images/__init__.py +0 -0
- khoj/processor/content/images/image_to_entries.py +117 -0
- khoj/processor/content/markdown/__init__.py +0 -0
- khoj/processor/content/markdown/markdown_to_entries.py +160 -0
- khoj/processor/content/notion/notion_to_entries.py +259 -0
- khoj/processor/content/org_mode/__init__.py +0 -0
- khoj/processor/content/org_mode/org_to_entries.py +226 -0
- khoj/processor/content/org_mode/orgnode.py +532 -0
- khoj/processor/content/pdf/__init__.py +0 -0
- khoj/processor/content/pdf/pdf_to_entries.py +119 -0
- khoj/processor/content/plaintext/__init__.py +0 -0
- khoj/processor/content/plaintext/plaintext_to_entries.py +117 -0
- khoj/processor/content/text_to_entries.py +296 -0
- khoj/processor/conversation/__init__.py +0 -0
- khoj/processor/conversation/anthropic/__init__.py +0 -0
- khoj/processor/conversation/anthropic/anthropic_chat.py +243 -0
- khoj/processor/conversation/anthropic/utils.py +217 -0
- khoj/processor/conversation/google/__init__.py +0 -0
- khoj/processor/conversation/google/gemini_chat.py +253 -0
- khoj/processor/conversation/google/utils.py +260 -0
- khoj/processor/conversation/offline/__init__.py +0 -0
- khoj/processor/conversation/offline/chat_model.py +308 -0
- khoj/processor/conversation/offline/utils.py +80 -0
- khoj/processor/conversation/offline/whisper.py +15 -0
- khoj/processor/conversation/openai/__init__.py +0 -0
- khoj/processor/conversation/openai/gpt.py +243 -0
- khoj/processor/conversation/openai/utils.py +232 -0
- khoj/processor/conversation/openai/whisper.py +13 -0
- khoj/processor/conversation/prompts.py +1188 -0
- khoj/processor/conversation/utils.py +867 -0
- khoj/processor/embeddings.py +122 -0
- khoj/processor/image/generate.py +215 -0
- khoj/processor/speech/__init__.py +0 -0
- khoj/processor/speech/text_to_speech.py +51 -0
- khoj/processor/tools/__init__.py +0 -0
- khoj/processor/tools/online_search.py +472 -0
- khoj/processor/tools/run_code.py +179 -0
- khoj/routers/__init__.py +0 -0
- khoj/routers/api.py +760 -0
- khoj/routers/api_agents.py +295 -0
- khoj/routers/api_chat.py +1273 -0
- khoj/routers/api_content.py +634 -0
- khoj/routers/api_model.py +123 -0
- khoj/routers/api_phone.py +86 -0
- khoj/routers/api_subscription.py +144 -0
- khoj/routers/auth.py +307 -0
- khoj/routers/email.py +135 -0
- khoj/routers/helpers.py +2333 -0
- khoj/routers/notion.py +85 -0
- khoj/routers/research.py +364 -0
- khoj/routers/storage.py +63 -0
- khoj/routers/twilio.py +36 -0
- khoj/routers/web_client.py +141 -0
- khoj/search_filter/__init__.py +0 -0
- khoj/search_filter/base_filter.py +15 -0
- khoj/search_filter/date_filter.py +215 -0
- khoj/search_filter/file_filter.py +32 -0
- khoj/search_filter/word_filter.py +29 -0
- khoj/search_type/__init__.py +0 -0
- khoj/search_type/text_search.py +255 -0
- khoj/utils/__init__.py +0 -0
- khoj/utils/cli.py +101 -0
- khoj/utils/config.py +81 -0
- khoj/utils/constants.py +51 -0
- khoj/utils/fs_syncer.py +252 -0
- khoj/utils/helpers.py +627 -0
- khoj/utils/initialization.py +301 -0
- khoj/utils/jsonl.py +43 -0
- khoj/utils/models.py +47 -0
- khoj/utils/rawconfig.py +208 -0
- khoj/utils/state.py +48 -0
- khoj/utils/yaml.py +47 -0
- khoj-1.33.3.dev32.dist-info/METADATA +190 -0
- khoj-1.33.3.dev32.dist-info/RECORD +393 -0
- khoj-1.33.3.dev32.dist-info/WHEEL +4 -0
- khoj-1.33.3.dev32.dist-info/entry_points.txt +2 -0
- khoj-1.33.3.dev32.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,310 @@
|
|
1
|
+
<html>
|
2
|
+
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
6
|
+
<title>Khoj - Login</title>
|
7
|
+
<link rel="icon" type="image/png" sizes="128x128" href="https://assets.khoj.dev/khoj_lantern_128x128.png">
|
8
|
+
<link rel="manifest" href="/static/khoj.webmanifest">
|
9
|
+
<link rel="stylesheet" href="/static/assets/khoj.css">
|
10
|
+
<meta property="og:image" content="https://assets.khoj.dev/khoj_hero.png">
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body>
|
14
|
+
<div class="split-container">
|
15
|
+
<!-- Left side with login -->
|
16
|
+
<div class="split left">
|
17
|
+
<div id="login-modal">
|
18
|
+
<img class="khoj-logo" src="https://assets.khoj.dev/khoj_lantern_128x128.png" alt="Khoj">
|
19
|
+
<div class="login-modal-title">Login to Khoj</div>
|
20
|
+
<!-- Sign Up/Login with Google OAuth -->
|
21
|
+
<div class="g_id_signin" data-shape="circle" data-text="continue_with" data-logo_alignment="center"
|
22
|
+
data-size="large" data-type="standard"></div>
|
23
|
+
<div id="g_id_onload" data-client_id="{{ google_client_id }}" data-ux_mode="popup"
|
24
|
+
data-use_fedcm_for_prompt="true" data-login_uri="{{ redirect_uri }}" data-auto-select="true"></div>
|
25
|
+
|
26
|
+
<!-- Divider -->
|
27
|
+
<div class="divider">OR</div>
|
28
|
+
<!-- Sign in with Magic Link -->
|
29
|
+
<div class="khoj-magic-link">
|
30
|
+
<input type="email" id="email" placeholder="Email" autofocus required>
|
31
|
+
<button id="magic-link-button">Get Login Link</button>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
</div>
|
35
|
+
<!-- Footer links -->
|
36
|
+
<div class="footer-links">
|
37
|
+
<a href="https://khoj.dev/terms-of-service" target="_blank">Terms of Service</a>
|
38
|
+
<span class="divider-vertical"></span>
|
39
|
+
<a href="https://khoj.dev/privacy-policy" target="_blank">Privacy Policy</a>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
<!-- Right side with content -->
|
43
|
+
<div class="split right">
|
44
|
+
<div class="right-content">
|
45
|
+
<h1>Unlock Your Second Brain</h1>
|
46
|
+
<p>Transform the way you think, create, and remember</p>
|
47
|
+
<div class="features">
|
48
|
+
<div class="feature">
|
49
|
+
<img src="/static/assets/icons/chat.svg" alt="Chat" width="24" height="24">
|
50
|
+
<span>Get answers across your documents and the internet</span>
|
51
|
+
</div>
|
52
|
+
<div class="feature">
|
53
|
+
<img src="/static/assets/icons/agents.svg" alt="Agents" width="24" height="24">
|
54
|
+
<span>Create agents with the knowledge and tools to take on any role</span>
|
55
|
+
</div>
|
56
|
+
<div class="feature">
|
57
|
+
<img src="/static/assets/icons/automation.svg" alt="Automations" width="24" height="24">
|
58
|
+
<span>Automate away repetitive research</span>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<style>
|
66
|
+
body {
|
67
|
+
margin: 0;
|
68
|
+
height: 100vh;
|
69
|
+
font-family: 'Arial', sans-serif;
|
70
|
+
color: #333;
|
71
|
+
overflow: hidden;
|
72
|
+
}
|
73
|
+
|
74
|
+
.split-container {
|
75
|
+
display: flex;
|
76
|
+
height: 100vh;
|
77
|
+
}
|
78
|
+
|
79
|
+
.split {
|
80
|
+
flex: 1;
|
81
|
+
display: flex;
|
82
|
+
justify-content: center;
|
83
|
+
align-items: center;
|
84
|
+
flex-direction: column;
|
85
|
+
}
|
86
|
+
|
87
|
+
.left {
|
88
|
+
background-color: #fff;
|
89
|
+
}
|
90
|
+
|
91
|
+
.right {
|
92
|
+
background: linear-gradient(135deg, #FFA07A 0%, #c4e4c6 100%);
|
93
|
+
color: white;
|
94
|
+
position: relative;
|
95
|
+
overflow: hidden;
|
96
|
+
}
|
97
|
+
|
98
|
+
.right::before {
|
99
|
+
content: '';
|
100
|
+
position: absolute;
|
101
|
+
top: 0;
|
102
|
+
left: 0;
|
103
|
+
right: 0;
|
104
|
+
bottom: 0;
|
105
|
+
opacity: 0.1;
|
106
|
+
}
|
107
|
+
|
108
|
+
.right-content {
|
109
|
+
text-align: center;
|
110
|
+
padding: 2rem;
|
111
|
+
position: relative;
|
112
|
+
z-index: 1;
|
113
|
+
}
|
114
|
+
|
115
|
+
.right-content h1 {
|
116
|
+
font-size: 3rem;
|
117
|
+
margin-bottom: 1rem;
|
118
|
+
font-weight: 700;
|
119
|
+
}
|
120
|
+
|
121
|
+
.right-content p {
|
122
|
+
font-size: 1.2rem;
|
123
|
+
margin-bottom: 3rem;
|
124
|
+
opacity: 0.9;
|
125
|
+
}
|
126
|
+
|
127
|
+
.features {
|
128
|
+
display: flex;
|
129
|
+
flex-direction: column;
|
130
|
+
gap: 1.5rem;
|
131
|
+
align-items: center;
|
132
|
+
}
|
133
|
+
|
134
|
+
.feature {
|
135
|
+
display: flex;
|
136
|
+
align-items: center;
|
137
|
+
gap: 1rem;
|
138
|
+
font-size: 1.1rem;
|
139
|
+
}
|
140
|
+
|
141
|
+
.feature svg {
|
142
|
+
width: 24px;
|
143
|
+
height: 24px;
|
144
|
+
stroke: white;
|
145
|
+
}
|
146
|
+
.feature img {
|
147
|
+
width: 24px;
|
148
|
+
height: 24px;
|
149
|
+
filter: invert(100%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) contrast(100%);
|
150
|
+
stroke: white;
|
151
|
+
}
|
152
|
+
|
153
|
+
#login-modal {
|
154
|
+
display: grid;
|
155
|
+
background: white;
|
156
|
+
border-radius: 10px;
|
157
|
+
padding: 40px;
|
158
|
+
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
159
|
+
text-align: center;
|
160
|
+
width: max-content;
|
161
|
+
}
|
162
|
+
|
163
|
+
.khoj-logo {
|
164
|
+
width: 80px;
|
165
|
+
margin-bottom: 20px;
|
166
|
+
}
|
167
|
+
|
168
|
+
.login-modal-title {
|
169
|
+
font-size: 24px;
|
170
|
+
font-weight: 600;
|
171
|
+
margin-bottom: 20px;
|
172
|
+
}
|
173
|
+
|
174
|
+
.khoj-magic-link {
|
175
|
+
display: flex;
|
176
|
+
flex-direction: column;
|
177
|
+
gap: 10px;
|
178
|
+
}
|
179
|
+
|
180
|
+
#email {
|
181
|
+
padding: 10px;
|
182
|
+
border: 1px solid #ccc;
|
183
|
+
border-radius: 5px;
|
184
|
+
width: 100%;
|
185
|
+
font-size: 16px;
|
186
|
+
}
|
187
|
+
|
188
|
+
#magic-link-button {
|
189
|
+
padding: 10px;
|
190
|
+
border: none;
|
191
|
+
border-radius: 5px;
|
192
|
+
background-color: #FFA07A;
|
193
|
+
color: white;
|
194
|
+
cursor: pointer;
|
195
|
+
font-size: 16px;
|
196
|
+
transition: background-color 0.3s;
|
197
|
+
}
|
198
|
+
|
199
|
+
#magic-link-button:hover {
|
200
|
+
background-color: #FFA07A
|
201
|
+
}
|
202
|
+
|
203
|
+
#magic-link-button:disabled {
|
204
|
+
background-color: #cccccc;
|
205
|
+
cursor: not-allowed;
|
206
|
+
}
|
207
|
+
|
208
|
+
.divider {
|
209
|
+
display: flex;
|
210
|
+
align-items: center;
|
211
|
+
text-align: center;
|
212
|
+
color: #000;
|
213
|
+
/* Adjust the text color as needed */
|
214
|
+
margin: 20px 0;
|
215
|
+
/* Adjust the margin as needed */
|
216
|
+
}
|
217
|
+
|
218
|
+
.divider::before,
|
219
|
+
.divider::after {
|
220
|
+
content: '';
|
221
|
+
flex: 1;
|
222
|
+
border-bottom: 1px solid #000;
|
223
|
+
/* Adjust the line color as needed */
|
224
|
+
margin: 0 10px;
|
225
|
+
/* Adjust the spacing as needed */
|
226
|
+
}
|
227
|
+
|
228
|
+
.g_id_signin {
|
229
|
+
margin: 0 auto;
|
230
|
+
display: block;
|
231
|
+
}
|
232
|
+
|
233
|
+
.footer-links {
|
234
|
+
width: 100%;
|
235
|
+
text-align: center;
|
236
|
+
font-size: 0.9em;
|
237
|
+
color: #666;
|
238
|
+
margin-top: 20px;
|
239
|
+
}
|
240
|
+
|
241
|
+
.footer-links a {
|
242
|
+
color: #666;
|
243
|
+
text-decoration: none;
|
244
|
+
margin: 0 10px;
|
245
|
+
}
|
246
|
+
|
247
|
+
.footer-links a:hover {
|
248
|
+
text-decoration: underline;
|
249
|
+
}
|
250
|
+
|
251
|
+
.divider-vertical {
|
252
|
+
display: inline-block;
|
253
|
+
width: 1px;
|
254
|
+
height: 12px;
|
255
|
+
background-color: #666;
|
256
|
+
margin: 0 10px;
|
257
|
+
vertical-align: middle;
|
258
|
+
}
|
259
|
+
|
260
|
+
@media (max-width: 768px) {
|
261
|
+
.split-container {
|
262
|
+
flex-direction: column;
|
263
|
+
}
|
264
|
+
|
265
|
+
.right {
|
266
|
+
display: none;
|
267
|
+
}
|
268
|
+
|
269
|
+
.left {
|
270
|
+
padding: 2rem;
|
271
|
+
}
|
272
|
+
}
|
273
|
+
</style>
|
274
|
+
|
275
|
+
<script>
|
276
|
+
const magicLinkButton = document.getElementById('magic-link-button');
|
277
|
+
const emailInput = document.getElementById('email');
|
278
|
+
magicLinkButton.addEventListener('click', async () => {
|
279
|
+
const email = emailInput.value;
|
280
|
+
if (!email) {
|
281
|
+
alert('Please enter a valid email address');
|
282
|
+
return;
|
283
|
+
}
|
284
|
+
if (!email.includes('@')) {
|
285
|
+
alert('Please enter a valid email address');
|
286
|
+
return;
|
287
|
+
}
|
288
|
+
magicLinkButton.disabled = true;
|
289
|
+
magicLinkButton.innerText = 'Check your email for a sign-in link!';
|
290
|
+
const response = await fetch('/auth/magic', {
|
291
|
+
method: 'POST',
|
292
|
+
headers: {
|
293
|
+
'Content-Type': 'application/json',
|
294
|
+
},
|
295
|
+
body: JSON.stringify({ "email": email }),
|
296
|
+
});
|
297
|
+
if (response.status === 200) {
|
298
|
+
console.log('Magic link sent to your email');
|
299
|
+
} else {
|
300
|
+
alert('Failed to send magic link');
|
301
|
+
magicLinkButton.disabled = false;
|
302
|
+
magicLinkButton.innerText = 'Get Login Link';
|
303
|
+
}
|
304
|
+
});
|
305
|
+
</script>
|
306
|
+
|
307
|
+
<script src="https://accounts.google.com/gsi/client" async defer></script>
|
308
|
+
</body>
|
309
|
+
|
310
|
+
</html>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
{% macro heading_pane(user_photo, username, is_active, has_documents) -%}
|
2
|
+
<div class="khoj-header">
|
3
|
+
<a class="khoj-logo" href="/">
|
4
|
+
<img class="khoj-logo" src="/static/assets/icons/khoj-logo-sideways-500.png?v={{ khoj_version }}" alt="Khoj"></img>
|
5
|
+
</a>
|
6
|
+
<nav class="khoj-nav">
|
7
|
+
<a id="chat-nav" class="khoj-nav" href="/chat">
|
8
|
+
<img class="nav-icon" src="/static/assets/icons/chat.svg" alt="Chat">
|
9
|
+
<span class="khoj-nav-item-text">Chat</span></a>
|
10
|
+
<a id="agents-nav" class="khoj-nav" href="/agents">
|
11
|
+
<img id="agents-icon" class="nav-icon" src="/static/assets/icons/agents.svg" alt="Agents">
|
12
|
+
<span class="khoj-nav-item-text">Agents</span></a>
|
13
|
+
<a id="automations-nav" class="khoj-nav" href="/automations">
|
14
|
+
<img class="nav-icon" src="/static/assets/icons/automation.svg" alt="Automation">
|
15
|
+
<span class="khoj-nav-item-text">Automate</span></a>
|
16
|
+
{% if has_documents %}
|
17
|
+
<a id="search-nav" class="khoj-nav" href="/search">
|
18
|
+
<img class="nav-icon" src="/static/assets/icons/search.svg" alt="Search">
|
19
|
+
<span class="khoj-nav-item-text">Search</span></a>
|
20
|
+
{% endif %}
|
21
|
+
<!-- Dropdown Menu -->
|
22
|
+
{% if username %}
|
23
|
+
<div id="khoj-nav-menu-container" class="khoj-nav dropdown">
|
24
|
+
{% if user_photo and user_photo != "None" %}
|
25
|
+
{% if is_active %}
|
26
|
+
<img id="profile-picture" class="circle subscribed" src="{{ user_photo }}" alt="{{ username[0].upper() }}" onclick="toggleMenu()" referrerpolicy="no-referrer">
|
27
|
+
{% else %}
|
28
|
+
<img id="profile-picture" class="circle" src="{{ user_photo }}" alt="{{ username[0].upper() }}" onclick="toggleMenu()" referrerpolicy="no-referrer">
|
29
|
+
{% endif %}
|
30
|
+
{% else %}
|
31
|
+
{% if is_active %}
|
32
|
+
<div id="profile-picture" class="circle user-initial subscribed" alt="{{ username[0].upper() }}" onclick="toggleMenu()">{{ username[0].upper() }}</div>
|
33
|
+
{% else %}
|
34
|
+
<div id="profile-picture" class="circle user-initial" alt="{{ username[0].upper() }}" onclick="toggleMenu()">{{ username[0].upper() }}</div>
|
35
|
+
{% endif %}
|
36
|
+
{% endif %}
|
37
|
+
<div id="khoj-nav-menu" class="khoj-nav-dropdown-content">
|
38
|
+
<div class="khoj-nav-username"> {{ username }} </div>
|
39
|
+
<a id="settings-nav" class="khoj-nav" href="/settings">Settings</a>
|
40
|
+
<a id="github-nav" class="khoj-nav" href="https://github.com/khoj-ai/khoj">GitHub</a>
|
41
|
+
<a id="help-nav" class="khoj-nav" href="https://docs.khoj.dev" target="_blank">Help</a>
|
42
|
+
<a class="khoj-nav" href="/auth/logout">Logout</a>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
{% endif %}
|
46
|
+
</nav>
|
47
|
+
</div>
|
48
|
+
{%- endmacro %}
|
khoj/main.py
ADDED
@@ -0,0 +1,249 @@
|
|
1
|
+
""" Main module for Khoj
|
2
|
+
isort:skip_file
|
3
|
+
"""
|
4
|
+
|
5
|
+
from contextlib import redirect_stdout
|
6
|
+
import logging
|
7
|
+
import io
|
8
|
+
import os
|
9
|
+
import atexit
|
10
|
+
import sys
|
11
|
+
import locale
|
12
|
+
|
13
|
+
from rich.logging import RichHandler
|
14
|
+
import threading
|
15
|
+
import warnings
|
16
|
+
from importlib.metadata import version
|
17
|
+
|
18
|
+
from khoj.utils.helpers import in_debug_mode, is_env_var_true
|
19
|
+
|
20
|
+
# Ignore non-actionable warnings
|
21
|
+
warnings.filterwarnings("ignore", message=r"snapshot_download.py has been made private", category=FutureWarning)
|
22
|
+
warnings.filterwarnings("ignore", message=r"legacy way to download files from the HF hub,", category=FutureWarning)
|
23
|
+
|
24
|
+
|
25
|
+
import uvicorn
|
26
|
+
import django
|
27
|
+
from apscheduler.schedulers.background import BackgroundScheduler
|
28
|
+
from fastapi import FastAPI
|
29
|
+
from fastapi.middleware.cors import CORSMiddleware
|
30
|
+
from fastapi.staticfiles import StaticFiles
|
31
|
+
import schedule
|
32
|
+
|
33
|
+
from django.core.asgi import get_asgi_application
|
34
|
+
from django.core.management import call_command
|
35
|
+
|
36
|
+
# Initialize Django
|
37
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "khoj.app.settings")
|
38
|
+
django.setup()
|
39
|
+
|
40
|
+
# Setup Logger
|
41
|
+
rich_handler = RichHandler(rich_tracebacks=True)
|
42
|
+
rich_handler.setFormatter(fmt=logging.Formatter(fmt="%(name)s: %(message)s", datefmt="[%H:%M:%S.%f]"))
|
43
|
+
logging.basicConfig(handlers=[rich_handler])
|
44
|
+
|
45
|
+
logging.getLogger("uvicorn.error").setLevel(logging.INFO)
|
46
|
+
|
47
|
+
logger = logging.getLogger("khoj")
|
48
|
+
|
49
|
+
# Initialize Django Database
|
50
|
+
db_migrate_output = io.StringIO()
|
51
|
+
with redirect_stdout(db_migrate_output):
|
52
|
+
call_command("migrate", "--noinput")
|
53
|
+
|
54
|
+
# Initialize Django Static Files
|
55
|
+
collectstatic_output = io.StringIO()
|
56
|
+
with redirect_stdout(collectstatic_output):
|
57
|
+
call_command("collectstatic", "--noinput")
|
58
|
+
|
59
|
+
# Initialize the Application Server
|
60
|
+
if in_debug_mode():
|
61
|
+
app = FastAPI(debug=True)
|
62
|
+
else:
|
63
|
+
app = FastAPI(docs_url=None) # Disable Swagger UI in production
|
64
|
+
|
65
|
+
# Get Django Application
|
66
|
+
django_app = get_asgi_application()
|
67
|
+
|
68
|
+
# Add CORS middleware
|
69
|
+
KHOJ_DOMAIN = os.getenv("KHOJ_DOMAIN", "app.khoj.dev")
|
70
|
+
scheme = "https" if not is_env_var_true("KHOJ_NO_HTTPS") else "http"
|
71
|
+
custom_origins = [f"{scheme}://{KHOJ_DOMAIN.strip()}", f"{scheme}://{KHOJ_DOMAIN.strip()}:*"]
|
72
|
+
default_origins = [
|
73
|
+
"app://obsidian.md", # To allow access from Obsidian desktop app
|
74
|
+
"capacitor://localhost", # To allow access from Obsidian iOS app using Capacitor.JS
|
75
|
+
"http://localhost", # To allow access from Obsidian Android app
|
76
|
+
"http://localhost:*", # To allow access from localhost
|
77
|
+
"http://127.0.0.1:*", # To allow access from localhost
|
78
|
+
"app://khoj.dev", # To allow access from Khoj desktop app
|
79
|
+
]
|
80
|
+
|
81
|
+
app.add_middleware(
|
82
|
+
CORSMiddleware,
|
83
|
+
allow_origins=default_origins + custom_origins,
|
84
|
+
allow_credentials=True,
|
85
|
+
allow_methods=["*"],
|
86
|
+
allow_headers=["*"],
|
87
|
+
)
|
88
|
+
|
89
|
+
# Set Locale
|
90
|
+
locale.setlocale(locale.LC_ALL, "")
|
91
|
+
|
92
|
+
# We import these packages after setting up Django so that Django features are accessible to the app.
|
93
|
+
from khoj.configure import configure_routes, initialize_server, configure_middleware
|
94
|
+
from khoj.utils import state
|
95
|
+
from khoj.utils.cli import cli
|
96
|
+
from khoj.utils.initialization import initialization
|
97
|
+
from khoj.database.adapters import ProcessLockAdapters
|
98
|
+
from khoj.database.models import ProcessLock
|
99
|
+
|
100
|
+
from django.db.utils import IntegrityError
|
101
|
+
|
102
|
+
SCHEDULE_LEADER_NAME = ProcessLock.Operation.SCHEDULE_LEADER
|
103
|
+
|
104
|
+
|
105
|
+
def shutdown_scheduler():
|
106
|
+
logger.info("🌑 Shutting down Khoj")
|
107
|
+
|
108
|
+
if state.schedule_leader_process_lock:
|
109
|
+
logger.info("🔓 Schedule Leader released")
|
110
|
+
ProcessLockAdapters.remove_process_lock(state.schedule_leader_process_lock)
|
111
|
+
|
112
|
+
try:
|
113
|
+
state.scheduler.shutdown()
|
114
|
+
except Exception as e:
|
115
|
+
logger.debug(f"Did not shutdown scheduler: {e}")
|
116
|
+
|
117
|
+
|
118
|
+
def run(should_start_server=True):
|
119
|
+
# Turn Tokenizers Parallelism Off. App does not support it.
|
120
|
+
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
121
|
+
|
122
|
+
# Load config from CLI
|
123
|
+
state.cli_args = sys.argv[1:]
|
124
|
+
args = cli(state.cli_args)
|
125
|
+
set_state(args)
|
126
|
+
|
127
|
+
# Set Logging Level
|
128
|
+
if args.verbose == 0:
|
129
|
+
logger.setLevel(logging.INFO)
|
130
|
+
elif args.verbose >= 1:
|
131
|
+
logger.setLevel(logging.DEBUG)
|
132
|
+
|
133
|
+
logger.info(f"🚒 Initializing Khoj v{state.khoj_version}")
|
134
|
+
logger.info(f"📦 Initializing DB:\n{db_migrate_output.getvalue().strip()}")
|
135
|
+
logger.debug(f"🌍 Initializing Web Client:\n{collectstatic_output.getvalue().strip()}")
|
136
|
+
|
137
|
+
initialization(not args.non_interactive)
|
138
|
+
|
139
|
+
# Create app directory, if it doesn't exist
|
140
|
+
state.config_file.parent.mkdir(parents=True, exist_ok=True)
|
141
|
+
|
142
|
+
# Set Log File
|
143
|
+
fh = logging.FileHandler(state.config_file.parent / "khoj.log", encoding="utf-8")
|
144
|
+
fh.setLevel(logging.DEBUG)
|
145
|
+
logger.addHandler(fh)
|
146
|
+
|
147
|
+
logger.info("🌘 Starting Khoj")
|
148
|
+
|
149
|
+
# Setup task scheduler
|
150
|
+
poll_task_scheduler()
|
151
|
+
|
152
|
+
# Setup Background Scheduler
|
153
|
+
from django_apscheduler.jobstores import DjangoJobStore
|
154
|
+
|
155
|
+
state.scheduler = BackgroundScheduler(
|
156
|
+
{
|
157
|
+
"apscheduler.timezone": "UTC",
|
158
|
+
"apscheduler.job_defaults.misfire_grace_time": "60", # Useful to run scheduled jobs even when worker delayed because it was busy or down
|
159
|
+
"apscheduler.job_defaults.coalesce": "true", # Combine multiple jobs into one if they are scheduled at the same time
|
160
|
+
}
|
161
|
+
)
|
162
|
+
state.scheduler.add_jobstore(DjangoJobStore(), "default")
|
163
|
+
|
164
|
+
# We use this mechanism to only elect one schedule leader in a distributed environment. This one will be responsible for actually executing the scheduled tasks. The others will still be capable of adding and removing tasks, but they will not execute them. This is to decrease the overall burden on the database and the system.
|
165
|
+
try:
|
166
|
+
schedule_leader_process_lock = ProcessLockAdapters.get_process_lock(SCHEDULE_LEADER_NAME)
|
167
|
+
if schedule_leader_process_lock:
|
168
|
+
logger.info("🔒 Schedule Leader is already running")
|
169
|
+
state.scheduler.start(paused=True)
|
170
|
+
else:
|
171
|
+
logger.info("🔒 Schedule Leader elected")
|
172
|
+
created_process_lock = ProcessLockAdapters.set_process_lock(
|
173
|
+
SCHEDULE_LEADER_NAME, max_duration_in_seconds=43200
|
174
|
+
)
|
175
|
+
state.scheduler.start()
|
176
|
+
state.schedule_leader_process_lock = created_process_lock
|
177
|
+
except IntegrityError:
|
178
|
+
logger.info("🔒 Schedule Leader running elsewhere")
|
179
|
+
state.scheduler.start(paused=True)
|
180
|
+
finally:
|
181
|
+
logger.info("Started Background Scheduler")
|
182
|
+
|
183
|
+
# Start Server
|
184
|
+
configure_routes(app)
|
185
|
+
|
186
|
+
# Mount Django and Static Files
|
187
|
+
app.mount("/server", django_app, name="server")
|
188
|
+
static_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static")
|
189
|
+
if not os.path.exists(static_dir):
|
190
|
+
os.mkdir(static_dir)
|
191
|
+
app.mount(f"/static", StaticFiles(directory=static_dir), name=static_dir)
|
192
|
+
|
193
|
+
# Configure Middleware
|
194
|
+
configure_middleware(app, state.ssl_config)
|
195
|
+
|
196
|
+
initialize_server(args.config)
|
197
|
+
|
198
|
+
# If the server is started through gunicorn (external to the script), don't start the server
|
199
|
+
if should_start_server:
|
200
|
+
start_server(app, host=args.host, port=args.port, socket=args.socket)
|
201
|
+
# Teardown
|
202
|
+
shutdown_scheduler()
|
203
|
+
|
204
|
+
|
205
|
+
def set_state(args):
|
206
|
+
state.config_file = args.config_file
|
207
|
+
state.config = args.config
|
208
|
+
state.verbose = args.verbose
|
209
|
+
state.host = args.host
|
210
|
+
state.port = args.port
|
211
|
+
state.ssl_config = (
|
212
|
+
{"ssl_certfile": args.sslcert, "ssl_keyfile": args.sslkey} if args.sslcert and args.sslkey else None
|
213
|
+
)
|
214
|
+
state.anonymous_mode = args.anonymous_mode
|
215
|
+
state.khoj_version = version("khoj")
|
216
|
+
state.chat_on_gpu = args.chat_on_gpu
|
217
|
+
|
218
|
+
|
219
|
+
def start_server(app, host=None, port=None, socket=None):
|
220
|
+
logger.info("🌖 Khoj is ready to use")
|
221
|
+
if socket:
|
222
|
+
uvicorn.run(app, proxy_headers=True, uds=socket, log_level="debug", use_colors=True, log_config=None)
|
223
|
+
else:
|
224
|
+
uvicorn.run(
|
225
|
+
app,
|
226
|
+
host=host,
|
227
|
+
port=port,
|
228
|
+
log_level="debug" if state.verbose > 1 else "info",
|
229
|
+
use_colors=True,
|
230
|
+
log_config=None,
|
231
|
+
timeout_keep_alive=60,
|
232
|
+
**state.ssl_config if state.ssl_config else {},
|
233
|
+
)
|
234
|
+
logger.info("🌒 Stopping Khoj")
|
235
|
+
|
236
|
+
|
237
|
+
def poll_task_scheduler():
|
238
|
+
timer_thread = threading.Timer(60.0, poll_task_scheduler)
|
239
|
+
timer_thread.daemon = True
|
240
|
+
timer_thread.start()
|
241
|
+
schedule.run_pending()
|
242
|
+
|
243
|
+
|
244
|
+
if __name__ == "__main__":
|
245
|
+
run()
|
246
|
+
else:
|
247
|
+
if "gunicorn" in sys.modules:
|
248
|
+
run(should_start_server=False)
|
249
|
+
atexit.register(shutdown_scheduler)
|
khoj/manage.py
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
"""Django's command-line utility for administrative tasks."""
|
3
|
+
import os
|
4
|
+
import sys
|
5
|
+
|
6
|
+
|
7
|
+
def main():
|
8
|
+
"""Run administrative tasks."""
|
9
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "khoj.app.settings")
|
10
|
+
try:
|
11
|
+
from django.core.management import execute_from_command_line
|
12
|
+
except ImportError as exc:
|
13
|
+
raise ImportError(
|
14
|
+
"Couldn't import Django. Are you sure it's installed and "
|
15
|
+
"available on your PYTHONPATH environment variable? Did you "
|
16
|
+
"forget to activate a virtual environment?"
|
17
|
+
) from exc
|
18
|
+
execute_from_command_line(sys.argv)
|
19
|
+
|
20
|
+
|
21
|
+
if __name__ == "__main__":
|
22
|
+
main()
|
File without changes
|