about summary refs log tree commit diff
path: root/pkgs/by-name/op/open-webui/package.nix
blob: 735c6118414669af3ebf9d736f6e36395be89db1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{
  lib,
  buildNpmPackage,
  fetchFromGitHub,
  python3,
  nixosTests,
}:
let
  pname = "open-webui";
  version = "0.2.4";

  src = fetchFromGitHub {
    owner = "open-webui";
    repo = "open-webui";
    rev = "v${version}";
    hash = "sha256-jWO0mo26C+QTIX5j3ucDk/no+vQnAh7Q6JwB3lLM83k=";
  };

  frontend = buildNpmPackage {
    inherit pname version src;

    npmDepsHash = "sha256-QIgYHZusuq2QD8p8MGsNVhCbz6fR+qP9UuU/kbBkadc=";

    # Disabling `pyodide:fetch` as it downloads packages during `buildPhase`
    # Until this is solved, running python packages from the browser will not work.
    postPatch = ''
      substituteInPlace package.json \
        --replace-fail "npm run pyodide:fetch && vite build" "vite build" \
    '';

    env.CYPRESS_INSTALL_BINARY = "0"; # disallow cypress from downloading binaries in sandbox

    installPhase = ''
      runHook preInstall

      mkdir -p $out/share
      cp -a build $out/share/open-webui

      runHook postInstall
    '';
  };
in
python3.pkgs.buildPythonApplication rec {
  inherit pname version src;
  pyproject = true;

  # The custom hook tries to run `npm install` in `buildPhase`.
  # We don't have to worry, as nodejs depedencies are managed by `frontend` drv.
  postPatch = ''
    substituteInPlace pyproject.toml \
      --replace-fail '[tool.hatch.build.hooks.custom]' "" \
      --replace-fail ', build = "open_webui/frontend"' ""
  '';

  pythonRelaxDeps = true;

  pythonRemoveDeps = [
    # using `psycopg2` instead
    "psycopg2-binary"
    # using `opencv4`
    "opencv-python-headless"
    # package request: https://github.com/NixOS/nixpkgs/issues/317065
    "rapidocr-onnxruntime"
    # package request: https://github.com/NixOS/nixpkgs/issues/317066
    "langfuse"
    # package request: https://github.com/NixOS/nixpkgs/issues/317068
    "langchain-chroma"
  ];

  dependencies = with python3.pkgs; [
    beautifulsoup4
    fastapi
    uvicorn
    python-multipart
    flask
    flask-cors
    python-socketio
    python-jose
    passlib
    requests
    aiohttp
    peewee
    peewee-migrate
    psycopg2
    pymysql
    bcrypt
    litellm
    boto3
    argon2-cffi
    apscheduler
    google-generativeai
    langchain
    langchain-community
    fake-useragent
    chromadb
    sentence-transformers
    pypdf
    docx2txt
    python-pptx
    unstructured
    markdown
    pypandoc
    pandas
    openpyxl
    pyxlsb
    xlrd
    validators
    opencv4
    fpdf2
    rank-bm25
    faster-whisper
    pyjwt
    black
    youtube-transcript-api
    pytube
  ];

  build-system = with python3.pkgs; [
    hatchling
    pythonRelaxDepsHook
  ];

  pythonImportsCheck = [ "open_webui" ];

  postInstall = ''
    wrapProgram $out/bin/open-webui \
      --set FRONTEND_BUILD_DIR "${frontend}/share/open-webui"
  '';

  passthru.tests = {
    inherit (nixosTests) open-webui;
  };

  meta = {
    description = "Full-stack of open-webui. open-webui is a user-friendly WebUI for LLMs (Formerly Ollama WebUI)";
    homepage = "https://github.com/open-webui/open-webui";
    changelog = "https://github.com/open-webui/open-webui/blob/${src.rev}/CHANGELOG.md";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ shivaraj-bh ];
    mainProgram = "open-webui";
  };
}