From 6dc0df3afbdcc2913fc65461cf07d4ba92273924 Mon Sep 17 00:00:00 2001 From: sabaimran <65192171+sabaimran@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:10:21 -0700 Subject: [PATCH 01/24] Pin pytorch version to 2.0.1 in order to avoid exit code 139 in Docker container (#512) --- docker-compose.yml | 2 ++ pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5f1bb1f9..bc3da2a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,9 +25,11 @@ services: - ./tests/data/embeddings/:/root/.khoj/content/ - ./tests/data/models/:/root/.khoj/search/ - khoj_config:/root/.khoj/ + - sentence_tranformer_models:/root/.cache/torch/sentence_transformers # Use 0.0.0.0 to explicitly set the host ip for the service on the container. https://pythonspeed.com/articles/docker-connection-refused/ command: --host="0.0.0.0" --port=42110 -vv volumes: khoj_config: + sentence_tranformer_models: diff --git a/pyproject.toml b/pyproject.toml index b3529aa9..f0cc2234 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,7 @@ dependencies = [ "schedule == 1.1.0", "sentence-transformers == 2.2.2", "transformers >= 4.28.0", - "torch >= 2.0.1", + "torch == 2.0.1", "uvicorn == 0.17.6", "aiohttp == 3.8.5", "langchain >= 0.0.187", From 0f1ebcae18abc8969cb367564077ef8d20695be3 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 22 Oct 2023 18:16:02 -0700 Subject: [PATCH 02/24] Upgrade to latest GPT4All. Use Mistral as default offline chat model GPT4all now supports gguf llama.cpp chat models. Latest GPT4All (+mistral) performs much at least 3x faster. On Macbook Pro at ~10s response start time vs 30s-120s earlier. Mistral is also a better chat model, although it hallucinates more than llama-2 --- pyproject.toml | 4 +- .../migrate_offline_chat_default_model.py | 69 +++++++++++++++++++ .../conversation/gpt4all/chat_model.py | 4 +- .../processor/conversation/gpt4all/utils.py | 4 +- src/khoj/processor/conversation/utils.py | 2 + src/khoj/utils/cli.py | 2 + src/khoj/utils/constants.py | 4 +- src/khoj/utils/rawconfig.py | 2 +- tests/conftest.py | 2 +- tests/test_gpt4all_chat_actors.py | 2 +- 10 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 src/khoj/migrations/migrate_offline_chat_default_model.py diff --git a/pyproject.toml b/pyproject.toml index f0cc2234..bac662a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,8 +60,8 @@ dependencies = [ "bs4 >= 0.0.1", "anyio == 3.7.1", "pymupdf >= 1.23.3", - "gpt4all == 1.0.12; platform_system == 'Linux' and platform_machine == 'x86_64'", - "gpt4all == 1.0.12; platform_system == 'Windows' or platform_system == 'Darwin'", + "gpt4all >= 2.0.0; platform_system == 'Linux' and platform_machine == 'x86_64'", + "gpt4all >= 2.0.0; platform_system == 'Windows' or platform_system == 'Darwin'", ] dynamic = ["version"] diff --git a/src/khoj/migrations/migrate_offline_chat_default_model.py b/src/khoj/migrations/migrate_offline_chat_default_model.py new file mode 100644 index 00000000..b7f4cf94 --- /dev/null +++ b/src/khoj/migrations/migrate_offline_chat_default_model.py @@ -0,0 +1,69 @@ +""" +Current format of khoj.yml +--- +app: + ... +content-type: + ... +processor: + conversation: + offline-chat: + enable-offline-chat: false + chat-model: llama-2-7b-chat.ggmlv3.q4_0.bin + ... +search-type: + ... + +New format of khoj.yml +--- +app: + ... +content-type: + ... +processor: + conversation: + offline-chat: + enable-offline-chat: false + chat-model: mistral-7b-instruct-v0.1.Q4_0.gguf + ... +search-type: + ... +""" +import logging +from packaging import version + +from khoj.utils.yaml import load_config_from_file, save_config_to_file + + +logger = logging.getLogger(__name__) + + +def migrate_offline_chat_default_model(args): + schema_version = "0.12.4" + raw_config = load_config_from_file(args.config_file) + previous_version = raw_config.get("version") + + if "processor" not in raw_config: + return args + if raw_config["processor"] is None: + return args + if "conversation" not in raw_config["processor"]: + return args + if "offline-chat" not in raw_config["processor"]["conversation"]: + return args + if "chat-model" not in raw_config["processor"]["conversation"]["offline-chat"]: + return args + + if previous_version is None or version.parse(previous_version) < version.parse("0.12.4"): + logger.info( + f"Upgrading config schema to {schema_version} from {previous_version} to change default (offline) chat model to mistral GGUF" + ) + raw_config["version"] = schema_version + + # Update offline chat model to mistral in GGUF format to use latest GPT4All + offline_chat_model = raw_config["processor"]["conversation"]["offline-chat"]["chat-model"] + if offline_chat_model.endswith(".bin"): + raw_config["processor"]["conversation"]["offline-chat"]["chat-model"] = "mistral-7b-instruct-v0.1.Q4_0.gguf" + + save_config_to_file(raw_config, args.config_file) + return args diff --git a/src/khoj/processor/conversation/gpt4all/chat_model.py b/src/khoj/processor/conversation/gpt4all/chat_model.py index 7e92d002..04a004f0 100644 --- a/src/khoj/processor/conversation/gpt4all/chat_model.py +++ b/src/khoj/processor/conversation/gpt4all/chat_model.py @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) def extract_questions_offline( text: str, - model: str = "llama-2-7b-chat.ggmlv3.q4_0.bin", + model: str = "mistral-7b-instruct-v0.1.Q4_0.gguf", loaded_model: Union[Any, None] = None, conversation_log={}, use_history: bool = True, @@ -123,7 +123,7 @@ def converse_offline( references, user_query, conversation_log={}, - model: str = "llama-2-7b-chat.ggmlv3.q4_0.bin", + model: str = "mistral-7b-instruct-v0.1.Q4_0.gguf", loaded_model: Union[Any, None] = None, completion_func=None, conversation_command=ConversationCommand.Default, diff --git a/src/khoj/processor/conversation/gpt4all/utils.py b/src/khoj/processor/conversation/gpt4all/utils.py index d5201780..2bb1fbbc 100644 --- a/src/khoj/processor/conversation/gpt4all/utils.py +++ b/src/khoj/processor/conversation/gpt4all/utils.py @@ -14,9 +14,9 @@ def download_model(model_name: str): # Use GPU for Chat Model, if available try: model = GPT4All(model_name=model_name, device="gpu") - logger.debug("Loaded chat model to GPU.") + logger.debug(f"Loaded {model_name} chat model to GPU.") except ValueError: model = GPT4All(model_name=model_name) - logger.debug("Loaded chat model to CPU.") + logger.debug(f"Loaded {model_name} chat model to CPU.") return model diff --git a/src/khoj/processor/conversation/utils.py b/src/khoj/processor/conversation/utils.py index 83d51f2d..b0d401fa 100644 --- a/src/khoj/processor/conversation/utils.py +++ b/src/khoj/processor/conversation/utils.py @@ -20,9 +20,11 @@ model_to_prompt_size = { "gpt-4": 8192, "llama-2-7b-chat.ggmlv3.q4_0.bin": 1548, "gpt-3.5-turbo-16k": 15000, + "mistral-7b-instruct-v0.1.Q4_0.gguf": 1548, } model_to_tokenizer = { "llama-2-7b-chat.ggmlv3.q4_0.bin": "hf-internal-testing/llama-tokenizer", + "mistral-7b-instruct-v0.1.Q4_0.gguf": "mistralai/Mistral-7B-Instruct-v0.1", } diff --git a/src/khoj/utils/cli.py b/src/khoj/utils/cli.py index 1d6106cb..7c72b101 100644 --- a/src/khoj/utils/cli.py +++ b/src/khoj/utils/cli.py @@ -10,6 +10,7 @@ from khoj.migrations.migrate_version import migrate_config_to_version from khoj.migrations.migrate_processor_config_openai import migrate_processor_conversation_schema from khoj.migrations.migrate_offline_model import migrate_offline_model from khoj.migrations.migrate_offline_chat_schema import migrate_offline_chat_schema +from khoj.migrations.migrate_offline_chat_default_model import migrate_offline_chat_default_model def cli(args=None): @@ -61,6 +62,7 @@ def run_migrations(args): migrate_processor_conversation_schema, migrate_offline_model, migrate_offline_chat_schema, + migrate_offline_chat_default_model, ] for migration in migrations: args = migration(args) diff --git a/src/khoj/utils/constants.py b/src/khoj/utils/constants.py index 9ed97798..7f534bf6 100644 --- a/src/khoj/utils/constants.py +++ b/src/khoj/utils/constants.py @@ -55,7 +55,7 @@ empty_config = { }, "offline-chat": { "enable-offline-chat": False, - "chat-model": "llama-2-7b-chat.ggmlv3.q4_0.bin", + "chat-model": "mistral-7b-instruct-v0.1.Q4_0.gguf", }, "tokenizer": None, "max-prompt-size": None, @@ -132,7 +132,7 @@ default_config = { }, "offline-chat": { "enable-offline-chat": False, - "chat-model": "llama-2-7b-chat.ggmlv3.q4_0.bin", + "chat-model": "mistral-7b-instruct-v0.1.Q4_0.gguf", }, "tokenizer": None, "max-prompt-size": None, diff --git a/src/khoj/utils/rawconfig.py b/src/khoj/utils/rawconfig.py index f7c42266..cc4fe208 100644 --- a/src/khoj/utils/rawconfig.py +++ b/src/khoj/utils/rawconfig.py @@ -93,7 +93,7 @@ class OpenAIProcessorConfig(ConfigBase): class OfflineChatProcessorConfig(ConfigBase): enable_offline_chat: Optional[bool] = False - chat_model: Optional[str] = "llama-2-7b-chat.ggmlv3.q4_0.bin" + chat_model: Optional[str] = "mistral-7b-instruct-v0.1.Q4_0.gguf" class ConversationProcessorConfig(ConfigBase): diff --git a/tests/conftest.py b/tests/conftest.py index f75dfceb..8b661f50 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -206,7 +206,7 @@ def processor_config_offline_chat(tmp_path_factory): # Setup conversation processor processor_config = ProcessorConfig() - offline_chat = OfflineChatProcessorConfig(enable_offline_chat=True) + offline_chat = OfflineChatProcessorConfig(enable_offline_chat=True, chat_model="mistral-7b-instruct-v0.1.Q4_0.gguf") processor_config.conversation = ConversationProcessorConfig( offline_chat=offline_chat, conversation_logfile=processor_dir.joinpath("conversation_logs.json"), diff --git a/tests/test_gpt4all_chat_actors.py b/tests/test_gpt4all_chat_actors.py index 76ed26e7..782b54f2 100644 --- a/tests/test_gpt4all_chat_actors.py +++ b/tests/test_gpt4all_chat_actors.py @@ -24,7 +24,7 @@ from khoj.processor.conversation.gpt4all.utils import download_model from khoj.processor.conversation.utils import message_to_log -MODEL_NAME = "llama-2-7b-chat.ggmlv3.q4_0.bin" +MODEL_NAME = "mistral-7b-instruct-v0.1.Q4_0.gguf" @pytest.fixture(scope="session") From 5bb14a05a06b5fd80d6ed42bf93e8953f7791375 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 22 Oct 2023 18:43:02 -0700 Subject: [PATCH 03/24] Update system requirements in docs for offline chat models --- docs/chat.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/chat.md b/docs/chat.md index b900d052..2efd7b1b 100644 --- a/docs/chat.md +++ b/docs/chat.md @@ -10,7 +10,8 @@ Offline chat stays completely private and works without internet. But it is slower, lower quality and more compute intensive. > **System Requirements**: -> - Machine with at least **6 GB of RAM** and **4 GB of Disk** available +> - Minimum 8 GB RAM. Recommend **16Gb VRAM** +> - Minimum **5 GB of Disk** available > - A CPU supporting [AVX or AVX2 instructions](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions) is required > - A Mac M1+ or [Vulcan supported GPU](https://vulkan.gpuinfo.org/) should significantly speed up chat response times From 9677eae79192aed2171a433f4ae4d9adff7afba1 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 25 Oct 2023 17:51:46 -0700 Subject: [PATCH 04/24] Expose CLI flag to disable using GPU for offline chat model - Offline chat models outputing gibberish when loaded onto some GPU. GPU support with Vulkan in GPT4All seems a bit buggy - This change mitigates the upstream issue by allowing user to manually disable using GPU for offline chat Closes #516 --- src/khoj/main.py | 1 + src/khoj/processor/conversation/gpt4all/utils.py | 7 +++++-- src/khoj/utils/cli.py | 6 ++++++ src/khoj/utils/state.py | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/khoj/main.py b/src/khoj/main.py index 7b1bfd7e..4c759c2a 100644 --- a/src/khoj/main.py +++ b/src/khoj/main.py @@ -94,6 +94,7 @@ def set_state(args): state.port = args.port state.demo = args.demo state.khoj_version = version("khoj-assistant") + state.chat_on_gpu = args.chat_on_gpu def start_server(app, host=None, port=None, socket=None): diff --git a/src/khoj/processor/conversation/gpt4all/utils.py b/src/khoj/processor/conversation/gpt4all/utils.py index 2bb1fbbc..45a1158e 100644 --- a/src/khoj/processor/conversation/gpt4all/utils.py +++ b/src/khoj/processor/conversation/gpt4all/utils.py @@ -1,5 +1,7 @@ import logging +from khoj.utils import state + logger = logging.getLogger(__name__) @@ -13,8 +15,9 @@ def download_model(model_name: str): # Use GPU for Chat Model, if available try: - model = GPT4All(model_name=model_name, device="gpu") - logger.debug(f"Loaded {model_name} chat model to GPU.") + device = "gpu" if state.chat_on_gpu else "cpu" + model = GPT4All(model_name=model_name, device=device) + logger.debug(f"Loaded {model_name} chat model to {device.upper()}") except ValueError: model = GPT4All(model_name=model_name) logger.debug(f"Loaded {model_name} chat model to CPU.") diff --git a/src/khoj/utils/cli.py b/src/khoj/utils/cli.py index 7c72b101..9f129b17 100644 --- a/src/khoj/utils/cli.py +++ b/src/khoj/utils/cli.py @@ -34,10 +34,16 @@ def cli(args=None): help="Path to UNIX socket for server. Use to run server behind reverse proxy. Default: /tmp/uvicorn.sock", ) parser.add_argument("--version", "-V", action="store_true", help="Print the installed Khoj version and exit") + parser.add_argument( + "--disable-chat-on-gpu", action="store_true", default=False, help="Disable using GPU for the offline chat model" + ) parser.add_argument("--demo", action="store_true", default=False, help="Run Khoj in demo mode") args = parser.parse_args(args) + # Set default values for arguments + args.chat_on_gpu = not args.disable_chat_on_gpu + args.version_no = version("khoj-assistant") if args.version: # Show version of khoj installed and exit diff --git a/src/khoj/utils/state.py b/src/khoj/utils/state.py index 5ac8a838..e9b2ca6c 100644 --- a/src/khoj/utils/state.py +++ b/src/khoj/utils/state.py @@ -31,6 +31,8 @@ telemetry: List[Dict[str, str]] = [] previous_query: str = None demo: bool = False khoj_version: str = None +chat_on_gpu: bool = True + if torch.cuda.is_available(): # Use CUDA GPU From 354605e73e659d0443c67dffe56b226a16dc6d23 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 2 Nov 2023 06:09:45 +0700 Subject: [PATCH 05/24] Autofocus to chat input when openning chat (#524) --- src/interface/obsidian/src/chat_modal.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/interface/obsidian/src/chat_modal.ts b/src/interface/obsidian/src/chat_modal.ts index 66381071..d390cbf2 100644 --- a/src/interface/obsidian/src/chat_modal.ts +++ b/src/interface/obsidian/src/chat_modal.ts @@ -38,7 +38,7 @@ export class KhojChatModal extends Modal { await this.getChatHistory(); // Add chat input field - contentEl.createEl("input", + const chatInput = contentEl.createEl("input", { attr: { type: "text", @@ -48,10 +48,11 @@ export class KhojChatModal extends Modal { class: "khoj-chat-input option" } }) - .addEventListener('change', (event) => { this.result = (event.target).value }); + chatInput.addEventListener('change', (event) => { this.result = (event.target).value }); // Scroll to bottom of modal, till the send message input box this.modalEl.scrollTop = this.modalEl.scrollHeight; + chatInput.focus(); } generateReference(messageEl: any, reference: string, index: number) { From 7b7f6d3bc8d2f107e73885dfa12d1f17991b2281 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 15:55:25 -0700 Subject: [PATCH 06/24] Update web client theme to a lighter - Update background color to a different shade of white - Make primary and primary hover colors less intense and more aligned with lantern flame shade - Add water, leaf, flower color variables --- .../assets/icons/khoj-logo-sideways-500.png | Bin 36306 -> 29856 bytes src/khoj/interface/web/assets/khoj.css | 32 +++++++++++------- src/khoj/interface/web/base_config.html | 11 +++--- src/khoj/interface/web/login.html | 6 ++-- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/khoj/interface/web/assets/icons/khoj-logo-sideways-500.png b/src/khoj/interface/web/assets/icons/khoj-logo-sideways-500.png index 56648932e1322e8f06ace593302da32b2f278aca..765d6e33ea5f3f95f37163a40027d0fa4f918df8 100644 GIT binary patch literal 29856 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 TItRRR6!KbDMW$5BH01vQHgfzR literal 36306 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%0Dy0)*K>{#>@8mNG;5v~ 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

9E}bC5#_G-db`4mK7`V<6Ndd-S^Gp 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 diff --git a/src/khoj/interface/web/assets/khoj.css b/src/khoj/interface/web/assets/khoj.css index c7133afd..51b228c9 100644 --- a/src/khoj/interface/web/assets/khoj.css +++ b/src/khoj/interface/web/assets/khoj.css @@ -2,35 +2,44 @@ /* Can be forced with data-theme="light" */ [data-theme="light"], :root:not([data-theme="dark"]) { - --primary: #ffb300; - --primary-hover: #ffa000; + --primary: #fee285; + --primary-hover: #fcc50b; --primary-focus: rgba(255, 179, 0, 0.125); --primary-inverse: rgba(0, 0, 0, 0.75); - --background-color: #fff; + --background-color: #f5f4f3; --main-text-color: #475569; + --water: #44b9da; + --leaf: #7b990a; + --flower: #ffaeae; } /* Amber Dark scheme (Auto) */ /* Automatically enabled if user has Dark mode enabled */ @media only screen and (prefers-color-scheme: dark) { :root:not([data-theme]) { - --primary: #ffb300; - --primary-hover: #ffc107; + --primary: #fee285; + --primary-hover: #fcc50b; --primary-focus: rgba(255, 179, 0, 0.25); --primary-inverse: rgba(0, 0, 0, 0.75); - --background-color: #fff; + --background-color: #f5f4f3; --main-text-color: #475569; + --water: #44b9da; + --leaf: #7b990a; + --flower: #ffaeae; } } /* Amber Dark scheme (Forced) */ /* Enabled if forced with data-theme="dark" */ [data-theme="dark"] { - --primary: #ffb300; - --primary-hover: #ffc107; + --primary: #fee285; + --primary-hover: #fcc50b; --primary-focus: rgba(255, 179, 0, 0.25); --primary-inverse: rgba(0, 0, 0, 0.75); - --background-color: #fff; + --background-color: #f5f4f3; --main-text-color: #475569; + --water: #44b9da; + --leaf: #7b990a; + --flower: #ffaeae; } /* Amber (Common styles) */ :root { @@ -71,7 +80,7 @@ a.khoj-logo { } .khoj-nav a { - color: #333; + color: var(--main-text-color); text-decoration: none; font-size: 20px; font-weight: normal; @@ -151,7 +160,6 @@ p#khoj-banner { border: 2px solid var(--primary-inverse); width: 40px; height: 40px; - vertical-align: text-top; padding: 3px; cursor: pointer; } @@ -159,7 +167,7 @@ p#khoj-banner { background-color: var(--primary-hover); } .user-initial { - background-color: white; + background-color: var(--background-color); color: black; display: grid; justify-content: center; diff --git a/src/khoj/interface/web/base_config.html b/src/khoj/interface/web/base_config.html index 3ca8c7ec..c1236f6b 100644 --- a/src/khoj/interface/web/base_config.html +++ b/src/khoj/interface/web/base_config.html @@ -60,7 +60,7 @@ justify-items: start; gap: 8px; padding: 24px 24px; - background: white; + background: var(--background-color); border: 1px solid rgb(229, 229, 229); border-radius: 4px; box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.1),0px 1px 2px -1px rgba(0,0,0,0.1); @@ -95,10 +95,10 @@ padding: 24px 16px; width: 320px; height: 180px; - background: white; + background: var(--background-color); border: 1px solid rgb(229, 229, 229); border-radius: 4px; - box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.1),0px 1px 2px -1px rgba(0,0,0,0.1); + box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.1),0px 1px 2px -1px rgba(0,0,0,0.8); overflow: hidden; } div.finalize-buttons { @@ -106,7 +106,6 @@ gap: 8px; padding: 24px 16px; width: 320px; - background: white; border-radius: 4px; overflow: hidden; } @@ -174,7 +173,7 @@ } button.card-button { - color: rgb(255, 136, 136); + color: var(--flower); background: transparent; font-size: 16px; cursor: pointer; @@ -186,7 +185,7 @@ } button.card-button.happy { - color: rgb(0, 146, 0); + color: var(--leaf); } img.configured-icon { diff --git a/src/khoj/interface/web/login.html b/src/khoj/interface/web/login.html index 89515617..e04fab7e 100644 --- a/src/khoj/interface/web/login.html +++ b/src/khoj/interface/web/login.html @@ -83,8 +83,8 @@ body { padding: 0px; margin: 0px; - background: #fff; - color: #475569; + background: var(--background-color); + color: var(--main-text-color); font-family: roboto, karma, segoe ui, sans-serif; font-size: 20px; font-weight: 300; @@ -131,10 +131,10 @@ gap: 10px; padding: 10px; margin: 10px; - background: #fff; border-radius: 5px; border: 1px solid #475569; box-shadow: 0 0 11px #aaa; + background: var(--background-color); margin-left: 25%; margin-right: 25%; } From b6f07099cddcfdb028f33771407155d91f094af3 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 16:38:08 -0700 Subject: [PATCH 07/24] Simplify login page styling on web client - Center all elements: icon, text and button - Use khoj icon not logo-text - Simplify login title text --- src/khoj/interface/web/assets/khoj.css | 5 +++ src/khoj/interface/web/login.html | 54 +++++++++++--------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/khoj/interface/web/assets/khoj.css b/src/khoj/interface/web/assets/khoj.css index 51b228c9..a4785be2 100644 --- a/src/khoj/interface/web/assets/khoj.css +++ b/src/khoj/interface/web/assets/khoj.css @@ -55,6 +55,8 @@ font-family: roboto, karma, segoe ui, sans-serif; font-weight: 300; } + +.khoj-footer, .khoj-header { display: grid; grid-auto-flow: column; @@ -62,6 +64,9 @@ padding: 16px 0; margin: 0 0 16px 0; } +.khoj-footer { + margin: 16px 0 0 0; +} nav.khoj-nav { display: grid; diff --git a/src/khoj/interface/web/login.html b/src/khoj/interface/web/login.html index e04fab7e..5d40397c 100644 --- a/src/khoj/interface/web/login.html +++ b/src/khoj/interface/web/login.html @@ -22,36 +22,30 @@ {% endif %} - -

