Mirror of khoj from Github
Find a file
Debanjum Singh Solanky 3e3a1ecbc8 Start app even if server init fails to let user fix it
Show stacktrace on error to help debugging
2023-07-17 14:33:02 -07:00
.github/workflows Add a Github workflow that allows you to build dev versions of Desktop applications (#309) 2023-07-13 22:11:39 -07:00
config Deprecate (unmaintained) support to setup Khoj via Conda 2023-07-10 21:27:58 -07:00
docs Add Screenshots of Khoj Chat Interface on Emacs, Obsidian to Readmes 2023-04-07 23:19:47 +07:00
scripts Upgrade bump_version script to handle release and post-release commit 2023-03-10 15:23:17 -06:00
src Start app even if server init fails to let user fix it 2023-07-17 14:33:02 -07:00
tests Drop embeddings of deleted text entries from index 2023-07-16 03:47:05 -07:00
.dockerignore Use pypi khoj to fix docker builds and dockerize github workflow 2023-02-19 01:57:01 -06:00
.gitignore Test Chat Actor Capabilities; ability to answer from notes, chat logs etc 2023-03-16 09:30:37 -06:00
.pre-commit-config.yaml Run mypy checks in test workflow and on push (via pre-commit) 2023-02-17 16:08:56 -06:00
docker-compose.yml Update Khoj server to run on non standard port, 42110 instead of 8000 2023-07-10 21:27:58 -07:00
Dockerfile Migrate from PyQT6 to PySide6 2023-07-11 18:43:44 -07:00
Khoj.desktop Fix Khoj subtitle in desktop entry, pyproject, cli and Obsidian Readme 2023-07-02 16:09:07 -07:00
Khoj.spec Fix Packaging the Khoj Desktop Apps (#289) 2023-07-09 10:21:16 -07:00
LICENSE Add, configure and run pre-commit locally and in test workflow 2023-02-17 13:31:36 -06:00
manifest.json Release Khoj version 0.8.2 2023-07-10 14:39:32 -07:00
pyproject.toml Migrate from PyQT6 to PySide6 2023-07-11 18:43:44 -07:00
README.md Update Khoj server to run on non standard port, 42110 instead of 8000 2023-07-10 21:27:58 -07:00
versions.json Release Khoj version 0.8.2 2023-07-10 14:39:32 -07:00

Khoj Logo

test dockerize pypi

An AI personal assistant for your digital brain

Supported Plugins

Khoj on Obsidian Khoj on Emacs

Table of Contents

Features

  • Search
    • Local: Your personal data stays local. All search and indexing is done on your machine. Unlike chat which requires access to GPT.
    • Incremental: Incremental search for a fast, search-as-you-type experience
  • Chat
    • Faster answers: Find answers faster, smoother than search. No need to manually scan through your notes to find answers.
    • Iterative discovery: Iteratively explore and (re-)discover your notes
    • Assisted creativity: Smoothly weave across answers retrieval and content generation
  • General
    • Natural: Advanced natural language understanding using Transformer based ML Models
    • Pluggable: Modular architecture makes it easy to plug in new data sources, frontends and ML models
    • Multiple Sources: Index your Org-mode and Markdown notes, PDF files, Github repositories, and Photos
    • Multiple Interfaces: Interact from your Web Browser, Emacs or Obsidian

Demos

Khoj in Obsidian

https://github.com/khoj-ai/khoj/assets/6413477/3e33d8ea-25bb-46c8-a3bf-c92f78d0f56b

Description
  1. Install Khoj via pip and start Khoj backend in a terminal (Run khoj)
    python -m pip install khoj-assistant
    khoj
    
  2. Install Khoj plugin via Community Plugins settings pane on Obsidian app
    • Check the new Khoj plugin settings
    • Let Khoj backend index the markdown, pdf, Github markdown files in the current Vault
    • Open Khoj plugin on Obsidian via Search button on Left Pane
    • Search "Announce plugin to folks" in the Obsidian Plugin docs
    • Jump to the search result

Khoj in Emacs, Browser

https://user-images.githubusercontent.com/6413477/184735169-92c78bf1-d827-4663-9087-a1ea194b8f4b.mp4

Description
  • Install Khoj via pip
  • Start Khoj app
  • Add this readme and khoj.el readme as org-mode for Khoj to index
  • Search "Setup editor" on the Web and Emacs. Re-rank the results for better accuracy
  • Top result is what we are looking for, the section to Install Khoj.el on Emacs
Analysis
  • The results do not have any words used in the query
    • Based on the top result it seems the re-ranking model understands that Emacs is an editor?
  • The results incrementally update as the query is entered
  • The results are re-ranked, for better accuracy, once user hits enter

Interfaces

Architecture

Setup

These are the general setup instructions for Khoj.

  • Make sure python and pip are installed on your machine
  • Check the Khoj.el Readme to setup Khoj with Emacs
    Its simpler as it can skip the server install, run and configure step below.
  • Check the Khoj Obsidian Readme to setup Khoj with Obsidian
    Its simpler as it can skip the configure step below.

1. Install

Run the following command in your terminal to install the Khoj backend.

  • On Linux/MacOS

    python -m pip install khoj-assistant
    
  • On Windows

    py -m pip install khoj-assistant
    

2. Run

Run the following commmand from your terminal to start the Khoj backend and open Khoj in your browser.

khoj --gui

Note: To start Khoj automatically in the background use Task scheduler on Windows or Cron on Mac, Linux (e.g with @reboot khoj)

3. Configure

  1. Set File, Folder and hit Save in each Plugins you want to enable for Search on the Khoj config page
  2. Add your OpenAI API key to Chat Feature settings if you want to use Chat
  3. Click Configure and wait. The app will download ML models and index the content for search and (optionally) chat

4. Install Interface Plugins

Khoj exposes a web interface to search, chat and configure by default.
The optional steps below allow using Khoj from within an existing application like Obsidian or Emacs.

  • Khoj Obsidian:
    Install the Khoj Obsidian plugin

  • Khoj Emacs:
    Install khoj.el

Use

Query Filters

Use structured query syntax to filter the natural language search results

  • Word Filter: Get entries that include/exclude a specified term
    • Entries that contain term_to_include: +"term_to_include"
    • Entries that contain term_to_exclude: -"term_to_exclude"
  • Date Filter: Get entries containing dates in YYYY-MM-DD format from specified date (range)
    • Entries from April 1st 1984: dt:"1984-04-01"
    • Entries after March 31st 1984: dt>="1984-04-01"
    • Entries before April 2nd 1984 : dt<="1984-04-01"
  • File Filter: Get entries from a specified file
    • Entries from incoming.org file: file:"incoming.org"
  • Combined Example
    • what is the meaning of life? file:"1984.org" dt>="1984-01-01" dt<="1985-01-01" -"big" -"brother"
    • Adds all filters to the natural language query. It should return entries
      • from the file 1984.org
      • containing dates from the year 1984
      • excluding words "big" and "brother"
      • that best match the natural language query "what is the meaning of life?"

Khoj Chat

Overview

  • Creates a personal assistant for you to inquire and engage with your notes
  • Uses ChatGPT and Khoj search
  • Supports multi-turn conversations with the relevant notes for context
  • Shows reference notes used to generate a response
  • Note: Your query and top notes from khoj search will be sent to OpenAI for processing

Setup

Use

  1. Open /chat1
  2. Type your queries and see response by Khoj from your notes

Demo

Details

  1. Your query is used to retrieve the most relevant notes, if any, using Khoj search
  2. These notes, the last few messages and associated metadata is passed to ChatGPT along with your query for a response

Upgrade

Upgrade Khoj Server

pip install --upgrade khoj-assistant

Note: To upgrade to the latest pre-release version of the khoj server run below command

# Maps to the latest commit on the master branch
pip install --upgrade --pre khoj-assistant

Upgrade Khoj on Emacs

  • Use your Emacs Package Manager to Upgrade
  • See khoj.el readme for details

Upgrade Khoj on Obsidian

  • Upgrade via the Community plugins tab on the settings pane in the Obsidian app
  • See the khoj plugin readme for details

Uninstall

  1. (Optional) Hit Ctrl-C in the terminal running the khoj server to stop it
  2. Delete the khoj directory in your home folder (i.e ~/.khoj on Linux, Mac or C:\Users\<your-username>\.khoj on Windows)
  3. Uninstall the khoj server with pip uninstall khoj-assistant
  4. (Optional) Uninstall khoj.el or the khoj obsidian plugin in the standard way on Emacs, Obsidian

Troubleshoot

Install fails while building Tokenizer dependency

  • Details: pip install khoj-assistant fails while building the tokenizers dependency. Complains about Rust.
  • Fix: Install Rust to build the tokenizers package. For example on Mac run:
    brew install rustup
    rustup-init
    source ~/.cargo/env
    
  • Refer: Issue with Fix for more details

Search starts giving wonky results

  • Fix: Open /api/update?force=true1 in browser to regenerate index from scratch
  • Note: This is a fix for when you percieve the search results have degraded. Not if you think they've always given wonky results

Khoj in Docker errors out with "Killed" in error message

Khoj errors out complaining about Tensors mismatch or null

  • Mitigation: Disable image search using the desktop GUI

Advanced Usage

Access Khoj on Mobile

  1. Setup Khoj on your personal server. This can be any always-on machine, i.e an old computer, RaspberryPi(?) etc
  2. Install Tailscale on your personal server and phone
  3. Open the Khoj web interface of the server from your phone browser.
    It should be http://tailscale-ip-of-server:42110 or http://name-of-server:42110 if you've setup MagicDNS
  4. Click the Add to Homescreen button
  5. Enjoy exploring your notes, documents and images from your phone!

Setup

  1. Set encoder-type, encoder and model-directory under asymmetric and/or symmetric search-type in your khoj.yml2:
       asymmetric:
    -    encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
    +    encoder: text-embedding-ada-002
    +    encoder-type: khoj.utils.models.OpenAI
         cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
    -    encoder-type: sentence_transformers.SentenceTransformer
    -    model_directory: "~/.khoj/search/asymmetric/"
    +    model-directory: null
    
  2. Setup your OpenAI API key in Khoj
  3. Restart Khoj server to generate embeddings. It will take longer than with offline models.

Warnings

This configuration uses an online model

  • It will send all notes to OpenAI to generate embeddings
  • All queries will be sent to OpenAI when you search with Khoj
  • You will be charged by OpenAI based on the total tokens processed
  • It requires an active internet connection to search and index

Search across Different Languages

To search for notes in multiple, different languages, you can use a multi-lingual model.
For example, the paraphrase-multilingual-MiniLM-L12-v2 supports 50+ languages, has good search quality and speed. To use it:

  1. Manually update search-type > asymmetric > encoder to paraphrase-multilingual-MiniLM-L12-v2 in your ~/.khoj/khoj.yml file for now. See diff of khoj.yml below for illustration:
 asymmetric:
- encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
+ encoder: "paraphrase-multilingual-MiniLM-L12-v2"
   cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
   model_directory: "~/.khoj/search/asymmetric/"
  1. Regenerate your content index. For example, by opening <khoj-url>/api/update?t=force

Bootstrap Khoj Search for Offline Usage later

You can bootstrap Khoj pre-emptively to run on machines that do not have internet access. An example use-case would be to run Khoj on an air-gapped machine. Note: Only search can currently run in fully offline mode, not chat.

  • With Internet
    1. Manually download the asymmetric text, symmetric textand image search models from HuggingFace
    2. Pip install khoj (and dependencies) in an associated virtualenv. E.g python -m venv .venv && source .venv/bin/activate && pip install khoj-assistant
  • Without Internet
    1. Copy each of the search models into their respective folders, asymmetric, symmetric and image under the ~/.khoj/search/ directory on the air-gapped machine
    2. Copy the khoj virtual environment directory onto the air-gapped machine, activate the environment and start and khoj as normal. E.g source .venv/bin/activate && khoj

Miscellaneous

Set your OpenAI API key in Khoj

If you want, Khoj can be configured to use OpenAI for search and chat.
Add your OpenAI API to Khoj by using either of the two options below:

  • Open your Khoj settings, add your OpenAI API key, and click Save. Then go to your Khoj settings and click Configure. This will refresh Khoj with your OpenAI API key.
  • Set openai-api-key field under processor.conversation section in your khoj.yml2 to your OpenAI API key and restart khoj:
    processor:
      conversation:
    -    openai-api-key: # "YOUR_OPENAI_API_KEY"
    +    openai-api-key: sk-aaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhh
        model: "text-davinci-003"
        conversation-logfile: "~/.khoj/processor/conversation/conversation_logs.json"
    

Warning: This will enable Khoj to send your query and note(s) to OpenAI for processing

GPT API

Index Github Repository for Search, Chat

The Khoj Github plugin can index issues, commit messages and markdown, org-mode and PDF files from any repositories you have access to. This allows you to chat or search with these repositories. Get answers, resolve issues or just explore a repo with the help of your AI personal assistant.

See the Khoj FAQ for a demo of Khoj search and chat. It makes the Khoj github repo available for exploring.

Note: Khoj will ignore code files in the repository for now as the default AI model used works best with natural language text, not code.

Setup Khoj Github plugin

  1. Get a pat token with repo and read:org scopes in the classic flow.
  2. Configure Khoj settings to include the owner and repo_name. The owner will be the organization name if the repo is in an organization. The repo_name will be the name of the repository. Optionally, you can also supply a branch name. If no branch name is supplied, the master branch will be used.

Performance

Query performance

  • Semantic search using the bi-encoder is fairly fast at <50 ms
  • Reranking using the cross-encoder is slower at <2s on 15 results. Tweak top_k to tradeoff speed for accuracy of results
  • Filters in query (e.g by file, word or date) usually add <20ms to query latency

Indexing performance

  • Indexing is more strongly impacted by the size of the source data
  • Indexing 100K+ line corpus of notes takes about 10 minutes
  • Indexing 4000+ images takes about 15 minutes and more than 8Gb of RAM
  • Note: It should only take this long on the first run as the index is incrementally updated

Miscellaneous

  • Testing done on a Mac M1 and a >100K line corpus of notes
  • Search, indexing on a GPU has not been tested yet

Development

Visualize Codebase

Interactive Visualization

Create Khoj Release

Follow the steps below to release Khoj. This will create a stable release of Khoj on Pypi, Melpa and Obsidian. It will also create desktop apps of Khoj and attach them to the latest release.

  1. Create and tag release commit by running the bump_version script. The release commit sets version number in required metadata files.
./scripts/bump_version.sh -c "<release_version>"
  1. Push commit and then the tag to trigger the release workflow to create Release with auto generated release notes.
git push origin master  # push release commit to khoj repository
git push origin <release_version>  # push release tag to khoj repository
  1. [Optional] Update the Release Notes to highlight new features, fixes and updates

Setup

Using Pip

1. Install
# Get Khoj Code
git clone https://github.com/khoj-ai/khoj && cd khoj

# Create, Activate Virtual Environment
python3 -m venv .venv && source .venv/bin/activate

# Install Khoj for Development
pip install -e .[dev]
2. Run
  1. Start Khoj
    khoj -vv
    
  2. Configure Khoj
    • Via the Settings UI: Add files, directories to index the Khoj settings UI once Khoj has started up. Once you've saved all your settings, click Configure.
    • Manually:
      • Copy the config/khoj_sample.yml to ~/.khoj/khoj.yml
      • Set input-files or input-filter in each relevant content-type section of ~/.khoj/khoj.yml
        • Set input-directories field in image content-type section
      • Delete content-type and processor sub-section(s) irrelevant for your use-case
      • Restart khoj

Note: Wait after configuration for khoj to Load ML model, generate embeddings and expose API to query notes, images, documents etc specified in config YAML

Using Docker

1. Clone
git clone https://github.com/khoj-ai/khoj && cd khoj
2. Configure
  • Required: Update docker-compose.yml to mount your images, (org-mode or markdown) notes, PDFs and Github repositories
  • Optional: Edit application configuration in khoj_docker.yml
3. Run
docker-compose up -d

Note: The first run will take time. Let it run, it's mostly not hung, just generating embeddings

4. Upgrade
docker-compose build --pull

Validate

Before Make Changes

  1. Install Git Hooks for Validation
    pre-commit install -t pre-push -t pre-commit
    
    • This ensures standard code formatting fixes and other checks run automatically on every commit and push
    • Note 1: If pre-commit didn't already get installed, install it via pip install pre-commit
    • Note 2: To run the pre-commit changes manually, use pre-commit run --hook-stage manual --all before creating PR

Before Creating PR

  1. Run Tests. If you get an error complaining about a missing fast_tokenizer_file, follow the solution in this Github issue.

    pytest
    
  2. Run MyPy to check types

    mypy --config-file pyproject.toml
    

After Creating PR

  • Automated validation workflows run for every PR.

    Ensure any issues seen by them our fixed

  • Test the python packge created for a PR

    1. Download and extract the zipped .whl artifact generated from the pypi workflow run for the PR.
    2. Install (in your virtualenv) with pip install /path/to/download*.whl>
    3. Start and use the application to see if it works fine

Credits


  1. Default Khoj url @ http://localhost:42110 ↩︎

  2. Default Khoj config file @ ~/.khoj/khoj.yml ↩︎