khoj 1.24.2.dev33__tar.gz → 1.26.1__tar.gz

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 (383) hide show
  1. {khoj-1.24.2.dev33 → khoj-1.26.1}/PKG-INFO +19 -14
  2. {khoj-1.24.2.dev33 → khoj-1.26.1}/README.md +17 -12
  3. {khoj-1.24.2.dev33 → khoj-1.26.1}/pyproject.toml +1 -1
  4. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/configure.py +13 -4
  5. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/adapters/__init__.py +132 -34
  6. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/admin.py +18 -1
  7. khoj-1.26.1/src/khoj/database/migrations/0068_alter_agent_output_modes.py +24 -0
  8. khoj-1.26.1/src/khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +89 -0
  9. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/models/__init__.py +78 -2
  10. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/404/index.html +1 -1
  11. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/1603-fa3ee48860b9dc5c.js +1 -0
  12. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/7762-79f2205740622b5c.js +1 -0
  13. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/9417-29502e39c3e7d60c.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/9417-46ed3aaa639c85ef.js +1 -1
  14. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/9479-7eed36fc954ef804.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/9479-ea776e73f549090c.js +1 -1
  15. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/agents/layout-e71c8e913cccf792.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/agents/layout-75636ab3a413fa8e.js +1 -1
  16. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/agents/page-88aa3042711107b7.js +1 -0
  17. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/chat/layout-8102549127db3067.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/chat/layout-96fcf62857bf8f30.js +1 -1
  18. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/layout-f3e40d346da53112.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/layout-d0f0a9067427fb20.js +1 -1
  19. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/settings/layout-6f9314b0d7a26046.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/settings/layout-a8f33dfe92f997fb.js +1 -1
  20. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-39f03f9e32399f0f.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-2df56074e42adaa0.js +1 -1
  21. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/webpack-2651a68f46ac3cb7.js → khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/webpack-c0cd5a6afb1f0798.js +1 -1
  22. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/467a524c75e7d7c0.css +1 -0
  23. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/b9a6bf04305d98d7.css +25 -0
  24. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/agents/index.html +1 -1
  25. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/agents/index.txt +2 -2
  26. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/automations/index.html +1 -1
  27. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/automations/index.txt +2 -2
  28. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/chat/index.html +1 -1
  29. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/chat/index.txt +2 -2
  30. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/factchecker/index.html +1 -1
  31. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/factchecker/index.txt +2 -2
  32. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/index.html +1 -1
  33. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/index.txt +2 -2
  34. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/search/index.html +1 -1
  35. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/search/index.txt +2 -2
  36. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/settings/index.html +1 -1
  37. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/settings/index.txt +3 -3
  38. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/share/chat/index.html +1 -1
  39. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/share/chat/index.txt +2 -2
  40. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/agents.svg +1 -0
  41. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/automation.svg +1 -0
  42. khoj-1.26.1/src/khoj/interface/web/assets/icons/chat.svg +24 -0
  43. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/login.html +11 -22
  44. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/images/image_to_entries.py +2 -0
  45. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/google/utils.py +4 -0
  46. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/prompts.py +1 -1
  47. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/embeddings.py +1 -0
  48. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/image/generate.py +1 -2
  49. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/tools/online_search.py +135 -42
  50. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api.py +1 -1
  51. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api_agents.py +4 -1
  52. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api_chat.py +40 -513
  53. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api_model.py +1 -1
  54. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/auth.py +9 -1
  55. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/helpers.py +58 -58
  56. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/subscription.py +18 -4
  57. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_type/text_search.py +7 -2
  58. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/helpers.py +50 -5
  59. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/initialization.py +0 -3
  60. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/1269-2e52d48e7d0e5c61.js +0 -1
  61. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/1603-67a89278e2c5dbe6.js +0 -1
  62. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/chunks/app/agents/page-25b91e88abb7f976.js +0 -1
  63. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/css/1538cedb321e3a97.css +0 -1
  64. khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/css/7a2b0a2d7c3d86eb.css +0 -25
  65. {khoj-1.24.2.dev33 → khoj-1.26.1}/.gitignore +0 -0
  66. {khoj-1.24.2.dev33 → khoj-1.26.1}/LICENSE +0 -0
  67. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/__init__.py +0 -0
  68. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/app/README.md +0 -0
  69. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/app/__init__.py +0 -0
  70. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/app/asgi.py +0 -0
  71. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/app/settings.py +0 -0
  72. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/app/urls.py +0 -0
  73. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/__init__.py +0 -0
  74. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/apps.py +0 -0
  75. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/management/__init__.py +0 -0
  76. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/management/commands/__init__.py +0 -0
  77. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/management/commands/change_generated_images_url.py +0 -0
  78. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/management/commands/convert_images_png_to_webp.py +0 -0
  79. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0001_khojuser.py +0 -0
  80. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0002_googleuser.py +0 -0
  81. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0003_vector_extension.py +0 -0
  82. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0004_content_types_and_more.py +0 -0
  83. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0005_embeddings_corpus_id.py +0 -0
  84. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0006_embeddingsdates.py +0 -0
  85. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0007_add_conversation.py +0 -0
  86. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0008_alter_conversation_conversation_log.py +0 -0
  87. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0009_khojapiuser.py +0 -0
  88. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0010_chatmodeloptions_and_more.py +0 -0
  89. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0010_rename_embeddings_entry_and_more.py +0 -0
  90. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0011_merge_20231102_0138.py +0 -0
  91. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0012_entry_file_source.py +0 -0
  92. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0013_subscription.py +0 -0
  93. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0014_alter_googleuser_picture.py +0 -0
  94. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0015_alter_subscription_user.py +0 -0
  95. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0016_alter_subscription_renewal_date.py +0 -0
  96. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0017_searchmodel.py +0 -0
  97. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0018_searchmodelconfig_delete_searchmodel.py +0 -0
  98. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0019_alter_googleuser_family_name_and_more.py +0 -0
  99. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0020_reflectivequestion.py +0 -0
  100. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0021_speechtotextmodeloptions_and_more.py +0 -0
  101. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0022_texttoimagemodelconfig.py +0 -0
  102. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0023_usersearchmodelconfig.py +0 -0
  103. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0024_alter_entry_embeddings.py +0 -0
  104. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0025_clientapplication_khojuser_phone_number_and_more.py +0 -0
  105. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0025_searchmodelconfig_embeddings_inference_endpoint_and_more.py +0 -0
  106. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0026_searchmodelconfig_cross_encoder_inference_endpoint_and_more.py +0 -0
  107. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0027_merge_20240118_1324.py +0 -0
  108. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0028_khojuser_verified_phone_number.py +0 -0
  109. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0029_userrequests.py +0 -0
  110. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0030_conversation_slug_and_title.py +0 -0
  111. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0031_agent_conversation_agent.py +0 -0
  112. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0031_alter_googleuser_locale.py +0 -0
  113. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0032_merge_20240322_0427.py +0 -0
  114. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0033_rename_tuning_agent_personality.py +0 -0
  115. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0034_alter_chatmodeloptions_chat_model.py +0 -0
  116. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0035_processlock.py +0 -0
  117. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0036_alter_processlock_name.py +0 -0
  118. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0036_delete_offlinechatprocessorconversationconfig.py +0 -0
  119. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0036_publicconversation.py +0 -0
  120. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0037_chatmodeloptions_openai_config_and_more.py +0 -0
  121. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0037_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +0 -0
  122. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0038_merge_20240425_0857.py +0 -0
  123. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0038_merge_20240426_1640.py +0 -0
  124. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0039_merge_20240501_0301.py +0 -0
  125. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0040_alter_processlock_name.py +0 -0
  126. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0040_merge_20240504_1010.py +0 -0
  127. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0041_merge_20240505_1234.py +0 -0
  128. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0042_serverchatsettings.py +0 -0
  129. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0043_alter_chatmodeloptions_model_type.py +0 -0
  130. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0044_conversation_file_filters.py +0 -0
  131. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0045_fileobject.py +0 -0
  132. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0046_khojuser_email_verification_code_and_more.py +0 -0
  133. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0047_alter_entry_file_type.py +0 -0
  134. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0048_voicemodeloption_uservoicemodelconfig.py +0 -0
  135. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0049_datastore.py +0 -0
  136. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0049_texttoimagemodelconfig_api_key_and_more.py +0 -0
  137. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0050_alter_processlock_name.py +0 -0
  138. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0051_merge_20240702_1220.py +0 -0
  139. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0052_alter_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +0 -0
  140. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0053_agent_style_color_agent_style_icon.py +0 -0
  141. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0054_alter_agent_style_color.py +0 -0
  142. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0055_alter_agent_style_icon.py +0 -0
  143. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0056_chatmodeloptions_vision_enabled.py +0 -0
  144. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0056_searchmodelconfig_cross_encoder_model_config.py +0 -0
  145. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0057_merge_20240816_1409.py +0 -0
  146. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0057_remove_serverchatsettings_default_model_and_more.py +0 -0
  147. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0058_alter_chatmodeloptions_chat_model.py +0 -0
  148. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0059_searchmodelconfig_bi_encoder_confidence_threshold.py +0 -0
  149. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0060_merge_20240905_1828.py +0 -0
  150. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0061_alter_chatmodeloptions_model_type.py +0 -0
  151. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0061_alter_texttoimagemodelconfig_model_type.py +0 -0
  152. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0062_merge_20240913_0222.py +0 -0
  153. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0063_conversation_temp_id.py +0 -0
  154. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +0 -0
  155. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0065_remove_agent_avatar_remove_agent_public_and_more.py +0 -0
  156. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0066_remove_agent_tools_agent_input_tools_and_more.py +0 -0
  157. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/0067_alter_agent_style_icon.py +0 -0
  158. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/migrations/__init__.py +0 -0
  159. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/database/tests.py +0 -0
  160. {khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/lHwFhwhZGEZT4IMv1TNBH → khoj-1.26.1/src/khoj/interface/compiled/_next/static/K1DjEvR838A-wSpSmyfVM}/_buildManifest.js +0 -0
  161. {khoj-1.24.2.dev33/src/khoj/interface/compiled/_next/static/lHwFhwhZGEZT4IMv1TNBH → khoj-1.26.1/src/khoj/interface/compiled/_next/static/K1DjEvR838A-wSpSmyfVM}/_ssgManifest.js +0 -0
  162. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/121-7024f479c297aef0.js +0 -0
  163. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/2697-a38d01981ad3bdf8.js +0 -0
  164. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/3062-71ed4b46ac2bb87c.js +0 -0
  165. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/3110-ef2cacd1b8d79ad8.js +0 -0
  166. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/3678-ef0d20e267e9f010.js +0 -0
  167. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/4051-2cf66369d6ca0f1d.js +0 -0
  168. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/4086-2c74808ba38a5a0f.js +0 -0
  169. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/4504-1629487c8bc82203.js +0 -0
  170. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/477-ec86e93db10571c1.js +0 -0
  171. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/51-e8f5bdb69b5ea421.js +0 -0
  172. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/6297-d1c842ed3f714ab0.js +0 -0
  173. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/7023-a5bf5744d19b3bd3.js +0 -0
  174. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/9001-3b27af6d5f21df44.js +0 -0
  175. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/9178-899fe9a6b754ecfe.js +0 -0
  176. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/_not-found/page-07ff4ab42b07845e.js +0 -0
  177. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/automations/layout-27c28e923c9b1ff0.js +0 -0
  178. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/automations/page-5480731341f34450.js +0 -0
  179. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/chat/page-702057ccbcf27881.js +0 -0
  180. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/factchecker/layout-7b30c541c05fb904.js +0 -0
  181. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/factchecker/page-e7b34316ec6f44de.js +0 -0
  182. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/page-10a5aad6e04f3cf8.js +0 -0
  183. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/search/layout-3720f1362310bebb.js +0 -0
  184. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/search/page-d56541c746fded7d.js +0 -0
  185. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/settings/page-e044a999468a7c5d.js +0 -0
  186. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/page-fbbd66a4d4633438.js +0 -0
  187. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/d3ac728e-a9e3522eef9b6b28.js +0 -0
  188. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/fd9d1056-2b978342deb60015.js +0 -0
  189. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js +0 -0
  190. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/main-app-6d6ee3495efe03d4.js +0 -0
  191. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/main-f84cd3c1873cd842.js +0 -0
  192. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/pages/_app-f870474a17b7f2fd.js +0 -0
  193. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +0 -0
  194. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js +0 -0
  195. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/2272c73fc7a3b571.css +0 -0
  196. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/2de69f0be774c768.css +0 -0
  197. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/3e1f1fdd70775091.css +0 -0
  198. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/553f9cdcc7a2bcd6.css +0 -0
  199. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/592ca99f5122e75a.css +0 -0
  200. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/5a400c87d295e68a.css +0 -0
  201. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/css/c808691c459e3887.css +0 -0
  202. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/0e790e04fd40ad16-s.p.woff2 +0 -0
  203. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/4221e1667cd19c7d-s.woff2 +0 -0
  204. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/6c276159aa0eb14b-s.woff2 +0 -0
  205. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/6cc0b9500e4f9168-s.woff2 +0 -0
  206. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/9d9319a7a2ac39c6-s.woff2 +0 -0
  207. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  208. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  209. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  210. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  211. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  212. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  213. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  214. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  215. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  216. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  217. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  218. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  219. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  220. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  221. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  222. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  223. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  224. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  225. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  226. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  227. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  228. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  229. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  230. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  231. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  232. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  233. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  234. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  235. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  236. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  237. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  238. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  239. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  240. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  241. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  242. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  243. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  244. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  245. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  246. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  247. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  248. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  249. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  250. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  251. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  252. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  253. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  254. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  255. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  256. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  257. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  258. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  259. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  260. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  261. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  262. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  263. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  264. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  265. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  266. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  267. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/a75c8ea86756d52d-s.woff2 +0 -0
  268. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/abce7c400ca31a51-s.woff2 +0 -0
  269. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/f759c939737fb668-s.woff2 +0 -0
  270. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp +0 -0
  271. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp +0 -0
  272. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/globe.98e105ca.webp +0 -0
  273. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp +0 -0
  274. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/agents.svg +0 -0
  275. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/icons/khoj_lantern.ico +0 -0
  276. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/icons/khoj_lantern_128x128.png +0 -0
  277. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/icons/khoj_lantern_256x256.png +0 -0
  278. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/icons/khoj_lantern_logomarktype_1200x630.png +0 -0
  279. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/desktop-browse-draw-sample.png +0 -0
  280. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/desktop-plain-chat-sample.png +0 -0
  281. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png +0 -0
  282. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png +0 -0
  283. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png +0 -0
  284. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png +0 -0
  285. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/automation.svg +0 -0
  286. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/chat.svg +0 -0
  287. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/close.svg +0 -0
  288. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/copy-button-success.svg +0 -0
  289. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/copy-button.svg +0 -0
  290. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/khoj.webmanifest +0 -0
  291. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/logo.svg +0 -0
  292. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/send.svg +0 -0
  293. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/share.svg +0 -0
  294. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/thumbs-down.svg +0 -0
  295. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/compiled/thumbs-up.svg +0 -0
  296. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/email/feedback.html +0 -0
  297. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/email/magic_link.html +0 -0
  298. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/email/task.html +0 -0
  299. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/email/welcome.html +0 -0
  300. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/favicon-128x128.ico +0 -0
  301. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/github.svg +0 -0
  302. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/khoj-logo-sideways-200.png +0 -0
  303. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/khoj-logo-sideways-500.png +0 -0
  304. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/khoj-logo-sideways.svg +0 -0
  305. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/khoj.svg +0 -0
  306. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/logotype.svg +0 -0
  307. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/search.svg +0 -0
  308. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/icons/sync.svg +0 -0
  309. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/khoj.css +0 -0
  310. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/assets/utils.js +0 -0
  311. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/base_config.html +0 -0
  312. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/content_source_github_input.html +0 -0
  313. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/interface/web/utils.html +0 -0
  314. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/main.py +0 -0
  315. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/manage.py +0 -0
  316. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/__init__.py +0 -0
  317. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_offline_chat_default_model.py +0 -0
  318. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_offline_chat_default_model_2.py +0 -0
  319. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_offline_chat_schema.py +0 -0
  320. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_offline_model.py +0 -0
  321. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_processor_config_openai.py +0 -0
  322. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_server_pg.py +0 -0
  323. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/migrations/migrate_version.py +0 -0
  324. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/__init__.py +0 -0
  325. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/__init__.py +0 -0
  326. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/docx/__init__.py +0 -0
  327. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/docx/docx_to_entries.py +0 -0
  328. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/github/__init__.py +0 -0
  329. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/github/github_to_entries.py +0 -0
  330. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/images/__init__.py +0 -0
  331. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/markdown/__init__.py +0 -0
  332. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/markdown/markdown_to_entries.py +0 -0
  333. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/notion/notion_to_entries.py +0 -0
  334. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/org_mode/__init__.py +0 -0
  335. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/org_mode/org_to_entries.py +0 -0
  336. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/org_mode/orgnode.py +0 -0
  337. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/pdf/__init__.py +0 -0
  338. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/pdf/pdf_to_entries.py +0 -0
  339. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/plaintext/__init__.py +0 -0
  340. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/plaintext/plaintext_to_entries.py +0 -0
  341. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/content/text_to_entries.py +0 -0
  342. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/__init__.py +0 -0
  343. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/anthropic/__init__.py +0 -0
  344. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/anthropic/anthropic_chat.py +0 -0
  345. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/anthropic/utils.py +0 -0
  346. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/google/__init__.py +0 -0
  347. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/google/gemini_chat.py +0 -0
  348. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/offline/__init__.py +0 -0
  349. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/offline/chat_model.py +0 -0
  350. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/offline/utils.py +0 -0
  351. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/offline/whisper.py +0 -0
  352. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/openai/__init__.py +0 -0
  353. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/openai/gpt.py +0 -0
  354. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/openai/utils.py +0 -0
  355. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/openai/whisper.py +0 -0
  356. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/conversation/utils.py +0 -0
  357. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/speech/__init__.py +0 -0
  358. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/speech/text_to_speech.py +0 -0
  359. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/processor/tools/__init__.py +0 -0
  360. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/__init__.py +0 -0
  361. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api_content.py +0 -0
  362. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/api_phone.py +0 -0
  363. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/email.py +0 -0
  364. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/notion.py +0 -0
  365. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/storage.py +0 -0
  366. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/twilio.py +0 -0
  367. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/routers/web_client.py +0 -0
  368. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_filter/__init__.py +0 -0
  369. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_filter/base_filter.py +0 -0
  370. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_filter/date_filter.py +0 -0
  371. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_filter/file_filter.py +0 -0
  372. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_filter/word_filter.py +0 -0
  373. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/search_type/__init__.py +0 -0
  374. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/__init__.py +0 -0
  375. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/cli.py +0 -0
  376. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/config.py +0 -0
  377. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/constants.py +0 -0
  378. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/fs_syncer.py +0 -0
  379. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/jsonl.py +0 -0
  380. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/models.py +0 -0
  381. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/rawconfig.py +0 -0
  382. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/state.py +0 -0
  383. {khoj-1.24.2.dev33 → khoj-1.26.1}/src/khoj/utils/yaml.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: khoj
