khoj 1.40.1.dev20__py3-none-any.whl → 1.40.1.dev28__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 (41) hide show
  1. khoj/database/adapters/__init__.py +24 -22
  2. khoj/interface/compiled/404/index.html +2 -2
  3. khoj/interface/compiled/_next/static/chunks/{webpack-639e8a9d35bd5e13.js → webpack-05ff3cbe22520b30.js} +1 -1
  4. khoj/interface/compiled/agents/index.html +2 -2
  5. khoj/interface/compiled/agents/index.txt +2 -2
  6. khoj/interface/compiled/automations/index.html +2 -2
  7. khoj/interface/compiled/automations/index.txt +3 -3
  8. khoj/interface/compiled/chat/index.html +2 -2
  9. khoj/interface/compiled/chat/index.txt +2 -2
  10. khoj/interface/compiled/index.html +2 -2
  11. khoj/interface/compiled/index.txt +2 -2
  12. khoj/interface/compiled/search/index.html +2 -2
  13. khoj/interface/compiled/search/index.txt +2 -2
  14. khoj/interface/compiled/settings/index.html +2 -2
  15. khoj/interface/compiled/settings/index.txt +4 -4
  16. khoj/interface/compiled/share/chat/index.html +2 -2
  17. khoj/interface/compiled/share/chat/index.txt +2 -2
  18. khoj/processor/conversation/anthropic/anthropic_chat.py +23 -12
  19. khoj/processor/conversation/anthropic/utils.py +21 -64
  20. khoj/processor/conversation/google/gemini_chat.py +23 -12
  21. khoj/processor/conversation/google/utils.py +26 -64
  22. khoj/processor/conversation/offline/chat_model.py +86 -35
  23. khoj/processor/conversation/openai/gpt.py +23 -12
  24. khoj/processor/conversation/openai/utils.py +50 -70
  25. khoj/processor/conversation/utils.py +2 -38
  26. khoj/routers/api_chat.py +36 -28
  27. khoj/routers/helpers.py +13 -23
  28. khoj/utils/helpers.py +56 -0
  29. {khoj-1.40.1.dev20.dist-info → khoj-1.40.1.dev28.dist-info}/METADATA +1 -1
  30. {khoj-1.40.1.dev20.dist-info → khoj-1.40.1.dev28.dist-info}/RECORD +41 -41
  31. /khoj/interface/compiled/_next/static/{cbPHN2fL-jO8972HjaRbw → 7IDXliK3ZEqSeZICqmtPL}/_buildManifest.js +0 -0
  32. /khoj/interface/compiled/_next/static/{cbPHN2fL-jO8972HjaRbw → 7IDXliK3ZEqSeZICqmtPL}/_ssgManifest.js +0 -0
  33. /khoj/interface/compiled/_next/static/chunks/{1915-ab4353eaca76f690.js → 1915-1943ee8a628b893c.js} +0 -0
  34. /khoj/interface/compiled/_next/static/chunks/{2117-1c18aa2098982bf9.js → 2117-5a41630a2bd2eae8.js} +0 -0
  35. /khoj/interface/compiled/_next/static/chunks/{4363-4efaf12abe696251.js → 4363-e6ac2203564d1a3b.js} +0 -0
  36. /khoj/interface/compiled/_next/static/chunks/{4447-5d44807c40355b1a.js → 4447-e038b251d626c340.js} +0 -0
  37. /khoj/interface/compiled/_next/static/chunks/{8667-adbe6017a66cef10.js → 8667-8136f74e9a086fca.js} +0 -0
  38. /khoj/interface/compiled/_next/static/chunks/{9259-d8bcd9da9e80c81e.js → 9259-640fdd77408475df.js} +0 -0
  39. {khoj-1.40.1.dev20.dist-info → khoj-1.40.1.dev28.dist-info}/WHEEL +0 -0
  40. {khoj-1.40.1.dev20.dist-info → khoj-1.40.1.dev28.dist-info}/entry_points.txt +0 -0
  41. {khoj-1.40.1.dev20.dist-info → khoj-1.40.1.dev28.dist-info}/licenses/LICENSE +0 -0
