khoj 1.26.1__tar.gz → 1.26.5.dev35__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 (413) hide show
  1. {khoj-1.26.1 → khoj-1.26.5.dev35}/PKG-INFO +2 -2
  2. {khoj-1.26.1 → khoj-1.26.5.dev35}/pyproject.toml +1 -1
  3. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/configure.py +3 -3
  4. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/adapters/__init__.py +68 -35
  5. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/admin.py +2 -0
  6. khoj-1.26.5.dev35/src/khoj/database/management/commands/change_default_model.py +182 -0
  7. khoj-1.26.5.dev35/src/khoj/database/migrations/0070_alter_agent_input_tools_alter_agent_output_modes.py +46 -0
  8. khoj-1.26.5.dev35/src/khoj/database/migrations/0071_subscription_enabled_trial_at_and_more.py +32 -0
  9. khoj-1.26.5.dev35/src/khoj/database/migrations/0072_entry_search_model.py +24 -0
  10. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/models/__init__.py +10 -3
  11. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/404/index.html +1 -1
  12. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/1210.132a7e1910006bbb.js +1 -0
  13. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/1279-f37ee4a388ebf544.js +1 -0
  14. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/1459.690bf20e7d7b7090.js +1 -0
  15. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/1603-b9d95833e0e025e8.js +1 -0
  16. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/1970-1d6d0c1b00b4f343.js +1 -0
  17. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/2697-61fcba89fd87eab4.js +1 -0
  18. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/3423-8e9c420574a9fbe3.js +1 -0
  19. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/394-6bcb8c429f168f21.js +3 -0
  20. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/4602-8eeb4b76385ad159.js +1 -0
  21. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/5512-94c7c2bbcf58c19d.js +1 -0
  22. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/7113-f2e114d7034a0835.js +1 -0
  23. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/3678-ef0d20e267e9f010.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/7883-b1305ec254213afe.js +2 -2
  24. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/4086-2c74808ba38a5a0f.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/8840-b8d7b9f0923c6651.js +1 -1
  25. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/9417-759984ad62caa3dc.js +1 -0
  26. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/9479-4b443fdcc99141c9.js +1 -0
  27. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/94ca1967.5584df65931cfe83.js +1 -0
  28. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/964ecbae.ea4eab2a3a835ffe.js +1 -0
  29. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/agents/page-adbf3cd470da248f.js +1 -0
  30. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/automations/page-5480731341f34450.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/automations/page-d3edae545a1b5393.js +1 -1
  31. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/chat/page-460d262a3ef77503.js +1 -0
  32. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/factchecker/page-e7b34316ec6f44de.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/factchecker/page-c8e5bd563a8155eb.js +1 -1
  33. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/page-10a5aad6e04f3cf8.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/page-337bba1c554d0742.js +1 -1
  34. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/search/page-d56541c746fded7d.js → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/search/page-a5c277eff207959e.js +1 -1
  35. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/settings/page-60097571dd9f9d37.js +1 -0
  36. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/page-97c4e60105009649.js +1 -0
  37. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/chunks/webpack-35c06f544e18305f.js +1 -0
  38. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/c808691c459e3887.css → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/css/3cf13271869a4aeb.css +1 -1
  39. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/css/4cae6c0e5c72fb2d.css +1 -0
  40. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/css/76d55eb435962b19.css +25 -0
  41. khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/css/afd3d45cc65d55d8.css +1 -0
  42. khoj-1.26.5.dev35/src/khoj/interface/compiled/agents/index.html +1 -0
  43. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/agents/index.txt +2 -2
  44. khoj-1.26.5.dev35/src/khoj/interface/compiled/automations/index.html +1 -0
  45. khoj-1.26.5.dev35/src/khoj/interface/compiled/automations/index.txt +8 -0
  46. khoj-1.26.5.dev35/src/khoj/interface/compiled/chat/index.html +1 -0
  47. khoj-1.26.5.dev35/src/khoj/interface/compiled/chat/index.txt +7 -0
  48. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/factchecker/index.html +1 -1
  49. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/factchecker/index.txt +2 -2
  50. khoj-1.26.5.dev35/src/khoj/interface/compiled/index.html +1 -0
  51. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/index.txt +2 -2
  52. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/search/index.html +1 -1
  53. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/search/index.txt +2 -2
  54. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/settings/index.html +1 -1
  55. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/settings/index.txt +2 -2
  56. khoj-1.26.5.dev35/src/khoj/interface/compiled/share/chat/index.html +1 -0
  57. khoj-1.26.5.dev35/src/khoj/interface/compiled/share/chat/index.txt +7 -0
  58. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/pdf/pdf_to_entries.py +1 -1
  59. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/text_to_entries.py +4 -2
  60. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/google/gemini_chat.py +28 -13
  61. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/google/utils.py +34 -12
  62. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/openai/gpt.py +4 -4
  63. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/prompts.py +144 -0
  64. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/utils.py +22 -13
  65. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/image/generate.py +5 -5
  66. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/tools/online_search.py +4 -4
  67. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api.py +16 -6
  68. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api_agents.py +41 -20
  69. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api_chat.py +86 -47
  70. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api_model.py +0 -33
  71. khoj-1.26.1/src/khoj/routers/subscription.py → khoj-1.26.5.dev35/src/khoj/routers/api_subscription.py +21 -3
  72. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/auth.py +2 -2
  73. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/helpers.py +235 -39
  74. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/web_client.py +0 -11
  75. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_type/text_search.py +6 -2
  76. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/helpers.py +7 -3
  77. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/121-7024f479c297aef0.js +0 -1
  78. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/1603-fa3ee48860b9dc5c.js +0 -1
  79. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/2697-a38d01981ad3bdf8.js +0 -1
  80. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/4051-2cf66369d6ca0f1d.js +0 -3
  81. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/477-ec86e93db10571c1.js +0 -1
  82. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/51-e8f5bdb69b5ea421.js +0 -1
  83. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/7762-79f2205740622b5c.js +0 -1
  84. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/9178-899fe9a6b754ecfe.js +0 -1
  85. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/9417-46ed3aaa639c85ef.js +0 -1
  86. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/9479-ea776e73f549090c.js +0 -1
  87. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/agents/page-88aa3042711107b7.js +0 -1
  88. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/chat/page-702057ccbcf27881.js +0 -1
  89. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/settings/page-e044a999468a7c5d.js +0 -1
  90. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/page-fbbd66a4d4633438.js +0 -1
  91. khoj-1.26.1/src/khoj/interface/compiled/_next/static/chunks/webpack-c0cd5a6afb1f0798.js +0 -1
  92. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/2de69f0be774c768.css +0 -1
  93. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/3e1f1fdd70775091.css +0 -1
  94. khoj-1.26.1/src/khoj/interface/compiled/_next/static/css/b9a6bf04305d98d7.css +0 -25
  95. khoj-1.26.1/src/khoj/interface/compiled/agents/index.html +0 -1
  96. khoj-1.26.1/src/khoj/interface/compiled/automations/index.html +0 -1
  97. khoj-1.26.1/src/khoj/interface/compiled/automations/index.txt +0 -8
  98. khoj-1.26.1/src/khoj/interface/compiled/chat/index.html +0 -1
  99. khoj-1.26.1/src/khoj/interface/compiled/chat/index.txt +0 -7
  100. khoj-1.26.1/src/khoj/interface/compiled/index.html +0 -1
  101. khoj-1.26.1/src/khoj/interface/compiled/share/chat/index.html +0 -1
  102. khoj-1.26.1/src/khoj/interface/compiled/share/chat/index.txt +0 -7
  103. {khoj-1.26.1 → khoj-1.26.5.dev35}/.gitignore +0 -0
  104. {khoj-1.26.1 → khoj-1.26.5.dev35}/LICENSE +0 -0
  105. {khoj-1.26.1 → khoj-1.26.5.dev35}/README.md +0 -0
  106. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/__init__.py +0 -0
  107. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/app/README.md +0 -0
  108. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/app/__init__.py +0 -0
  109. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/app/asgi.py +0 -0
  110. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/app/settings.py +0 -0
  111. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/app/urls.py +0 -0
  112. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/__init__.py +0 -0
  113. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/apps.py +0 -0
  114. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/management/__init__.py +0 -0
  115. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/management/commands/__init__.py +0 -0
  116. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/management/commands/change_generated_images_url.py +0 -0
  117. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/management/commands/convert_images_png_to_webp.py +0 -0
  118. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0001_khojuser.py +0 -0
  119. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0002_googleuser.py +0 -0
  120. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0003_vector_extension.py +0 -0
  121. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0004_content_types_and_more.py +0 -0
  122. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0005_embeddings_corpus_id.py +0 -0
  123. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0006_embeddingsdates.py +0 -0
  124. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0007_add_conversation.py +0 -0
  125. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0008_alter_conversation_conversation_log.py +0 -0
  126. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0009_khojapiuser.py +0 -0
  127. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0010_chatmodeloptions_and_more.py +0 -0
  128. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0010_rename_embeddings_entry_and_more.py +0 -0
  129. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0011_merge_20231102_0138.py +0 -0
  130. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0012_entry_file_source.py +0 -0
  131. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0013_subscription.py +0 -0
  132. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0014_alter_googleuser_picture.py +0 -0
  133. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0015_alter_subscription_user.py +0 -0
  134. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0016_alter_subscription_renewal_date.py +0 -0
  135. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0017_searchmodel.py +0 -0
  136. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0018_searchmodelconfig_delete_searchmodel.py +0 -0
  137. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0019_alter_googleuser_family_name_and_more.py +0 -0
  138. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0020_reflectivequestion.py +0 -0
  139. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0021_speechtotextmodeloptions_and_more.py +0 -0
  140. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0022_texttoimagemodelconfig.py +0 -0
  141. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0023_usersearchmodelconfig.py +0 -0
  142. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0024_alter_entry_embeddings.py +0 -0
  143. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0025_clientapplication_khojuser_phone_number_and_more.py +0 -0
  144. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0025_searchmodelconfig_embeddings_inference_endpoint_and_more.py +0 -0
  145. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0026_searchmodelconfig_cross_encoder_inference_endpoint_and_more.py +0 -0
  146. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0027_merge_20240118_1324.py +0 -0
  147. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0028_khojuser_verified_phone_number.py +0 -0
  148. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0029_userrequests.py +0 -0
  149. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0030_conversation_slug_and_title.py +0 -0
  150. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0031_agent_conversation_agent.py +0 -0
  151. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0031_alter_googleuser_locale.py +0 -0
  152. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0032_merge_20240322_0427.py +0 -0
  153. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0033_rename_tuning_agent_personality.py +0 -0
  154. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0034_alter_chatmodeloptions_chat_model.py +0 -0
  155. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0035_processlock.py +0 -0
  156. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0036_alter_processlock_name.py +0 -0
  157. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0036_delete_offlinechatprocessorconversationconfig.py +0 -0
  158. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0036_publicconversation.py +0 -0
  159. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0037_chatmodeloptions_openai_config_and_more.py +0 -0
  160. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0037_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +0 -0
  161. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0038_merge_20240425_0857.py +0 -0
  162. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0038_merge_20240426_1640.py +0 -0
  163. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0039_merge_20240501_0301.py +0 -0
  164. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0040_alter_processlock_name.py +0 -0
  165. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0040_merge_20240504_1010.py +0 -0
  166. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0041_merge_20240505_1234.py +0 -0
  167. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0042_serverchatsettings.py +0 -0
  168. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0043_alter_chatmodeloptions_model_type.py +0 -0
  169. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0044_conversation_file_filters.py +0 -0
  170. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0045_fileobject.py +0 -0
  171. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0046_khojuser_email_verification_code_and_more.py +0 -0
  172. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0047_alter_entry_file_type.py +0 -0
  173. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0048_voicemodeloption_uservoicemodelconfig.py +0 -0
  174. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0049_datastore.py +0 -0
  175. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0049_texttoimagemodelconfig_api_key_and_more.py +0 -0
  176. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0050_alter_processlock_name.py +0 -0
  177. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0051_merge_20240702_1220.py +0 -0
  178. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0052_alter_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +0 -0
  179. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0053_agent_style_color_agent_style_icon.py +0 -0
  180. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0054_alter_agent_style_color.py +0 -0
  181. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0055_alter_agent_style_icon.py +0 -0
  182. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0056_chatmodeloptions_vision_enabled.py +0 -0
  183. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0056_searchmodelconfig_cross_encoder_model_config.py +0 -0
  184. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0057_merge_20240816_1409.py +0 -0
  185. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0057_remove_serverchatsettings_default_model_and_more.py +0 -0
  186. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0058_alter_chatmodeloptions_chat_model.py +0 -0
  187. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0059_searchmodelconfig_bi_encoder_confidence_threshold.py +0 -0
  188. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0060_merge_20240905_1828.py +0 -0
  189. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0061_alter_chatmodeloptions_model_type.py +0 -0
  190. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0061_alter_texttoimagemodelconfig_model_type.py +0 -0
  191. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0062_merge_20240913_0222.py +0 -0
  192. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0063_conversation_temp_id.py +0 -0
  193. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +0 -0
  194. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0065_remove_agent_avatar_remove_agent_public_and_more.py +0 -0
  195. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0066_remove_agent_tools_agent_input_tools_and_more.py +0 -0
  196. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0067_alter_agent_style_icon.py +0 -0
  197. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0068_alter_agent_output_modes.py +0 -0
  198. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +0 -0
  199. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/migrations/__init__.py +0 -0
  200. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/database/tests.py +0 -0
  201. {khoj-1.26.1/src/khoj/interface/compiled/_next/static/K1DjEvR838A-wSpSmyfVM → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/GH1Wb7mTB8D7ZsHW6iRF6}/_buildManifest.js +0 -0
  202. {khoj-1.26.1/src/khoj/interface/compiled/_next/static/K1DjEvR838A-wSpSmyfVM → khoj-1.26.5.dev35/src/khoj/interface/compiled/_next/static/GH1Wb7mTB8D7ZsHW6iRF6}/_ssgManifest.js +0 -0
  203. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/3062-71ed4b46ac2bb87c.js +0 -0
  204. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/3110-ef2cacd1b8d79ad8.js +0 -0
  205. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/4504-1629487c8bc82203.js +0 -0
  206. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/6297-d1c842ed3f714ab0.js +0 -0
  207. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/7023-a5bf5744d19b3bd3.js +0 -0
  208. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/9001-3b27af6d5f21df44.js +0 -0
  209. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/_not-found/page-07ff4ab42b07845e.js +0 -0
  210. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/agents/layout-75636ab3a413fa8e.js +0 -0
  211. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/automations/layout-27c28e923c9b1ff0.js +0 -0
  212. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/chat/layout-96fcf62857bf8f30.js +0 -0
  213. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/factchecker/layout-7b30c541c05fb904.js +0 -0
  214. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/layout-d0f0a9067427fb20.js +0 -0
  215. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/search/layout-3720f1362310bebb.js +0 -0
  216. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/settings/layout-a8f33dfe92f997fb.js +0 -0
  217. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-2df56074e42adaa0.js +0 -0
  218. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/d3ac728e-a9e3522eef9b6b28.js +0 -0
  219. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/fd9d1056-2b978342deb60015.js +0 -0
  220. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js +0 -0
  221. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/main-app-6d6ee3495efe03d4.js +0 -0
  222. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/main-f84cd3c1873cd842.js +0 -0
  223. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/pages/_app-f870474a17b7f2fd.js +0 -0
  224. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +0 -0
  225. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js +0 -0
  226. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/css/2272c73fc7a3b571.css +0 -0
  227. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/css/467a524c75e7d7c0.css +0 -0
  228. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/css/553f9cdcc7a2bcd6.css +0 -0
  229. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/css/592ca99f5122e75a.css +0 -0
  230. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/css/5a400c87d295e68a.css +0 -0
  231. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/0e790e04fd40ad16-s.p.woff2 +0 -0
  232. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/4221e1667cd19c7d-s.woff2 +0 -0
  233. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/6c276159aa0eb14b-s.woff2 +0 -0
  234. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/6cc0b9500e4f9168-s.woff2 +0 -0
  235. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/9d9319a7a2ac39c6-s.woff2 +0 -0
  236. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  237. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  238. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  239. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  240. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  241. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  242. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  243. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  244. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  245. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  246. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  247. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  248. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  249. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  250. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  251. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  252. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  253. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  254. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  255. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  256. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  257. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  258. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  259. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  260. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  261. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  262. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  263. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  264. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  265. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  266. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  267. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  268. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  269. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  270. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  271. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  272. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  273. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  274. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  275. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  276. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  277. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  278. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  279. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  280. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  281. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  282. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  283. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  284. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  285. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  286. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  287. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  288. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  289. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  290. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  291. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  292. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  293. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  294. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  295. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  296. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/a75c8ea86756d52d-s.woff2 +0 -0
  297. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/abce7c400ca31a51-s.woff2 +0 -0
  298. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/f759c939737fb668-s.woff2 +0 -0
  299. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp +0 -0
  300. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp +0 -0
  301. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/globe.98e105ca.webp +0 -0
  302. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp +0 -0
  303. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/agents.svg +0 -0
  304. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/icons/khoj_lantern.ico +0 -0
  305. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/icons/khoj_lantern_128x128.png +0 -0
  306. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/icons/khoj_lantern_256x256.png +0 -0
  307. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/icons/khoj_lantern_logomarktype_1200x630.png +0 -0
  308. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/desktop-browse-draw-sample.png +0 -0
  309. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/desktop-plain-chat-sample.png +0 -0
  310. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png +0 -0
  311. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png +0 -0
  312. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png +0 -0
  313. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png +0 -0
  314. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/automation.svg +0 -0
  315. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/chat.svg +0 -0
  316. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/close.svg +0 -0
  317. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/copy-button-success.svg +0 -0
  318. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/copy-button.svg +0 -0
  319. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/khoj.webmanifest +0 -0
  320. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/logo.svg +0 -0
  321. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/send.svg +0 -0
  322. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/share.svg +0 -0
  323. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/thumbs-down.svg +0 -0
  324. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/compiled/thumbs-up.svg +0 -0
  325. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/email/feedback.html +0 -0
  326. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/email/magic_link.html +0 -0
  327. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/email/task.html +0 -0
  328. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/email/welcome.html +0 -0
  329. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/agents.svg +0 -0
  330. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/automation.svg +0 -0
  331. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/chat.svg +0 -0
  332. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/favicon-128x128.ico +0 -0
  333. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/github.svg +0 -0
  334. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/khoj-logo-sideways-200.png +0 -0
  335. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/khoj-logo-sideways-500.png +0 -0
  336. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/khoj-logo-sideways.svg +0 -0
  337. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/khoj.svg +0 -0
  338. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/logotype.svg +0 -0
  339. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/search.svg +0 -0
  340. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/icons/sync.svg +0 -0
  341. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/khoj.css +0 -0
  342. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/assets/utils.js +0 -0
  343. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/base_config.html +0 -0
  344. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/content_source_github_input.html +0 -0
  345. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/login.html +0 -0
  346. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/interface/web/utils.html +0 -0
  347. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/main.py +0 -0
  348. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/manage.py +0 -0
  349. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/__init__.py +0 -0
  350. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_offline_chat_default_model.py +0 -0
  351. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_offline_chat_default_model_2.py +0 -0
  352. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_offline_chat_schema.py +0 -0
  353. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_offline_model.py +0 -0
  354. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_processor_config_openai.py +0 -0
  355. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_server_pg.py +0 -0
  356. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/migrations/migrate_version.py +0 -0
  357. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/__init__.py +0 -0
  358. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/__init__.py +0 -0
  359. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/docx/__init__.py +0 -0
  360. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/docx/docx_to_entries.py +0 -0
  361. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/github/__init__.py +0 -0
  362. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/github/github_to_entries.py +0 -0
  363. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/images/__init__.py +0 -0
  364. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/images/image_to_entries.py +0 -0
  365. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/markdown/__init__.py +0 -0
  366. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/markdown/markdown_to_entries.py +0 -0
  367. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/notion/notion_to_entries.py +0 -0
  368. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/org_mode/__init__.py +0 -0
  369. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/org_mode/org_to_entries.py +0 -0
  370. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/org_mode/orgnode.py +0 -0
  371. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/pdf/__init__.py +0 -0
  372. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/plaintext/__init__.py +0 -0
  373. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/content/plaintext/plaintext_to_entries.py +0 -0
  374. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/__init__.py +0 -0
  375. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/anthropic/__init__.py +0 -0
  376. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/anthropic/anthropic_chat.py +0 -0
  377. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/anthropic/utils.py +0 -0
  378. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/google/__init__.py +0 -0
  379. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/offline/__init__.py +0 -0
  380. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/offline/chat_model.py +0 -0
  381. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/offline/utils.py +0 -0
  382. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/offline/whisper.py +0 -0
  383. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/openai/__init__.py +0 -0
  384. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/openai/utils.py +0 -0
  385. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/conversation/openai/whisper.py +0 -0
  386. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/embeddings.py +0 -0
  387. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/speech/__init__.py +0 -0
  388. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/speech/text_to_speech.py +0 -0
  389. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/processor/tools/__init__.py +0 -0
  390. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/__init__.py +0 -0
  391. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api_content.py +0 -0
  392. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/api_phone.py +0 -0
  393. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/email.py +0 -0
  394. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/notion.py +0 -0
  395. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/storage.py +0 -0
  396. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/routers/twilio.py +0 -0
  397. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_filter/__init__.py +0 -0
  398. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_filter/base_filter.py +0 -0
  399. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_filter/date_filter.py +0 -0
  400. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_filter/file_filter.py +0 -0
  401. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_filter/word_filter.py +0 -0
  402. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/search_type/__init__.py +0 -0
  403. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/__init__.py +0 -0
  404. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/cli.py +0 -0
  405. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/config.py +0 -0
  406. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/constants.py +0 -0
  407. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/fs_syncer.py +0 -0
  408. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/initialization.py +0 -0
  409. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/jsonl.py +0 -0
  410. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/models.py +0 -0
  411. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/rawconfig.py +0 -0
  412. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/state.py +0 -0
  413. {khoj-1.26.1 → khoj-1.26.5.dev35}/src/khoj/utils/yaml.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: khoj