- {% if demo %} - - {% else %} - - {% endif %} -
+
- +
-

Become superhuman with your personal knowledge base copilot

+ + + +
+
-
+ +
@@ -62,7 +56,7 @@ body { display: grid; grid-template-columns: 1fr; - grid-template-rows: 1fr auto auto auto minmax(80px, 100%); + grid-template-rows: 1fr auto 1fr; font-size: small!important; } body > * { @@ -73,8 +67,7 @@ body { display: grid; grid-template-columns: 1fr min(70vw, 100%) 1fr; - grid-template-rows: 1fr auto auto auto minmax(80px, 100%); - padding-top: 60vw; + grid-template-rows: 1fr auto 1fr; } body > * { grid-column: 2; @@ -83,6 +76,7 @@ body { padding: 0px; margin: 0px; + height: 100%; background: var(--background-color); color: var(--main-text-color); font-family: roboto, karma, segoe ui, sans-serif; @@ -109,6 +103,7 @@ a.khoj-logo { text-align: center; + justify-self: center; } button#khoj-banner-submit, @@ -127,13 +122,9 @@ div#login-modal { display: grid; grid-template-columns: 1fr; - grid-template-rows: 1fr auto auto auto; - gap: 10px; - padding: 10px; - margin: 10px; - border-radius: 5px; - border: 1px solid #475569; - box-shadow: 0 0 11px #aaa; + grid-template-rows: 1fr auto auto 1fr; + gap: 32px; + min-height: 300px; background: var(--background-color); margin-left: 25%; margin-right: 25%; @@ -144,10 +135,11 @@ display: block; } - h1.login-modal-title { + .login-modal-title { text-align: center; line-height: 28px; - font-size: x-large; + font-size: 24px; + font-weight: 500; } @media only screen and (max-width: 700px) { From 9fc6c9713924cc83fe82c7a9d9c67839b2317128 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 16:41:19 -0700 Subject: [PATCH 08/24] Use Khoj standard font family, weight in web client settings page --- src/interface/desktop/assets/khoj.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/interface/desktop/assets/khoj.css b/src/interface/desktop/assets/khoj.css index 02f2493f..0c36f2b0 100644 --- a/src/interface/desktop/assets/khoj.css +++ b/src/interface/desktop/assets/khoj.css @@ -37,8 +37,10 @@ .khoj-configure { display: grid; grid-template-columns: 1fr; - padding: 0 24px; + font-family: roboto, karma, segoe ui, sans-serif; + font-weight: 300; } + .khoj-header { display: grid; grid-auto-flow: column; From 4fbe8ac6b1571ef3e7b91bbdc512b920f543da0a Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 19:46:12 -0700 Subject: [PATCH 09/24] Console log a welcome message on loading web client --- src/khoj/interface/web/assets/khoj.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/khoj/interface/web/assets/khoj.js b/src/khoj/interface/web/assets/khoj.js index b4d29a1f..0d513146 100644 --- a/src/khoj/interface/web/assets/khoj.js +++ b/src/khoj/interface/web/assets/khoj.js @@ -13,3 +13,19 @@ document.addEventListener('click', function(event) { menu.classList.remove("show"); } }); + +console.log(`%c %s`, "font-family:monospace", ` + __ __ __ __ ______ __ _____ __ +/\\ \\/ / /\\ \\_\\ \\ /\\ __ \\ /\\ \\ /\\ __ \\ /\\ \\ +\\ \\ _"-. \\ \\ __ \\ \\ \\ \\/\\ \\ _\\_\\ \\ \\ \\ __ \\ \\ \\ \\ + \\ \\_\\ \\_\\ \\ \\_\\ \\_\\ \\ \\_____\\ /\\_____\\ \\ \\_\\ \\_\\ \\ \\_\\ + \\/_/\\/_/ \\/_/\\/_/ \\/_____/ \\/_____/ \\/_/\\/_/ \\/_/ + + +Greetings traveller, + +I am ✨Khoj✨, your open-source, personal AI copilot. + +See my source code at https://github.com/khoj-ai/khoj +Read my operating manual at https://docs.khoj.dev +`); From 0d4e7d46c2947536e3050384727cb86693a26176 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 20:08:16 -0700 Subject: [PATCH 10/24] Fix color and size of profile picture circle in nav pane --- src/khoj/interface/web/assets/khoj.css | 2 +- src/khoj/interface/web/base_config.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/khoj/interface/web/assets/khoj.css b/src/khoj/interface/web/assets/khoj.css index a4785be2..e0b15c22 100644 --- a/src/khoj/interface/web/assets/khoj.css +++ b/src/khoj/interface/web/assets/khoj.css @@ -162,7 +162,7 @@ p#khoj-banner { } .circle { border-radius: 50%; - border: 2px solid var(--primary-inverse); + border: 3px solid var(--primary-hover); width: 40px; height: 40px; padding: 3px; diff --git a/src/khoj/interface/web/base_config.html b/src/khoj/interface/web/base_config.html index c1236f6b..cba8c20c 100644 --- a/src/khoj/interface/web/base_config.html +++ b/src/khoj/interface/web/base_config.html @@ -38,9 +38,9 @@ display: grid; grid-template-columns: 1fr min(70vw, 100%) 1fr; } - img.circle { - width: 49px; - height: 49px; + .circle { + width: 51px; + height: 51px; } .page { From 3801105b2a7559220bddc66c0493f0510fb88ee8 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Thu, 2 Nov 2023 20:35:43 -0700 Subject: [PATCH 11/24] Make chat the landing page for the web app Chat, unlike search, doesn't knowledge base indexing setup. So you can get started with chat much faster. --- .../interface/web/{index.html => search.html} | 0 src/khoj/interface/web/utils.html | 2 +- src/khoj/routers/web_client.py | 21 +++++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) rename src/khoj/interface/web/{index.html => search.html} (100%) diff --git a/src/khoj/interface/web/index.html b/src/khoj/interface/web/search.html similarity index 100% rename from src/khoj/interface/web/index.html rename to src/khoj/interface/web/search.html diff --git a/src/khoj/interface/web/utils.html b/src/khoj/interface/web/utils.html index bea97f7a..1d21397d 100644 --- a/src/khoj/interface/web/utils.html +++ b/src/khoj/interface/web/utils.html @@ -5,7 +5,7 @@