{ lib , stdenv , fetchFromGitHub , python3 , postgresql , postgresqlTestHook }: python3.pkgs.buildPythonApplication rec { pname = "khoj"; version = "1.0.1"; pyproject = true; src = fetchFromGitHub { owner = "debanjum"; repo = "khoj"; rev = "refs/tags/${version}"; hash = "sha256-lvOeYTrvW5MfhuJ3lj9n9TRlvpRwVP2vFeaEeJdqIec="; }; env = { DJANGO_SETTINGS_MODULE = "khoj.app.settings"; postgresqlEnableTCP = 1; }; nativeBuildInputs = with python3.pkgs; [ hatch-vcs hatchling ]; propagatedBuildInputs = with python3.pkgs; [ aiohttp anyio authlib beautifulsoup4 dateparser defusedxml django fastapi google-auth # gpt4all gunicorn httpx itsdangerous jinja2 langchain lxml openai openai-whisper pgvector pillow psycopg2 pydantic pymupdf python-multipart pyyaml # rapidocr-onnxruntime requests rich schedule sentence-transformers stripe tenacity tiktoken torch transformers tzdata uvicorn ]; nativeCheckInputs = with python3.pkgs; [ freezegun factory-boy pytest-xdist trio psutil pytest-django pytestCheckHook ] ++ [ (postgresql.withPackages (p: with p; [ pgvector ])) postgresqlTestHook ]; preCheck = '' export HOME=$(mktemp -d) ''; pythonImportsCheck = [ "khoj" ]; disabledTests = [ # Tests require network access "test_different_user_data_not_accessed" "test_get_api_config_types" "test_get_configured_types_via_api" "test_image_metadata" "test_image_search" "test_image_search_by_filepath" "test_image_search_query_truncated" "test_index_update" "test_index_update_with_no_auth_key" "test_notes_search" "test_notes_search_with_exclude_filter" "test_notes_search_with_include_filter" "test_parse_html_plaintext_file" "test_regenerate_index_with_new_entry" "test_regenerate_with_github_fails_without_pat" "test_regenerate_with_invalid_content_type" "test_regenerate_with_valid_content_type" "test_search_for_user2_returns_empty" "test_search_with_invalid_auth_key" "test_search_with_invalid_content_type" "test_search_with_no_auth_key" "test_search_with_valid_content_type" "test_text_index_same_if_content_unchanged" "test_text_indexer_deletes_embedding_before_regenerate" "test_text_search" "test_text_search_setup_batch_processes" "test_update_with_invalid_content_type" "test_user_no_data_returns_empty" # Tests require rapidocr-onnxruntime "test_multi_page_pdf_to_jsonl" "test_single_page_pdf_to_jsonl" "test_ocr_page_pdf_to_jsonl" ]; disabledTestPaths = [ # Tests require network access "tests/test_conversation_utils.py" ]; meta = with lib; { description = "Natural Language Search Assistant for your Org-Mode and Markdown notes, Beancount transactions and Photos"; homepage = "https://github.com/debanjum/khoj"; changelog = "https://github.com/debanjum/khoj/releases/tag/${version}"; license = licenses.agpl3Plus; maintainers = with maintainers; [ dit7ya ]; # src/tcmalloc.cc:333] Attempt to free invalid pointer broken = stdenv.isDarwin; }; }