3
- Version: 1.26.1
3
+ Version: 1.26.5.dev35
4
4
  Summary: Your Second Brain
5
5
  Project-URL: Homepage, https://khoj.dev
6
6
  Project-URL: Documentation, https://docs.khoj.dev
@@ -56,7 +56,7 @@ Requires-Dist: pillow~=10.0.0
56
56
  Requires-Dist: psutil>=5.8.0
57
57
  Requires-Dist: psycopg2-binary==2.9.9
58
58
  Requires-Dist: pydantic[email]>=2.0.0
59
- Requires-Dist: pymupdf>=1.23.5
59
+ Requires-Dist: pymupdf==1.24.11
60
60
  Requires-Dist: python-multipart>=0.0.7
61
61
  Requires-Dist: pytz~=2024.1
62
62
  Requires-Dist: pyyaml~=6.0
@@ -62,7 +62,7 @@ dependencies = [
62
62
  "requests >= 2.26.0",
63
63
  "tenacity == 8.3.0",
64
64
  "anyio == 3.7.1",
65
- "pymupdf >= 1.23.5",
65
+ "pymupdf == 1.24.11",
66
66
  "django == 5.0.9",
67
67
  "authlib == 1.2.1",
68
68
  "llama-cpp-python == 0.2.88",
@@ -108,7 +108,7 @@ class UserAuthenticationBackend(AuthenticationBackend):
108
108
  password="default",
109
109
  )
