khoj 1.25.1.dev12__py3-none-any.whl → 1.26.2__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 +87 -9
- khoj/database/admin.py +16 -0
- 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-46ed3aaa639c85ef.js} +1 -1
- khoj/interface/compiled/_next/static/chunks/{9479-563e4d61f91d5a7c.js → 9479-ea776e73f549090c.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-f8d03847a0fa2539.js → page-88aa3042711107b7.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-dff708c71e9234cb.js → webpack-64dc39af85cd2625.js} +1 -1
- khoj/interface/compiled/_next/static/css/467a524c75e7d7c0.css +1 -0
- 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/content/pdf/pdf_to_entries.py +1 -1
- 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 -40
- khoj/routers/api_chat.py +41 -31
- khoj/routers/helpers.py +13 -11
- khoj/search_type/text_search.py +7 -2
- khoj/utils/helpers.py +50 -5
- {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/METADATA +4 -4
- {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/RECORD +56 -53
- 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/chunks/{9178-f208a3e6404714a9.js → 9178-899fe9a6b754ecfe.js} +0 -0
- /khoj/interface/compiled/_next/static/chunks/app/{page-421d13f70c505dd9.js → page-10a5aad6e04f3cf8.js} +0 -0
- /khoj/interface/compiled/_next/static/{CGyts-FEbV6owmPboHtLL → eim4XajTfG4ub4ft5AEkJ}/_buildManifest.js +0 -0
- /khoj/interface/compiled/_next/static/{CGyts-FEbV6owmPboHtLL → eim4XajTfG4ub4ft5AEkJ}/_ssgManifest.js +0 -0
- {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/WHEEL +0 -0
- {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/entry_points.txt +0 -0
- {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.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
|
|
@@ -1031,6 +1037,70 @@ class ConversationAdapters:
|
|
1031
1037
|
return server_chat_settings.chat_advanced
|
1032
1038
|
return await ConversationAdapters.aget_default_conversation_config(user)
|
1033
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
|
1103
|
+
|
1034
1104
|
@staticmethod
|
1035
1105
|
def create_conversation_from_public_conversation(
|
1036
1106
|
user: KhojUser, public_conversation: PublicConversation, client_app: ClientApplication
|
@@ -1393,12 +1463,15 @@ class EntryAdapters:
|
|
1393
1463
|
file_filters = EntryAdapters.file_filter.get_filter_terms(query)
|
1394
1464
|
date_filters = EntryAdapters.date_filter.get_query_date_range(query)
|
1395
1465
|
|
1396
|
-
|
1466
|
+
owner_filter = Q()
|
1467
|
+
|
1468
|
+
if user != None:
|
1469
|
+
owner_filter = Q(user=user)
|
1397
1470
|
if agent != None:
|
1398
|
-
|
1471
|
+
owner_filter |= Q(agent=agent)
|
1399
1472
|
|
1400
1473
|
if len(word_filters) == 0 and len(file_filters) == 0 and len(date_filters) == 0:
|
1401
|
-
return Entry.objects.filter(
|
1474
|
+
return Entry.objects.filter(owner_filter)
|
1402
1475
|
|
1403
1476
|
for term in word_filters:
|
1404
1477
|
if term.startswith("+"):
|
@@ -1434,7 +1507,7 @@ class EntryAdapters:
|
|
1434
1507
|
formatted_max_date = date.fromtimestamp(max_date).strftime("%Y-%m-%d")
|
1435
1508
|
q_filter_terms &= Q(embeddings_dates__date__lte=formatted_max_date)
|
1436
1509
|
|
1437
|
-
relevant_entries = Entry.objects.filter(
|
1510
|
+
relevant_entries = Entry.objects.filter(owner_filter).filter(q_filter_terms)
|
1438
1511
|
if file_type_filter:
|
1439
1512
|
relevant_entries = relevant_entries.filter(file_type=file_type_filter)
|
1440
1513
|
return relevant_entries
|
@@ -1449,13 +1522,18 @@ class EntryAdapters:
|
|
1449
1522
|
max_distance: float = math.inf,
|
1450
1523
|
agent: Agent = None,
|
1451
1524
|
):
|
1452
|
-
|
1525
|
+
owner_filter = Q()
|
1453
1526
|
|
1527
|
+
if user != None:
|
1528
|
+
owner_filter = Q(user=user)
|
1454
1529
|
if agent != None:
|
1455
|
-
|
1530
|
+
owner_filter |= Q(agent=agent)
|
1531
|
+
|
1532
|
+
if owner_filter == Q():
|
1533
|
+
return Entry.objects.none()
|
1456
1534
|
|
1457
1535
|
relevant_entries = EntryAdapters.apply_filters(user, raw_query, file_type_filter, agent)
|
1458
|
-
relevant_entries = relevant_entries.filter(
|
1536
|
+
relevant_entries = relevant_entries.filter(owner_filter).annotate(
|
1459
1537
|
distance=CosineDistance("embeddings", embeddings)
|
1460
1538
|
)
|
1461
1539
|
relevant_entries = relevant_entries.filter(distance__lte=max_distance)
|
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
|
|
@@ -198,9 +199,24 @@ class ServerChatSettingsAdmin(admin.ModelAdmin):
|
|
198
199
|
list_display = (
|
199
200
|
"chat_default",
|
200
201
|
"chat_advanced",
|
202
|
+
"web_scraper",
|
201
203
|
)
|
202
204
|
|
203
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",
|
215
|
+
)
|
216
|
+
search_fields = ("name", "api_key", "api_url", "type")
|
217
|
+
ordering = ("priority",)
|
218
|
+
|
219
|
+
|
204
220
|
@admin.register(Conversation)
|
205
221
|
class ConversationAdmin(admin.ModelAdmin):
|
206
222
|
list_display = (
|
@@ -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-dff708c71e9234cb.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-dff708c71e9234cb.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\":\"CGyts-FEbV6owmPboHtLL\",\"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-64dc39af85cd2625.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-64dc39af85cd2625.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\":\"eim4XajTfG4ub4ft5AEkJ\",\"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>
|