@@ -77,42 +77,6 @@ model_to_prompt_size = {
77
77
  model_to_tokenizer: Dict[str, str] = {}
78
78
 
79
79
 
80
- class ThreadedGenerator:
81
- def __init__(self, compiled_references, online_results, completion_func=None):
82
- self.queue = queue.Queue()
83
- self.compiled_references = compiled_references
84
- self.online_results = online_results
85
- self.completion_func = completion_func
86
- self.response = ""
87
- self.start_time = perf_counter()
88
-
89
- def __iter__(self):
90
- return self
91
-
92
- def __next__(self):
93
- item = self.queue.get()
94
- if item is StopIteration:
95
- time_to_response = perf_counter() - self.start_time
96
- logger.info(f"Chat streaming took: {time_to_response:.3f} seconds")
97
- if self.completion_func:
98
- # The completion func effectively acts as a callback.
99
- # It adds the aggregated response to the conversation history.
100
- self.completion_func(chat_response=self.response)
101
- raise StopIteration
102
- return item
103
-
104
- def send(self, data):
105
- if self.response == "":
106
- time_to_first_response = perf_counter() - self.start_time
107
- logger.info(f"First response took: {time_to_first_response:.3f} seconds")
108
-
109
- self.response += data
110
- self.queue.put(data)
111
-
112
- def close(self):
113
- self.queue.put(StopIteration)
114
-
115
-
116
80
  class InformationCollectionIteration:
117
81
  def __init__(
118
82
  self,
@@ -254,7 +218,7 @@ def message_to_log(
254
218
  return conversation_log
255
219
 
256
220
 
257
- def save_to_conversation_log(
221
+ async def save_to_conversation_log(
258
222
  q: str,
259
223
  chat_response: str,
260
224
  user: KhojUser,
@@ -306,7 +270,7 @@ def save_to_conversation_log(
306
270
  khoj_message_metadata=khoj_message_metadata,
307
271
  conversation_log=meta_log.get("chat", []),
308
272
  )
309
- ConversationAdapters.save_conversation(
273
+ await ConversationAdapters.save_conversation(
310
274
  user,
311
275
  {"chat": updated_conversation},
312
276
  client_application=client_application,
khoj/routers/api_chat.py CHANGED
@@ -67,7 +67,6 @@ from khoj.routers.research import (
67
67
  from khoj.routers.storage import upload_user_image_to_bucket
68
68
  from khoj.utils import state
69
69
  from khoj.utils.helpers import (
70
- AsyncIteratorWrapper,
71
70
  ConversationCommand,
72
71
  command_descriptions,
73
72
  convert_image_to_webp,
@@ -999,22 +998,26 @@ async def chat(
999
998
  return
1000
999
 
1001
1000
  llm_response = construct_automation_created_message(automation, crontime, query_to_run, subject)
1002
- await sync_to_async(save_to_conversation_log)(
1003
- q,
1004
- llm_response,
1005
- user,
1006
- meta_log,
1007
- user_message_time,
1008
- intent_type="automation",
1009
- client_application=request.user.client_app,
1010
- conversation_id=conversation_id,
1011
- inferred_queries=[query_to_run],
1012
- automation_id=automation.id,
1013
- query_images=uploaded_images,
1014
- train_of_thought=train_of_thought,
1015
- raw_query_files=raw_query_files,
1016
- tracer=tracer,
1001
+ # Trigger task to save conversation to DB
1002
+ asyncio.create_task(
1003
+ save_to_conversation_log(
1004
+ q,
1005
+ llm_response,
1006
+ user,
1007
+ meta_log,
1008
+ user_message_time,
1009
+ intent_type="automation",
1010
+ client_application=request.user.client_app,
1011
+ conversation_id=conversation_id,
1012
+ inferred_queries=[query_to_run],
1013
+ automation_id=automation.id,
1014
+ query_images=uploaded_images,
1015
+ train_of_thought=train_of_thought,
1016
+ raw_query_files=raw_query_files,
1017
+ tracer=tracer,
1018
+ )
1017
1019
  )
1020
+ # Send LLM Response
1018
1021
  async for result in send_llm_response(llm_response, tracer.get("usage")):
1019
1022
  yield result
1020
1023
  return
@@ -1308,26 +1311,31 @@ async def chat(
1308
1311
  yield result
1309
1312
 
1310
1313
  continue_stream = True
1311
- iterator = AsyncIteratorWrapper(llm_response)
1312
- async for item in iterator:
1314
+ async for item in llm_response:
1315
+ # Should not happen with async generator, end is signaled by loop exit. Skip.
1313
1316
  if item is None:
1314
- async for result in send_event(ChatEvent.END_LLM_RESPONSE, ""):
1315
- yield result
1316
- # Send Usage Metadata once llm interactions are complete
1317
- async for event in send_event(ChatEvent.USAGE, tracer.get("usage")):
1318
- yield event
1319
- async for result in send_event(ChatEvent.END_RESPONSE, ""):
1320
- yield result
1321
- logger.debug("Finished streaming response")
1322
- return
1317
+ continue
1323
1318
  if not connection_alive or not continue_stream:
1319
+ # Drain the generator if disconnected but keep processing internally
1324
1320
  continue
1325
1321
  try:
1326
1322
  async for result in send_event(ChatEvent.MESSAGE, f"{item}"):
1327
1323
  yield result
1328
1324
  except Exception as e:
1329
1325
  continue_stream = False
1330
- logger.info(f"User {user} disconnected. Emitting rest of responses to clear thread: {e}")
1326
+ logger.info(f"User {user} disconnected or error during streaming. Stopping send: {e}")
1327
+
1328
+ # Signal end of LLM response after the loop finishes
1329
+ if connection_alive:
1330
+ async for result in send_event(ChatEvent.END_LLM_RESPONSE, ""):
1331
+ yield result
1332
+ # Send Usage Metadata once llm interactions are complete
1333
+ if tracer.get("usage"):
1334
+ async for event in send_event(ChatEvent.USAGE, tracer.get("usage")):
1335
+ yield event
1336
+ async for result in send_event(ChatEvent.END_RESPONSE, ""):
1337
+ yield result
1338
+ logger.debug("Finished streaming response")
1331
1339
 
1332
1340
  ## Stream Text Response
1333
1341
  if stream:
khoj/routers/helpers.py CHANGED
@@ -1,4 +1,3 @@
1
- import asyncio
2
1
  import base64
3
2
  import hashlib
4
3
  import json
@@ -6,9 +5,7 @@ import logging
6
5
  import math
7
6
  import os
8
7
  import re
9
- from concurrent.futures import ThreadPoolExecutor
10
8
  from datetime import datetime, timedelta, timezone
11
- from enum import Enum
12
9
  from functools import partial
13
10
  from random import random
14
11
  from typing import (
@@ -17,7 +14,6 @@ from typing import (
17
14
  AsyncGenerator,
18
15
  Callable,
19
16
  Dict,
20
- Iterator,
21
17
  List,
22
18
  Optional,
23
19
  Set,
@@ -97,7 +93,6 @@ from khoj.processor.conversation.openai.gpt import (
97
93
  )
98
94
  from khoj.processor.conversation.utils import (
99
95
  ChatEvent,
100
- ThreadedGenerator,
101
96
  clean_json,
102
97
  clean_mermaidjs,
103
98
  construct_chat_history,
@@ -126,8 +121,6 @@ from khoj.utils.rawconfig import ChatRequestBody, FileAttachment, FileData, Loca
126
121
 
127
122
  logger = logging.getLogger(__name__)
128
123
 
129
- executor = ThreadPoolExecutor(max_workers=1)
130
-
131
124
 
132
125
  NOTION_OAUTH_CLIENT_ID = os.getenv("NOTION_OAUTH_CLIENT_ID")
133
126
  NOTION_OAUTH_CLIENT_SECRET = os.getenv("NOTION_OAUTH_CLIENT_SECRET")
@@ -262,11 +255,6 @@ def get_conversation_command(query: str) -> ConversationCommand:
262
255
  return ConversationCommand.Default
263
256
 
264
257
 
265
- async def agenerate_chat_response(*args):
266
- loop = asyncio.get_event_loop()
267
- return await loop.run_in_executor(executor, generate_chat_response, *args)
268
-
269
-
270
258
  def gather_raw_query_files(
271
259
  query_files: Dict[str, str],
272
260
  ):
@@ -1418,7 +1406,7 @@ def send_message_to_model_wrapper_sync(
1418
1406
  raise HTTPException(status_code=500, detail="Invalid conversation config")
1419
1407
 
1420
1408
 
1421
- def generate_chat_response(
1409
+ async def agenerate_chat_response(
1422
1410
  q: str,
1423
1411
  meta_log: dict,
1424
1412
  conversation: Conversation,
@@ -1444,13 +1432,14 @@ def generate_chat_response(
1444
1432
  generated_asset_results: Dict[str, Dict] = {},
1445
1433
  is_subscribed: bool = False,
1446
1434
  tracer: dict = {},
1447
- ) -> Tuple[Union[ThreadedGenerator, Iterator[str]], Dict[str, str]]:
1435
+ ) -> Tuple[AsyncGenerator[str, None], Dict[str, str]]:
1448
1436
  # Initialize Variables
1449
- chat_response = None
1437
+ chat_response_generator = None
1450
1438
  logger.debug(f"Conversation Types: {conversation_commands}")
1451
1439
 
1452
1440
  metadata = {}
1453
- agent = AgentAdapters.get_conversation_agent_by_id(conversation.agent.id) if conversation.agent else None
1441
+ agent = await AgentAdapters.aget_conversation_agent_by_id(conversation.agent.id) if conversation.agent else None
1442
+
1454
1443
  try:
1455
1444
  partial_completion = partial(
1456
1445
  save_to_conversation_log,
@@ -1481,17 +1470,17 @@ def generate_chat_response(
1481
1470
  code_results = {}
1482
1471
  deepthought = True
1483
1472
 
1484
- chat_model = ConversationAdapters.get_valid_chat_model(user, conversation, is_subscribed)
1473
+ chat_model = await ConversationAdapters.aget_valid_chat_model(user, conversation, is_subscribed)
1485
1474
  vision_available = chat_model.vision_enabled
1486
1475
  if not vision_available and query_images:
1487
- vision_enabled_config = ConversationAdapters.get_vision_enabled_config()
1476
+ vision_enabled_config = await ConversationAdapters.aget_vision_enabled_config()
1488
1477
  if vision_enabled_config:
1489
1478
  chat_model = vision_enabled_config
1490
1479
  vision_available = True
1491
1480
 
1492
1481
  if chat_model.model_type == "offline":
1493
1482
  loaded_model = state.offline_chat_processor_config.loaded_model
1494
- chat_response = converse_offline(
1483
+ chat_response_generator = converse_offline(
1495
1484
  user_query=query_to_run,
1496
1485
  references=compiled_references,
1497
1486
  online_results=online_results,
@@ -1515,7 +1504,7 @@ def generate_chat_response(
1515
1504
  openai_chat_config = chat_model.ai_model_api
1516
1505
  api_key = openai_chat_config.api_key
1517
1506
  chat_model_name = chat_model.name
1518
- chat_response = converse_openai(
1507
+ chat_response_generator = converse_openai(
1519
1508
  compiled_references,
1520
1509
  query_to_run,
1521
1510
  query_images=query_images,
@@ -1544,7 +1533,7 @@ def generate_chat_response(
1544
1533
  elif chat_model.model_type == ChatModel.ModelType.ANTHROPIC:
1545
1534
  api_key = chat_model.ai_model_api.api_key
1546
1535
  api_base_url = chat_model.ai_model_api.api_base_url
1547
- chat_response = converse_anthropic(
1536
+ chat_response_generator = converse_anthropic(
1548
1537
  compiled_references,
1549
1538
  query_to_run,
1550
1539
  query_images=query_images,
@@ -1572,7 +1561,7 @@ def generate_chat_response(
1572
1561
  elif chat_model.model_type == ChatModel.ModelType.GOOGLE:
1573
1562
  api_key = chat_model.ai_model_api.api_key
1574
1563
  api_base_url = chat_model.ai_model_api.api_base_url
1575
- chat_response = converse_gemini(
1564
+ chat_response_generator = converse_gemini(
1576
1565
  compiled_references,
1577
1566
  query_to_run,
1578
1567
  online_results,
@@ -1604,7 +1593,8 @@ def generate_chat_response(
1604
1593
  logger.error(e, exc_info=True)
1605
1594
  raise HTTPException(status_code=500, detail=str(e))
1606
1595
 
1607
- return chat_response, metadata
1596
+ # Return the generator directly
1597
+ return chat_response_generator, metadata
1608
1598
 
1609
1599
 
1610
1600
  class DeleteMessageRequestBody(BaseModel):
khoj/utils/helpers.py CHANGED
@@ -23,6 +23,7 @@ from time import perf_counter
23
23
  from typing import TYPE_CHECKING, Any, NamedTuple, Optional, Tuple, Union
24
24
  from urllib.parse import ParseResult, urlparse
25
25
 
26
+ import anthropic
26
27
  import openai
27
28
  import psutil
28
29
  import pyjson5
@@ -30,6 +31,7 @@ import requests
30
31
  import torch
31
32
  from asgiref.sync import sync_to_async
32
33
  from email_validator import EmailNotValidError, EmailUndeliverableError, validate_email
34
+ from google import genai
33
35
  from google.auth.credentials import Credentials
34
36
  from google.oauth2 import service_account
35
37
  from magika import Magika
@@ -729,6 +731,60 @@ def get_openai_client(api_key: str, api_base_url: str) -> Union[openai.OpenAI, o
729
731
  return client
730
732
 
731
733
 
734
+ def get_openai_async_client(api_key: str, api_base_url: str) -> Union[openai.AsyncOpenAI, openai.AsyncAzureOpenAI]:
735
+ """Get OpenAI or AzureOpenAI client based on the API Base URL"""
736
+ parsed_url = urlparse(api_base_url)
737
+ if parsed_url.hostname and parsed_url.hostname.endswith(".openai.azure.com"):
738
+ client = openai.AsyncAzureOpenAI(
739
+ api_key=api_key,
740
+ azure_endpoint=api_base_url,
741
+ api_version="2024-10-21",
742
+ )
743
+ else:
744
+ client = openai.AsyncOpenAI(
745
+ api_key=api_key,
746
+ base_url=api_base_url,
747
+ )
748
+ return client
749
+
750
+
751
+ def get_anthropic_client(api_key, api_base_url=None) -> anthropic.Anthropic | anthropic.AnthropicVertex:
752
+ api_info = get_ai_api_info(api_key, api_base_url)
753
+ if api_info.api_key:
754
+ client = anthropic.Anthropic(api_key=api_info.api_key)
755
+ else:
756
+ client = anthropic.AnthropicVertex(
757
+ region=api_info.region,
758
+ project_id=api_info.project,
759
+ credentials=api_info.credentials,
760
+ )
761
+ return client
762
+
763
+
764
+ def get_anthropic_async_client(api_key, api_base_url=None) -> anthropic.AsyncAnthropic | anthropic.AsyncAnthropicVertex:
765
+ api_info = get_ai_api_info(api_key, api_base_url)
766
+ if api_info.api_key:
767
+ client = anthropic.AsyncAnthropic(api_key=api_info.api_key)
768
+ else:
769
+ client = anthropic.AsyncAnthropicVertex(
770
+ region=api_info.region,
771
+ project_id=api_info.project,
772
+ credentials=api_info.credentials,
773
+ )
774
+ return client
775
+
776
+
777
+ def get_gemini_client(api_key, api_base_url=None) -> genai.Client:
778
+ api_info = get_ai_api_info(api_key, api_base_url)
779
+ return genai.Client(
780
+ location=api_info.region,
781
+ project=api_info.project,
782
+ credentials=api_info.credentials,
783
+ api_key=api_info.api_key,
784
+ vertexai=api_info.api_key is None,
785
+ )
786
+
787
+
732
788
  def normalize_email(email: str, check_deliverability=False) -> tuple[str, bool]:
733
789
  """Normalize, validate and check deliverability of email address"""
734
790
  lower_email = email.lower()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: khoj
3
- Version: 1.40.1.dev20
3
+ Version: 1.40.1.dev28
4
4
  Summary: Your Second Brain
5
5
  Project-URL: Homepage, https://khoj.dev
6
6
  Project-URL: Documentation, https://docs.khoj.dev
@@ -11,7 +11,7 @@ khoj/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  khoj/database/admin.py,sha256=yX_g1CUpEijnufIgTdefUfiakmd3MB3GSYwKfZo-Cms,13206
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=UNwbiA9FX6oPOUtPEELH29FGJHXTJQomiGImPCGRx4s,77934
14
+ khoj/database/adapters/__init__.py,sha256=t0jRbQRLbRrETOYe7lJ2bZRIP8zKwl_YcaPOtTvstkY,77999
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=6QXJttG58gpU7vZApQEeEPVNAuhjU2xa6_BwJsfz320,4877
@@ -129,23 +129,23 @@ khoj/interface/compiled/chat.svg,sha256=l2JoYRRgk201adTTdvJ-buKUrc0WGfsudix5xEvt
129
129
  khoj/interface/compiled/close.svg,sha256=hQ2iFLkNzHk0_iyTrSbwnWAeXYlgA-c2Eof2Iqh76n4,417
130
130
  khoj/interface/compiled/copy-button-success.svg,sha256=byqWAYD3Pn9IOXRjOKudJ-TJbP2UESbQGvtLWazNGjY,829
131
131
  khoj/interface/compiled/copy-button.svg,sha256=05bKM2eRxksfBlAPT7yMaoNJEk85bZCxQg67EVrPeHo,669
132
- khoj/interface/compiled/index.html,sha256=a71rBBzSat6GV8ezb_skJMbhlAZPfVbYmKlsUy1jYrs,53043
133
- khoj/interface/compiled/index.txt,sha256=6ghRUh5EbqsyqmCRc2uWCXYoTTJxt_KUJFjnUS8PWRY,7616
132
+ khoj/interface/compiled/index.html,sha256=I-Pwqker-0XIosx9V7HtVdYJ-xt2flPL9RNaRykUQAk,53043
133
+ khoj/interface/compiled/index.txt,sha256=CJeTiBzd6dce31HWYsEaQteLc9eYiMCEyiMLgpY_0vg,7616
134
134
  khoj/interface/compiled/khoj.webmanifest,sha256=9wOK2BMS6xH5NKd2eaUgTLg9WepIxB2K2U33KU89LD8,2543
135
135
  khoj/interface/compiled/logo.svg,sha256=_QCKVYM4WT2Qhcf7aVFImjq_s5CwjynGXYAOgI7yf8w,8059
136
136
  khoj/interface/compiled/send.svg,sha256=VdavOWkVddcwcGcld6pdfmwfz7S91M-9O28cfeiKJkM,635
137
137
  khoj/interface/compiled/share.svg,sha256=91lwo75PvMDrgocuZQab6EQ62CxRbubh9Bhw7CWMKbg,1221
138
138
  khoj/interface/compiled/thumbs-down.svg,sha256=JGNl-DwoRmH2XFMPWwFFklmoYtKxaQbkLE3nuYKe8ZY,1019
139
139
  khoj/interface/compiled/thumbs-up.svg,sha256=yS1wxTRtiztkN-6nZciLoYQUB_KTYNPV8xFRwH2TQFw,1036
140
- khoj/interface/compiled/404/index.html,sha256=ThdMxK4me10LXTUA6Qvc1HX5jZ2XbJT_YBM3CSJ2I7I,17097
141
- khoj/interface/compiled/_next/static/cbPHN2fL-jO8972HjaRbw/_buildManifest.js,sha256=f2_nYnw25hHWQJ-39Lf5OH1u6kgdbOInyfplqgjvAV4,224
142
- khoj/interface/compiled/_next/static/cbPHN2fL-jO8972HjaRbw/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
140
+ khoj/interface/compiled/404/index.html,sha256=Q0Ctu4_k9wv71X4ZbB2YQkINZcg0t_rFfj5k3Mzq970,17097
141
+ khoj/interface/compiled/_next/static/7IDXliK3ZEqSeZICqmtPL/_buildManifest.js,sha256=f2_nYnw25hHWQJ-39Lf5OH1u6kgdbOInyfplqgjvAV4,224
142
+ khoj/interface/compiled/_next/static/7IDXliK3ZEqSeZICqmtPL/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
143
143
  khoj/interface/compiled/_next/static/chunks/1243.ea2826fb35adb15a.js,sha256=Y6ceAwyTH4HSGDvBRoBB-RVXRCzGGr8NSPcspYF5OM8,182
144
144
  khoj/interface/compiled/_next/static/chunks/133.392ae90c3b2a67f2.js,sha256=IK-mb9ZlF6uJUdU8AuXsppc99tFL8svJvZtKNZGNtcY,411
145
145
  khoj/interface/compiled/_next/static/chunks/1592.b069bdb7aaddd2eb.js,sha256=VUaP2gjX3W9tA9pOH_VIPG_2BIg7Wk1AICrfU5iHgrk,71096
146
- khoj/interface/compiled/_next/static/chunks/1915-ab4353eaca76f690.js,sha256=qArqL3leavWRcZkX4ZuWgemtKnmV6c-_yrNtMu_8SeY,11277
146
+ khoj/interface/compiled/_next/static/chunks/1915-1943ee8a628b893c.js,sha256=qArqL3leavWRcZkX4ZuWgemtKnmV6c-_yrNtMu_8SeY,11277
147
147
  khoj/interface/compiled/_next/static/chunks/2069.f060659791c0c484.js,sha256=C_oat_BkZcLOHsyJlNN_5I55fB7ee1zkkZ9FT5zOzn4,186
148
- khoj/interface/compiled/_next/static/chunks/2117-1c18aa2098982bf9.js,sha256=3KtUs1Aeno0OfsXZ2ymJ0d5HXwO2_Osq2uGIIGiDagI,123994
148
+ khoj/interface/compiled/_next/static/chunks/2117-5a41630a2bd2eae8.js,sha256=3KtUs1Aeno0OfsXZ2ymJ0d5HXwO2_Osq2uGIIGiDagI,123994
149
149
  khoj/interface/compiled/_next/static/chunks/2170.45431769330fa5b7.js,sha256=C7Puu9x18DhdR5Sh8XXvTzPdP_HTK6WhsJDNW-NoB7o,24019
150
150
  khoj/interface/compiled/_next/static/chunks/2327-64e90eab8ee88c9c.js,sha256=l3HfWbVdqcHXJ1_QGfIA6Lm6dqdXP_bsdwgXXlxsg88,127282
151
151
  khoj/interface/compiled/_next/static/chunks/3237.c4754f02f1a388cb.js,sha256=Z5iOEX0mPj-5tuoU4Bq_IjpAlyc4MURKlBoaExsULTk,177
@@ -156,9 +156,9 @@ khoj/interface/compiled/_next/static/chunks/3460.39c2b9b6a3898384.js,sha256=gehY
156
156
  khoj/interface/compiled/_next/static/chunks/4299.2aaa569416cfc208.js,sha256=3HJ8OvB9BDJW0-qCBd1eUmChoBAxaCX6R81ftWZ1CHw,21659
157
157
  khoj/interface/compiled/_next/static/chunks/4327.238d15c09a039b8b.js,sha256=mZa4Oyltc9JrokqnalRTjzcvWgX4S3i3REXiHzRYH1o,296536
158
158
  khoj/interface/compiled/_next/static/chunks/4357-d86d3401f6f6f802.js,sha256=KDM1m01Fz-vcAMfxQfYPO6SEZJVK7z4241JOCEvou6Y,45442
159
- khoj/interface/compiled/_next/static/chunks/4363-4efaf12abe696251.js,sha256=YFO-i3X2LrX9c4MgYY1kPsoRBaqVUkmfAKI62Rz2BVI,468054
159
+ khoj/interface/compiled/_next/static/chunks/4363-e6ac2203564d1a3b.js,sha256=YFO-i3X2LrX9c4MgYY1kPsoRBaqVUkmfAKI62Rz2BVI,468054
160
160
  khoj/interface/compiled/_next/static/chunks/4415.e0c0da5eedae4dd7.js,sha256=DEf8HPEstDFvBflOU0j0ilYHlVJilGcGsLgUx524FZQ,25544
161
- khoj/interface/compiled/_next/static/chunks/4447-5d44807c40355b1a.js,sha256=Uw8IrcKmVR3wba-FB9maP9i9l_kAYg59r8PN1T_ipQE,19621
161
+ khoj/interface/compiled/_next/static/chunks/4447-e038b251d626c340.js,sha256=Uw8IrcKmVR3wba-FB9maP9i9l_kAYg59r8PN1T_ipQE,19621
162
162
  khoj/interface/compiled/_next/static/chunks/4609-33aa487dff03a9fd.js,sha256=1M6QAfVZa2g2Q4jXRdSI1wjrZ4G9yKjINJt8qyTKm1A,24698
163
163
  khoj/interface/compiled/_next/static/chunks/4610.a1e7f40a759ed2aa.js,sha256=b5JDRPyQv2MsibYoK2TDT76LMAoDTRzFM-fa81mJxow,14102
164
164
  khoj/interface/compiled/_next/static/chunks/4650.41f041da0ad365ad.js,sha256=EZeckNrMc3ZUX_LexPgaeusEq-dGBNEPm7nc5nvb4OM,33902
@@ -187,12 +187,12 @@ khoj/interface/compiled/_next/static/chunks/7953.f6fc335a23efb959.js,sha256=8XIn
187
187
  khoj/interface/compiled/_next/static/chunks/8254.3145a4fbdcfdca46.js,sha256=sur8InabGfvh1HqNQhwBssc1tCPae_WKQ-efoYU1Q8A,412
188
188
  khoj/interface/compiled/_next/static/chunks/8400.c95e4e79bcd79a56.js,sha256=3SlFozKtF4DYQYPT3hB5M7VEm3e_W71kC19JgADz-3k,19864
189
189
  khoj/interface/compiled/_next/static/chunks/8515-f305779d95dd5780.js,sha256=QyTarawMADcAup6ipG9JMVnvkbkoYh0Ury2EWkflZ3o,1619194
190
- khoj/interface/compiled/_next/static/chunks/8667-adbe6017a66cef10.js,sha256=kyiAVJTylsiOPFTb63uZn_pMlk4pYhDYt_N7xL76PTM,7214
190
+ khoj/interface/compiled/_next/static/chunks/8667-8136f74e9a086fca.js,sha256=kyiAVJTylsiOPFTb63uZn_pMlk4pYhDYt_N7xL76PTM,7214
191
191
  khoj/interface/compiled/_next/static/chunks/8673.be44c4d9e4f1d084.js,sha256=jiE4xU-TbkVC4R60SIgxwdo31T9mbdVBVuhP4H60i94,18629
192
192
  khoj/interface/compiled/_next/static/chunks/8698.a088118fef40d302.js,sha256=mrK-3ZahVSF7sZij3l-PyXKxp-ccXU9orykXDc7YzsM,180
193
193
  khoj/interface/compiled/_next/static/chunks/9022.33974a513a281fd2.js,sha256=6NmDzRbI0NyTisUT04sq9M0czUqvlwZoV4E7Onp-55Q,57192
194
194
  khoj/interface/compiled/_next/static/chunks/90542734.9e6e44b1b45b30fe.js,sha256=5Ivye3p3HC-Ekf-bIPdnvmg_JtYLkCqyRPWtciOmuuo,413716
195
- khoj/interface/compiled/_next/static/chunks/9259-d8bcd9da9e80c81e.js,sha256=lZJF9qq4_MeSRsHeNPNcxkqh2vhBfag5iAxg6krHA9g,34848
195
+ khoj/interface/compiled/_next/static/chunks/9259-640fdd77408475df.js,sha256=lZJF9qq4_MeSRsHeNPNcxkqh2vhBfag5iAxg6krHA9g,34848
196
196
  khoj/interface/compiled/_next/static/chunks/9334-b22127fe2d39bc60.js,sha256=_TPWqSCbf86Ig1vIEDRLXzloZujDoxpoEWhRPUf6b5U,29065
197
197
  khoj/interface/compiled/_next/static/chunks/9433.b1b5f5d050c43e3c.js,sha256=kMVC0Gg95UqjfQXpGvi-WUSg_kYp0SN7CTPTHxHxDBk,144858
198
198
  khoj/interface/compiled/_next/static/chunks/94ca1967.1b3402358e0e1255.js,sha256=WJXEIy24FD6PNQePg-uahendJMNc03GgnVveitFeshI,1174524
@@ -205,7 +205,7 @@ khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js,sha256
205
205
  khoj/interface/compiled/_next/static/chunks/main-876327ac335776ab.js,sha256=JkQUmA9vh1B4VVGF5dbZ8Kun0AnIVUbZr5IBK90T4Zs,111290
206
206
  khoj/interface/compiled/_next/static/chunks/main-app-de1f09df97a3cfc7.js,sha256=bqnztujKItXfFBzQlaBmDZyfJpQt_M93CXOuchJfpD0,471
207
207
  khoj/interface/compiled/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
208
- khoj/interface/compiled/_next/static/chunks/webpack-639e8a9d35bd5e13.js,sha256=QSmy64I4VwSeyHlSrBW5sfepv-kKV3QbWXP_rW1NC2Y,4891
208
+ khoj/interface/compiled/_next/static/chunks/webpack-05ff3cbe22520b30.js,sha256=G13n8kfgqUZyqGZBhiu3i81vy7R1KeZZUj9DINP1_Bs,4891
209
209
  khoj/interface/compiled/_next/static/chunks/app/layout-baa6e7974e560a7a.js,sha256=7JZS2Pr995Lwu3FeQpAvheLS1Bn5w5HOFsecV2_kyQA,3880
210
210
  khoj/interface/compiled/_next/static/chunks/app/page-a4053e1bb578b2ce.js,sha256=ODjjug1NwixStALsW2Wu6RarPq_KBMnIOoKqKJ8Kapk,31218
211
211
  khoj/interface/compiled/_next/static/chunks/app/_not-found/page-0ec97c4970898f2d.js,sha256=zElhiTkdu2JqrEvJ8Lrxh4HCyfLmPllBHHWOuDtrVlw,1755
@@ -308,8 +308,8 @@ khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp,sha256=M2AW_HLpBn
308
308
  khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp,sha256=BBeRPBZkxY3-aKkMnYv5TSkxmbeMbyUH4VRIPfrWg1E,137406
309
309
  khoj/interface/compiled/_next/static/media/globe.98e105ca.webp,sha256=g3ofb8-W9GM75zIhlvQhaS8I2py9TtrovOKR3_7Jf04,514
310
310
  khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp,sha256=I_N7Yke3IOoS-0CC6XD8o0IUWG8PdPbrHmf6lpgWlZY,1380
311
- khoj/interface/compiled/agents/index.html,sha256=Dpr_lcPus9VjOiecyei-a82W1QWkEWdTucXQSkF1rnk,16224
312
- khoj/interface/compiled/agents/index.txt,sha256=zIZUCghWZ4HqKdQ7i4zmBuX8Z_LpkmHZMzNeRb5csHA,7220
311
+ khoj/interface/compiled/agents/index.html,sha256=ixNlMvNClx7Te-35UQHigP5TMmt_KfftZL134v0SayQ,16224
312
+ khoj/interface/compiled/agents/index.txt,sha256=-7vnorz_ScyIdqJxusNEadyQdih5Nkw37Lr8qYSfY58,7220
313
313
  khoj/interface/compiled/assets/icons/khoj_lantern.ico,sha256=eggu-B_v3z1R53EjOFhIqqPnICBGdoaw1xnc0NrzHck,174144
314
314
  khoj/interface/compiled/assets/icons/khoj_lantern.svg,sha256=I_8XP5X84gEOoCRhCRKOQn_GKZrz3SUBXct7WxHvY7c,8767
315
315
  khoj/interface/compiled/assets/icons/khoj_lantern_1200x1200.png,sha256=xDx0bbD-WMflgg8zck9oPIIuTIvywtuED2k7CjSQS4w,66194
@@ -324,16 +324,16 @@ khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png,sha256=i
324
324
  khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png,sha256=Dd4fPwtFl6BWqnHjeb1mCK_ND0hhHsWtx8sNE7EiMuE,406179
325
325
  khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png,sha256=DEDaNRCkfEWUeh3kYZWIQDTVK1a6KKnYdwj5ZWisN_Q,82985
326
326
  khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png,sha256=Ma3blirRmq3X4oYSsDbbT7MDn29rymDrjwmUfA9BMuM,236285
327
- khoj/interface/compiled/automations/index.html,sha256=3cqwpqfvK8t17tQ09ba0lnpWfuCzgsZN-KKepwKsOpA,54094
328
- khoj/interface/compiled/automations/index.txt,sha256=fvPEpI5SbpuezhR1VW4UskVtoenCujbDejumCGXHrBk,7449
329
- khoj/interface/compiled/chat/index.html,sha256=tWBOBrueIaVJSIaWgLCU827KmQYyMVs9piLEBn_NVEY,53222
330
- khoj/interface/compiled/chat/index.txt,sha256=4axA7PoUYSTaKu3TFzQygJMSled9JXlu4Xz-89ulmqU,7858
331
- khoj/interface/compiled/search/index.html,sha256=MkjQxJoqwJDTevG0OLLUSHHQh7dLbYQ9bLv2-sH3g4U,55304
332
- khoj/interface/compiled/search/index.txt,sha256=Jr_cZv9HiyKR198dm6a5jAHS-rhH5O9b0ns4Jqaq120,6567
333
- khoj/interface/compiled/settings/index.html,sha256=CsRa_7TNnD3lEa_kG478j673UYcprsQpouirilJa7wY,52743
334
- khoj/interface/compiled/settings/index.txt,sha256=VEyrmN51u0EG8Lx93H4XIkDm_Px4YlJWUuaGiV1BYmE,7703
335
- khoj/interface/compiled/share/chat/index.html,sha256=SnVYp4bGRnbvHpEP5cR1zfWDGgb8IU_NKnoi8jzWqUk,53802
336
- khoj/interface/compiled/share/chat/index.txt,sha256=rYpr26V5VGJ2PUT1-O7vunP71KBtmjql0k0nRR8u16Y,8320
327
+ khoj/interface/compiled/automations/index.html,sha256=fKUbhNslaD22-njdNSu0LU4PDpJtsHtWXFM2oTB71fI,54094
328
+ khoj/interface/compiled/automations/index.txt,sha256=9R6SUHJJHOR6sxDMsXFf6cfo-xGsfKA7biXggDjKe38,7449
329
+ khoj/interface/compiled/chat/index.html,sha256=uO1HpoB-l-QmzQbXJGh-UntvmbmR_xK0PQiEeG8-tAk,53222
330
+ khoj/interface/compiled/chat/index.txt,sha256=2hLxSkX2awdEHeU_pFqLk_KRIubogLxAY8hTpN5PYDc,7858
331
+ khoj/interface/compiled/search/index.html,sha256=oo2Yse13VT46PY0b549PcjUoRuqwhEJDPn71S_IdPsY,55304
332
+ khoj/interface/compiled/search/index.txt,sha256=22XMQB5nrAU5-gjc1jAJOHmXEd594lDHWbIHmU7SMm4,6567
333
+ khoj/interface/compiled/settings/index.html,sha256=JNg-Gr9JyQsZwEIDs7PezHb2cvWuPSoZas2336bUSQk,52743
334
+ khoj/interface/compiled/settings/index.txt,sha256=NmMZZlNAnZB5rAEjJN8lhgCJ1mZ3SRO3r0R1BwLQ6uk,7703
335
+ khoj/interface/compiled/share/chat/index.html,sha256=Skovj8GJEvUAIDPei4uwsR_Uum9aHIAfXgxUNIVAf5w,53802
336
+ khoj/interface/compiled/share/chat/index.txt,sha256=HMaVKsprDPC1gcOAwSJPYpV5URU-A5PHAQ1BtGlCwoM,8320
337
337
  khoj/interface/email/feedback.html,sha256=xksuPFamx4hGWyTTxZKRgX_eiYQQEuv-eK9Xmkt-nwU,1216
338
338
  khoj/interface/email/magic_link.html,sha256=372ESbTPKM9acekuZcOIKOw6kBl-KikFg_L9MOHqJkg,2094
339
339
  khoj/interface/email/task.html,sha256=tY7a0gzVeQ2lSQNu7WyXR_s7VYeWTrxWEj1iHVuoVE4,2813
@@ -386,20 +386,20 @@ khoj/processor/content/plaintext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
386
386
  khoj/processor/content/plaintext/plaintext_to_entries.py,sha256=wFZwK_zIc7gWbRtO9sOHo9KvfhGAzL9psX_nKWYFduo,4975
387
387
  khoj/processor/conversation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
388
388
  khoj/processor/conversation/prompts.py,sha256=7-m6lRCK2iMgABqwJ-z_0LcZYaoVaTUmirrYKf1nOA0,57339
389
- khoj/processor/conversation/utils.py,sha256=au1hpP6oCLoP7hYYtYFfUO2fgx910aQ6Elmshd4YjCE,34013
389
+ khoj/processor/conversation/utils.py,sha256=RfJOBKR610e1ImZgDhziyMRant3m4gh2WNRzr1CQyos,32746
390
390
  khoj/processor/conversation/anthropic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
391
- khoj/processor/conversation/anthropic/anthropic_chat.py,sha256=b38Lzv-TemziLPTgvTKC8VGTMx_zUkcPKPA3IRbz4m8,8954
392
- khoj/processor/conversation/anthropic/utils.py,sha256=IeaEnIvYuFhPJo1E2ZSnkewgqvkYCKy67mEygH8FSVI,9863
391
+ khoj/processor/conversation/anthropic/anthropic_chat.py,sha256=0I29TpLAJFcM5bL-8aaK1Hj9T2wMf9KIxNEp3nk4Nac,9284
392
+ khoj/processor/conversation/anthropic/utils.py,sha256=t9xquCGS4vDGC1bxJLcA96sh0QNKYYnf1ieXM4jf5TQ,9194
393
393
  khoj/processor/conversation/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
394
- khoj/processor/conversation/google/gemini_chat.py,sha256=y-dpR9IYWtj-zuv68Bs7v-BrlqIrP-0GxC0M33_nplE,9551
395
- khoj/processor/conversation/google/utils.py,sha256=UM_w5t134CPAIxtD9iT6jHZBw6MfYXN2ppLrCjvDOms,14510
394
+ khoj/processor/conversation/google/gemini_chat.py,sha256=SW0HMApSsTXhrZefzDG_Cj5ILD4bs-sWKVS81ES5WlU,9881
395
+ khoj/processor/conversation/google/utils.py,sha256=5-Q1Wby5nDFRzHUDU2ud69gadDlHxKdBsBhdlSOHtAY,14221
396
396
  khoj/processor/conversation/offline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
397
- khoj/processor/conversation/offline/chat_model.py,sha256=Sr0VpCipeWdEnuOQjgBo89uPZzQkQRSdTo5fm0EZTpI,11326
397
+ khoj/processor/conversation/offline/chat_model.py,sha256=ec9OcDR4HOX2uMyL4Lk4DosG29DrGD-4KrZxE9OjnO0,13510
398
398
  khoj/processor/conversation/offline/utils.py,sha256=51McImxl6u1qgRYvMt7uzsgLGSLq5SMFy74ymlNjIcc,3033
399
399
  khoj/processor/conversation/offline/whisper.py,sha256=DJI-8y8DULO2cQ49m2VOvRyIZ2TxBypc15gM8O3HuMI,470
400
400
  khoj/processor/conversation/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
401
- khoj/processor/conversation/openai/gpt.py,sha256=9AyXGBMfAhwedMlNaf5oI6WrC0T6MEiK-wc3bieV1uA,10675
402
- khoj/processor/conversation/openai/utils.py,sha256=1sPNWGm5V8FHbnLar4Dy7xXRp3D29gT_3X1cBQBXgeY,10780
401
+ khoj/processor/conversation/openai/gpt.py,sha256=6pbtYavQDV9vbLq0YL7-Dz9OCwmCh71tX_x4SA22Boo,11005
402
+ khoj/processor/conversation/openai/utils.py,sha256=qI0g4ryeq5gXcjADglHIhA243YWXbOw2t3hMDM83hHg,10798
403
403
  khoj/processor/conversation/openai/whisper.py,sha256=zoEeK1LNCg_tzP4xzYi5vRPzNPGuDGzpkrkG7d1LUn4,447
404
404
  khoj/processor/image/generate.py,sha256=FAIIsr8TIHxWxK-INNK4jJOOswBxQFyi_G4tI8NNEI8,10571
405
405
  khoj/processor/speech/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -410,14 +410,14 @@ khoj/processor/tools/run_code.py,sha256=DtenheSYbRu_iw82pHSVGJGKJqfMT69dNZ_lCLqC
410
410
  khoj/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
411
  khoj/routers/api.py,sha256=xF108KeC0F9rIspB_M8skZUvDb2ecobFCPgZ5H-Lo6o,29414
412
412
  khoj/routers/api_agents.py,sha256=aEJJnQe1yogSkKO6W3Q8Ukl-xHMnqIAx3jB4M-kGNdY,17043
413
- khoj/routers/api_chat.py,sha256=tlVTVxsnw-zXZAyjTKDzT6GPsr6HWRUSPe2px8jGtF8,52322
413
+ khoj/routers/api_chat.py,sha256=87wRMObxEgf5g77vMuV_gh4tATLiayiSHB70eXstdtE,52699
414
414
  khoj/routers/api_content.py,sha256=uLO3eir36rERkhhKU1HOdEv8KTi_z_edT9cHMCZP1W8,24578
415
415
  khoj/routers/api_model.py,sha256=H4s4TO7omUFi77H56AWjZs9-o_N-Fqq2OnaPHqR8pLM,5251
416
416
  khoj/routers/api_phone.py,sha256=p9yfc4WeMHDC0hg3aQk60a2VBy8rZPdEnz9wdJ7DzkU,2208
417
417
  khoj/routers/api_subscription.py,sha256=qnbKwA6N1TWK8Aiu1FFLka_JhbPOuwqT262NSHGZDiQ,5569
418
418
  khoj/routers/auth.py,sha256=jk2lqAS_650lQsoaOFTlZd9W_LL8HbN5zhHTZza_lqs,11258
419
419
  khoj/routers/email.py,sha256=wvr6_fpk0RuKcTPC6suI8JDZPLYzJ9hAhz_G41yZytc,3923
420
- khoj/routers/helpers.py,sha256=Z0iP3fI1I4ivmQAfNBzILeG2cQXrqZEYRQXYRckjgY0,99323
420
+ khoj/routers/helpers.py,sha256=hLmjp7cro3IEkkVMtRa1aBvqwg8GaXdOudvF3LPBN0E,99105
421
421
  khoj/routers/notion.py,sha256=g53xyYFmjr2JnuIrTW2vytbfkiK_UkoRTxqnnLSmD5o,2802
422
422
  khoj/routers/research.py,sha256=NXOkwvO4Yn4k1fIfkicklToW4JqfCloJspNgQ3xO9Dg,18702
423
423
  khoj/routers/storage.py,sha256=lao0DvsF49QleZvOdjKM98RU2cGfCJDBb7WeoI7Rr3I,2172
@@ -435,15 +435,15 @@ khoj/utils/cli.py,sha256=fI1XQYMtJzLGOKQZQ5XxFOrC8sGjK3Alnteg5U62rWI,3882
435
435
  khoj/utils/config.py,sha256=aiOkH0je8A30DAGYTHMRePrgJonFv_i07_7CdhhhcdA,1805
436
436
  khoj/utils/constants.py,sha256=-Ks8dpYDSKLA6Y_cwXLgEtn9-LXDMwnUxDNC2OhZ9W4,3353
437
437
  khoj/utils/fs_syncer.py,sha256=5nqwAZqRk3Nwhkwd8y4IomTPZQmW32GwAqyMzal5KyY,9996
438
- khoj/utils/helpers.py,sha256=2jlXi7VqfOYAxhrsouWKhlUjNsiDEQJQCd7wHcbN-Mc,27794
438
+ khoj/utils/helpers.py,sha256=D_mxXuXqwumEGFpjj1_B5fTz25rjbOPLCMFnzAkYots,29719
439
439
  khoj/utils/initialization.py,sha256=R-bM8D0QbY8g2R5o-8DsfRAnUPHIu3crPWNdg5wkaCs,15022
440
440
  khoj/utils/jsonl.py,sha256=0Ac_COqr8sLCXntzZtquxuCEVRM2c3yKeDRGhgOBRpQ,1192
441
441
  khoj/utils/models.py,sha256=Q5tcC9-z25sCiub048fLnvZ6_IIO1bcPNxt5payekk0,2009
442
442
  khoj/utils/rawconfig.py,sha256=wfZTk-Aifb-_q9Yh-NPfh9LlLTioYG-yBqrasgvo4pc,5045
443
443
  khoj/utils/state.py,sha256=axjZhnby8L3bY-N1VVoWgBH1RpFGK6U3_ZeNo1Kt7hs,1679
444
444
  khoj/utils/yaml.py,sha256=qy1Tkc61rDMesBw_Cyx2vOR6H-Hngcsm5kYfjwQBwkE,1543
445
- khoj-1.40.1.dev20.dist-info/METADATA,sha256=kMs95G_j8uUY6EFLVz2nBGXH07CFUJGzWfSMlCHFg2Y,8403
446
- khoj-1.40.1.dev20.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
447
- khoj-1.40.1.dev20.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
448
- khoj-1.40.1.dev20.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
449
- khoj-1.40.1.dev20.dist-info/RECORD,,
445
+ khoj-1.40.1.dev28.dist-info/METADATA,sha256=Oemu2TonoEHYndx7BZOXqa-psm7Z39PlSUtnrDo9dLU,8403
446
+ khoj-1.40.1.dev28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
447
+ khoj-1.40.1.dev28.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
448
+ khoj-1.40.1.dev28.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
449
+ khoj-1.40.1.dev28.dist-info/RECORD,,