110
110
  renewal_date = make_aware(datetime.strptime("2100-04-01", "%Y-%m-%d"))
111
- Subscription.objects.create(user=default_user, type="standard", renewal_date=renewal_date)
111
+ Subscription.objects.create(user=default_user, type=Subscription.Type.STANDARD, renewal_date=renewal_date)
112
112
 
113
113
  async def authenticate(self, request: HTTPConnection):
114
114
  current_user = request.session.get("user")
@@ -172,7 +172,7 @@ class UserAuthenticationBackend(AuthenticationBackend):
172
172
  request=request,
173
173
  telemetry_type="api",
174
174
  api="create_user",
175
- metadata={"user_id": str(user.uuid)},
175
+ metadata={"server_id": str(user.uuid)},
176
176
  )
177
177
  logger.log(logging.INFO, f"🥳 New User Created: {user.uuid}")
178
178
  else:
@@ -312,7 +312,7 @@ def configure_routes(app):
312
312
  logger.info("🔑 Enabled Authentication")
313
313
 
314
314
  if state.billing_enabled:
315
- from khoj.routers.subscription import subscription_router
315
+ from khoj.routers.api_subscription import subscription_router
316
316
 
317
317
  app.include_router(subscription_router, prefix="/api/subscription")
318
318
  logger.info("💳 Enabled Billing")
