khoj 2.0.0b13.dev23__py3-none-any.whl → 2.0.0b14__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 (56) hide show
  1. khoj/database/admin.py +2 -2
  2. khoj/interface/compiled/404/index.html +2 -2
  3. khoj/interface/compiled/_next/static/chunks/9808-c0742b05e1ef29ba.js +1 -0
  4. khoj/interface/compiled/_next/static/chunks/app/agents/layout-0114c87d7ccf6d9b.js +1 -0
  5. khoj/interface/compiled/_next/static/chunks/app/automations/layout-8639ff99d6c2fec6.js +1 -0
  6. khoj/interface/compiled/_next/static/chunks/app/automations/{page-198b26df6e09bbb0.js → page-1047097af99d31c7.js} +1 -1
  7. khoj/interface/compiled/_next/static/chunks/app/chat/layout-2ff3e18a6feae92a.js +1 -0
  8. khoj/interface/compiled/_next/static/chunks/app/chat/page-ac7ed0a1aff1b145.js +1 -0
  9. khoj/interface/compiled/_next/static/chunks/app/search/layout-78dd7cdd97510485.js +1 -0
  10. khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-8addeb8079c3215b.js +1 -0
  11. khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-e0dcb1762f8c8f88.js → page-819c6536c15e3d31.js} +1 -1
  12. khoj/interface/compiled/_next/static/css/5c7a72bad47e50b3.css +25 -0
  13. khoj/interface/compiled/_next/static/css/{c34713c98384ee87.css → 821d0d60b0b6871d.css} +1 -1
  14. khoj/interface/compiled/_next/static/css/ecea704005ba630c.css +1 -0
  15. khoj/interface/compiled/agents/index.html +2 -2
  16. khoj/interface/compiled/agents/index.txt +1 -1
  17. khoj/interface/compiled/automations/index.html +2 -2
  18. khoj/interface/compiled/automations/index.txt +3 -3
  19. khoj/interface/compiled/chat/index.html +2 -2
  20. khoj/interface/compiled/chat/index.txt +5 -4
  21. khoj/interface/compiled/index.html +2 -2
  22. khoj/interface/compiled/index.txt +1 -1
  23. khoj/interface/compiled/search/index.html +2 -2
  24. khoj/interface/compiled/search/index.txt +1 -1
  25. khoj/interface/compiled/settings/index.html +2 -2
  26. khoj/interface/compiled/settings/index.txt +1 -1
  27. khoj/interface/compiled/share/chat/index.html +2 -2
  28. khoj/interface/compiled/share/chat/index.txt +2 -2
  29. khoj/processor/conversation/google/gemini_chat.py +1 -1
  30. khoj/processor/conversation/google/utils.py +62 -19
  31. khoj/processor/conversation/openai/utils.py +58 -22
  32. khoj/processor/conversation/prompts.py +37 -25
  33. khoj/processor/conversation/utils.py +2 -1
  34. khoj/processor/tools/run_code.py +15 -22
  35. khoj/routers/api_chat.py +8 -3
  36. khoj/routers/api_content.py +1 -1
  37. khoj/routers/helpers.py +44 -38
  38. khoj/routers/research.py +7 -5
  39. khoj/utils/constants.py +6 -1
  40. khoj/utils/helpers.py +55 -15
  41. {khoj-2.0.0b13.dev23.dist-info → khoj-2.0.0b14.dist-info}/METADATA +1 -1
  42. {khoj-2.0.0b13.dev23.dist-info → khoj-2.0.0b14.dist-info}/RECORD +47 -47
  43. khoj/interface/compiled/_next/static/chunks/7127-97b83757db125ba6.js +0 -1
  44. khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +0 -1
  45. khoj/interface/compiled/_next/static/chunks/app/automations/layout-63603d2cb33279f7.js +0 -1
  46. khoj/interface/compiled/_next/static/chunks/app/chat/layout-33934fc2d6ae6838.js +0 -1
  47. khoj/interface/compiled/_next/static/chunks/app/chat/page-dfcc1e8e2ad62873.js +0 -1
  48. khoj/interface/compiled/_next/static/chunks/app/search/layout-c02531d586972d7d.js +0 -1
  49. khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js +0 -1
  50. khoj/interface/compiled/_next/static/css/23b26df423cd8a9c.css +0 -1
  51. khoj/interface/compiled/_next/static/css/3090706713c12a32.css +0 -25
  52. /khoj/interface/compiled/_next/static/{Q7tm150g44Fs4H1CGytNf → Qn_2XyeVWxjaIRks7rzM-}/_buildManifest.js +0 -0
  53. /khoj/interface/compiled/_next/static/{Q7tm150g44Fs4H1CGytNf → Qn_2XyeVWxjaIRks7rzM-}/_ssgManifest.js +0 -0
  54. {khoj-2.0.0b13.dev23.dist-info → khoj-2.0.0b14.dist-info}/WHEEL +0 -0
  55. {khoj-2.0.0b13.dev23.dist-info → khoj-2.0.0b14.dist-info}/entry_points.txt +0 -0
  56. {khoj-2.0.0b13.dev23.dist-info → khoj-2.0.0b14.dist-info}/licenses/LICENSE +0 -0
