khoj 1.29.2.dev11__py3-none-any.whl → 1.29.2.dev35__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/database/adapters/__init__.py +2 -0
- khoj/database/admin.py +32 -1
- khoj/interface/compiled/404/index.html +1 -1
- khoj/interface/compiled/_next/static/chunks/5538-b87b60ecc0c27ceb.js +1 -0
- khoj/interface/compiled/_next/static/chunks/796-68f9e87f9cdfda1d.js +3 -0
- khoj/interface/compiled/_next/static/chunks/8423-c0123d454681e03a.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/chat/{page-e95e87da53d725a7.js → page-e60a55d029b6216a.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-3a752baa5fb62e20.js → page-4a4c0f199b89bd80.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{webpack-333038bdf3041c6f.js → webpack-323bbe2678102a2f.js} +1 -1
- khoj/interface/compiled/agents/index.html +1 -1
- khoj/interface/compiled/agents/index.txt +1 -1
- khoj/interface/compiled/automations/index.html +1 -1
- khoj/interface/compiled/automations/index.txt +1 -1
- khoj/interface/compiled/chat/index.html +1 -1
- khoj/interface/compiled/chat/index.txt +2 -2
- khoj/interface/compiled/index.html +1 -1
- khoj/interface/compiled/index.txt +2 -2
- khoj/interface/compiled/search/index.html +1 -1
- khoj/interface/compiled/search/index.txt +1 -1
- khoj/interface/compiled/settings/index.html +1 -1
- khoj/interface/compiled/settings/index.txt +1 -1
- khoj/interface/compiled/share/chat/index.html +1 -1
- khoj/interface/compiled/share/chat/index.txt +2 -2
- khoj/processor/content/pdf/pdf_to_entries.py +1 -1
- khoj/processor/conversation/prompts.py +14 -69
- khoj/processor/tools/online_search.py +22 -4
- khoj/routers/api_chat.py +23 -15
- khoj/routers/helpers.py +36 -77
- khoj/utils/constants.py +1 -1
- khoj/utils/helpers.py +5 -6
- khoj/utils/initialization.py +77 -10
- {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/METADATA +1 -1
- {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/RECORD +38 -39
- khoj/interface/compiled/_next/static/chunks/5538-32bd787d106700dc.js +0 -1
- khoj/interface/compiled/_next/static/chunks/5961-3c104d9736b7902b.js +0 -3
- khoj/interface/compiled/_next/static/chunks/8423-ffdc2b835629c7f8.js +0 -1
- khoj/interface/web/assets/icons/favicon-128x128.ico +0 -0
- /khoj/interface/compiled/_next/static/{5mAH5bo-h_J4eyL7tXj2i → bkshWraYdEa_w254xnxBc}/_buildManifest.js +0 -0
- /khoj/interface/compiled/_next/static/{5mAH5bo-h_J4eyL7tXj2i → bkshWraYdEa_w254xnxBc}/_ssgManifest.js +0 -0
- {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/WHEEL +0 -0
- {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/entry_points.txt +0 -0
- {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/licenses/LICENSE +0 -0
khoj/routers/helpers.py
CHANGED
@@ -336,7 +336,7 @@ async def acheck_if_safe_prompt(system_prompt: str, user: KhojUser = None, lax:
|
|
336
336
|
return is_safe, reason
|
337
337
|
|
338
338
|
|
339
|
-
async def
|
339
|
+
async def aget_relevant_tools_to_execute(
|
340
340
|
query: str,
|
341
341
|
conversation_history: dict,
|
342
342
|
is_task: bool,
|
@@ -360,6 +360,19 @@ async def aget_relevant_information_sources(
|
|
360
360
|
if len(agent_tools) == 0 or tool.value in agent_tools:
|
361
361
|
tool_options_str += f'- "{tool.value}": "{description}"\n'
|
362
362
|
|
363
|
+
mode_options = dict()
|
364
|
+
mode_options_str = ""
|
365
|
+
|
366
|
+
output_modes = agent.output_modes if agent else []
|
367
|
+
|
368
|
+
for mode, description in mode_descriptions_for_llm.items():
|
369
|
+
# Do not allow tasks to schedule another task
|
370
|
+
if is_task and mode == ConversationCommand.Automation:
|
371
|
+
continue
|
372
|
+
mode_options[mode.value] = description
|
373
|
+
if len(output_modes) == 0 or mode.value in output_modes:
|
374
|
+
mode_options_str += f'- "{mode.value}": "{description}"\n'
|
375
|
+
|
363
376
|
chat_history = construct_chat_history(conversation_history)
|
364
377
|
|
365
378
|
if query_images:
|
@@ -369,9 +382,10 @@ async def aget_relevant_information_sources(
|
|
369
382
|
prompts.personality_context.format(personality=agent.personality) if agent and agent.personality else ""
|
370
383
|
)
|
371
384
|
|
372
|
-
relevant_tools_prompt = prompts.
|
385
|
+
relevant_tools_prompt = prompts.pick_relevant_tools.format(
|
373
386
|
query=query,
|
374
387
|
tools=tool_options_str,
|
388
|
+
outputs=mode_options_str,
|
375
389
|
chat_history=chat_history,
|
376
390
|
personality_context=personality_context,
|
377
391
|
)
|
@@ -388,13 +402,18 @@ async def aget_relevant_information_sources(
|
|
388
402
|
try:
|
389
403
|
response = clean_json(response)
|
390
404
|
response = json.loads(response)
|
391
|
-
|
392
|
-
if not isinstance(
|
393
|
-
logger.error(f"Invalid response for determining relevant tools: {
|
405
|
+
input_tools = [q.strip() for q in response["source"] if q.strip()]
|
406
|
+
if not isinstance(input_tools, list) or not input_tools or len(input_tools) == 0:
|
407
|
+
logger.error(f"Invalid response for determining relevant tools: {input_tools}")
|
394
408
|
return tool_options
|
395
409
|
|
410
|
+
output_modes = [q.strip() for q in response["output"] if q.strip()]
|
411
|
+
if not isinstance(output_modes, list) or not output_modes or len(output_modes) == 0:
|
412
|
+
logger.error(f"Invalid response for determining relevant output modes: {output_modes}")
|
413
|
+
return mode_options
|
414
|
+
|
396
415
|
final_response = [] if not is_task else [ConversationCommand.AutomatedTask]
|
397
|
-
for llm_suggested_tool in
|
416
|
+
for llm_suggested_tool in input_tools:
|
398
417
|
# Add a double check to verify it's in the agent list, because the LLM sometimes gets confused by the tool options.
|
399
418
|
if llm_suggested_tool in tool_options.keys() and (
|
400
419
|
len(agent_tools) == 0 or llm_suggested_tool in agent_tools
|
@@ -402,88 +421,28 @@ async def aget_relevant_information_sources(
|
|
402
421
|
# Check whether the tool exists as a valid ConversationCommand
|
403
422
|
final_response.append(ConversationCommand(llm_suggested_tool))
|
404
423
|
|
424
|
+
for llm_suggested_output in output_modes:
|
425
|
+
# Add a double check to verify it's in the agent list, because the LLM sometimes gets confused by the tool options.
|
426
|
+
if llm_suggested_output in mode_options.keys() and (
|
427
|
+
len(output_modes) == 0 or llm_suggested_output in output_modes
|
428
|
+
):
|
429
|
+
# Check whether the tool exists as a valid ConversationCommand
|
430
|
+
final_response.append(ConversationCommand(llm_suggested_output))
|
431
|
+
|
405
432
|
if is_none_or_empty(final_response):
|
406
433
|
if len(agent_tools) == 0:
|
407
|
-
final_response = [ConversationCommand.Default]
|
434
|
+
final_response = [ConversationCommand.Default, ConversationCommand.Text]
|
408
435
|
else:
|
409
|
-
final_response = [ConversationCommand.General]
|
436
|
+
final_response = [ConversationCommand.General, ConversationCommand.Text]
|
410
437
|
except Exception:
|
411
438
|
logger.error(f"Invalid response for determining relevant tools: {response}")
|
412
439
|
if len(agent_tools) == 0:
|
413
|
-
final_response = [ConversationCommand.Default]
|
440
|
+
final_response = [ConversationCommand.Default, ConversationCommand.Text]
|
414
441
|
else:
|
415
442
|
final_response = agent_tools
|
416
443
|
return final_response
|
417
444
|
|
418
445
|
|
419
|
-
async def aget_relevant_output_modes(
|
420
|
-
query: str,
|
421
|
-
conversation_history: dict,
|
422
|
-
is_task: bool = False,
|
423
|
-
user: KhojUser = None,
|
424
|
-
query_images: List[str] = None,
|
425
|
-
agent: Agent = None,
|
426
|
-
tracer: dict = {},
|
427
|
-
):
|
428
|
-
"""
|
429
|
-
Given a query, determine which of the available tools the agent should use in order to answer appropriately.
|
430
|
-
"""
|
431
|
-
|
432
|
-
mode_options = dict()
|
433
|
-
mode_options_str = ""
|
434
|
-
|
435
|
-
output_modes = agent.output_modes if agent else []
|
436
|
-
|
437
|
-
for mode, description in mode_descriptions_for_llm.items():
|
438
|
-
# Do not allow tasks to schedule another task
|
439
|
-
if is_task and mode == ConversationCommand.Automation:
|
440
|
-
continue
|
441
|
-
mode_options[mode.value] = description
|
442
|
-
if len(output_modes) == 0 or mode.value in output_modes:
|
443
|
-
mode_options_str += f'- "{mode.value}": "{description}"\n'
|
444
|
-
|
445
|
-
chat_history = construct_chat_history(conversation_history)
|
446
|
-
|
447
|
-
if query_images:
|
448
|
-
query = f"[placeholder for {len(query_images)} user attached images]\n{query}"
|
449
|
-
|
450
|
-
personality_context = (
|
451
|
-
prompts.personality_context.format(personality=agent.personality) if agent and agent.personality else ""
|
452
|
-
)
|
453
|
-
|
454
|
-
relevant_mode_prompt = prompts.pick_relevant_output_mode.format(
|
455
|
-
query=query,
|
456
|
-
modes=mode_options_str,
|
457
|
-
chat_history=chat_history,
|
458
|
-
personality_context=personality_context,
|
459
|
-
)
|
460
|
-
|
461
|
-
with timer("Chat actor: Infer output mode for chat response", logger):
|
462
|
-
response = await send_message_to_model_wrapper(
|
463
|
-
relevant_mode_prompt, response_type="json_object", user=user, tracer=tracer
|
464
|
-
)
|
465
|
-
|
466
|
-
try:
|
467
|
-
response = clean_json(response)
|
468
|
-
response = json.loads(response)
|
469
|
-
|
470
|
-
if is_none_or_empty(response):
|
471
|
-
return ConversationCommand.Text
|
472
|
-
|
473
|
-
output_mode = response["output"]
|
474
|
-
|
475
|
-
# Add a double check to verify it's in the agent list, because the LLM sometimes gets confused by the tool options.
|
476
|
-
if output_mode in mode_options.keys() and (len(output_modes) == 0 or output_mode in output_modes):
|
477
|
-
# Check whether the tool exists as a valid ConversationCommand
|
478
|
-
return ConversationCommand(output_mode)
|
479
|
-
|
480
|
-
logger.error(f"Invalid output mode selected: {output_mode}. Defaulting to text.")
|
481
|
-
return ConversationCommand.Text
|
482
|
-
except Exception:
|
483
|
-
logger.error(f"Invalid response for determining output mode: {response}")
|
484
|
-
return ConversationCommand.Text
|
485
|
-
|
486
|
-
|
487
446
|
async def infer_webpage_urls(
|
488
447
|
q: str,
|
489
448
|
conversation_history: dict,
|
khoj/utils/constants.py
CHANGED
@@ -16,7 +16,7 @@ default_offline_chat_models = [
|
|
16
16
|
]
|
17
17
|
default_openai_chat_models = ["gpt-4o-mini", "gpt-4o"]
|
18
18
|
default_gemini_chat_models = ["gemini-1.5-flash", "gemini-1.5-pro"]
|
19
|
-
default_anthropic_chat_models = ["claude-3-5-sonnet-
|
19
|
+
default_anthropic_chat_models = ["claude-3-5-sonnet-20241022", "claude-3-5-haiku-20241022"]
|
20
20
|
|
21
21
|
empty_config = {
|
22
22
|
"search-type": {
|
khoj/utils/helpers.py
CHANGED
@@ -365,7 +365,7 @@ tool_descriptions_for_llm = {
|
|
365
365
|
ConversationCommand.Notes: "To search the user's personal knowledge base. Especially helpful if the question expects context from the user's notes or documents.",
|
366
366
|
ConversationCommand.Online: "To search for the latest, up-to-date information from the internet. Note: **Questions about Khoj should always use this data source**",
|
367
367
|
ConversationCommand.Webpage: "To use if the user has directly provided the webpage urls or you are certain of the webpage urls to read.",
|
368
|
-
ConversationCommand.Code: "To run Python code in a Pyodide sandbox with no network access. Helpful when need to parse information, run complex calculations, create documents and charts
|
368
|
+
ConversationCommand.Code: "To run Python code in a Pyodide sandbox with no network access. Helpful when need to parse information, run complex calculations, create plaintext documents, and create charts with quantitative data. Matplotlib, bs4, pandas, numpy, etc. are available.",
|
369
369
|
ConversationCommand.Summarize: "To retrieve an answer that depends on the entire document or a large text.",
|
370
370
|
}
|
371
371
|
|
@@ -373,14 +373,13 @@ function_calling_description_for_llm = {
|
|
373
373
|
ConversationCommand.Notes: "To search the user's personal knowledge base. Especially helpful if the question expects context from the user's notes or documents.",
|
374
374
|
ConversationCommand.Online: "To search the internet for information. Useful to get a quick, broad overview from the internet. Provide all relevant context to ensure new searches, not in previous iterations, are performed.",
|
375
375
|
ConversationCommand.Webpage: "To extract information from webpages. Useful for more detailed research from the internet. Usually used when you know the webpage links to refer to. Share the webpage links and information to extract in your query.",
|
376
|
-
ConversationCommand.Code: "To run Python code in a Pyodide sandbox with no network access. Helpful when need to parse information, run complex calculations, create charts
|
376
|
+
ConversationCommand.Code: "To run Python code in a Pyodide sandbox with no network access. Helpful when need to parse information, run complex calculations, create plaintext documents, and create charts with quantitative data. Matplotlib, bs4, pandas, numpy, etc. are available.",
|
377
377
|
}
|
378
378
|
|
379
379
|
mode_descriptions_for_llm = {
|
380
|
-
ConversationCommand.Image: "Use this if you are confident the user is requesting you to create a new picture based on their description. This
|
381
|
-
ConversationCommand.
|
382
|
-
ConversationCommand.
|
383
|
-
ConversationCommand.Diagram: "Use this if the user is requesting a diagram or visual representation that requires primitives like lines, rectangles, and text.",
|
380
|
+
ConversationCommand.Image: "Use this if you are confident the user is requesting you to create a new picture based on their description. This DOES NOT support generating charts or graphs. It is for creative images.",
|
381
|
+
ConversationCommand.Text: "Use this if a normal text response would be sufficient for accurately responding to the query or you don't feel strongly about the other modes.",
|
382
|
+
ConversationCommand.Diagram: "Use this if the user is requesting a diagram or visual representation that requires primitives like lines, rectangles, and text. This does not work for charts, graphs, or quantitative data. It is for mind mapping, flowcharts, etc.",
|
384
383
|
}
|
385
384
|
|
386
385
|
mode_descriptions_for_agent = {
|
khoj/utils/initialization.py
CHANGED
@@ -2,12 +2,13 @@ import logging
|
|
2
2
|
import os
|
3
3
|
from typing import Tuple
|
4
4
|
|
5
|
+
import openai
|
6
|
+
|
5
7
|
from khoj.database.adapters import ConversationAdapters
|
6
8
|
from khoj.database.models import (
|
7
9
|
ChatModelOptions,
|
8
10
|
KhojUser,
|
9
11
|
OpenAIProcessorConversationConfig,
|
10
|
-
ServerChatSettings,
|
11
12
|
SpeechToTextModelOptions,
|
12
13
|
TextToImageModelConfig,
|
13
14
|
)
|
@@ -42,14 +43,32 @@ def initialization(interactive: bool = True):
|
|
42
43
|
"🗣️ Configure chat models available to your server. You can always update these at /server/admin using your admin account"
|
43
44
|
)
|
44
45
|
|
46
|
+
openai_api_base = os.getenv("OPENAI_API_BASE")
|
47
|
+
provider = "Ollama" if openai_api_base and openai_api_base.endswith(":11434/v1/") else "OpenAI"
|
48
|
+
openai_api_key = os.getenv("OPENAI_API_KEY", "placeholder" if openai_api_base else None)
|
49
|
+
default_chat_models = default_openai_chat_models
|
50
|
+
if openai_api_base:
|
51
|
+
# Get available chat models from OpenAI compatible API
|
52
|
+
try:
|
53
|
+
openai_client = openai.OpenAI(api_key=openai_api_key, base_url=openai_api_base)
|
54
|
+
default_chat_models = [model.id for model in openai_client.models.list()]
|
55
|
+
# Put the available default OpenAI models at the top
|
56
|
+
valid_default_models = [model for model in default_openai_chat_models if model in default_chat_models]
|
57
|
+
other_available_models = [model for model in default_chat_models if model not in valid_default_models]
|
58
|
+
default_chat_models = valid_default_models + other_available_models
|
59
|
+
except Exception:
|
60
|
+
logger.warning(f"⚠️ Failed to fetch {provider} chat models. Fallback to default models. Error: {e}")
|
61
|
+
|
45
62
|
# Set up OpenAI's online chat models
|
46
63
|
openai_configured, openai_provider = _setup_chat_model_provider(
|
47
64
|
ChatModelOptions.ModelType.OPENAI,
|
48
|
-
|
49
|
-
default_api_key=
|
65
|
+
default_chat_models,
|
66
|
+
default_api_key=openai_api_key,
|
67
|
+
api_base_url=openai_api_base,
|
50
68
|
vision_enabled=True,
|
51
69
|
is_offline=False,
|
52
70
|
interactive=interactive,
|
71
|
+
provider_name=provider,
|
53
72
|
)
|
54
73
|
|
55
74
|
# Setup OpenAI speech to text model
|
@@ -87,7 +106,7 @@ def initialization(interactive: bool = True):
|
|
87
106
|
ChatModelOptions.ModelType.GOOGLE,
|
88
107
|
default_gemini_chat_models,
|
89
108
|
default_api_key=os.getenv("GEMINI_API_KEY"),
|
90
|
-
vision_enabled=
|
109
|
+
vision_enabled=True,
|
91
110
|
is_offline=False,
|
92
111
|
interactive=interactive,
|
93
112
|
provider_name="Google Gemini",
|
@@ -98,7 +117,7 @@ def initialization(interactive: bool = True):
|
|
98
117
|
ChatModelOptions.ModelType.ANTHROPIC,
|
99
118
|
default_anthropic_chat_models,
|
100
119
|
default_api_key=os.getenv("ANTHROPIC_API_KEY"),
|
101
|
-
vision_enabled=
|
120
|
+
vision_enabled=True,
|
102
121
|
is_offline=False,
|
103
122
|
interactive=interactive,
|
104
123
|
)
|
@@ -154,11 +173,14 @@ def initialization(interactive: bool = True):
|
|
154
173
|
default_chat_models: list,
|
155
174
|
default_api_key: str,
|
156
175
|
interactive: bool,
|
176
|
+
api_base_url: str = None,
|
157
177
|
vision_enabled: bool = False,
|
158
178
|
is_offline: bool = False,
|
159
179
|
provider_name: str = None,
|
160
180
|
) -> Tuple[bool, OpenAIProcessorConversationConfig]:
|
161
|
-
supported_vision_models =
|
181
|
+
supported_vision_models = (
|
182
|
+
default_openai_chat_models + default_anthropic_chat_models + default_gemini_chat_models
|
183
|
+
)
|
162
184
|
provider_name = provider_name or model_type.name.capitalize()
|
163
185
|
default_use_model = {True: "y", False: "n"}[default_api_key is not None or is_offline]
|
164
186
|
use_model_provider = (
|
@@ -170,14 +192,16 @@ def initialization(interactive: bool = True):
|
|
170
192
|
|
171
193
|
logger.info(f"️💬 Setting up your {provider_name} chat configuration")
|
172
194
|
|
173
|
-
|
195
|
+
chat_provider = None
|
174
196
|
if not is_offline:
|
175
197
|
if interactive:
|
176
198
|
user_api_key = input(f"Enter your {provider_name} API key (default: {default_api_key}): ")
|
177
199
|
api_key = user_api_key if user_api_key != "" else default_api_key
|
178
200
|
else:
|
179
201
|
api_key = default_api_key
|
180
|
-
|
202
|
+
chat_provider = OpenAIProcessorConversationConfig.objects.create(
|
203
|
+
api_key=api_key, name=provider_name, api_base_url=api_base_url
|
204
|
+
)
|
181
205
|
|
182
206
|
if interactive:
|
183
207
|
chat_model_names = input(
|
@@ -199,13 +223,53 @@ def initialization(interactive: bool = True):
|
|
199
223
|
"max_prompt_size": default_max_tokens,
|
200
224
|
"vision_enabled": vision_enabled,
|
201
225
|
"tokenizer": default_tokenizer,
|
202
|
-
"openai_config":
|
226
|
+
"openai_config": chat_provider,
|
203
227
|
}
|
204
228
|
|
205
229
|
ChatModelOptions.objects.create(**chat_model_options)
|
206
230
|
|
207
231
|
logger.info(f"🗣️ {provider_name} chat model configuration complete")
|
208
|
-
return True,
|
232
|
+
return True, chat_provider
|
233
|
+
|
234
|
+
def _update_chat_model_options():
|
235
|
+
"""Update available chat models for OpenAI-compatible APIs"""
|
236
|
+
try:
|
237
|
+
# Get OpenAI configs with custom base URLs
|
238
|
+
custom_configs = OpenAIProcessorConversationConfig.objects.exclude(api_base_url__isnull=True)
|
239
|
+
|
240
|
+
for config in custom_configs:
|
241
|
+
try:
|
242
|
+
# Create OpenAI client with custom base URL
|
243
|
+
openai_client = openai.OpenAI(api_key=config.api_key, base_url=config.api_base_url)
|
244
|
+
|
245
|
+
# Get available models
|
246
|
+
available_models = [model.id for model in openai_client.models.list()]
|
247
|
+
|
248
|
+
# Get existing chat model options for this config
|
249
|
+
existing_models = ChatModelOptions.objects.filter(
|
250
|
+
openai_config=config, model_type=ChatModelOptions.ModelType.OPENAI
|
251
|
+
)
|
252
|
+
|
253
|
+
# Add new models
|
254
|
+
for model in available_models:
|
255
|
+
if not existing_models.filter(chat_model=model).exists():
|
256
|
+
ChatModelOptions.objects.create(
|
257
|
+
chat_model=model,
|
258
|
+
model_type=ChatModelOptions.ModelType.OPENAI,
|
259
|
+
max_prompt_size=model_to_prompt_size.get(model),
|
260
|
+
vision_enabled=model in default_openai_chat_models,
|
261
|
+
tokenizer=model_to_tokenizer.get(model),
|
262
|
+
openai_config=config,
|
263
|
+
)
|
264
|
+
|
265
|
+
# Remove models that are no longer available
|
266
|
+
existing_models.exclude(chat_model__in=available_models).delete()
|
267
|
+
|
268
|
+
except Exception as e:
|
269
|
+
logger.warning(f"Failed to update models for {config.name}: {str(e)}")
|
270
|
+
|
271
|
+
except Exception as e:
|
272
|
+
logger.error(f"Failed to update chat model options: {str(e)}")
|
209
273
|
|
210
274
|
admin_user = KhojUser.objects.filter(is_staff=True).first()
|
211
275
|
if admin_user is None:
|
@@ -228,3 +292,6 @@ def initialization(interactive: bool = True):
|
|
228
292
|
return
|
229
293
|
except Exception as e:
|
230
294
|
logger.error(f"🚨 Failed to create chat configuration: {e}", exc_info=True)
|
295
|
+
else:
|
296
|
+
_update_chat_model_options()
|
297
|
+
logger.info("🗣️ Chat model configuration updated")
|
@@ -8,10 +8,10 @@ khoj/app/asgi.py,sha256=soh3C1xazlgHt_bDgKzrfzo2TKXbNYJsckcXNEgTip8,388
|
|
8
8
|
khoj/app/settings.py,sha256=M6sQUu_AdeKl3eruecBaifRBhYOBIait0KA2NPizcBM,6198
|
9
9
|
khoj/app/urls.py,sha256=7ECnusoAPAfbO_H_b5FUzYGvnb4LLdWaRDyKNvYuBvg,869
|
10
10
|
khoj/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
khoj/database/admin.py,sha256=
|
11
|
+
khoj/database/admin.py,sha256=9xVVQ91gjLW4_ZpN1Ojp6zHynZBjMpJ_F_mEd1eyDA0,10718
|
12
12
|
khoj/database/apps.py,sha256=pM4tkX5Odw4YW_hLLKK8Nd5kqGddf1en0oMCea44RZw,153
|
13
13
|
khoj/database/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
|
14
|
-
khoj/database/adapters/__init__.py,sha256=
|
14
|
+
khoj/database/adapters/__init__.py,sha256=KxGzqtDpbDPJdy-CZFXOM7sLqogzJXYyp_NDHgXttEg,69084
|
15
15
|
khoj/database/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
16
|
khoj/database/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
17
|
khoj/database/management/commands/change_default_model.py,sha256=HkFQOI-2rFjlu7YiulyRcTrITzSzXmY4WiV2hBmml0w,5209
|
@@ -111,17 +111,17 @@ khoj/interface/compiled/chat.svg,sha256=l2JoYRRgk201adTTdvJ-buKUrc0WGfsudix5xEvt
|
|
111
111
|
khoj/interface/compiled/close.svg,sha256=hQ2iFLkNzHk0_iyTrSbwnWAeXYlgA-c2Eof2Iqh76n4,417
|
112
112
|
khoj/interface/compiled/copy-button-success.svg,sha256=byqWAYD3Pn9IOXRjOKudJ-TJbP2UESbQGvtLWazNGjY,829
|
113
113
|
khoj/interface/compiled/copy-button.svg,sha256=05bKM2eRxksfBlAPT7yMaoNJEk85bZCxQg67EVrPeHo,669
|
114
|
-
khoj/interface/compiled/index.html,sha256=
|
115
|
-
khoj/interface/compiled/index.txt,sha256=
|
114
|
+
khoj/interface/compiled/index.html,sha256=FlkSzHS4YzCfVBCqIZb8kdcxeM7KeUSqEsM83QI6nnM,12156
|
115
|
+
khoj/interface/compiled/index.txt,sha256=ZVvdwuK24IVFgC0nuN8GTRMOny6lSHu9-yheuDjGeCk,5611
|
116
116
|
khoj/interface/compiled/khoj.webmanifest,sha256=lsknYkvEdMbRTOUYKXPM_8krN2gamJmM4u3qj8u9lrU,1682
|
117
117
|
khoj/interface/compiled/logo.svg,sha256=_QCKVYM4WT2Qhcf7aVFImjq_s5CwjynGXYAOgI7yf8w,8059
|
118
118
|
khoj/interface/compiled/send.svg,sha256=VdavOWkVddcwcGcld6pdfmwfz7S91M-9O28cfeiKJkM,635
|
119
119
|
khoj/interface/compiled/share.svg,sha256=91lwo75PvMDrgocuZQab6EQ62CxRbubh9Bhw7CWMKbg,1221
|
120
120
|
khoj/interface/compiled/thumbs-down.svg,sha256=JGNl-DwoRmH2XFMPWwFFklmoYtKxaQbkLE3nuYKe8ZY,1019
|
121
121
|
khoj/interface/compiled/thumbs-up.svg,sha256=yS1wxTRtiztkN-6nZciLoYQUB_KTYNPV8xFRwH2TQFw,1036
|
122
|
-
khoj/interface/compiled/404/index.html,sha256=
|
123
|
-
khoj/interface/compiled/_next/static/
|
124
|
-
khoj/interface/compiled/_next/static/
|
122
|
+
khoj/interface/compiled/404/index.html,sha256=z4-8F3LWb-mP6_KuwZCUd0qCRKOmxgImvrMiHgYLa1o,12023
|
123
|
+
khoj/interface/compiled/_next/static/bkshWraYdEa_w254xnxBc/_buildManifest.js,sha256=6I9QUstNpJnhe3leR2Daw0pSXwzcbBscv6h2jmmPpms,224
|
124
|
+
khoj/interface/compiled/_next/static/bkshWraYdEa_w254xnxBc/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
|
125
125
|
khoj/interface/compiled/_next/static/chunks/1210.132a7e1910006bbb.js,sha256=2dJueIfOg5qlQdanOM9HrgwcfrUXCD57bfd8Iv7iJcU,2104
|
126
126
|
khoj/interface/compiled/_next/static/chunks/1279-f37ee4a388ebf544.js,sha256=U_1WaocOdgJ4HZB8tRx_izzYGD1EZlCohC1uLCffCWc,45582
|
127
127
|
khoj/interface/compiled/_next/static/chunks/1459.690bf20e7d7b7090.js,sha256=z-ruZPxF_Z3ef_WOThd9Ox36AMhxaW3znizVivNnA34,34239
|
@@ -134,12 +134,12 @@ khoj/interface/compiled/_next/static/chunks/3803-d74118a2d0182c52.js,sha256=Elqf
|
|
134
134
|
khoj/interface/compiled/_next/static/chunks/4504-1629487c8bc82203.js,sha256=z6NvJ2KOjYPbMNsYQKyX9PV4DeURUoP6LKoNb4kZXg0,11637
|
135
135
|
khoj/interface/compiled/_next/static/chunks/4602-8eeb4b76385ad159.js,sha256=pz2lEr0JOrMdrddv2R2vej4e9uxpOr5KFX966ClLbOU,29928
|
136
136
|
khoj/interface/compiled/_next/static/chunks/5512-94c7c2bbcf58c19d.js,sha256=ySpWRBlOMbttpBPr-j6_y9FmVrWfeRdardPkVnYAXzw,103730
|
137
|
-
khoj/interface/compiled/_next/static/chunks/5538-
|
138
|
-
khoj/interface/compiled/_next/static/chunks/5961-3c104d9736b7902b.js,sha256=qss4GGVTNo_Rp3x8bU1I_l-SZCa-XAoVaxbLYOOcDTU,1089568
|
137
|
+
khoj/interface/compiled/_next/static/chunks/5538-b87b60ecc0c27ceb.js,sha256=_gYTfk_4_QokG8JC41SvGJmxgCjViwHflNNTX2rlzXI,34236
|
139
138
|
khoj/interface/compiled/_next/static/chunks/6297-d1c842ed3f714ab0.js,sha256=4nzZ2umR-q6wQ-8L4RSivWXKV_SE1dWoN9qA1I9lCRI,25675
|
140
139
|
khoj/interface/compiled/_next/static/chunks/7023-a5bf5744d19b3bd3.js,sha256=TBJA7dTnI8nymtbljKuZzo2hbStXWR-P8Qkl57k2Tw8,123898
|
141
140
|
khoj/interface/compiled/_next/static/chunks/7883-b1305ec254213afe.js,sha256=dDbERTNiKRIIdC7idybjZq03gnxQtudMawrekye0zH8,241134
|
142
|
-
khoj/interface/compiled/_next/static/chunks/
|
141
|
+
khoj/interface/compiled/_next/static/chunks/796-68f9e87f9cdfda1d.js,sha256=sGuaWffm4HXr8jrS3_HpLzmiGSrZ9TJV1l0btptfPLA,1092974
|
142
|
+
khoj/interface/compiled/_next/static/chunks/8423-c0123d454681e03a.js,sha256=ZMV9-K9UbK23ldDrwnYVox4UU9vqxvbcwSgAPlqoeR8,15303
|
143
143
|
khoj/interface/compiled/_next/static/chunks/9001-3b27af6d5f21df44.js,sha256=ran2mMGTO2kiAJebRGMyfyAu4Sdjw-WobS_m6g-qjz8,34223
|
144
144
|
khoj/interface/compiled/_next/static/chunks/9417-32c4db52ca42e681.js,sha256=9r3lV-DxmhmQnYjroVbjAXPyX6rvSmhZKfUguE0dENw,15039
|
145
145
|
khoj/interface/compiled/_next/static/chunks/94ca1967.5584df65931cfe83.js,sha256=lxdrZ8h3_IWkTuk6QlzM2Hd9Pvu9_p8h_EI4aveSOgE,1174519
|
@@ -150,7 +150,7 @@ khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js,sha256
|
|
150
150
|
khoj/interface/compiled/_next/static/chunks/main-1ea5c2e0fdef4626.js,sha256=8_u87PGI3PahFbDfGWGvpD-a18J7X7ChUqWIeqxVq7g,111061
|
151
151
|
khoj/interface/compiled/_next/static/chunks/main-app-6d6ee3495efe03d4.js,sha256=i52E7sWOcSq1G8eYZL3mtTxbUbwRNxcAbSWQ6uWpMsY,475
|
152
152
|
khoj/interface/compiled/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js,sha256=6QPOwdWeAVe8x-SsiDrm-Ga6u2DkqgG5SFqglrlyIgA,91381
|
153
|
-
khoj/interface/compiled/_next/static/chunks/webpack-
|
153
|
+
khoj/interface/compiled/_next/static/chunks/webpack-323bbe2678102a2f.js,sha256=HWPppnK-y1VxwM3jvAhJmgztWlWV2ar1NZZUWFjBbWg,4054
|
154
154
|
khoj/interface/compiled/_next/static/chunks/app/layout-86561d2fac35a91a.js,sha256=2EWsyKE2kcC5uDvsOtgG5OP0hHCX8sCph4NqhUU2rCg,442
|
155
155
|
khoj/interface/compiled/_next/static/chunks/app/page-fcf7411ff80b6bf5.js,sha256=VlOR_tnA5EULQXzWNDUPbUDTbsKCTxJAGPmWz6iXXig,33220
|
156
156
|
khoj/interface/compiled/_next/static/chunks/app/_not-found/page-07ff4ab42b07845e.js,sha256=3mCUnxfMxyK44eqk21TVBrC6u--WSbvx31fTmQuOvMQ,1755
|
@@ -159,13 +159,13 @@ khoj/interface/compiled/_next/static/chunks/app/agents/page-ee4f0da14df15091.js,
|
|
159
159
|
khoj/interface/compiled/_next/static/chunks/app/automations/layout-27c28e923c9b1ff0.js,sha256=d2vJ_lVB0pfeFXNUPzHAe1ca5NzdNowHPh___SPqugM,5143
|
160
160
|
khoj/interface/compiled/_next/static/chunks/app/automations/page-da59a2b9ec07da16.js,sha256=R7auC6hEUsXt6aysFhuyAEcGGUaZ4QOnLxxc8XdDSbc,35349
|
161
161
|
khoj/interface/compiled/_next/static/chunks/app/chat/layout-b0e7ff4baa3b5265.js,sha256=a-Qv2nHUrCa1gIs4Qo5txnOlhhQessAdcnAhhjaN3ag,374
|
162
|
-
khoj/interface/compiled/_next/static/chunks/app/chat/page-
|
162
|
+
khoj/interface/compiled/_next/static/chunks/app/chat/page-e60a55d029b6216a.js,sha256=qdjCIEOXvtnxAyZp9gjxODNq-WHzDOk-kI1UtEgmOU8,7070
|
163
163
|
khoj/interface/compiled/_next/static/chunks/app/search/layout-ea6b73fdaf9b24ca.js,sha256=mBgNUjaTBNgIKOpZj722mh1ojg1CNIYRBPiupStSS6s,165
|
164
164
|
khoj/interface/compiled/_next/static/chunks/app/search/page-4f44549ba3807021.js,sha256=3O3gUM_ALtxAqNVAwQ9X_FDedXFYEcNWEqndayZeTBY,6958
|
165
165
|
khoj/interface/compiled/_next/static/chunks/app/settings/layout-254eaaf916449a60.js,sha256=kHAKleDbNFfhNM3e1WLJm3OFw6PDtGcjyj5toO24vps,5347
|
166
166
|
khoj/interface/compiled/_next/static/chunks/app/settings/page-5591490850437232.js,sha256=p0kRFoAYcSHSxG2y8JOaUBU-Xc__jwCIbYrUs_NEJu8,32149
|
167
167
|
khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-cf7445cf0326bda3.js,sha256=W3axh1K4y-pLSXcXogLl4qLKXr5BZLY1uA7JfSWp5TU,373
|
168
|
-
khoj/interface/compiled/_next/static/chunks/app/share/chat/page-
|
168
|
+
khoj/interface/compiled/_next/static/chunks/app/share/chat/page-4a4c0f199b89bd80.js,sha256=lj2nwWtCd_NUCCTc9jmBBBvO5U5m2VVEUGkdnnpSRu8,4375
|
169
169
|
khoj/interface/compiled/_next/static/chunks/pages/_app-f870474a17b7f2fd.js,sha256=eqdFPAN_XFyMUzZ9qwFk-_rhMWZrU7lgNVt1foVUANo,286
|
170
170
|
khoj/interface/compiled/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js,sha256=vjERjtMAbVk-19LyPf1Jc-H6TMcrSznSz6brzNqbqf8,253
|
171
171
|
khoj/interface/compiled/_next/static/css/0e9d53dcd7f11342.css,sha256=52_LSJ59Vwm1p2UpcDXEvq99pTjz2sW4EjF5iKf-dzs,2622
|
@@ -248,8 +248,8 @@ khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp,sha256=M2AW_HLpBn
|
|
248
248
|
khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp,sha256=BBeRPBZkxY3-aKkMnYv5TSkxmbeMbyUH4VRIPfrWg1E,137406
|
249
249
|
khoj/interface/compiled/_next/static/media/globe.98e105ca.webp,sha256=g3ofb8-W9GM75zIhlvQhaS8I2py9TtrovOKR3_7Jf04,514
|
250
250
|
khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp,sha256=I_N7Yke3IOoS-0CC6XD8o0IUWG8PdPbrHmf6lpgWlZY,1380
|
251
|
-
khoj/interface/compiled/agents/index.html,sha256=
|
252
|
-
khoj/interface/compiled/agents/index.txt,sha256=
|
251
|
+
khoj/interface/compiled/agents/index.html,sha256=RWqVGQRZs6cyi_xOEKqxrj7JQkXppysfuhgkSxNMBS4,12658
|
252
|
+
khoj/interface/compiled/agents/index.txt,sha256=g7ngehW8IjKwbHvwHoa5i7UlCkb222U59-AqQ36smwc,6045
|
253
253
|
khoj/interface/compiled/assets/icons/khoj_lantern.ico,sha256=eggu-B_v3z1R53EjOFhIqqPnICBGdoaw1xnc0NrzHck,174144
|
254
254
|
khoj/interface/compiled/assets/icons/khoj_lantern_128x128.png,sha256=aTxivDb3CYyThkVZWz8A19xl_dNut5DbkXhODWF3A9Q,5640
|
255
255
|
khoj/interface/compiled/assets/icons/khoj_lantern_256x256.png,sha256=xPCMLHiaL7lYOdQLZrKwWE-Qjn5ZaysSZB0ScYv4UZU,12312
|
@@ -260,16 +260,16 @@ khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png,sha256=i
|
|
260
260
|
khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png,sha256=Dd4fPwtFl6BWqnHjeb1mCK_ND0hhHsWtx8sNE7EiMuE,406179
|
261
261
|
khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png,sha256=DEDaNRCkfEWUeh3kYZWIQDTVK1a6KKnYdwj5ZWisN_Q,82985
|
262
262
|
khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png,sha256=Ma3blirRmq3X4oYSsDbbT7MDn29rymDrjwmUfA9BMuM,236285
|
263
|
-
khoj/interface/compiled/automations/index.html,sha256=
|
264
|
-
khoj/interface/compiled/automations/index.txt,sha256=
|
265
|
-
khoj/interface/compiled/chat/index.html,sha256=
|
266
|
-
khoj/interface/compiled/chat/index.txt,sha256
|
267
|
-
khoj/interface/compiled/search/index.html,sha256=
|
268
|
-
khoj/interface/compiled/search/index.txt,sha256=
|
269
|
-
khoj/interface/compiled/settings/index.html,sha256=
|
270
|
-
khoj/interface/compiled/settings/index.txt,sha256=
|
271
|
-
khoj/interface/compiled/share/chat/index.html,sha256=
|
272
|
-
khoj/interface/compiled/share/chat/index.txt,sha256=
|
263
|
+
khoj/interface/compiled/automations/index.html,sha256=VtUtB6H4cwXDfL2MvJfAaDCanPxLqbB4ouKwVdScAtM,30941
|
264
|
+
khoj/interface/compiled/automations/index.txt,sha256=PmrtVhsf1yL7EOf8weA6MnOewgdSI997n_w64hVLfqQ,5633
|
265
|
+
khoj/interface/compiled/chat/index.html,sha256=vlQZScMxIBHHnkPLPozaU-Y5qU5rpzyIQF2H_MujQZs,13857
|
266
|
+
khoj/interface/compiled/chat/index.txt,sha256=fTucaSGLJYtUntYQ9H2RLpm4k1DJxiK7nbwEZ0ZKR30,6588
|
267
|
+
khoj/interface/compiled/search/index.html,sha256=rpB5uN97ObKnKS_HC9OC1Bctsq79jRI5Kx0Epd66O5g,30161
|
268
|
+
khoj/interface/compiled/search/index.txt,sha256=wgD9tKbIgSrX1J1SbrORBaw_1NQ2K4RnIOHUsWAwwiQ,5256
|
269
|
+
khoj/interface/compiled/settings/index.html,sha256=35hwKBwaxZfdGh8VjbjzITkeL4JvLGv6Rn7TnNfbB_I,12831
|
270
|
+
khoj/interface/compiled/settings/index.txt,sha256=NWcTJw1pYtZx33VEiDUOk6IBHbwNnLf45EeFdMYAFgM,6078
|
271
|
+
khoj/interface/compiled/share/chat/index.html,sha256=F6DV_uUB6trYuBYxMCXtZHvFE_fUSGJcH4jbBAdPcVU,15154
|
272
|
+
khoj/interface/compiled/share/chat/index.txt,sha256=t-L2MQ443u_Ay4WCMw1qA6NkStAVzgUuFN53W-UFjN4,7385
|
273
273
|
khoj/interface/email/feedback.html,sha256=xksuPFamx4hGWyTTxZKRgX_eiYQQEuv-eK9Xmkt-nwU,1216
|
274
274
|
khoj/interface/email/magic_link.html,sha256=EoGKQucfPj3xQrWXhSZAzPFOYCHF_ZX94TWCd1XHl1M,941
|
275
275
|
khoj/interface/email/task.html,sha256=tY7a0gzVeQ2lSQNu7WyXR_s7VYeWTrxWEj1iHVuoVE4,2813
|
@@ -283,7 +283,6 @@ khoj/interface/web/assets/utils.js,sha256=A22W1nOVuD1osI7TtZC8fZ0r1g4pE66tXQ_4XN
|
|
283
283
|
khoj/interface/web/assets/icons/agents.svg,sha256=_DK73fRvvn5I-ajKZxH--9qLv-721QSiMk_lnwZKXlw,2609
|
284
284
|
khoj/interface/web/assets/icons/automation.svg,sha256=6SHlGisTmg7iFQ3mLG1BQoSc-HMaaJKsLFVIYaFV2Hs,1579
|
285
285
|
khoj/interface/web/assets/icons/chat.svg,sha256=cDicxL36Nn0BkCUFezwm7UOM0KefSClsid5HbRHxovU,2439
|
286
|
-
khoj/interface/web/assets/icons/favicon-128x128.ico,sha256=JMZf9aZor9AUbh5kuFNDaG3Mjxvoau5k80yRA9ly5TQ,205167
|
287
286
|
khoj/interface/web/assets/icons/github.svg,sha256=E789GwMweG0aU1wJNp0FjWHlFX1AxuA5H0durEnw5hQ,964
|
288
287
|
khoj/interface/web/assets/icons/khoj-logo-sideways-200.png,sha256=2_F1PpTZzfjvaHej9jjENx03H1vKtFsVkolwTPLJP9Q,6637
|
289
288
|
khoj/interface/web/assets/icons/khoj-logo-sideways-500.png,sha256=VQsQ20NC-sKYHa9UgAvLM2N25DWRISZUIGW0zhnRres,18603
|
@@ -317,11 +316,11 @@ khoj/processor/content/org_mode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
317
316
|
khoj/processor/content/org_mode/org_to_entries.py,sha256=KQBn792yM9fsfaFu8FFoxk1PwYR-lmA07RUXEJQFkHs,10237
|
318
317
|
khoj/processor/content/org_mode/orgnode.py,sha256=DlHZICxbCRxqGxA_osYf1faxslxpSuIqbHco8oxAKKM,18478
|
319
318
|
khoj/processor/content/pdf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
320
|
-
khoj/processor/content/pdf/pdf_to_entries.py,sha256=
|
319
|
+
khoj/processor/content/pdf/pdf_to_entries.py,sha256=GQUvab61okhV9_DK0g2MCrMq8wKpM208EbXvsaTAkzs,4995
|
321
320
|
khoj/processor/content/plaintext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
322
321
|
khoj/processor/content/plaintext/plaintext_to_entries.py,sha256=wFZwK_zIc7gWbRtO9sOHo9KvfhGAzL9psX_nKWYFduo,4975
|
323
322
|
khoj/processor/conversation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
324
|
-
khoj/processor/conversation/prompts.py,sha256=
|
323
|
+
khoj/processor/conversation/prompts.py,sha256=20IFC1uyyPLAe3OYyVlQ1TlFVbZuMh0IQwp6Hz0x39k,48831
|
325
324
|
khoj/processor/conversation/utils.py,sha256=2gbglhzKMEuldL0P9Y6miCF8BNooiEgFFNdgc8lvneQ,27870
|
326
325
|
khoj/processor/conversation/anthropic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
327
326
|
khoj/processor/conversation/anthropic/anthropic_chat.py,sha256=8w7oSTBIxcZa6y03Zo2nuQFa2WMiazwK_qfO2q_O-6c,8618
|
@@ -341,19 +340,19 @@ khoj/processor/image/generate.py,sha256=i5J51AwlMZbdlHHov-_MAw9bYgdVYmGgFjCYWDfx
|
|
341
340
|
khoj/processor/speech/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
342
341
|
khoj/processor/speech/text_to_speech.py,sha256=Q7sapi5Hv6woXOumtrGqR0t6izZrFBkWXFOGrHM6dJ4,1929
|
343
342
|
khoj/processor/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
344
|
-
khoj/processor/tools/online_search.py,sha256=
|
343
|
+
khoj/processor/tools/online_search.py,sha256=X8D3ClKpg34r_LMol28GdBqZ--YVGGVBPc9lUSgb2mg,17128
|
345
344
|
khoj/processor/tools/run_code.py,sha256=i9ce53dw0y5ZNhPorRNYJieIKw6eyrZQX0ABDrWiW8M,7738
|
346
345
|
khoj/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
347
346
|
khoj/routers/api.py,sha256=_AI1pnQMQM75L6WVZSAVfvrk04pLEdLbHA0fkyxnUbo,28489
|
348
347
|
khoj/routers/api_agents.py,sha256=vHPruCjlQxGBdm0lcmymEb9-aAELqbOplqh21WwD0DQ,9699
|
349
|
-
khoj/routers/api_chat.py,sha256=
|
348
|
+
khoj/routers/api_chat.py,sha256=QQA2hg_TL_kShFHWPdCXmauftLNkvknwWyDJMtXLDkE,49193
|
350
349
|
khoj/routers/api_content.py,sha256=WNlB6lVwRW8hHDthO2HypbpPvqrqt9rTU5oMRNknpMU,21070
|
351
350
|
khoj/routers/api_model.py,sha256=KDsxNwHspC94eTcv6l3ehr773EOvgc670UnZLE1WZ4o,3642
|
352
351
|
khoj/routers/api_phone.py,sha256=p9yfc4WeMHDC0hg3aQk60a2VBy8rZPdEnz9wdJ7DzkU,2208
|
353
352
|
khoj/routers/api_subscription.py,sha256=J6xZNZDdOA71vCfethlPfAyfvRBq4HGCBpbsOZ9CWj0,5333
|
354
353
|
khoj/routers/auth.py,sha256=HO54PR-BkWA_iJIktEobUrObcXVYG-00jpnIcEVdR5s,6564
|
355
354
|
khoj/routers/email.py,sha256=SGYNPQvfcvYeHf70F0YqpY0FLMRElF2ZekROXdwGI18,3821
|
356
|
-
khoj/routers/helpers.py,sha256=
|
355
|
+
khoj/routers/helpers.py,sha256=z16PnK26S4KWDYlxKgAqULhtR0FfIo-H6m08blLGxrg,81603
|
357
356
|
khoj/routers/notion.py,sha256=g53xyYFmjr2JnuIrTW2vytbfkiK_UkoRTxqnnLSmD5o,2802
|
358
357
|
khoj/routers/research.py,sha256=SczFMS9a8_Wxhh3n_Zt9CJ-zZugBDAd_WmiZGFa6RR8,16117
|
359
358
|
khoj/routers/storage.py,sha256=tJrwhFRVWv0MHv7V7huMc1Diwm-putZSwnZXJ3tqT_c,2338
|
@@ -369,17 +368,17 @@ khoj/search_type/text_search.py,sha256=PZzJVCXpeBM795SIqiAKXAxgnCp1NIRiVikm040r1
|
|
369
368
|
khoj/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
370
369
|
khoj/utils/cli.py,sha256=EA7IvWAInUIll8YFTOpQtqLtCQXwphfHi5rJ2TKAdSQ,3757
|
371
370
|
khoj/utils/config.py,sha256=aiOkH0je8A30DAGYTHMRePrgJonFv_i07_7CdhhhcdA,1805
|
372
|
-
khoj/utils/constants.py,sha256=
|
371
|
+
khoj/utils/constants.py,sha256=DNts_NN4ZL9nRCA9KH3ZD_6PBK9VVggtun79pQxzNnU,1219
|
373
372
|
khoj/utils/fs_syncer.py,sha256=5nqwAZqRk3Nwhkwd8y4IomTPZQmW32GwAqyMzal5KyY,9996
|
374
|
-
khoj/utils/helpers.py,sha256=
|
375
|
-
khoj/utils/initialization.py,sha256=
|
373
|
+
khoj/utils/helpers.py,sha256=tdwRlkI5IqOr07cxw4zKindR3hSn6cGthPYHSXs2BcU,20239
|
374
|
+
khoj/utils/initialization.py,sha256=nJtqPUv52SPA6sPHn0_vs1uSBdDihX25Dvvagu81Xbs,13490
|
376
375
|
khoj/utils/jsonl.py,sha256=0Ac_COqr8sLCXntzZtquxuCEVRM2c3yKeDRGhgOBRpQ,1192
|
377
376
|
khoj/utils/models.py,sha256=Q5tcC9-z25sCiub048fLnvZ6_IIO1bcPNxt5payekk0,2009
|
378
377
|
khoj/utils/rawconfig.py,sha256=bQ_MGbBzYt6ZUIsHUwZjaHKDLh6GQ7h-sENkv3fyVbQ,5028
|
379
378
|
khoj/utils/state.py,sha256=KtUEIKAZdGGN_Qr58RS1pgcywgSafun8YIXx-YEclAY,1645
|
380
379
|
khoj/utils/yaml.py,sha256=qy1Tkc61rDMesBw_Cyx2vOR6H-Hngcsm5kYfjwQBwkE,1543
|
381
|
-
khoj-1.29.2.
|
382
|
-
khoj-1.29.2.
|
383
|
-
khoj-1.29.2.
|
384
|
-
khoj-1.29.2.
|
385
|
-
khoj-1.29.2.
|
380
|
+
khoj-1.29.2.dev35.dist-info/METADATA,sha256=u3KlwJ3TalfjlqARcFoPsAK57lbHJkWmRm2TeSN-fBE,7120
|
381
|
+
khoj-1.29.2.dev35.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
382
|
+
khoj-1.29.2.dev35.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
|
383
|
+
khoj-1.29.2.dev35.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
384
|
+
khoj-1.29.2.dev35.dist-info/RECORD,,
|