@@ -70,6 +70,9 @@ from khoj.utils.helpers import (
70
70
  logger = logging.getLogger(__name__)
71
71
 
72
72
 
73
+ LENGTH_OF_FREE_TRIAL = 7 #
74
+
75
+
73
76
  class SubscriptionState(Enum):
74
77
  TRIAL = "trial"
75
78
  SUBSCRIBED = "subscribed"
@@ -168,7 +171,7 @@ async def acreate_user_by_phone_number(phone_number: str) -> KhojUser:
168
171
  )
169
172
  await user.asave()
170
173
 
171
- await Subscription.objects.acreate(user=user, type="trial")
174
+ await Subscription.objects.acreate(user=user, type=Subscription.Type.STANDARD)
172
175
 
173
176
  return user
174
177
 
@@ -185,11 +188,29 @@ async def aget_or_create_user_by_email(email: str) -> tuple[KhojUser, bool]:
185
188
 
186
189
  user_subscription = await Subscription.objects.filter(user=user).afirst()
187
190
  if not user_subscription:
188
- await Subscription.objects.acreate(user=user, type="trial")
191
+ await Subscription.objects.acreate(user=user, type=Subscription.Type.STANDARD)
189
192
 
190
193
  return user, is_new
191
194
 
192
195
 
196
+ async def astart_trial_subscription(user: KhojUser) -> Subscription:
197
+ subscription = await Subscription.objects.filter(user=user).afirst()
198
+ if not subscription:
199
+ raise HTTPException(status_code=400, detail="User does not have a subscription")
200
+
201
+ if subscription.type == Subscription.Type.TRIAL:
202
+ raise HTTPException(status_code=400, detail="User already has a trial subscription")
203
+
204
+ if subscription.enabled_trial_at:
205
+ raise HTTPException(status_code=400, detail="User already has a trial subscription")
206
+
207
+ subscription.type = Subscription.Type.TRIAL
208
+ subscription.enabled_trial_at = datetime.now(tz=timezone.utc)
209
+ subscription.renewal_date = datetime.now(tz=timezone.utc) + timedelta(days=LENGTH_OF_FREE_TRIAL)
210
+ await subscription.asave()
211
+ return subscription
212
+
213
+
193
214
  async def aget_user_validated_by_email_verification_code(code: str) -> KhojUser:
