khoj 2.0.0b8.dev1__py3-none-any.whl → 2.0.0b9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- khoj/database/adapters/__init__.py +3 -2
- khoj/database/models/__init__.py +28 -0
- khoj/interface/compiled/404/index.html +2 -2
- khoj/interface/compiled/_next/static/chunks/5477-c4209b72942d3038.js +1 -0
- khoj/interface/compiled/_next/static/chunks/9139-8ac4d9feb10f8869.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e3d72f0edda6aa0c.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/agents/{page-5db6ad18da10d353.js → page-9a4610474cd59a71.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/automations/{page-6271e2e31c7571d1.js → page-f7bb9d777b7745d4.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/chat/page-a8455b8f9d36a2b0.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/{page-a19a597629e87fb8.js → page-2025944ec1f80144.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/search/layout-4505b79deb734a30.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/search/{page-fa366ac14b228688.js → page-4885df3cd175c957.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/settings/{page-8f9a85f96088c18b.js → page-8be3b35178abf2ec.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-6fb51c5c80f8ec67.js +1 -0
- khoj/interface/compiled/_next/static/chunks/app/share/chat/{page-ed7787cf4938b8e3.js → page-ee8ef5270163e7f2.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{webpack-c6e14fd89812b96f.js → webpack-6355be48bba04af8.js} +1 -1
- khoj/interface/compiled/_next/static/css/102b97d6472fdd3a.css +1 -0
- khoj/interface/compiled/_next/static/css/{93eeacc43e261162.css → c34713c98384ee87.css} +1 -1
- khoj/interface/compiled/_next/static/css/fc82e43baa9ae218.css +1 -0
- khoj/interface/compiled/agents/index.html +2 -2
- khoj/interface/compiled/agents/index.txt +2 -2
- khoj/interface/compiled/automations/index.html +2 -2
- khoj/interface/compiled/automations/index.txt +2 -2
- khoj/interface/compiled/chat/index.html +2 -2
- khoj/interface/compiled/chat/index.txt +2 -2
- khoj/interface/compiled/index.html +2 -2
- khoj/interface/compiled/index.txt +2 -2
- khoj/interface/compiled/search/index.html +2 -2
- khoj/interface/compiled/search/index.txt +2 -2
- khoj/interface/compiled/settings/index.html +2 -2
- khoj/interface/compiled/settings/index.txt +2 -2
- khoj/interface/compiled/share/chat/index.html +2 -2
- khoj/interface/compiled/share/chat/index.txt +2 -2
- khoj/main.py +11 -1
- khoj/processor/conversation/utils.py +7 -7
- khoj/processor/operator/__init__.py +16 -1
- khoj/processor/tools/run_code.py +5 -2
- khoj/routers/api_chat.py +846 -682
- khoj/routers/helpers.py +149 -5
- khoj/routers/research.py +56 -14
- khoj/utils/rawconfig.py +0 -1
- {khoj-2.0.0b8.dev1.dist-info → khoj-2.0.0b9.dist-info}/METADATA +1 -1
- {khoj-2.0.0b8.dev1.dist-info → khoj-2.0.0b9.dist-info}/RECORD +48 -48
- khoj/interface/compiled/_next/static/chunks/5477-18323501c445315e.js +0 -1
- khoj/interface/compiled/_next/static/chunks/9568-0d60ac475f4cc538.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/agents/layout-e00fb81dca656a10.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/chat/page-b186e95387e23ed5.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/search/layout-f5881c7ae3ba0795.js +0 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-abb6c5f4239ad7be.js +0 -1
- khoj/interface/compiled/_next/static/css/76c658ee459140a9.css +0 -1
- khoj/interface/compiled/_next/static/css/a0c2fd63bb396f04.css +0 -1
- /khoj/interface/compiled/_next/static/{ZHB1va0KhWIu8Zs8-kbgt → 6kC_Tt4g0U2gXGUbnSB1O}/_buildManifest.js +0 -0
- /khoj/interface/compiled/_next/static/{ZHB1va0KhWIu8Zs8-kbgt → 6kC_Tt4g0U2gXGUbnSB1O}/_ssgManifest.js +0 -0
- {khoj-2.0.0b8.dev1.dist-info → khoj-2.0.0b9.dist-info}/WHEEL +0 -0
- {khoj-2.0.0b8.dev1.dist-info → khoj-2.0.0b9.dist-info}/entry_points.txt +0 -0
- {khoj-2.0.0b8.dev1.dist-info → khoj-2.0.0b9.dist-info}/licenses/LICENSE +0 -0
khoj/routers/helpers.py
CHANGED
@@ -33,7 +33,7 @@ from apscheduler.job import Job
|
|
33
33
|
from apscheduler.triggers.cron import CronTrigger
|
34
34
|
from asgiref.sync import sync_to_async
|
35
35
|
from django.utils import timezone as django_timezone
|
36
|
-
from fastapi import Depends, Header, HTTPException, Request, UploadFile
|
36
|
+
from fastapi import Depends, Header, HTTPException, Request, UploadFile, WebSocket
|
37
37
|
from pydantic import BaseModel, EmailStr, Field
|
38
38
|
from starlette.authentication import has_required_scope
|
39
39
|
from starlette.requests import URL
|
@@ -1909,7 +1909,7 @@ class ApiUserRateLimiter:
|
|
1909
1909
|
# Check if the user has exceeded the rate limit
|
1910
1910
|
if subscribed and count_requests >= self.subscribed_requests:
|
1911
1911
|
logger.info(
|
1912
|
-
f"Rate limit: {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for subscribed user: {user}."
|
1912
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for subscribed user: {user}."
|
1913
1913
|
)
|
1914
1914
|
raise HTTPException(
|
1915
1915
|
status_code=429,
|
@@ -1918,7 +1918,7 @@ class ApiUserRateLimiter:
|
|
1918
1918
|
if not subscribed and count_requests >= self.requests:
|
1919
1919
|
if self.requests >= self.subscribed_requests:
|
1920
1920
|
logger.info(
|
1921
|
-
f"Rate limit: {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for user: {user}."
|
1921
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for user: {user}."
|
1922
1922
|
)
|
1923
1923
|
raise HTTPException(
|
1924
1924
|
status_code=429,
|
@@ -1926,7 +1926,7 @@ class ApiUserRateLimiter:
|
|
1926
1926
|
)
|
1927
1927
|
|
1928
1928
|
logger.info(
|
1929
|
-
f"Rate limit: {count_requests}/{self.requests} requests not allowed in {self.window} seconds for user: {user}."
|
1929
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.requests} requests not allowed in {self.window} seconds for user: {user}."
|
1930
1930
|
)
|
1931
1931
|
raise HTTPException(
|
1932
1932
|
status_code=429,
|
@@ -1936,6 +1936,56 @@ class ApiUserRateLimiter:
|
|
1936
1936
|
# Add the current request to the cache
|
1937
1937
|
UserRequests.objects.create(user=user, slug=self.slug)
|
1938
1938
|
|
1939
|
+
def check_websocket(self, websocket: WebSocket):
|
1940
|
+
"""WebSocket-specific rate limiting method"""
|
1941
|
+
# Rate limiting disabled if billing is disabled
|
1942
|
+
if state.billing_enabled is False:
|
1943
|
+
return
|
1944
|
+
|
1945
|
+
# Rate limiting is disabled if user unauthenticated.
|
1946
|
+
if not websocket.scope.get("user") or not websocket.scope["user"].is_authenticated:
|
1947
|
+
return
|
1948
|
+
|
1949
|
+
user: KhojUser = websocket.scope["user"].object
|
1950
|
+
subscribed = has_required_scope(websocket, ["premium"])
|
1951
|
+
current_window = "today" if self.window == 60 * 60 * 24 else f"now"
|
1952
|
+
next_window = "tomorrow" if self.window == 60 * 60 * 24 else f"in a bit"
|
1953
|
+
common_message_prefix = f"I'm glad you're enjoying interacting with me! You've unfortunately exceeded your usage limit for {current_window}."
|
1954
|
+
|
1955
|
+
# Remove requests outside of the time window
|
1956
|
+
cutoff = django_timezone.now() - timedelta(seconds=self.window)
|
1957
|
+
count_requests = UserRequests.objects.filter(user=user, created_at__gte=cutoff, slug=self.slug).count()
|
1958
|
+
|
1959
|
+
# Check if the user has exceeded the rate limit
|
1960
|
+
if subscribed and count_requests >= self.subscribed_requests:
|
1961
|
+
logger.info(
|
1962
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for subscribed user: {user}."
|
1963
|
+
)
|
1964
|
+
raise HTTPException(
|
1965
|
+
status_code=429,
|
1966
|
+
detail=f"{common_message_prefix} But let's chat more {next_window}?",
|
1967
|
+
)
|
1968
|
+
if not subscribed and count_requests >= self.requests:
|
1969
|
+
if self.requests >= self.subscribed_requests:
|
1970
|
+
logger.info(
|
1971
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.subscribed_requests} requests not allowed in {self.window} seconds for user: {user}."
|
1972
|
+
)
|
1973
|
+
raise HTTPException(
|
1974
|
+
status_code=429,
|
1975
|
+
detail=f"{common_message_prefix} But let's chat more {next_window}?",
|
1976
|
+
)
|
1977
|
+
|
1978
|
+
logger.info(
|
1979
|
+
f"Rate limit ({self.slug}): {count_requests}/{self.requests} requests not allowed in {self.window} seconds for user: {user}."
|
1980
|
+
)
|
1981
|
+
raise HTTPException(
|
1982
|
+
status_code=429,
|
1983
|
+
detail=f"{common_message_prefix} You can subscribe to increase your usage limit via [your settings](https://app.khoj.dev/settings) or we can continue our conversation {next_window}.",
|
1984
|
+
)
|
1985
|
+
|
1986
|
+
# Add the current request to the cache
|
1987
|
+
UserRequests.objects.create(user=user, slug=self.slug)
|
1988
|
+
|
1939
1989
|
|
1940
1990
|
class ApiImageRateLimiter:
|
1941
1991
|
def __init__(self, max_images: int = 10, max_combined_size_mb: float = 10):
|
@@ -1983,6 +2033,89 @@ class ApiImageRateLimiter:
|
|
1983
2033
|
detail=f"Those images are way too large for me! I can handle up to {self.max_combined_size_mb}MB of images per message.",
|
1984
2034
|
)
|
1985
2035
|
|
2036
|
+
def check_websocket(self, websocket: WebSocket, body: ChatRequestBody):
|
2037
|
+
"""WebSocket-specific image rate limiting method"""
|
2038
|
+
if state.billing_enabled is False:
|
2039
|
+
return
|
2040
|
+
|
2041
|
+
# Rate limiting is disabled if user unauthenticated.
|
2042
|
+
if not websocket.scope.get("user") or not websocket.scope["user"].is_authenticated:
|
2043
|
+
return
|
2044
|
+
|
2045
|
+
if not body.images:
|
2046
|
+
return
|
2047
|
+
|
2048
|
+
# Check number of images
|
2049
|
+
if len(body.images) > self.max_images:
|
2050
|
+
logger.info(f"Rate limit: {len(body.images)}/{self.max_images} images not allowed per message.")
|
2051
|
+
raise HTTPException(
|
2052
|
+
status_code=429,
|
2053
|
+
detail=f"Those are way too many images for me! I can handle up to {self.max_images} images per message.",
|
2054
|
+
)
|
2055
|
+
|
2056
|
+
# Check total size of images
|
2057
|
+
total_size_mb = 0.0
|
2058
|
+
for image in body.images:
|
2059
|
+
# Unquote the image in case it's URL encoded
|
2060
|
+
image = unquote(image)
|
2061
|
+
# Assuming the image is a base64 encoded string
|
2062
|
+
# Remove the data:image/jpeg;base64, part if present
|
2063
|
+
if "," in image:
|
2064
|
+
image = image.split(",", 1)[1]
|
2065
|
+
|
2066
|
+
# Decode base64 to get the actual size
|
2067
|
+
image_bytes = base64.b64decode(image)
|
2068
|
+
total_size_mb += len(image_bytes) / (1024 * 1024) # Convert bytes to MB
|
2069
|
+
|
2070
|
+
if total_size_mb > self.max_combined_size_mb:
|
2071
|
+
logger.info(f"Data limit: {total_size_mb}MB/{self.max_combined_size_mb}MB size not allowed per message.")
|
2072
|
+
raise HTTPException(
|
2073
|
+
status_code=429,
|
2074
|
+
detail=f"Those images are way too large for me! I can handle up to {self.max_combined_size_mb}MB of images per message.",
|
2075
|
+
)
|
2076
|
+
|
2077
|
+
|
2078
|
+
class WebSocketConnectionManager:
|
2079
|
+
"""Limit max open websockets per user."""
|
2080
|
+
|
2081
|
+
def __init__(self, trial_user_max_connections: int = 10, subscribed_user_max_connections: int = 10):
|
2082
|
+
self.trial_user_max_connections = trial_user_max_connections
|
2083
|
+
self.subscribed_user_max_connections = subscribed_user_max_connections
|
2084
|
+
self.connection_slug_prefix = "ws_connection_"
|
2085
|
+
# Set cleanup window to 24 hours for truly stale connections (e.g., server crashes)
|
2086
|
+
self.cleanup_window = 86400 # 24 hours
|
2087
|
+
|
2088
|
+
async def can_connect(self, websocket: WebSocket) -> bool:
|
2089
|
+
"""Check if user can establish a new WebSocket connection."""
|
2090
|
+
# Cleanup very old connections (likely from server crashes)
|
2091
|
+
user: KhojUser = websocket.scope["user"].object
|
2092
|
+
subscribed = has_required_scope(websocket, ["premium"])
|
2093
|
+
max_connections = self.subscribed_user_max_connections if subscribed else self.trial_user_max_connections
|
2094
|
+
|
2095
|
+
await self._cleanup_stale_connections(user)
|
2096
|
+
|
2097
|
+
# Count ALL connections for this user (not filtered by time)
|
2098
|
+
active_connections = await UserRequests.objects.filter(
|
2099
|
+
user=user, slug__startswith=self.connection_slug_prefix
|
2100
|
+
).acount()
|
2101
|
+
|
2102
|
+
return active_connections < max_connections
|
2103
|
+
|
2104
|
+
async def register_connection(self, user: KhojUser, connection_id: str) -> None:
|
2105
|
+
"""Register a new WebSocket connection."""
|
2106
|
+
await UserRequests.objects.acreate(user=user, slug=f"{self.connection_slug_prefix}{connection_id}")
|
2107
|
+
|
2108
|
+
async def unregister_connection(self, user: KhojUser, connection_id: str) -> None:
|
2109
|
+
"""Remove a WebSocket connection record."""
|
2110
|
+
await UserRequests.objects.filter(user=user, slug=f"{self.connection_slug_prefix}{connection_id}").adelete()
|
2111
|
+
|
2112
|
+
async def _cleanup_stale_connections(self, user: KhojUser) -> None:
|
2113
|
+
"""Remove connection records older than cleanup window."""
|
2114
|
+
cutoff = django_timezone.now() - timedelta(seconds=self.cleanup_window)
|
2115
|
+
await UserRequests.objects.filter(
|
2116
|
+
user=user, slug__startswith=self.connection_slug_prefix, created_at__lt=cutoff
|
2117
|
+
).adelete()
|
2118
|
+
|
1986
2119
|
|
1987
2120
|
class ConversationCommandRateLimiter:
|
1988
2121
|
def __init__(self, trial_rate_limit: int, subscribed_rate_limit: int, slug: str):
|
@@ -1991,7 +2124,7 @@ class ConversationCommandRateLimiter:
|
|
1991
2124
|
self.subscribed_rate_limit = subscribed_rate_limit
|
1992
2125
|
self.restricted_commands = [ConversationCommand.Research]
|
1993
2126
|
|
1994
|
-
async def update_and_check_if_valid(self, request: Request, conversation_command: ConversationCommand):
|
2127
|
+
async def update_and_check_if_valid(self, request: Request | WebSocket, conversation_command: ConversationCommand):
|
1995
2128
|
if state.billing_enabled is False:
|
1996
2129
|
return
|
1997
2130
|
|
@@ -2512,6 +2645,17 @@ async def read_chat_stream(response_iterator: AsyncGenerator[str, None]) -> Dict
|
|
2512
2645
|
}
|
2513
2646
|
|
2514
2647
|
|
2648
|
+
def get_message_from_queue(queue: asyncio.Queue) -> Optional[str]:
|
2649
|
+
"""Get any message in queue if available."""
|
2650
|
+
if not queue:
|
2651
|
+
return None
|
2652
|
+
try:
|
2653
|
+
# Non-blocking check for message in the queue
|
2654
|
+
return queue.get_nowait()
|
2655
|
+
except asyncio.QueueEmpty:
|
2656
|
+
return None
|
2657
|
+
|
2658
|
+
|
2515
2659
|
def get_user_config(user: KhojUser, request: Request, is_detailed: bool = False):
|
2516
2660
|
user_picture = request.session.get("user", {}).get("picture")
|
2517
2661
|
is_active = has_required_scope(request, ["premium"])
|
khoj/routers/research.py
CHANGED
@@ -15,6 +15,7 @@ from khoj.processor.conversation.utils import (
|
|
15
15
|
ResearchIteration,
|
16
16
|
ToolCall,
|
17
17
|
construct_iteration_history,
|
18
|
+
construct_structured_message,
|
18
19
|
construct_tool_chat_history,
|
19
20
|
load_complex_json,
|
20
21
|
)
|
@@ -24,6 +25,7 @@ from khoj.processor.tools.run_code import run_code
|
|
24
25
|
from khoj.routers.helpers import (
|
25
26
|
ChatEvent,
|
26
27
|
generate_summary_from_files,
|
28
|
+
get_message_from_queue,
|
27
29
|
grep_files,
|
28
30
|
list_files,
|
29
31
|
search_documents,
|
@@ -58,7 +60,7 @@ async def apick_next_tool(
|
|
58
60
|
query_files: str = None,
|
59
61
|
max_document_searches: int = 7,
|
60
62
|
max_online_searches: int = 3,
|
61
|
-
max_webpages_to_read: int =
|
63
|
+
max_webpages_to_read: int = 3,
|
62
64
|
send_status_func: Optional[Callable] = None,
|
63
65
|
tracer: dict = {},
|
64
66
|
):
|
@@ -74,7 +76,7 @@ async def apick_next_tool(
|
|
74
76
|
):
|
75
77
|
previous_iteration = previous_iterations[-1]
|
76
78
|
yield ResearchIteration(
|
77
|
-
query=query,
|
79
|
+
query=ToolCall(name=previous_iteration.query.name, args={"query": query}, id=previous_iteration.query.id), # type: ignore
|
78
80
|
context=previous_iteration.context,
|
79
81
|
onlineContext=previous_iteration.onlineContext,
|
80
82
|
codeContext=previous_iteration.codeContext,
|
@@ -86,25 +88,40 @@ async def apick_next_tool(
|
|
86
88
|
# Construct tool options for the agent to choose from
|
87
89
|
tools = []
|
88
90
|
tool_options_str = ""
|
89
|
-
|
91
|
+
agent_input_tools = agent.input_tools if agent else []
|
92
|
+
agent_tools = []
|
93
|
+
|
94
|
+
# Map agent user facing tools to research tools to include in agents toolbox
|
95
|
+
document_research_tools = [
|
96
|
+
ConversationCommand.SemanticSearchFiles,
|
97
|
+
ConversationCommand.RegexSearchFiles,
|
98
|
+
ConversationCommand.ViewFile,
|
99
|
+
ConversationCommand.ListFiles,
|
100
|
+
]
|
101
|
+
input_tools_to_research_tools = {
|
102
|
+
ConversationCommand.Notes.value: [tool.value for tool in document_research_tools],
|
103
|
+
ConversationCommand.Webpage.value: [ConversationCommand.ReadWebpage.value],
|
104
|
+
ConversationCommand.Online.value: [ConversationCommand.SearchWeb.value],
|
105
|
+
ConversationCommand.Code.value: [ConversationCommand.RunCode.value],
|
106
|
+
ConversationCommand.Operator.value: [ConversationCommand.OperateComputer.value],
|
107
|
+
}
|
108
|
+
for input_tool, research_tools in input_tools_to_research_tools.items():
|
109
|
+
if input_tool in agent_input_tools:
|
110
|
+
agent_tools += research_tools
|
111
|
+
|
90
112
|
user_has_entries = await EntryAdapters.auser_has_entries(user)
|
91
113
|
for tool, tool_data in tools_for_research_llm.items():
|
92
114
|
# Skip showing operator tool as an option if not enabled
|
93
|
-
if tool == ConversationCommand.
|
115
|
+
if tool == ConversationCommand.OperateComputer and not is_operator_enabled():
|
94
116
|
continue
|
95
117
|
# Skip showing document related tools if user has no documents
|
96
|
-
if
|
97
|
-
tool == ConversationCommand.SemanticSearchFiles
|
98
|
-
or tool == ConversationCommand.RegexSearchFiles
|
99
|
-
or tool == ConversationCommand.ViewFile
|
100
|
-
or tool == ConversationCommand.ListFiles
|
101
|
-
) and not user_has_entries:
|
118
|
+
if tool in document_research_tools and not user_has_entries:
|
102
119
|
continue
|
103
120
|
if tool == ConversationCommand.SemanticSearchFiles:
|
104
121
|
description = tool_data.description.format(max_search_queries=max_document_searches)
|
105
|
-
elif tool == ConversationCommand.
|
122
|
+
elif tool == ConversationCommand.ReadWebpage:
|
106
123
|
description = tool_data.description.format(max_webpages_to_read=max_webpages_to_read)
|
107
|
-
elif tool == ConversationCommand.
|
124
|
+
elif tool == ConversationCommand.SearchWeb:
|
108
125
|
description = tool_data.description.format(max_search_queries=max_online_searches)
|
109
126
|
else:
|
110
127
|
description = tool_data.description
|
@@ -206,6 +223,8 @@ async def research(
|
|
206
223
|
tracer: dict = {},
|
207
224
|
query_files: str = None,
|
208
225
|
cancellation_event: Optional[asyncio.Event] = None,
|
226
|
+
interrupt_queue: Optional[asyncio.Queue] = None,
|
227
|
+
abort_message: str = "␃🔚␗",
|
209
228
|
):
|
210
229
|
max_document_searches = 7
|
211
230
|
max_online_searches = 3
|
@@ -226,6 +245,26 @@ async def research(
|
|
226
245
|
logger.debug(f"Research cancelled. User {user} disconnected client.")
|
227
246
|
break
|
228
247
|
|
248
|
+
# Update the query for the current research iteration
|
249
|
+
if interrupt_query := get_message_from_queue(interrupt_queue):
|
250
|
+
if interrupt_query == abort_message:
|
251
|
+
cancellation_event.set()
|
252
|
+
logger.debug(f"Research cancelled by user {user} via interrupt queue.")
|
253
|
+
break
|
254
|
+
# Add the interrupt query as a new user message to the research conversation history
|
255
|
+
logger.info(
|
256
|
+
f"Continuing research for user {user} with the previous {len(previous_iterations)} iterations and new instruction: {interrupt_query}"
|
257
|
+
)
|
258
|
+
previous_iterations_history = construct_iteration_history(
|
259
|
+
previous_iterations, query, query_images, query_files
|
260
|
+
)
|
261
|
+
research_conversation_history += previous_iterations_history
|
262
|
+
query = interrupt_query
|
263
|
+
previous_iterations = []
|
264
|
+
|
265
|
+
async for result in send_status_func(f"**Incorporate New Instruction**: {interrupt_query}"):
|
266
|
+
yield result
|
267
|
+
|
229
268
|
online_results: Dict = dict()
|
230
269
|
code_results: Dict = dict()
|
231
270
|
document_results: List[Dict[str, str]] = []
|
@@ -321,7 +360,9 @@ async def research(
|
|
321
360
|
try:
|
322
361
|
async for result in search_online(
|
323
362
|
**this_iteration.query.args,
|
324
|
-
conversation_history=construct_tool_chat_history(
|
363
|
+
conversation_history=construct_tool_chat_history(
|
364
|
+
previous_iterations, ConversationCommand.SearchWeb
|
365
|
+
),
|
325
366
|
location=location,
|
326
367
|
user=user,
|
327
368
|
send_status_func=send_status_func,
|
@@ -377,7 +418,7 @@ async def research(
|
|
377
418
|
try:
|
378
419
|
async for result in run_code(
|
379
420
|
**this_iteration.query.args,
|
380
|
-
conversation_history=construct_tool_chat_history(previous_iterations, ConversationCommand.
|
421
|
+
conversation_history=construct_tool_chat_history(previous_iterations, ConversationCommand.RunCode),
|
381
422
|
context="",
|
382
423
|
location_data=location,
|
383
424
|
user=user,
|
@@ -411,6 +452,7 @@ async def research(
|
|
411
452
|
agent=agent,
|
412
453
|
query_files=query_files,
|
413
454
|
cancellation_event=cancellation_event,
|
455
|
+
interrupt_queue=interrupt_queue,
|
414
456
|
tracer=tracer,
|
415
457
|
):
|
416
458
|
if isinstance(result, dict) and ChatEvent.STATUS in result:
|
khoj/utils/rawconfig.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
khoj/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
2
|
khoj/configure.py,sha256=Z3c3cE4-pqZ5eqGA8lRqcpNlDRby4cjtcFYVD2RD4i8,18994
|
3
|
-
khoj/main.py,sha256=
|
3
|
+
khoj/main.py,sha256=1Ev5jWhfZRr1rOXtUMaCSmzt-dp_VIOIcYXT9aAzTA8,8855
|
4
4
|
khoj/manage.py,sha256=njo6uLxGaMamTPesHjFEOIBJbpIUrz39e1V59zKj544,664
|
5
5
|
khoj/app/README.md,sha256=PSQjKCdpU2hgszLVF8yEhV7TWhbEEb-1aYLTRuuAsKI,2832
|
6
6
|
khoj/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -11,7 +11,7 @@ khoj/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
khoj/database/admin.py,sha256=CfIAnwxV_HfbnhyjVqk9wtrz8hHnStFu-7ap82x6lYU,13256
|
12
12
|
khoj/database/apps.py,sha256=pM4tkX5Odw4YW_hLLKK8Nd5kqGddf1en0oMCea44RZw,153
|
13
13
|
khoj/database/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
|
14
|
-
khoj/database/adapters/__init__.py,sha256=
|
14
|
+
khoj/database/adapters/__init__.py,sha256=vayHgJl5Lj403gVs6YS4nMPK_X6hOimM6YN9qkTmiXM,83112
|
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
|
@@ -124,24 +124,24 @@ khoj/database/migrations/0089_chatmodel_price_tier_and_more.py,sha256=EJ1Yf6MMzh
|
|
124
124
|
khoj/database/migrations/0090_alter_khojuser_uuid.py,sha256=2h9v-DiuqFuZKpAyWYwueqZkBHvxZbm-_guRjNaZzxg,3802
|
125
125
|
khoj/database/migrations/0091_chatmodel_friendly_name_and_more.py,sha256=e-2DQhyW9kMxMg7ItGSyCKE5GQFI0ZSuyfD8CdfVa0k,1758
|
126
126
|
khoj/database/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
127
|
-
khoj/database/models/__init__.py,sha256=
|
127
|
+
khoj/database/models/__init__.py,sha256=GPdyWFq8YoHsjj-GJaR4QPvh7W9E2lWrJQe8YpXJyPk,33145
|
128
128
|
khoj/interface/compiled/agents.svg,sha256=yFCRwIM-Qawa0C5ggAo3ekb-Q1ElmotBOKIGhtfIQqM,1722
|
129
129
|
khoj/interface/compiled/automation.svg,sha256=o7L2XYwJWRSMvl8h6TBv6Pt28RTRVMHqF04EPY0AFj0,1467
|
130
130
|
khoj/interface/compiled/chat.svg,sha256=l2JoYRRgk201adTTdvJ-buKUrc0WGfsudix5xEvtM3A,2424
|
131
131
|
khoj/interface/compiled/close.svg,sha256=hQ2iFLkNzHk0_iyTrSbwnWAeXYlgA-c2Eof2Iqh76n4,417
|
132
132
|
khoj/interface/compiled/copy-button-success.svg,sha256=byqWAYD3Pn9IOXRjOKudJ-TJbP2UESbQGvtLWazNGjY,829
|
133
133
|
khoj/interface/compiled/copy-button.svg,sha256=05bKM2eRxksfBlAPT7yMaoNJEk85bZCxQg67EVrPeHo,669
|
134
|
-
khoj/interface/compiled/index.html,sha256=
|
135
|
-
khoj/interface/compiled/index.txt,sha256=
|
134
|
+
khoj/interface/compiled/index.html,sha256=6_XfFD9sw5dSpTIQT4cFYMW6QYA26SGezFVid8EtSG0,53350
|
135
|
+
khoj/interface/compiled/index.txt,sha256=JfZEhsKLM9weJjVPAL1PJLEPx4STLVILPMp0We5mtPc,7747
|
136
136
|
khoj/interface/compiled/khoj.webmanifest,sha256=9wOK2BMS6xH5NKd2eaUgTLg9WepIxB2K2U33KU89LD8,2543
|
137
137
|
khoj/interface/compiled/logo.svg,sha256=_QCKVYM4WT2Qhcf7aVFImjq_s5CwjynGXYAOgI7yf8w,8059
|
138
138
|
khoj/interface/compiled/send.svg,sha256=VdavOWkVddcwcGcld6pdfmwfz7S91M-9O28cfeiKJkM,635
|
139
139
|
khoj/interface/compiled/share.svg,sha256=91lwo75PvMDrgocuZQab6EQ62CxRbubh9Bhw7CWMKbg,1221
|
140
140
|
khoj/interface/compiled/thumbs-down.svg,sha256=JGNl-DwoRmH2XFMPWwFFklmoYtKxaQbkLE3nuYKe8ZY,1019
|
141
141
|
khoj/interface/compiled/thumbs-up.svg,sha256=yS1wxTRtiztkN-6nZciLoYQUB_KTYNPV8xFRwH2TQFw,1036
|
142
|
-
khoj/interface/compiled/404/index.html,sha256=
|
143
|
-
khoj/interface/compiled/_next/static/
|
144
|
-
khoj/interface/compiled/_next/static/
|
142
|
+
khoj/interface/compiled/404/index.html,sha256=gjyvNd1A8m72WfnmLePLXApbN_zv44Kvnu5n76pjKMc,17407
|
143
|
+
khoj/interface/compiled/_next/static/6kC_Tt4g0U2gXGUbnSB1O/_buildManifest.js,sha256=f2_nYnw25hHWQJ-39Lf5OH1u6kgdbOInyfplqgjvAV4,224
|
144
|
+
khoj/interface/compiled/_next/static/6kC_Tt4g0U2gXGUbnSB1O/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
|
145
145
|
khoj/interface/compiled/_next/static/chunks/1191.b547ec13349b4aed.js,sha256=3qtdOft2SSaGT0qhyPunEraJEZUxIqDV4q3ULnFantg,10913
|
146
146
|
khoj/interface/compiled/_next/static/chunks/1327-1a9107b9a2a04a98.js,sha256=7NmSOycXRGHpTN98sMAirnWN8ZUL971FsQpWmOs4Fxs,442974
|
147
147
|
khoj/interface/compiled/_next/static/chunks/1588.f0558a0bdffc4761.js,sha256=ZSpLe7ui7FG7AvK00JHPg1YjYz8R9l1Obzu1mYHpzjo,89845
|
@@ -170,7 +170,7 @@ khoj/interface/compiled/_next/static/chunks/5210.cd35a1c1ec594a20.js,sha256=sz7i
|
|
170
170
|
khoj/interface/compiled/_next/static/chunks/5303-c65c9c6aeb263a0d.js,sha256=M3E1iLGUW0xbsmV6JMVQBNFlptBYWK8fhfYQattqRXw,143857
|
171
171
|
khoj/interface/compiled/_next/static/chunks/5329.f8b3c5b3d16159cd.js,sha256=452Bf2U_iLUeM0vZce-s1k75k_osL4kVm7uG72xPER8,418
|
172
172
|
khoj/interface/compiled/_next/static/chunks/5427-13d6ffd380fdfab7.js,sha256=gGx3O30h-Rb3MDqcMeD3wmOZnauuOIkz4Cv-NnVEjIE,32619
|
173
|
-
khoj/interface/compiled/_next/static/chunks/5477-
|
173
|
+
khoj/interface/compiled/_next/static/chunks/5477-c4209b72942d3038.js,sha256=LkXuXSSFpmu1ZZUR2ZdV9b6aFHQUb4krBJjf5aeUI0k,14624
|
174
174
|
khoj/interface/compiled/_next/static/chunks/558-c14e76cff03f6a60.js,sha256=8fgZkhFBwG3NfWM3P65XkA7ffRg3vDEhwjyiWLiXMBg,87244
|
175
175
|
khoj/interface/compiled/_next/static/chunks/5639-0c4604668cb2d4c0.js,sha256=FUVuhw9Ys2-PiZB3vOfCadzej3ptFqnOij_WOMOVnY8,1635449
|
176
176
|
khoj/interface/compiled/_next/static/chunks/5830.8876eccb82da9b7d.js,sha256=JRJTpsXUOOcNum5Vx6qd0mAGcts6WLOiLpLkPHK5QHQ,42176
|
@@ -192,6 +192,7 @@ khoj/interface/compiled/_next/static/chunks/8888.ebe0e552b59e7fed.js,sha256=c5ic
|
|
192
192
|
khoj/interface/compiled/_next/static/chunks/8890.6e8a59e4de6978bc.js,sha256=UgHpyhvA3s1knHgPf3oPgvJ6bqStNOv-6uhQUHBtOGE,36317
|
193
193
|
khoj/interface/compiled/_next/static/chunks/8950.5f2272e0ac923f9e.js,sha256=pxyd8W7Yv79gp8mslLSR_We6gpJOc-JoNkRbM7rgZ94,412
|
194
194
|
khoj/interface/compiled/_next/static/chunks/90542734.2c21f16f18b22411.js,sha256=mFFt4YDMnvCB84YuPgH0V6wX9UvHwoztnhHgL6cad-g,426479
|
195
|
+
khoj/interface/compiled/_next/static/chunks/9139-8ac4d9feb10f8869.js,sha256=uwVs14McY01hs1lkHG2t8Z_z2EC11NConM1NJPuMXbc,48934
|
195
196
|
khoj/interface/compiled/_next/static/chunks/9202.c703864fcedc8d1f.js,sha256=q728YuRC6vTO64ARqaguEZH6Udhdu6IU3rDGmfdtN6I,24367
|
196
197
|
khoj/interface/compiled/_next/static/chunks/9245.a04e92d034540234.js,sha256=NH1VEr8vi6CkKDFpPgGimz2jfNwpoE4AUFQ86SKmRwg,145680
|
197
198
|
khoj/interface/compiled/_next/static/chunks/9320.6aca4885d541aa44.js,sha256=mMJG3Ncy8a0GVDZPNPan_vWjjYTrr6R8PRFHo1MAXBI,4207
|
@@ -199,7 +200,6 @@ khoj/interface/compiled/_next/static/chunks/945-74376499b067d28e.js,sha256=e_lXz
|
|
199
200
|
khoj/interface/compiled/_next/static/chunks/94ca1967.1b3402358e0e1255.js,sha256=WJXEIy24FD6PNQePg-uahendJMNc03GgnVveitFeshI,1174524
|
200
201
|
khoj/interface/compiled/_next/static/chunks/9535.f78cd92d03331e55.js,sha256=nr2CB4ZZ2hZInusLxQMZGBad68a-3Imn3UDSwAe-WKs,178
|
201
202
|
khoj/interface/compiled/_next/static/chunks/9537-d9ab442ce15d1e20.js,sha256=vMeeHKfwjLAljpwwlIoNfgwDsm8gZyqLA5PnStKIWPU,42469
|
202
|
-
khoj/interface/compiled/_next/static/chunks/9568-0d60ac475f4cc538.js,sha256=j2gSoGMavadS0jshP5omkzr1K_FwQFclrzXhLOUETFc,26845
|
203
203
|
khoj/interface/compiled/_next/static/chunks/964ecbae.d5be7c49c320d695.js,sha256=Dp7-5a_bYiET4lBiy1sTrb1cQnE3_TC0f1EQCD2Coko,1175124
|
204
204
|
khoj/interface/compiled/_next/static/chunks/9968.b111fc002796da81.js,sha256=uaKF_VIHPSnjwK6NPXwWaolJo_1d-E43rADivNbk4RA,180
|
205
205
|
khoj/interface/compiled/_next/static/chunks/d3ac728e-4c56e7f41db266b7.js,sha256=KH2S98yagVOcqDG836x8mxIFFjrq11AdYodjBurPvmg,268514
|
@@ -209,33 +209,33 @@ khoj/interface/compiled/_next/static/chunks/framework-8e0e0f4a6b83a956.js,sha256
|
|
209
209
|
khoj/interface/compiled/_next/static/chunks/main-app-de1f09df97a3cfc7.js,sha256=bqnztujKItXfFBzQlaBmDZyfJpQt_M93CXOuchJfpD0,471
|
210
210
|
khoj/interface/compiled/_next/static/chunks/main-fc8e0fefa2ef3d8c.js,sha256=t9FZIByh6V52m41LQ2yyAReF1CAuY7gLMBuWBeKCX2g,116793
|
211
211
|
khoj/interface/compiled/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
|
212
|
-
khoj/interface/compiled/_next/static/chunks/webpack-
|
212
|
+
khoj/interface/compiled/_next/static/chunks/webpack-6355be48bba04af8.js,sha256=xwIzU_S50fgR6fFGLdKxoNNqAjzIfKGqHbBLa2t3x6Y,4949
|
213
213
|
khoj/interface/compiled/_next/static/chunks/app/layout-c2de87a25fededbb.js,sha256=jcU3C37p73V24B118uVRQffNaQES9jihsTGYF4fZ_8o,3949
|
214
|
-
khoj/interface/compiled/_next/static/chunks/app/page-
|
214
|
+
khoj/interface/compiled/_next/static/chunks/app/page-2025944ec1f80144.js,sha256=rz32GmtosFqTqGeK833or3Hjq6Q64yuTsv-vaWh1XAE,29929
|
215
215
|
khoj/interface/compiled/_next/static/chunks/app/_not-found/page-84f94d15b2da4eac.js,sha256=zElhiTkdu2JqrEvJ8Lrxh4HCyfLmPllBHHWOuDtrVlw,1755
|
216
|
-
khoj/interface/compiled/_next/static/chunks/app/agents/layout-
|
217
|
-
khoj/interface/compiled/_next/static/chunks/app/agents/page-
|
216
|
+
khoj/interface/compiled/_next/static/chunks/app/agents/layout-e3d72f0edda6aa0c.js,sha256=FeKQJdykhxnWEDPTdB4jbsqbkKu2UmsIEiTSZevNegg,180
|
217
|
+
khoj/interface/compiled/_next/static/chunks/app/agents/page-9a4610474cd59a71.js,sha256=itxLHi5MI0FicmxrMQidcn-TiDOEec_Jr9M94Aqbhew,17483
|
218
218
|
khoj/interface/compiled/_next/static/chunks/app/automations/layout-63603d2cb33279f7.js,sha256=4OX_fcTQdNVs6HxDdJVWdadMVC_gM86Tkqo2TjBA4gw,5143
|
219
|
-
khoj/interface/compiled/_next/static/chunks/app/automations/page-
|
219
|
+
khoj/interface/compiled/_next/static/chunks/app/automations/page-f7bb9d777b7745d4.js,sha256=2qWZHB-9I9wtGTmajkSbdqLHfJFuPnHAsw7E42Wwomc,34829
|
220
220
|
khoj/interface/compiled/_next/static/chunks/app/chat/layout-33934fc2d6ae6838.js,sha256=zKdgnv4zZCkeNWFODWPJKYB3VjkTq4X5LtTCs0sqxaQ,180
|
221
|
-
khoj/interface/compiled/_next/static/chunks/app/chat/page-
|
222
|
-
khoj/interface/compiled/_next/static/chunks/app/search/layout-
|
223
|
-
khoj/interface/compiled/_next/static/chunks/app/search/page-
|
221
|
+
khoj/interface/compiled/_next/static/chunks/app/chat/page-a8455b8f9d36a2b0.js,sha256=dbYMWCyV2jb-sEcbeb--d7_b0Bm-AUOuKJ2Uzz7oF0k,29312
|
222
|
+
khoj/interface/compiled/_next/static/chunks/app/search/layout-4505b79deb734a30.js,sha256=HPQfR8XLd1MObIR-vRu0kAWYesDP3yGGTA7jyORnrX4,180
|
223
|
+
khoj/interface/compiled/_next/static/chunks/app/search/page-4885df3cd175c957.js,sha256=DFDpUem-27PpUEfqc72xv3zo7TcZpTFjvyXszZSGrNM,30929
|
224
224
|
khoj/interface/compiled/_next/static/chunks/app/settings/layout-f88cedfe9ad4df7c.js,sha256=aFBEgUCsKnoeyULmh7g-DmaznQ0ztcq6y2pj4bSMCIY,6132
|
225
|
-
khoj/interface/compiled/_next/static/chunks/app/settings/page-
|
226
|
-
khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-
|
227
|
-
khoj/interface/compiled/_next/static/chunks/app/share/chat/page-
|
225
|
+
khoj/interface/compiled/_next/static/chunks/app/settings/page-8be3b35178abf2ec.js,sha256=bjgxTUvgwJtv0R8zVFrH-1L8PiUDL5BlolZkDrYk-e4,27892
|
226
|
+
khoj/interface/compiled/_next/static/chunks/app/share/chat/layout-6fb51c5c80f8ec67.js,sha256=MRWVUV6hiulN_DJo7uyZvW0HaMGGqoq6fdGK_jt4kJE,180
|
227
|
+
khoj/interface/compiled/_next/static/chunks/app/share/chat/page-ee8ef5270163e7f2.js,sha256=8B0LDeYsH_tp9WzvzoTCI15GZoBprbG0a5ePjywqrrw,5557
|
228
228
|
khoj/interface/compiled/_next/static/chunks/pages/_app-3c9ca398d360b709.js,sha256=UqtikLsCsOWtDUJOW6Tuk9P-bV1V3MhYd3ghrQuEmfs,286
|
229
229
|
khoj/interface/compiled/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js,sha256=w_It3VzKT8O1M3CrJ_hZHsaU7M7dq3EAaVG8KvJ-fhU,253
|
230
|
+
khoj/interface/compiled/_next/static/css/102b97d6472fdd3a.css,sha256=Bgp42fbn5uQu_g0IXo55zpMLiBEyYHSGO3iWbFoaO90,34067
|
230
231
|
khoj/interface/compiled/_next/static/css/3090706713c12a32.css,sha256=lHBNcr2SPiAMdZQONh2MMlVM_huteuNSM9jCqGkS2d0,3075782
|
231
232
|
khoj/interface/compiled/_next/static/css/37a73b87f02df402.css,sha256=hp0vlekKu0K2eITR5YIqFmLHQPqV3JETFnRd_-Uh0mk,165
|
232
233
|
khoj/interface/compiled/_next/static/css/5b28ced915454767.css,sha256=Bk56AIRHovIWNUw8QWvMbXIxxPiyWEiObkMA7RwpMrs,4842
|
233
|
-
khoj/interface/compiled/_next/static/css/76c658ee459140a9.css,sha256=7tI24VB66ZUsAPUxRdQhboopun0AXLUnF64uv9RkC08,1833
|
234
234
|
khoj/interface/compiled/_next/static/css/7889a30fe9c83846.css,sha256=IUkZhkx4GpYOIhN-EJw9T1DqGMO3Wa3mNpUwaOBuZoY,7204
|
235
|
-
khoj/interface/compiled/_next/static/css/
|
236
|
-
khoj/interface/compiled/_next/static/css/a0c2fd63bb396f04.css,sha256=8q0xBA3l7uP-YOqSnRnQEfPbGUgP9xRP0Q75UHSt6vc,34737
|
235
|
+
khoj/interface/compiled/_next/static/css/c34713c98384ee87.css,sha256=uypGqyDrKf-9vcU_Rf9as1XLvMSMDDfKQjmHnLaixfM,9831
|
237
236
|
khoj/interface/compiled/_next/static/css/db7d90554f3ab82b.css,sha256=A3ZAf0StEG3sr_LxAIizczSTYRe1NbtNUpfslvmkqgk,17713
|
238
237
|
khoj/interface/compiled/_next/static/css/ea5485b3f3859a5a.css,sha256=tn6qi2xSLTWhtzDUE8UlC8iipH9QGV6A9oGj1ap-Sk4,1659
|
238
|
+
khoj/interface/compiled/_next/static/css/fc82e43baa9ae218.css,sha256=Be_9BdHEyKPRPxUfj8TohYKFuadPKlvY6aiIh7yGMNQ,2408
|
239
239
|
khoj/interface/compiled/_next/static/media/1d8a05b60287ae6c-s.p.woff2,sha256=IzKBwB_bpSGvO7C9aRv29Js-jAbZPRDI-D-P4H2P918,14508
|
240
240
|
khoj/interface/compiled/_next/static/media/2aa11a72f7f24b58-s.woff2,sha256=QjuuSKmViymmy-itXLB1UbSARxFNHWuMiPpCrYqClFI,22728
|
241
241
|
khoj/interface/compiled/_next/static/media/383a65b63658737d-s.woff2,sha256=VH1XkI87HdFVhsurH5D5ekEjG_ZORTVBVg6xz7p87C8,16704
|
@@ -313,8 +313,8 @@ khoj/interface/compiled/_next/static/media/flags.3afdda2f.webp,sha256=M2AW_HLpBn
|
|
313
313
|
khoj/interface/compiled/_next/static/media/flags@2x.5fbe9fc1.webp,sha256=BBeRPBZkxY3-aKkMnYv5TSkxmbeMbyUH4VRIPfrWg1E,137406
|
314
314
|
khoj/interface/compiled/_next/static/media/globe.98e105ca.webp,sha256=g3ofb8-W9GM75zIhlvQhaS8I2py9TtrovOKR3_7Jf04,514
|
315
315
|
khoj/interface/compiled/_next/static/media/globe@2x.974df6f8.webp,sha256=I_N7Yke3IOoS-0CC6XD8o0IUWG8PdPbrHmf6lpgWlZY,1380
|
316
|
-
khoj/interface/compiled/agents/index.html,sha256=
|
317
|
-
khoj/interface/compiled/agents/index.txt,sha256=
|
316
|
+
khoj/interface/compiled/agents/index.html,sha256=wlfoOlboF5CjuZ81UEIGg2tFJNo9bZCHsC5YVrYjuLg,16532
|
317
|
+
khoj/interface/compiled/agents/index.txt,sha256=S7fS5eRWF7NbhmaDixIyJo_4P2fTwUxmAvdTBvvB8Vg,7351
|
318
318
|
khoj/interface/compiled/assets/icons/khoj_lantern.ico,sha256=eggu-B_v3z1R53EjOFhIqqPnICBGdoaw1xnc0NrzHck,174144
|
319
319
|
khoj/interface/compiled/assets/icons/khoj_lantern.svg,sha256=I_8XP5X84gEOoCRhCRKOQn_GKZrz3SUBXct7WxHvY7c,8767
|
320
320
|
khoj/interface/compiled/assets/icons/khoj_lantern_1200x1200.png,sha256=xDx0bbD-WMflgg8zck9oPIIuTIvywtuED2k7CjSQS4w,66194
|
@@ -329,16 +329,16 @@ khoj/interface/compiled/assets/samples/desktop-remember-plan-sample.png,sha256=i
|
|
329
329
|
khoj/interface/compiled/assets/samples/phone-browse-draw-sample.png,sha256=Dd4fPwtFl6BWqnHjeb1mCK_ND0hhHsWtx8sNE7EiMuE,406179
|
330
330
|
khoj/interface/compiled/assets/samples/phone-plain-chat-sample.png,sha256=DEDaNRCkfEWUeh3kYZWIQDTVK1a6KKnYdwj5ZWisN_Q,82985
|
331
331
|
khoj/interface/compiled/assets/samples/phone-remember-plan-sample.png,sha256=Ma3blirRmq3X4oYSsDbbT7MDn29rymDrjwmUfA9BMuM,236285
|
332
|
-
khoj/interface/compiled/automations/index.html,sha256=
|
333
|
-
khoj/interface/compiled/automations/index.txt,sha256=
|
334
|
-
khoj/interface/compiled/chat/index.html,sha256=
|
335
|
-
khoj/interface/compiled/chat/index.txt,sha256=
|
336
|
-
khoj/interface/compiled/search/index.html,sha256=
|
337
|
-
khoj/interface/compiled/search/index.txt,sha256=
|
338
|
-
khoj/interface/compiled/settings/index.html,sha256=
|
339
|
-
khoj/interface/compiled/settings/index.txt,sha256=
|
340
|
-
khoj/interface/compiled/share/chat/index.html,sha256=
|
341
|
-
khoj/interface/compiled/share/chat/index.txt,sha256=
|
332
|
+
khoj/interface/compiled/automations/index.html,sha256=6VFk_bM8jCKjvFqKExWr-FTg6LcUvit3DERFMvrQI4U,54402
|
333
|
+
khoj/interface/compiled/automations/index.txt,sha256=R1UNtRaozakPYAnTIQxotO0hnDLzlyoro1cCENFWMVA,7580
|
334
|
+
khoj/interface/compiled/chat/index.html,sha256=b0sPw7yrs7T76W0laDGlzBa38hJaO2QvPnfbqRD-kjg,53842
|
335
|
+
khoj/interface/compiled/chat/index.txt,sha256=srUdn5_K5gYI8EuWgrfo_jQODVGWecX4EjbQuK_gkIQ,8124
|
336
|
+
khoj/interface/compiled/search/index.html,sha256=SroZA_t9woCimbaFl7nAMIoUhPntOViS8PU_2BoDJE8,55611
|
337
|
+
khoj/interface/compiled/search/index.txt,sha256=EweptJMNkryUQW2USkI-QymQIgzJ6t5JoLgk0Cd7ON8,6698
|
338
|
+
khoj/interface/compiled/settings/index.html,sha256=eSZmosqdvYjAV0TE9apwgCBLVndxsDBQUxfvQt4QIkU,53050
|
339
|
+
khoj/interface/compiled/settings/index.txt,sha256=_JDgnHRocf_qUVVtVlB9UxYokfhQeuuJA6WLbl0ct2g,7834
|
340
|
+
khoj/interface/compiled/share/chat/index.html,sha256=z3OH5yCf4f28-Ghz8k-fsj01N2a8a2t5HjbPL8UdpDo,53802
|
341
|
+
khoj/interface/compiled/share/chat/index.txt,sha256=WJJk8NPJZjQObu89YxoypSKok5V6QcqDrue8izUckaM,8320
|
342
342
|
khoj/interface/email/feedback.html,sha256=xksuPFamx4hGWyTTxZKRgX_eiYQQEuv-eK9Xmkt-nwU,1216
|
343
343
|
khoj/interface/email/magic_link.html,sha256=372ESbTPKM9acekuZcOIKOw6kBl-KikFg_L9MOHqJkg,2094
|
344
344
|
khoj/interface/email/task.html,sha256=tY7a0gzVeQ2lSQNu7WyXR_s7VYeWTrxWEj1iHVuoVE4,2813
|
@@ -391,7 +391,7 @@ khoj/processor/content/plaintext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
391
391
|
khoj/processor/content/plaintext/plaintext_to_entries.py,sha256=wFZwK_zIc7gWbRtO9sOHo9KvfhGAzL9psX_nKWYFduo,4975
|
392
392
|
khoj/processor/conversation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
393
393
|
khoj/processor/conversation/prompts.py,sha256=F0MVg81Tr7L4W7ubx_UJ-D4PqgGCElTg8KLpQjdPuIk,54207
|
394
|
-
khoj/processor/conversation/utils.py,sha256=
|
394
|
+
khoj/processor/conversation/utils.py,sha256=bpl6y5CWqVShE8fBbpZSl9-aOTGNiBjwXXAORy5ebck,48589
|
395
395
|
khoj/processor/conversation/anthropic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
396
396
|
khoj/processor/conversation/anthropic/anthropic_chat.py,sha256=6IG-YlpFx86EgW3PdGuv4xGMRzvHx4xVUcQMqkKn4vs,5358
|
397
397
|
khoj/processor/conversation/anthropic/utils.py,sha256=Z7mz-LnunLHubZvdzNEAozlJxukl2eNoLvYzeYzsglc,16568
|
@@ -408,7 +408,7 @@ khoj/processor/conversation/openai/utils.py,sha256=0P-vjY4ip4T3ZZg-VI0y8WgOzppr7
|
|
408
408
|
khoj/processor/conversation/openai/whisper.py,sha256=zoEeK1LNCg_tzP4xzYi5vRPzNPGuDGzpkrkG7d1LUn4,447
|
409
409
|
khoj/processor/image/generate.py,sha256=bF80fjsHKkU2f2ADiXJei8-ViqcT0EHaM0wH78KPUC8,12199
|
410
410
|
khoj/processor/operator/README.md,sha256=QaV00W1IB7i8ZrvhNkpjmFMVDtORFt-OASieRQGE_UE,2308
|
411
|
-
khoj/processor/operator/__init__.py,sha256=
|
411
|
+
khoj/processor/operator/__init__.py,sha256=NXvGaW3wvWH1WpYq7uABPThXgkabLlp3ijnFPf5QRn8,11182
|
412
412
|
khoj/processor/operator/grounding_agent.py,sha256=eyWCaIHg12Ak2SbCl7aiiFSoDZ88-AlrqQElRDdDXDE,18917
|
413
413
|
khoj/processor/operator/grounding_agent_uitars.py,sha256=Ujdug_Z2_r1tZmy5kBtHbZcqOp0jSH-7ZnYo1fVdcDQ,42261
|
414
414
|
khoj/processor/operator/operator_actions.py,sha256=eJHxs6idstIbGzzRPHsveuJxl5jH9dHvBhOxuAqjg7M,4268
|
@@ -423,21 +423,21 @@ khoj/processor/speech/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
423
423
|
khoj/processor/speech/text_to_speech.py,sha256=Q7sapi5Hv6woXOumtrGqR0t6izZrFBkWXFOGrHM6dJ4,1929
|
424
424
|
khoj/processor/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
425
425
|
khoj/processor/tools/online_search.py,sha256=JWliYq_IT5EVFk24qo6GWvXuVL5enpSHJQtlmdlrFAc,25976
|
426
|
-
khoj/processor/tools/run_code.py,sha256=
|
426
|
+
khoj/processor/tools/run_code.py,sha256=Olsy6TL-CdZhugSLrvjWmSNcsT58dUcJTlBQ2hhFl2o,12667
|
427
427
|
khoj/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
428
428
|
khoj/routers/api.py,sha256=BFiKwdYjkR-4aHBumM7Hu4XdN2RvQ0Z9V4_2Wd8aPiM,8633
|
429
429
|
khoj/routers/api_agents.py,sha256=QcognyY9FwClgOZw21BF9K7IX16i2070kRoM7c_bKn8,17264
|
430
430
|
khoj/routers/api_automation.py,sha256=ux990dRLbcFadV01T-1McPwvFeR0KLyrWAVpCJ3YLvk,9399
|
431
|
-
khoj/routers/api_chat.py,sha256=
|
431
|
+
khoj/routers/api_chat.py,sha256=_kerg-eHFmBUW9f_kd3XHZzE0nzWm2RPOljSpgh73nc,63331
|
432
432
|
khoj/routers/api_content.py,sha256=GFChoWm4nYdilhzB1ElbJjaJJRfLn8XtkKmLnZOUHrU,24580
|
433
433
|
khoj/routers/api_model.py,sha256=hjIgOQqva4YVv1osQK8p-317_oSKsv1mHbAYFQICxnM,5273
|
434
434
|
khoj/routers/api_phone.py,sha256=p9yfc4WeMHDC0hg3aQk60a2VBy8rZPdEnz9wdJ7DzkU,2208
|
435
435
|
khoj/routers/api_subscription.py,sha256=_Z3gwW5348qrF7sF9rqwkeG291KX5olr9Fd_-ri9faE,6480
|
436
436
|
khoj/routers/auth.py,sha256=jk2lqAS_650lQsoaOFTlZd9W_LL8HbN5zhHTZza_lqs,11258
|
437
437
|
khoj/routers/email.py,sha256=wvr6_fpk0RuKcTPC6suI8JDZPLYzJ9hAhz_G41yZytc,3923
|
438
|
-
khoj/routers/helpers.py,sha256
|
438
|
+
khoj/routers/helpers.py,sha256=-S8MQ5ZOKIjq6u6vhwFffR0fyw4XxQyi85xy2Ov3FOE,123430
|
439
439
|
khoj/routers/notion.py,sha256=g53xyYFmjr2JnuIrTW2vytbfkiK_UkoRTxqnnLSmD5o,2802
|
440
|
-
khoj/routers/research.py,sha256=
|
440
|
+
khoj/routers/research.py,sha256=XO8oO9okfMMWFC4JpJ-lR7vDpf6_-HTjGJcNAUd2HC8,26380
|
441
441
|
khoj/routers/storage.py,sha256=lao0DvsF49QleZvOdjKM98RU2cGfCJDBb7WeoI7Rr3I,2172
|
442
442
|
khoj/routers/twilio.py,sha256=MLsuCm4--ETvr3sLxbF0CL_ehlg_l2rKBSLR2Qh2Xls,1081
|
443
443
|
khoj/routers/web_client.py,sha256=_vyfDaHZZjNoI2LwGNQFRiFmGLkNcgYJe7dOr3mrxH8,4386
|
@@ -457,11 +457,11 @@ khoj/utils/helpers.py,sha256=tLO-rn0eThQVuomSxCMtlEN0WKsSaOZw23-4SCRRwy8,42593
|
|
457
457
|
khoj/utils/initialization.py,sha256=_KslgIsoo-1A_ZuouHH3WDbV-TpqBSaID_0b-1xXE0U,15169
|
458
458
|
khoj/utils/jsonl.py,sha256=0Ac_COqr8sLCXntzZtquxuCEVRM2c3yKeDRGhgOBRpQ,1192
|
459
459
|
khoj/utils/models.py,sha256=Q5tcC9-z25sCiub048fLnvZ6_IIO1bcPNxt5payekk0,2009
|
460
|
-
khoj/utils/rawconfig.py,sha256=
|
460
|
+
khoj/utils/rawconfig.py,sha256=lgq0FfJOkdALLkoISjmBSEnzuaTPShsTuFUbXlf6brk,5406
|
461
461
|
khoj/utils/state.py,sha256=s_GFWOqRzpEDx0eCPStuzBTK2VEw-qgRpH0aiEdGnDo,1791
|
462
462
|
khoj/utils/yaml.py,sha256=qy1Tkc61rDMesBw_Cyx2vOR6H-Hngcsm5kYfjwQBwkE,1543
|
463
|
-
khoj-2.0.
|
464
|
-
khoj-2.0.
|
465
|
-
khoj-2.0.
|
466
|
-
khoj-2.0.
|
467
|
-
khoj-2.0.
|
463
|
+
khoj-2.0.0b9.dist-info/METADATA,sha256=G4DX76ZAi85BLRfLTx2owlZTYD6yL329wnIkM62O7_Q,8968
|
464
|
+
khoj-2.0.0b9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
465
|
+
khoj-2.0.0b9.dist-info/entry_points.txt,sha256=KBIcez5N_jCgq_ER4Uxf-e1lxTBMTE_BBjMwwfeZyAg,39
|
466
|
+
khoj-2.0.0b9.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
467
|
+
khoj-2.0.0b9.dist-info/RECORD,,
|