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.
Files changed (393) hide show
  1. khoj/__init__.py +0 -0
  2. khoj/app/README.md +94 -0
  3. khoj/app/__init__.py +0 -0
  4. khoj/app/asgi.py +16 -0
  5. khoj/app/settings.py +218 -0
  6. khoj/app/urls.py +25 -0
  7. khoj/configure.py +452 -0
  8. khoj/database/__init__.py +0 -0
  9. khoj/database/adapters/__init__.py +1821 -0
  10. khoj/database/admin.py +417 -0
  11. khoj/database/apps.py +6 -0
  12. khoj/database/management/__init__.py +0 -0
  13. khoj/database/management/commands/__init__.py +0 -0
  14. khoj/database/management/commands/change_default_model.py +116 -0
  15. khoj/database/management/commands/change_generated_images_url.py +61 -0
  16. khoj/database/management/commands/convert_images_png_to_webp.py +99 -0
  17. khoj/database/migrations/0001_khojuser.py +98 -0
  18. khoj/database/migrations/0002_googleuser.py +32 -0
  19. khoj/database/migrations/0003_vector_extension.py +10 -0
  20. khoj/database/migrations/0004_content_types_and_more.py +181 -0
  21. khoj/database/migrations/0005_embeddings_corpus_id.py +19 -0
  22. khoj/database/migrations/0006_embeddingsdates.py +33 -0
  23. khoj/database/migrations/0007_add_conversation.py +27 -0
  24. khoj/database/migrations/0008_alter_conversation_conversation_log.py +17 -0
  25. khoj/database/migrations/0009_khojapiuser.py +24 -0
  26. khoj/database/migrations/0010_chatmodeloptions_and_more.py +83 -0
  27. khoj/database/migrations/0010_rename_embeddings_entry_and_more.py +30 -0
  28. khoj/database/migrations/0011_merge_20231102_0138.py +14 -0
  29. khoj/database/migrations/0012_entry_file_source.py +21 -0
  30. khoj/database/migrations/0013_subscription.py +37 -0
  31. khoj/database/migrations/0014_alter_googleuser_picture.py +17 -0
  32. khoj/database/migrations/0015_alter_subscription_user.py +21 -0
  33. khoj/database/migrations/0016_alter_subscription_renewal_date.py +17 -0
  34. khoj/database/migrations/0017_searchmodel.py +32 -0
  35. khoj/database/migrations/0018_searchmodelconfig_delete_searchmodel.py +30 -0
  36. khoj/database/migrations/0019_alter_googleuser_family_name_and_more.py +27 -0
  37. khoj/database/migrations/0020_reflectivequestion.py +36 -0
  38. khoj/database/migrations/0021_speechtotextmodeloptions_and_more.py +42 -0
  39. khoj/database/migrations/0022_texttoimagemodelconfig.py +25 -0
  40. khoj/database/migrations/0023_usersearchmodelconfig.py +33 -0
  41. khoj/database/migrations/0024_alter_entry_embeddings.py +18 -0
  42. khoj/database/migrations/0025_clientapplication_khojuser_phone_number_and_more.py +46 -0
  43. khoj/database/migrations/0025_searchmodelconfig_embeddings_inference_endpoint_and_more.py +22 -0
  44. khoj/database/migrations/0026_searchmodelconfig_cross_encoder_inference_endpoint_and_more.py +22 -0
  45. khoj/database/migrations/0027_merge_20240118_1324.py +13 -0
  46. khoj/database/migrations/0028_khojuser_verified_phone_number.py +17 -0
  47. khoj/database/migrations/0029_userrequests.py +27 -0
  48. khoj/database/migrations/0030_conversation_slug_and_title.py +38 -0
  49. khoj/database/migrations/0031_agent_conversation_agent.py +53 -0
  50. khoj/database/migrations/0031_alter_googleuser_locale.py +30 -0
  51. khoj/database/migrations/0032_merge_20240322_0427.py +14 -0
  52. khoj/database/migrations/0033_rename_tuning_agent_personality.py +17 -0
  53. khoj/database/migrations/0034_alter_chatmodeloptions_chat_model.py +32 -0
  54. khoj/database/migrations/0035_processlock.py +26 -0
  55. khoj/database/migrations/0036_alter_processlock_name.py +19 -0
  56. khoj/database/migrations/0036_delete_offlinechatprocessorconversationconfig.py +15 -0
  57. khoj/database/migrations/0036_publicconversation.py +42 -0
  58. khoj/database/migrations/0037_chatmodeloptions_openai_config_and_more.py +51 -0
  59. khoj/database/migrations/0037_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +32 -0
  60. khoj/database/migrations/0038_merge_20240425_0857.py +14 -0
  61. khoj/database/migrations/0038_merge_20240426_1640.py +12 -0
  62. khoj/database/migrations/0039_merge_20240501_0301.py +12 -0
  63. khoj/database/migrations/0040_alter_processlock_name.py +26 -0
  64. khoj/database/migrations/0040_merge_20240504_1010.py +14 -0
  65. khoj/database/migrations/0041_merge_20240505_1234.py +14 -0
  66. khoj/database/migrations/0042_serverchatsettings.py +46 -0
  67. khoj/database/migrations/0043_alter_chatmodeloptions_model_type.py +21 -0
  68. khoj/database/migrations/0044_conversation_file_filters.py +17 -0
  69. khoj/database/migrations/0045_fileobject.py +37 -0
  70. khoj/database/migrations/0046_khojuser_email_verification_code_and_more.py +22 -0
  71. khoj/database/migrations/0047_alter_entry_file_type.py +31 -0
  72. khoj/database/migrations/0048_voicemodeloption_uservoicemodelconfig.py +52 -0
  73. khoj/database/migrations/0049_datastore.py +38 -0
  74. khoj/database/migrations/0049_texttoimagemodelconfig_api_key_and_more.py +58 -0
  75. khoj/database/migrations/0050_alter_processlock_name.py +25 -0
  76. khoj/database/migrations/0051_merge_20240702_1220.py +14 -0
  77. khoj/database/migrations/0052_alter_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +27 -0
  78. khoj/database/migrations/0053_agent_style_color_agent_style_icon.py +61 -0
  79. khoj/database/migrations/0054_alter_agent_style_color.py +38 -0
  80. khoj/database/migrations/0055_alter_agent_style_icon.py +37 -0
  81. khoj/database/migrations/0056_chatmodeloptions_vision_enabled.py +17 -0
  82. khoj/database/migrations/0056_searchmodelconfig_cross_encoder_model_config.py +17 -0
  83. khoj/database/migrations/0057_merge_20240816_1409.py +13 -0
  84. khoj/database/migrations/0057_remove_serverchatsettings_default_model_and_more.py +51 -0
  85. khoj/database/migrations/0058_alter_chatmodeloptions_chat_model.py +17 -0
  86. khoj/database/migrations/0059_searchmodelconfig_bi_encoder_confidence_threshold.py +17 -0
  87. khoj/database/migrations/0060_merge_20240905_1828.py +14 -0
  88. khoj/database/migrations/0061_alter_chatmodeloptions_model_type.py +26 -0
  89. khoj/database/migrations/0061_alter_texttoimagemodelconfig_model_type.py +21 -0
  90. khoj/database/migrations/0062_merge_20240913_0222.py +14 -0
  91. khoj/database/migrations/0063_conversation_temp_id.py +36 -0
  92. khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +86 -0
  93. khoj/database/migrations/0065_remove_agent_avatar_remove_agent_public_and_more.py +49 -0
  94. khoj/database/migrations/0066_remove_agent_tools_agent_input_tools_and_more.py +69 -0
  95. khoj/database/migrations/0067_alter_agent_style_icon.py +50 -0
  96. khoj/database/migrations/0068_alter_agent_output_modes.py +24 -0
  97. khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +89 -0
  98. khoj/database/migrations/0070_alter_agent_input_tools_alter_agent_output_modes.py +46 -0
  99. khoj/database/migrations/0071_subscription_enabled_trial_at_and_more.py +32 -0
  100. khoj/database/migrations/0072_entry_search_model.py +24 -0
  101. khoj/database/migrations/0073_delete_usersearchmodelconfig.py +15 -0
  102. khoj/database/migrations/0074_alter_conversation_title.py +17 -0
  103. khoj/database/migrations/0075_migrate_generated_assets_and_validate.py +85 -0
  104. khoj/database/migrations/0076_rename_openaiprocessorconversationconfig_aimodelapi_and_more.py +26 -0
  105. khoj/database/migrations/0077_chatmodel_alter_agent_chat_model_and_more.py +62 -0
  106. khoj/database/migrations/0078_khojuser_email_verification_code_expiry.py +17 -0
  107. khoj/database/migrations/__init__.py +0 -0
  108. khoj/database/models/__init__.py +725 -0
  109. khoj/database/tests.py +3 -0
  110. khoj/interface/compiled/404/index.html +1 -0
  111. khoj/interface/compiled/_next/static/Tg-vU1p1B-YKT5Qv8KSHt/_buildManifest.js +1 -0
  112. khoj/interface/compiled/_next/static/Tg-vU1p1B-YKT5Qv8KSHt/_ssgManifest.js +1 -0
  113. khoj/interface/compiled/_next/static/chunks/1010-8f39bb4648b5ba10.js +1 -0
  114. khoj/interface/compiled/_next/static/chunks/182-f1c48a203dc91e0e.js +20 -0
  115. khoj/interface/compiled/_next/static/chunks/1915-d3c36ad6ce697ce7.js +1 -0
  116. khoj/interface/compiled/_next/static/chunks/2117-165ef4747a5b836b.js +2 -0
  117. khoj/interface/compiled/_next/static/chunks/2581-455000f8aeb08fc3.js +1 -0
  118. khoj/interface/compiled/_next/static/chunks/3727.dcea8f2193111552.js +1 -0
  119. khoj/interface/compiled/_next/static/chunks/3789-a09e37a819171a9d.js +1 -0
  120. khoj/interface/compiled/_next/static/chunks/4124-6c28322ce218d2d5.js +1 -0
  121. khoj/interface/compiled/_next/static/chunks/5427-b52d95253e692bfa.js +1 -0
  122. khoj/interface/compiled/_next/static/chunks/5473-b1cf56dedac6577a.js +1 -0
  123. khoj/interface/compiled/_next/static/chunks/5477-0bbddb79c25a54a7.js +1 -0
  124. khoj/interface/compiled/_next/static/chunks/6065-64db9ad305ba0bcd.js +1 -0
  125. khoj/interface/compiled/_next/static/chunks/6293-469dd16402ea8a6f.js +3 -0
  126. khoj/interface/compiled/_next/static/chunks/688-b5b4391bbc0376f1.js +1 -0
  127. khoj/interface/compiled/_next/static/chunks/8667-b6bf63c72b2d76eb.js +1 -0
  128. khoj/interface/compiled/_next/static/chunks/9259-1172dbaca0515237.js +1 -0
  129. khoj/interface/compiled/_next/static/chunks/94ca1967.1d9b42d929a1ee8c.js +1 -0
  130. khoj/interface/compiled/_next/static/chunks/9597.83583248dfbf6e73.js +1 -0
  131. khoj/interface/compiled/_next/static/chunks/964ecbae.51d6faf8801d15e6.js +1 -0
  132. khoj/interface/compiled/_next/static/chunks/9665-391df1e5c51c960a.js +1 -0
  133. khoj/interface/compiled/_next/static/chunks/app/_not-found/page-a834eddae3e235df.js +1 -0
  134. khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +1 -0
  135. khoj/interface/compiled/_next/static/chunks/app/agents/page-28ce086a1129bca2.js +1 -0
  136. khoj/interface/compiled/_next/static/chunks/app/automations/layout-1fe1537449f43496.js +1 -0
  137. khoj/interface/compiled/_next/static/chunks/app/automations/page-bf365a60829d347f.js +1 -0
  138. khoj/interface/compiled/_next/static/chunks/app/chat/layout-33934fc2d6ae6838.js +1 -0
  139. khoj/interface/compiled/_next/static/chunks/app/chat/page-0e476e57eb2015e3.js +1 -0
  140. khoj/interface/compiled/_next/static/chunks/app/layout-30e7fda7262713ce.js +1 -0
  141. khoj/interface/compiled/_next/static/chunks/app/page-a5515ea71aec5ef0.js +1 -0
  142. khoj/interface/compiled/_next/static/chunks/app/search/layout-c02531d586972d7d.js +1 -0
  143. khoj/interface/compiled/_next/static/chunks/app/search/page-9140541e67ea307d.js +1 -0
  144. khoj/interface/compiled/_next/static/chunks/app/settings/layout-d09d6510a45cd4bd.js +1 -0
  145. khoj/interface/compiled/_next/static/chunks/app/settings/page-951ba40b5b94b23a.js +1 -0
  146. khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js +1 -0
  147. khoj/interface/compiled/_next/static/chunks/app/share/chat/page-1beb80d8d741c932.js +1 -0
  148. khoj/interface/compiled/_next/static/chunks/d3ac728e-44ebd2a0c99b12a0.js +1 -0
  149. khoj/interface/compiled/_next/static/chunks/fd9d1056-4482b99a36fd1673.js +1 -0
  150. khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
  151. khoj/interface/compiled/_next/static/chunks/main-app-de1f09df97a3cfc7.js +1 -0
  152. khoj/interface/compiled/_next/static/chunks/main-db4bfac6b0a8d00b.js +1 -0
  153. khoj/interface/compiled/_next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
  154. khoj/interface/compiled/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
  155. khoj/interface/compiled/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  156. khoj/interface/compiled/_next/static/chunks/webpack-a03962458328b163.js +1 -0
  157. khoj/interface/compiled/_next/static/css/089de1d8526b96e9.css +1 -0
  158. khoj/interface/compiled/_next/static/css/37a73b87f02df402.css +1 -0
  159. khoj/interface/compiled/_next/static/css/4e4e6a4a1c920d06.css +1 -0
  160. khoj/interface/compiled/_next/static/css/8d02837c730f8d13.css +25 -0
  161. khoj/interface/compiled/_next/static/css/8e6a3ca11a60b189.css +1 -0
  162. khoj/interface/compiled/_next/static/css/9c164d9727dd8092.css +1 -0
  163. khoj/interface/compiled/_next/static/css/dac88c17aaee5fcf.css +1 -0
  164. khoj/interface/compiled/_next/static/css/df4b47a2d0d85eae.css +1 -0
  165. khoj/interface/compiled/_next/static/css/e4eb883b5265d372.css +1 -0
  166. khoj/interface/compiled/_next/static/media/1d8a05b60287ae6c-s.p.woff2 +0 -0
  167. khoj/interface/compiled/_next/static/media/6f22fce21a7c433c-s.woff2 +0 -0
  168. khoj/interface/compiled/_next/static/media/77c207b095007c34-s.p.woff2 +0 -0
  169. khoj/interface/compiled/_next/static/media/82ef96de0e8f4d8c-s.p.woff2 +0 -0
  170. khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  171. khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  172. khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  173. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  174. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  175. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  176. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  177. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  178. khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  179. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  180. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  181. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  182. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  183. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  184. khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  185. khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  186. khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  187. khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  188. khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  189. khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  190. khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  191. khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  192. khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  193. khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  194. khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  195. khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  196. khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  197. khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  198. khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  199. khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  200. khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  201. khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  202. khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  203. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  204. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  205. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  206. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  207. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  208. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  209. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  210. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  211. khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  212. khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  213. khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  214. khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  215. khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  216. khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  217. khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  218. khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  219. khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  220. khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  221. khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  222. khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  223. khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  224. khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  225. khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  226. khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  227. khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  228. khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  229. khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  230. khoj/interface/compiled/_next/static/media/a6ecd16fa044d500-s.p.woff2 +0 -0
  231. khoj/interface/compiled/_next/static/media/bd82c78e5b7b3fe9-s.p.woff2 +0 -0
  232. khoj/interface/compiled/_next/static/media/c32c8052c071fc42-s.woff2 +0 -0
  233. khoj/interface/compiled/_next/static/media/c4250770ab8708b6-s.p.woff2 +0 -0
  234. khoj/interface/compiled/_next/static/media/e098aaaecc9cfbb2-s.p.woff2 +0 -0
  235. khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp +0 -0
  236. khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp +0 -0
  237. khoj/interface/compiled/_next/static/media/globe.98e105ca.webp +0 -0
  238. khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp +0 -0
  239. khoj/interface/compiled/agents/index.html +1 -0
  240. khoj/interface/compiled/agents/index.txt +7 -0
  241. khoj/interface/compiled/agents.svg +6 -0
  242. khoj/interface/compiled/assets/icons/khoj_lantern.ico +0 -0
  243. khoj/interface/compiled/assets/icons/khoj_lantern.svg +100 -0
  244. khoj/interface/compiled/assets/icons/khoj_lantern_1200x1200.png +0 -0
  245. khoj/interface/compiled/assets/icons/khoj_lantern_128x128.png +0 -0
  246. khoj/interface/compiled/assets/icons/khoj_lantern_128x128_dark.png +0 -0
  247. khoj/interface/compiled/assets/icons/khoj_lantern_256x256.png +0 -0
  248. khoj/interface/compiled/assets/icons/khoj_lantern_512x512.png +0 -0
  249. khoj/interface/compiled/assets/icons/khoj_lantern_logomarktype_1200x630.png +0 -0
  250. khoj/interface/compiled/assets/samples/desktop-browse-draw-sample.png +0 -0
  251. khoj/interface/compiled/assets/samples/desktop-plain-chat-sample.png +0 -0
  252. khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png +0 -0
  253. khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png +0 -0
  254. khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png +0 -0
  255. khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png +0 -0
  256. khoj/interface/compiled/automation.svg +37 -0
  257. khoj/interface/compiled/automations/index.html +1 -0
  258. khoj/interface/compiled/automations/index.txt +8 -0
  259. khoj/interface/compiled/chat/index.html +1 -0
  260. khoj/interface/compiled/chat/index.txt +7 -0
  261. khoj/interface/compiled/chat.svg +24 -0
  262. khoj/interface/compiled/close.svg +5 -0
  263. khoj/interface/compiled/copy-button-success.svg +6 -0
  264. khoj/interface/compiled/copy-button.svg +5 -0
  265. khoj/interface/compiled/index.html +1 -0
  266. khoj/interface/compiled/index.txt +7 -0
  267. khoj/interface/compiled/khoj.webmanifest +76 -0
  268. khoj/interface/compiled/logo.svg +24 -0
  269. khoj/interface/compiled/search/index.html +1 -0
  270. khoj/interface/compiled/search/index.txt +7 -0
  271. khoj/interface/compiled/send.svg +1 -0
  272. khoj/interface/compiled/settings/index.html +1 -0
  273. khoj/interface/compiled/settings/index.txt +9 -0
  274. khoj/interface/compiled/share/chat/index.html +1 -0
  275. khoj/interface/compiled/share/chat/index.txt +7 -0
  276. khoj/interface/compiled/share.svg +8 -0
  277. khoj/interface/compiled/thumbs-down.svg +6 -0
  278. khoj/interface/compiled/thumbs-up.svg +6 -0
  279. khoj/interface/email/feedback.html +34 -0
  280. khoj/interface/email/magic_link.html +40 -0
  281. khoj/interface/email/task.html +37 -0
  282. khoj/interface/email/welcome.html +90 -0
  283. khoj/interface/web/.well-known/assetlinks.json +11 -0
  284. khoj/interface/web/assets/icons/agents.svg +19 -0
  285. khoj/interface/web/assets/icons/automation.svg +43 -0
  286. khoj/interface/web/assets/icons/chat.svg +24 -0
  287. khoj/interface/web/assets/icons/github.svg +1 -0
  288. khoj/interface/web/assets/icons/khoj-logo-sideways-200.png +0 -0
  289. khoj/interface/web/assets/icons/khoj-logo-sideways-500.png +0 -0
  290. khoj/interface/web/assets/icons/khoj-logo-sideways.svg +32 -0
  291. khoj/interface/web/assets/icons/khoj.svg +26 -0
  292. khoj/interface/web/assets/icons/logotype.svg +1 -0
  293. khoj/interface/web/assets/icons/search.svg +57 -0
  294. khoj/interface/web/assets/icons/sync.svg +4 -0
  295. khoj/interface/web/assets/khoj.css +237 -0
  296. khoj/interface/web/assets/utils.js +33 -0
  297. khoj/interface/web/base_config.html +445 -0
  298. khoj/interface/web/content_source_github_input.html +208 -0
  299. khoj/interface/web/login.html +310 -0
  300. khoj/interface/web/utils.html +48 -0
  301. khoj/main.py +249 -0
  302. khoj/manage.py +22 -0
  303. khoj/migrations/__init__.py +0 -0
  304. khoj/migrations/migrate_offline_chat_default_model.py +69 -0
  305. khoj/migrations/migrate_offline_chat_default_model_2.py +71 -0
  306. khoj/migrations/migrate_offline_chat_schema.py +83 -0
  307. khoj/migrations/migrate_offline_model.py +29 -0
  308. khoj/migrations/migrate_processor_config_openai.py +67 -0
  309. khoj/migrations/migrate_server_pg.py +132 -0
  310. khoj/migrations/migrate_version.py +17 -0
  311. khoj/processor/__init__.py +0 -0
  312. khoj/processor/content/__init__.py +0 -0
  313. khoj/processor/content/docx/__init__.py +0 -0
  314. khoj/processor/content/docx/docx_to_entries.py +111 -0
  315. khoj/processor/content/github/__init__.py +0 -0
  316. khoj/processor/content/github/github_to_entries.py +226 -0
  317. khoj/processor/content/images/__init__.py +0 -0
  318. khoj/processor/content/images/image_to_entries.py +117 -0
  319. khoj/processor/content/markdown/__init__.py +0 -0
  320. khoj/processor/content/markdown/markdown_to_entries.py +160 -0
  321. khoj/processor/content/notion/notion_to_entries.py +259 -0
  322. khoj/processor/content/org_mode/__init__.py +0 -0
  323. khoj/processor/content/org_mode/org_to_entries.py +226 -0
  324. khoj/processor/content/org_mode/orgnode.py +532 -0
  325. khoj/processor/content/pdf/__init__.py +0 -0
  326. khoj/processor/content/pdf/pdf_to_entries.py +119 -0
  327. khoj/processor/content/plaintext/__init__.py +0 -0
  328. khoj/processor/content/plaintext/plaintext_to_entries.py +117 -0
  329. khoj/processor/content/text_to_entries.py +296 -0
  330. khoj/processor/conversation/__init__.py +0 -0
  331. khoj/processor/conversation/anthropic/__init__.py +0 -0
  332. khoj/processor/conversation/anthropic/anthropic_chat.py +243 -0
  333. khoj/processor/conversation/anthropic/utils.py +217 -0
  334. khoj/processor/conversation/google/__init__.py +0 -0
  335. khoj/processor/conversation/google/gemini_chat.py +253 -0
  336. khoj/processor/conversation/google/utils.py +260 -0
  337. khoj/processor/conversation/offline/__init__.py +0 -0
  338. khoj/processor/conversation/offline/chat_model.py +308 -0
  339. khoj/processor/conversation/offline/utils.py +80 -0
  340. khoj/processor/conversation/offline/whisper.py +15 -0
  341. khoj/processor/conversation/openai/__init__.py +0 -0
  342. khoj/processor/conversation/openai/gpt.py +243 -0
  343. khoj/processor/conversation/openai/utils.py +232 -0
  344. khoj/processor/conversation/openai/whisper.py +13 -0
  345. khoj/processor/conversation/prompts.py +1188 -0
  346. khoj/processor/conversation/utils.py +867 -0
  347. khoj/processor/embeddings.py +122 -0
  348. khoj/processor/image/generate.py +215 -0
  349. khoj/processor/speech/__init__.py +0 -0
  350. khoj/processor/speech/text_to_speech.py +51 -0
  351. khoj/processor/tools/__init__.py +0 -0
  352. khoj/processor/tools/online_search.py +472 -0
  353. khoj/processor/tools/run_code.py +179 -0
  354. khoj/routers/__init__.py +0 -0
  355. khoj/routers/api.py +760 -0
  356. khoj/routers/api_agents.py +295 -0
  357. khoj/routers/api_chat.py +1273 -0
  358. khoj/routers/api_content.py +634 -0
  359. khoj/routers/api_model.py +123 -0
  360. khoj/routers/api_phone.py +86 -0
  361. khoj/routers/api_subscription.py +144 -0
  362. khoj/routers/auth.py +307 -0
  363. khoj/routers/email.py +135 -0
  364. khoj/routers/helpers.py +2333 -0
  365. khoj/routers/notion.py +85 -0
  366. khoj/routers/research.py +364 -0
  367. khoj/routers/storage.py +63 -0
  368. khoj/routers/twilio.py +36 -0
  369. khoj/routers/web_client.py +141 -0
  370. khoj/search_filter/__init__.py +0 -0
  371. khoj/search_filter/base_filter.py +15 -0
  372. khoj/search_filter/date_filter.py +215 -0
  373. khoj/search_filter/file_filter.py +32 -0
  374. khoj/search_filter/word_filter.py +29 -0
  375. khoj/search_type/__init__.py +0 -0
  376. khoj/search_type/text_search.py +255 -0
  377. khoj/utils/__init__.py +0 -0
  378. khoj/utils/cli.py +101 -0
  379. khoj/utils/config.py +81 -0
  380. khoj/utils/constants.py +51 -0
  381. khoj/utils/fs_syncer.py +252 -0
  382. khoj/utils/helpers.py +627 -0
  383. khoj/utils/initialization.py +301 -0
  384. khoj/utils/jsonl.py +43 -0
  385. khoj/utils/models.py +47 -0
  386. khoj/utils/rawconfig.py +208 -0
  387. khoj/utils/state.py +48 -0
  388. khoj/utils/yaml.py +47 -0
  389. khoj-1.33.3.dev32.dist-info/METADATA +190 -0
  390. khoj-1.33.3.dev32.dist-info/RECORD +393 -0
  391. khoj-1.33.3.dev32.dist-info/WHEEL +4 -0
  392. khoj-1.33.3.dev32.dist-info/entry_points.txt +2 -0
  393. 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