194
215
  user = await KhojUser.objects.filter(email_verification_code=code).afirst()
195
216
  if not user:
@@ -221,7 +242,7 @@ async def create_user_by_google_token(token: dict) -> KhojUser:
221
242
  user=user,
222
243
  )
223
244
 
224
- await Subscription.objects.acreate(user=user, type="trial")
245
+ await Subscription.objects.acreate(user=user, type=Subscription.Type.STANDARD)
225
246
 
226
247
  return user
227
248
 
@@ -279,16 +300,15 @@ def subscription_to_state(subscription: Subscription) -> str:
279
300
  if not subscription:
280
301
  return SubscriptionState.INVALID.value
281
302
  elif subscription.type == Subscription.Type.TRIAL:
282
- # Trial subscription is valid for 7 days
283
- if datetime.now(tz=timezone.utc) - subscription.created_at > timedelta(days=14):
303
+ # Check if the trial has expired
304
+ if datetime.now(tz=timezone.utc) > subscription.renewal_date:
284
305
  return SubscriptionState.EXPIRED.value
285
-
286
306
  return SubscriptionState.TRIAL.value
287
- elif subscription.is_recurring and subscription.renewal_date >= datetime.now(tz=timezone.utc):
307
+ elif subscription.is_recurring and subscription.renewal_date > datetime.now(tz=timezone.utc):
288
308
  return SubscriptionState.SUBSCRIBED.value
289
309
  elif not subscription.is_recurring and subscription.renewal_date is None:
290
310
  return SubscriptionState.EXPIRED.value
291
- elif not subscription.is_recurring and subscription.renewal_date >= datetime.now(tz=timezone.utc):
311
+ elif not subscription.is_recurring and subscription.renewal_date > datetime.now(tz=timezone.utc):
292
312
  return SubscriptionState.UNSUBSCRIBED.value
293
313
  elif not subscription.is_recurring and subscription.renewal_date < datetime.now(tz=timezone.utc):
294
314
  return SubscriptionState.EXPIRED.value
@@ -446,18 +466,26 @@ async def set_user_github_config(user: KhojUser, pat_token: str, repos: list):
446
466
  return config
447
467
 
448
468
 
449
- def get_user_search_model_or_default(user=None):
450
- if user and UserSearchModelConfig.objects.filter(user=user).exists():
451
- return UserSearchModelConfig.objects.filter(user=user).first().setting
469
+ def get_default_search_model() -> SearchModelConfig:
470
+ default_search_model = SearchModelConfig.objects.filter(name="default").first()
452
471
 
453
- if SearchModelConfig.objects.filter(name="default").exists():
454
- return SearchModelConfig.objects.filter(name="default").first()
472
+ if default_search_model:
473
+ return default_search_model
455
474
  else:
456
475
  SearchModelConfig.objects.create()
457
476
 
458
477
  return SearchModelConfig.objects.first()
459
478
 
460
479
 
480
+ def get_user_default_search_model(user: KhojUser = None) -> SearchModelConfig:
481
+ if user:
482
+ user_search_model = UserSearchModelConfig.objects.filter(user=user).first()
483
+ if user_search_model:
484
+ return user_search_model.setting
485
+
486
+ return get_default_search_model()
487
+
488
+
461
489
  def get_or_create_search_models():
462
490
  search_models = SearchModelConfig.objects.all()
463
491
  if search_models.count() == 0:
@@ -467,21 +495,6 @@ def get_or_create_search_models():
467
495
  return search_models
