diff --git a/.dockerignore b/.dockerignore index a5acced7..6528bce7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ node_modules .git -.gitignore dist -data +/data +.env* +.nx diff --git a/Dockerfile b/Dockerfile index 1f3b57df..d665e254 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,14 @@ FROM node:22-slim AS base LABEL org.opencontainers.image.source="https://github.com/docmost/docmost" +RUN npm install -g pnpm@10.4.0 + FROM base AS builder WORKDIR /app COPY . . -RUN npm install -g pnpm@10.4.0 RUN pnpm install --frozen-lockfile RUN pnpm build @@ -31,12 +32,11 @@ COPY --from=builder /app/packages/editor-ext/package.json /app/packages/editor-e # Copy root package files COPY --from=builder /app/package.json /app/package.json COPY --from=builder /app/pnpm*.yaml /app/ +COPY --from=builder /app/.npmrc /app/.npmrc # Copy patches COPY --from=builder /app/patches /app/patches -RUN npm install -g pnpm@10.4.0 - RUN chown -R node:node /app USER node diff --git a/apps/server/package.json b/apps/server/package.json index 240211ee..f686bc1d 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -30,9 +30,9 @@ "test:e2e": "jest --config test/jest-e2e.json" }, "dependencies": { - "@ai-sdk/azure": "^2.0.47", - "@ai-sdk/google": "^2.0.18", - "@ai-sdk/openai": "^2.0.46", + "@ai-sdk/google": "^3.0.9", + "@ai-sdk/openai": "^3.0.11", + "@ai-sdk/openai-compatible": "^2.0.12", "@aws-sdk/client-s3": "3.701.0", "@aws-sdk/lib-storage": "3.701.0", "@aws-sdk/s3-request-presigner": "3.701.0", @@ -61,8 +61,8 @@ "@react-email/components": "0.0.28", "@react-email/render": "1.0.2", "@socket.io/redis-adapter": "^8.3.0", - "ai": "^5.0.65", - "ai-sdk-ollama": "^0.12.0", + "ai": "^6.0.37", + "ai-sdk-ollama": "^3.1.1", "bcrypt": "^6.0.0", "bullmq": "^5.65.0", "cache-manager": "^7.2.7", diff --git a/apps/server/src/ee b/apps/server/src/ee index 9536b7e6..fce3e9e9 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit 9536b7e6d61a0a2c64dec525eab4b67d84fb6ce2 +Subproject commit fce3e9e945da114c4f7cdc4de86a6729b072515e diff --git a/apps/server/src/integrations/environment/environment.validation.ts b/apps/server/src/integrations/environment/environment.validation.ts index 5ac1b11b..ced01b5d 100644 --- a/apps/server/src/integrations/environment/environment.validation.ts +++ b/apps/server/src/integrations/environment/environment.validation.ts @@ -105,7 +105,7 @@ export class EnvironmentVariables { @IsOptional() @ValidateIf((obj) => obj.AI_DRIVER) - @IsIn(['openai', 'gemini', 'ollama']) + @IsIn(['openai', 'openai-compatible', 'gemini', 'ollama']) @IsString() AI_DRIVER: string; @@ -117,11 +117,10 @@ export class EnvironmentVariables { @IsOptional() @ValidateIf((obj) => obj.AI_EMBEDDING_DIMENSION) - @IsIn(['768', '1024', '1536', '2000']) + @IsIn(['768', '1024', '1536', '2000', '3072']) @IsString() AI_EMBEDDING_DIMENSION: string; - @IsOptional() @ValidateIf((obj) => obj.AI_DRIVER) @IsString() @@ -129,13 +128,20 @@ export class EnvironmentVariables { AI_COMPLETION_MODEL: string; @IsOptional() - @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'openai') + @ValidateIf( + (obj) => + obj.AI_DRIVER && ['openai', 'openai-compatible'].includes(obj.AI_DRIVER), + ) @IsString() @IsNotEmpty() OPENAI_API_KEY: string; @IsOptional() - @ValidateIf((obj) => obj.AI_DRIVER && obj.OPENAI_API_URL && obj.AI_DRIVER === 'openai') + @ValidateIf( + (obj) => + obj.AI_DRIVER === 'openai-compatible' || + (obj.AI_DRIVER === 'openai' && obj.OPENAI_API_URL), + ) @IsUrl({ protocols: ['http', 'https'], require_tld: false }) OPENAI_API_URL: string; diff --git a/package.json b/package.json index cfaada1b..52679b43 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "server:dev": "nx run server:start:dev", "server:start": "nx run server:start:prod", "email:dev": "nx run server:email:dev", - "dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\"" + "dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\"", + "clean": "rm -rf apps/*/dist packages/*/dist apps/*/node_modules/.vite" }, "dependencies": { "@braintree/sanitize-url": "^7.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78ed0bad..92c06b22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -434,15 +434,15 @@ importers: apps/server: dependencies: - '@ai-sdk/azure': - specifier: ^2.0.47 - version: 2.0.47(zod@4.3.5) '@ai-sdk/google': - specifier: ^2.0.18 - version: 2.0.18(zod@4.3.5) + specifier: ^3.0.9 + version: 3.0.10(zod@4.3.5) '@ai-sdk/openai': - specifier: ^2.0.46 - version: 2.0.46(zod@4.3.5) + specifier: ^3.0.11 + version: 3.0.12(zod@4.3.5) + '@ai-sdk/openai-compatible': + specifier: ^2.0.12 + version: 2.0.13(zod@4.3.5) '@aws-sdk/client-s3': specifier: 3.701.0 version: 3.701.0 @@ -528,11 +528,11 @@ importers: specifier: ^8.3.0 version: 8.3.0(socket.io-adapter@2.5.4) ai: - specifier: ^5.0.65 - version: 5.0.65(zod@4.3.5) + specifier: ^6.0.37 + version: 6.0.38(zod@4.3.5) ai-sdk-ollama: - specifier: ^0.12.0 - version: 0.12.0(ai@5.0.65(zod@4.3.5))(zod@4.3.5) + specifier: ^3.1.1 + version: 3.1.1(ai@6.0.38(zod@4.3.5))(zod@4.3.5) bcrypt: specifier: ^6.0.0 version: 6.0.0 @@ -762,38 +762,38 @@ packages: '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - '@ai-sdk/azure@2.0.47': - resolution: {integrity: sha512-rPvjnBWVTVRCDs47qfBWxXxx4i4h7itemyKux21qibB7y24rubqmZGx9lYcI5pyBL057uROhBa9Y5VVHf/ESYw==} + '@ai-sdk/gateway@3.0.16': + resolution: {integrity: sha512-OOY5CfRJiHvh/8np2vs1RQaCZ5hWv2qOeEmmeiABXK3gLQHUVnCO+1hhoLsZdHM5iElu6M407dAOfyvTsKJqcQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@1.0.36': - resolution: {integrity: sha512-G/CLHzyOy9mhbimSBmV+o59M7ao/NfRFrrhC+eHGp+0qT0diP3IDW5VdkPHKFmDp4Iq7wb4/yOCe7Yk2fQtSrg==} + '@ai-sdk/google@3.0.10': + resolution: {integrity: sha512-qd2EM9SlD7wWFrq036hwKsuAgkCVxQbwJzctszdmzPs9yUZg795/gHtZRpKItZhbyHSNWhAHmJwEgKjD+HOzuQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@2.0.18': - resolution: {integrity: sha512-ycGAqouueHjU0hB6JHYmUhXYCnN67PqI8+9jCv13MbuE0g+b9w78HiPuab5ResakY0cq3ynFDvbiu8jAGo1RZQ==} + '@ai-sdk/openai-compatible@2.0.13': + resolution: {integrity: sha512-DShpuHZ9wiy3QtxJ4/Uq5csLxgNgeA3w58isYhZ34pSod2cBlRmJl3EyQzxZ1HD8e6sQDa9fvc0cwF5/EugBMw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.46': - resolution: {integrity: sha512-3FHZdiTLbjnHw0rbu1yOPW8FruHrzN6SlJYsaLSQgbxYfE5y+60Nj4Xp8/k7rtD3FmrjkKcp/XTMSbAJWfoJig==} + '@ai-sdk/openai@3.0.12': + resolution: {integrity: sha512-zqLWEKuaKnjXhu7xCw1jgz/+yTbd3F7EtgU4T2Q8BAo8OJC5wZv14l+kwM7Jai7M1/2Y2T/zBkrfiIu+7NsvfQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.11': - resolution: {integrity: sha512-4hgHj89VqyOHzGaV85TkcgvO8WjecVF35TOUVg+C56vnzpWSgdIZu/ZWZNdZ6BTrv8y0N1toBWW7XcWiRRicLg==} + '@ai-sdk/provider-utils@4.0.8': + resolution: {integrity: sha512-ns9gN7MmpI8vTRandzgz+KK/zNMLzhrriiKECMt4euLtQFSBgNfydtagPOX4j4pS1/3KvHF6RivhT3gNQgBZsg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@2.0.0': - resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + '@ai-sdk/provider@3.0.4': + resolution: {integrity: sha512-5KXyBOSEX+l67elrEa+wqo/LSsSTtrPj9Uoh3zMbe/ceQX4ucHI3b9nUEfNkGF3Ry1svv90widAt+aiKdIJasQ==} engines: {node: '>=18'} '@ampproject/remapping@2.3.0': @@ -4157,8 +4157,8 @@ packages: peerDependencies: socket.io-adapter: ^2.5.4 - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@swc/core-darwin-arm64@1.5.25': resolution: {integrity: sha512-YbD0SBgVJS2DM0vwJTU5m7+wOyCjHPBDMf3nCBJQzFZzOLzK11eRW7SzU2jhJHr9HI9sKcNFfN4lIC2Sj+4inA==} @@ -5022,8 +5022,8 @@ packages: '@ucast/mongo@2.4.3': resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} - '@vercel/oidc@3.0.2': - resolution: {integrity: sha512-JekxQ0RApo4gS4un/iMGsIL1/k4KUBe3HmnGcDvzHuFBdQdudEJgTqcsJC7y6Ul4Yw5CeykgvQbX2XeEJd0+DA==} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} '@vitejs/plugin-react@5.1.1': @@ -5145,14 +5145,14 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - ai-sdk-ollama@0.12.0: - resolution: {integrity: sha512-EEKIfIpkyAavrlEKlZ7nZCxTUPq4yBThBLLU3kTD4l7htpdqMjhOEyqm5DlKdQvLEW0MgCMsptw7yXbevRSfIQ==} + ai-sdk-ollama@3.1.1: + resolution: {integrity: sha512-1rTgOGUsE8pR2ccg0Uz9lNJYzNUJKjtHDfUB5itoc2UnWZnbzQyqyxTUloCIWjwDkEzaWBiEJRLNvwF7a6j4VQ==} engines: {node: '>=22'} peerDependencies: - ai: ^5.0.60 + ai: ^6.0.27 - ai@5.0.65: - resolution: {integrity: sha512-orwsNKAoAmTwHkoy7TG/7nc65SD3hy7k+x8xVHIzfw8CibZm/U2cdbR1ZUex6H2Rpf+uoZpvyQ05FWBJNw7V8A==} + ai@6.0.38: + resolution: {integrity: sha512-X8AaZFrdsPO1RNCAQLsaWfmE/SL9zgsiIZN3XqEHs3jIZ7ycR5aQZRg5XpNtbLWJxKXzK2b1ZXLx13AFOjksSg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -8210,8 +8210,8 @@ packages: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} - ollama@0.6.0: - resolution: {integrity: sha512-FHjdU2Ok5x2HZsxPui/MBJZ5J+HzmxoWYa/p9wk736eT+uAhS8nvIICar5YgwlG5MFNjDR6UA5F3RSKq+JseOA==} + ollama@0.6.3: + resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -10356,40 +10356,39 @@ snapshots: '@adobe/css-tools@4.3.3': {} - '@ai-sdk/azure@2.0.47(zod@4.3.5)': + '@ai-sdk/gateway@3.0.16(zod@4.3.5)': dependencies: - '@ai-sdk/openai': 2.0.46(zod@4.3.5) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) + '@vercel/oidc': 3.1.0 zod: 4.3.5 - '@ai-sdk/gateway@1.0.36(zod@4.3.5)': + '@ai-sdk/google@3.0.10(zod@4.3.5)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) - '@vercel/oidc': 3.0.2 + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) zod: 4.3.5 - '@ai-sdk/google@2.0.18(zod@4.3.5)': + '@ai-sdk/openai-compatible@2.0.13(zod@4.3.5)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) zod: 4.3.5 - '@ai-sdk/openai@2.0.46(zod@4.3.5)': + '@ai-sdk/openai@3.0.12(zod@4.3.5)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) zod: 4.3.5 - '@ai-sdk/provider-utils@3.0.11(zod@4.3.5)': + '@ai-sdk/provider-utils@4.0.8(zod@4.3.5)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 + '@ai-sdk/provider': 3.0.4 + '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 4.3.5 - '@ai-sdk/provider@2.0.0': + '@ai-sdk/provider@3.0.4': dependencies: json-schema: 0.4.0 @@ -14593,7 +14592,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} '@swc/core-darwin-arm64@1.5.25': optional: true @@ -15569,7 +15568,7 @@ snapshots: dependencies: '@ucast/core': 1.10.2 - '@vercel/oidc@3.0.2': {} + '@vercel/oidc@3.1.0': {} '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: @@ -15707,20 +15706,20 @@ snapshots: transitivePeerDependencies: - supports-color - ai-sdk-ollama@0.12.0(ai@5.0.65(zod@4.3.5))(zod@4.3.5): + ai-sdk-ollama@3.1.1(ai@6.0.38(zod@4.3.5))(zod@4.3.5): dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) - ai: 5.0.65(zod@4.3.5) - ollama: 0.6.0 + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) + ai: 6.0.38(zod@4.3.5) + ollama: 0.6.3 transitivePeerDependencies: - zod - ai@5.0.65(zod@4.3.5): + ai@6.0.38(zod@4.3.5): dependencies: - '@ai-sdk/gateway': 1.0.36(zod@4.3.5) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.11(zod@4.3.5) + '@ai-sdk/gateway': 3.0.16(zod@4.3.5) + '@ai-sdk/provider': 3.0.4 + '@ai-sdk/provider-utils': 4.0.8(zod@4.3.5) '@opentelemetry/api': 1.9.0 zod: 4.3.5 @@ -19458,7 +19457,7 @@ snapshots: oidc-token-hash@5.0.3: {} - ollama@0.6.0: + ollama@0.6.3: dependencies: whatwg-fetch: 3.6.20