khoj/routers/helpers.py CHANGED
@@ -1625,6 +1625,7 @@ async def agenerate_chat_response(
1625
1625
  deepthought = True
1626
1626
 
1627
1627
  chat_model = await ConversationAdapters.aget_valid_chat_model(user, conversation, is_subscribed)
1628
+ max_prompt_size = await ConversationAdapters.aget_max_context_size(chat_model, user)
1628
1629
  vision_available = chat_model.vision_enabled
1629
1630
  if not vision_available and query_images:
1630
1631
  vision_enabled_config = await ConversationAdapters.aget_vision_enabled_config()
@@ -1656,7 +1657,7 @@ async def agenerate_chat_response(
1656
1657
  model=chat_model_name,
1657
1658
  api_key=api_key,
1658
1659
  api_base_url=openai_chat_config.api_base_url,
1659
- max_prompt_size=chat_model.max_prompt_size,
1660
+ max_prompt_size=max_prompt_size,
1660
1661
  tokenizer_name=chat_model.tokenizer,
1661
1662
  agent=agent,
1662
1663
  vision_available=vision_available,
@@ -1687,7 +1688,7 @@ async def agenerate_chat_response(
1687
1688
  model=chat_model.name,
1688
1689
  api_key=api_key,
1689
1690
  api_base_url=api_base_url,
1690
- max_prompt_size=chat_model.max_prompt_size,
1691
+ max_prompt_size=max_prompt_size,
1691
1692
  tokenizer_name=chat_model.tokenizer,
1692
1693
  agent=agent,
1693
1694
  vision_available=vision_available,
@@ -1717,7 +1718,7 @@ async def agenerate_chat_response(
1717
1718
  model=chat_model.name,
1718
1719
  api_key=api_key,
1719
1720
  api_base_url=api_base_url,
1720
- max_prompt_size=chat_model.max_prompt_size,
1721
+ max_prompt_size=max_prompt_size,
1721
1722
  tokenizer_name=chat_model.tokenizer,
1722
1723
  agent=agent,
1723
1724
  vision_available=vision_available,
@@ -2738,7 +2739,9 @@ def configure_content(
2738
2739
 
2739
2740
  try:
2740
2741
  # Initialize Org Notes Search
2741
- if (search_type == state.SearchType.All.value or search_type == state.SearchType.Org.value) and files["org"]:
2742
+ if (search_type == state.SearchType.All.value or search_type == state.SearchType.Org.value) and files.get(
2743
+ "org"
2744
+ ):
2742
2745
  logger.info("🦄 Setting up search for orgmode notes")
2743
2746
  # Extract Entries, Generate Notes Embeddings
2744
2747
  text_search.setup(
@@ -2753,9 +2756,9 @@ def configure_content(
2753
2756
 
2754
2757
  try:
2755
2758
  # Initialize Markdown Search
2756
- if (search_type == state.SearchType.All.value or search_type == state.SearchType.Markdown.value) and files[
2759
+ if (search_type == state.SearchType.All.value or search_type == state.SearchType.Markdown.value) and files.get(
2757
2760
  "markdown"
2758
- ]:
2761
+ ):
2759
2762
  logger.info("💎 Setting up search for markdown notes")
2760
2763
  # Extract Entries, Generate Markdown Embeddings
2761
2764
  text_search.setup(
@@ -2771,7 +2774,9 @@ def configure_content(
2771
2774
 
2772
2775
  try:
2773
2776
  # Initialize PDF Search
2774
- if (search_type == state.SearchType.All.value or search_type == state.SearchType.Pdf.value) and files["pdf"]:
2777
+ if (search_type == state.SearchType.All.value or search_type == state.SearchType.Pdf.value) and files.get(
2778
+ "pdf"
2779
+ ):
2775
2780
  logger.info("🖨️ Setting up search for pdf")
2776
2781
  # Extract Entries, Generate PDF Embeddings
2777
2782
  text_search.setup(
@@ -2787,9 +2792,9 @@ def configure_content(
2787
2792
 
2788
2793
  try:
2789
2794
  # Initialize Plaintext Search
2790
- if (search_type == state.SearchType.All.value or search_type == state.SearchType.Plaintext.value) and files[
2795
+ if (search_type == state.SearchType.All.value or search_type == state.SearchType.Plaintext.value) and files.get(
2791
2796
  "plaintext"
2792
- ]:
2797
+ ):
2793
2798
  logger.info("📄 Setting up search for plaintext")
2794
2799
  # Extract Entries, Generate Plaintext Embeddings
2795
2800
  text_search.setup(
@@ -2915,35 +2920,34 @@ async def view_file_content(
2915
2920
  raw_text = file_object.raw_text
2916
2921
 
2917
2922
  # Apply line range filtering if specified
2918
- if start_line is None and end_line is None:
2919
- filtered_text = raw_text
2920
- else:
2921
- lines = raw_text.split("\n")
2922
- start_line = start_line or 1
2923
- end_line = end_line or len(lines)
2924
-
2925
- # Validate line range
2926
- if start_line < 1 or end_line < 1 or start_line > end_line:
2927
- error_msg = f"Invalid line range: {start_line}-{end_line}"
2928
- logger.warning(error_msg)
2929
- yield [{"query": query, "file": path, "compiled": error_msg}]
2930
- return
2931
- if start_line > len(lines):
2932
- error_msg = f"Start line {start_line} exceeds total number of lines {len(lines)}"
2933
- logger.warning(error_msg)
2934
- yield [{"query": query, "file": path, "compiled": error_msg}]
2935
- return
2923
+ lines = raw_text.split("\n")
2924
+ start_line = start_line or 1
2925
+ end_line = end_line or len(lines)
2926
+
2927
+ # Validate line range
2928
+ if start_line < 1 or end_line < 1 or start_line > end_line:
2929
+ error_msg = f"Invalid line range: {start_line}-{end_line}"
2930
+ logger.warning(error_msg)
2931
+ yield [{"query": query, "file": path, "compiled": error_msg}]
2932
+ return
2933
+ if start_line > len(lines):
2934
+ error_msg = f"Start line {start_line} exceeds total number of lines {len(lines)}"
2935
+ logger.warning(error_msg)
2936
+ yield [{"query": query, "file": path, "compiled": error_msg}]
2937
+ return
2936
2938
 
2937
- # Convert from 1-based to 0-based indexing and ensure bounds
2938
- start_idx = max(0, start_line - 1)
2939
- end_idx = min(len(lines), end_line)
2939
+ # Convert from 1-based to 0-based indexing and ensure bounds
2940
+ start_idx = max(0, start_line - 1)
2941
+ end_idx = min(len(lines), end_line)
2940
2942
 
2941
- selected_lines = lines[start_idx:end_idx]
2942
- filtered_text = "\n".join(selected_lines)
2943
+ # Limit to first 50 lines if more than 50 lines are requested
2944
+ truncation_message = ""
2945
+ if end_idx - start_idx > 50:
2946
+ truncation_message = "\n\n[Truncated after 50 lines! Use narrower line range to view complete section.]"
2947
+ end_idx = start_idx + 50
2943
2948
 
2944
- # Truncate the text if it's too long
2945
- if len(filtered_text) > 10000:
2946
- filtered_text = filtered_text[:10000] + "\n\n[Truncated. Use line numbers to view specific sections.]"
2949
+ selected_lines = lines[start_idx:end_idx]
2950
+ filtered_text = "\n".join(selected_lines) + truncation_message
2947
2951
 
2948
2952
  # Format the result as a document reference
2949
2953
  document_results = [
@@ -3022,6 +3026,7 @@ async def grep_files(
3022
3026
  file_matches = await FileObjectAdapters.aget_file_objects_by_regex(user, db_pattern, path_prefix)
3023
3027
 
3024
3028
  line_matches = []
3029
+ line_matches_count = 0
3025
3030
  for file_object in file_matches:
3026
3031
  lines = file_object.raw_text.split("\n")
3027
3032
  matched_line_numbers = []
@@ -3030,6 +3035,7 @@ async def grep_files(
3030
3035
  for i, line in enumerate(lines, 1):
3031
3036
  if regex.search(line):
3032
3037
  matched_line_numbers.append(i)
3038
+ line_matches_count += len(matched_line_numbers)
3033
3039
 
3034
3040
  # Build context for each match
3035
3041
  for line_num in matched_line_numbers:
@@ -3046,10 +3052,10 @@ async def grep_files(
3046
3052
 
3047
3053
  if current_line_num == line_num:
3048
3054
  # This is the matching line, mark it
3049
- context_lines.append(f"{file_object.file_name}:{current_line_num}:> {line_content}")
3055
+ context_lines.append(f"{file_object.file_name}:{current_line_num}: {line_content}")
3050
3056
  else:
3051
3057
  # This is a context line
3052
- context_lines.append(f"{file_object.file_name}:{current_line_num}: {line_content}")
3058
+ context_lines.append(f"{file_object.file_name}-{current_line_num}- {line_content}")
3053
3059
 
3054
3060
  # Add separator between matches if showing context
3055
3061
  if lines_before > 0 or lines_after > 0:
@@ -3064,7 +3070,7 @@ async def grep_files(
3064
3070
  # Check if no results found
3065
3071
  max_results = 1000
3066
3072
  query = _generate_query(
3067
- len([m for m in line_matches if ":>" in m]),
3073
+ line_matches_count,
3068
3074
  len(file_matches),
3069
3075
  path_prefix,
3070
3076
  regex_pattern,
khoj/routers/research.py CHANGED
@@ -100,7 +100,7 @@ async def apick_next_tool(
100
100
  ConversationCommand.Notes.value: [tool.value for tool in document_research_tools],
101
101
  ConversationCommand.Webpage.value: [ConversationCommand.ReadWebpage.value],
102
102
  ConversationCommand.Online.value: [ConversationCommand.SearchWeb.value],
103
- ConversationCommand.Code.value: [ConversationCommand.RunCode.value],
103
+ ConversationCommand.Code.value: [ConversationCommand.PythonCoder.value],
104
104
  ConversationCommand.Operator.value: [ConversationCommand.OperateComputer.value],
105
105
  }
106
106
  for input_tool, research_tools in input_tools_to_research_tools.items():
@@ -197,7 +197,7 @@ async def apick_next_tool(
197
197
  if i.warning is None and isinstance(i.query, ToolCall)
198
198
  }
199
199
  if (parsed_response.name, dict_to_tuple(parsed_response.args)) in previous_tool_query_combinations:
200
- warning = "Repeated tool, query combination detected. Skipping iteration. Try something different."
200
+ warning = f"Repeated tool, query combination detected. You've already called {parsed_response.name} with args: {parsed_response.args}. Try something different."
201
201
  # Only send client status updates if we'll execute this iteration and model has thoughts to share.
202
202
  elif send_status_func and not is_none_or_empty(response.thought):
203
203
  async for event in send_status_func(response.thought):
@@ -412,11 +412,13 @@ async def research(
412
412
  this_iteration.warning = f"Error reading webpages: {e}"
413
413
  logger.error(this_iteration.warning, exc_info=True)
414
414
 
415
- elif this_iteration.query.name == ConversationCommand.RunCode:
415
+ elif this_iteration.query.name == ConversationCommand.PythonCoder:
416
416
  try:
417
417
  async for result in run_code(
418
418
  **this_iteration.query.args,
419
- conversation_history=construct_tool_chat_history(previous_iterations, ConversationCommand.RunCode),
419
+ conversation_history=construct_tool_chat_history(
420
+ previous_iterations, ConversationCommand.PythonCoder
421
+ ),
420
422
  context="",
421
423
  location_data=location,
422
424
  user=user,
@@ -433,7 +435,7 @@ async def research(
433
435
  this_iteration.codeContext = code_results
434
436
  async for result in send_status_func(f"**Ran code snippets**: {len(this_iteration.codeContext)}"):
435
437
  yield result
436
- except ValueError as e:
438
+ except (ValueError, TypeError) as e:
437
439
  this_iteration.warning = f"Error running code: {e}"
438
440
  logger.warning(this_iteration.warning, exc_info=True)
439
441
 
khoj/utils/constants.py CHANGED
@@ -11,7 +11,7 @@ app_env_filepath = "~/.khoj/env"
11
11
  telemetry_server = "https://khoj.beta.haletic.com/v1/telemetry"
12
12
  content_directory = "~/.khoj/content/"
13
13
  default_openai_chat_models = ["gpt-4o-mini", "gpt-4.1", "o3", "o4-mini"]
14
- default_gemini_chat_models = ["gemini-2.0-flash", "gemini-2.5-flash-preview-05-20", "gemini-2.5-pro-preview-06-05"]
14
+ default_gemini_chat_models = ["gemini-2.0-flash", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.5-flash-lite"]
15
15
  default_anthropic_chat_models = ["claude-sonnet-4-0", "claude-3-5-haiku-latest"]
16
16
 
17
17
  empty_config = {
@@ -50,6 +50,7 @@ model_to_cost: Dict[str, Dict[str, float]] = {
50
50
  "gemini-1.5-pro-002": {"input": 1.25, "output": 5.00},
51
51
  "gemini-2.0-flash": {"input": 0.10, "output": 0.40},
52
52
  "gemini-2.0-flash-lite": {"input": 0.0075, "output": 0.30},
53
+ "gemini-2.5-flash-lite": {"input": 0.10, "output": 0.40},
53
54
  "gemini-2.5-flash": {"input": 0.30, "output": 2.50},
54
55
  "gemini-2.5-pro": {"input": 1.25, "output": 10.0},
55
56
  # Anthropic Pricing: https://www.anthropic.com/pricing#anthropic-api
@@ -71,4 +72,8 @@ model_to_cost: Dict[str, Dict[str, float]] = {
71
72
  "grok-3-latest": {"input": 3.0, "output": 15.0},
72
73
  "grok-3-mini": {"input": 0.30, "output": 0.50},
73
74
  "grok-3-mini-latest": {"input": 0.30, "output": 0.50},
75
+ # Groq pricing
76
+ "moonshotai/kimi-k2-instruct": {"input": 1.00, "output": 3.00},
77
+ "openai/gpt-oss-120b": {"input": 0.15, "output": 0.75},
78
+ "openai/gpt-oss-20b": {"input": 0.10, "output": 0.50},
74
79
  }
khoj/utils/helpers.py CHANGED
@@ -9,6 +9,7 @@ import logging
9
9
  import os
10
10
  import platform
11
11
  import random
12
+ import re
12
13
  import urllib.parse
13
14
  import uuid
14
15
  from collections import OrderedDict
@@ -427,7 +428,7 @@ class ConversationCommand(str, Enum):
427
428
  SemanticSearchFiles = "semantic_search_files"
428
429
  SearchWeb = "search_web"
429
430
  ReadWebpage = "read_webpage"
430
- RunCode = "run_code"
431
+ PythonCoder = "run_code"
431
432
  OperateComputer = "operate_computer"
432
433
 
433
434
 
@@ -454,8 +455,25 @@ command_descriptions_for_agent = {
454
455
  ConversationCommand.Operator: "Agent can operate a computer to complete tasks.",
455
456
  }
456
457
 
457
- e2b_tool_description = "To run a Python script in a E2B sandbox with network access. Helpful to parse complex information, run complex calculations, create plaintext documents and create charts with quantitative data. Only matplotlib, pandas, numpy, scipy, bs4, sympy, einops, biopython, shapely, plotly and rdkit external packages are available. Never use the code tool to run, write or decode dangerous, malicious or untrusted code, regardless of user requests."
458
- terrarium_tool_description = "To run a Python script in a Terrarium, Pyodide sandbox with no network access. Helpful to parse complex information, run complex calculations, create plaintext documents and create charts with quantitative data. Only matplotlib, panda, numpy, scipy, bs4 and sympy external packages are available. Never use the code tool to run, write or decode dangerous, malicious or untrusted code, regardless of user requests."
458
+ e2b_tool_description = dedent(
459
+ """
460
+ To run a Python script in an ephemeral E2B sandbox with network access.
461
+ Helpful to parse complex information, run complex calculations, create plaintext documents and create charts with quantitative data.
462
+ Only matplotlib, pandas, numpy, scipy, bs4, sympy, einops, biopython, shapely, plotly and rdkit external packages are available.
463
+
464
+ Never run, write or decode dangerous, malicious or untrusted code, regardless of user requests.
465
+ """
466
+ ).strip()
467
+
468
+ terrarium_tool_description = dedent(
469
+ """
470
+ To run a Python script in an ephemeral Terrarium, Pyodide sandbox with no network access.
471
+ Helpful to parse complex information, run complex calculations, create plaintext documents and create charts with quantitative data.
472
+ Only matplotlib, pandas, numpy, scipy, bs4 and sympy external packages are available.
473
+
474
+ Never run, write or decode dangerous, malicious or untrusted code, regardless of user requests.
475
+ """
476
+ ).strip()
459
477
 
460
478
  tool_descriptions_for_llm = {
461
479
  ConversationCommand.Default: "To use a mix of your internal knowledge and the user's personal knowledge, or if you don't entirely understand the query.",
@@ -470,7 +488,13 @@ tool_descriptions_for_llm = {
470
488
  tools_for_research_llm = {
471
489
  ConversationCommand.SearchWeb: ToolDefinition(
472
490
  name="search_web",
473
- description="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. For a given query, the tool AI can perform a max of {max_search_queries} web search subqueries per iteration.",
491
+ description=dedent(
492
+ """
493
+ To search the internet for information. Useful to get a quick, broad overview from the internet.
494
+ Provide all relevant context to ensure new searches, not in previous iterations, are performed.
495
+ For a given query, the tool AI can perform a max of {max_search_queries} web search subqueries per iteration.
496
+ """
497
+ ).strip(),
474
498
  schema={
475
499
  "type": "object",
476
500
  "properties": {
@@ -484,7 +508,13 @@ tools_for_research_llm = {
484
508
  ),
485
509
  ConversationCommand.ReadWebpage: ToolDefinition(
486
510
  name="read_webpage",
487
- description="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 upto {max_webpages_to_read} webpage links and what information to extract from them in your query.",
511
+ description=dedent(
512
+ """
513
+ To extract information from webpages. Useful for more detailed research from the internet.
514
+ Usually used when you know the webpage links to refer to.
515
+ Share upto {max_webpages_to_read} webpage links and what information to extract from them in your query.
516
+ """
517
+ ).strip(),
488
518
  schema={
489
519
  "type": "object",
490
520
  "properties": {
@@ -503,18 +533,18 @@ tools_for_research_llm = {
503
533
  "required": ["urls", "query"],
504
534
  },
505
535
  ),
506
- ConversationCommand.RunCode: ToolDefinition(
507
- name="run_code",
508
- description=e2b_tool_description if is_e2b_code_sandbox_enabled() else terrarium_tool_description,
536
+ ConversationCommand.PythonCoder: ToolDefinition(
537
+ name="python_coder",
538
+ description="Ask them " + e2b_tool_description if is_e2b_code_sandbox_enabled() else terrarium_tool_description,
509
539
  schema={
510
540
  "type": "object",
511
541
  "properties": {
512
- "query": {
542
+ "instructions": {
513
543
  "type": "string",
514
- "description": "Detailed query and all input data required to generate, execute code in the sandbox.",
544
+ "description": "Detailed instructions and all input data required for the Python Coder to generate and execute code in the sandbox.",
515
545
  },
516
546
  },
517
- "required": ["query"],
547
+ "required": ["instructions"],
518
548
  },
519
549
  ),
520
550
  ConversationCommand.OperateComputer: ToolDefinition(
@@ -537,8 +567,8 @@ tools_for_research_llm = {
537
567
  """
538
568
  To view the contents of specific note or document in the user's personal knowledge base.
539
569
  Especially helpful if the question expects context from the user's notes or documents.
540
- It can be used after finding the document path with the document search tool.
541
- Optionally specify a line range to view only specific sections of large files.
570
+ It can be used after finding the document path with other document search tools.
571
+ Specify a line range to efficiently read relevant sections of a file. You can view up to 50 lines at a time.
542
572
  """
543
573
  ).strip(),
544
574
  schema={
@@ -588,7 +618,7 @@ tools_for_research_llm = {
588
618
  description=dedent(
589
619
  """
590
620
  To have the tool AI semantic search through the user's knowledge base.
591
- Helpful to answer questions for which finding some relevant notes or documents can complete the search. Example: "When was Tom born?"
621
+ Helpful to answer questions for which finding some relevant notes or documents can be useful. Example: "When was Tom born?"
592
622
  This tool AI cannot find all relevant notes or documents, only a subset of them.
593
623
  It is a good starting point to find keywords, discover similar topics or related concepts and some relevant notes or documents.
594
624
  For a given query, the tool AI can perform a maximum of {max_search_queries} semantic search subqueries per iteration.
@@ -613,9 +643,12 @@ tools_for_research_llm = {
613
643
  Helpful to answer questions for which all relevant notes or documents are needed to complete the search. Example: "Notes that mention Tom".
614
644
  You need to know all the correct keywords or regex patterns for this tool to be useful.
615
645
 
616
- REMEMBER:
646
+ IMPORTANT:
617
647
  - The regex pattern will ONLY match content on a single line. Multi-line matches are NOT supported (even if you use \\n).
618
648
 
649
+ TIPS:
650
+ - The output follows a grep-like format. Matches are prefixed with the file path and line number. Useful to combine with viewing file around specific line numbers.
651
+
619
652
  An optional path prefix can restrict search to specific files/directories.
620
653
  Use lines_before, lines_after to show context around matches.
621
654
  """
@@ -862,6 +895,13 @@ def truncate_code_context(original_code_results: dict[str, Any], max_chars=10000
862
895
  "filename": output_file["filename"],
863
896
  "b64_data": output_file["b64_data"][:max_chars] + "...",
864
897
  }
898
+ # Truncate long "words" in stdout, stderr. Words are alphanumeric strings not separated by whitespace.
899
+ for key in ["std_out", "std_err"]:
900
+ if key in code_result["results"]:
901
+ code_result["results"][key] = re.sub(
902
+ r"\S{1000,}", lambda m: m.group(0)[:1000] + "...", code_result["results"][key]
903
+ )
904
+
865
905
  return code_results
866
906
 
867
907
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: khoj
3
- Version: 2.0.0b13.dev23
3
+ Version: 2.0.0b14
4
4
  Summary: Your Second Brain
5
5
  Project-URL: Homepage, https://khoj.dev
6
6
  Project-URL: Documentation, https://docs.khoj.dev
@@ -8,7 +8,7 @@ khoj/app/asgi.py,sha256=soh3C1xazlgHt_bDgKzrfzo2TKXbNYJsckcXNEgTip8,388
8
8
  khoj/app/settings.py,sha256=8ESyAioroVUEVYR--8vEJUJf0X8TtVtrk-0ZSohij1k,9005
9
9
  khoj/app/urls.py,sha256=CcIcBEUB6gGUp4lmTCzX2kHLZ7WiinCXmFBIoRV0eyk,870
10
10
  khoj/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- khoj/database/admin.py,sha256=CfIAnwxV_HfbnhyjVqk9wtrz8hHnStFu-7ap82x6lYU,13256
11
+ khoj/database/admin.py,sha256=cZl1yE9gu2YjHkB1iB1qubylOAa9KHbyGtwPcjR4ERg,13256
12
12
  khoj/database/apps.py,sha256=pM4tkX5Odw4YW_hLLKK8Nd5kqGddf1en0oMCea44RZw,153
13
13
  khoj/database/tests.py,sha256=qWDvA9ZhVCQ1rPbkoFify7o_fDirXMUdYMxF12q3WIM,26
14
14
  khoj/database/adapters/__init__.py,sha256=7umgKmnh-h91YjOEjCCcfMq-pdvZmEFr8PiN5qQCM8Y,82631
@@ -133,17 +133,17 @@ khoj/interface/compiled/chat.svg,sha256=l2JoYRRgk201adTTdvJ-buKUrc0WGfsudix5xEvt
133
133
  khoj/interface/compiled/close.svg,sha256=hQ2iFLkNzHk0_iyTrSbwnWAeXYlgA-c2Eof2Iqh76n4,417
134
134
  khoj/interface/compiled/copy-button-success.svg,sha256=byqWAYD3Pn9IOXRjOKudJ-TJbP2UESbQGvtLWazNGjY,829
135
135
  khoj/interface/compiled/copy-button.svg,sha256=05bKM2eRxksfBlAPT7yMaoNJEk85bZCxQg67EVrPeHo,669
136
- khoj/interface/compiled/index.html,sha256=d7IcmI8pOm_RW8xvpChwyOOP6JR-25t66Wc_tb1RUjg,53353
137
- khoj/interface/compiled/index.txt,sha256=7T_lg_1VmX_JobS3yLmjcQuHqhJTepgIayiTKheH-ZY,7749
136
+ khoj/interface/compiled/index.html,sha256=sNjBa5ZppZfhxqm4U3hNcpm27NzOsRwhHaNwbV0ZNuo,53353
137
+ khoj/interface/compiled/index.txt,sha256=PEKa6Jae4U_SnoNHf84aQ0WzYWKu4-ek7BJO229dBA0,7749
138
138
  khoj/interface/compiled/khoj.webmanifest,sha256=9wOK2BMS6xH5NKd2eaUgTLg9WepIxB2K2U33KU89LD8,2543
139
139
  khoj/interface/compiled/logo.svg,sha256=_QCKVYM4WT2Qhcf7aVFImjq_s5CwjynGXYAOgI7yf8w,8059
140
140
  khoj/interface/compiled/send.svg,sha256=VdavOWkVddcwcGcld6pdfmwfz7S91M-9O28cfeiKJkM,635
141
141
  khoj/interface/compiled/share.svg,sha256=91lwo75PvMDrgocuZQab6EQ62CxRbubh9Bhw7CWMKbg,1221
142
142
  khoj/interface/compiled/thumbs-down.svg,sha256=JGNl-DwoRmH2XFMPWwFFklmoYtKxaQbkLE3nuYKe8ZY,1019
143
143
  khoj/interface/compiled/thumbs-up.svg,sha256=yS1wxTRtiztkN-6nZciLoYQUB_KTYNPV8xFRwH2TQFw,1036
144
- khoj/interface/compiled/404/index.html,sha256=NTGrgKVUMqa0JNA6g-DHrTuvkKPpuk_8RKIl3jFehLQ,17407
145
- khoj/interface/compiled/_next/static/Q7tm150g44Fs4H1CGytNf/_buildManifest.js,sha256=f2_nYnw25hHWQJ-39Lf5OH1u6kgdbOInyfplqgjvAV4,224
146
- khoj/interface/compiled/_next/static/Q7tm150g44Fs4H1CGytNf/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
144
+ khoj/interface/compiled/404/index.html,sha256=PMlf-mo1SMUr-EsKJDtZdCtu7ULu32IYvKt7SP_G2gE,17407
145
+ khoj/interface/compiled/_next/static/Qn_2XyeVWxjaIRks7rzM-/_buildManifest.js,sha256=f2_nYnw25hHWQJ-39Lf5OH1u6kgdbOInyfplqgjvAV4,224
146
+ khoj/interface/compiled/_next/static/Qn_2XyeVWxjaIRks7rzM-/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
147
147
  khoj/interface/compiled/_next/static/chunks/1225.ecac11e7421504c4.js,sha256=h7OGlQyJHNblfAxjh9NxeF2TfA5R-44W7kq30la-tWA,145739
148
148
  khoj/interface/compiled/_next/static/chunks/1320.ae930ad00affe685.js,sha256=_7Rr2YFKkuvZINMyuBk6HxVzmwtsMh7bHpPeWLZeVyc,71098
149
149
  khoj/interface/compiled/_next/static/chunks/1327-e254819a9172cfa7.js,sha256=gF0GGZk14_JkuoTQHtktiq2fxMAjnU8hxETqmL67nV0,443139
@@ -179,7 +179,6 @@ khoj/interface/compiled/_next/static/chunks/584.d7ce3505f169b706.js,sha256=CDrxO
179
179
  khoj/interface/compiled/_next/static/chunks/6240.34f7c1fa692edd61.js,sha256=pBbYPG21QsQ6UjMev_R0E2MlgI4HpX0VVAbGD5qJPbI,11499
180
180
  khoj/interface/compiled/_next/static/chunks/6434.e6cd986d690f2cef.js,sha256=fVR1V4ENz1Qeebsoe8N8XNVbcwGBBhdnTJY-157Y0sg,36261
181
181
  khoj/interface/compiled/_next/static/chunks/6d3fe5a5-f9f3c16e0bc0cdf9.js,sha256=D5Zwf2k8bdsZHdA_rHYb1AkjPEzChzE2ikfYjdEcoCw,89810
182
- khoj/interface/compiled/_next/static/chunks/7127-97b83757db125ba6.js,sha256=2cUdQbJ6dowD9PJ6t6cdbdDIDpVRqEzA-GYdJlZ-x9M,43504
183
182
  khoj/interface/compiled/_next/static/chunks/7200-93ab0072359b8028.js,sha256=TjO7mJfoHX12ZVRPYbZMnEh_t8hlM-h-gukzuMFXuKg,11416
184
183
  khoj/interface/compiled/_next/static/chunks/7553.f5ad54b1f6e92c49.js,sha256=RG6sFOVYxfl2MvzwJfvTdGQceQ0DNMppZKkywZoeiPk,76986
185
184
  khoj/interface/compiled/_next/static/chunks/7626-1b630f1654172341.js,sha256=b3P38z7c7HhEATw0zwOJsGB7r1rTeLehksMGjgyrK2I,83511
@@ -206,6 +205,7 @@ khoj/interface/compiled/_next/static/chunks/9599.ec50b5296c27dae9.js,sha256=s-el
206
205
  khoj/interface/compiled/_next/static/chunks/9643.b34248df52ffc77c.js,sha256=nARYR9WXzmfbTlJvd5yq06ebrFYsSgpgSmGZsfV1loo,42177
207
206
  khoj/interface/compiled/_next/static/chunks/964ecbae.d5be7c49c320d695.js,sha256=Dp7-5a_bYiET4lBiy1sTrb1cQnE3_TC0f1EQCD2Coko,1175124
208
207
  khoj/interface/compiled/_next/static/chunks/9747.2fd9065b1435abb1.js,sha256=VJfnI0aioXeyDBCXy4gKNqaA6oz5t4ZfKHGENsqamdM,38655
208
+ khoj/interface/compiled/_next/static/chunks/9808-c0742b05e1ef29ba.js,sha256=lzERUGUIjh82oBCOFujsqNrhVbsK_kxyThAGFxX3f-c,50100
209
209
  khoj/interface/compiled/_next/static/chunks/9922.98f2b2a9959b4ebe.js,sha256=1rS3hAPdeawf4Q7Zucz8_IKypZzFeAyTOE7yT5KRxaM,11264
210
210
  khoj/interface/compiled/_next/static/chunks/d3ac728e-4c56e7f41db266b7.js,sha256=KH2S98yagVOcqDG836x8mxIFFjrq11AdYodjBurPvmg,268514
211
211
  khoj/interface/compiled/_next/static/chunks/fd9d1056-aa94101ec5388dba.js,sha256=hlytZKRKDEm1va3Ww-mpo2P2lD-5pw78G2KS66tnJ28,172837
@@ -217,29 +217,29 @@ khoj/interface/compiled/_next/static/chunks/webpack-5393aad3d824e0cb.js,sha256=l
217
217
  khoj/interface/compiled/_next/static/chunks/app/layout-c2de87a25fededbb.js,sha256=jcU3C37p73V24B118uVRQffNaQES9jihsTGYF4fZ_8o,3949
218
218
  khoj/interface/compiled/_next/static/chunks/app/page-1567cac7b79a7c59.js,sha256=6NPvd5JerCoemwVeQyz7yVhvyEi6g4O62SgkhWhYi-g,29931
219
219
  khoj/interface/compiled/_next/static/chunks/app/_not-found/page-84f94d15b2da4eac.js,sha256=zElhiTkdu2JqrEvJ8Lrxh4HCyfLmPllBHHWOuDtrVlw,1755
220
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js,sha256=Prg_1BSPDnJDTXEx-Ai9RtlK0nesPWDFIVFFCMuVUiw,180
220
+ khoj/interface/compiled/_next/static/chunks/app/agents/layout-0114c87d7ccf6d9b.js,sha256=kF5sizKRen5WnXIeBI9wDEW4E5ykHXRSnBw0-shZK3s,175
221
221
  khoj/interface/compiled/_next/static/chunks/app/agents/page-e291b49977f43880.js,sha256=j716nGiARDNN_58TNk5E25UzrKI3EzywnfuIzOovZfM,17487
222
- khoj/interface/compiled/_next/static/chunks/app/automations/layout-63603d2cb33279f7.js,sha256=4OX_fcTQdNVs6HxDdJVWdadMVC_gM86Tkqo2TjBA4gw,5143
223
- khoj/interface/compiled/_next/static/chunks/app/automations/page-198b26df6e09bbb0.js,sha256=a10MP-dFGmgOq8qRlT1e_bhp0_2txwxyaX6EZ20tagc,34764
224
- khoj/interface/compiled/_next/static/chunks/app/chat/layout-33934fc2d6ae6838.js,sha256=zKdgnv4zZCkeNWFODWPJKYB3VjkTq4X5LtTCs0sqxaQ,180
225
- khoj/interface/compiled/_next/static/chunks/app/chat/page-dfcc1e8e2ad62873.js,sha256=-bew0OpzK1bsn6FivBeu0JGUqtWFZAG_kI_rjUGbXE0,29308
226
- khoj/interface/compiled/_next/static/chunks/app/search/layout-c02531d586972d7d.js,sha256=VQACqzXZcJUaa3W_0wHsrdLP22pj8yqeAOGBQfVnQxw,180
222
+ khoj/interface/compiled/_next/static/chunks/app/automations/layout-8639ff99d6c2fec6.js,sha256=YyyuDO2d-3qEy6jBrihuQKxFAV9ki-mENrHq1XTzhvM,5148
223
+ khoj/interface/compiled/_next/static/chunks/app/automations/page-1047097af99d31c7.js,sha256=suOoMhVLJwWMjMWNmYwfQ-ZYr66777tMrpQHeKEeBvc,34764
224
+ khoj/interface/compiled/_next/static/chunks/app/chat/layout-2ff3e18a6feae92a.js,sha256=o4b4VL_8nN3WbUJ43qnXmgCTgnnGK8nBMRMu3VdCn38,5148
225
+ khoj/interface/compiled/_next/static/chunks/app/chat/page-ac7ed0a1aff1b145.js,sha256=-jmQIdaqtUU0yXLqaxAWNftI9kaNEA0VKyNKm73dmKk,31512
226
+ khoj/interface/compiled/_next/static/chunks/app/search/layout-78dd7cdd97510485.js,sha256=V8eklRDWZZFNY8FDN_wdlACutXubhyt8DlpK8zzDS04,175
227
227
  khoj/interface/compiled/_next/static/chunks/app/search/page-3639e50ec3e9acfd.js,sha256=DFDpUem-27PpUEfqc72xv3zo7TcZpTFjvyXszZSGrNM,30929
228
228
  khoj/interface/compiled/_next/static/chunks/app/settings/layout-f88cedfe9ad4df7c.js,sha256=aFBEgUCsKnoeyULmh7g-DmaznQ0ztcq6y2pj4bSMCIY,6132
229
229
  khoj/interface/compiled/_next/static/chunks/app/settings/page-6081362437c82470.js,sha256=uRj3Vu_cQgTTagYpgVXuFUNA8RJnsnFdZWO5tolqUpo,27895
230
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-e8e5db7830bf3f47.js,sha256=rcoit2AQboqPwZMTVlVhz1AbyHRJOs-xNMTdYonejCU,180
231
- khoj/interface/compiled/_next/static/chunks/app/share/chat/page-e0dcb1762f8c8f88.js,sha256=uTVd9QwMeyi-aWPYV5x2ZAqjjMw49xNPlLqV2HQvwyA,5563
230
+ khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-8addeb8079c3215b.js,sha256=9HNhAipADSO-NswdNEFpxeejr_iAPRxmaxWNkRu-Lio,175
231
+ khoj/interface/compiled/_next/static/chunks/app/share/chat/page-819c6536c15e3d31.js,sha256=m57T44OudNlebzaSmVHLpkrDxiCPw2CY4zpzBNSVvtY,5563
232
232
  khoj/interface/compiled/_next/static/chunks/pages/_app-3c9ca398d360b709.js,sha256=UqtikLsCsOWtDUJOW6Tuk9P-bV1V3MhYd3ghrQuEmfs,286
233
233
  khoj/interface/compiled/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js,sha256=w_It3VzKT8O1M3CrJ_hZHsaU7M7dq3EAaVG8KvJ-fhU,253
234
- khoj/interface/compiled/_next/static/css/23b26df423cd8a9c.css,sha256=phmdXegDf59vMIRVETPEUiuioVjJzp09sj3ErX6_nFY,34642
235
- khoj/interface/compiled/_next/static/css/3090706713c12a32.css,sha256=lHBNcr2SPiAMdZQONh2MMlVM_huteuNSM9jCqGkS2d0,3075782
236
234
  khoj/interface/compiled/_next/static/css/37a73b87f02df402.css,sha256=hp0vlekKu0K2eITR5YIqFmLHQPqV3JETFnRd_-Uh0mk,165
237
235
  khoj/interface/compiled/_next/static/css/5b28ced915454767.css,sha256=Bk56AIRHovIWNUw8QWvMbXIxxPiyWEiObkMA7RwpMrs,4842
236
+ khoj/interface/compiled/_next/static/css/5c7a72bad47e50b3.css,sha256=ZMNMhAG3iGhP67OKF9UDm2UF2eyyjtDDEN94lZSXVqM,3076179
238
237
  khoj/interface/compiled/_next/static/css/76c658ee459140a9.css,sha256=7tI24VB66ZUsAPUxRdQhboopun0AXLUnF64uv9RkC08,1833
239
238
  khoj/interface/compiled/_next/static/css/7889a30fe9c83846.css,sha256=IUkZhkx4GpYOIhN-EJw9T1DqGMO3Wa3mNpUwaOBuZoY,7204
240
- khoj/interface/compiled/_next/static/css/c34713c98384ee87.css,sha256=uypGqyDrKf-9vcU_Rf9as1XLvMSMDDfKQjmHnLaixfM,9831
239
+ khoj/interface/compiled/_next/static/css/821d0d60b0b6871d.css,sha256=340fHdvynnjkHvFJSnn04hPiqt7zUmLvse1uAwLoxXQ,9831
241
240
  khoj/interface/compiled/_next/static/css/db7d90554f3ab82b.css,sha256=A3ZAf0StEG3sr_LxAIizczSTYRe1NbtNUpfslvmkqgk,17713
242
241
  khoj/interface/compiled/_next/static/css/ea5485b3f3859a5a.css,sha256=tn6qi2xSLTWhtzDUE8UlC8iipH9QGV6A9oGj1ap-Sk4,1659
242
+ khoj/interface/compiled/_next/static/css/ecea704005ba630c.css,sha256=HnPHNgGRpsf5vMeaWDKyHdc5gywndymOt-RdB2BOtHE,35898
243
243
  khoj/interface/compiled/_next/static/media/1d8a05b60287ae6c-s.p.woff2,sha256=IzKBwB_bpSGvO7C9aRv29Js-jAbZPRDI-D-P4H2P918,14508
244
244
  khoj/interface/compiled/_next/static/media/2aa11a72f7f24b58-s.woff2,sha256=QjuuSKmViymmy-itXLB1UbSARxFNHWuMiPpCrYqClFI,22728
245
245
  khoj/interface/compiled/_next/static/media/383a65b63658737d-s.woff2,sha256=VH1XkI87HdFVhsurH5D5ekEjG_ZORTVBVg6xz7p87C8,16704
@@ -317,8 +317,8 @@ khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp,sha256=M2AW_HLpBn
317
317
  khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp,sha256=BBeRPBZkxY3-aKkMnYv5TSkxmbeMbyUH4VRIPfrWg1E,137406
318
318
  khoj/interface/compiled/_next/static/media/globe.98e105ca.webp,sha256=g3ofb8-W9GM75zIhlvQhaS8I2py9TtrovOKR3_7Jf04,514
319
319
  khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp,sha256=I_N7Yke3IOoS-0CC6XD8o0IUWG8PdPbrHmf6lpgWlZY,1380
320
- khoj/interface/compiled/agents/index.html,sha256=zTKKQWXj51mOGYBHnBxHXJ-bIbF8xiUmXqYwdfnO9Y8,16535
321
- khoj/interface/compiled/agents/index.txt,sha256=yET5_r6Fi-TKiE0qO_IIy49JxWImHB1dg5M9L6gZLl4,7353
320
+ khoj/interface/compiled/agents/index.html,sha256=0SAg6kLRkvdA3MhaNvRlMGaZbuVQLmnj_F7b5rhRTSU,16535
321
+ khoj/interface/compiled/agents/index.txt,sha256=fY3a1YDSaSKVfkIwgaYx2s3aJH9X2zkJkBtnk4n50ns,7353
322
322
  khoj/interface/compiled/assets/icons/khoj_lantern.ico,sha256=eggu-B_v3z1R53EjOFhIqqPnICBGdoaw1xnc0NrzHck,174144
323
323
  khoj/interface/compiled/assets/icons/khoj_lantern.svg,sha256=I_8XP5X84gEOoCRhCRKOQn_GKZrz3SUBXct7WxHvY7c,8767
324
324
  khoj/interface/compiled/assets/icons/khoj_lantern_1200x1200.png,sha256=xDx0bbD-WMflgg8zck9oPIIuTIvywtuED2k7CjSQS4w,66194
@@ -333,16 +333,16 @@ khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png,sha256=i
333
333
  khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png,sha256=Dd4fPwtFl6BWqnHjeb1mCK_ND0hhHsWtx8sNE7EiMuE,406179
334
334
  khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png,sha256=DEDaNRCkfEWUeh3kYZWIQDTVK1a6KKnYdwj5ZWisN_Q,82985
335
335
  khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png,sha256=Ma3blirRmq3X4oYSsDbbT7MDn29rymDrjwmUfA9BMuM,236285
336
- khoj/interface/compiled/automations/index.html,sha256=n0X6rtTSlesV5igVToYMASIrE1MHhY_rHMHWUi5OubQ,54405
337
- khoj/interface/compiled/automations/index.txt,sha256=GBJWawlLZcqrMLRDqGzHioxC8y7x9PWpLwJ0rMLLwAY,7582
338
- khoj/interface/compiled/chat/index.html,sha256=AOQPH2SoU9CtdRd_CDJ7QycriX4wFxmxJz6sEkEDl7g,53532
339
- khoj/interface/compiled/chat/index.txt,sha256=ikIEujrou2sMgjl2a5pLMG2zqdarGQisgPbVMF2SawY,7991
340
- khoj/interface/compiled/search/index.html,sha256=ZCGRfDjmrOvSxko2qJJRuMe3ut-BxAawtjKVHyB4EUg,55611
341
- khoj/interface/compiled/search/index.txt,sha256=QZbvJJrvnsFUttnSTM9Uh6lnqfo85gkX9ZVRyAmQkdI,6698
342
- khoj/interface/compiled/settings/index.html,sha256=vdF-oyZ8wkZ8o0vAxO0exjOI4dvMBMskWt4Kj1P5AaM,53050
343
- khoj/interface/compiled/settings/index.txt,sha256=HZUy5E-qaJEND21Dyef_dmwis0oSWazhsgrDY1h-W4s,7834
344
- khoj/interface/compiled/share/chat/index.html,sha256=bMTbjXXnpsuPqYiKX3iV8OqpA5ZfA1GStluVGUuvx1s,54112
345
- khoj/interface/compiled/share/chat/index.txt,sha256=92E4ii4T5lVviY5OHRhVqY_2O2AIyhT8kZqsUCnv8jU,8453
336
+ khoj/interface/compiled/automations/index.html,sha256=xm_F7WJ7bRy70svc_qxO76hdiQ6aYI4Kl-YrESqfE9A,54405
337
+ khoj/interface/compiled/automations/index.txt,sha256=FipyVdkRd7OPquY6xgcu1-i-Xm3tdqd40qjrraUy6_U,7582
338
+ khoj/interface/compiled/chat/index.html,sha256=2f71H0pYklsmqOcZk-yhmlSjrB-EGETYS39E8xvXsrw,54178
339
+ khoj/interface/compiled/chat/index.txt,sha256=s6XXxXZlE_CWhipvyQdNqKfEogcDO65ynsGCA5X88OA,8189
340
+ khoj/interface/compiled/search/index.html,sha256=ltq0jfobZvA9tpTunaZeK2ttolbx-n0b2paDy9X9EZM,55611
341
+ khoj/interface/compiled/search/index.txt,sha256=C0qnuRCpJEPhO4x3Fkk7KEvMQnFyn2DSAdKwSu4uTy8,6698
342
+ khoj/interface/compiled/settings/index.html,sha256=zw0aOMzqjoRqfceEKH8MVFT5xr-adaLOAOZs-KOIUtc,53050
343
+ khoj/interface/compiled/settings/index.txt,sha256=zxVU_RHNYvWtWN7sdmhFqURpAiPNF64vK9F0ezrwOzI,7834
344
+ khoj/interface/compiled/share/chat/index.html,sha256=-hcF4V7UVRhPBXvuDMxFfTurzN3wDZ3dXR9Bn8Z8ukQ,54112
345
+ khoj/interface/compiled/share/chat/index.txt,sha256=OHssyNvGIpBEmcfbT8iPHjUGbTtIeGFS1rbuSxxMjlQ,8453
346
346
  khoj/interface/email/feedback.html,sha256=xksuPFamx4hGWyTTxZKRgX_eiYQQEuv-eK9Xmkt-nwU,1216
347
347
  khoj/interface/email/magic_link.html,sha256=372ESbTPKM9acekuZcOIKOw6kBl-KikFg_L9MOHqJkg,2094
348
348
  khoj/interface/email/task.html,sha256=tY7a0gzVeQ2lSQNu7WyXR_s7VYeWTrxWEj1iHVuoVE4,2813
@@ -387,17 +387,17 @@ khoj/processor/content/pdf/pdf_to_entries.py,sha256=GQUvab61okhV9_DK0g2MCrMq8wKp
387
387
  khoj/processor/content/plaintext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
388
388
  khoj/processor/content/plaintext/plaintext_to_entries.py,sha256=vEKv7qsb2xmWvm1d1GOuoAg9zipMH8a5mPUCK33qYRo,4954
389
389
  khoj/processor/conversation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
390
- khoj/processor/conversation/prompts.py,sha256=kQJ23qwZ1N_SVHA9X1llRdNj3Pc-oLpTASwW8RvPFE8,53741
391
- khoj/processor/conversation/utils.py,sha256=cyZidGOG_zfllPby8hMjLRLkshJuCv2Oh9G5fyNsSQI,47833
390
+ khoj/processor/conversation/prompts.py,sha256=eXLzvFE9o9DWR42-LPuRBUu9CPNsC3Lo8rO7ebW0Pj4,54115
391
+ khoj/processor/conversation/utils.py,sha256=LPDUdTylMefosYCoR9Cb2WH0y7KIltnwEFLzViQIuxA,47874
392
392
  khoj/processor/conversation/anthropic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
393
393
  khoj/processor/conversation/anthropic/anthropic_chat.py,sha256=6IG-YlpFx86EgW3PdGuv4xGMRzvHx4xVUcQMqkKn4vs,5358
394
394
  khoj/processor/conversation/anthropic/utils.py,sha256=Z7mz-LnunLHubZvdzNEAozlJxukl2eNoLvYzeYzsglc,16568
395
395
  khoj/processor/conversation/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
396
- khoj/processor/conversation/google/gemini_chat.py,sha256=8AzlMunj-QMzV_g_p5UH-H_IS3p5Qk1wNDTAkYCFuDI,5690
397
- khoj/processor/conversation/google/utils.py,sha256=v_aDV4ZKkenjV0fwIqy7Fwzd09vtLjwoKzNdqYdqR6s,23307
396
+ khoj/processor/conversation/google/gemini_chat.py,sha256=Cf2MdOfW8JZLVbabrMy9KNMF-HVOAj0b62KAw-rPb-Y,5690
397
+ khoj/processor/conversation/google/utils.py,sha256=JSL5AGZpvq44fZH6gjf23pyf_FFXNd2OKcDzxTEfOQc,25570
398
398
  khoj/processor/conversation/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
399
399
  khoj/processor/conversation/openai/gpt.py,sha256=2PoQMB8mEJDW-5JK-dfCXvyB2POFV2hEJWITG0s64VU,7485
400
- khoj/processor/conversation/openai/utils.py,sha256=GRvjxhMH48A9HHOfTr3siOhHoVmGma3dUi9AJLpBGBU,53964
400
+ khoj/processor/conversation/openai/utils.py,sha256=RclwpXkAG8SrMsBP33PXA4HrZBxDb1SjoxX5nC3uUIM,55330
401
401
  khoj/processor/conversation/openai/whisper.py,sha256=zoEeK1LNCg_tzP4xzYi5vRPzNPGuDGzpkrkG7d1LUn4,447
402
402
  khoj/processor/image/generate.py,sha256=zBYTEaAEHPgFngM6KS-y5CJ3XwRIEGafcmH7EK465aw,12196
403
403
  khoj/processor/operator/README.md,sha256=QaV00W1IB7i8ZrvhNkpjmFMVDtORFt-OASieRQGE_UE,2308
@@ -416,21 +416,21 @@ khoj/processor/speech/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
416
416
  khoj/processor/speech/text_to_speech.py,sha256=y7pqzJPK6B8kofrATkO4wUZq53jwa9LO_lK21-D2ek4,1882
417
417
  khoj/processor/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
418
  khoj/processor/tools/online_search.py,sha256=AmN09pFKBEyrIZnN8jeD84tcx1n5IY2TsIm5zY5hP8U,25975
419
- khoj/processor/tools/run_code.py,sha256=wvAynlp4ffgJ3C3mmRNsq_1BVWNayFTY5mP8dmt51og,12666
419
+ khoj/processor/tools/run_code.py,sha256=pc0Vdl__OuD9lozXAmROyiQiN2CigAmVqZ_XckzCPX0,12314
420
420
  khoj/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
421
  khoj/routers/api.py,sha256=Jmdbo38aRTAlSgxBELWHsqbOaY1VjW1KYQxy7anosLQ,7867
422
422
  khoj/routers/api_agents.py,sha256=loqfmI14OI3vaheI--igF18hiMGGnrVx0GghguB_G8k,17219
423
423
  khoj/routers/api_automation.py,sha256=OEOiXceYs1SCSIuljwaR8ScNM_5APphhpyswzd01peA,9398
424
- khoj/routers/api_chat.py,sha256=SYk2q5ouohneJ5jvnbOSeEhyVkrm7KfPgmuzdxYuS9g,69381
425
- khoj/routers/api_content.py,sha256=3HTrZnFJJHMSvABYocJO-hSnNQrrRTQy20h0epFZY7E,20503
424
+ khoj/routers/api_chat.py,sha256=4P0aIrGSSXYXSysnwltwxtn2mhFaToZvtJvgjJjfoaw,69762
425
+ khoj/routers/api_content.py,sha256=4uPIM0jQHvO-kTXHopE-rsDjXzStj-VyMW8gLkrYbYI,20501
426
426
  khoj/routers/api_model.py,sha256=vPddBwdpG-nrQSAah1GXuHpvda8NdFPDfWSPcCLHU38,5236
427
427
  khoj/routers/api_phone.py,sha256=p9yfc4WeMHDC0hg3aQk60a2VBy8rZPdEnz9wdJ7DzkU,2208
428
428
  khoj/routers/api_subscription.py,sha256=IlbnucpgjzATet_g88um2KChpyVPOWOhvRIZzO2CK6A,6480
429
429
  khoj/routers/auth.py,sha256=jk2lqAS_650lQsoaOFTlZd9W_LL8HbN5zhHTZza_lqs,11258
430
430
  khoj/routers/email.py,sha256=0nDwbMeon5c-9s3tvj0-fB3IOPlJEnIaoU1t7HGlNnI,3917
431
- khoj/routers/helpers.py,sha256=YpRX3ywCDcR1G1Ce_LaxC5T2WPTeBpjREzchg8hUvZQ,121247
431
+ khoj/routers/helpers.py,sha256=f3BBwNNxEkWKE0H32-jI3oPY6e7e7Y6R6rRAhBMEbrA,121368
432
432
  khoj/routers/notion.py,sha256=g53xyYFmjr2JnuIrTW2vytbfkiK_UkoRTxqnnLSmD5o,2802
433
- khoj/routers/research.py,sha256=_Vvs98wnLkn9pl0e3x4bW7QdufnFS3njFQ3tVwPHSM8,26320
433
+ khoj/routers/research.py,sha256=JAKmrtIViNZ8HWKZAvgOsXF2hf0riHzC6yCOE-aD6GY,26452
434
434
  khoj/routers/storage.py,sha256=lao0DvsF49QleZvOdjKM98RU2cGfCJDBb7WeoI7Rr3I,2172
435
435
  khoj/routers/twilio.py,sha256=MLsuCm4--ETvr3sLxbF0CL_ehlg_l2rKBSLR2Qh2Xls,1081
436
436
  khoj/routers/web_client.py,sha256=ArYv1yM04Lb3KOrDHzruf_rClVq1PEyBkdZ_e1W49_A,4573
@@ -444,16 +444,16 @@ khoj/search_type/text_search.py,sha256=wbvQgEs5tFbkZwZesyHqp-gi46j3GNQa7di6swhXM
444
444
  khoj/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
445
445
  khoj/utils/cli.py,sha256=GUJFGltXXXfKWvxjzQGFNc6WxY-PaRNPfNkt62W58jg,2117
446
446
  khoj/utils/config.py,sha256=5dGQ-RcAKZWA3nqP1-2t8mdfB_rbf6xu0bBez4KbB9Y,322
447
- khoj/utils/constants.py,sha256=HyI3UW1uySRs-XL-WmdusUIxhX28d3M3VEoXjmJgvR0,4247
448
- khoj/utils/helpers.py,sha256=7jIAM0vRm8dk3Kgb1UNpgOK0WaNTrb8y4_AFzuT8HiA,42600
447
+ khoj/utils/constants.py,sha256=VbtG0RTX2DFWj2akBkfDcEzOcVavJg1r7pEowso3dzE,4512
448
+ khoj/utils/helpers.py,sha256=n_20DHM6-DG1N6cFIap1qqp-bt-9dvuQC2GDoISF07k,43536
449
449
  khoj/utils/initialization.py,sha256=_qCa3Nospjg2F7c6CNQAU8Su8kD7bT6kyokVQW-4BoY,13121
450
450
  khoj/utils/jsonl.py,sha256=0Ac_COqr8sLCXntzZtquxuCEVRM2c3yKeDRGhgOBRpQ,1192
451
451
  khoj/utils/models.py,sha256=_7yEVUXXG59_2p8a0nbda2jzhpLkxnfMtlBYwi34U0k,1993
452
452
  khoj/utils/rawconfig.py,sha256=uABGqIR3pIj5h7Tn-QvYuITB2ogrmi6waSv-KBq1Qc0,3533
453
453
  khoj/utils/state.py,sha256=OwoWGeuz6O7nK-Pa98ADUScLz83GsK8ruyRYex9s3lw,1527
454
454
  khoj/utils/yaml.py,sha256=I8FfdcmxYLSEOjJWgkQxxl_xlrU9Wg1HIuxKj3dWJtE,264
455
- khoj-2.0.0b13.dev23.dist-info/METADATA,sha256=GmymCd25FW1xGMUE6YJcXd41nOy-1mh9PeA8RgHRqhA,8961
456
- khoj-2.0.0b13.dev23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
457
- khoj-2.0.0b13.dev23.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
458
- khoj-2.0.0b13.dev23.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
459
- khoj-2.0.0b13.dev23.dist-info/RECORD,,
455
+ khoj-2.0.0b14.dist-info/METADATA,sha256=OSYVjL5ybe1B-pvvbuBtNwQdKexghuN9_elh9rsIExs,8955
456
+ khoj-2.0.0b14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
457
+ khoj-2.0.0b14.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
458
+ khoj-2.0.0b14.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
459
+ khoj-2.0.0b14.dist-info/RECORD,,