468
496
 
469
497
 
470
- async def aset_user_search_model(user: KhojUser, search_model_config_id: int):
471
- config = await SearchModelConfig.objects.filter(id=search_model_config_id).afirst()
472
- if not config:
473
- return None
474
- new_config, _ = await UserSearchModelConfig.objects.aupdate_or_create(user=user, defaults={"setting": config})
475
- return new_config
476
-
477
-
478
- async def aget_user_search_model(user: KhojUser):
479
- config = await UserSearchModelConfig.objects.filter(user=user).prefetch_related("setting").afirst()
480
- if not config:
481
- return None
482
- return config.setting
483
-
484
-
485
498
  class ProcessLockAdapters:
486
499
  @staticmethod
487
500
  def get_process_lock(process_name: str):
@@ -622,6 +635,8 @@ class AgentAdapters:
622
635
  @staticmethod
623
636
  def get_all_accessible_agents(user: KhojUser = None):
624
637
  public_query = Q(privacy_level=Agent.PrivacyLevel.PUBLIC)
638
+ # TODO Update this to allow any public agent that's officially approved once that experience is launched
639
+ public_query &= Q(managed_by_admin=True)
625
640
  if user:
626
641
  return (
627
642
  Agent.objects.filter(public_query | Q(creator=user))
@@ -640,6 +655,16 @@ class AgentAdapters:
640
655
  agents = await sync_to_async(AgentAdapters.get_all_accessible_agents)(user)
641
656
  return await sync_to_async(list)(agents)
642
657
 
658
+ @staticmethod
659
+ async def ais_agent_accessible(agent: Agent, user: KhojUser) -> bool:
660
+ if agent.privacy_level == Agent.PrivacyLevel.PUBLIC:
661
+ return True
662
+ if agent.creator == user:
663
+ return True
664
+ if agent.privacy_level == Agent.PrivacyLevel.PROTECTED:
665
+ return True
666
+ return False
667
+
643
668
  @staticmethod
644
669
  def get_conversation_agent_by_id(agent_id: int):
645
670
  agent = Agent.objects.filter(id=agent_id).first()
@@ -1463,12 +1488,15 @@ class EntryAdapters:
1463
1488
  file_filters = EntryAdapters.file_filter.get_filter_terms(query)
1464
1489
  date_filters = EntryAdapters.date_filter.get_query_date_range(query)
1465
1490
 
1466
- user_or_agent = Q(user=user)
1491
+ owner_filter = Q()
1492
+
1493
+ if user != None:
1494
+ owner_filter = Q(user=user)
1467
1495
  if agent != None:
1468
- user_or_agent |= Q(agent=agent)
1496
+ owner_filter |= Q(agent=agent)
1469
1497
 
1470
1498
  if len(word_filters) == 0 and len(file_filters) == 0 and len(date_filters) == 0:
1471
- return Entry.objects.filter(user_or_agent)
1499
+ return Entry.objects.filter(owner_filter)
1472
1500
 
1473
1501
  for term in word_filters:
1474
1502
  if term.startswith("+"):
@@ -1504,7 +1532,7 @@ class EntryAdapters:
1504
1532
  formatted_max_date = date.fromtimestamp(max_date).strftime("%Y-%m-%d")
1505
1533
  q_filter_terms &= Q(embeddings_dates__date__lte=formatted_max_date)
1506
1534
 
1507
- relevant_entries = Entry.objects.filter(user_or_agent).filter(q_filter_terms)
1535
+ relevant_entries = Entry.objects.filter(owner_filter).filter(q_filter_terms)
1508
1536
  if file_type_filter:
1509
1537
  relevant_entries = relevant_entries.filter(file_type=file_type_filter)
1510
1538
  return relevant_entries
@@ -1519,13 +1547,18 @@ class EntryAdapters:
1519
1547
  max_distance: float = math.inf,
1520
1548
  agent: Agent = None,
1521
1549
  ):
1522
- user_or_agent = Q(user=user)
1550
+ owner_filter = Q()
1523
1551
 
1552
+ if user != None:
1553
+ owner_filter = Q(user=user)
1524
1554
  if agent != None:
1525
- user_or_agent |= Q(agent=agent)
1555
+ owner_filter |= Q(agent=agent)
1556
+
1557
+ if owner_filter == Q():
1558
+ return Entry.objects.none()
1526
1559
 
1527
1560
  relevant_entries = EntryAdapters.apply_filters(user, raw_query, file_type_filter, agent)
