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.
Files changed (42) hide show
  1. khoj/database/adapters/__init__.py +2 -0
  2. khoj/database/admin.py +32 -1
  3. khoj/interface/compiled/404/index.html +1 -1
  4. khoj/interface/compiled/_next/static/chunks/5538-b87b60ecc0c27ceb.js +1 -0
  5. khoj/interface/compiled/_next/static/chunks/796-68f9e87f9cdfda1d.js +3 -0
  6. khoj/interface/compiled/_next/static/chunks/8423-c0123d454681e03a.js +1 -0
  7. khoj/interface/compiled/_next/static/chunks/app/chat/{page-e95e87da53d725a7.js → page-e60a55d029b6216a.js} +1 -1
  8. khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-3a752baa5fb62e20.js → page-4a4c0f199b89bd80.js} +1 -1
  9. khoj/interface/compiled/_next/static/chunks/{webpack-333038bdf3041c6f.js → webpack-323bbe2678102a2f.js} +1 -1
  10. khoj/interface/compiled/agents/index.html +1 -1
  11. khoj/interface/compiled/agents/index.txt +1 -1
  12. khoj/interface/compiled/automations/index.html +1 -1
  13. khoj/interface/compiled/automations/index.txt +1 -1
  14. khoj/interface/compiled/chat/index.html +1 -1
  15. khoj/interface/compiled/chat/index.txt +2 -2
  16. khoj/interface/compiled/index.html +1 -1
  17. khoj/interface/compiled/index.txt +2 -2
  18. khoj/interface/compiled/search/index.html +1 -1
  19. khoj/interface/compiled/search/index.txt +1 -1
  20. khoj/interface/compiled/settings/index.html +1 -1
  21. khoj/interface/compiled/settings/index.txt +1 -1
  22. khoj/interface/compiled/share/chat/index.html +1 -1
  23. khoj/interface/compiled/share/chat/index.txt +2 -2
  24. khoj/processor/content/pdf/pdf_to_entries.py +1 -1
  25. khoj/processor/conversation/prompts.py +14 -69
  26. khoj/processor/tools/online_search.py +22 -4
  27. khoj/routers/api_chat.py +23 -15
  28. khoj/routers/helpers.py +36 -77
  29. khoj/utils/constants.py +1 -1
  30. khoj/utils/helpers.py +5 -6
  31. khoj/utils/initialization.py +77 -10
  32. {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/METADATA +1 -1
  33. {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/RECORD +38 -39
  34. khoj/interface/compiled/_next/static/chunks/5538-32bd787d106700dc.js +0 -1
  35. khoj/interface/compiled/_next/static/chunks/5961-3c104d9736b7902b.js +0 -3
  36. khoj/interface/compiled/_next/static/chunks/8423-ffdc2b835629c7f8.js +0 -1
  37. khoj/interface/web/assets/icons/favicon-128x128.ico +0 -0
  38. /khoj/interface/compiled/_next/static/{5mAH5bo-h_J4eyL7tXj2i → bkshWraYdEa_w254xnxBc}/_buildManifest.js +0 -0
  39. /khoj/interface/compiled/_next/static/{5mAH5bo-h_J4eyL7tXj2i → bkshWraYdEa_w254xnxBc}/_ssgManifest.js +0 -0
  40. {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/WHEEL +0 -0
  41. {khoj-1.29.2.dev11.dist-info → khoj-1.29.2.dev35.dist-info}/entry_points.txt +0 -0
  42. {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 aget_relevant_information_sources(
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.pick_relevant_information_collection_tools.format(
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
- response = [q.strip() for q in response["source"] if q.strip()]
392
- if not isinstance(response, list) or not response or len(response) == 0:
393
- logger.error(f"Invalid response for determining relevant tools: {response}")
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 response:
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-20240620", "claude-3-opus-20240229"]
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 for user. Matplotlib, bs4, pandas, numpy, etc. are available.",
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 for user. Matplotlib, bs4, pandas, numpy, etc. are available.",
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 does not support generating charts or graphs.",
381
- ConversationCommand.Automation: "Use this if you are confident the user is requesting a response at a scheduled date, time and frequency",
382
- ConversationCommand.Text: "Use this if a normal text response would be sufficient for accurately responding to the query.",
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 = {
@@ -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
- default_openai_chat_models,
49
- default_api_key=os.getenv("OPENAI_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=False,
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=False,
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 = ["gpt-4o-mini", "gpt-4o"]
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
- chat_model_provider = None
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
- chat_model_provider = OpenAIProcessorConversationConfig.objects.create(api_key=api_key, name=provider_name)
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": chat_model_provider,
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, chat_model_provider
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")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: khoj
3
- Version: 1.29.2.dev11
3
+ Version: 1.29.2.dev35
4
4
  Summary: Your Second Brain
5
5
  Project-URL: Homepage, https://khoj.dev
6
6
  Project-URL: Documentation, https://docs.khoj.dev
@@ -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=Tmvcc4f3HECgxtynIs9ISkjapvu9hsPaStugzVoCmyE,9640
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=gv2SNrTpJvW1cPzFwSSY7qF7DYYXY1bWWxi-A141nkM,69020
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=BIHKPuIisH-RABm4q1cvIcgts_ysp7ho10ia3lLNaC8,12156
115
- khoj/interface/compiled/index.txt,sha256=zFf4VKpy1buBTjrNDli6z2peWOcJ2vphLT3VVFLi97E,5611
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=y6MWo7H3VRSzwieEYur5ZJBVv_Z6Uy8qwMw4PU82Ll4,12023
123
- khoj/interface/compiled/_next/static/5mAH5bo-h_J4eyL7tXj2i/_buildManifest.js,sha256=6I9QUstNpJnhe3leR2Daw0pSXwzcbBscv6h2jmmPpms,224
124
- khoj/interface/compiled/_next/static/5mAH5bo-h_J4eyL7tXj2i/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
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-32bd787d106700dc.js,sha256=aZZKwp3YRs4ff6gzG5PGSlyeCPvrzYB9Rw5dsdfdZpU,34191
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/8423-ffdc2b835629c7f8.js,sha256=e2jAWQ-jQxP-067cJlzMogEtg-UwLZxrg9DP4DHstng,15238
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-333038bdf3041c6f.js,sha256=uBOqJymo1PEinYF-xI9Vh-8weLv8-kaxHNpPbXv8-8M,4054
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-e95e87da53d725a7.js,sha256=-2zXrMu8g66gPw4jsGKbeplGd8rXMlkqfsG8qAOtGf4,7181
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-3a752baa5fb62e20.js,sha256=gIcgm8Wtf38E8fP2jE58mPYm2GLOL5WU7HRxONXrK1g,4376
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=1dHQCatobA09niFilxp5D1RSg_aZrs6s9ARnbzlTXk0,12658
252
- khoj/interface/compiled/agents/index.txt,sha256=YfgoF5biMgnPtU1fNkyhmLFvvqZbQqCEU2h_QiC2I7U,6045
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=062NKdYGuLqU_tDrud-vI8MFlch1WXwlOgG2_duhSMk,30941
264
- khoj/interface/compiled/automations/index.txt,sha256=rrZ3sYroGD4NWZl5aXn3PkcQ3IaO_KErXn6D6Uvt6qA,5633
265
- khoj/interface/compiled/chat/index.html,sha256=PXgKBzdO2m4pk-_jsU--51Cn5k-26K9evT7bAtHfa14,13860
266
- khoj/interface/compiled/chat/index.txt,sha256=-7vR2_NmosUVg_gSgq0hKiQ68mytWMKV_xYJ-L6OR3s,6590
267
- khoj/interface/compiled/search/index.html,sha256=D0qq0IppE5b9tW_8OGZBC7g5p30EWxAAfF-08UIKM2M,30161
268
- khoj/interface/compiled/search/index.txt,sha256=q5yYCZLZyAKxsAiYPFXwqa7NHzukT0NpHqgaO7-R5Dw,5256
269
- khoj/interface/compiled/settings/index.html,sha256=rrEHlnFaWtK-kpzusMNZsS11pfaALCPpOczlRBvVcSA,12831
270
- khoj/interface/compiled/settings/index.txt,sha256=UJDJuHfj3cc71-LcouoPJ7YwXHTahcX_Voj4qCwncP8,6078
271
- khoj/interface/compiled/share/chat/index.html,sha256=OGH8Fx1Ot3TwdIsJE669UuWwo704x0IR4RsnLwMVwVE,15157
272
- khoj/interface/compiled/share/chat/index.txt,sha256=HysG8IHwHBrlDzunH0IKRe5VhVd1G9i7HnJp0Nour9g,7387
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=ig7GzAoNewBD-9IwwLayWofTSlhvYYAUrMgkddkY0es,5016
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=jXVxeFYHBP6LBSAmdykYH6in297VTgVdEJ5IDsYlQnI,50319
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=uxwtvKReGEW1XhkeToi7XB_oZ301DIcnD7Wr3xojuM4,16307
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=83jqlGex6K3bry9_Pq4Ti8pEGHhENsjtlW4EgWbL-88,48704
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=v-dnh2AwuXQNCWGHYLacGnq-8bNSluU2Ym8z7JG4ek0,82672
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=UwE7U9bNsfeqTb0K2lcdXdAscM4-7uuVoR3KbZS03Pg,1216
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=JMCxQKEmz9ktZrSLQQh3cpm97dVsHT5J0rKY3bTrNco,20126
375
- khoj/utils/initialization.py,sha256=TjA2ZImYKI-J1tEBE_0TaOLnVQidVV5GDEFBOPq8aik,10048
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.dev11.dist-info/METADATA,sha256=jc9xHYKWUisl9w_Mh0xL8ezccH-fvpZGfgYrMrlkhBw,7120
382
- khoj-1.29.2.dev11.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
383
- khoj-1.29.2.dev11.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
384
- khoj-1.29.2.dev11.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
385
- khoj-1.29.2.dev11.dist-info/RECORD,,
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,,