3
- Version: 1.24.2.dev33
3
+ Version: 1.26.1
4
4
  Summary: Your Second Brain
5
5
  Project-URL: Homepage, https://khoj.dev
6
6
  Project-URL: Documentation, https://docs.khoj.dev
@@ -32,7 +32,7 @@ Requires-Dist: dateparser>=1.1.1
32
32
  Requires-Dist: defusedxml==0.7.1
33
33
  Requires-Dist: django-apscheduler==0.6.2
34
34
  Requires-Dist: django-phonenumber-field==7.3.0
35
- Requires-Dist: django==5.0.8
35
+ Requires-Dist: django==5.0.9
36
36
  Requires-Dist: docx2txt==0.8
37
37
  Requires-Dist: einops==0.8.0
38
38
  Requires-Dist: fastapi>=0.110.0
@@ -103,14 +103,14 @@ Description-Content-Type: text/markdown
103
103
  <div align="center">
104
104
 
105
105
  [![test](https://github.com/khoj-ai/khoj/actions/workflows/test.yml/badge.svg)](https://github.com/khoj-ai/khoj/actions/workflows/test.yml)
106
- [![dockerize](https://github.com/khoj-ai/khoj/actions/workflows/dockerize.yml/badge.svg)](https://github.com/khoj-ai/khoj/pkgs/container/khoj)
106
+ [![docker](https://github.com/khoj-ai/khoj/actions/workflows/dockerize.yml/badge.svg)](https://github.com/khoj-ai/khoj/pkgs/container/khoj)
107
107
  [![pypi](https://github.com/khoj-ai/khoj/actions/workflows/pypi.yml/badge.svg)](https://pypi.org/project/khoj/)
108
- ![Discord](https://img.shields.io/discord/1112065956647284756?style=plastic&label=discord)
108
+ [![discord](https://img.shields.io/discord/1112065956647284756?style=plastic&label=discord)](https://discord.gg/BDgyabRM6e)
109
109
 
110
110
  </div>
111
111
 
112
112
  <div align="center">
113
- <b>The open-source, personal AI for your digital brain</b>
113
+ <b>Your AI second brain</b>
114
114
  </div>
115
115
 
116
116
  <br />
@@ -119,11 +119,13 @@ Description-Content-Type: text/markdown
119
119
 
120
120
  [📑 Docs](https://docs.khoj.dev)
121
121
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
122
- [🏮 App](https://khoj.dev)
122
+ [🌐 Web](https://khoj.dev)
123
+ <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
124
+ [🔥 App](https://app.khoj.dev)
123
125
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
124
126
  [💬 Discord](https://discord.gg/BDgyabRM6e)
125
127
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
126
- [📚 Blog](https://blog.khoj.dev)
128
+ [✍🏽 Blog](https://blog.khoj.dev)
127
129
 
128
130
  </div>
129
131
 
@@ -131,14 +133,17 @@ Description-Content-Type: text/markdown
131
133
 
132
134
  ***
133
135
 
134
- [Khoj](https://khoj.dev) is a personal, open-source AI application for you to extend your capabilities.
135
- - Share your documents to extend your digital brain.
136
- - Access the internet, getting fresh information.
137
- - You can share pdf, markdown, org-mode, notion files and github repositories.
138
- - Fast, accurate semantic search on top of your docs.
139
- - Create images, talk out loud, play your messages.
140
- - Available Desktop, Emacs, Obsidian, Web and Whatsapp.
136
+ [Khoj](https://khoj.dev) is a personal AI app to extend your capabilities. It smoothly scales up from an on-device personal AI to a cloud-scale enterprise AI.
137
+
138
+ - Chat with any local or online LLM (e.g llama3, qwen, gemma, mistral, gpt, claude, gemini).
139
+ - Get answers from the internet and your docs (including image, pdf, markdown, org-mode, word, notion files).
140
+ - Access it from your Browser, Obsidian, Emacs, Desktop, Phone or Whatsapp.
141
+ - Create agents with custom knowledge, persona, chat model and tools to take on any role.
142
+ - Automate away repetitive research. Get personal newsletters and smart notifications delivered to your inbox.
143
+ - Find relevant docs quickly and easily using our advanced semantic search.
144
+ - Generate images, talk out loud, play your messages.
141
145
  - Khoj is open-source, self-hostable. Always.
146
+ - Run it privately on [your computer](https://docs.khoj.dev/get-started/setup) or try it on our [cloud app](https://app.khoj.dev).
142
147
 
143
148
  ***
144
149
 
@@ -3,14 +3,14 @@
3
3
  <div align="center">
4
4
 
5
5
  [![test](https://github.com/khoj-ai/khoj/actions/workflows/test.yml/badge.svg)](https://github.com/khoj-ai/khoj/actions/workflows/test.yml)
6
- [![dockerize](https://github.com/khoj-ai/khoj/actions/workflows/dockerize.yml/badge.svg)](https://github.com/khoj-ai/khoj/pkgs/container/khoj)
6
+ [![docker](https://github.com/khoj-ai/khoj/actions/workflows/dockerize.yml/badge.svg)](https://github.com/khoj-ai/khoj/pkgs/container/khoj)
7
7
  [![pypi](https://github.com/khoj-ai/khoj/actions/workflows/pypi.yml/badge.svg)](https://pypi.org/project/khoj/)
8
- ![Discord](https://img.shields.io/discord/1112065956647284756?style=plastic&label=discord)
8
+ [![discord](https://img.shields.io/discord/1112065956647284756?style=plastic&label=discord)](https://discord.gg/BDgyabRM6e)
9
9
 
10
10
  </div>
11
11
 
12
12
  <div align="center">
13
- <b>The open-source, personal AI for your digital brain</b>
13
+ <b>Your AI second brain</b>
14
14
  </div>
15
15
 
16
16
  <br />
@@ -19,11 +19,13 @@
19
19
 
20
20
  [📑 Docs](https://docs.khoj.dev)
21
21
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
22
- [🏮 App](https://khoj.dev)
22
+ [🌐 Web](https://khoj.dev)
23
+ <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
24
+ [🔥 App](https://app.khoj.dev)
23
25
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
24
26
  [💬 Discord](https://discord.gg/BDgyabRM6e)
25
27
  <span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
26
- [📚 Blog](https://blog.khoj.dev)
28
+ [✍🏽 Blog](https://blog.khoj.dev)
27
29
 
28
30
  </div>
29
31
 
@@ -31,14 +33,17 @@
31
33
 
32
34
  ***
33
35
 
34
- [Khoj](https://khoj.dev) is a personal, open-source AI application for you to extend your capabilities.
35
- - Share your documents to extend your digital brain.
36
- - Access the internet, getting fresh information.
37
- - You can share pdf, markdown, org-mode, notion files and github repositories.
38
- - Fast, accurate semantic search on top of your docs.
39
- - Create images, talk out loud, play your messages.
40
- - Available Desktop, Emacs, Obsidian, Web and Whatsapp.
36
+ [Khoj](https://khoj.dev) is a personal AI app to extend your capabilities. It smoothly scales up from an on-device personal AI to a cloud-scale enterprise AI.
37
+
38
+ - Chat with any local or online LLM (e.g llama3, qwen, gemma, mistral, gpt, claude, gemini).
39
+ - Get answers from the internet and your docs (including image, pdf, markdown, org-mode, word, notion files).
40
+ - Access it from your Browser, Obsidian, Emacs, Desktop, Phone or Whatsapp.
41
+ - Create agents with custom knowledge, persona, chat model and tools to take on any role.
42
+ - Automate away repetitive research. Get personal newsletters and smart notifications delivered to your inbox.
43
+ - Find relevant docs quickly and easily using our advanced semantic search.
44
+ - Generate images, talk out loud, play your messages.
41
45
  - Khoj is open-source, self-hostable. Always.
46
+ - Run it privately on [your computer](https://docs.khoj.dev/get-started/setup) or try it on our [cloud app](https://app.khoj.dev).
42
47
 
43
48
  ***
44
49
 
@@ -63,7 +63,7 @@ dependencies = [
63
63
  "tenacity == 8.3.0",
64
64
  "anyio == 3.7.1",
65
65
  "pymupdf >= 1.23.5",
66
- "django == 5.0.8",
66
+ "django == 5.0.9",
67
67
  "authlib == 1.2.1",
68
68
  "llama-cpp-python == 0.2.88",
69
69
  "itsdangerous == 2.1.2",
@@ -42,6 +42,7 @@ from khoj.database.adapters import (
42
42
  from khoj.database.models import ClientApplication, KhojUser, ProcessLock, Subscription
43
43
  from khoj.processor.embeddings import CrossEncoderModel, EmbeddingsModel
44
44
  from khoj.routers.api_content import configure_content, configure_search
45
+ from khoj.routers.helpers import update_telemetry_state
45
46
  from khoj.routers.twilio import is_twilio_enabled
46
47
  from khoj.utils import constants, state
47
48
  from khoj.utils.config import SearchType
@@ -165,7 +166,15 @@ class UserAuthenticationBackend(AuthenticationBackend):
165
166
 
166
167
  create_if_not_exists = request.query_params.get("create_if_not_exists")
167
168
  if create_if_not_exists:
168
- user = await aget_or_create_user_by_phone_number(phone_number)
169
+ user, is_new = await aget_or_create_user_by_phone_number(phone_number)
170
+ if user and is_new:
171
+ update_telemetry_state(
172
+ request=request,
173
+ telemetry_type="api",
174
+ api="create_user",
175
+ metadata={"user_id": str(user.uuid)},
176
+ )
177
+ logger.log(logging.INFO, f"🥳 New User Created: {user.uuid}")
169
178
  else:
170
179
  user = await aget_user_by_phone_number(phone_number)
171
180
 
@@ -244,7 +253,7 @@ def configure_server(
244
253
 
245
254
  state.SearchType = configure_search_types()
246
255
  state.search_models = configure_search(state.search_models, state.config.search_type)
247
- setup_default_agent()
256
+ setup_default_agent(user)
248
257
 
249
258
  message = "📡 Telemetry disabled" if telemetry_disabled(state.config.app) else "📡 Telemetry enabled"
250
259
  logger.info(message)
@@ -256,8 +265,8 @@ def configure_server(
256
265
  raise e
257
266
 
258
267
 
259
- def setup_default_agent():
260
- AgentAdapters.create_default_agent()
268
+ def setup_default_agent(user: KhojUser):
269
+ AgentAdapters.create_default_agent(user)
261
270
 
262
271
 
263
272
  def initialize_content(regenerate: bool, search_type: Optional[SearchType] = None, user: KhojUser = None):
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import logging
3
3
  import math
4
+ import os
4
5
  import random
5
6
  import re
6
7
  import secrets
@@ -10,7 +11,6 @@ from enum import Enum
10
11
  from typing import Callable, Iterable, List, Optional, Type
11
12
 
12
13
  import cron_descriptor
13
- import django
14
14
  from apscheduler.job import Job
15
15
  from asgiref.sync import sync_to_async
16
16
  from django.contrib.sessions.backends.db import SessionStore
@@ -52,6 +52,7 @@ from khoj.database.models import (
52
52
  UserTextToImageModelConfig,
53
53
  UserVoiceModelConfig,
54
54
  VoiceModelOption,
55
+ WebScraper,
55
56
  )
56
57
  from khoj.processor.conversation import prompts
57
58
  from khoj.search_filter.date_filter import DateFilter
@@ -59,7 +60,12 @@ from khoj.search_filter.file_filter import FileFilter
59
60
  from khoj.search_filter.word_filter import WordFilter
60
61
  from khoj.utils import state
61
62
  from khoj.utils.config import OfflineChatProcessorModel
62
- from khoj.utils.helpers import generate_random_name, is_none_or_empty, timer
63
+ from khoj.utils.helpers import (
64
+ generate_random_name,
65
+ in_debug_mode,
66
+ is_none_or_empty,
67
+ timer,
68
+ )
63
69
 
64
70
  logger = logging.getLogger(__name__)
65
71
 
@@ -113,13 +119,15 @@ async def get_or_create_user(token: dict) -> KhojUser:
113
119
  return user
114
120
 
115
121
 
116
- async def aget_or_create_user_by_phone_number(phone_number: str) -> KhojUser:
122
+ async def aget_or_create_user_by_phone_number(phone_number: str) -> tuple[KhojUser, bool]:
123
+ is_new = False
117
124
  if is_none_or_empty(phone_number):
118
- return None
125
+ return None, is_new
119
126
  user = await aget_user_by_phone_number(phone_number)
120
127
  if not user:
121
128
  user = await acreate_user_by_phone_number(phone_number)
122
- return user
129
+ is_new = True
130
+ return user, is_new
123
131
 
124
132
 
125
133
  async def aset_user_phone_number(user: KhojUser, phone_number: str) -> KhojUser:
@@ -165,8 +173,10 @@ async def acreate_user_by_phone_number(phone_number: str) -> KhojUser:
165
173
  return user
166
174
 
167
175
 
168
- async def aget_or_create_user_by_email(email: str) -> KhojUser:
169
- user, _ = await KhojUser.objects.filter(email=email).aupdate_or_create(defaults={"username": email, "email": email})
176
+ async def aget_or_create_user_by_email(email: str) -> tuple[KhojUser, bool]:
177
+ user, is_new = await KhojUser.objects.filter(email=email).aupdate_or_create(
178
+ defaults={"username": email, "email": email}
179
+ )
170
180
  await user.asave()
171
181
 
172
182
  if user:
@@ -177,7 +187,7 @@ async def aget_or_create_user_by_email(email: str) -> KhojUser:
177
187
  if not user_subscription:
178
188
  await Subscription.objects.acreate(user=user, type="trial")
179
189
 
180
- return user
190
+ return user, is_new
181
191
 
182
192
 
183
193
  async def aget_user_validated_by_email_verification_code(code: str) -> KhojUser:
@@ -248,9 +258,9 @@ def get_user_subscription(email: str) -> Optional[Subscription]:
248
258
 
249
259
  async def set_user_subscription(
250
260
  email: str, is_recurring=None, renewal_date=None, type="standard"
251
- ) -> Optional[Subscription]:
261
+ ) -> tuple[Optional[Subscription], bool]:
252
262
  # Get or create the user object and their subscription
253
- user = await aget_or_create_user_by_email(email)
263
+ user, is_new = await aget_or_create_user_by_email(email)
254
264
  user_subscription = await Subscription.objects.filter(user=user).afirst()
255
265
 
256
266
  # Update the user subscription state
@@ -262,7 +272,7 @@ async def set_user_subscription(
262
272
  elif renewal_date is not None:
263
273
  user_subscription.renewal_date = renewal_date
264
274
  await user_subscription.asave()
265
- return user_subscription
275
+ return user_subscription, is_new
266
276
 
267
277
 
268
278
  def subscription_to_state(subscription: Subscription) -> str:
@@ -643,8 +653,8 @@ class AgentAdapters:
643
653
  return Agent.objects.filter(name=AgentAdapters.DEFAULT_AGENT_NAME).first()
644
654
 
645
655
  @staticmethod
646
- def create_default_agent():
647
- default_conversation_config = ConversationAdapters.get_default_conversation_config()
656
+ def create_default_agent(user: KhojUser):
657
+ default_conversation_config = ConversationAdapters.get_default_conversation_config(user)
648
658
  if default_conversation_config is None:
649
659
  logger.info("No default conversation config found, skipping default agent creation")
650
660
  return None
@@ -692,10 +702,12 @@ class AgentAdapters:
692
702
  files: List[str],
693
703
  input_tools: List[str],
694
704
  output_modes: List[str],
705
+ slug: Optional[str] = None,
695
706
  ):
696
707
  chat_model_option = await ChatModelOptions.objects.filter(chat_model=chat_model).afirst()
697
708
 
698
- agent, created = await Agent.objects.filter(name=name, creator=user).aupdate_or_create(
709
+ # Slug will be None for new agents, which will trigger a new agent creation with a generated, immutable slug
710
+ agent, created = await Agent.objects.filter(slug=slug, creator=user).aupdate_or_create(
699
711
  defaults={
700
712
  "name": name,
701
713
  "creator": user,
@@ -933,21 +945,21 @@ class ConversationAdapters:
933
945
  def get_conversation_config(user: KhojUser):
934
946
  subscribed = is_user_subscribed(user)
935
947
  if not subscribed:
936
- return ConversationAdapters.get_default_conversation_config()
948
+ return ConversationAdapters.get_default_conversation_config(user)
937
949
  config = UserConversationConfig.objects.filter(user=user).first()
938
950
  if config:
939
951
  return config.setting
940
- return ConversationAdapters.get_advanced_conversation_config()
952
+ return ConversationAdapters.get_advanced_conversation_config(user)
941
953
 
942
954
  @staticmethod
943
955
  async def aget_conversation_config(user: KhojUser):
944
956
  subscribed = await ais_user_subscribed(user)
945
957
  if not subscribed:
946
- return await ConversationAdapters.aget_default_conversation_config()
958
+ return await ConversationAdapters.aget_default_conversation_config(user)
947
959
  config = await UserConversationConfig.objects.filter(user=user).prefetch_related("setting").afirst()
948
960
  if config:
949
961
  return config.setting
950
- return ConversationAdapters.aget_advanced_conversation_config()
962
+ return ConversationAdapters.aget_advanced_conversation_config(user)
951
963
 
952
964
  @staticmethod
953
965
  async def aget_voice_model_config(user: KhojUser) -> Optional[VoiceModelOption]:
@@ -968,40 +980,126 @@ class ConversationAdapters:
968
980
  return VoiceModelOption.objects.first()
969
981
 
970
982
  @staticmethod
971
- def get_default_conversation_config():
983
+ def get_default_conversation_config(user: KhojUser = None):
984
+ """Get default conversation config. Prefer chat model by server admin > user > first created chat model"""
985
+ # Get the server chat settings
972
986
  server_chat_settings = ServerChatSettings.objects.first()
973
- if server_chat_settings is None or server_chat_settings.chat_default is None:
974
- return ChatModelOptions.objects.filter().first()
975
- return server_chat_settings.chat_default
987
+ if server_chat_settings is not None and server_chat_settings.chat_default is not None:
988
+ return server_chat_settings.chat_default
989
+
990
+ # Get the user's chat settings, if the server chat settings are not set
991
+ user_chat_settings = UserConversationConfig.objects.filter(user=user).first() if user else None
992
+ if user_chat_settings is not None and user_chat_settings.setting is not None:
993
+ return user_chat_settings.setting
994
+
995
+ # Get the first chat model if even the user chat settings are not set
996
+ return ChatModelOptions.objects.filter().first()
976
997
 
977
998
  @staticmethod
978
- async def aget_default_conversation_config():
999
+ async def aget_default_conversation_config(user: KhojUser = None):
1000
+ """Get default conversation config. Prefer chat model by server admin > user > first created chat model"""
1001
+ # Get the server chat settings
979
1002
  server_chat_settings: ServerChatSettings = (
980
1003
  await ServerChatSettings.objects.filter()
981
1004
  .prefetch_related("chat_default", "chat_default__openai_config")
982
1005
  .afirst()
983
1006
  )
984
- if server_chat_settings is None or server_chat_settings.chat_default is None:
985
- return await ChatModelOptions.objects.filter().prefetch_related("openai_config").afirst()
986
- return server_chat_settings.chat_default
1007
+ if server_chat_settings is not None and server_chat_settings.chat_default is not None:
1008
+ return server_chat_settings.chat_default
1009
+
1010
+ # Get the user's chat settings, if the server chat settings are not set
1011
+ user_chat_settings = (
1012
+ (await UserConversationConfig.objects.filter(user=user).prefetch_related("setting__openai_config").afirst())
1013
+ if user
1014
+ else None
1015
+ )
1016
+ if user_chat_settings is not None and user_chat_settings.setting is not None:
1017
+ return user_chat_settings.setting
1018
+
1019
+ # Get the first chat model if even the user chat settings are not set
1020
+ return await ChatModelOptions.objects.filter().prefetch_related("openai_config").afirst()
987
1021
 
988
1022
  @staticmethod
989
- def get_advanced_conversation_config():
1023
+ def get_advanced_conversation_config(user: KhojUser):
990
1024
  server_chat_settings = ServerChatSettings.objects.first()
991
- if server_chat_settings is None or server_chat_settings.chat_advanced is None:
992
- return ConversationAdapters.get_default_conversation_config()
993
- return server_chat_settings.chat_advanced
1025
+ if server_chat_settings is not None and server_chat_settings.chat_advanced is not None:
1026
+ return server_chat_settings.chat_advanced
1027
+ return ConversationAdapters.get_default_conversation_config(user)
994
1028
 
995
1029
  @staticmethod
996
- async def aget_advanced_conversation_config():
1030
+ async def aget_advanced_conversation_config(user: KhojUser = None):
997
1031
  server_chat_settings: ServerChatSettings = (
998
1032
  await ServerChatSettings.objects.filter()
999
1033
  .prefetch_related("chat_advanced", "chat_advanced__openai_config")
1000
1034
  .afirst()
1001
1035
  )
1002
- if server_chat_settings is None or server_chat_settings.chat_advanced is None:
1003
- return await ConversationAdapters.aget_default_conversation_config()
1004
- return server_chat_settings.chat_advanced
1036
+ if server_chat_settings is not None and server_chat_settings.chat_advanced is not None:
1037
+ return server_chat_settings.chat_advanced
1038
+ return await ConversationAdapters.aget_default_conversation_config(user)
1039
+
1040
+ @staticmethod
1041
+ async def aget_server_webscraper():
1042
+ server_chat_settings = await ServerChatSettings.objects.filter().prefetch_related("web_scraper").afirst()
1043
+ if server_chat_settings is not None and server_chat_settings.web_scraper is not None:
1044
+ return server_chat_settings.web_scraper
1045
+ return None
1046
+
1047
+ @staticmethod
1048
+ async def aget_enabled_webscrapers() -> list[WebScraper]:
1049
+ enabled_scrapers: list[WebScraper] = []
1050
+ server_webscraper = await ConversationAdapters.aget_server_webscraper()
1051
+ if server_webscraper:
1052
+ # Only use the webscraper set in the server chat settings
1053
+ enabled_scrapers = [server_webscraper]
1054
+ if not enabled_scrapers:
1055
+ # Use the enabled web scrapers, ordered by priority, until get web page content
1056
+ enabled_scrapers = [scraper async for scraper in WebScraper.objects.all().order_by("priority").aiterator()]
1057
+ if not enabled_scrapers:
1058
+ # Use scrapers enabled via environment variables
1059
+ if os.getenv("FIRECRAWL_API_KEY"):
1060
+ api_url = os.getenv("FIRECRAWL_API_URL", "https://api.firecrawl.dev")
1061
+ enabled_scrapers.append(
1062
+ WebScraper(
1063
+ type=WebScraper.WebScraperType.FIRECRAWL,
1064
+ name=WebScraper.WebScraperType.FIRECRAWL.capitalize(),
1065
+ api_key=os.getenv("FIRECRAWL_API_KEY"),
1066
+ api_url=api_url,
1067
+ )
1068
+ )
1069
+ if os.getenv("OLOSTEP_API_KEY"):
1070
+ api_url = os.getenv("OLOSTEP_API_URL", "https://agent.olostep.com/olostep-p2p-incomingAPI")
1071
+ enabled_scrapers.append(
1072
+ WebScraper(
1073
+ type=WebScraper.WebScraperType.OLOSTEP,
1074
+ name=WebScraper.WebScraperType.OLOSTEP.capitalize(),
1075
+ api_key=os.getenv("OLOSTEP_API_KEY"),
1076
+ api_url=api_url,
1077
+ )
1078
+ )
1079
+ # Jina is the default fallback scrapers to use as it does not require an API key
1080
+ api_url = os.getenv("JINA_READER_API_URL", "https://r.jina.ai/")
1081
+ enabled_scrapers.append(
1082
+ WebScraper(
1083
+ type=WebScraper.WebScraperType.JINA,
1084
+ name=WebScraper.WebScraperType.JINA.capitalize(),
1085
+ api_key=os.getenv("JINA_API_KEY"),
1086
+ api_url=api_url,
1087
+ )
1088
+ )
1089
+
1090
+ # Only enable the direct web page scraper by default in self-hosted single user setups.
1091
+ # Useful for reading webpages on your intranet.
1092
+ if state.anonymous_mode or in_debug_mode():
1093
+ enabled_scrapers.append(
1094
+ WebScraper(
1095
+ type=WebScraper.WebScraperType.DIRECT,
1096
+ name=WebScraper.WebScraperType.DIRECT.capitalize(),
1097
+ api_key=None,
1098
+ api_url=None,
1099
+ )
1100
+ )
1101
+
1102
+ return enabled_scrapers
1005
1103
 
1006
1104
  @staticmethod
1007
1105
  def create_conversation_from_public_conversation(
@@ -31,6 +31,7 @@ from khoj.database.models import (
31
31
  UserSearchModelConfig,
32
32
  UserVoiceModelConfig,
33
33
  VoiceModelOption,
34
+ WebScraper,
34
35
  )
35
36
  from khoj.utils.helpers import ImageIntentType
36
37
 
@@ -69,10 +70,11 @@ class KhojUserAdmin(UserAdmin):
69
70
  "id",
70
71
  "email",
71
72
  "username",
73
+ "phone_number",
72
74
  "is_active",
75
+ "uuid",
73
76
  "is_staff",
74
77
  "is_superuser",
75
- "phone_number",
76
78
  )
77
79
  search_fields = ("email", "username", "phone_number", "uuid")
78
80
  filter_horizontal = ("groups", "user_permissions")
@@ -197,7 +199,22 @@ class ServerChatSettingsAdmin(admin.ModelAdmin):
197
199
  list_display = (
198
200
  "chat_default",
199
201
  "chat_advanced",
202
+ "web_scraper",
203
+ )
204
+
205
+
206
+ @admin.register(WebScraper)
207
+ class WebScraperAdmin(admin.ModelAdmin):
208
+ list_display = (
209
+ "priority",
210
+ "name",
211
+ "type",
212
+ "api_key",
213
+ "api_url",
214
+ "created_at",
200
215
  )
216
+ search_fields = ("name", "api_key", "api_url", "type")
217
+ ordering = ("priority",)
201
218
 
202
219
 
203
220
  @admin.register(Conversation)
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.0.8 on 2024-10-17 18:13
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("database", "0067_alter_agent_style_icon"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="agent",
15
+ name="output_modes",
16
+ field=django.contrib.postgres.fields.ArrayField(
17
+ base_field=models.CharField(
18
+ choices=[("text", "Text"), ("image", "Image"), ("automation", "Automation")], max_length=200
19
+ ),
20
+ default=list,
21
+ size=None,
22
+ ),
23
+ ),
24
+ ]
@@ -0,0 +1,89 @@
1
+ # Generated by Django 5.0.8 on 2024-10-18 00:41
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("database", "0068_alter_agent_output_modes"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name="WebScraper",
15
+ fields=[
16
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
17
+ ("created_at", models.DateTimeField(auto_now_add=True)),
18
+ ("updated_at", models.DateTimeField(auto_now=True)),
19
+ (
20
+ "name",
21
+ models.CharField(
22
+ blank=True,
23
+ default=None,
24
+ help_text="Friendly name. If not set, it will be set to the type of the scraper.",
25
+ max_length=200,
26
+ null=True,
27
+ unique=True,
28
+ ),
29
+ ),
30
+ (
31
+ "type",
32
+ models.CharField(
33
+ choices=[
34
+ ("Firecrawl", "Firecrawl"),
35
+ ("Olostep", "Olostep"),
36
+ ("Jina", "Jina"),
37
+ ("Direct", "Direct"),
38
+ ],
39
+ default="Jina",
40
+ max_length=20,
41
+ ),
42
+ ),
43
+ (
44
+ "api_key",
45
+ models.CharField(
46
+ blank=True,
47
+ default=None,
48
+ help_text="API key of the web scraper. Only set if scraper service requires an API key. Default is set from env var.",
49
+ max_length=200,
50
+ null=True,
51
+ ),
52
+ ),
53
+ (
54
+ "api_url",
55
+ models.URLField(
56
+ blank=True,
57
+ default=None,
58
+ help_text="API URL of the web scraper. Only set if scraper service on non-default URL.",
59
+ null=True,
60
+ ),
61
+ ),
62
+ (
63
+ "priority",
64
+ models.IntegerField(
65
+ blank=True,
66
+ default=None,
67
+ help_text="Priority of the web scraper. Lower numbers run first.",
68
+ null=True,
69
+ unique=True,
70
+ ),
71
+ ),
72
+ ],
73
+ options={
74
+ "abstract": False,
75
+ },
76
+ ),
77
+ migrations.AddField(
78
+ model_name="serverchatsettings",
79
+ name="web_scraper",
80
+ field=models.ForeignKey(
81
+ blank=True,
82
+ default=None,
83
+ null=True,
84
+ on_delete=django.db.models.deletion.CASCADE,
85
+ related_name="web_scraper",
86
+ to="database.webscraper",
87
+ ),
88
+ ),
89
+ ]