1528
- relevant_entries = relevant_entries.filter(user_or_agent).annotate(
1561
+ relevant_entries = relevant_entries.filter(owner_filter).annotate(
1529
1562
  distance=CosineDistance("embeddings", embeddings)
1530
1563
  )
1531
1564
  relevant_entries = relevant_entries.filter(distance__lte=max_distance)
@@ -126,6 +126,7 @@ class EntryAdmin(admin.ModelAdmin):
126
126
  "created_at",
127
127
  "updated_at",
128
128
  "user",
129
+ "agent",
129
130
  "file_source",
130
131
  "file_type",
131
132
  "file_name",
@@ -135,6 +136,7 @@ class EntryAdmin(admin.ModelAdmin):
135
136
  list_filter = (
136
137
  "file_type",
137
138
  "user__email",
139
+ "search_model__name",
138
140
  )
139
141
  ordering = ("-created_at",)
140
142
 
@@ -0,0 +1,182 @@
1
+ import logging
2
+ from typing import List
3
+
4
+ from django.core.management.base import BaseCommand
5
+ from django.db import transaction
6
+ from django.db.models import Count, Q
7
+ from tqdm import tqdm
8
+
9
+ from khoj.database.adapters import get_default_search_model
10
+ from khoj.database.models import (
11
+ Agent,
12
+ Entry,
13
+ KhojUser,
14
+ SearchModelConfig,
15
+ UserSearchModelConfig,
16
+ )
17
+ from khoj.processor.embeddings import EmbeddingsModel
18
+
19
+ logging.basicConfig(level=logging.INFO)
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class Command(BaseCommand):
24
+ help = "Convert all existing Entry objects to use a new default Search model."
25
+
26
+ def add_arguments(self, parser):
27
+ # Pass default SearchModelConfig ID
28
+ parser.add_argument(
29
+ "--search_model_id",
30
+ action="store",
31
+ help="ID of the SearchModelConfig object to set as the default search model for all existing Entry objects and UserSearchModelConfig objects.",
32
+ required=True,
33
+ )
34
+
35
+ # Set the apply flag to apply the new default Search model to all existing Entry objects and UserSearchModelConfig objects.
36
+ parser.add_argument(
37
+ "--apply",
38
+ action="store_true",
39
+ help="Apply the new default Search model to all existing Entry objects and UserSearchModelConfig objects. Otherwise, only display the number of Entry objects and UserSearchModelConfig objects that will be affected.",
40
+ )
41
+
42
+ def handle(self, *args, **options):
43
+ @transaction.atomic
44
+ def regenerate_entries(entry_filter: Q, embeddings_model: EmbeddingsModel, search_model: SearchModelConfig):
45
+ entries = Entry.objects.filter(entry_filter).all()
46
+ compiled_entries = [entry.compiled for entry in entries]
47
+ updated_entries: List[Entry] = []
48
+ try:
49
+ embeddings = embeddings_model.embed_documents(compiled_entries)
50
+
51
+ except Exception as e:
52
+ logger.error(f"Error embedding documents: {e}")
53
+ return
54
+
55
+ for i, entry in enumerate(tqdm(entries)):
56
+ entry.embeddings = embeddings[i]
57
+ entry.search_model_id = search_model.id
58
+ updated_entries.append(entry)
59
+
60
+ Entry.objects.bulk_update(updated_entries, ["embeddings", "search_model_id", "file_path"])
61
+
62
+ search_model_config_id = options.get("search_model_id")
63
+ apply = options.get("apply")
64
+
65
+ logger.info(f"SearchModelConfig ID: {search_model_config_id}")
66
+ logger.info(f"Apply: {apply}")
67
+
68
+ embeddings_model = dict()
69
+
70
+ search_models = SearchModelConfig.objects.all()
71
+ for model in search_models:
72
+ embeddings_model.update(
73
+ {
74
+ model.name: EmbeddingsModel(
75
+ model.bi_encoder,
76
+ model.embeddings_inference_endpoint,
77
+ model.embeddings_inference_endpoint_api_key,
78
+ query_encode_kwargs=model.bi_encoder_query_encode_config,
79
+ docs_encode_kwargs=model.bi_encoder_docs_encode_config,
80
+ model_kwargs=model.bi_encoder_model_config,
81
+ )
82
+ }
83
+ )
84
+
85
+ new_default_search_model_config = SearchModelConfig.objects.get(id=search_model_config_id)
86
+ logger.info(f"New default Search model: {new_default_search_model_config}")
87
+ user_search_model_configs_to_update = UserSearchModelConfig.objects.exclude(
88
+ setting_id=search_model_config_id
89
+ ).all()
90
+ logger.info(f"Number of UserSearchModelConfig objects to update: {user_search_model_configs_to_update.count()}")
91
+
92
+ for user_config in user_search_model_configs_to_update:
93
+ affected_user = user_config.user
94
+ entry_filter = Q(user=affected_user)
95
+ relevant_entries = Entry.objects.filter(entry_filter).all()
96
+ logger.info(f"Number of Entry objects to update for user {affected_user}: {relevant_entries.count()}")
97
+
98
+ if apply:
99
+ try:
100
+ regenerate_entries(
101
+ entry_filter,
102
+ embeddings_model[new_default_search_model_config.name],
103
+ new_default_search_model_config,
104
+ )
105
+ user_config.setting = new_default_search_model_config
106
+ user_config.save()
107
+
108
+ logger.info(
109
+ f"Updated UserSearchModelConfig object for user {affected_user} to use the new default Search model."
110
+ )
111
+ logger.info(
112
+ f"Updated {relevant_entries.count()} Entry objects for user {affected_user} to use the new default Search model."
113
+ )
114
+
115
+ except Exception as e:
116
+ logger.error(f"Error embedding documents: {e}")
117
+
118
+ logger.info("----")
119
+
120
+ # There are also plenty of users who have indexed documents without explicitly creating a UserSearchModelConfig object. You would have to migrate these users as well, if the default is different from search_model_config_id.
121
+ current_default = get_default_search_model()
122
+ if current_default.id != new_default_search_model_config.id:
123
+ users_without_user_search_model_config = KhojUser.objects.annotate(
124
+ user_search_model_config_count=Count("usersearchmodelconfig")
125
+ ).filter(user_search_model_config_count=0)
126
+
127
+ logger.info(f"Number of User objects to update: {users_without_user_search_model_config.count()}")
128
+ for user in users_without_user_search_model_config:
129
+ entry_filter = Q(user=user)
130
+ relevant_entries = Entry.objects.filter(entry_filter).all()
131
+ logger.info(f"Number of Entry objects to update for user {user}: {relevant_entries.count()}")
132
+
133
+ if apply:
134
+ try:
135
+ regenerate_entries(
136
+ entry_filter,
137
+ embeddings_model[new_default_search_model_config.name],
138
+ new_default_search_model_config,
139
+ )
140
+
141
+ UserSearchModelConfig.objects.create(user=user, setting=new_default_search_model_config)
142
+
143
+ logger.info(
144
+ f"Created UserSearchModelConfig object for user {user} to use the new default Search model."
145
+ )
146
+ logger.info(
147
+ f"Updated {relevant_entries.count()} Entry objects for user {user} to use the new default Search model."
148
+ )
149
+ except Exception as e:
150
+ logger.error(f"Error embedding documents: {e}")
151
+ else:
152
+ logger.info("Default is the same as search_model_config_id.")
153
+
154
+ all_agents = Agent.objects.all()
155
+ logger.info(f"Number of Agent objects to update: {all_agents.count()}")
156
+ for agent in all_agents:
157
+ entry_filter = Q(agent=agent)
158
+ relevant_entries = Entry.objects.filter(entry_filter).all()
159
+ logger.info(f"Number of Entry objects to update for agent {agent}: {relevant_entries.count()}")
160
+
161
+ if apply:
162
+ try:
163
+ regenerate_entries(
164
+ entry_filter,
165
+ embeddings_model[new_default_search_model_config.name],
166
+ new_default_search_model_config,
167
+ )
168
+ logger.info(
169
+ f"Updated {relevant_entries.count()} Entry objects for agent {agent} to use the new default Search model."
170
+ )
171
+ except Exception as e:
172
+ logger.error(f"Error embedding documents: {e}")
173
+ if apply and current_default.id != new_default_search_model_config.id:
174
+ # Get the existing default SearchModelConfig object and update its name
175
+ current_default.name = f"prev_default_{current_default.id}"
176
+ current_default.save()
177
+
178
+ # Update the new default SearchModelConfig object's name
179
+ new_default_search_model_config.name = "default"
180
+ new_default_search_model_config.save()
181
+ if not apply:
182
+ logger.info("Run the command with the --apply flag to apply the new default Search model.")
@@ -0,0 +1,46 @@
1
+ # Generated by Django 5.0.8 on 2024-10-21 05:16
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", "0069_webscraper_serverchatsettings_web_scraper"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="agent",
15
+ name="input_tools",
16
+ field=django.contrib.postgres.fields.ArrayField(
17
+ base_field=models.CharField(
18
+ choices=[
19
+ ("general", "General"),
20
+ ("online", "Online"),
21
+ ("notes", "Notes"),
22
+ ("summarize", "Summarize"),
23
+ ("webpage", "Webpage"),
24
+ ],
25
+ max_length=200,
26
+ ),
27
+ blank=True,
28
+ default=list,
29
+ null=True,
30
+ size=None,
31
+ ),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name="agent",
35
+ name="output_modes",
36
+ field=django.contrib.postgres.fields.ArrayField(
37
+ base_field=models.CharField(
38
+ choices=[("text", "Text"), ("image", "Image"), ("automation", "Automation")], max_length=200
39
+ ),
40
+ blank=True,
41
+ default=list,
42
+ null=True,
43
+ size=None,
44
+ ),
45
+ ),
46
+ ]
@@ -0,0 +1,32 @@
1
+ # Generated by Django 5.0.8 on 2024-10-20 19:24
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ def set_enabled_trial_at(apps, schema_editor):
7
+ Subscription = apps.get_model("database", "Subscription")
8
+ for subscription in Subscription.objects.all():
9
+ subscription.enabled_trial_at = subscription.created_at
10
+ subscription.save()
11
+
12
+
13
+ class Migration(migrations.Migration):
14
+ dependencies = [
15
+ ("database", "0070_alter_agent_input_tools_alter_agent_output_modes"),
16
+ ]
17
+
18
+ operations = [
19
+ migrations.AddField(
20
+ model_name="subscription",
21
+ name="enabled_trial_at",
22
+ field=models.DateTimeField(blank=True, default=None, null=True),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="subscription",
26
+ name="type",
27
+ field=models.CharField(
28
+ choices=[("trial", "Trial"), ("standard", "Standard")], default="standard", max_length=20
29
+ ),
30
+ ),
31
+ migrations.RunPython(set_enabled_trial_at),
32
+ ]
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.0.8 on 2024-10-21 21:09
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", "0071_subscription_enabled_trial_at_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="entry",
15
+ name="search_model",
16
+ field=models.ForeignKey(
17
+ blank=True,
18
+ default=None,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.SET_NULL,
21
+ to="database.searchmodelconfig",
22
+ ),
23
+ ),
24
+ ]
@@ -73,9 +73,10 @@ class Subscription(BaseModel):
73
73
  STANDARD = "standard"
