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.
- khoj/app/README.md +1 -1
- khoj/app/urls.py +1 -0
- khoj/configure.py +21 -54
- khoj/database/adapters/__init__.py +6 -15
- khoj/database/management/commands/delete_orphaned_fileobjects.py +0 -1
- khoj/database/migrations/0064_remove_conversation_temp_id_alter_conversation_id.py +1 -1
- khoj/database/migrations/0075_migrate_generated_assets_and_validate.py +1 -1
- khoj/database/migrations/0092_alter_chatmodel_model_type_alter_chatmodel_name_and_more.py +36 -0
- khoj/database/migrations/0093_remove_localorgconfig_user_and_more.py +36 -0
- khoj/database/models/__init__.py +10 -40
- khoj/database/tests.py +0 -2
- khoj/interface/compiled/404/index.html +2 -2
- khoj/interface/compiled/_next/static/chunks/{9245.a04e92d034540234.js → 1225.ecac11e7421504c4.js} +3 -3
- khoj/interface/compiled/_next/static/chunks/1320.ae930ad00affe685.js +5 -0
- khoj/interface/compiled/_next/static/chunks/{1327-1a9107b9a2a04a98.js → 1327-e254819a9172cfa7.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/1626.15a8acc0d6639ec6.js +1 -0
- khoj/interface/compiled/_next/static/chunks/{3489.c523fe96a2eee74f.js → 1940.d082758bd04e08ae.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{2327-ea623ca2d22f78e9.js → 2327-438aaec1657c5ada.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/2475.57a0d0fd93d07af0.js +93 -0
- khoj/interface/compiled/_next/static/chunks/2481.5ce6524ba0a73f90.js +55 -0
- khoj/interface/compiled/_next/static/chunks/297.4c4c823ff6e3255b.js +174 -0
- khoj/interface/compiled/_next/static/chunks/{5639-09e2009a2adedf8b.js → 3260-82d2521fab032ff1.js} +68 -23
- khoj/interface/compiled/_next/static/chunks/3353.1c6d553216a1acae.js +1 -0
- khoj/interface/compiled/_next/static/chunks/3855.f7b8131f78af046e.js +1 -0
- khoj/interface/compiled/_next/static/chunks/3973.dc54a39586ab48be.js +1 -0
- khoj/interface/compiled/_next/static/chunks/4241.c1cd170f7f37ac59.js +24 -0
- khoj/interface/compiled/_next/static/chunks/{4327.8d2a1b8f1ea78208.js → 4327.f3704dc398c67113.js} +19 -19
- khoj/interface/compiled/_next/static/chunks/4505.f09454a346269c3f.js +117 -0
- khoj/interface/compiled/_next/static/chunks/4801.96a152d49742b644.js +1 -0
- khoj/interface/compiled/_next/static/chunks/5427-a95ec748e52abb75.js +1 -0
- khoj/interface/compiled/_next/static/chunks/549.2bd27f59a91a9668.js +148 -0
- khoj/interface/compiled/_next/static/chunks/5765.71b1e1207b76b03f.js +1 -0
- khoj/interface/compiled/_next/static/chunks/584.d7ce3505f169b706.js +1 -0
- khoj/interface/compiled/_next/static/chunks/6240.34f7c1fa692edd61.js +24 -0
- khoj/interface/compiled/_next/static/chunks/6d3fe5a5-f9f3c16e0bc0cdf9.js +10 -0
- khoj/interface/compiled/_next/static/chunks/{7127-0f4a2a77d97fb5fa.js → 7127-97b83757db125ba6.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/7200-93ab0072359b8028.js +1 -0
- khoj/interface/compiled/_next/static/chunks/{2612.bcf5a623b3da209e.js → 7553.f5ad54b1f6e92c49.js} +2 -2
- khoj/interface/compiled/_next/static/chunks/7626-1b630f1654172341.js +1 -0
- khoj/interface/compiled/_next/static/chunks/764.dadd316e8e16d191.js +63 -0
- khoj/interface/compiled/_next/static/chunks/78.08169ab541abab4f.js +43 -0
- khoj/interface/compiled/_next/static/chunks/784.e03acf460df213d1.js +1 -0
- khoj/interface/compiled/_next/static/chunks/{9537-d9ab442ce15d1e20.js → 8072-e1440cb482a0940e.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{3265.924139c4146ee344.js → 8086.8d39887215807fcd.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/8168.f074ab8c7c16d82d.js +59 -0
- khoj/interface/compiled/_next/static/chunks/{8694.2bd9c2f65d8c5847.js → 8223.1705878fa7a09292.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/8483.94f6c9e2bee86f50.js +215 -0
- khoj/interface/compiled/_next/static/chunks/{8888.ebe0e552b59e7fed.js → 8810.fc0e479de78c7c61.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/8828.bc74dc4ce94e78f6.js +1 -0
- khoj/interface/compiled/_next/static/chunks/{7303.d0612f812a967a08.js → 8909.14ac3f43d0070cf1.js} +5 -5
- khoj/interface/compiled/_next/static/chunks/90542734.b1a1629065ba199b.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9167.098534184f03fe92.js +56 -0
- khoj/interface/compiled/_next/static/chunks/{4980.63500d68b3bb1222.js → 9537.e934ce37bf314509.js} +5 -5
- khoj/interface/compiled/_next/static/chunks/9574.3fe8e26e95bf1c34.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9599.ec50b5296c27dae9.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9643.b34248df52ffc77c.js +262 -0
- khoj/interface/compiled/_next/static/chunks/9747.2fd9065b1435abb1.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9922.98f2b2a9959b4ebe.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e49165209d2e406c.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/page-e291b49977f43880.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/automations/page-198b26df6e09bbb0.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/chat/{page-8e1c4f2af3c9429e.js → page-dfcc1e8e2ad62873.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/{page-2b3056cba8aa96ce.js → page-1567cac7b79a7c59.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/settings/{page-8be3b35178abf2ec.js → page-6081362437c82470.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-6fb51c5c80f8ec67.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-4a4b0c0f4749c2b2.js → page-e0dcb1762f8c8f88.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/webpack-5393aad3d824e0cb.js +1 -0
- khoj/interface/compiled/agents/index.html +2 -2
- khoj/interface/compiled/agents/index.txt +3 -3
- khoj/interface/compiled/automations/index.html +2 -2
- khoj/interface/compiled/automations/index.txt +3 -3
- khoj/interface/compiled/chat/index.html +2 -2
- khoj/interface/compiled/chat/index.txt +3 -3
- khoj/interface/compiled/index.html +2 -2
- khoj/interface/compiled/index.txt +3 -3
- khoj/interface/compiled/search/index.html +2 -2
- khoj/interface/compiled/search/index.txt +3 -3
- khoj/interface/compiled/settings/index.html +2 -2
- khoj/interface/compiled/settings/index.txt +3 -3
- khoj/interface/compiled/share/chat/index.html +2 -2
- khoj/interface/compiled/share/chat/index.txt +3 -3
- khoj/main.py +7 -9
- khoj/manage.py +1 -0
- khoj/processor/content/github/github_to_entries.py +6 -7
- khoj/processor/content/images/image_to_entries.py +0 -1
- khoj/processor/content/markdown/markdown_to_entries.py +2 -3
- khoj/processor/content/notion/notion_to_entries.py +5 -6
- khoj/processor/content/org_mode/org_to_entries.py +4 -5
- khoj/processor/content/org_mode/orgnode.py +4 -4
- khoj/processor/content/plaintext/plaintext_to_entries.py +1 -2
- khoj/processor/content/text_to_entries.py +1 -3
- khoj/processor/conversation/google/utils.py +3 -3
- khoj/processor/conversation/openai/gpt.py +65 -28
- khoj/processor/conversation/openai/utils.py +359 -28
- khoj/processor/conversation/prompts.py +16 -41
- khoj/processor/conversation/utils.py +29 -39
- khoj/processor/embeddings.py +0 -2
- khoj/processor/image/generate.py +3 -3
- khoj/processor/operator/__init__.py +2 -3
- khoj/processor/operator/grounding_agent.py +15 -2
- khoj/processor/operator/grounding_agent_uitars.py +34 -23
- khoj/processor/operator/operator_agent_anthropic.py +29 -4
- khoj/processor/operator/operator_agent_base.py +1 -1
- khoj/processor/operator/operator_agent_binary.py +4 -4
- khoj/processor/operator/operator_agent_openai.py +21 -6
- khoj/processor/operator/operator_environment_browser.py +1 -1
- khoj/processor/operator/operator_environment_computer.py +1 -1
- khoj/processor/speech/text_to_speech.py +0 -1
- khoj/processor/tools/online_search.py +1 -1
- khoj/processor/tools/run_code.py +1 -1
- khoj/routers/api.py +2 -15
- khoj/routers/api_agents.py +1 -2
- khoj/routers/api_automation.py +1 -1
- khoj/routers/api_chat.py +10 -16
- khoj/routers/api_content.py +3 -111
- khoj/routers/api_model.py +0 -1
- khoj/routers/api_subscription.py +1 -1
- khoj/routers/email.py +4 -4
- khoj/routers/helpers.py +44 -103
- khoj/routers/research.py +8 -8
- khoj/search_filter/base_filter.py +2 -4
- khoj/search_type/text_search.py +1 -2
- khoj/utils/cli.py +5 -53
- khoj/utils/config.py +0 -65
- khoj/utils/constants.py +6 -7
- khoj/utils/helpers.py +10 -18
- khoj/utils/initialization.py +7 -48
- khoj/utils/models.py +2 -4
- khoj/utils/rawconfig.py +1 -69
- khoj/utils/state.py +2 -8
- khoj/utils/yaml.py +0 -39
- {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/METADATA +3 -3
- {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/RECORD +139 -148
- khoj/interface/compiled/_next/static/chunks/1191.b547ec13349b4aed.js +0 -1
- khoj/interface/compiled/_next/static/chunks/1588.f0558a0bdffc4761.js +0 -117
- khoj/interface/compiled/_next/static/chunks/1918.925cb4a35518d258.js +0 -43
- khoj/interface/compiled/_next/static/chunks/2849.dc00ae5ba7219cfc.js +0 -1
- khoj/interface/compiled/_next/static/chunks/303.fe76de943e930fbd.js +0 -1
- khoj/interface/compiled/_next/static/chunks/4533.586e74b45a2bde25.js +0 -55
- khoj/interface/compiled/_next/static/chunks/4551.82ce1476b5516bc2.js +0 -5
- khoj/interface/compiled/_next/static/chunks/4748.0edd37cba3ea2809.js +0 -59
- khoj/interface/compiled/_next/static/chunks/5210.cd35a1c1ec594a20.js +0 -93
- khoj/interface/compiled/_next/static/chunks/5329.f8b3c5b3d16159cd.js +0 -1
- khoj/interface/compiled/_next/static/chunks/5427-13d6ffd380fdfab7.js +0 -1
- khoj/interface/compiled/_next/static/chunks/558-c14e76cff03f6a60.js +0 -1
- khoj/interface/compiled/_next/static/chunks/5830.8876eccb82da9b7d.js +0 -262
- khoj/interface/compiled/_next/static/chunks/6230.88a71d8145347b3f.js +0 -1
- khoj/interface/compiled/_next/static/chunks/7161.77e0530a40ad5ca8.js +0 -1
- khoj/interface/compiled/_next/static/chunks/7200-ac3b2e37ff30e126.js +0 -1
- khoj/interface/compiled/_next/static/chunks/7505.c31027a3695bdebb.js +0 -148
- khoj/interface/compiled/_next/static/chunks/7760.35649cc21d9585bd.js +0 -56
- khoj/interface/compiled/_next/static/chunks/83.48e2db193a940052.js +0 -1
- khoj/interface/compiled/_next/static/chunks/8427.844694e06133fb51.js +0 -1
- khoj/interface/compiled/_next/static/chunks/8665.4db7e6b2e8933497.js +0 -174
- khoj/interface/compiled/_next/static/chunks/872.caf84cc1a39ae59f.js +0 -1
- khoj/interface/compiled/_next/static/chunks/8890.6e8a59e4de6978bc.js +0 -215
- khoj/interface/compiled/_next/static/chunks/8950.5f2272e0ac923f9e.js +0 -1
- khoj/interface/compiled/_next/static/chunks/90542734.2c21f16f18b22411.js +0 -1
- khoj/interface/compiled/_next/static/chunks/9202.c703864fcedc8d1f.js +0 -63
- khoj/interface/compiled/_next/static/chunks/9320.6aca4885d541aa44.js +0 -24
- khoj/interface/compiled/_next/static/chunks/9535.f78cd92d03331e55.js +0 -1
- khoj/interface/compiled/_next/static/chunks/9968.b111fc002796da81.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/agents/page-9a4610474cd59a71.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/automations/page-f7bb9d777b7745d4.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js +0 -1
- khoj/interface/compiled/_next/static/chunks/f3e3247b-1758d4651e4457c2.js +0 -10
- khoj/interface/compiled/_next/static/chunks/webpack-338a5000c912cc94.js +0 -1
- khoj/migrations/__init__.py +0 -0
- khoj/migrations/migrate_offline_chat_default_model.py +0 -69
- khoj/migrations/migrate_offline_chat_default_model_2.py +0 -71
- khoj/migrations/migrate_offline_chat_schema.py +0 -83
- khoj/migrations/migrate_offline_model.py +0 -29
- khoj/migrations/migrate_processor_config_openai.py +0 -67
- khoj/migrations/migrate_server_pg.py +0 -132
- khoj/migrations/migrate_version.py +0 -17
- khoj/processor/conversation/offline/__init__.py +0 -0
- khoj/processor/conversation/offline/chat_model.py +0 -224
- khoj/processor/conversation/offline/utils.py +0 -80
- khoj/processor/conversation/offline/whisper.py +0 -15
- khoj/utils/fs_syncer.py +0 -252
- /khoj/interface/compiled/_next/static/{7GoMcE8WpP9fbfYZXv4Nv → RYbQvo3AvgOR0bEVVfxF4}/_buildManifest.js +0 -0
- /khoj/interface/compiled/_next/static/{7GoMcE8WpP9fbfYZXv4Nv → RYbQvo3AvgOR0bEVVfxF4}/_ssgManifest.js +0 -0
- /khoj/interface/compiled/_next/static/chunks/app/search/{page-4885df3cd175c957.js → page-3639e50ec3e9acfd.js} +0 -0
- {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/WHEEL +0 -0
- {khoj-2.0.0b12.dev5.dist-info → khoj-2.0.0b13.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
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:
|
khoj/routers/api_agents.py
CHANGED
@@ -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
|
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 (
|
khoj/routers/api_automation.py
CHANGED
@@ -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=
|
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,
|
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
|
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
|
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
|
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
|
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(
|
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,
|
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,
|
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,
|
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(
|
khoj/routers/api_content.py
CHANGED
@@ -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
|
51
|
-
from khoj.utils.
|
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
khoj/routers/api_subscription.py
CHANGED
@@ -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
|
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":
|
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
|
-
|
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":
|
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
|
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,
|