khoj 1.25.1.dev9__py3-none-any.whl → 1.26.1.dev3__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 +81 -11
- khoj/database/admin.py +18 -1
- khoj/database/migrations/0068_alter_agent_output_modes.py +24 -0
- khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +89 -0
- khoj/database/models/__init__.py +78 -2
- khoj/interface/compiled/404/index.html +1 -1
- khoj/interface/compiled/_next/static/chunks/1603-fa3ee48860b9dc5c.js +1 -0
- khoj/interface/compiled/_next/static/chunks/{9417-1d158bf46d3a0dc9.js → 9417-1ad504db22331388.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{9479-563e4d61f91d5a7c.js → 9479-adede27bb126b5d0.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/agents/{layout-e71c8e913cccf792.js → layout-75636ab3a413fa8e.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/agents/{page-b406d166301c4c7d.js → page-e9eee31dbdb4658c.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/chat/{layout-8102549127db3067.js → layout-96fcf62857bf8f30.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/{layout-f3e40d346da53112.js → layout-d0f0a9067427fb20.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/settings/{layout-6f9314b0d7a26046.js → layout-a8f33dfe92f997fb.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/app/share/chat/{layout-39f03f9e32399f0f.js → layout-2df56074e42adaa0.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{webpack-462819dcfa6a1e2b.js → webpack-ba79408024891b00.js} +1 -1
- khoj/interface/compiled/_next/static/css/467a524c75e7d7c0.css +1 -0
- khoj/interface/compiled/_next/static/css/{b1094827d745306b.css → f768dddada62459d.css} +1 -1
- khoj/interface/compiled/agents/index.html +1 -1
- khoj/interface/compiled/agents/index.txt +2 -2
- khoj/interface/compiled/automations/index.html +1 -1
- khoj/interface/compiled/automations/index.txt +2 -2
- khoj/interface/compiled/chat/index.html +1 -1
- khoj/interface/compiled/chat/index.txt +2 -2
- khoj/interface/compiled/factchecker/index.html +1 -1
- khoj/interface/compiled/factchecker/index.txt +2 -2
- khoj/interface/compiled/index.html +1 -1
- khoj/interface/compiled/index.txt +2 -2
- khoj/interface/compiled/search/index.html +1 -1
- khoj/interface/compiled/search/index.txt +2 -2
- khoj/interface/compiled/settings/index.html +1 -1
- khoj/interface/compiled/settings/index.txt +3 -3
- khoj/interface/compiled/share/chat/index.html +1 -1
- khoj/interface/compiled/share/chat/index.txt +2 -2
- khoj/interface/web/assets/icons/agents.svg +1 -0
- khoj/interface/web/assets/icons/automation.svg +1 -0
- khoj/interface/web/assets/icons/chat.svg +24 -0
- khoj/interface/web/login.html +11 -22
- khoj/processor/content/images/image_to_entries.py +2 -0
- khoj/processor/conversation/google/utils.py +4 -0
- khoj/processor/conversation/prompts.py +1 -1
- khoj/processor/embeddings.py +1 -0
- khoj/processor/tools/online_search.py +135 -42
- khoj/routers/api_chat.py +34 -505
- khoj/routers/helpers.py +13 -11
- khoj/search_type/text_search.py +7 -2
- khoj/utils/helpers.py +50 -5
- {khoj-1.25.1.dev9.dist-info → khoj-1.26.1.dev3.dist-info}/METADATA +4 -4
- {khoj-1.25.1.dev9.dist-info → khoj-1.26.1.dev3.dist-info}/RECORD +54 -51
- khoj/interface/compiled/_next/static/chunks/1603-67a89278e2c5dbe6.js +0 -1
- khoj/interface/compiled/_next/static/css/1538cedb321e3a97.css +0 -1
- /khoj/interface/compiled/_next/static/{jRL5xyceUdI0nvEyCkgqF → 0KX2AuxAEK1Jhb97imej7}/_buildManifest.js +0 -0
- /khoj/interface/compiled/_next/static/{jRL5xyceUdI0nvEyCkgqF → 0KX2AuxAEK1Jhb97imej7}/_ssgManifest.js +0 -0
- {khoj-1.25.1.dev9.dist-info → khoj-1.26.1.dev3.dist-info}/WHEEL +0 -0
- {khoj-1.25.1.dev9.dist-info → khoj-1.26.1.dev3.dist-info}/entry_points.txt +0 -0
- {khoj-1.25.1.dev9.dist-info → khoj-1.26.1.dev3.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,7 @@
|
|
1
1
|
import json
|
2
2
|
import logging
|
3
3
|
import math
|
4
|
+
import os
|
4
5
|
import random
|
5
6
|
import re
|
6
7
|
import secrets
|
@@ -10,7 +11,6 @@ from enum import Enum
|
|
10
11
|
from typing import Callable, Iterable, List, Optional, Type
|
11
12
|
|
12
13
|
import cron_descriptor
|
13
|
-
import django
|
14
14
|
from apscheduler.job import Job
|
15
15
|
from asgiref.sync import sync_to_async
|
16
16
|
from django.contrib.sessions.backends.db import SessionStore
|
@@ -52,6 +52,7 @@ from khoj.database.models import (
|
|
52
52
|
UserTextToImageModelConfig,
|
53
53
|
UserVoiceModelConfig,
|
54
54
|
VoiceModelOption,
|
55
|
+
WebScraper,
|
55
56
|
)
|
56
57
|
from khoj.processor.conversation import prompts
|
57
58
|
from khoj.search_filter.date_filter import DateFilter
|
@@ -59,7 +60,12 @@ from khoj.search_filter.file_filter import FileFilter
|
|
59
60
|
from khoj.search_filter.word_filter import WordFilter
|
60
61
|
from khoj.utils import state
|
61
62
|
from khoj.utils.config import OfflineChatProcessorModel
|
62
|
-
from khoj.utils.helpers import
|
63
|
+
from khoj.utils.helpers import (
|
64
|
+
generate_random_name,
|
65
|
+
in_debug_mode,
|
66
|
+
is_none_or_empty,
|
67
|
+
timer,
|
68
|
+
)
|
63
69
|
|
64
70
|
logger = logging.getLogger(__name__)
|
65
71
|
|
@@ -939,21 +945,21 @@ class ConversationAdapters:
|
|
939
945
|
def get_conversation_config(user: KhojUser):
|
940
946
|
subscribed = is_user_subscribed(user)
|
941
947
|
if not subscribed:
|
942
|
-
return ConversationAdapters.get_default_conversation_config()
|
948
|
+
return ConversationAdapters.get_default_conversation_config(user)
|
943
949
|
config = UserConversationConfig.objects.filter(user=user).first()
|
944
950
|
if config:
|
945
951
|
return config.setting
|
946
|
-
return ConversationAdapters.get_advanced_conversation_config()
|
952
|
+
return ConversationAdapters.get_advanced_conversation_config(user)
|
947
953
|
|
948
954
|
@staticmethod
|
949
955
|
async def aget_conversation_config(user: KhojUser):
|
950
956
|
subscribed = await ais_user_subscribed(user)
|
951
957
|
if not subscribed:
|
952
|
-
return await ConversationAdapters.aget_default_conversation_config()
|
958
|
+
return await ConversationAdapters.aget_default_conversation_config(user)
|
953
959
|
config = await UserConversationConfig.objects.filter(user=user).prefetch_related("setting").afirst()
|
954
960
|
if config:
|
955
961
|
return config.setting
|
956
|
-
return ConversationAdapters.aget_advanced_conversation_config()
|
962
|
+
return ConversationAdapters.aget_advanced_conversation_config(user)
|
957
963
|
|
958
964
|
@staticmethod
|
959
965
|
async def aget_voice_model_config(user: KhojUser) -> Optional[VoiceModelOption]:
|
@@ -1014,22 +1020,86 @@ class ConversationAdapters:
|
|
1014
1020
|
return await ChatModelOptions.objects.filter().prefetch_related("openai_config").afirst()
|
1015
1021
|
|
1016
1022
|
@staticmethod
|
1017
|
-
def get_advanced_conversation_config():
|
1023
|
+
def get_advanced_conversation_config(user: KhojUser):
|
1018
1024
|
server_chat_settings = ServerChatSettings.objects.first()
|
1019
1025
|
if server_chat_settings is not None and server_chat_settings.chat_advanced is not None:
|
1020
1026
|
return server_chat_settings.chat_advanced
|
1021
|
-
return ConversationAdapters.get_default_conversation_config()
|
1027
|
+
return ConversationAdapters.get_default_conversation_config(user)
|
1022
1028
|
|
1023
1029
|
@staticmethod
|
1024
|
-
async def aget_advanced_conversation_config():
|
1030
|
+
async def aget_advanced_conversation_config(user: KhojUser = None):
|
1025
1031
|
server_chat_settings: ServerChatSettings = (
|
1026
1032
|
await ServerChatSettings.objects.filter()
|
1027
1033
|
.prefetch_related("chat_advanced", "chat_advanced__openai_config")
|
1028
1034
|
.afirst()
|
1029
1035
|
)
|
1030
|
-
if server_chat_settings is not None
|
1036
|
+
if server_chat_settings is not None and server_chat_settings.chat_advanced is not None:
|
1031
1037
|
return server_chat_settings.chat_advanced
|
1032
|
-
return await ConversationAdapters.aget_default_conversation_config()
|
1038
|
+
return await ConversationAdapters.aget_default_conversation_config(user)
|
1039
|
+
|
1040
|
+
@staticmethod
|
1041
|
+
async def aget_server_webscraper():
|
1042
|
+
server_chat_settings = await ServerChatSettings.objects.filter().prefetch_related("web_scraper").afirst()
|
1043
|
+
if server_chat_settings is not None and server_chat_settings.web_scraper is not None:
|
1044
|
+
return server_chat_settings.web_scraper
|
1045
|
+
return None
|
1046
|
+
|
1047
|
+
@staticmethod
|
1048
|
+
async def aget_enabled_webscrapers() -> list[WebScraper]:
|
1049
|
+
enabled_scrapers: list[WebScraper] = []
|
1050
|
+
server_webscraper = await ConversationAdapters.aget_server_webscraper()
|
1051
|
+
if server_webscraper:
|
1052
|
+
# Only use the webscraper set in the server chat settings
|
1053
|
+
enabled_scrapers = [server_webscraper]
|
1054
|
+
if not enabled_scrapers:
|
1055
|
+
# Use the enabled web scrapers, ordered by priority, until get web page content
|
1056
|
+
enabled_scrapers = [scraper async for scraper in WebScraper.objects.all().order_by("priority").aiterator()]
|
1057
|
+
if not enabled_scrapers:
|
1058
|
+
# Use scrapers enabled via environment variables
|
1059
|
+
if os.getenv("FIRECRAWL_API_KEY"):
|
1060
|
+
api_url = os.getenv("FIRECRAWL_API_URL", "https://api.firecrawl.dev")
|
1061
|
+
enabled_scrapers.append(
|
1062
|
+
WebScraper(
|
1063
|
+
type=WebScraper.WebScraperType.FIRECRAWL,
|
1064
|
+
name=WebScraper.WebScraperType.FIRECRAWL.capitalize(),
|
1065
|
+
api_key=os.getenv("FIRECRAWL_API_KEY"),
|
1066
|
+
api_url=api_url,
|
1067
|
+
)
|
1068
|
+
)
|
1069
|
+
if os.getenv("OLOSTEP_API_KEY"):
|
1070
|
+
api_url = os.getenv("OLOSTEP_API_URL", "https://agent.olostep.com/olostep-p2p-incomingAPI")
|
1071
|
+
enabled_scrapers.append(
|
1072
|
+
WebScraper(
|
1073
|
+
type=WebScraper.WebScraperType.OLOSTEP,
|
1074
|
+
name=WebScraper.WebScraperType.OLOSTEP.capitalize(),
|
1075
|
+
api_key=os.getenv("OLOSTEP_API_KEY"),
|
1076
|
+
api_url=api_url,
|
1077
|
+
)
|
1078
|
+
)
|
1079
|
+
# Jina is the default fallback scrapers to use as it does not require an API key
|
1080
|
+
api_url = os.getenv("JINA_READER_API_URL", "https://r.jina.ai/")
|
1081
|
+
enabled_scrapers.append(
|
1082
|
+
WebScraper(
|
1083
|
+
type=WebScraper.WebScraperType.JINA,
|
1084
|
+
name=WebScraper.WebScraperType.JINA.capitalize(),
|
1085
|
+
api_key=os.getenv("JINA_API_KEY"),
|
1086
|
+
api_url=api_url,
|
1087
|
+
)
|
1088
|
+
)
|
1089
|
+
|
1090
|
+
# Only enable the direct web page scraper by default in self-hosted single user setups.
|
1091
|
+
# Useful for reading webpages on your intranet.
|
1092
|
+
if state.anonymous_mode or in_debug_mode():
|
1093
|
+
enabled_scrapers.append(
|
1094
|
+
WebScraper(
|
1095
|
+
type=WebScraper.WebScraperType.DIRECT,
|
1096
|
+
name=WebScraper.WebScraperType.DIRECT.capitalize(),
|
1097
|
+
api_key=None,
|
1098
|
+
api_url=None,
|
1099
|
+
)
|
1100
|
+
)
|
1101
|
+
|
1102
|
+
return enabled_scrapers
|
1033
1103
|
|
1034
1104
|
@staticmethod
|
1035
1105
|
def create_conversation_from_public_conversation(
|
khoj/database/admin.py
CHANGED
@@ -31,6 +31,7 @@ from khoj.database.models import (
|
|
31
31
|
UserSearchModelConfig,
|
32
32
|
UserVoiceModelConfig,
|
33
33
|
VoiceModelOption,
|
34
|
+
WebScraper,
|
34
35
|
)
|
35
36
|
from khoj.utils.helpers import ImageIntentType
|
36
37
|
|
@@ -69,10 +70,11 @@ class KhojUserAdmin(UserAdmin):
|
|
69
70
|
"id",
|
70
71
|
"email",
|
71
72
|
"username",
|
73
|
+
"phone_number",
|
72
74
|
"is_active",
|
75
|
+
"uuid",
|
73
76
|
"is_staff",
|
74
77
|
"is_superuser",
|
75
|
-
"phone_number",
|
76
78
|
)
|
77
79
|
search_fields = ("email", "username", "phone_number", "uuid")
|
78
80
|
filter_horizontal = ("groups", "user_permissions")
|
@@ -197,7 +199,22 @@ class ServerChatSettingsAdmin(admin.ModelAdmin):
|
|
197
199
|
list_display = (
|
198
200
|
"chat_default",
|
199
201
|
"chat_advanced",
|
202
|
+
"web_scraper",
|
203
|
+
)
|
204
|
+
|
205
|
+
|
206
|
+
@admin.register(WebScraper)
|
207
|
+
class WebScraperAdmin(admin.ModelAdmin):
|
208
|
+
list_display = (
|
209
|
+
"priority",
|
210
|
+
"name",
|
211
|
+
"type",
|
212
|
+
"api_key",
|
213
|
+
"api_url",
|
214
|
+
"created_at",
|
200
215
|
)
|
216
|
+
search_fields = ("name", "api_key", "api_url", "type")
|
217
|
+
ordering = ("priority",)
|
201
218
|
|
202
219
|
|
203
220
|
@admin.register(Conversation)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Generated by Django 5.0.8 on 2024-10-17 18:13
|
2
|
+
|
3
|
+
import django.contrib.postgres.fields
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
|
7
|
+
class Migration(migrations.Migration):
|
8
|
+
dependencies = [
|
9
|
+
("database", "0067_alter_agent_style_icon"),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AlterField(
|
14
|
+
model_name="agent",
|
15
|
+
name="output_modes",
|
16
|
+
field=django.contrib.postgres.fields.ArrayField(
|
17
|
+
base_field=models.CharField(
|
18
|
+
choices=[("text", "Text"), ("image", "Image"), ("automation", "Automation")], max_length=200
|
19
|
+
),
|
20
|
+
default=list,
|
21
|
+
size=None,
|
22
|
+
),
|
23
|
+
),
|
24
|
+
]
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Generated by Django 5.0.8 on 2024-10-18 00:41
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
|
7
|
+
class Migration(migrations.Migration):
|
8
|
+
dependencies = [
|
9
|
+
("database", "0068_alter_agent_output_modes"),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.CreateModel(
|
14
|
+
name="WebScraper",
|
15
|
+
fields=[
|
16
|
+
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
|
17
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
18
|
+
("updated_at", models.DateTimeField(auto_now=True)),
|
19
|
+
(
|
20
|
+
"name",
|
21
|
+
models.CharField(
|
22
|
+
blank=True,
|
23
|
+
default=None,
|
24
|
+
help_text="Friendly name. If not set, it will be set to the type of the scraper.",
|
25
|
+
max_length=200,
|
26
|
+
null=True,
|
27
|
+
unique=True,
|
28
|
+
),
|
29
|
+
),
|
30
|
+
(
|
31
|
+
"type",
|
32
|
+
models.CharField(
|
33
|
+
choices=[
|
34
|
+
("Firecrawl", "Firecrawl"),
|
35
|
+
("Olostep", "Olostep"),
|
36
|
+
("Jina", "Jina"),
|
37
|
+
("Direct", "Direct"),
|
38
|
+
],
|
39
|
+
default="Jina",
|
40
|
+
max_length=20,
|
41
|
+
),
|
42
|
+
),
|
43
|
+
(
|
44
|
+
"api_key",
|
45
|
+
models.CharField(
|
46
|
+
blank=True,
|
47
|
+
default=None,
|
48
|
+
help_text="API key of the web scraper. Only set if scraper service requires an API key. Default is set from env var.",
|
49
|
+
max_length=200,
|
50
|
+
null=True,
|
51
|
+
),
|
52
|
+
),
|
53
|
+
(
|
54
|
+
"api_url",
|
55
|
+
models.URLField(
|
56
|
+
blank=True,
|
57
|
+
default=None,
|
58
|
+
help_text="API URL of the web scraper. Only set if scraper service on non-default URL.",
|
59
|
+
null=True,
|
60
|
+
),
|
61
|
+
),
|
62
|
+
(
|
63
|
+
"priority",
|
64
|
+
models.IntegerField(
|
65
|
+
blank=True,
|
66
|
+
default=None,
|
67
|
+
help_text="Priority of the web scraper. Lower numbers run first.",
|
68
|
+
null=True,
|
69
|
+
unique=True,
|
70
|
+
),
|
71
|
+
),
|
72
|
+
],
|
73
|
+
options={
|
74
|
+
"abstract": False,
|
75
|
+
},
|
76
|
+
),
|
77
|
+
migrations.AddField(
|
78
|
+
model_name="serverchatsettings",
|
79
|
+
name="web_scraper",
|
80
|
+
field=models.ForeignKey(
|
81
|
+
blank=True,
|
82
|
+
default=None,
|
83
|
+
null=True,
|
84
|
+
on_delete=django.db.models.deletion.CASCADE,
|
85
|
+
related_name="web_scraper",
|
86
|
+
to="database.webscraper",
|
87
|
+
),
|
88
|
+
),
|
89
|
+
]
|
khoj/database/models/__init__.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import os
|
1
2
|
import re
|
2
3
|
import uuid
|
3
4
|
from random import choice
|
@@ -11,8 +12,6 @@ from django.dispatch import receiver
|
|
11
12
|
from pgvector.django import VectorField
|
12
13
|
from phonenumber_field.modelfields import PhoneNumberField
|
13
14
|
|
14
|
-
from khoj.utils.helpers import ConversationCommand
|
15
|
-
|
16
15
|
|
17
16
|
class BaseModel(models.Model):
|
18
17
|
created_at = models.DateTimeField(auto_now_add=True)
|
@@ -174,6 +173,7 @@ class Agent(BaseModel):
|
|
174
173
|
# These map to various ConversationCommand types
|
175
174
|
TEXT = "text"
|
176
175
|
IMAGE = "image"
|
176
|
+
AUTOMATION = "automation"
|
177
177
|
|
178
178
|
creator = models.ForeignKey(
|
179
179
|
KhojUser, on_delete=models.CASCADE, default=None, null=True, blank=True
|
@@ -243,6 +243,79 @@ class GithubRepoConfig(BaseModel):
|
|
243
243
|
github_config = models.ForeignKey(GithubConfig, on_delete=models.CASCADE, related_name="githubrepoconfig")
|
244
244
|
|
245
245
|
|
246
|
+
class WebScraper(BaseModel):
|
247
|
+
class WebScraperType(models.TextChoices):
|
248
|
+
FIRECRAWL = "Firecrawl"
|
249
|
+
OLOSTEP = "Olostep"
|
250
|
+
JINA = "Jina"
|
251
|
+
DIRECT = "Direct"
|
252
|
+
|
253
|
+
name = models.CharField(
|
254
|
+
max_length=200,
|
255
|
+
default=None,
|
256
|
+
null=True,
|
257
|
+
blank=True,
|
258
|
+
unique=True,
|
259
|
+
help_text="Friendly name. If not set, it will be set to the type of the scraper.",
|
260
|
+
)
|
261
|
+
type = models.CharField(max_length=20, choices=WebScraperType.choices, default=WebScraperType.JINA)
|
262
|
+
api_key = models.CharField(
|
263
|
+
max_length=200,
|
264
|
+
default=None,
|
265
|
+
null=True,
|
266
|
+
blank=True,
|
267
|
+
help_text="API key of the web scraper. Only set if scraper service requires an API key. Default is set from env var.",
|
268
|
+
)
|
269
|
+
api_url = models.URLField(
|
270
|
+
max_length=200,
|
271
|
+
default=None,
|
272
|
+
null=True,
|
273
|
+
blank=True,
|
274
|
+
help_text="API URL of the web scraper. Only set if scraper service on non-default URL.",
|
275
|
+
)
|
276
|
+
priority = models.IntegerField(
|
277
|
+
default=None,
|
278
|
+
null=True,
|
279
|
+
blank=True,
|
280
|
+
unique=True,
|
281
|
+
help_text="Priority of the web scraper. Lower numbers run first.",
|
282
|
+
)
|
283
|
+
|
284
|
+
def clean(self):
|
285
|
+
error = {}
|
286
|
+
if self.name is None:
|
287
|
+
self.name = self.type.capitalize()
|
288
|
+
if self.api_url is None:
|
289
|
+
if self.type == self.WebScraperType.FIRECRAWL:
|
290
|
+
self.api_url = os.getenv("FIRECRAWL_API_URL", "https://api.firecrawl.dev")
|
291
|
+
elif self.type == self.WebScraperType.OLOSTEP:
|
292
|
+
self.api_url = os.getenv("OLOSTEP_API_URL", "https://agent.olostep.com/olostep-p2p-incomingAPI")
|
293
|
+
elif self.type == self.WebScraperType.JINA:
|
294
|
+
self.api_url = os.getenv("JINA_READER_API_URL", "https://r.jina.ai/")
|
295
|
+
if self.api_key is None:
|
296
|
+
if self.type == self.WebScraperType.FIRECRAWL:
|
297
|
+
self.api_key = os.getenv("FIRECRAWL_API_KEY")
|
298
|
+
if not self.api_key and self.api_url == "https://api.firecrawl.dev":
|
299
|
+
error["api_key"] = "Set API key to use default Firecrawl. Get API key from https://firecrawl.dev."
|
300
|
+
elif self.type == self.WebScraperType.OLOSTEP:
|
301
|
+
self.api_key = os.getenv("OLOSTEP_API_KEY")
|
302
|
+
if self.api_key is None:
|
303
|
+
error["api_key"] = "Set API key to use Olostep. Get API key from https://olostep.com/."
|
304
|
+
elif self.type == self.WebScraperType.JINA:
|
305
|
+
self.api_key = os.getenv("JINA_API_KEY")
|
306
|
+
if error:
|
307
|
+
raise ValidationError(error)
|
308
|
+
|
309
|
+
def save(self, *args, **kwargs):
|
310
|
+
self.clean()
|
311
|
+
|
312
|
+
if self.priority is None:
|
313
|
+
max_priority = WebScraper.objects.aggregate(models.Max("priority"))["priority__max"]
|
314
|
+
self.priority = max_priority + 1 if max_priority else 1
|
315
|
+
|
316
|
+
super().save(*args, **kwargs)
|
317
|
+
|
318
|
+
|
246
319
|
class ServerChatSettings(BaseModel):
|
247
320
|
chat_default = models.ForeignKey(
|
248
321
|
ChatModelOptions, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="chat_default"
|
@@ -250,6 +323,9 @@ class ServerChatSettings(BaseModel):
|
|
250
323
|
chat_advanced = models.ForeignKey(
|
251
324
|
ChatModelOptions, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="chat_advanced"
|
252
325
|
)
|
326
|
+
web_scraper = models.ForeignKey(
|
327
|
+
WebScraper, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="web_scraper"
|
328
|
+
)
|
253
329
|
|
254
330
|
|
255
331
|
class LocalOrgConfig(BaseModel):
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/0e790e04fd40ad16-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/1538cedb321e3a97.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/b9a6bf04305d98d7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-462819dcfa6a1e2b.js"/><script src="/_next/static/chunks/fd9d1056-2b978342deb60015.js" async=""></script><script src="/_next/static/chunks/7023-a5bf5744d19b3bd3.js" async=""></script><script src="/_next/static/chunks/main-app-6d6ee3495efe03d4.js" async=""></script><meta name="robots" content="noindex"/><meta http-equiv="Content-Security-Policy" content="default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';"/><title>404: This page could not be found.</title><title>Khoj AI - Home</title><meta name="description" content="Your Second Brain."/><link rel="manifest" href="/static/khoj.webmanifest" crossorigin="use-credentials"/><meta property="og:title" content="Khoj AI - Home"/><meta property="og:description" content="Your Second Brain."/><meta property="og:url" content="https://app.khoj.dev/"/><meta property="og:site_name" content="Khoj AI"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta property="og:image:width" content="256"/><meta property="og:image:height" content="256"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Khoj AI - Home"/><meta name="twitter:description" content="Your Second Brain."/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta name="twitter:image:width" content="256"/><meta name="twitter:image:height" content="256"/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/static/assets/icons/khoj_lantern.ico"/><link rel="apple-touch-icon" href="/static/assets/icons/khoj_lantern_256x256.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_90df87"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-462819dcfa6a1e2b.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e790e04fd40ad16-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/1538cedb321e3a97.css\",\"style\"]\n3:HL[\"/_next/static/css/b9a6bf04305d98d7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"4:I[95751,[],\"\"]\n6:I[39275,[],\"\"]\n7:I[61343,[],\"\"]\nd:I[76130,[],\"\"]\n8:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n9:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\na:{\"display\":\"inline-block\"}\nb:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\ne:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"jRL5xyceUdI0nvEyCkgqF\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1538cedb321e3a97.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b9a6bf04305d98d7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"meta\",null,{\"httpEquiv\":\"Content-Security-Policy\",\"content\":\"default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';\"}],[\"$\",\"body\",null,{\"className\":\"__className_90df87\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$9\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$b\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Lc\"],\"globalErrorComponent\":\"$d\",\"missingSlots\":\"$We\"}]\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"link\",\"4\",{\"rel\":\"manifest\",\"href\":\"/static/khoj.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:url\",\"content\":\"https://app.khoj.dev/\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:site_name\",\"content\":\"Khoj AI\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/static/assets/icons/khoj_lantern.ico\"}],[\"$\",\"link\",\"26\",{\"rel\":\"apple-touch-icon\",\"href\":\"/static/assets/icons/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"5:null\n"])</script></body></html>
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/0e790e04fd40ad16-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/467a524c75e7d7c0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/b9a6bf04305d98d7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ba79408024891b00.js"/><script src="/_next/static/chunks/fd9d1056-2b978342deb60015.js" async=""></script><script src="/_next/static/chunks/7023-a5bf5744d19b3bd3.js" async=""></script><script src="/_next/static/chunks/main-app-6d6ee3495efe03d4.js" async=""></script><meta name="robots" content="noindex"/><meta http-equiv="Content-Security-Policy" content="default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';"/><title>404: This page could not be found.</title><title>Khoj AI - Home</title><meta name="description" content="Your Second Brain."/><link rel="manifest" href="/static/khoj.webmanifest" crossorigin="use-credentials"/><meta property="og:title" content="Khoj AI - Home"/><meta property="og:description" content="Your Second Brain."/><meta property="og:url" content="https://app.khoj.dev/"/><meta property="og:site_name" content="Khoj AI"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta property="og:image:width" content="256"/><meta property="og:image:height" content="256"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Khoj AI - Home"/><meta name="twitter:description" content="Your Second Brain."/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta name="twitter:image:width" content="256"/><meta name="twitter:image:height" content="256"/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/static/assets/icons/khoj_lantern.ico"/><link rel="apple-touch-icon" href="/static/assets/icons/khoj_lantern_256x256.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_e594dd"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-ba79408024891b00.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e790e04fd40ad16-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/467a524c75e7d7c0.css\",\"style\"]\n3:HL[\"/_next/static/css/b9a6bf04305d98d7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"4:I[95751,[],\"\"]\n6:I[39275,[],\"\"]\n7:I[61343,[],\"\"]\nd:I[76130,[],\"\"]\n8:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n9:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\na:{\"display\":\"inline-block\"}\nb:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\ne:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"0KX2AuxAEK1Jhb97imej7\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/467a524c75e7d7c0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b9a6bf04305d98d7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"meta\",null,{\"httpEquiv\":\"Content-Security-Policy\",\"content\":\"default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';\"}],[\"$\",\"body\",null,{\"className\":\"__className_e594dd\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$9\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$b\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Lc\"],\"globalErrorComponent\":\"$d\",\"missingSlots\":\"$We\"}]\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"link\",\"4\",{\"rel\":\"manifest\",\"href\":\"/static/khoj.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:url\",\"content\":\"https://app.khoj.dev/\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:site_name\",\"content\":\"Khoj AI\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/static/assets/icons/khoj_lantern.ico\"}],[\"$\",\"link\",\"26\",{\"rel\":\"apple-touch-icon\",\"href\":\"/static/assets/icons/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"5:null\n"])</script></body></html>
|