74
74
 
75
75
  user = models.OneToOneField(KhojUser, on_delete=models.CASCADE, related_name="subscription")
76
- type = models.CharField(max_length=20, choices=Type.choices, default=Type.TRIAL)
76
+ type = models.CharField(max_length=20, choices=Type.choices, default=Type.STANDARD)
77
77
  is_recurring = models.BooleanField(default=False)
78
78
  renewal_date = models.DateTimeField(null=True, default=None, blank=True)
79
+ enabled_trial_at = models.DateTimeField(null=True, default=None, blank=True)
79
80
 
80
81
 
81
82
  class OpenAIProcessorConversationConfig(BaseModel):
@@ -180,8 +181,12 @@ class Agent(BaseModel):
180
181
  ) # Creator will only be null when the agents are managed by admin
181
182
  name = models.CharField(max_length=200)
182
183
  personality = models.TextField()
183
- input_tools = ArrayField(models.CharField(max_length=200, choices=InputToolOptions.choices), default=list)
184
- output_modes = ArrayField(models.CharField(max_length=200, choices=OutputModeOptions.choices), default=list)
184
+ input_tools = ArrayField(
185
+ models.CharField(max_length=200, choices=InputToolOptions.choices), default=list, null=True, blank=True
186
+ )
187
+ output_modes = ArrayField(
188
+ models.CharField(max_length=200, choices=OutputModeOptions.choices), default=list, null=True, blank=True
189
+ )
185
190
  managed_by_admin = models.BooleanField(default=False)
186
191
  chat_model = models.ForeignKey(ChatModelOptions, on_delete=models.CASCADE)
187
192
  slug = models.CharField(max_length=200, unique=True)
@@ -444,6 +449,7 @@ class UserVoiceModelConfig(BaseModel):
444
449
  setting = models.ForeignKey(VoiceModelOption, on_delete=models.CASCADE, default=None, null=True, blank=True)
445
450
 
446
451
 
452
+ # TODO Delete this model once all users have been migrated to the server's default settings
447
453
  class UserSearchModelConfig(BaseModel):
448
454
  user = models.OneToOneField(KhojUser, on_delete=models.CASCADE)
449
455
  setting = models.ForeignKey(SearchModelConfig, on_delete=models.CASCADE)
@@ -530,6 +536,7 @@ class Entry(BaseModel):
530
536
  url = models.URLField(max_length=400, default=None, null=True, blank=True)
531
537
  hashed_value = models.CharField(max_length=100)
532
538
  corpus_id = models.UUIDField(default=uuid.uuid4, editable=False)
539
+ search_model = models.ForeignKey(SearchModelConfig, on_delete=models.SET_NULL, default=None, null=True, blank=True)
533
540
 
534
541
  def save(self, *args, **kwargs):
535
542
  if self.user and self.agent: