khoj 2.0.0b12.dev5__py3-none-any.whl → 2.0.0b13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. khoj/app/README.md +1 -1
  2. khoj/app/urls.py +1 -0
  3. khoj/configure.py +21 -54
  4. khoj/database/adapters/__init__.py +6 -15
  5. khoj/database/management/commands/delete_orphaned_fileobjects.py +0 -1
  6. khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +1 -1
  7. khoj/database/migrations/0075_migrate_generated_assets_and_validate.py +1 -1
  8. khoj/database/migrations/0092_alter_chatmodel_model_type_alter_chatmodel_name_and_more.py +36 -0
  9. khoj/database/migrations/0093_remove_localorgconfig_user_and_more.py +36 -0
  10. khoj/database/models/__init__.py +10 -40
  11. khoj/database/tests.py +0 -2
  12. khoj/interface/compiled/404/index.html +2 -2
  13. khoj/interface/compiled/_next/static/chunks/{9245.a04e92d034540234.js → 1225.ecac11e7421504c4.js} +3 -3
  14. khoj/interface/compiled/_next/static/chunks/1320.ae930ad00affe685.js +5 -0
  15. khoj/interface/compiled/_next/static/chunks/{1327-1a9107b9a2a04a98.js → 1327-e254819a9172cfa7.js} +1 -1
  16. khoj/interface/compiled/_next/static/chunks/1626.15a8acc0d6639ec6.js +1 -0
  17. khoj/interface/compiled/_next/static/chunks/{3489.c523fe96a2eee74f.js → 1940.d082758bd04e08ae.js} +1 -1
  18. khoj/interface/compiled/_next/static/chunks/{2327-ea623ca2d22f78e9.js → 2327-438aaec1657c5ada.js} +1 -1
  19. khoj/interface/compiled/_next/static/chunks/2475.57a0d0fd93d07af0.js +93 -0
  20. khoj/interface/compiled/_next/static/chunks/2481.5ce6524ba0a73f90.js +55 -0
  21. khoj/interface/compiled/_next/static/chunks/297.4c4c823ff6e3255b.js +174 -0
  22. khoj/interface/compiled/_next/static/chunks/{5639-09e2009a2adedf8b.js → 3260-82d2521fab032ff1.js} +68 -23
  23. khoj/interface/compiled/_next/static/chunks/3353.1c6d553216a1acae.js +1 -0
  24. khoj/interface/compiled/_next/static/chunks/3855.f7b8131f78af046e.js +1 -0
  25. khoj/interface/compiled/_next/static/chunks/3973.dc54a39586ab48be.js +1 -0
  26. khoj/interface/compiled/_next/static/chunks/4241.c1cd170f7f37ac59.js +24 -0
  27. khoj/interface/compiled/_next/static/chunks/{4327.8d2a1b8f1ea78208.js → 4327.f3704dc398c67113.js} +19 -19
  28. khoj/interface/compiled/_next/static/chunks/4505.f09454a346269c3f.js +117 -0
  29. khoj/interface/compiled/_next/static/chunks/4801.96a152d49742b644.js +1 -0
  30. khoj/interface/compiled/_next/static/chunks/5427-a95ec748e52abb75.js +1 -0
  31. khoj/interface/compiled/_next/static/chunks/549.2bd27f59a91a9668.js +148 -0
  32. khoj/interface/compiled/_next/static/chunks/5765.71b1e1207b76b03f.js +1 -0
  33. khoj/interface/compiled/_next/static/chunks/584.d7ce3505f169b706.js +1 -0
  34. khoj/interface/compiled/_next/static/chunks/6240.34f7c1fa692edd61.js +24 -0
  35. khoj/interface/compiled/_next/static/chunks/6d3fe5a5-f9f3c16e0bc0cdf9.js +10 -0
  36. khoj/interface/compiled/_next/static/chunks/{7127-0f4a2a77d97fb5fa.js → 7127-97b83757db125ba6.js} +1 -1
  37. khoj/interface/compiled/_next/static/chunks/7200-93ab0072359b8028.js +1 -0
  38. khoj/interface/compiled/_next/static/chunks/{2612.bcf5a623b3da209e.js → 7553.f5ad54b1f6e92c49.js} +2 -2
  39. khoj/interface/compiled/_next/static/chunks/7626-1b630f1654172341.js +1 -0
  40. khoj/interface/compiled/_next/static/chunks/764.dadd316e8e16d191.js +63 -0
  41. khoj/interface/compiled/_next/static/chunks/78.08169ab541abab4f.js +43 -0
  42. khoj/interface/compiled/_next/static/chunks/784.e03acf460df213d1.js +1 -0
  43. khoj/interface/compiled/_next/static/chunks/{9537-d9ab442ce15d1e20.js → 8072-e1440cb482a0940e.js} +1 -1
  44. khoj/interface/compiled/_next/static/chunks/{3265.924139c4146ee344.js → 8086.8d39887215807fcd.js} +1 -1
  45. khoj/interface/compiled/_next/static/chunks/8168.f074ab8c7c16d82d.js +59 -0
  46. khoj/interface/compiled/_next/static/chunks/{8694.2bd9c2f65d8c5847.js → 8223.1705878fa7a09292.js} +1 -1
  47. khoj/interface/compiled/_next/static/chunks/8483.94f6c9e2bee86f50.js +215 -0
  48. khoj/interface/compiled/_next/static/chunks/{8888.ebe0e552b59e7fed.js → 8810.fc0e479de78c7c61.js} +1 -1
  49. khoj/interface/compiled/_next/static/chunks/8828.bc74dc4ce94e78f6.js +1 -0
  50. khoj/interface/compiled/_next/static/chunks/{7303.d0612f812a967a08.js → 8909.14ac3f43d0070cf1.js} +5 -5
  51. khoj/interface/compiled/_next/static/chunks/90542734.b1a1629065ba199b.js +1 -0
  52. khoj/interface/compiled/_next/static/chunks/9167.098534184f03fe92.js +56 -0
  53. khoj/interface/compiled/_next/static/chunks/{4980.63500d68b3bb1222.js → 9537.e934ce37bf314509.js} +5 -5
  54. khoj/interface/compiled/_next/static/chunks/9574.3fe8e26e95bf1c34.js +1 -0
  55. khoj/interface/compiled/_next/static/chunks/9599.ec50b5296c27dae9.js +1 -0
  56. khoj/interface/compiled/_next/static/chunks/9643.b34248df52ffc77c.js +262 -0
  57. khoj/interface/compiled/_next/static/chunks/9747.2fd9065b1435abb1.js +1 -0
  58. khoj/interface/compiled/_next/static/chunks/9922.98f2b2a9959b4ebe.js +1 -0
  59. khoj/interface/compiled/_next/static/chunks/app/agents/layout-e49165209d2e406c.js +1 -0
  60. khoj/interface/compiled/_next/static/chunks/app/agents/page-e291b49977f43880.js +1 -0
  61. khoj/interface/compiled/_next/static/chunks/app/automations/page-198b26df6e09bbb0.js +1 -0
  62. khoj/interface/compiled/_next/static/chunks/app/chat/{page-8e1c4f2af3c9429e.js → page-dfcc1e8e2ad62873.js} +1 -1
  63. khoj/interface/compiled/_next/static/chunks/app/{page-2b3056cba8aa96ce.js → page-1567cac7b79a7c59.js} +1 -1
  64. khoj/interface/compiled/_next/static/chunks/app/settings/{page-8be3b35178abf2ec.js → page-6081362437c82470.js} +1 -1
  65. khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-6fb51c5c80f8ec67.js +1 -0
  66. khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-4a4b0c0f4749c2b2.js → page-e0dcb1762f8c8f88.js} +1 -1
  67. khoj/interface/compiled/_next/static/chunks/webpack-5393aad3d824e0cb.js +1 -0
  68. khoj/interface/compiled/agents/index.html +2 -2
  69. khoj/interface/compiled/agents/index.txt +3 -3
  70. khoj/interface/compiled/automations/index.html +2 -2
  71. khoj/interface/compiled/automations/index.txt +3 -3
  72. khoj/interface/compiled/chat/index.html +2 -2
  73. khoj/interface/compiled/chat/index.txt +3 -3
  74. khoj/interface/compiled/index.html +2 -2
  75. khoj/interface/compiled/index.txt +3 -3
  76. khoj/interface/compiled/search/index.html +2 -2
  77. khoj/interface/compiled/search/index.txt +3 -3
  78. khoj/interface/compiled/settings/index.html +2 -2
  79. khoj/interface/compiled/settings/index.txt +3 -3
  80. khoj/interface/compiled/share/chat/index.html +2 -2
  81. khoj/interface/compiled/share/chat/index.txt +3 -3
  82. khoj/main.py +7 -9
  83. khoj/manage.py +1 -0
  84. khoj/processor/content/github/github_to_entries.py +6 -7
  85. khoj/processor/content/images/image_to_entries.py +0 -1
  86. khoj/processor/content/markdown/markdown_to_entries.py +2 -3
  87. khoj/processor/content/notion/notion_to_entries.py +5 -6
  88. khoj/processor/content/org_mode/org_to_entries.py +4 -5
  89. khoj/processor/content/org_mode/orgnode.py +4 -4
  90. khoj/processor/content/plaintext/plaintext_to_entries.py +1 -2
  91. khoj/processor/content/text_to_entries.py +1 -3
  92. khoj/processor/conversation/google/utils.py +3 -3
  93. khoj/processor/conversation/openai/gpt.py +65 -28
  94. khoj/processor/conversation/openai/utils.py +359 -28
  95. khoj/processor/conversation/prompts.py +16 -41
  96. khoj/processor/conversation/utils.py +29 -39
  97. khoj/processor/embeddings.py +0 -2
  98. khoj/processor/image/generate.py +3 -3
  99. khoj/processor/operator/__init__.py +2 -3
  100. khoj/processor/operator/grounding_agent.py +15 -2
  101. khoj/processor/operator/grounding_agent_uitars.py +34 -23
  102. khoj/processor/operator/operator_agent_anthropic.py +29 -4
  103. khoj/processor/operator/operator_agent_base.py +1 -1
  104. khoj/processor/operator/operator_agent_binary.py +4 -4
  105. khoj/processor/operator/operator_agent_openai.py +21 -6
  106. khoj/processor/operator/operator_environment_browser.py +1 -1
  107. khoj/processor/operator/operator_environment_computer.py +1 -1
  108. khoj/processor/speech/text_to_speech.py +0 -1
  109. khoj/processor/tools/online_search.py +1 -1
  110. khoj/processor/tools/run_code.py +1 -1
  111. khoj/routers/api.py +2 -15
  112. khoj/routers/api_agents.py +1 -2
  113. khoj/routers/api_automation.py +1 -1
  114. khoj/routers/api_chat.py +10 -16
  115. khoj/routers/api_content.py +3 -111
  116. khoj/routers/api_model.py +0 -1
  117. khoj/routers/api_subscription.py +1 -1
  118. khoj/routers/email.py +4 -4
  119. khoj/routers/helpers.py +44 -103
  120. khoj/routers/research.py +8 -8
  121. khoj/search_filter/base_filter.py +2 -4
  122. khoj/search_type/text_search.py +1 -2
  123. khoj/utils/cli.py +5 -53
  124. khoj/utils/config.py +0 -65
  125. khoj/utils/constants.py +6 -7
  126. khoj/utils/helpers.py +10 -18
  127. khoj/utils/initialization.py +7 -48
  128. khoj/utils/models.py +2 -4
  129. khoj/utils/rawconfig.py +1 -69
  130. khoj/utils/state.py +2 -8
  131. khoj/utils/yaml.py +0 -39
  132. {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/METADATA +3 -3
  133. {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/RECORD +139 -148
  134. khoj/interface/compiled/_next/static/chunks/1191.b547ec13349b4aed.js +0 -1
  135. khoj/interface/compiled/_next/static/chunks/1588.f0558a0bdffc4761.js +0 -117
  136. khoj/interface/compiled/_next/static/chunks/1918.925cb4a35518d258.js +0 -43
  137. khoj/interface/compiled/_next/static/chunks/2849.dc00ae5ba7219cfc.js +0 -1
  138. khoj/interface/compiled/_next/static/chunks/303.fe76de943e930fbd.js +0 -1
  139. khoj/interface/compiled/_next/static/chunks/4533.586e74b45a2bde25.js +0 -55
  140. khoj/interface/compiled/_next/static/chunks/4551.82ce1476b5516bc2.js +0 -5
  141. khoj/interface/compiled/_next/static/chunks/4748.0edd37cba3ea2809.js +0 -59
  142. khoj/interface/compiled/_next/static/chunks/5210.cd35a1c1ec594a20.js +0 -93
  143. khoj/interface/compiled/_next/static/chunks/5329.f8b3c5b3d16159cd.js +0 -1
  144. khoj/interface/compiled/_next/static/chunks/5427-13d6ffd380fdfab7.js +0 -1
  145. khoj/interface/compiled/_next/static/chunks/558-c14e76cff03f6a60.js +0 -1
  146. khoj/interface/compiled/_next/static/chunks/5830.8876eccb82da9b7d.js +0 -262
  147. khoj/interface/compiled/_next/static/chunks/6230.88a71d8145347b3f.js +0 -1
  148. khoj/interface/compiled/_next/static/chunks/7161.77e0530a40ad5ca8.js +0 -1
  149. khoj/interface/compiled/_next/static/chunks/7200-ac3b2e37ff30e126.js +0 -1
  150. khoj/interface/compiled/_next/static/chunks/7505.c31027a3695bdebb.js +0 -148
  151. khoj/interface/compiled/_next/static/chunks/7760.35649cc21d9585bd.js +0 -56
  152. khoj/interface/compiled/_next/static/chunks/83.48e2db193a940052.js +0 -1
  153. khoj/interface/compiled/_next/static/chunks/8427.844694e06133fb51.js +0 -1
  154. khoj/interface/compiled/_next/static/chunks/8665.4db7e6b2e8933497.js +0 -174
  155. khoj/interface/compiled/_next/static/chunks/872.caf84cc1a39ae59f.js +0 -1
  156. khoj/interface/compiled/_next/static/chunks/8890.6e8a59e4de6978bc.js +0 -215
  157. khoj/interface/compiled/_next/static/chunks/8950.5f2272e0ac923f9e.js +0 -1
  158. khoj/interface/compiled/_next/static/chunks/90542734.2c21f16f18b22411.js +0 -1
  159. khoj/interface/compiled/_next/static/chunks/9202.c703864fcedc8d1f.js +0 -63
  160. khoj/interface/compiled/_next/static/chunks/9320.6aca4885d541aa44.js +0 -24
  161. khoj/interface/compiled/_next/static/chunks/9535.f78cd92d03331e55.js +0 -1
  162. khoj/interface/compiled/_next/static/chunks/9968.b111fc002796da81.js +0 -1
  163. khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +0 -1
  164. khoj/interface/compiled/_next/static/chunks/app/agents/page-9a4610474cd59a71.js +0 -1
  165. khoj/interface/compiled/_next/static/chunks/app/automations/page-f7bb9d777b7745d4.js +0 -1
  166. khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js +0 -1
  167. khoj/interface/compiled/_next/static/chunks/f3e3247b-1758d4651e4457c2.js +0 -10
  168. khoj/interface/compiled/_next/static/chunks/webpack-338a5000c912cc94.js +0 -1
  169. khoj/migrations/__init__.py +0 -0
  170. khoj/migrations/migrate_offline_chat_default_model.py +0 -69
  171. khoj/migrations/migrate_offline_chat_default_model_2.py +0 -71
  172. khoj/migrations/migrate_offline_chat_schema.py +0 -83
  173. khoj/migrations/migrate_offline_model.py +0 -29
  174. khoj/migrations/migrate_processor_config_openai.py +0 -67
  175. khoj/migrations/migrate_server_pg.py +0 -132
  176. khoj/migrations/migrate_version.py +0 -17
  177. khoj/processor/conversation/offline/__init__.py +0 -0
  178. khoj/processor/conversation/offline/chat_model.py +0 -224
  179. khoj/processor/conversation/offline/utils.py +0 -80
  180. khoj/processor/conversation/offline/whisper.py +0 -15
  181. khoj/utils/fs_syncer.py +0 -252
  182. /khoj/interface/compiled/_next/static/{7GoMcE8WpP9fbfYZXv4Nv → RYbQvo3AvgOR0bEVVfxF4}/_buildManifest.js +0 -0
  183. /khoj/interface/compiled/_next/static/{7GoMcE8WpP9fbfYZXv4Nv → RYbQvo3AvgOR0bEVVfxF4}/_ssgManifest.js +0 -0
  184. /khoj/interface/compiled/_next/static/chunks/app/search/{page-4885df3cd175c957.js → page-3639e50ec3e9acfd.js} +0 -0
  185. {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/WHEEL +0 -0
  186. {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/entry_points.txt +0 -0
  187. {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/licenses/LICENSE +0 -0
khoj/routers/api.py CHANGED
@@ -7,7 +7,6 @@ from typing import List, Optional, Union
7
7
 
8
8
  import openai
9
9
  from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
10
- from fastapi.requests import Request
11
10
  from fastapi.responses import Response
12
11
  from starlette.authentication import has_required_scope, requires
13
12
 
@@ -15,7 +14,6 @@ from khoj.configure import initialize_content
15
14
  from khoj.database import adapters
16
15
  from khoj.database.adapters import ConversationAdapters, EntryAdapters, get_user_photo
17
16
  from khoj.database.models import KhojUser, SpeechToTextModelOptions
18
- from khoj.processor.conversation.offline.whisper import transcribe_audio_offline
19
17
  from khoj.processor.conversation.openai.whisper import transcribe_audio
20
18
  from khoj.routers.helpers import (
21
19
  ApiUserRateLimiter,
@@ -88,22 +86,14 @@ def update(
88
86
  force: Optional[bool] = False,
89
87
  ):
90
88
  user = request.user.object
91
- if not state.config:
92
- error_msg = f"🚨 Khoj is not configured.\nConfigure it via http://localhost:42110/settings, plugins or by editing {state.config_file}."
93
- logger.warning(error_msg)
94
- raise HTTPException(status_code=500, detail=error_msg)
95
89
  try:
96
90
  initialize_content(user=user, regenerate=force, search_type=t)
97
91
  except Exception as e:
98
- error_msg = f"🚨 Failed to update server via API: {e}"
92
+ error_msg = f"🚨 Failed to update server indexed content via API: {e}"
99
93
  logger.error(error_msg, exc_info=True)
100
94
  raise HTTPException(status_code=500, detail=error_msg)
101
95
  else:
102
- components = []
103
- if state.search_models:
104
- components.append("Search models")
105
- components_msg = ", ".join(components)
106
- logger.info(f"📪 {components_msg} updated via API")
96
+ logger.info("📪 Server indexed content updated via API")
107
97
 
108
98
  update_telemetry_state(
109
99
  request=request,
@@ -150,9 +140,6 @@ async def transcribe(
150
140
  if not speech_to_text_config:
151
141
  # If the user has not configured a speech to text model, return an unsupported on server error
152
142
  status_code = 501
153
- elif speech_to_text_config.model_type == SpeechToTextModelOptions.ModelType.OFFLINE:
154
- speech2text_model = speech_to_text_config.model_name
155
- user_message = await transcribe_audio_offline(audio_filename, speech2text_model)
156
143
  elif speech_to_text_config.model_type == SpeechToTextModelOptions.ModelType.OPENAI:
157
144
  speech2text_model = speech_to_text_config.model_name
158
145
  if speech_to_text_config.ai_model_api:
@@ -6,12 +6,11 @@ from typing import Dict, List, Optional
6
6
 
7
7
  from asgiref.sync import sync_to_async
8
8
  from fastapi import APIRouter, Request
9
- from fastapi.requests import Request
10
9
  from fastapi.responses import Response
11
10
  from pydantic import BaseModel
12
11
  from starlette.authentication import has_required_scope, requires
13
12
 
14
- from khoj.database.adapters import AgentAdapters, ConversationAdapters, EntryAdapters
13
+ from khoj.database.adapters import AgentAdapters, ConversationAdapters
15
14
  from khoj.database.models import Agent, Conversation, KhojUser, PriceTier
16
15
  from khoj.routers.helpers import CommonQueryParams, acheck_if_safe_prompt
17
16
  from khoj.utils.helpers import (
@@ -109,7 +109,7 @@ def post_automation(
109
109
  except Exception as e:
110
110
  logger.error(f"Error creating automation {q} for {user.email}: {e}", exc_info=True)
111
111
  return Response(
112
- content=f"Unable to create automation. Ensure the automation doesn't already exist.",
112
+ content="Unable to create automation. Ensure the automation doesn't already exist.",
113
113
  media_type="text/plain",
114
114
  status_code=500,
115
115
  )
khoj/routers/api_chat.py CHANGED
@@ -10,7 +10,6 @@ from functools import partial
10
10
  from typing import Any, Dict, List, Optional
11
11
  from urllib.parse import unquote
12
12
 
13
- from asgiref.sync import sync_to_async
14
13
  from fastapi import (
15
14
  APIRouter,
16
15
  Depends,
@@ -32,10 +31,10 @@ from khoj.database.adapters import (
32
31
  PublicConversationAdapters,
33
32
  aget_user_name,
34
33
  )
35
- from khoj.database.models import Agent, ChatMessageModel, KhojUser
34
+ from khoj.database.models import Agent, KhojUser
36
35
  from khoj.processor.conversation import prompts
37
36
  from khoj.processor.conversation.openai.utils import is_local_api
38
- from khoj.processor.conversation.prompts import help_message, no_entries_found
37
+ from khoj.processor.conversation.prompts import no_entries_found
39
38
  from khoj.processor.conversation.utils import (
40
39
  OperatorRun,
41
40
  ResponseWithThought,
@@ -65,11 +64,8 @@ from khoj.routers.helpers import (
65
64
  acreate_title_from_history,
66
65
  agenerate_chat_response,
67
66
  aget_data_sources_and_output_format,
68
- construct_automation_created_message,
69
- create_automation,
70
67
  gather_raw_query_files,
71
68
  generate_mermaidjs_diagram,
72
- generate_summary_from_files,
73
69
  get_conversation_command,
74
70
  get_message_from_queue,
75
71
  is_query_empty,
@@ -89,13 +85,11 @@ from khoj.utils.helpers import (
89
85
  convert_image_to_webp,
90
86
  get_country_code_from_timezone,
91
87
  get_country_name_from_timezone,
92
- get_device,
93
88
  is_env_var_true,
94
89
  is_none_or_empty,
95
90
  is_operator_enabled,
96
91
  )
97
92
  from khoj.utils.rawconfig import (
98
- ChatRequestBody,
99
93
  FileAttachment,
100
94
  FileFilterRequest,
101
95
  FilesFilterRequest,
@@ -689,7 +683,6 @@ async def event_generator(
689
683
  region = body.region
690
684
  country = body.country or get_country_name_from_timezone(body.timezone)
691
685
  country_code = body.country_code or get_country_code_from_timezone(body.timezone)
692
- timezone = body.timezone
693
686
  raw_images = body.images
694
687
  raw_query_files = body.files
695
688
 
@@ -853,7 +846,8 @@ async def event_generator(
853
846
  if (
854
847
  len(train_of_thought) > 0
855
848
  and train_of_thought[-1]["type"] == ChatEvent.THOUGHT.value
856
- and type(train_of_thought[-1]["data"]) == type(data) == str
849
+ and isinstance(train_of_thought[-1]["data"], str)
850
+ and isinstance(data, str)
857
851
  ):
858
852
  train_of_thought[-1]["data"] += data
859
853
  else:
@@ -1075,11 +1069,11 @@ async def event_generator(
1075
1069
 
1076
1070
  # researched_results = await extract_relevant_info(q, researched_results, agent)
1077
1071
  if state.verbose > 1:
1078
- logger.debug(f'Researched Results: {"".join(r.summarizedResult or "" for r in research_results)}')
1072
+ logger.debug(f"Researched Results: {''.join(r.summarizedResult or '' for r in research_results)}")
1079
1073
 
1080
1074
  # Gather Context
1081
1075
  ## Extract Document References
1082
- if not ConversationCommand.Research in conversation_commands:
1076
+ if ConversationCommand.Research not in conversation_commands:
1083
1077
  try:
1084
1078
  async for result in search_documents(
1085
1079
  q,
@@ -1218,7 +1212,7 @@ async def event_generator(
1218
1212
  else:
1219
1213
  code_results = result
1220
1214
  except ValueError as e:
1221
- program_execution_context.append(f"Failed to run code")
1215
+ program_execution_context.append("Failed to run code")
1222
1216
  logger.warning(
1223
1217
  f"Failed to use code tool: {e}. Attempting to respond without code results",
1224
1218
  exc_info=True,
@@ -1297,7 +1291,7 @@ async def event_generator(
1297
1291
  inferred_queries.append(improved_image_prompt)
1298
1292
  if generated_image is None or status_code != 200:
1299
1293
  program_execution_context.append(f"Failed to generate image with {improved_image_prompt}")
1300
- async for result in send_event(ChatEvent.STATUS, f"Failed to generate image"):
1294
+ async for result in send_event(ChatEvent.STATUS, "Failed to generate image"):
1301
1295
  yield result
1302
1296
  else:
1303
1297
  generated_images.append(generated_image)
@@ -1315,7 +1309,7 @@ async def event_generator(
1315
1309
  yield result
1316
1310
 
1317
1311
  if ConversationCommand.Diagram in conversation_commands:
1318
- async for result in send_event(ChatEvent.STATUS, f"Creating diagram"):
1312
+ async for result in send_event(ChatEvent.STATUS, "Creating diagram"):
1319
1313
  yield result
1320
1314
 
1321
1315
  inferred_queries = []
@@ -1372,7 +1366,7 @@ async def event_generator(
1372
1366
  return
1373
1367
 
1374
1368
  ## Generate Text Output
1375
- async for result in send_event(ChatEvent.STATUS, f"**Generating a well-informed response**"):
1369
+ async for result in send_event(ChatEvent.STATUS, "**Generating a well-informed response**"):
1376
1370
  yield result
1377
1371
 
1378
1372
  llm_response, chat_metadata = await agenerate_chat_response(
@@ -27,16 +27,7 @@ from khoj.database.adapters import (
27
27
  get_user_notion_config,
28
28
  )
29
29
  from khoj.database.models import Entry as DbEntry
30
- from khoj.database.models import (
31
- GithubConfig,
32
- GithubRepoConfig,
33
- KhojUser,
34
- LocalMarkdownConfig,
35
- LocalOrgConfig,
36
- LocalPdfConfig,
37
- LocalPlaintextConfig,
38
- NotionConfig,
39
- )
30
+ from khoj.database.models import GithubConfig, GithubRepoConfig, NotionConfig
40
31
  from khoj.processor.content.docx.docx_to_entries import DocxToEntries
41
32
  from khoj.processor.content.pdf.pdf_to_entries import PdfToEntries
42
33
  from khoj.routers.helpers import (
@@ -47,17 +38,9 @@ from khoj.routers.helpers import (
47
38
  get_user_config,
48
39
  update_telemetry_state,
49
40
  )
50
- from khoj.utils import constants, state
51
- from khoj.utils.config import SearchModels
52
- from khoj.utils.rawconfig import (
53
- ContentConfig,
54
- FullConfig,
55
- GithubContentConfig,
56
- NotionContentConfig,
57
- SearchConfig,
58
- )
41
+ from khoj.utils import state
42
+ from khoj.utils.rawconfig import GithubContentConfig, NotionContentConfig
59
43
  from khoj.utils.state import SearchType
60
- from khoj.utils.yaml import save_config_to_file_updated_state
61
44
 
62
45
  logger = logging.getLogger(__name__)
63
46
 
@@ -192,8 +175,6 @@ async def set_content_github(
192
175
  updated_config: Union[GithubContentConfig, None],
193
176
  client: Optional[str] = None,
194
177
  ):
195
- _initialize_config()
196
-
197
178
  user = request.user.object
198
179
 
199
180
  try:
@@ -225,8 +206,6 @@ async def set_content_notion(
225
206
  updated_config: Union[NotionContentConfig, None],
226
207
  client: Optional[str] = None,
227
208
  ):
228
- _initialize_config()
229
-
230
209
  user = request.user.object
231
210
 
232
211
  try:
@@ -323,10 +302,6 @@ def get_content_types(request: Request, client: Optional[str] = None):
323
302
  configured_content_types = set(EntryAdapters.get_unique_file_types(user))
324
303
  configured_content_types |= {"all"}
325
304
 
326
- if state.config and state.config.content_type:
327
- for ctype in state.config.content_type.model_dump(exclude_none=True):
328
- configured_content_types.add(ctype)
329
-
330
305
  return list(configured_content_types & all_content_types)
331
306
 
332
307
 
@@ -606,28 +581,6 @@ async def indexer(
606
581
  docx=index_files["docx"],
607
582
  )
608
583
 
609
- if state.config == None:
610
- logger.info("📬 Initializing content index on first run.")
611
- default_full_config = FullConfig(
612
- content_type=None,
613
- search_type=SearchConfig.model_validate(constants.default_config["search-type"]),
614
- processor=None,
615
- )
616
- state.config = default_full_config
617
- default_content_config = ContentConfig(
618
- org=None,
619
- markdown=None,
620
- pdf=None,
621
- docx=None,
622
- image=None,
623
- github=None,
624
- notion=None,
625
- plaintext=None,
626
- )
627
- state.config.content_type = default_content_config
628
- save_config_to_file_updated_state()
629
- configure_search(state.search_models, state.config.search_type)
630
-
631
584
  loop = asyncio.get_event_loop()
632
585
  success = await loop.run_in_executor(
633
586
  None,
@@ -674,14 +627,6 @@ async def indexer(
674
627
  return Response(content=indexed_filenames, status_code=200)
675
628
 
676
629
 
677
- def configure_search(search_models: SearchModels, search_config: Optional[SearchConfig]) -> Optional[SearchModels]:
678
- # Run Validation Checks
679
- if search_models is None:
680
- search_models = SearchModels()
681
-
682
- return search_models
683
-
684
-
685
630
  def map_config_to_object(content_source: str):
686
631
  if content_source == DbEntry.EntrySource.GITHUB:
687
632
  return GithubConfig
@@ -689,56 +634,3 @@ def map_config_to_object(content_source: str):
689
634
  return NotionConfig
690
635
  if content_source == DbEntry.EntrySource.COMPUTER:
691
636
  return "Computer"
692
-
693
-
694
- async def map_config_to_db(config: FullConfig, user: KhojUser):
695
- if config.content_type:
696
- if config.content_type.org:
697
- await LocalOrgConfig.objects.filter(user=user).adelete()
698
- await LocalOrgConfig.objects.acreate(
699
- input_files=config.content_type.org.input_files,
700
- input_filter=config.content_type.org.input_filter,
701
- index_heading_entries=config.content_type.org.index_heading_entries,
702
- user=user,
703
- )
704
- if config.content_type.markdown:
705
- await LocalMarkdownConfig.objects.filter(user=user).adelete()
706
- await LocalMarkdownConfig.objects.acreate(
707
- input_files=config.content_type.markdown.input_files,
708
- input_filter=config.content_type.markdown.input_filter,
709
- index_heading_entries=config.content_type.markdown.index_heading_entries,
710
- user=user,
711
- )
712
- if config.content_type.pdf:
713
- await LocalPdfConfig.objects.filter(user=user).adelete()
714
- await LocalPdfConfig.objects.acreate(
715
- input_files=config.content_type.pdf.input_files,
716
- input_filter=config.content_type.pdf.input_filter,
717
- index_heading_entries=config.content_type.pdf.index_heading_entries,
718
- user=user,
719
- )
720
- if config.content_type.plaintext:
721
- await LocalPlaintextConfig.objects.filter(user=user).adelete()
722
- await LocalPlaintextConfig.objects.acreate(
723
- input_files=config.content_type.plaintext.input_files,
724
- input_filter=config.content_type.plaintext.input_filter,
725
- index_heading_entries=config.content_type.plaintext.index_heading_entries,
726
- user=user,
727
- )
728
- if config.content_type.github:
729
- await adapters.set_user_github_config(
730
- user=user,
731
- pat_token=config.content_type.github.pat_token,
732
- repos=config.content_type.github.repos,
733
- )
734
- if config.content_type.notion:
735
- await adapters.set_notion_config(
736
- user=user,
737
- token=config.content_type.notion.token,
738
- )
739
-
740
-
741
- def _initialize_config():
742
- if state.config is None:
743
- state.config = FullConfig()
744
- state.config.search_type = SearchConfig.model_validate(constants.default_config["search-type"])
khoj/routers/api_model.py CHANGED
@@ -3,7 +3,6 @@ import logging
3
3
  from typing import Dict, Optional, Union
4
4
 
5
5
  from fastapi import APIRouter, Request
6
- from fastapi.requests import Request
7
6
  from fastapi.responses import Response
8
7
  from starlette.authentication import has_required_scope, requires
9
8
 
@@ -117,7 +117,7 @@ async def subscribe(request: Request):
117
117
  )
118
118
  logger.log(logging.INFO, f"🥳 New User Created: {user.user.uuid}")
119
119
 
120
- logger.info(f'Stripe subscription {event["type"]} for {customer_email}')
120
+ logger.info(f"Stripe subscription {event['type']} for {customer_email}")
121
121
  return {"success": success}
122
122
 
123
123
 
khoj/routers/email.py CHANGED
@@ -44,7 +44,7 @@ async def send_magic_link_email(email, unique_id, host):
44
44
  {
45
45
  "sender": os.environ.get("RESEND_EMAIL", "noreply@khoj.dev"),
46
46
  "to": email,
47
- "subject": f"Your login code to Khoj",
47
+ "subject": "Your login code to Khoj",
48
48
  "html": html_content,
49
49
  }
50
50
  )
@@ -98,11 +98,11 @@ async def send_query_feedback(uquery, kquery, sentiment, user_email):
98
98
  user_email=user_email if not is_none_or_empty(user_email) else "N/A",
99
99
  )
100
100
  # send feedback to fixed account
101
- r = resend.Emails.send(
101
+ resend.Emails.send(
102
102
  {
103
103
  "sender": os.environ.get("RESEND_EMAIL", "noreply@khoj.dev"),
104
104
  "to": "team@khoj.dev",
105
- "subject": f"User Feedback",
105
+ "subject": "User Feedback",
106
106
  "html": html_content,
107
107
  }
108
108
  )
@@ -127,7 +127,7 @@ def send_task_email(name, email, query, result, subject, is_image=False):
127
127
 
128
128
  r = resend.Emails.send(
129
129
  {
130
- "sender": f'Khoj <{os.environ.get("RESEND_EMAIL", "khoj@khoj.dev")}>',
130
+ "sender": f"Khoj <{os.environ.get('RESEND_EMAIL', 'khoj@khoj.dev')}>",
131
131
  "to": email,
132
132
  "subject": f"✨ {subject}",
133
133
  "html": html_content,