diff --git a/.github/scripts/docker-pr-comment.js b/.github/scripts/docker-pr-comment.js
new file mode 100644
index 00000000000..deeca89e38f
--- /dev/null
+++ b/.github/scripts/docker-pr-comment.js
@@ -0,0 +1,89 @@
+/**
+ * Generate or update PR comment with Docker build info
+ */
+module.exports = async ({
+ github,
+ context,
+ dockerMetaJson,
+ image,
+ version,
+ dockerhubUrl,
+ platforms,
+}) => {
+ const COMMENT_IDENTIFIER = '';
+
+ const parseTags = () => {
+ try {
+ if (dockerMetaJson) {
+ const parsed = JSON.parse(dockerMetaJson);
+ if (Array.isArray(parsed.tags) && parsed.tags.length > 0) {
+ return parsed.tags;
+ }
+ }
+ } catch (e) {
+ // ignore parsing error, fallback below
+ }
+ if (image && version) {
+ return [`${image}:${version}`];
+ }
+ return [];
+ };
+
+ const generateCommentBody = () => {
+ const tags = parseTags();
+ const buildTime = new Date().toISOString();
+
+ // Use the first tag as the main version
+ const mainTag = tags.length > 0 ? tags[0] : `${image}:${version}`;
+ const tagVersion = mainTag.includes(':') ? mainTag.split(':')[1] : version;
+
+ return [
+ COMMENT_IDENTIFIER,
+ '',
+ '### 🐳 Database Docker Build Completed!',
+ `**Version**: \`${tagVersion || 'N/A'}\``,
+ `**Build Time**: \`${buildTime}\``,
+ '',
+ dockerhubUrl ? `🔗 View all tags on Docker Hub: ${dockerhubUrl}` : '',
+ '',
+ '### Pull Image',
+ 'Download the Docker image to your local machine:',
+ '',
+ '```bash',
+ `docker pull ${mainTag}`,
+ '```',
+ '> [!IMPORTANT]',
+ '> This build is for testing and validation purposes.',
+ ]
+ .filter(Boolean)
+ .join('\n');
+ };
+
+ const body = generateCommentBody();
+
+ // List comments on the PR
+ const { data: comments } = await github.rest.issues.listComments({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ });
+
+ const existing = comments.find((c) => c.body && c.body.includes(COMMENT_IDENTIFIER));
+ if (existing) {
+ await github.rest.issues.updateComment({
+ comment_id: existing.id,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body,
+ });
+ return { updated: true, id: existing.id };
+ }
+
+ const result = await github.rest.issues.createComment({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body,
+ });
+ return { updated: false, id: result.data.id };
+};
diff --git a/.github/workflows/docker-database.yml b/.github/workflows/docker-database.yml
index cc230bbf10e..02089192d0f 100644
--- a/.github/workflows/docker-database.yml
+++ b/.github/workflows/docker-database.yml
@@ -159,3 +159,24 @@ jobs:
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
+
+
+ - name: Comment on PR with Docker build info
+ if: github.event_name == 'pull_request'
+ uses: actions/github-script@v7
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ const prComment = require('${{ github.workspace }}/.github/scripts/docker-pr-comment.js');
+ const result = await prComment({
+ github,
+ context,
+ dockerMetaJson: ${{ toJSON(steps.meta.outputs.json) }},
+ image: "${{ env.REGISTRY_IMAGE }}",
+ version: "${{ steps.meta.outputs.version }}",
+ dockerhubUrl: "https://hub.docker.com/r/${{ env.REGISTRY_IMAGE }}/tags",
+ platforms: "linux/amd64, linux/arm64",
+ });
+ core.info(`Status: ${result.updated ? 'Updated' : 'Created'}, ID: ${result.id}`);
+
+
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b36061b44b8..bdd6eb10758 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -11,7 +11,7 @@ jobs:
services:
postgres:
- image: pgvector/pgvector:pg17
+ image: paradedb/paradedb:latest
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -38,8 +38,10 @@ jobs:
- name: Lint
run: bun run lint
- - name: Test Server Coverage
- run: bun run test-server:coverage
+ - uses: pnpm/action-setup@v4
+
+ - name: Test Database Coverage
+ run: pnpm --filter @lobechat/database test
env:
DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres
DATABASE_DRIVER: node
@@ -48,8 +50,8 @@ jobs:
S3_PUBLIC_DOMAIN: https://example.com
APP_URL: https://home.com
- - name: Test App Coverage
- run: bun run test-app:coverage
+ - name: Test App
+ run: bun run test-app
- name: Release
run: bun run release
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index a0e92386005..49fc7609e35 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- package: [file-loaders, prompts, model-runtime, web-crawler, electron-server-ipc]
+ package: [file-loaders, prompts, model-runtime, web-crawler, electron-server-ipc, utils]
name: Test package ${{ matrix.package }}
@@ -75,7 +75,7 @@ jobs:
files: ./coverage/app/lcov.info
flags: app
- test-server:
+ test-databsae:
name: Test Database
runs-on: ubuntu-latest
@@ -109,8 +109,10 @@ jobs:
- name: Lint
run: bun run lint
- - name: Test Server Coverage
- run: bun run test-server:coverage
+ - uses: pnpm/action-setup@v4
+
+ - name: Test Coverage
+ run: pnpm --filter @lobechat/database test:coverage
env:
DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres
DATABASE_DRIVER: node
@@ -119,9 +121,9 @@ jobs:
S3_PUBLIC_DOMAIN: https://example.com
APP_URL: https://home.com
- - name: Upload Server coverage to Codecov
+ - name: Upload Database coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
- files: ./coverage/server/lcov.info
- flags: server
+ files: ./packages/database/coverage/lcov.info
+ flags: database
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d6526aa91b3..d1ae71e06a8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,56 @@
# Changelog
+### [Version 1.114.5](https://github.com/lobehub/lobe-chat/compare/v1.114.4...v1.114.5)
+
+Released on **2025-08-22**
+
+#### 💄 Styles
+
+- **misc**: Update mistral model vision ability.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Update mistral model vision ability, closes [#8885](https://github.com/lobehub/lobe-chat/issues/8885) ([915c0ff](https://github.com/lobehub/lobe-chat/commit/915c0ff))
+
+
+
+
+
+[](#readme-top)
+
+
+
+### [Version 1.114.4](https://github.com/lobehub/lobe-chat/compare/v1.114.3...v1.114.4)
+
+Released on **2025-08-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Move database to packages.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Move database to packages, closes [#8874](https://github.com/lobehub/lobe-chat/issues/8874) ([af1f715](https://github.com/lobehub/lobe-chat/commit/af1f715))
+
+
+
+
+
+[](#readme-top)
+
+
+
### [Version 1.114.3](https://github.com/lobehub/lobe-chat/compare/v1.114.2...v1.114.3)
Released on **2025-08-21**
diff --git a/Dockerfile.database b/Dockerfile.database
index 5123ae77a61..523c01ef602 100644
--- a/Dockerfile.database
+++ b/Dockerfile.database
@@ -120,7 +120,7 @@ COPY --from=base /distroless/ /
COPY --from=builder /app/.next/standalone /app/
# Copy database migrations
-COPY --from=builder /app/src/database/migrations /app/migrations
+COPY --from=builder /app/packages/database/migrations /app/migrations
COPY --from=builder /app/scripts/migrateServerDB/docker.cjs /app/docker.cjs
COPY --from=builder /app/scripts/migrateServerDB/errorHint.js /app/errorHint.js
diff --git a/changelog/v1.json b/changelog/v1.json
index 64b4e9721ff..c50294a39ef 100644
--- a/changelog/v1.json
+++ b/changelog/v1.json
@@ -1,4 +1,18 @@
[
+ {
+ "children": {
+ "improvements": ["Update mistral model vision ability."]
+ },
+ "date": "2025-08-22",
+ "version": "1.114.5"
+ },
+ {
+ "children": {
+ "improvements": ["Move database to packages."]
+ },
+ "date": "2025-08-22",
+ "version": "1.114.4"
+ },
{
"children": {},
"date": "2025-08-21",
diff --git a/codecov.yml b/codecov.yml
index 5fb59f6206c..2f3787a9ca1 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -1,11 +1,39 @@
+component_management:
+ individual_components:
+ # App architecture layers
+ - component_id: app_store
+ name: "Store"
+ paths:
+ - src/store/**
+ - component_id: app_services
+ name: "Services"
+ paths:
+ - src/services/**
+ - component_id: app_server
+ name: "Server"
+ paths:
+ - src/server/**
+ - component_id: app_libs
+ name: "Libs"
+ paths:
+ - src/libs/**
+ - component_id: app_utils
+ name: "Utils"
+ paths:
+ - src/utils/**
+
coverage:
status:
project:
default: off
- server:
+ database:
flags:
- - server
+ - database
app:
flags:
- app
patch: off
+
+
+comment:
+ layout: "header, diff, flags, components" # show component info in the PR comment
diff --git a/docs/development/database-schema.dbml b/docs/development/database-schema.dbml
index 5a4a680de4e..f9d8af6f1dc 100644
--- a/docs/development/database-schema.dbml
+++ b/docs/development/database-schema.dbml
@@ -104,6 +104,19 @@ table ai_providers {
}
}
+table api_keys {
+ id integer [pk, not null]
+ name varchar(256) [not null]
+ key varchar(256) [not null, unique]
+ enabled boolean [default: true]
+ expires_at "timestamp with time zone"
+ last_used_at "timestamp with time zone"
+ user_id text [not null]
+ accessed_at "timestamp with time zone" [not null, default: `now()`]
+ created_at "timestamp with time zone" [not null, default: `now()`]
+ updated_at "timestamp with time zone" [not null, default: `now()`]
+}
+
table async_tasks {
id uuid [pk, not null, default: `gen_random_uuid()`]
type text
@@ -702,6 +715,7 @@ table rbac_roles {
description text
is_system boolean [not null, default: false]
is_active boolean [not null, default: true]
+ metadata jsonb [default: `{}`]
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
diff --git a/drizzle.config.ts b/drizzle.config.ts
index 3d71493a53a..d47ed2f7110 100644
--- a/drizzle.config.ts
+++ b/drizzle.config.ts
@@ -22,8 +22,8 @@ export default {
url: connectionString,
},
dialect: 'postgresql',
- out: './src/database/migrations',
+ out: './packages/database/migrations',
- schema: './src/database/schemas',
+ schema: './packages/database/src/schemas',
strict: true,
} satisfies Config;
diff --git a/package.json b/package.json
index d47fdd55fd8..7731d78a4b9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@lobehub/chat",
- "version": "1.114.3",
+ "version": "1.114.5",
"description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
"keywords": [
"framework",
@@ -73,8 +73,6 @@
"test": "npm run test-app && npm run test-server",
"test-app": "vitest run --config vitest.config.ts",
"test-app:coverage": "vitest run --config vitest.config.ts --coverage",
- "test-server": "vitest run --config vitest.config.server.ts",
- "test-server:coverage": "vitest run --config vitest.config.server.ts --coverage",
"test:update": "vitest -u",
"type-check": "tsgo --noEmit",
"webhook:ngrok": "ngrok http http://localhost:3011",
@@ -141,11 +139,14 @@
"@icons-pack/react-simple-icons": "9.6.0",
"@khmyznikov/pwa-install": "0.3.9",
"@langchain/community": "^0.3.50",
+ "@lobechat/const": "workspace:*",
+ "@lobechat/database": "workspace:*",
"@lobechat/electron-client-ipc": "workspace:*",
"@lobechat/electron-server-ipc": "workspace:*",
"@lobechat/file-loaders": "workspace:*",
"@lobechat/model-runtime": "workspace:*",
"@lobechat/prompts": "workspace:*",
+ "@lobechat/utils": "workspace:*",
"@lobechat/web-crawler": "workspace:*",
"@lobehub/analytics": "^1.6.0",
"@lobehub/charts": "^2.0.0",
@@ -361,8 +362,7 @@
"unified": "^11.0.5",
"unist-util-visit": "^5.0.0",
"vite": "^5.4.19",
- "vitest": "^3.2.4",
- "vitest-canvas-mock": "^0.3.3"
+ "vitest": "^3.2.4"
},
"packageManager": "pnpm@10.14.0",
"publishConfig": {
diff --git a/packages/const/src/index.ts b/packages/const/src/index.ts
index 38f27f79d53..99e9bbcbd84 100644
--- a/packages/const/src/index.ts
+++ b/packages/const/src/index.ts
@@ -1,2 +1,4 @@
+export * from './locale';
+export * from './message';
export * from './settings';
export * from './version';
diff --git a/src/utils/genUserLLMConfig.test.ts b/packages/const/src/settings/genUserLLMConfig.test.ts
similarity index 95%
rename from src/utils/genUserLLMConfig.test.ts
rename to packages/const/src/settings/genUserLLMConfig.test.ts
index 1de80257883..1a93bd3bb8b 100644
--- a/src/utils/genUserLLMConfig.test.ts
+++ b/packages/const/src/settings/genUserLLMConfig.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it, vi } from 'vitest';
-import { ModelProviderCard } from '@/types/llm';
+import { ModelProviderCard } from '@/types/index';
import { genUserLLMConfig } from './genUserLLMConfig';
diff --git a/src/utils/genUserLLMConfig.ts b/packages/const/src/settings/genUserLLMConfig.ts
similarity index 94%
rename from src/utils/genUserLLMConfig.ts
rename to packages/const/src/settings/genUserLLMConfig.ts
index 3ef7c73e142..61dffce9043 100644
--- a/src/utils/genUserLLMConfig.ts
+++ b/packages/const/src/settings/genUserLLMConfig.ts
@@ -1,8 +1,8 @@
import { ModelProvider } from '@lobechat/model-runtime';
+import { UserModelProviderConfig } from '@lobechat/types';
import * as ProviderCards from '@/config/modelProviders';
import { ModelProviderCard } from '@/types/llm';
-import { UserModelProviderConfig } from '@/types/user/settings';
export const genUserLLMConfig = (specificConfig: Record): UserModelProviderConfig => {
return Object.keys(ModelProvider).reduce((config, providerKey) => {
diff --git a/packages/const/src/settings/index.ts b/packages/const/src/settings/index.ts
index a872a509ad4..90141286f77 100644
--- a/packages/const/src/settings/index.ts
+++ b/packages/const/src/settings/index.ts
@@ -9,8 +9,6 @@ import { DEFAULT_SYSTEM_AGENT_CONFIG } from './systemAgent';
import { DEFAULT_TOOL_CONFIG } from './tool';
import { DEFAULT_TTS_CONFIG } from './tts';
-export const COOKIE_CACHE_DAYS = 30;
-
export * from './agent';
export * from './hotkey';
export * from './llm';
diff --git a/packages/const/src/settings/llm.ts b/packages/const/src/settings/llm.ts
index f2c7d99a495..690d8a424a7 100644
--- a/packages/const/src/settings/llm.ts
+++ b/packages/const/src/settings/llm.ts
@@ -1,6 +1,6 @@
import { ModelProvider } from '@lobechat/model-runtime';
-import { genUserLLMConfig } from '@/utils/genUserLLMConfig';
+import { genUserLLMConfig } from './genUserLLMConfig';
export const DEFAULT_LLM_CONFIG = genUserLLMConfig({
lmstudio: {
diff --git a/src/database/migrations/0000_init.sql b/packages/database/migrations/0000_init.sql
similarity index 100%
rename from src/database/migrations/0000_init.sql
rename to packages/database/migrations/0000_init.sql
diff --git a/src/database/migrations/0001_add_client_id.sql b/packages/database/migrations/0001_add_client_id.sql
similarity index 100%
rename from src/database/migrations/0001_add_client_id.sql
rename to packages/database/migrations/0001_add_client_id.sql
diff --git a/src/database/migrations/0002_amusing_puma.sql b/packages/database/migrations/0002_amusing_puma.sql
similarity index 100%
rename from src/database/migrations/0002_amusing_puma.sql
rename to packages/database/migrations/0002_amusing_puma.sql
diff --git a/src/database/migrations/0003_naive_echo.sql b/packages/database/migrations/0003_naive_echo.sql
similarity index 100%
rename from src/database/migrations/0003_naive_echo.sql
rename to packages/database/migrations/0003_naive_echo.sql
diff --git a/src/database/migrations/0004_add_next_auth.sql b/packages/database/migrations/0004_add_next_auth.sql
similarity index 100%
rename from src/database/migrations/0004_add_next_auth.sql
rename to packages/database/migrations/0004_add_next_auth.sql
diff --git a/src/database/migrations/0005_pgvector.sql b/packages/database/migrations/0005_pgvector.sql
similarity index 100%
rename from src/database/migrations/0005_pgvector.sql
rename to packages/database/migrations/0005_pgvector.sql
diff --git a/src/database/migrations/0006_add_knowledge_base.sql b/packages/database/migrations/0006_add_knowledge_base.sql
similarity index 100%
rename from src/database/migrations/0006_add_knowledge_base.sql
rename to packages/database/migrations/0006_add_knowledge_base.sql
diff --git a/src/database/migrations/0007_fix_embedding_table.sql b/packages/database/migrations/0007_fix_embedding_table.sql
similarity index 100%
rename from src/database/migrations/0007_fix_embedding_table.sql
rename to packages/database/migrations/0007_fix_embedding_table.sql
diff --git a/src/database/migrations/0008_add_rag_evals.sql b/packages/database/migrations/0008_add_rag_evals.sql
similarity index 100%
rename from src/database/migrations/0008_add_rag_evals.sql
rename to packages/database/migrations/0008_add_rag_evals.sql
diff --git a/src/database/migrations/0009_remove_unused_user_tables.sql b/packages/database/migrations/0009_remove_unused_user_tables.sql
similarity index 100%
rename from src/database/migrations/0009_remove_unused_user_tables.sql
rename to packages/database/migrations/0009_remove_unused_user_tables.sql
diff --git a/src/database/migrations/0010_add_accessed_at_and_clean_tables.sql b/packages/database/migrations/0010_add_accessed_at_and_clean_tables.sql
similarity index 100%
rename from src/database/migrations/0010_add_accessed_at_and_clean_tables.sql
rename to packages/database/migrations/0010_add_accessed_at_and_clean_tables.sql
diff --git a/src/database/migrations/0011_add_topic_history_summary.sql b/packages/database/migrations/0011_add_topic_history_summary.sql
similarity index 100%
rename from src/database/migrations/0011_add_topic_history_summary.sql
rename to packages/database/migrations/0011_add_topic_history_summary.sql
diff --git a/src/database/migrations/0012_add_thread.sql b/packages/database/migrations/0012_add_thread.sql
similarity index 100%
rename from src/database/migrations/0012_add_thread.sql
rename to packages/database/migrations/0012_add_thread.sql
diff --git a/src/database/migrations/0013_add_ai_infra.sql b/packages/database/migrations/0013_add_ai_infra.sql
similarity index 100%
rename from src/database/migrations/0013_add_ai_infra.sql
rename to packages/database/migrations/0013_add_ai_infra.sql
diff --git a/src/database/migrations/0014_add_message_reasoning.sql b/packages/database/migrations/0014_add_message_reasoning.sql
similarity index 100%
rename from src/database/migrations/0014_add_message_reasoning.sql
rename to packages/database/migrations/0014_add_message_reasoning.sql
diff --git a/src/database/migrations/0015_add_message_search_metadata.sql b/packages/database/migrations/0015_add_message_search_metadata.sql
similarity index 100%
rename from src/database/migrations/0015_add_message_search_metadata.sql
rename to packages/database/migrations/0015_add_message_search_metadata.sql
diff --git a/src/database/migrations/0016_add_message_index.sql b/packages/database/migrations/0016_add_message_index.sql
similarity index 100%
rename from src/database/migrations/0016_add_message_index.sql
rename to packages/database/migrations/0016_add_message_index.sql
diff --git a/src/database/migrations/0017_add_user_id_to_tables.sql b/packages/database/migrations/0017_add_user_id_to_tables.sql
similarity index 100%
rename from src/database/migrations/0017_add_user_id_to_tables.sql
rename to packages/database/migrations/0017_add_user_id_to_tables.sql
diff --git a/src/database/migrations/0018_add_client_id_for_entities.sql b/packages/database/migrations/0018_add_client_id_for_entities.sql
similarity index 100%
rename from src/database/migrations/0018_add_client_id_for_entities.sql
rename to packages/database/migrations/0018_add_client_id_for_entities.sql
diff --git a/src/database/migrations/0019_add_hotkey_user_settings.sql b/packages/database/migrations/0019_add_hotkey_user_settings.sql
similarity index 100%
rename from src/database/migrations/0019_add_hotkey_user_settings.sql
rename to packages/database/migrations/0019_add_hotkey_user_settings.sql
diff --git a/src/database/migrations/0020_add_oidc.sql b/packages/database/migrations/0020_add_oidc.sql
similarity index 100%
rename from src/database/migrations/0020_add_oidc.sql
rename to packages/database/migrations/0020_add_oidc.sql
diff --git a/src/database/migrations/0021_add_agent_opening_settings.sql b/packages/database/migrations/0021_add_agent_opening_settings.sql
similarity index 100%
rename from src/database/migrations/0021_add_agent_opening_settings.sql
rename to packages/database/migrations/0021_add_agent_opening_settings.sql
diff --git a/src/database/migrations/0022_add_documents.sql b/packages/database/migrations/0022_add_documents.sql
similarity index 100%
rename from src/database/migrations/0022_add_documents.sql
rename to packages/database/migrations/0022_add_documents.sql
diff --git a/src/database/migrations/0023_remove_param_and_doubao.sql b/packages/database/migrations/0023_remove_param_and_doubao.sql
similarity index 100%
rename from src/database/migrations/0023_remove_param_and_doubao.sql
rename to packages/database/migrations/0023_remove_param_and_doubao.sql
diff --git a/src/database/migrations/0024_add_rbac_tables.sql b/packages/database/migrations/0024_add_rbac_tables.sql
similarity index 100%
rename from src/database/migrations/0024_add_rbac_tables.sql
rename to packages/database/migrations/0024_add_rbac_tables.sql
diff --git a/src/database/migrations/0025_add_provider_config.sql b/packages/database/migrations/0025_add_provider_config.sql
similarity index 100%
rename from src/database/migrations/0025_add_provider_config.sql
rename to packages/database/migrations/0025_add_provider_config.sql
diff --git a/src/database/migrations/0026_add_autovacuum_tuning.sql b/packages/database/migrations/0026_add_autovacuum_tuning.sql
similarity index 100%
rename from src/database/migrations/0026_add_autovacuum_tuning.sql
rename to packages/database/migrations/0026_add_autovacuum_tuning.sql
diff --git a/src/database/migrations/0027_ai_image.sql b/packages/database/migrations/0027_ai_image.sql
similarity index 100%
rename from src/database/migrations/0027_ai_image.sql
rename to packages/database/migrations/0027_ai_image.sql
diff --git a/src/database/migrations/0028_oauth_handoffs.sql b/packages/database/migrations/0028_oauth_handoffs.sql
similarity index 86%
rename from src/database/migrations/0028_oauth_handoffs.sql
rename to packages/database/migrations/0028_oauth_handoffs.sql
index af84afd9642..270b21134d3 100644
--- a/src/database/migrations/0028_oauth_handoffs.sql
+++ b/packages/database/migrations/0028_oauth_handoffs.sql
@@ -1,4 +1,4 @@
-CREATE TABLE "oauth_handoffs" (
+CREATE TABLE IF NOT EXISTS "oauth_handoffs" (
"id" text PRIMARY KEY NOT NULL,
"client" varchar(50) NOT NULL,
"payload" jsonb NOT NULL,
diff --git a/src/database/migrations/0029_add_apikey_manage.sql b/packages/database/migrations/0029_add_apikey_manage.sql
similarity index 88%
rename from src/database/migrations/0029_add_apikey_manage.sql
rename to packages/database/migrations/0029_add_apikey_manage.sql
index 5823eed015a..d7ff070a472 100644
--- a/src/database/migrations/0029_add_apikey_manage.sql
+++ b/packages/database/migrations/0029_add_apikey_manage.sql
@@ -12,5 +12,5 @@ CREATE TABLE IF NOT EXISTS "api_keys" (
CONSTRAINT "api_keys_key_unique" UNIQUE("key")
);
--> statement-breakpoint
-ALTER TABLE "rbac_roles" ADD COLUMN "metadata" jsonb DEFAULT '{}'::jsonb;--> statement-breakpoint
+ALTER TABLE "rbac_roles" ADD COLUMN IF NOT EXISTS "metadata" jsonb DEFAULT '{}'::jsonb;--> statement-breakpoint
ALTER TABLE "api_keys" ADD CONSTRAINT "api_keys_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
diff --git a/src/database/migrations/meta/0000_snapshot.json b/packages/database/migrations/meta/0000_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0000_snapshot.json
rename to packages/database/migrations/meta/0000_snapshot.json
diff --git a/src/database/migrations/meta/0001_snapshot.json b/packages/database/migrations/meta/0001_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0001_snapshot.json
rename to packages/database/migrations/meta/0001_snapshot.json
diff --git a/src/database/migrations/meta/0002_snapshot.json b/packages/database/migrations/meta/0002_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0002_snapshot.json
rename to packages/database/migrations/meta/0002_snapshot.json
diff --git a/src/database/migrations/meta/0003_snapshot.json b/packages/database/migrations/meta/0003_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0003_snapshot.json
rename to packages/database/migrations/meta/0003_snapshot.json
diff --git a/src/database/migrations/meta/0004_snapshot.json b/packages/database/migrations/meta/0004_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0004_snapshot.json
rename to packages/database/migrations/meta/0004_snapshot.json
diff --git a/src/database/migrations/meta/0005_snapshot.json b/packages/database/migrations/meta/0005_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0005_snapshot.json
rename to packages/database/migrations/meta/0005_snapshot.json
diff --git a/src/database/migrations/meta/0006_snapshot.json b/packages/database/migrations/meta/0006_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0006_snapshot.json
rename to packages/database/migrations/meta/0006_snapshot.json
diff --git a/src/database/migrations/meta/0007_snapshot.json b/packages/database/migrations/meta/0007_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0007_snapshot.json
rename to packages/database/migrations/meta/0007_snapshot.json
diff --git a/src/database/migrations/meta/0008_snapshot.json b/packages/database/migrations/meta/0008_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0008_snapshot.json
rename to packages/database/migrations/meta/0008_snapshot.json
diff --git a/src/database/migrations/meta/0009_snapshot.json b/packages/database/migrations/meta/0009_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0009_snapshot.json
rename to packages/database/migrations/meta/0009_snapshot.json
diff --git a/src/database/migrations/meta/0010_snapshot.json b/packages/database/migrations/meta/0010_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0010_snapshot.json
rename to packages/database/migrations/meta/0010_snapshot.json
diff --git a/src/database/migrations/meta/0011_snapshot.json b/packages/database/migrations/meta/0011_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0011_snapshot.json
rename to packages/database/migrations/meta/0011_snapshot.json
diff --git a/src/database/migrations/meta/0012_snapshot.json b/packages/database/migrations/meta/0012_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0012_snapshot.json
rename to packages/database/migrations/meta/0012_snapshot.json
diff --git a/src/database/migrations/meta/0013_snapshot.json b/packages/database/migrations/meta/0013_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0013_snapshot.json
rename to packages/database/migrations/meta/0013_snapshot.json
diff --git a/src/database/migrations/meta/0014_snapshot.json b/packages/database/migrations/meta/0014_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0014_snapshot.json
rename to packages/database/migrations/meta/0014_snapshot.json
diff --git a/src/database/migrations/meta/0015_snapshot.json b/packages/database/migrations/meta/0015_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0015_snapshot.json
rename to packages/database/migrations/meta/0015_snapshot.json
diff --git a/src/database/migrations/meta/0016_snapshot.json b/packages/database/migrations/meta/0016_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0016_snapshot.json
rename to packages/database/migrations/meta/0016_snapshot.json
diff --git a/src/database/migrations/meta/0017_snapshot.json b/packages/database/migrations/meta/0017_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0017_snapshot.json
rename to packages/database/migrations/meta/0017_snapshot.json
diff --git a/src/database/migrations/meta/0018_snapshot.json b/packages/database/migrations/meta/0018_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0018_snapshot.json
rename to packages/database/migrations/meta/0018_snapshot.json
diff --git a/src/database/migrations/meta/0019_snapshot.json b/packages/database/migrations/meta/0019_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0019_snapshot.json
rename to packages/database/migrations/meta/0019_snapshot.json
diff --git a/src/database/migrations/meta/0020_snapshot.json b/packages/database/migrations/meta/0020_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0020_snapshot.json
rename to packages/database/migrations/meta/0020_snapshot.json
diff --git a/src/database/migrations/meta/0021_snapshot.json b/packages/database/migrations/meta/0021_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0021_snapshot.json
rename to packages/database/migrations/meta/0021_snapshot.json
diff --git a/src/database/migrations/meta/0022_snapshot.json b/packages/database/migrations/meta/0022_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0022_snapshot.json
rename to packages/database/migrations/meta/0022_snapshot.json
diff --git a/src/database/migrations/meta/0023_snapshot.json b/packages/database/migrations/meta/0023_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0023_snapshot.json
rename to packages/database/migrations/meta/0023_snapshot.json
diff --git a/src/database/migrations/meta/0024_snapshot.json b/packages/database/migrations/meta/0024_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0024_snapshot.json
rename to packages/database/migrations/meta/0024_snapshot.json
diff --git a/src/database/migrations/meta/0025_snapshot.json b/packages/database/migrations/meta/0025_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0025_snapshot.json
rename to packages/database/migrations/meta/0025_snapshot.json
diff --git a/src/database/migrations/meta/0026_snapshot.json b/packages/database/migrations/meta/0026_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0026_snapshot.json
rename to packages/database/migrations/meta/0026_snapshot.json
diff --git a/src/database/migrations/meta/0027_snapshot.json b/packages/database/migrations/meta/0027_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0027_snapshot.json
rename to packages/database/migrations/meta/0027_snapshot.json
diff --git a/src/database/migrations/meta/0028_snapshot.json b/packages/database/migrations/meta/0028_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0028_snapshot.json
rename to packages/database/migrations/meta/0028_snapshot.json
diff --git a/src/database/migrations/meta/0029_snapshot.json b/packages/database/migrations/meta/0029_snapshot.json
similarity index 100%
rename from src/database/migrations/meta/0029_snapshot.json
rename to packages/database/migrations/meta/0029_snapshot.json
diff --git a/src/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json
similarity index 100%
rename from src/database/migrations/meta/_journal.json
rename to packages/database/migrations/meta/_journal.json
diff --git a/packages/database/package.json b/packages/database/package.json
new file mode 100644
index 00000000000..74ecb70817a
--- /dev/null
+++ b/packages/database/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@lobechat/database",
+ "version": "1.0.0",
+ "private": true,
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "scripts": {
+ "test": "vitest",
+ "test:coverage": "vitest --coverage"
+ },
+ "dependencies": {
+ "@electric-sql/pglite": "^0.2.17",
+ "@lobechat/const": "workspace:*",
+ "@lobechat/types": "workspace:*",
+ "@lobechat/utils": "workspace:*",
+ "dayjs": "^1.11.13",
+ "drizzle-orm": "^0.44.4",
+ "nanoid": "^5.1.5",
+ "pg": "^8.16.3",
+ "random-words": "^2.0.1",
+ "ts-md5": "^2.0.1",
+ "ws": "^8.18.3"
+ }
+}
diff --git a/src/database/client/db.test.ts b/packages/database/src/client/db.test.ts
similarity index 100%
rename from src/database/client/db.test.ts
rename to packages/database/src/client/db.test.ts
diff --git a/src/database/client/db.ts b/packages/database/src/client/db.ts
similarity index 99%
rename from src/database/client/db.ts
rename to packages/database/src/client/db.ts
index b39de0b68e8..6e04c91f4fd 100644
--- a/src/database/client/db.ts
+++ b/packages/database/src/client/db.ts
@@ -2,7 +2,6 @@ import { sql } from 'drizzle-orm';
import { PgliteDatabase, drizzle } from 'drizzle-orm/pglite';
import { Md5 } from 'ts-md5';
-import { DrizzleMigrationModel } from '@/database/models/drizzleMigration';
import {
ClientDBLoadingProgress,
DatabaseLoadingState,
@@ -11,8 +10,9 @@ import {
} from '@/types/clientDB';
import { sleep } from '@/utils/sleep';
+import migrations from '../core/migrations.json';
+import { DrizzleMigrationModel } from '../models/drizzleMigration';
import * as schema from '../schemas';
-import migrations from './migrations.json';
const pgliteSchemaHashCache = 'LOBE_CHAT_PGLITE_SCHEMA_HASH';
diff --git a/src/database/client/pglite.ts b/packages/database/src/client/pglite.ts
similarity index 100%
rename from src/database/client/pglite.ts
rename to packages/database/src/client/pglite.ts
diff --git a/src/database/client/pglite.worker.ts b/packages/database/src/client/pglite.worker.ts
similarity index 100%
rename from src/database/client/pglite.worker.ts
rename to packages/database/src/client/pglite.worker.ts
diff --git a/src/database/client/type.ts b/packages/database/src/client/type.ts
similarity index 100%
rename from src/database/client/type.ts
rename to packages/database/src/client/type.ts
diff --git a/src/database/core/db-adaptor.ts b/packages/database/src/core/db-adaptor.ts
similarity index 80%
rename from src/database/core/db-adaptor.ts
rename to packages/database/src/core/db-adaptor.ts
index f4453cefe5c..7be62e1ed1a 100644
--- a/src/database/core/db-adaptor.ts
+++ b/packages/database/src/core/db-adaptor.ts
@@ -1,8 +1,8 @@
-import { isDesktop } from '@/const/version';
-import { getDBInstance } from '@/database/core/web-server';
-import { LobeChatDatabase } from '@/database/type';
+import { isDesktop } from '@lobechat/const';
+import { LobeChatDatabase } from '../type';
import { getPgliteInstance } from './electron';
+import { getDBInstance } from './web-server';
/**
* 懒加载数据库实例
diff --git a/src/database/core/dbForTest.ts b/packages/database/src/core/dbForTest.ts
similarity index 95%
rename from src/database/core/dbForTest.ts
rename to packages/database/src/core/dbForTest.ts
index cfb72050ad8..c8a113815e2 100644
--- a/src/database/core/dbForTest.ts
+++ b/packages/database/src/core/dbForTest.ts
@@ -11,7 +11,7 @@ import { serverDBEnv } from '@/config/db';
import * as schema from '../schemas';
-const migrationsFolder = join(__dirname, '../migrations');
+const migrationsFolder = join(__dirname, '../../migrations');
export const getTestDBInstance = async () => {
let connectionString = serverDBEnv.DATABASE_TEST_URL;
diff --git a/src/database/core/electron.ts b/packages/database/src/core/electron.ts
similarity index 98%
rename from src/database/core/electron.ts
rename to packages/database/src/core/electron.ts
index 9524a509b45..7452ee0ee9c 100644
--- a/src/database/core/electron.ts
+++ b/packages/database/src/core/electron.ts
@@ -4,13 +4,13 @@ import { drizzle as pgliteDrizzle } from 'drizzle-orm/pglite';
import fs from 'node:fs';
import { Md5 } from 'ts-md5';
-import { DrizzleMigrationModel } from '@/database/models/drizzleMigration';
-import * as schema from '@/database/schemas';
import { electronIpcClient } from '@/server/modules/ElectronIPCClient';
import { MigrationTableItem } from '@/types/clientDB';
-import migrations from '../client/migrations.json';
+import { DrizzleMigrationModel } from '../models/drizzleMigration';
+import * as schema from '../schemas';
import { LobeChatDatabase } from '../type';
+import migrations from './migrations.json';
// 用于实例管理的全局对象
interface LobeGlobal {
diff --git a/src/database/client/migrations.json b/packages/database/src/core/migrations.json
similarity index 98%
rename from src/database/client/migrations.json
rename to packages/database/src/core/migrations.json
index 9aebca5053e..6aa4c686339 100644
--- a/src/database/client/migrations.json
+++ b/packages/database/src/core/migrations.json
@@ -544,10 +544,20 @@
},
{
"sql": [
- "CREATE TABLE \"oauth_handoffs\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"client\" varchar(50) NOT NULL,\n\t\"payload\" jsonb NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n"
+ "CREATE TABLE IF NOT EXISTS \"oauth_handoffs\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"client\" varchar(50) NOT NULL,\n\t\"payload\" jsonb NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n"
],
"bps": true,
"folderMillis": 1752567402506,
- "hash": "8ba3ae52ed72e8aad1623dbcf47ca26a8406ebffc6d5284abff94ea994b59c04"
+ "hash": "83c410b18ef5c8667b4bdfd7880ef7db4c3278d826e6e87e9d3e05dde67fe8e1"
+ },
+ {
+ "sql": [
+ "CREATE TABLE IF NOT EXISTS \"api_keys\" (\n\t\"id\" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name \"api_keys_id_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),\n\t\"name\" varchar(256) NOT NULL,\n\t\"key\" varchar(256) NOT NULL,\n\t\"enabled\" boolean DEFAULT true,\n\t\"expires_at\" timestamp with time zone,\n\t\"last_used_at\" timestamp with time zone,\n\t\"user_id\" text NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"api_keys_key_unique\" UNIQUE(\"key\")\n);\n",
+ "\nALTER TABLE \"rbac_roles\" ADD COLUMN IF NOT EXISTS \"metadata\" jsonb DEFAULT '{}'::jsonb;",
+ "\nALTER TABLE \"api_keys\" ADD CONSTRAINT \"api_keys_user_id_users_id_fk\" FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\") ON DELETE cascade ON UPDATE no action;\n"
+ ],
+ "bps": true,
+ "folderMillis": 1753201379817,
+ "hash": "fe5c0d7c2768189771c42ef93693fc1d58586b468c4bdde7fb6f2dc58cc9931c"
}
]
diff --git a/src/database/core/web-server.ts b/packages/database/src/core/web-server.ts
similarity index 90%
rename from src/database/core/web-server.ts
rename to packages/database/src/core/web-server.ts
index b9bdd4f1436..47484a7b7c1 100644
--- a/src/database/core/web-server.ts
+++ b/packages/database/src/core/web-server.ts
@@ -5,13 +5,12 @@ import { Pool as NodePool } from 'pg';
import ws from 'ws';
import { serverDBEnv } from '@/config/db';
-import { isServerMode } from '@/const/version';
-import * as schema from '@/database/schemas';
+import * as schema from '../schemas';
import { LobeChatDatabase } from '../type';
export const getDBInstance = (): LobeChatDatabase => {
- if (!isServerMode) return {} as any;
+ if (!(process.env.NEXT_PUBLIC_SERVICE_MODE === 'server')) return {} as any;
if (!serverDBEnv.KEY_VAULTS_SECRET) {
throw new Error(
diff --git a/src/database/models/__tests__/_test_template.ts b/packages/database/src/models/__tests__/_test_template.ts
similarity index 98%
rename from src/database/models/__tests__/_test_template.ts
rename to packages/database/src/models/__tests__/_test_template.ts
index 9797efd3354..5d866e63d42 100644
--- a/src/database/models/__tests__/_test_template.ts
+++ b/packages/database/src/models/__tests__/_test_template.ts
@@ -2,9 +2,8 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-
import { sessionGroups, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { SessionGroupModel } from '../sessionGroup';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/_util.ts b/packages/database/src/models/__tests__/_util.ts
similarity index 54%
rename from src/database/models/__tests__/_util.ts
rename to packages/database/src/models/__tests__/_util.ts
index 1278b74157a..97b10443ddb 100644
--- a/src/database/models/__tests__/_util.ts
+++ b/packages/database/src/models/__tests__/_util.ts
@@ -1,11 +1,11 @@
-import { clientDB, initializeDB } from '@/database/client/db';
-import { LobeChatDatabase } from '@/database/type';
+import { clientDB, initializeDB } from '../../client/db';
+import { LobeChatDatabase } from '../../type';
const isServerDBMode = process.env.TEST_SERVER_DB === '1';
export const getTestDB = async () => {
if (isServerDBMode) {
- const { getTestDBInstance } = await import('@/database/core/dbForTest');
+ const { getTestDBInstance } = await import('../../core/dbForTest');
return await getTestDBInstance();
}
diff --git a/src/database/models/__tests__/agent.test.ts b/packages/database/src/models/__tests__/agent.test.ts
similarity index 99%
rename from src/database/models/__tests__/agent.test.ts
rename to packages/database/src/models/__tests__/agent.test.ts
index 98075673e26..b477bcb02a4 100644
--- a/src/database/models/__tests__/agent.test.ts
+++ b/packages/database/src/models/__tests__/agent.test.ts
@@ -2,8 +2,7 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-
+import { LobeChatDatabase } from '../../type';
import {
agents,
agentsFiles,
diff --git a/src/database/models/__tests__/aiModel.test.ts b/packages/database/src/models/__tests__/aiModel.test.ts
similarity index 99%
rename from src/database/models/__tests__/aiModel.test.ts
rename to packages/database/src/models/__tests__/aiModel.test.ts
index 683b4c189db..ed3cb7053c6 100644
--- a/src/database/models/__tests__/aiModel.test.ts
+++ b/packages/database/src/models/__tests__/aiModel.test.ts
@@ -2,10 +2,10 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
import { AiProviderModelListItem } from '@/types/aiModel';
import { AiModelSelectItem, NewAiModelItem, aiModels, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { AiModelModel } from '../aiModel';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/aiProvider.test.ts b/packages/database/src/models/__tests__/aiProvider.test.ts
similarity index 99%
rename from src/database/models/__tests__/aiProvider.test.ts
rename to packages/database/src/models/__tests__/aiProvider.test.ts
index 38643582528..3770b969fe5 100644
--- a/src/database/models/__tests__/aiProvider.test.ts
+++ b/packages/database/src/models/__tests__/aiProvider.test.ts
@@ -3,10 +3,10 @@ import { ModelProvider } from '@lobechat/model-runtime';
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
import { sleep } from '@/utils/sleep';
import { aiProviders, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { AiProviderModel } from '../aiProvider';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/asyncTask.test.ts b/packages/database/src/models/__tests__/asyncTask.test.ts
similarity index 99%
rename from src/database/models/__tests__/asyncTask.test.ts
rename to packages/database/src/models/__tests__/asyncTask.test.ts
index adbbe812aee..e62ba8b2c1b 100644
--- a/src/database/models/__tests__/asyncTask.test.ts
+++ b/packages/database/src/models/__tests__/asyncTask.test.ts
@@ -2,10 +2,10 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
import { AsyncTaskStatus, AsyncTaskType } from '@/types/asyncTask';
import { asyncTasks, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { ASYNC_TASK_TIMEOUT, AsyncTaskModel } from '../asyncTask';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/chunk.test.ts b/packages/database/src/models/__tests__/chunk.test.ts
similarity index 99%
rename from src/database/models/__tests__/chunk.test.ts
rename to packages/database/src/models/__tests__/chunk.test.ts
index 8201575b96f..e73552617f4 100644
--- a/src/database/models/__tests__/chunk.test.ts
+++ b/packages/database/src/models/__tests__/chunk.test.ts
@@ -2,8 +2,7 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-import { uuid } from '@/utils/uuid';
+import { LobeChatDatabase } from '../../type';import { uuid } from '@/utils/uuid';
import { chunks, embeddings, fileChunks, files, unstructuredChunks, users } from '../../schemas';
import { ChunkModel } from '../chunk';
diff --git a/src/database/models/__tests__/file.test.ts b/packages/database/src/models/__tests__/file.test.ts
similarity index 99%
rename from src/database/models/__tests__/file.test.ts
rename to packages/database/src/models/__tests__/file.test.ts
index ab11a436043..1e9a5c5eba5 100644
--- a/src/database/models/__tests__/file.test.ts
+++ b/packages/database/src/models/__tests__/file.test.ts
@@ -2,10 +2,10 @@
import { eq, inArray } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
import { FilesTabs, SortType } from '@/types/files';
import { files, globalFiles, knowledgeBaseFiles, knowledgeBases, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { FileModel } from '../file';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/fixtures/embedding.ts b/packages/database/src/models/__tests__/fixtures/embedding.ts
similarity index 100%
rename from src/database/models/__tests__/fixtures/embedding.ts
rename to packages/database/src/models/__tests__/fixtures/embedding.ts
diff --git a/src/database/models/__tests__/generation.test.ts b/packages/database/src/models/__tests__/generation.test.ts
similarity index 99%
rename from src/database/models/__tests__/generation.test.ts
rename to packages/database/src/models/__tests__/generation.test.ts
index 64feaee1b25..6c3cf815b10 100644
--- a/src/database/models/__tests__/generation.test.ts
+++ b/packages/database/src/models/__tests__/generation.test.ts
@@ -2,8 +2,7 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-import { AsyncTaskStatus } from '@/types/asyncTask';
+import { LobeChatDatabase } from '../../type';import { AsyncTaskStatus } from '@/types/asyncTask';
import { FileSource } from '@/types/files';
import { ImageGenerationAsset } from '@/types/generation';
diff --git a/src/database/models/__tests__/generationBatch.test.ts b/packages/database/src/models/__tests__/generationBatch.test.ts
similarity index 99%
rename from src/database/models/__tests__/generationBatch.test.ts
rename to packages/database/src/models/__tests__/generationBatch.test.ts
index 19207b9e85e..45b0b39312f 100644
--- a/src/database/models/__tests__/generationBatch.test.ts
+++ b/packages/database/src/models/__tests__/generationBatch.test.ts
@@ -2,8 +2,7 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-import { AsyncTaskStatus } from '@/types/asyncTask';
+import { LobeChatDatabase } from '../../type';import { AsyncTaskStatus } from '@/types/asyncTask';
import { GenerationConfig } from '@/types/generation';
import {
diff --git a/src/database/models/__tests__/generationTopic.test.ts b/packages/database/src/models/__tests__/generationTopic.test.ts
similarity index 99%
rename from src/database/models/__tests__/generationTopic.test.ts
rename to packages/database/src/models/__tests__/generationTopic.test.ts
index ff6b648d88f..b093dca60b5 100644
--- a/src/database/models/__tests__/generationTopic.test.ts
+++ b/packages/database/src/models/__tests__/generationTopic.test.ts
@@ -2,8 +2,7 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-import { FileService } from '@/server/services/file';
+import { LobeChatDatabase } from '../../type';import { FileService } from '@/server/services/file';
import { ImageGenerationTopic } from '@/types/generation';
import { generationBatches, generationTopics, generations, users } from '../../schemas';
diff --git a/src/database/models/__tests__/knowledgeBase.test.ts b/packages/database/src/models/__tests__/knowledgeBase.test.ts
similarity index 98%
rename from src/database/models/__tests__/knowledgeBase.test.ts
rename to packages/database/src/models/__tests__/knowledgeBase.test.ts
index aeca524aea6..b9bf1d3c9d3 100644
--- a/src/database/models/__tests__/knowledgeBase.test.ts
+++ b/packages/database/src/models/__tests__/knowledgeBase.test.ts
@@ -2,8 +2,7 @@
import { and, eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-import { sleep } from '@/utils/sleep';
+import { LobeChatDatabase } from '../../type';import { sleep } from '@/utils/sleep';
import {
NewKnowledgeBase,
diff --git a/src/database/models/__tests__/message.test.ts b/packages/database/src/models/__tests__/message.test.ts
similarity index 99%
rename from src/database/models/__tests__/message.test.ts
rename to packages/database/src/models/__tests__/message.test.ts
index 5f2209cecc6..9dcd55f47e8 100644
--- a/src/database/models/__tests__/message.test.ts
+++ b/packages/database/src/models/__tests__/message.test.ts
@@ -2,11 +2,10 @@ import dayjs from 'dayjs';
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { getTestDB } from '@/database/models/__tests__/_util';
-import { LobeChatDatabase } from '@/database/type';
import { MessageItem } from '@/types/message';
import { uuid } from '@/utils/uuid';
+import { getTestDB } from '../../models/__tests__/_util';
import {
chunks,
embeddings,
@@ -23,6 +22,7 @@ import {
topics,
users,
} from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { MessageModel } from '../message';
import { codeEmbedding } from './fixtures/embedding';
diff --git a/src/database/models/__tests__/plugin.test.ts b/packages/database/src/models/__tests__/plugin.test.ts
similarity index 98%
rename from src/database/models/__tests__/plugin.test.ts
rename to packages/database/src/models/__tests__/plugin.test.ts
index 9cb4cd34bf4..0f5a51eeada 100644
--- a/src/database/models/__tests__/plugin.test.ts
+++ b/packages/database/src/models/__tests__/plugin.test.ts
@@ -1,8 +1,7 @@
// @vitest-environment node
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-
+import { LobeChatDatabase } from '../../type';
import { NewInstalledPlugin, userInstalledPlugins, users } from '../../schemas';
import { PluginModel } from '../plugin';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/session.test.ts b/packages/database/src/models/__tests__/session.test.ts
similarity index 99%
rename from src/database/models/__tests__/session.test.ts
rename to packages/database/src/models/__tests__/session.test.ts
index e059b7fc4e7..036a6b879f5 100644
--- a/src/database/models/__tests__/session.test.ts
+++ b/packages/database/src/models/__tests__/session.test.ts
@@ -2,8 +2,6 @@ import { and, eq, inArray } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { DEFAULT_AGENT_CONFIG } from '@/const/settings';
-import { LobeChatDatabase } from '@/database/type';
-import { idGenerator } from '@/database/utils/idGenerator';
import {
NewSession,
@@ -16,6 +14,8 @@ import {
topics,
users,
} from '../../schemas';
+import { LobeChatDatabase } from '../../type';
+import { idGenerator } from '../../utils/idGenerator';
import { SessionModel } from '../session';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/sessionGroup.test.ts b/packages/database/src/models/__tests__/sessionGroup.test.ts
similarity index 98%
rename from src/database/models/__tests__/sessionGroup.test.ts
rename to packages/database/src/models/__tests__/sessionGroup.test.ts
index 04218bfa22a..08bb2d0b6b3 100644
--- a/src/database/models/__tests__/sessionGroup.test.ts
+++ b/packages/database/src/models/__tests__/sessionGroup.test.ts
@@ -2,9 +2,8 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-
import { sessionGroups, users } from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { SessionGroupModel } from '../sessionGroup';
import { getTestDB } from './_util';
diff --git a/src/database/models/__tests__/topic.test.ts b/packages/database/src/models/__tests__/topic.test.ts
similarity index 99%
rename from src/database/models/__tests__/topic.test.ts
rename to packages/database/src/models/__tests__/topic.test.ts
index 5b418aa108f..47b51ce53b3 100644
--- a/src/database/models/__tests__/topic.test.ts
+++ b/packages/database/src/models/__tests__/topic.test.ts
@@ -1,8 +1,7 @@
import { eq, inArray } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { LobeChatDatabase } from '@/database/type';
-
+import { LobeChatDatabase } from '../../type';
import { messages, sessions, topics, users } from '../../schemas';
import { CreateTopicParams, TopicModel } from '../topic';
import { getTestDB } from './_util';
diff --git a/src/database/models/_template.ts b/packages/database/src/models/_template.ts
similarity index 96%
rename from src/database/models/_template.ts
rename to packages/database/src/models/_template.ts
index 236fcd74cc3..133c92e36ff 100644
--- a/src/database/models/_template.ts
+++ b/packages/database/src/models/_template.ts
@@ -1,8 +1,7 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
-
import { NewSessionGroup, SessionGroupItem, sessionGroups } from '../schemas';
+import { LobeChatDatabase } from '../type';
export class TemplateModel {
private userId: string;
diff --git a/src/database/models/agent.ts b/packages/database/src/models/agent.ts
similarity index 98%
rename from src/database/models/agent.ts
rename to packages/database/src/models/agent.ts
index 6395c20cddb..1b670bda39a 100644
--- a/src/database/models/agent.ts
+++ b/packages/database/src/models/agent.ts
@@ -7,8 +7,8 @@ import {
agentsToSessions,
files,
knowledgeBases,
-} from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
+} from '../schemas';
+import { LobeChatDatabase } from '../type';
export class AgentModel {
private userId: string;
diff --git a/src/database/models/aiModel.ts b/packages/database/src/models/aiModel.ts
similarity index 99%
rename from src/database/models/aiModel.ts
rename to packages/database/src/models/aiModel.ts
index 8c056780f4d..0d0ef00f9cf 100644
--- a/src/database/models/aiModel.ts
+++ b/packages/database/src/models/aiModel.ts
@@ -1,6 +1,6 @@
import { and, asc, desc, eq, inArray } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
AiModelSortMap,
AiModelSourceEnum,
diff --git a/src/database/models/aiProvider.ts b/packages/database/src/models/aiProvider.ts
similarity index 99%
rename from src/database/models/aiProvider.ts
rename to packages/database/src/models/aiProvider.ts
index 955c9153ff5..956239b33e4 100644
--- a/src/database/models/aiProvider.ts
+++ b/packages/database/src/models/aiProvider.ts
@@ -3,7 +3,7 @@ import { and, asc, desc, eq } from 'drizzle-orm';
import { isEmpty } from 'lodash-es';
import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
AiProviderDetailItem,
AiProviderListItem,
diff --git a/src/database/models/apiKey.ts b/packages/database/src/models/apiKey.ts
similarity index 98%
rename from src/database/models/apiKey.ts
rename to packages/database/src/models/apiKey.ts
index 9e81c42cd45..95d54e79988 100644
--- a/src/database/models/apiKey.ts
+++ b/packages/database/src/models/apiKey.ts
@@ -1,6 +1,6 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { generateApiKey, isApiKeyExpired, validateApiKeyFormat } from '@/utils/apiKey';
import { ApiKeyItem, NewApiKeyItem, apiKeys } from '../schemas';
diff --git a/src/database/models/asyncTask.ts b/packages/database/src/models/asyncTask.ts
similarity index 98%
rename from src/database/models/asyncTask.ts
rename to packages/database/src/models/asyncTask.ts
index 7b0f097a353..d8b411b11e4 100644
--- a/src/database/models/asyncTask.ts
+++ b/packages/database/src/models/asyncTask.ts
@@ -1,6 +1,6 @@
import { and, eq, inArray, lt } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
AsyncTaskError,
AsyncTaskErrorType,
diff --git a/src/database/models/chunk.ts b/packages/database/src/models/chunk.ts
similarity index 99%
rename from src/database/models/chunk.ts
rename to packages/database/src/models/chunk.ts
index 6b8ff77dc37..e5bd233b9cc 100644
--- a/src/database/models/chunk.ts
+++ b/packages/database/src/models/chunk.ts
@@ -1,7 +1,7 @@
import { and, asc, cosineDistance, count, desc, eq, inArray, isNull, sql } from 'drizzle-orm';
import { chunk } from 'lodash-es';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { ChunkMetadata, FileChunk } from '@/types/chunk';
import {
diff --git a/src/database/models/document.ts b/packages/database/src/models/document.ts
similarity index 96%
rename from src/database/models/document.ts
rename to packages/database/src/models/document.ts
index feeec8be43e..eac7baba6f8 100644
--- a/src/database/models/document.ts
+++ b/packages/database/src/models/document.ts
@@ -1,6 +1,6 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { DocumentItem, NewDocument, documents } from '../schemas';
diff --git a/src/database/models/drizzleMigration.ts b/packages/database/src/models/drizzleMigration.ts
similarity index 94%
rename from src/database/models/drizzleMigration.ts
rename to packages/database/src/models/drizzleMigration.ts
index dd536cebe15..edb42603135 100644
--- a/src/database/models/drizzleMigration.ts
+++ b/packages/database/src/models/drizzleMigration.ts
@@ -1,6 +1,6 @@
import { sql } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { MigrationTableItem } from '@/types/clientDB';
export class DrizzleMigrationModel {
diff --git a/src/database/models/embedding.ts b/packages/database/src/models/embedding.ts
similarity index 96%
rename from src/database/models/embedding.ts
rename to packages/database/src/models/embedding.ts
index 7ed0b87e304..061a94f8602 100644
--- a/src/database/models/embedding.ts
+++ b/packages/database/src/models/embedding.ts
@@ -1,6 +1,6 @@
import { and, count, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { NewEmbeddingsItem, embeddings } from '../schemas';
diff --git a/src/database/models/file.ts b/packages/database/src/models/file.ts
similarity index 99%
rename from src/database/models/file.ts
rename to packages/database/src/models/file.ts
index 9ba87dab856..7463db53aa2 100644
--- a/src/database/models/file.ts
+++ b/packages/database/src/models/file.ts
@@ -1,7 +1,7 @@
import { and, asc, count, desc, eq, ilike, inArray, like, notExists, or, sum } from 'drizzle-orm';
import type { PgTransaction } from 'drizzle-orm/pg-core';
-import { LobeChatDatabase, Transaction } from '@/database/type';
+import { LobeChatDatabase, Transaction } from '../type';
import { FilesTabs, QueryFileListParams, SortType } from '@/types/files';
import {
diff --git a/src/database/models/generation.ts b/packages/database/src/models/generation.ts
similarity index 98%
rename from src/database/models/generation.ts
rename to packages/database/src/models/generation.ts
index 2a07586cbd9..d5cf316d23f 100644
--- a/src/database/models/generation.ts
+++ b/packages/database/src/models/generation.ts
@@ -1,7 +1,7 @@
import debug from 'debug';
import { and, eq } from 'drizzle-orm';
-import { LobeChatDatabase, Transaction } from '@/database/type';
+import { LobeChatDatabase, Transaction } from '../type';
import { FileService } from '@/server/services/file';
import { AsyncTaskError, AsyncTaskStatus } from '@/types/asyncTask';
import { FileSource } from '@/types/files';
diff --git a/src/database/models/generationBatch.ts b/packages/database/src/models/generationBatch.ts
similarity index 99%
rename from src/database/models/generationBatch.ts
rename to packages/database/src/models/generationBatch.ts
index 79c54780590..68afad68314 100644
--- a/src/database/models/generationBatch.ts
+++ b/packages/database/src/models/generationBatch.ts
@@ -1,7 +1,7 @@
import debug from 'debug';
import { and, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { FileService } from '@/server/services/file';
import { Generation, GenerationAsset, GenerationBatch, GenerationConfig } from '@/types/generation';
diff --git a/src/database/models/generationTopic.ts b/packages/database/src/models/generationTopic.ts
similarity index 98%
rename from src/database/models/generationTopic.ts
rename to packages/database/src/models/generationTopic.ts
index a21f9ce0ef0..4bd93f5a334 100644
--- a/src/database/models/generationTopic.ts
+++ b/packages/database/src/models/generationTopic.ts
@@ -1,6 +1,6 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { FileService } from '@/server/services/file';
import { GenerationAsset, ImageGenerationTopic } from '@/types/generation';
diff --git a/src/database/models/knowledgeBase.ts b/packages/database/src/models/knowledgeBase.ts
similarity index 98%
rename from src/database/models/knowledgeBase.ts
rename to packages/database/src/models/knowledgeBase.ts
index 3c3e890a017..b079d8dea29 100644
--- a/src/database/models/knowledgeBase.ts
+++ b/packages/database/src/models/knowledgeBase.ts
@@ -1,6 +1,6 @@
import { and, desc, eq, inArray } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { KnowledgeBaseItem } from '@/types/knowledgeBase';
import { NewKnowledgeBase, knowledgeBaseFiles, knowledgeBases } from '../schemas';
diff --git a/src/database/models/message.ts b/packages/database/src/models/message.ts
similarity index 99%
rename from src/database/models/message.ts
rename to packages/database/src/models/message.ts
index 497c70722cb..1dad3ae8893 100644
--- a/src/database/models/message.ts
+++ b/packages/database/src/models/message.ts
@@ -2,14 +2,14 @@ import type { HeatmapsProps } from '@lobehub/charts';
import dayjs from 'dayjs';
import { and, asc, count, desc, eq, gt, inArray, isNotNull, isNull, like, sql } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
genEndDateWhere,
genRangeWhere,
genStartDateWhere,
genWhere,
-} from '@/database/utils/genWhere';
-import { idGenerator } from '@/database/utils/idGenerator';
+} from '../utils/genWhere';
+import { idGenerator } from '../utils/idGenerator';
import {
ChatFileItem,
ChatImageItem,
diff --git a/src/database/models/oauthHandoff.ts b/packages/database/src/models/oauthHandoff.ts
similarity index 98%
rename from src/database/models/oauthHandoff.ts
rename to packages/database/src/models/oauthHandoff.ts
index fd14b38915f..ad80f3e02cc 100644
--- a/src/database/models/oauthHandoff.ts
+++ b/packages/database/src/models/oauthHandoff.ts
@@ -1,6 +1,6 @@
import { and, eq, lt, sql } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { NewOAuthHandoff, OAuthHandoffItem, oauthHandoffs } from '../schemas';
diff --git a/src/database/models/plugin.ts b/packages/database/src/models/plugin.ts
similarity index 97%
rename from src/database/models/plugin.ts
rename to packages/database/src/models/plugin.ts
index 0416b7adcac..0f46156e736 100644
--- a/src/database/models/plugin.ts
+++ b/packages/database/src/models/plugin.ts
@@ -1,6 +1,6 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { LobeTool } from '@/types/tool';
import { InstalledPluginItem, NewInstalledPlugin, userInstalledPlugins } from '../schemas';
diff --git a/src/database/models/session.ts b/packages/database/src/models/session.ts
similarity index 98%
rename from src/database/models/session.ts
rename to packages/database/src/models/session.ts
index 8eada8236fb..c73ad0dc453 100644
--- a/src/database/models/session.ts
+++ b/packages/database/src/models/session.ts
@@ -18,14 +18,14 @@ import type { PartialDeep } from 'type-fest';
import { DEFAULT_INBOX_AVATAR } from '@/const/meta';
import { INBOX_SESSION_ID } from '@/const/session';
import { DEFAULT_AGENT_CONFIG } from '@/const/settings';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
genEndDateWhere,
genRangeWhere,
genStartDateWhere,
genWhere,
-} from '@/database/utils/genWhere';
-import { idGenerator } from '@/database/utils/idGenerator';
+} from '../utils/genWhere';
+import { idGenerator } from '../utils/idGenerator';
import { LobeAgentConfig } from '@/types/agent';
import { ChatSessionList, LobeAgentSession, SessionRankItem } from '@/types/session';
import { merge } from '@/utils/merge';
diff --git a/src/database/models/sessionGroup.ts b/packages/database/src/models/sessionGroup.ts
similarity index 94%
rename from src/database/models/sessionGroup.ts
rename to packages/database/src/models/sessionGroup.ts
index 1276afc4ec1..1b0a8206563 100644
--- a/src/database/models/sessionGroup.ts
+++ b/packages/database/src/models/sessionGroup.ts
@@ -1,7 +1,7 @@
import { and, asc, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
-import { idGenerator } from '@/database/utils/idGenerator';
+import { LobeChatDatabase } from '../type';
+import { idGenerator } from '../utils/idGenerator';
import { SessionGroupItem, sessionGroups } from '../schemas';
diff --git a/src/database/models/thread.ts b/packages/database/src/models/thread.ts
similarity index 97%
rename from src/database/models/thread.ts
rename to packages/database/src/models/thread.ts
index 39f79736454..d47be980001 100644
--- a/src/database/models/thread.ts
+++ b/packages/database/src/models/thread.ts
@@ -1,6 +1,6 @@
import { and, desc, eq } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { CreateThreadParams, ThreadStatus } from '@/types/topic';
import { ThreadItem, threads } from '../schemas';
diff --git a/src/database/models/topic.ts b/packages/database/src/models/topic.ts
similarity index 98%
rename from src/database/models/topic.ts
rename to packages/database/src/models/topic.ts
index 6a784e9ed59..3f59eba6a9d 100644
--- a/src/database/models/topic.ts
+++ b/packages/database/src/models/topic.ts
@@ -1,13 +1,13 @@
import { and, count, desc, eq, gt, ilike, inArray, isNull, sql } from 'drizzle-orm';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import {
genEndDateWhere,
genRangeWhere,
genStartDateWhere,
genWhere,
-} from '@/database/utils/genWhere';
-import { idGenerator } from '@/database/utils/idGenerator';
+} from '../utils/genWhere';
+import { idGenerator } from '../utils/idGenerator';
import { MessageItem } from '@/types/message';
import { TopicRankItem } from '@/types/topic';
diff --git a/src/database/models/user.ts b/packages/database/src/models/user.ts
similarity index 99%
rename from src/database/models/user.ts
rename to packages/database/src/models/user.ts
index 16bbcbd115e..cd96314c6c1 100644
--- a/src/database/models/user.ts
+++ b/packages/database/src/models/user.ts
@@ -4,7 +4,7 @@ import { eq } from 'drizzle-orm';
import type { AdapterAccount } from 'next-auth/adapters';
import type { PartialDeep } from 'type-fest';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../type';
import { UserGuide, UserPreference } from '@/types/user';
import { UserKeyVaults, UserSettings } from '@/types/user/settings';
import { merge } from '@/utils/merge';
diff --git a/src/database/repositories/aiInfra/index.test.ts b/packages/database/src/repositories/aiInfra/index.test.ts
similarity index 100%
rename from src/database/repositories/aiInfra/index.test.ts
rename to packages/database/src/repositories/aiInfra/index.test.ts
diff --git a/src/database/repositories/aiInfra/index.ts b/packages/database/src/repositories/aiInfra/index.ts
similarity index 97%
rename from src/database/repositories/aiInfra/index.ts
rename to packages/database/src/repositories/aiInfra/index.ts
index 956ae51117f..2ac7d9faa34 100644
--- a/src/database/repositories/aiInfra/index.ts
+++ b/packages/database/src/repositories/aiInfra/index.ts
@@ -2,9 +2,6 @@ import { isEmpty } from 'lodash-es';
import pMap from 'p-map';
import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders';
-import { AiModelModel } from '@/database/models/aiModel';
-import { AiProviderModel } from '@/database/models/aiProvider';
-import { LobeChatDatabase } from '@/database/type';
import {
AIChatModelCard,
AiModelSourceEnum,
@@ -20,6 +17,10 @@ import {
import { ProviderConfig } from '@/types/user/settings';
import { merge, mergeArrayById } from '@/utils/merge';
+import { AiModelModel } from '../../models/aiModel';
+import { AiProviderModel } from '../../models/aiProvider';
+import { LobeChatDatabase } from '../../type';
+
type DecryptUserKeyVaults = (encryptKeyVaultsStr: string | null) => Promise;
export class AiInfraRepos {
diff --git a/src/database/repositories/dataExporter/index.test.ts b/packages/database/src/repositories/dataExporter/index.test.ts
similarity index 100%
rename from src/database/repositories/dataExporter/index.test.ts
rename to packages/database/src/repositories/dataExporter/index.test.ts
diff --git a/src/database/repositories/dataExporter/index.ts b/packages/database/src/repositories/dataExporter/index.ts
similarity index 98%
rename from src/database/repositories/dataExporter/index.ts
rename to packages/database/src/repositories/dataExporter/index.ts
index 7346d620839..657e35e802c 100644
--- a/src/database/repositories/dataExporter/index.ts
+++ b/packages/database/src/repositories/dataExporter/index.ts
@@ -1,8 +1,8 @@
import { and, eq, inArray } from 'drizzle-orm';
import pMap from 'p-map';
-import * as EXPORT_TABLES from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
+import * as EXPORT_TABLES from '../../schemas';
+import { LobeChatDatabase } from '../../type';
interface BaseTableConfig {
table: keyof typeof EXPORT_TABLES;
diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/agents.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/agents.json
similarity index 100%
rename from src/database/repositories/dataImporter/__tests__/fixtures/agents.json
rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/agents.json
diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json
similarity index 100%
rename from src/database/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json
rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json
diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/topic.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/topic.json
similarity index 100%
rename from src/database/repositories/dataImporter/__tests__/fixtures/topic.json
rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/topic.json
diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/userSettings.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/userSettings.json
similarity index 100%
rename from src/database/repositories/dataImporter/__tests__/fixtures/userSettings.json
rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/userSettings.json
diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/with-client-id.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/with-client-id.json
similarity index 100%
rename from src/database/repositories/dataImporter/__tests__/fixtures/with-client-id.json
rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/with-client-id.json
diff --git a/src/database/repositories/dataImporter/__tests__/index.test.ts b/packages/database/src/repositories/dataImporter/__tests__/index.test.ts
similarity index 98%
rename from src/database/repositories/dataImporter/__tests__/index.test.ts
rename to packages/database/src/repositories/dataImporter/__tests__/index.test.ts
index 29db248079d..82a53f905ee 100644
--- a/src/database/repositories/dataImporter/__tests__/index.test.ts
+++ b/packages/database/src/repositories/dataImporter/__tests__/index.test.ts
@@ -1,10 +1,10 @@
import { eq, inArray } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { getTestDB } from '@/database/models/__tests__/_util';
-import * as Schema from '@/database/schemas';
import { ImportPgDataStructure } from '@/types/export';
+import { getTestDB } from '../../../models/__tests__/_util';
+import * as Schema from '../../../schemas';
import { DataImporterRepos } from '../index';
import agentsData from './fixtures/agents.json';
import agentsToSessionsData from './fixtures/agentsToSessions.json';
diff --git a/src/database/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json b/packages/database/src/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json
similarity index 100%
rename from src/database/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json
rename to packages/database/src/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json
diff --git a/src/database/repositories/dataImporter/deprecated/__tests__/index.test.ts b/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts
similarity index 100%
rename from src/database/repositories/dataImporter/deprecated/__tests__/index.test.ts
rename to packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts
diff --git a/src/database/repositories/dataImporter/deprecated/index.ts b/packages/database/src/repositories/dataImporter/deprecated/index.ts
similarity index 99%
rename from src/database/repositories/dataImporter/deprecated/index.ts
rename to packages/database/src/repositories/dataImporter/deprecated/index.ts
index d3ca5aab7f6..50a7c9a183f 100644
--- a/src/database/repositories/dataImporter/deprecated/index.ts
+++ b/packages/database/src/repositories/dataImporter/deprecated/index.ts
@@ -1,5 +1,9 @@
import { and, eq, inArray, sql } from 'drizzle-orm';
+import { ImportResult } from '@/services/import/_deprecated';
+import { ImporterEntryData } from '@/types/importer';
+import { sanitizeUTF8 } from '@/utils/sanitizeUTF8';
+
import {
agents,
agentsToSessions,
@@ -9,11 +13,8 @@ import {
sessionGroups,
sessions,
topics,
-} from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
-import { ImportResult } from '@/services/import/_deprecated';
-import { ImporterEntryData } from '@/types/importer';
-import { sanitizeUTF8 } from '@/utils/sanitizeUTF8';
+} from '../../../schemas';
+import { LobeChatDatabase } from '../../../type';
export class DeprecatedDataImporterRepos {
private userId: string;
diff --git a/src/database/repositories/dataImporter/index.ts b/packages/database/src/repositories/dataImporter/index.ts
similarity index 99%
rename from src/database/repositories/dataImporter/index.ts
rename to packages/database/src/repositories/dataImporter/index.ts
index b33d56b5181..5a2eb66b8bf 100644
--- a/src/database/repositories/dataImporter/index.ts
+++ b/packages/database/src/repositories/dataImporter/index.ts
@@ -1,11 +1,11 @@
import { and, eq, inArray } from 'drizzle-orm';
-import * as EXPORT_TABLES from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
import { ImportPgDataStructure } from '@/types/export';
import { ImportResultData, ImporterEntryData } from '@/types/importer';
import { uuid } from '@/utils/uuid';
+import * as EXPORT_TABLES from '../../schemas';
+import { LobeChatDatabase } from '../../type';
import { DeprecatedDataImporterRepos } from './deprecated';
interface ImportResult {
diff --git a/src/database/repositories/tableViewer/index.test.ts b/packages/database/src/repositories/tableViewer/index.test.ts
similarity index 99%
rename from src/database/repositories/tableViewer/index.test.ts
rename to packages/database/src/repositories/tableViewer/index.test.ts
index 92f57a9bfdf..18cc6f85a0f 100644
--- a/src/database/repositories/tableViewer/index.test.ts
+++ b/packages/database/src/repositories/tableViewer/index.test.ts
@@ -23,7 +23,7 @@ describe('TableViewerRepo', () => {
it('should return all tables with counts', async () => {
const result = await repo.getAllTables();
- expect(result.length).toEqual(59);
+ expect(result.length).toEqual(60);
expect(result[0]).toEqual({ name: 'agents', count: 0, type: 'BASE TABLE' });
});
diff --git a/src/database/repositories/tableViewer/index.ts b/packages/database/src/repositories/tableViewer/index.ts
similarity index 99%
rename from src/database/repositories/tableViewer/index.ts
rename to packages/database/src/repositories/tableViewer/index.ts
index 2ec0e7a8675..1730d3ef4db 100644
--- a/src/database/repositories/tableViewer/index.ts
+++ b/packages/database/src/repositories/tableViewer/index.ts
@@ -1,7 +1,6 @@
import { sql } from 'drizzle-orm';
import pMap from 'p-map';
-import { LobeChatDatabase } from '@/database/type';
import {
FilterCondition,
PaginationParams,
@@ -9,6 +8,8 @@ import {
TableColumnInfo,
} from '@/types/tableViewer';
+import { LobeChatDatabase } from '../../type';
+
export class TableViewerRepo {
private userId: string;
private db: LobeChatDatabase;
diff --git a/src/database/schemas/_helpers.ts b/packages/database/src/schemas/_helpers.ts
similarity index 100%
rename from src/database/schemas/_helpers.ts
rename to packages/database/src/schemas/_helpers.ts
diff --git a/src/database/schemas/agent.ts b/packages/database/src/schemas/agent.ts
similarity index 97%
rename from src/database/schemas/agent.ts
rename to packages/database/src/schemas/agent.ts
index ef10dba4a6d..a39b39b4950 100644
--- a/src/database/schemas/agent.ts
+++ b/packages/database/src/schemas/agent.ts
@@ -10,9 +10,9 @@ import {
} from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { idGenerator, randomSlug } from '@/database/utils/idGenerator';
import { LobeAgentChatConfig, LobeAgentTTSConfig } from '@/types/agent';
+import { idGenerator, randomSlug } from '../utils/idGenerator';
import { timestamps } from './_helpers';
import { files, knowledgeBases } from './file';
import { users } from './user';
diff --git a/src/database/schemas/aiInfra.ts b/packages/database/src/schemas/aiInfra.ts
similarity index 95%
rename from src/database/schemas/aiInfra.ts
rename to packages/database/src/schemas/aiInfra.ts
index 69cab121525..5a5ace88f62 100644
--- a/src/database/schemas/aiInfra.ts
+++ b/packages/database/src/schemas/aiInfra.ts
@@ -1,10 +1,11 @@
/* eslint-disable sort-keys-fix/sort-keys-fix */
import { boolean, integer, jsonb, pgTable, primaryKey, text, varchar } from 'drizzle-orm/pg-core';
-import { timestamps } from '@/database/schemas/_helpers';
-import { users } from '@/database/schemas/user';
import { AiProviderConfig, AiProviderSettings } from '@/types/aiProvider';
+import { timestamps } from './_helpers';
+import { users } from './user';
+
export const aiProviders = pgTable(
'ai_providers',
{
diff --git a/src/database/schemas/apiKey.ts b/packages/database/src/schemas/apiKey.ts
similarity index 100%
rename from src/database/schemas/apiKey.ts
rename to packages/database/src/schemas/apiKey.ts
diff --git a/src/database/schemas/asyncTask.ts b/packages/database/src/schemas/asyncTask.ts
similarity index 100%
rename from src/database/schemas/asyncTask.ts
rename to packages/database/src/schemas/asyncTask.ts
diff --git a/src/database/schemas/document.ts b/packages/database/src/schemas/document.ts
similarity index 96%
rename from src/database/schemas/document.ts
rename to packages/database/src/schemas/document.ts
index 8ddb3128dcd..ca994ea81e4 100644
--- a/src/database/schemas/document.ts
+++ b/packages/database/src/schemas/document.ts
@@ -12,12 +12,12 @@ import {
} from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { chunks } from '@/database/schemas/rag';
-import { idGenerator } from '@/database/utils/idGenerator';
import { LobeDocumentPage } from '@/types/document';
+import { idGenerator } from '../utils/idGenerator';
import { createdAt, timestamps } from './_helpers';
import { files } from './file';
+import { chunks } from './rag';
import { users } from './user';
/**
diff --git a/src/database/schemas/file.ts b/packages/database/src/schemas/file.ts
similarity index 98%
rename from src/database/schemas/file.ts
rename to packages/database/src/schemas/file.ts
index 083fe854d4b..c68799a160f 100644
--- a/src/database/schemas/file.ts
+++ b/packages/database/src/schemas/file.ts
@@ -13,9 +13,9 @@ import {
} from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { idGenerator } from '@/database/utils/idGenerator';
import { FileSource } from '@/types/files';
+import { idGenerator } from '../utils/idGenerator';
import { accessedAt, createdAt, timestamps } from './_helpers';
import { asyncTasks } from './asyncTask';
import { users } from './user';
diff --git a/src/database/schemas/generation.ts b/packages/database/src/schemas/generation.ts
similarity index 98%
rename from src/database/schemas/generation.ts
rename to packages/database/src/schemas/generation.ts
index 9ceecab8322..918e42e9fd5 100644
--- a/src/database/schemas/generation.ts
+++ b/packages/database/src/schemas/generation.ts
@@ -2,9 +2,9 @@
import { integer, jsonb, pgTable, text, uuid, varchar } from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { idGenerator } from '@/database/utils/idGenerator';
import { ImageGenerationAsset } from '@/types/generation';
+import { idGenerator } from '../utils/idGenerator';
import { timestamps } from './_helpers';
import { AsyncTaskSelectItem, asyncTasks } from './asyncTask';
import { files } from './file';
diff --git a/src/database/schemas/index.ts b/packages/database/src/schemas/index.ts
similarity index 100%
rename from src/database/schemas/index.ts
rename to packages/database/src/schemas/index.ts
diff --git a/src/database/schemas/message.ts b/packages/database/src/schemas/message.ts
similarity index 99%
rename from src/database/schemas/message.ts
rename to packages/database/src/schemas/message.ts
index 0efe5493f0f..2afe92ef1b0 100644
--- a/src/database/schemas/message.ts
+++ b/packages/database/src/schemas/message.ts
@@ -12,10 +12,10 @@ import {
} from 'drizzle-orm/pg-core';
import { createSelectSchema } from 'drizzle-zod';
-import { idGenerator } from '@/database/utils/idGenerator';
import { ModelReasoning } from '@/types/message';
import { GroundingSearch } from '@/types/search';
+import { idGenerator } from '../utils/idGenerator';
import { timestamps } from './_helpers';
import { agents } from './agent';
import { files } from './file';
diff --git a/src/database/schemas/nextauth.ts b/packages/database/src/schemas/nextauth.ts
similarity index 100%
rename from src/database/schemas/nextauth.ts
rename to packages/database/src/schemas/nextauth.ts
diff --git a/src/database/schemas/oidc.ts b/packages/database/src/schemas/oidc.ts
similarity index 100%
rename from src/database/schemas/oidc.ts
rename to packages/database/src/schemas/oidc.ts
diff --git a/src/database/schemas/rag.ts b/packages/database/src/schemas/rag.ts
similarity index 100%
rename from src/database/schemas/rag.ts
rename to packages/database/src/schemas/rag.ts
diff --git a/src/database/schemas/ragEvals.ts b/packages/database/src/schemas/ragEvals.ts
similarity index 98%
rename from src/database/schemas/ragEvals.ts
rename to packages/database/src/schemas/ragEvals.ts
index fa04353a8c2..fc334bee1fa 100644
--- a/src/database/schemas/ragEvals.ts
+++ b/packages/database/src/schemas/ragEvals.ts
@@ -1,8 +1,8 @@
/* eslint-disable sort-keys-fix/sort-keys-fix */
+import { EvalEvaluationStatus } from '@lobechat/types';
import { integer, jsonb, pgTable, text, uuid } from 'drizzle-orm/pg-core';
import { DEFAULT_MODEL } from '@/const/settings';
-import { EvalEvaluationStatus } from '@/types/eval';
import { timestamps } from './_helpers';
import { knowledgeBases } from './file';
diff --git a/src/database/schemas/rbac.ts b/packages/database/src/schemas/rbac.ts
similarity index 100%
rename from src/database/schemas/rbac.ts
rename to packages/database/src/schemas/rbac.ts
diff --git a/src/database/schemas/relations.ts b/packages/database/src/schemas/relations.ts
similarity index 99%
rename from src/database/schemas/relations.ts
rename to packages/database/src/schemas/relations.ts
index 20120cc7a5d..47109eae495 100644
--- a/src/database/schemas/relations.ts
+++ b/packages/database/src/schemas/relations.ts
@@ -2,8 +2,7 @@
import { relations } from 'drizzle-orm';
import { pgTable, primaryKey, text, uuid, varchar } from 'drizzle-orm/pg-core';
-import { createdAt } from '@/database/schemas/_helpers';
-
+import { createdAt } from './_helpers';
import { agents, agentsFiles, agentsKnowledgeBases } from './agent';
import { asyncTasks } from './asyncTask';
import { documentChunks, documents } from './document';
diff --git a/src/database/schemas/session.ts b/packages/database/src/schemas/session.ts
similarity index 96%
rename from src/database/schemas/session.ts
rename to packages/database/src/schemas/session.ts
index 076d8a2960f..62abe145970 100644
--- a/src/database/schemas/session.ts
+++ b/packages/database/src/schemas/session.ts
@@ -2,8 +2,7 @@
import { boolean, integer, pgTable, text, uniqueIndex, varchar } from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { idGenerator, randomSlug } from '@/database/utils/idGenerator';
-
+import { idGenerator, randomSlug } from '../utils/idGenerator';
import { timestamps } from './_helpers';
import { users } from './user';
diff --git a/src/database/schemas/topic.ts b/packages/database/src/schemas/topic.ts
similarity index 96%
rename from src/database/schemas/topic.ts
rename to packages/database/src/schemas/topic.ts
index 0bed37fbed8..bf58d22d267 100644
--- a/src/database/schemas/topic.ts
+++ b/packages/database/src/schemas/topic.ts
@@ -2,11 +2,11 @@
import { boolean, jsonb, pgTable, primaryKey, text, uniqueIndex } from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';
-import { documents } from '@/database/schemas/document';
-import { idGenerator } from '@/database/utils/idGenerator';
import { ChatTopicMetadata } from '@/types/topic';
+import { idGenerator } from '../utils/idGenerator';
import { createdAt, timestamps, timestamptz } from './_helpers';
+import { documents } from './document';
import { sessions } from './session';
import { users } from './user';
diff --git a/src/database/schemas/user.ts b/packages/database/src/schemas/user.ts
similarity index 100%
rename from src/database/schemas/user.ts
rename to packages/database/src/schemas/user.ts
diff --git a/src/database/server/index.ts b/packages/database/src/server/index.ts
similarity index 100%
rename from src/database/server/index.ts
rename to packages/database/src/server/index.ts
diff --git a/src/database/server/models/__tests__/adapter.test.ts b/packages/database/src/server/models/__tests__/adapter.test.ts
similarity index 99%
rename from src/database/server/models/__tests__/adapter.test.ts
rename to packages/database/src/server/models/__tests__/adapter.test.ts
index 48016db0ae9..9851cca64c6 100644
--- a/src/database/server/models/__tests__/adapter.test.ts
+++ b/packages/database/src/server/models/__tests__/adapter.test.ts
@@ -1,8 +1,10 @@
import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import { getTestDBInstance } from '@/database/core/dbForTest';
-import { users } from '@/database/schemas';
+import { DrizzleAdapter } from '@/libs/oidc-provider/adapter';
+
+import { getTestDBInstance } from '../../../core/dbForTest';
+import { users } from '../../../schemas';
import {
oidcAccessTokens,
oidcClients,
@@ -10,8 +12,7 @@ import {
oidcInteractions,
oidcRefreshTokens,
oidcSessions,
-} from '@/database/schemas/oidc';
-import { DrizzleAdapter } from '@/libs/oidc-provider/adapter';
+} from '../../../schemas/oidc';
let serverDB = await getTestDBInstance();
diff --git a/src/database/server/models/__tests__/nextauth.test.ts b/packages/database/src/server/models/__tests__/nextauth.test.ts
similarity index 99%
rename from src/database/server/models/__tests__/nextauth.test.ts
rename to packages/database/src/server/models/__tests__/nextauth.test.ts
index 6a97ce83f88..caff53501f2 100644
--- a/src/database/server/models/__tests__/nextauth.test.ts
+++ b/packages/database/src/server/models/__tests__/nextauth.test.ts
@@ -8,16 +8,16 @@ import type {
import { eq } from 'drizzle-orm';
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
-import { getTestDBInstance } from '@/database/core/dbForTest';
+import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter';
+
+import { getTestDBInstance } from '../../../core/dbForTest';
import {
nextauthAccounts,
nextauthAuthenticators,
nextauthSessions,
nextauthVerificationTokens,
users,
-} from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
-import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter';
+} from '../../../schemas';
let serverDB = await getTestDBInstance();
diff --git a/src/database/server/models/__tests__/user.test.ts b/packages/database/src/server/models/__tests__/user.test.ts
similarity index 99%
rename from src/database/server/models/__tests__/user.test.ts
rename to packages/database/src/server/models/__tests__/user.test.ts
index 8bcf6f92f19..74483a6b48e 100644
--- a/src/database/server/models/__tests__/user.test.ts
+++ b/packages/database/src/server/models/__tests__/user.test.ts
@@ -4,11 +4,10 @@ import { eq } from 'drizzle-orm';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { INBOX_SESSION_ID } from '@/const/session';
-import { getTestDBInstance } from '@/database/core/dbForTest';
-import { LobeChatDatabase } from '@/database/type';
import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
import { UserGuide, UserPreference } from '@/types/user';
+import { getTestDBInstance } from '../../../core/dbForTest';
import { SessionModel } from '../../../models/session';
import { UserModel, UserNotFoundError } from '../../../models/user';
import { UserSettingsItem, userSettings, users } from '../../../schemas';
diff --git a/src/database/server/models/ragEval/dataset.ts b/packages/database/src/server/models/ragEval/dataset.ts
similarity index 90%
rename from src/database/server/models/ragEval/dataset.ts
rename to packages/database/src/server/models/ragEval/dataset.ts
index bd1b2f3e771..e1ca5af30e4 100644
--- a/src/database/server/models/ragEval/dataset.ts
+++ b/packages/database/src/server/models/ragEval/dataset.ts
@@ -1,8 +1,8 @@
+import { RAGEvalDataSetItem } from '@lobechat/types';
import { and, desc, eq } from 'drizzle-orm';
-import { NewEvalDatasetsItem, evalDatasets } from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
-import { RAGEvalDataSetItem } from '@/types/eval';
+import { NewEvalDatasetsItem, evalDatasets } from '../../../schemas';
+import { LobeChatDatabase } from '../../../type';
export class EvalDatasetModel {
private userId: string;
diff --git a/src/database/server/models/ragEval/datasetRecord.ts b/packages/database/src/server/models/ragEval/datasetRecord.ts
similarity index 94%
rename from src/database/server/models/ragEval/datasetRecord.ts
rename to packages/database/src/server/models/ragEval/datasetRecord.ts
index d8f2c21ffb9..dff00aaca6b 100644
--- a/src/database/server/models/ragEval/datasetRecord.ts
+++ b/packages/database/src/server/models/ragEval/datasetRecord.ts
@@ -1,8 +1,8 @@
+import { EvalDatasetRecordRefFile } from '@lobechat/types';
import { and, eq, inArray } from 'drizzle-orm';
-import { NewEvalDatasetRecordsItem, evalDatasetRecords, files } from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
-import { EvalDatasetRecordRefFile } from '@/types/eval';
+import { NewEvalDatasetRecordsItem, evalDatasetRecords, files } from '../../../schemas';
+import { LobeChatDatabase } from '../../../type';
export class EvalDatasetRecordModel {
private userId: string;
diff --git a/src/database/server/models/ragEval/evaluation.ts b/packages/database/src/server/models/ragEval/evaluation.ts
similarity index 94%
rename from src/database/server/models/ragEval/evaluation.ts
rename to packages/database/src/server/models/ragEval/evaluation.ts
index 611bf544e92..1adff58cf35 100644
--- a/src/database/server/models/ragEval/evaluation.ts
+++ b/packages/database/src/server/models/ragEval/evaluation.ts
@@ -1,3 +1,4 @@
+import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@lobechat/types';
import { SQL, and, count, desc, eq, inArray } from 'drizzle-orm';
import {
@@ -5,9 +6,8 @@ import {
evalDatasets,
evalEvaluation,
evaluationRecords,
-} from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
-import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@/types/eval';
+} from '../../../schemas';
+import { LobeChatDatabase } from '../../../type';
export class EvalEvaluationModel {
private userId: string;
diff --git a/src/database/server/models/ragEval/evaluationRecord.ts b/packages/database/src/server/models/ragEval/evaluationRecord.ts
similarity index 93%
rename from src/database/server/models/ragEval/evaluationRecord.ts
rename to packages/database/src/server/models/ragEval/evaluationRecord.ts
index fcc6d72a43d..81e16b7ed05 100644
--- a/src/database/server/models/ragEval/evaluationRecord.ts
+++ b/packages/database/src/server/models/ragEval/evaluationRecord.ts
@@ -1,7 +1,7 @@
import { and, eq } from 'drizzle-orm';
-import { NewEvaluationRecordsItem, evaluationRecords } from '@/database/schemas';
-import { LobeChatDatabase } from '@/database/type';
+import { LobeChatDatabase } from '../../../type';
+import { NewEvaluationRecordsItem, evaluationRecords } from '../../../schemas';
export class EvaluationRecordModel {
private userId: string;
diff --git a/src/database/server/models/ragEval/index.ts b/packages/database/src/server/models/ragEval/index.ts
similarity index 100%
rename from src/database/server/models/ragEval/index.ts
rename to packages/database/src/server/models/ragEval/index.ts
diff --git a/src/database/type.ts b/packages/database/src/type.ts
similarity index 100%
rename from src/database/type.ts
rename to packages/database/src/type.ts
diff --git a/src/database/utils/genWhere.ts b/packages/database/src/utils/genWhere.ts
similarity index 100%
rename from src/database/utils/genWhere.ts
rename to packages/database/src/utils/genWhere.ts
diff --git a/src/database/utils/idGenerator.test.ts b/packages/database/src/utils/idGenerator.test.ts
similarity index 100%
rename from src/database/utils/idGenerator.test.ts
rename to packages/database/src/utils/idGenerator.test.ts
diff --git a/src/database/utils/idGenerator.ts b/packages/database/src/utils/idGenerator.ts
similarity index 73%
rename from src/database/utils/idGenerator.ts
rename to packages/database/src/utils/idGenerator.ts
index 1310f952393..964bd2cb88b 100644
--- a/src/database/utils/idGenerator.ts
+++ b/packages/database/src/utils/idGenerator.ts
@@ -1,6 +1,9 @@
+// generate('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16); //=> "4f90d13a42"
+import { customAlphabet } from 'nanoid/non-secure';
import { generate } from 'random-words';
-import { createNanoId } from '@/utils/uuid';
+export const createNanoId = (size = 8) =>
+ customAlphabet('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', size);
const prefixes = {
agents: 'agt',
diff --git a/tests/setup-db.ts b/packages/database/tests/setup-db.ts
similarity index 100%
rename from tests/setup-db.ts
rename to packages/database/tests/setup-db.ts
diff --git a/vitest.config.server.ts b/packages/database/vitest.config.ts
similarity index 60%
rename from vitest.config.server.ts
rename to packages/database/vitest.config.ts
index 914855de6f5..0365556174f 100644
--- a/vitest.config.server.ts
+++ b/packages/database/vitest.config.ts
@@ -5,9 +5,12 @@ export default defineConfig({
test: {
alias: {
/* eslint-disable sort-keys-fix/sort-keys-fix */
- '@/const': resolve(__dirname, './packages/const/src'),
- '@/types': resolve(__dirname, './packages/types/src'),
- '@': resolve(__dirname, './src'),
+ '@/const': resolve(__dirname, '../const/src'),
+ '@/utils/errorResponse': resolve(__dirname, '../../src/utils/errorResponse'),
+ '@/utils': resolve(__dirname, '../utils/src'),
+ '@/database': resolve(__dirname, '../database/src'),
+ '@/types': resolve(__dirname, '../types/src'),
+ '@': resolve(__dirname, '../../src'),
/* eslint-enable */
},
coverage: {
@@ -15,18 +18,16 @@ export default defineConfig({
exclude: [
// https://github.com/lobehub/lobe-chat/pull/7265
...coverageConfigDefaults.exclude,
- 'src/database/server/core/dbForTest.ts',
+ 'src/server/core/dbForTest.ts',
],
- include: ['src/database/models/**/*.ts', 'src/database/server/**/*.ts'],
+ include: ['src/models/**/*.ts', 'src/server/**/*.ts'],
provider: 'v8',
reporter: ['text', 'json', 'lcov', 'text-summary'],
- reportsDirectory: './coverage/server',
},
env: {
TEST_SERVER_DB: '1',
},
environment: 'node',
- include: ['src/database/models/**/**/*.test.ts', 'src/database/server/**/**/*.test.ts'],
poolOptions: {
forks: {
singleFork: true,
diff --git a/packages/model-runtime/package.json b/packages/model-runtime/package.json
index 03c1ac5c3fb..100053b8510 100644
--- a/packages/model-runtime/package.json
+++ b/packages/model-runtime/package.json
@@ -10,6 +10,7 @@
"dependencies": {
"@aws-sdk/client-bedrock-runtime": "^3.862.0",
"@lobechat/types": "workspace:*",
+ "@lobechat/utils": "workspace:*",
"debug": "^4.4.1",
"openai": "^4.104.0"
}
diff --git a/packages/model-runtime/src/bfl/createImage.test.ts b/packages/model-runtime/src/bfl/createImage.test.ts
index a682efe7ec6..8c601ff4040 100644
--- a/packages/model-runtime/src/bfl/createImage.test.ts
+++ b/packages/model-runtime/src/bfl/createImage.test.ts
@@ -7,7 +7,7 @@ import { createBflImage } from './createImage';
import { BflStatusResponse } from './types';
// Mock external dependencies
-vi.mock('@/utils/imageToBase64', () => ({
+vi.mock('@lobechat/utils', () => ({
imageUrlToBase64: vi.fn(),
}));
@@ -188,7 +188,7 @@ describe('createBflImage', () => {
it('should convert single imageUrl to image_prompt base64', async () => {
// Arrange
const { parseDataUri } = await import('../utils/uriParser');
- const { imageUrlToBase64 } = await import('@/utils/imageToBase64');
+ const { imageUrlToBase64 } = await import('@lobechat/utils');
const { asyncifyPolling } = await import('../utils/asyncifyPolling');
const mockParseDataUri = vi.mocked(parseDataUri);
@@ -291,7 +291,7 @@ describe('createBflImage', () => {
it('should convert multiple imageUrls for Kontext models', async () => {
// Arrange
const { parseDataUri } = await import('../utils/uriParser');
- const { imageUrlToBase64 } = await import('@/utils/imageToBase64');
+ const { imageUrlToBase64 } = await import('@lobechat/utils');
const { asyncifyPolling } = await import('../utils/asyncifyPolling');
const mockParseDataUri = vi.mocked(parseDataUri);
@@ -351,7 +351,7 @@ describe('createBflImage', () => {
it('should limit imageUrls to maximum 4 images', async () => {
// Arrange
const { parseDataUri } = await import('../utils/uriParser');
- const { imageUrlToBase64 } = await import('@/utils/imageToBase64');
+ const { imageUrlToBase64 } = await import('@lobechat/utils');
const { asyncifyPolling } = await import('../utils/asyncifyPolling');
const mockParseDataUri = vi.mocked(parseDataUri);
diff --git a/packages/model-runtime/src/bfl/createImage.ts b/packages/model-runtime/src/bfl/createImage.ts
index 12a7073a11e..809f1cd1baa 100644
--- a/packages/model-runtime/src/bfl/createImage.ts
+++ b/packages/model-runtime/src/bfl/createImage.ts
@@ -1,7 +1,7 @@
+import { imageUrlToBase64 } from '@lobechat/utils';
import createDebug from 'debug';
import { RuntimeImageGenParamsValue } from '@/libs/standard-parameters/index';
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
import { AgentRuntimeErrorType } from '../error';
import { CreateImagePayload, CreateImageResponse } from '../types/image';
diff --git a/packages/model-runtime/src/google/index.test.ts b/packages/model-runtime/src/google/index.test.ts
index c0fa908e355..186e6d4908f 100644
--- a/packages/model-runtime/src/google/index.test.ts
+++ b/packages/model-runtime/src/google/index.test.ts
@@ -1,12 +1,12 @@
// @vitest-environment edge-runtime
import { GenerateContentResponse, Tool } from '@google/genai';
+import * as imageToBase64Module from '@lobechat/utils';
import OpenAI from 'openai';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { OpenAIChatMessage } from '@/libs/model-runtime';
import { CreateImagePayload } from '@/libs/model-runtime/types/image';
import { ChatStreamPayload } from '@/types/openai/chat';
-import * as imageToBase64Module from '@/utils/imageToBase64';
import * as debugStreamModule from '../utils/debugStream';
import { LobeGoogleAI } from './index';
diff --git a/packages/model-runtime/src/google/index.ts b/packages/model-runtime/src/google/index.ts
index fe93406492d..a38e35d29d2 100644
--- a/packages/model-runtime/src/google/index.ts
+++ b/packages/model-runtime/src/google/index.ts
@@ -9,9 +9,7 @@ import {
Type as SchemaType,
ThinkingConfig,
} from '@google/genai';
-
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
-import { safeParseJSON } from '@/utils/safeParseJSON';
+import { imageUrlToBase64, safeParseJSON } from '@lobechat/utils';
import { LobeRuntimeAI } from '../BaseAI';
import { AgentRuntimeErrorType } from '../error';
diff --git a/packages/model-runtime/src/ollama/index.ts b/packages/model-runtime/src/ollama/index.ts
index d7fd5eacdfd..e263ea3866b 100644
--- a/packages/model-runtime/src/ollama/index.ts
+++ b/packages/model-runtime/src/ollama/index.ts
@@ -1,8 +1,7 @@
+import { ChatModelCard } from '@lobechat/types';
import { Ollama, Tool } from 'ollama/browser';
import { ClientOptions } from 'openai';
-import { ModelRequestOptions, OpenAIChatMessage } from '@/libs/model-runtime';
-import { ChatModelCard } from '@/types/llm';
import { createErrorResponse } from '@/utils/errorResponse';
import { LobeRuntimeAI } from '../BaseAI';
@@ -13,6 +12,8 @@ import {
Embeddings,
EmbeddingsPayload,
ModelProvider,
+ ModelRequestOptions,
+ OpenAIChatMessage,
PullModelParams,
} from '../types';
import { AgentRuntimeError } from '../utils/createError';
diff --git a/packages/model-runtime/src/utils/anthropicHelpers.test.ts b/packages/model-runtime/src/utils/anthropicHelpers.test.ts
index 1ac6ca8ee88..21a62e61d6e 100644
--- a/packages/model-runtime/src/utils/anthropicHelpers.test.ts
+++ b/packages/model-runtime/src/utils/anthropicHelpers.test.ts
@@ -1,8 +1,7 @@
+import { imageUrlToBase64 } from '@lobechat/utils';
import { OpenAI } from 'openai';
import { describe, expect, it, vi } from 'vitest';
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
-
import { OpenAIChatMessage, UserMessageContentPart } from '../types/chat';
import {
buildAnthropicBlock,
@@ -20,7 +19,7 @@ vi.mock('./uriParser', () => ({
type: 'base64',
}),
}));
-vi.mock('@/utils/imageToBase64');
+vi.mock('@lobechat/utils');
describe('anthropicHelpers', () => {
describe('buildAnthropicBlock', () => {
diff --git a/packages/model-runtime/src/utils/anthropicHelpers.ts b/packages/model-runtime/src/utils/anthropicHelpers.ts
index 6bd34b17099..081241c110e 100644
--- a/packages/model-runtime/src/utils/anthropicHelpers.ts
+++ b/packages/model-runtime/src/utils/anthropicHelpers.ts
@@ -1,8 +1,7 @@
import Anthropic from '@anthropic-ai/sdk';
+import { imageUrlToBase64 } from '@lobechat/utils';
import OpenAI from 'openai';
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
-
import { OpenAIChatMessage, UserMessageContentPart } from '../types';
import { parseDataUri } from './uriParser';
diff --git a/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts b/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts
index 509dd9ee622..07c4d656ca2 100644
--- a/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts
+++ b/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts
@@ -1,3 +1,4 @@
+import { getModelPropertyWithFallback } from '@lobechat/utils';
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import createDebug from 'debug';
@@ -7,7 +8,6 @@ import { Stream } from 'openai/streaming';
import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels';
import { RuntimeImageGenParamsValue } from '@/libs/standard-parameters/index';
import type { ChatModelCard } from '@/types/llm';
-import { getModelPropertyWithFallback } from '@/utils/getFallbackModelProperty';
import { LobeRuntimeAI } from '../../BaseAI';
import { AgentRuntimeErrorType, ILobeAgentRuntimeErrorType } from '../../error';
diff --git a/packages/model-runtime/src/utils/openaiHelpers.test.ts b/packages/model-runtime/src/utils/openaiHelpers.test.ts
index 1ee4379e9c5..39e1de02ed8 100644
--- a/packages/model-runtime/src/utils/openaiHelpers.test.ts
+++ b/packages/model-runtime/src/utils/openaiHelpers.test.ts
@@ -1,8 +1,7 @@
+import { imageUrlToBase64 } from '@lobechat/utils';
import OpenAI from 'openai';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
-
import {
convertImageUrlToFile,
convertMessageContent,
@@ -12,7 +11,7 @@ import {
import { parseDataUri } from './uriParser';
// 模拟依赖
-vi.mock('@/utils/imageToBase64');
+vi.mock('@lobechat/utils');
vi.mock('./uriParser');
describe('convertMessageContent', () => {
diff --git a/packages/model-runtime/src/utils/openaiHelpers.ts b/packages/model-runtime/src/utils/openaiHelpers.ts
index 3e15b62fef4..07e98be10cf 100644
--- a/packages/model-runtime/src/utils/openaiHelpers.ts
+++ b/packages/model-runtime/src/utils/openaiHelpers.ts
@@ -1,8 +1,8 @@
+import { imageUrlToBase64 } from '@lobechat/utils';
import OpenAI, { toFile } from 'openai';
import { disableStreamModels, systemToUserModels } from '@/const/models';
import { ChatStreamPayload, OpenAIChatMessage } from '@/libs/model-runtime';
-import { imageUrlToBase64 } from '@/utils/imageToBase64';
import { parseDataUri } from './uriParser';
@@ -103,7 +103,7 @@ export const convertOpenAIResponseInputs = async (
export const pruneReasoningPayload = (payload: ChatStreamPayload) => {
const shouldStream = !disableStreamModels.has(payload.model);
const { stream_options, ...cleanedPayload } = payload as any;
-
+
return {
...cleanedPayload,
frequency_penalty: 0,
diff --git a/packages/model-runtime/src/utils/streams/bedrock/claude.ts b/packages/model-runtime/src/utils/streams/bedrock/claude.ts
index 76e2e1de197..58f49dbbacb 100644
--- a/packages/model-runtime/src/utils/streams/bedrock/claude.ts
+++ b/packages/model-runtime/src/utils/streams/bedrock/claude.ts
@@ -1,6 +1,5 @@
import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime';
-
-import { nanoid } from '@/utils/uuid';
+import { nanoid } from '@lobechat/utils';
import { ChatStreamCallbacks } from '../../../types';
import { transformAnthropicStream } from '../anthropic';
diff --git a/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts b/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts
index 782d2e12466..19f287eba2a 100644
--- a/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts
+++ b/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts
@@ -1,9 +1,8 @@
import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime';
+import * as uuidModule from '@lobechat/utils';
import { Readable } from 'stream';
import { describe, expect, it, vi } from 'vitest';
-import * as uuidModule from '@/utils/uuid';
-
import { AWSBedrockLlamaStream } from './llama';
describe('AWSBedrockLlamaStream', () => {
diff --git a/packages/model-runtime/src/utils/streams/bedrock/llama.ts b/packages/model-runtime/src/utils/streams/bedrock/llama.ts
index 35b7763fb6f..c91d29aaab9 100644
--- a/packages/model-runtime/src/utils/streams/bedrock/llama.ts
+++ b/packages/model-runtime/src/utils/streams/bedrock/llama.ts
@@ -1,6 +1,5 @@
import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime';
-
-import { nanoid } from '@/utils/uuid';
+import { nanoid } from '@lobechat/utils';
import { ChatStreamCallbacks } from '../../../types';
import {
diff --git a/packages/model-runtime/src/utils/streams/google-ai.test.ts b/packages/model-runtime/src/utils/streams/google-ai.test.ts
index 42b8939f48b..ffad2bac3ab 100644
--- a/packages/model-runtime/src/utils/streams/google-ai.test.ts
+++ b/packages/model-runtime/src/utils/streams/google-ai.test.ts
@@ -1,8 +1,7 @@
import { GenerateContentResponse } from '@google/genai';
+import * as uuidModule from '@lobechat/utils';
import { describe, expect, it, vi } from 'vitest';
-import * as uuidModule from '@/utils/uuid';
-
import { GoogleGenerativeAIStream } from './google-ai';
describe('GoogleGenerativeAIStream', () => {
diff --git a/packages/model-runtime/src/utils/streams/google-ai.ts b/packages/model-runtime/src/utils/streams/google-ai.ts
index 2e092e251fc..7a7a11c381e 100644
--- a/packages/model-runtime/src/utils/streams/google-ai.ts
+++ b/packages/model-runtime/src/utils/streams/google-ai.ts
@@ -1,9 +1,9 @@
import { GenerateContentResponse } from '@google/genai';
+import { nanoid } from '@lobechat/utils';
import errorLocale from '@/locales/default/error';
import { ModelTokensUsage } from '@/types/message';
import { GroundingSearch } from '@/types/search';
-import { nanoid } from '@/utils/uuid';
import { ChatStreamCallbacks } from '../../types';
import {
diff --git a/packages/model-runtime/src/utils/streams/ollama.test.ts b/packages/model-runtime/src/utils/streams/ollama.test.ts
index 922abddf691..3777982f6c2 100644
--- a/packages/model-runtime/src/utils/streams/ollama.test.ts
+++ b/packages/model-runtime/src/utils/streams/ollama.test.ts
@@ -1,8 +1,7 @@
+import * as uuidModule from '@lobechat/utils';
import { ChatResponse } from 'ollama/browser';
import { describe, expect, it, vi } from 'vitest';
-import * as uuidModule from '@/utils/uuid';
-
import { OllamaStream } from './ollama';
describe('OllamaStream', () => {
diff --git a/packages/model-runtime/src/utils/streams/ollama.ts b/packages/model-runtime/src/utils/streams/ollama.ts
index dc8521c14bd..22c1fc28074 100644
--- a/packages/model-runtime/src/utils/streams/ollama.ts
+++ b/packages/model-runtime/src/utils/streams/ollama.ts
@@ -1,7 +1,7 @@
+import { nanoid } from '@lobechat/utils';
import { ChatResponse } from 'ollama/browser';
import { ChatStreamCallbacks } from '@/libs/model-runtime';
-import { nanoid } from '@/utils/uuid';
import {
StreamContext,
diff --git a/packages/model-runtime/src/utils/streams/protocol.ts b/packages/model-runtime/src/utils/streams/protocol.ts
index cd7015cd65f..762173c9709 100644
--- a/packages/model-runtime/src/utils/streams/protocol.ts
+++ b/packages/model-runtime/src/utils/streams/protocol.ts
@@ -1,6 +1,6 @@
+import { nanoid, safeParseJSON } from '@lobechat/utils';
+
import { CitationItem, ModelSpeed, ModelTokensUsage } from '@/types/message';
-import { safeParseJSON } from '@/utils/safeParseJSON';
-import { nanoid } from '@/utils/uuid';
import { AgentRuntimeErrorType } from '../../error';
import { parseToolCalls } from '../../helpers';
diff --git a/packages/model-runtime/src/utils/streams/vertex-ai.test.ts b/packages/model-runtime/src/utils/streams/vertex-ai.test.ts
index 29c0eae3be8..e5fa28a7253 100644
--- a/packages/model-runtime/src/utils/streams/vertex-ai.test.ts
+++ b/packages/model-runtime/src/utils/streams/vertex-ai.test.ts
@@ -1,7 +1,6 @@
+import * as uuidModule from '@lobechat/utils';
import { describe, expect, it, vi } from 'vitest';
-import * as uuidModule from '@/utils/uuid';
-
import { VertexAIStream } from './vertex-ai';
describe('VertexAIStream', () => {
diff --git a/packages/model-runtime/src/utils/streams/vertex-ai.ts b/packages/model-runtime/src/utils/streams/vertex-ai.ts
index 44e700cdae0..c1b1fb11801 100644
--- a/packages/model-runtime/src/utils/streams/vertex-ai.ts
+++ b/packages/model-runtime/src/utils/streams/vertex-ai.ts
@@ -1,8 +1,8 @@
import { GenerateContentResponse } from '@google/genai';
+import { nanoid } from '@lobechat/utils';
import { ModelTokensUsage } from '@/types/message';
import { GroundingSearch } from '@/types/search';
-import { nanoid } from '@/utils/uuid';
import { type GoogleAIStreamOptions } from './google-ai';
import {
diff --git a/packages/model-runtime/vitest.config.ts b/packages/model-runtime/vitest.config.ts
index e2cc1c7668d..fd57324ecbd 100644
--- a/packages/model-runtime/vitest.config.ts
+++ b/packages/model-runtime/vitest.config.ts
@@ -7,6 +7,8 @@ export default defineConfig({
/* eslint-disable sort-keys-fix/sort-keys-fix */
'@/libs/model-runtime': resolve(__dirname, './src'),
'@/types': resolve(__dirname, '../types/src'),
+ '@/utils/errorResponse': resolve(__dirname, '../../src/utils/errorResponse'),
+ '@/utils': resolve(__dirname, '../utils/src'),
'@/const': resolve(__dirname, '../const/src'),
'@': resolve(__dirname, '../../src'),
/* eslint-enable */
diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts
index 363ae823d01..723d925b18f 100644
--- a/packages/types/src/index.ts
+++ b/packages/types/src/index.ts
@@ -1,10 +1,15 @@
export * from './artifact';
export * from './chunk';
export * from './clientDB';
+export * from './eval';
export * from './fetch';
export * from './knowledgeBase';
+export * from './llm';
export * from './message';
+export * from './user';
+export * from './user/settings';
// FIXME: I think we need a refactor for the "openai" types
// it more likes the UI message payload
export * from './openai/chat';
export * from './trace';
+export * from './zustand';
diff --git a/src/utils/zustand.ts b/packages/types/src/zustand.ts
similarity index 100%
rename from src/utils/zustand.ts
rename to packages/types/src/zustand.ts
diff --git a/packages/utils/package.json b/packages/utils/package.json
new file mode 100644
index 00000000000..a5eb0b6ea05
--- /dev/null
+++ b/packages/utils/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@lobechat/utils",
+ "version": "1.0.0",
+ "private": true,
+ "main": "./src/index.ts",
+ "scripts": {
+ "test": "vitest",
+ "test:coverage": "vitest --coverage"
+ },
+ "dependencies": {
+ "@lobechat/const": "workspace:*",
+ "@lobechat/types": "workspace:*"
+ },
+ "devDependencies": {
+ "vitest-canvas-mock": "^0.3.3"
+ }
+}
diff --git a/src/utils/__snapshots__/parseModels.test.ts.snap b/packages/utils/src/__snapshots__/parseModels.test.ts.snap
similarity index 100%
rename from src/utils/__snapshots__/parseModels.test.ts.snap
rename to packages/utils/src/__snapshots__/parseModels.test.ts.snap
diff --git a/src/utils/_deprecated/__snapshots__/parseModels.test.ts.snap b/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap
similarity index 100%
rename from src/utils/_deprecated/__snapshots__/parseModels.test.ts.snap
rename to packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap
diff --git a/src/utils/_deprecated/parseModels.test.ts b/packages/utils/src/_deprecated/parseModels.test.ts
similarity index 100%
rename from src/utils/_deprecated/parseModels.test.ts
rename to packages/utils/src/_deprecated/parseModels.test.ts
diff --git a/src/utils/_deprecated/parseModels.ts b/packages/utils/src/_deprecated/parseModels.ts
similarity index 100%
rename from src/utils/_deprecated/parseModels.ts
rename to packages/utils/src/_deprecated/parseModels.ts
diff --git a/src/utils/apiKey.ts b/packages/utils/src/apiKey.ts
similarity index 100%
rename from src/utils/apiKey.ts
rename to packages/utils/src/apiKey.ts
diff --git a/src/utils/basePath.ts b/packages/utils/src/basePath.ts
similarity index 100%
rename from src/utils/basePath.ts
rename to packages/utils/src/basePath.ts
diff --git a/src/utils/client/GlobalAgentContextManager.ts b/packages/utils/src/client/GlobalAgentContextManager.ts
similarity index 100%
rename from src/utils/client/GlobalAgentContextManager.ts
rename to packages/utils/src/client/GlobalAgentContextManager.ts
diff --git a/src/utils/client/cookie.test.ts b/packages/utils/src/client/cookie.test.ts
similarity index 96%
rename from src/utils/client/cookie.test.ts
rename to packages/utils/src/client/cookie.test.ts
index 622419d74f7..411965be74f 100644
--- a/src/utils/client/cookie.test.ts
+++ b/packages/utils/src/client/cookie.test.ts
@@ -1,9 +1,7 @@
import dayjs from 'dayjs';
import { beforeEach, describe, expect, it, vi } from 'vitest';
-import { COOKIE_CACHE_DAYS } from '@/const/settings';
-
-import { setCookie } from './cookie';
+import { COOKIE_CACHE_DAYS, setCookie } from './cookie';
describe('setCookie', () => {
// Mock document.cookie since we're in a test environment
diff --git a/src/utils/client/cookie.ts b/packages/utils/src/client/cookie.ts
similarity index 93%
rename from src/utils/client/cookie.ts
rename to packages/utils/src/client/cookie.ts
index b83dc6421bb..2acf260b6fd 100644
--- a/src/utils/client/cookie.ts
+++ b/packages/utils/src/client/cookie.ts
@@ -1,6 +1,6 @@
import dayjs from 'dayjs';
-import { COOKIE_CACHE_DAYS } from '@/const/settings';
+export const COOKIE_CACHE_DAYS = 30;
export const setCookie = (
key: string,
diff --git a/src/utils/client/downloadFile.ts b/packages/utils/src/client/downloadFile.ts
similarity index 100%
rename from src/utils/client/downloadFile.ts
rename to packages/utils/src/client/downloadFile.ts
diff --git a/src/utils/client/exportFile.ts b/packages/utils/src/client/exportFile.ts
similarity index 100%
rename from src/utils/client/exportFile.ts
rename to packages/utils/src/client/exportFile.ts
diff --git a/src/utils/client/parserPlaceholder.test.ts b/packages/utils/src/client/parserPlaceholder.test.ts
similarity index 98%
rename from src/utils/client/parserPlaceholder.test.ts
rename to packages/utils/src/client/parserPlaceholder.test.ts
index b0343d4c721..25e1f32865f 100644
--- a/src/utils/client/parserPlaceholder.test.ts
+++ b/packages/utils/src/client/parserPlaceholder.test.ts
@@ -1,9 +1,9 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
-import { VARIABLE_GENERATORS, parsePlaceholderVariablesMessages } from './parserPlaceholder';
+import { parsePlaceholderVariablesMessages } from './parserPlaceholder';
// Mock dependencies
-vi.mock('@/utils/uuid', () => ({
+vi.mock('../uuid', () => ({
uuid: () => 'mocked-uuid-12345',
}));
diff --git a/src/utils/client/parserPlaceholder.ts b/packages/utils/src/client/parserPlaceholder.ts
similarity index 59%
rename from src/utils/client/parserPlaceholder.ts
rename to packages/utils/src/client/parserPlaceholder.ts
index 05e52db58d2..81e3c7ffedc 100644
--- a/src/utils/client/parserPlaceholder.ts
+++ b/packages/utils/src/client/parserPlaceholder.ts
@@ -1,35 +1,35 @@
import { template } from 'lodash-es';
-import { uuid } from '@/utils/uuid';
-
import { useUserStore } from '@/store/user';
import { userProfileSelectors } from '@/store/user/selectors';
+import { uuid } from '../uuid';
+
const placeholderVariablesRegex = /{{(.*?)}}/g;
/* eslint-disable sort-keys-fix/sort-keys-fix */
export const VARIABLE_GENERATORS = {
/**
- * 时间类模板变量
- *
- * | Value | Example |
- * |-------|---------|
- * | `{{date}}` | 12/25/2023 |
- * | `{{datetime}}` | 12/25/2023, 2:30:45 PM |
- * | `{{day}}` | 25 |
- * | `{{hour}}` | 14 |
- * | `{{iso}}` | 2023-12-25T14:30:45.123Z |
- * | `{{locale}}` | zh-CN |
- * | `{{minute}}` | 30 |
- * | `{{month}}` | 12 |
- * | `{{second}}` | 45 |
- * | `{{time}}` | 2:30:45 PM |
- * | `{{timestamp}}` | 1703538645123 |
- * | `{{timezone}}` | America/New_York |
- * | `{{weekday}}` | Monday |
- * | `{{year}}` | 2023 |
- *
- */
+ * 时间类模板变量
+ *
+ * | Value | Example |
+ * |-------|---------|
+ * | `{{date}}` | 12/25/2023 |
+ * | `{{datetime}}` | 12/25/2023, 2:30:45 PM |
+ * | `{{day}}` | 25 |
+ * | `{{hour}}` | 14 |
+ * | `{{iso}}` | 2023-12-25T14:30:45.123Z |
+ * | `{{locale}}` | zh-CN |
+ * | `{{minute}}` | 30 |
+ * | `{{month}}` | 12 |
+ * | `{{second}}` | 45 |
+ * | `{{time}}` | 2:30:45 PM |
+ * | `{{timestamp}}` | 1703538645123 |
+ * | `{{timezone}}` | America/New_York |
+ * | `{{weekday}}` | Monday |
+ * | `{{year}}` | 2023 |
+ *
+ */
date: () => new Date().toLocaleDateString(),
datetime: () => new Date().toLocaleString(),
day: () => new Date().getDate().toString().padStart(2, '0'),
@@ -46,65 +46,71 @@ export const VARIABLE_GENERATORS = {
year: () => new Date().getFullYear().toString(),
/**
- * 用户信息类模板变量
- *
- * | Value | Example |
- * |-------|---------|
- * | `{{email}}` | demo@lobehub.com |
- * | `{{nickname}}` | 社区版用户 |
- * | `{{username}}` | LobeChat |
- *
- */
+ * 用户信息类模板变量
+ *
+ * | Value | Example |
+ * |-------|---------|
+ * | `{{email}}` | demo@lobehub.com |
+ * | `{{nickname}}` | 社区版用户 |
+ * | `{{username}}` | LobeChat |
+ *
+ */
email: () => userProfileSelectors.email(useUserStore.getState()) ?? '',
nickname: () => userProfileSelectors.nickName(useUserStore.getState()) ?? '',
- username: () => userProfileSelectors.displayUserName(useUserStore.getState()) ?? userProfileSelectors.fullName(useUserStore.getState()) ?? '',
+ username: () =>
+ userProfileSelectors.displayUserName(useUserStore.getState()) ??
+ userProfileSelectors.fullName(useUserStore.getState()) ??
+ '',
/**
- * 随机值类模板变量
- *
- * | Value | Example |
- * |-------|---------|
- * | `{{random}}` | 100041 |
- * | `{{random_bool}}` | true |
- * | `{{random_float}}` | 76.02 |
- * | `{{random_hex}}` | de0dbd |
- * | `{{random_int}}` | 68 |
- * | `{{random_string}}` | wqn9zfrqe7h |
- *
- */
+ * 随机值类模板变量
+ *
+ * | Value | Example |
+ * |-------|---------|
+ * | `{{random}}` | 100041 |
+ * | `{{random_bool}}` | true |
+ * | `{{random_float}}` | 76.02 |
+ * | `{{random_hex}}` | de0dbd |
+ * | `{{random_int}}` | 68 |
+ * | `{{random_string}}` | wqn9zfrqe7h |
+ *
+ */
random: () => Math.floor(Math.random() * 1_000_000 + 1).toString(),
random_bool: () => (Math.random() > 0.5 ? 'true' : 'false'),
random_float: () => (Math.random() * 100).toFixed(2),
- random_hex: () => Math.floor(Math.random() * 16_777_215).toString(16).padStart(6, '0'),
+ random_hex: () =>
+ Math.floor(Math.random() * 16_777_215)
+ .toString(16)
+ .padStart(6, '0'),
random_int: () => Math.floor(Math.random() * 100 + 1).toString(),
random_string: () => Math.random().toString(36).slice(2, 15),
random_digit: () => Math.floor(Math.random() * 10).toString(),
/**
- * UUID 类模板变量
- *
- * | Value | Example |
- * |-------|---------|
- * | `{{uuid}}` | dd90b35-669f-4e87-beb8-ac6877f6995d |
- * | `{{uuid_short}}` | dd90b35 |
- *
- */
+ * UUID 类模板变量
+ *
+ * | Value | Example |
+ * |-------|---------|
+ * | `{{uuid}}` | dd90b35-669f-4e87-beb8-ac6877f6995d |
+ * | `{{uuid_short}}` | dd90b35 |
+ *
+ */
uuid: () => uuid(),
uuid_short: () => uuid().split('-')[0],
/**
- * 平台类模板变量
- *
- * | Value | Example |
- * |-------|---------|
- * | `{{language}}` | zh-CN |
- * | `{{platform}}` | MacIntel |
- * | `{{user_agent}}` | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0 |
- *
- */
- language: () => typeof navigator !== 'undefined' ? navigator.language : '',
- platform: () => typeof navigator !== 'undefined' ? navigator.platform : '',
- user_agent: () => typeof navigator !== 'undefined' ? navigator.userAgent : '',
+ * 平台类模板变量
+ *
+ * | Value | Example |
+ * |-------|---------|
+ * | `{{language}}` | zh-CN |
+ * | `{{platform}}` | MacIntel |
+ * | `{{user_agent}}` | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0 |
+ *
+ */
+ language: () => (typeof navigator !== 'undefined' ? navigator.language : ''),
+ platform: () => (typeof navigator !== 'undefined' ? navigator.platform : ''),
+ user_agent: () => (typeof navigator !== 'undefined' ? navigator.userAgent : ''),
} as Record string>;
/**
@@ -114,7 +120,7 @@ export const VARIABLE_GENERATORS = {
*/
const extractPlaceholderVariables = (text: string): string[] => {
const matches = [...text.matchAll(placeholderVariablesRegex)];
- return matches.map(m => m[1].trim());
+ return matches.map((m) => m[1].trim());
};
/**
@@ -132,7 +138,7 @@ export const parsePlaceholderVariables = (text: string, depth = 2): string => {
const variables = Object.fromEntries(
extractPlaceholderVariables(result)
.map((key) => [key, VARIABLE_GENERATORS[key]?.()])
- .filter(([, value]) => value !== undefined)
+ .filter(([, value]) => value !== undefined),
);
const replaced = template(result, { interpolate: placeholderVariablesRegex })(variables);
@@ -153,7 +159,7 @@ export const parsePlaceholderVariables = (text: string, depth = 2): string => {
* @returns 处理后的消息数组
*/
export const parsePlaceholderVariablesMessages = (messages: any[]): any[] =>
- messages.map(message => {
+ messages.map((message) => {
if (!message?.content) return message;
const { content } = message;
@@ -167,11 +173,9 @@ export const parsePlaceholderVariablesMessages = (messages: any[]): any[] =>
if (Array.isArray(content)) {
return {
...message,
- content: content.map(item =>
- item?.type === 'text'
- ? { ...item, text: parsePlaceholderVariables(item.text) }
- : item
- )
+ content: content.map((item) =>
+ item?.type === 'text' ? { ...item, text: parsePlaceholderVariables(item.text) } : item,
+ ),
};
}
diff --git a/src/utils/client/topic.test.ts b/packages/utils/src/client/topic.test.ts
similarity index 98%
rename from src/utils/client/topic.test.ts
rename to packages/utils/src/client/topic.test.ts
index 8269178b394..f612124820b 100644
--- a/src/utils/client/topic.test.ts
+++ b/packages/utils/src/client/topic.test.ts
@@ -1,5 +1,5 @@
import dayjs from 'dayjs';
-import { beforeAll, describe, expect, it } from 'vitest';
+import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
import { ChatTopic } from '@/types/topic';
diff --git a/src/utils/client/topic.ts b/packages/utils/src/client/topic.ts
similarity index 100%
rename from src/utils/client/topic.ts
rename to packages/utils/src/client/topic.ts
diff --git a/src/utils/client/xor-obfuscation.test.ts b/packages/utils/src/client/xor-obfuscation.test.ts
similarity index 100%
rename from src/utils/client/xor-obfuscation.test.ts
rename to packages/utils/src/client/xor-obfuscation.test.ts
diff --git a/src/utils/client/xor-obfuscation.ts b/packages/utils/src/client/xor-obfuscation.ts
similarity index 100%
rename from src/utils/client/xor-obfuscation.ts
rename to packages/utils/src/client/xor-obfuscation.ts
diff --git a/src/utils/clientIP.test.ts b/packages/utils/src/clientIP.test.ts
similarity index 100%
rename from src/utils/clientIP.test.ts
rename to packages/utils/src/clientIP.test.ts
diff --git a/src/utils/clientIP.ts b/packages/utils/src/clientIP.ts
similarity index 100%
rename from src/utils/clientIP.ts
rename to packages/utils/src/clientIP.ts
diff --git a/src/utils/clipboard.ts b/packages/utils/src/clipboard.ts
similarity index 100%
rename from src/utils/clipboard.ts
rename to packages/utils/src/clipboard.ts
diff --git a/src/utils/colorUtils.ts b/packages/utils/src/colorUtils.ts
similarity index 100%
rename from src/utils/colorUtils.ts
rename to packages/utils/src/colorUtils.ts
diff --git a/src/utils/compass.ts b/packages/utils/src/compass.ts
similarity index 100%
rename from src/utils/compass.ts
rename to packages/utils/src/compass.ts
diff --git a/src/utils/compressImage.test.ts b/packages/utils/src/compressImage.test.ts
similarity index 96%
rename from src/utils/compressImage.test.ts
rename to packages/utils/src/compressImage.test.ts
index 4d60d51d7a4..e7f921b6093 100644
--- a/src/utils/compressImage.test.ts
+++ b/packages/utils/src/compressImage.test.ts
@@ -1,3 +1,5 @@
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
import compressImage from './compressImage';
const getContextSpy = vi.spyOn(global.HTMLCanvasElement.prototype, 'getContext');
diff --git a/src/utils/compressImage.ts b/packages/utils/src/compressImage.ts
similarity index 100%
rename from src/utils/compressImage.ts
rename to packages/utils/src/compressImage.ts
diff --git a/src/utils/difference.test.ts b/packages/utils/src/difference.test.ts
similarity index 100%
rename from src/utils/difference.test.ts
rename to packages/utils/src/difference.test.ts
diff --git a/src/utils/difference.ts b/packages/utils/src/difference.ts
similarity index 100%
rename from src/utils/difference.ts
rename to packages/utils/src/difference.ts
diff --git a/src/utils/electron/desktopRemoteRPCFetch.ts b/packages/utils/src/electron/desktopRemoteRPCFetch.ts
similarity index 100%
rename from src/utils/electron/desktopRemoteRPCFetch.ts
rename to packages/utils/src/electron/desktopRemoteRPCFetch.ts
diff --git a/src/utils/env.ts b/packages/utils/src/env.ts
similarity index 100%
rename from src/utils/env.ts
rename to packages/utils/src/env.ts
diff --git a/src/utils/fetch/__tests__/fetchSSE.test.ts b/packages/utils/src/fetch/__tests__/fetchSSE.test.ts
similarity index 99%
rename from src/utils/fetch/__tests__/fetchSSE.test.ts
rename to packages/utils/src/fetch/__tests__/fetchSSE.test.ts
index fb469adff68..9f6dfc69503 100644
--- a/src/utils/fetch/__tests__/fetchSSE.test.ts
+++ b/packages/utils/src/fetch/__tests__/fetchSSE.test.ts
@@ -1,9 +1,8 @@
+import { MESSAGE_CANCEL_FLAT } from '@lobechat/const';
+import { ChatMessageError } from '@lobechat/types';
import { afterEach, describe, expect, it, vi } from 'vitest';
-import { MESSAGE_CANCEL_FLAT } from '@/const/message';
-import { ChatMessageError } from '@/types/message';
-import { sleep } from '@/utils/sleep';
-
+import { sleep } from '../../sleep';
import { FetchEventSourceInit } from '../fetchEventSource';
import { fetchEventSource } from '../fetchEventSource';
import { fetchSSE } from '../fetchSSE';
diff --git a/src/utils/fetch/__tests__/parseError.test.ts b/packages/utils/src/fetch/__tests__/parseError.test.ts
similarity index 100%
rename from src/utils/fetch/__tests__/parseError.test.ts
rename to packages/utils/src/fetch/__tests__/parseError.test.ts
diff --git a/src/utils/fetch/fetchEventSource/index.ts b/packages/utils/src/fetch/fetchEventSource/index.ts
similarity index 100%
rename from src/utils/fetch/fetchEventSource/index.ts
rename to packages/utils/src/fetch/fetchEventSource/index.ts
diff --git a/src/utils/fetch/fetchEventSource/parse.ts b/packages/utils/src/fetch/fetchEventSource/parse.ts
similarity index 100%
rename from src/utils/fetch/fetchEventSource/parse.ts
rename to packages/utils/src/fetch/fetchEventSource/parse.ts
diff --git a/src/utils/fetch/fetchSSE.ts b/packages/utils/src/fetch/fetchSSE.ts
similarity index 99%
rename from src/utils/fetch/fetchSSE.ts
rename to packages/utils/src/fetch/fetchSSE.ts
index 1d9baed9f1d..c8c9cef851b 100644
--- a/src/utils/fetch/fetchSSE.ts
+++ b/packages/utils/src/fetch/fetchSSE.ts
@@ -15,8 +15,8 @@ import {
} from '@/types/message';
import { ChatImageChunk } from '@/types/message/image';
import { GroundingSearch } from '@/types/search';
-import { nanoid } from '@/utils/uuid';
+import { nanoid } from '../uuid';
import { fetchEventSource } from './fetchEventSource';
import { getMessageError } from './parseError';
diff --git a/src/utils/fetch/headers.ts b/packages/utils/src/fetch/headers.ts
similarity index 100%
rename from src/utils/fetch/headers.ts
rename to packages/utils/src/fetch/headers.ts
diff --git a/src/utils/fetch/index.ts b/packages/utils/src/fetch/index.ts
similarity index 100%
rename from src/utils/fetch/index.ts
rename to packages/utils/src/fetch/index.ts
diff --git a/src/utils/fetch/parseError.ts b/packages/utils/src/fetch/parseError.ts
similarity index 100%
rename from src/utils/fetch/parseError.ts
rename to packages/utils/src/fetch/parseError.ts
diff --git a/src/utils/fetch/request.ts b/packages/utils/src/fetch/request.ts
similarity index 100%
rename from src/utils/fetch/request.ts
rename to packages/utils/src/fetch/request.ts
diff --git a/src/utils/format.test.ts b/packages/utils/src/format.test.ts
similarity index 100%
rename from src/utils/format.test.ts
rename to packages/utils/src/format.test.ts
diff --git a/src/utils/format.ts b/packages/utils/src/format.ts
similarity index 100%
rename from src/utils/format.ts
rename to packages/utils/src/format.ts
diff --git a/src/utils/genOG.ts b/packages/utils/src/genOG.ts
similarity index 100%
rename from src/utils/genOG.ts
rename to packages/utils/src/genOG.ts
diff --git a/src/utils/getFallbackModelProperty.test.ts b/packages/utils/src/getFallbackModelProperty.test.ts
similarity index 99%
rename from src/utils/getFallbackModelProperty.test.ts
rename to packages/utils/src/getFallbackModelProperty.test.ts
index cf3ba7e52ce..f928464209f 100644
--- a/src/utils/getFallbackModelProperty.test.ts
+++ b/packages/utils/src/getFallbackModelProperty.test.ts
@@ -1,4 +1,4 @@
-import { vi } from 'vitest';
+import { describe, expect, it, vi } from 'vitest';
import { getModelPropertyWithFallback } from './getFallbackModelProperty';
diff --git a/src/utils/getFallbackModelProperty.ts b/packages/utils/src/getFallbackModelProperty.ts
similarity index 100%
rename from src/utils/getFallbackModelProperty.ts
rename to packages/utils/src/getFallbackModelProperty.ts
diff --git a/src/utils/imageToBase64.test.ts b/packages/utils/src/imageToBase64.test.ts
similarity index 100%
rename from src/utils/imageToBase64.test.ts
rename to packages/utils/src/imageToBase64.test.ts
diff --git a/src/utils/imageToBase64.ts b/packages/utils/src/imageToBase64.ts
similarity index 100%
rename from src/utils/imageToBase64.ts
rename to packages/utils/src/imageToBase64.ts
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
new file mode 100644
index 00000000000..9b846ac97ff
--- /dev/null
+++ b/packages/utils/src/index.ts
@@ -0,0 +1,5 @@
+export * from './client/cookie';
+export * from './getFallbackModelProperty';
+export * from './imageToBase64';
+export * from './safeParseJSON';
+export * from './uuid';
diff --git a/src/utils/isChunkingUnsupported.test.ts b/packages/utils/src/isChunkingUnsupported.test.ts
similarity index 100%
rename from src/utils/isChunkingUnsupported.test.ts
rename to packages/utils/src/isChunkingUnsupported.test.ts
diff --git a/src/utils/isChunkingUnsupported.ts b/packages/utils/src/isChunkingUnsupported.ts
similarity index 100%
rename from src/utils/isChunkingUnsupported.ts
rename to packages/utils/src/isChunkingUnsupported.ts
diff --git a/src/utils/keyboard.ts b/packages/utils/src/keyboard.ts
similarity index 100%
rename from src/utils/keyboard.ts
rename to packages/utils/src/keyboard.ts
diff --git a/src/utils/localStorage.ts b/packages/utils/src/localStorage.ts
similarity index 100%
rename from src/utils/localStorage.ts
rename to packages/utils/src/localStorage.ts
diff --git a/src/utils/locale.test.ts b/packages/utils/src/locale.test.ts
similarity index 100%
rename from src/utils/locale.test.ts
rename to packages/utils/src/locale.test.ts
diff --git a/src/utils/locale.ts b/packages/utils/src/locale.ts
similarity index 97%
rename from src/utils/locale.ts
rename to packages/utils/src/locale.ts
index 0fe495d866c..9d4fe1ffe66 100644
--- a/src/utils/locale.ts
+++ b/packages/utils/src/locale.ts
@@ -2,7 +2,8 @@ import { resolveAcceptLanguage } from 'resolve-accept-language';
import { DEFAULT_LANG } from '@/const/locale';
import { Locales, locales, normalizeLocale } from '@/locales/resources';
-import { RouteVariants } from '@/utils/server/routeVariants';
+
+import { RouteVariants } from './server/routeVariants';
export const getAntdLocale = async (lang?: string) => {
let normalLang: any = normalizeLocale(lang);
diff --git a/src/utils/merge.test.ts b/packages/utils/src/merge.test.ts
similarity index 99%
rename from src/utils/merge.test.ts
rename to packages/utils/src/merge.test.ts
index 0d65a5e2d3f..72b6d222e58 100644
--- a/src/utils/merge.test.ts
+++ b/packages/utils/src/merge.test.ts
@@ -1,6 +1,4 @@
-import { expect } from 'vitest';
-
-import { AIChatModelCard } from '@/types/aiModel';
+import { describe, expect, it } from 'vitest';
import { mergeArrayById } from './merge';
diff --git a/src/utils/merge.ts b/packages/utils/src/merge.ts
similarity index 100%
rename from src/utils/merge.ts
rename to packages/utils/src/merge.ts
diff --git a/src/utils/number.test.ts b/packages/utils/src/number.test.ts
similarity index 100%
rename from src/utils/number.test.ts
rename to packages/utils/src/number.test.ts
diff --git a/src/utils/number.ts b/packages/utils/src/number.ts
similarity index 100%
rename from src/utils/number.ts
rename to packages/utils/src/number.ts
diff --git a/src/utils/object.ts b/packages/utils/src/object.ts
similarity index 100%
rename from src/utils/object.ts
rename to packages/utils/src/object.ts
diff --git a/src/utils/parseMarkdown.ts b/packages/utils/src/parseMarkdown.ts
similarity index 100%
rename from src/utils/parseMarkdown.ts
rename to packages/utils/src/parseMarkdown.ts
diff --git a/src/utils/parseModels.test.ts b/packages/utils/src/parseModels.test.ts
similarity index 100%
rename from src/utils/parseModels.test.ts
rename to packages/utils/src/parseModels.test.ts
diff --git a/src/utils/parseModels.ts b/packages/utils/src/parseModels.ts
similarity index 98%
rename from src/utils/parseModels.ts
rename to packages/utils/src/parseModels.ts
index ec54484babc..1d0e214d1b2 100644
--- a/src/utils/parseModels.ts
+++ b/packages/utils/src/parseModels.ts
@@ -1,8 +1,9 @@
import { produce } from 'immer';
import { AiFullModelCard, AiModelType } from '@/types/aiModel';
-import { getModelPropertyWithFallback } from '@/utils/getFallbackModelProperty';
-import { merge } from '@/utils/merge';
+
+import { getModelPropertyWithFallback } from './getFallbackModelProperty';
+import { merge } from './merge';
/**
* Parse model string to add or remove models.
diff --git a/src/utils/platform.test.ts b/packages/utils/src/platform.test.ts
similarity index 98%
rename from src/utils/platform.test.ts
rename to packages/utils/src/platform.test.ts
index 8af994153e7..0182dce7bba 100644
--- a/src/utils/platform.test.ts
+++ b/packages/utils/src/platform.test.ts
@@ -1,4 +1,4 @@
-import { describe, expect, it, vi } from 'vitest';
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { isArc, isSonomaOrLaterSafari } from './platform';
diff --git a/src/utils/platform.ts b/packages/utils/src/platform.ts
similarity index 97%
rename from src/utils/platform.ts
rename to packages/utils/src/platform.ts
index 50535cea7b1..93bc1f50386 100644
--- a/src/utils/platform.ts
+++ b/packages/utils/src/platform.ts
@@ -1,6 +1,6 @@
import UAParser from 'ua-parser-js';
-import { isOnServerSide } from '@/utils/env';
+import { isOnServerSide } from './env';
export const getParser = () => {
if (isOnServerSide) return new UAParser('Node');
diff --git a/src/utils/pricing.test.ts b/packages/utils/src/pricing.test.ts
similarity index 100%
rename from src/utils/pricing.test.ts
rename to packages/utils/src/pricing.test.ts
diff --git a/src/utils/pricing.ts b/packages/utils/src/pricing.ts
similarity index 100%
rename from src/utils/pricing.ts
rename to packages/utils/src/pricing.ts
diff --git a/src/utils/promptTemplate.test.ts b/packages/utils/src/promptTemplate.test.ts
similarity index 100%
rename from src/utils/promptTemplate.test.ts
rename to packages/utils/src/promptTemplate.test.ts
diff --git a/src/utils/promptTemplate.ts b/packages/utils/src/promptTemplate.ts
similarity index 100%
rename from src/utils/promptTemplate.ts
rename to packages/utils/src/promptTemplate.ts
diff --git a/src/utils/safeParseJSON.test.ts b/packages/utils/src/safeParseJSON.test.ts
similarity index 100%
rename from src/utils/safeParseJSON.test.ts
rename to packages/utils/src/safeParseJSON.test.ts
diff --git a/src/utils/safeParseJSON.ts b/packages/utils/src/safeParseJSON.ts
similarity index 100%
rename from src/utils/safeParseJSON.ts
rename to packages/utils/src/safeParseJSON.ts
diff --git a/src/utils/sanitizeUTF8.test.ts b/packages/utils/src/sanitizeUTF8.test.ts
similarity index 94%
rename from src/utils/sanitizeUTF8.test.ts
rename to packages/utils/src/sanitizeUTF8.test.ts
index 39e30c223e4..b492a69c8b2 100644
--- a/src/utils/sanitizeUTF8.test.ts
+++ b/packages/utils/src/sanitizeUTF8.test.ts
@@ -1,3 +1,5 @@
+import { describe, expect, it } from 'vitest';
+
import { sanitizeUTF8 } from './sanitizeUTF8';
describe('UTF-8 Sanitization', () => {
diff --git a/src/utils/sanitizeUTF8.ts b/packages/utils/src/sanitizeUTF8.ts
similarity index 100%
rename from src/utils/sanitizeUTF8.ts
rename to packages/utils/src/sanitizeUTF8.ts
diff --git a/src/utils/server/__tests__/auth.test.ts b/packages/utils/src/server/__tests__/auth.test.ts
similarity index 100%
rename from src/utils/server/__tests__/auth.test.ts
rename to packages/utils/src/server/__tests__/auth.test.ts
diff --git a/src/utils/server/__tests__/geo.test.ts b/packages/utils/src/server/__tests__/geo.test.ts
similarity index 98%
rename from src/utils/server/__tests__/geo.test.ts
rename to packages/utils/src/server/__tests__/geo.test.ts
index e00a3bbaa03..9307790adb3 100644
--- a/src/utils/server/__tests__/geo.test.ts
+++ b/packages/utils/src/server/__tests__/geo.test.ts
@@ -1,7 +1,7 @@
import { geolocation } from '@vercel/functions';
import { getCountry } from 'countries-and-timezones';
import { NextRequest } from 'next/server';
-import { describe, expect, it, vi } from 'vitest';
+import { afterEach, describe, expect, it, vi } from 'vitest';
import { parseDefaultThemeFromCountry } from '../geo';
diff --git a/src/utils/server/auth.ts b/packages/utils/src/server/auth.ts
similarity index 100%
rename from src/utils/server/auth.ts
rename to packages/utils/src/server/auth.ts
diff --git a/src/utils/server/correctOIDCUrl.ts b/packages/utils/src/server/correctOIDCUrl.ts
similarity index 100%
rename from src/utils/server/correctOIDCUrl.ts
rename to packages/utils/src/server/correctOIDCUrl.ts
diff --git a/src/utils/server/geo.ts b/packages/utils/src/server/geo.ts
similarity index 100%
rename from src/utils/server/geo.ts
rename to packages/utils/src/server/geo.ts
diff --git a/src/utils/server/pageProps.ts b/packages/utils/src/server/pageProps.ts
similarity index 100%
rename from src/utils/server/pageProps.ts
rename to packages/utils/src/server/pageProps.ts
diff --git a/src/utils/server/responsive.ts b/packages/utils/src/server/responsive.ts
similarity index 100%
rename from src/utils/server/responsive.ts
rename to packages/utils/src/server/responsive.ts
diff --git a/src/utils/server/routeVariants.ts b/packages/utils/src/server/routeVariants.ts
similarity index 100%
rename from src/utils/server/routeVariants.ts
rename to packages/utils/src/server/routeVariants.ts
diff --git a/src/utils/server/xor.test.ts b/packages/utils/src/server/xor.test.ts
similarity index 98%
rename from src/utils/server/xor.test.ts
rename to packages/utils/src/server/xor.test.ts
index f489156bc1c..b9490d62b60 100644
--- a/src/utils/server/xor.test.ts
+++ b/packages/utils/src/server/xor.test.ts
@@ -1,7 +1,6 @@
import { describe, expect, it } from 'vitest';
-import { obfuscatePayloadWithXOR } from '@/utils/client/xor-obfuscation';
-
+import { obfuscatePayloadWithXOR } from '../client/xor-obfuscation';
import { getXorPayload } from './xor';
describe('getXorPayload', () => {
diff --git a/src/utils/server/xor.ts b/packages/utils/src/server/xor.ts
similarity index 100%
rename from src/utils/server/xor.ts
rename to packages/utils/src/server/xor.ts
diff --git a/src/utils/sleep.ts b/packages/utils/src/sleep.ts
similarity index 100%
rename from src/utils/sleep.ts
rename to packages/utils/src/sleep.ts
diff --git a/src/utils/storeDebug.test.ts b/packages/utils/src/storeDebug.test.ts
similarity index 100%
rename from src/utils/storeDebug.test.ts
rename to packages/utils/src/storeDebug.test.ts
diff --git a/src/utils/storeDebug.ts b/packages/utils/src/storeDebug.ts
similarity index 100%
rename from src/utils/storeDebug.ts
rename to packages/utils/src/storeDebug.ts
diff --git a/src/utils/time.test.ts b/packages/utils/src/time.test.ts
similarity index 100%
rename from src/utils/time.test.ts
rename to packages/utils/src/time.test.ts
diff --git a/src/utils/time.ts b/packages/utils/src/time.ts
similarity index 100%
rename from src/utils/time.ts
rename to packages/utils/src/time.ts
diff --git a/src/utils/tokenizer/client.ts b/packages/utils/src/tokenizer/client.ts
similarity index 100%
rename from src/utils/tokenizer/client.ts
rename to packages/utils/src/tokenizer/client.ts
diff --git a/src/utils/tokenizer/estimated.ts b/packages/utils/src/tokenizer/estimated.ts
similarity index 100%
rename from src/utils/tokenizer/estimated.ts
rename to packages/utils/src/tokenizer/estimated.ts
diff --git a/src/utils/tokenizer/index.ts b/packages/utils/src/tokenizer/index.ts
similarity index 100%
rename from src/utils/tokenizer/index.ts
rename to packages/utils/src/tokenizer/index.ts
diff --git a/src/utils/tokenizer/server.ts b/packages/utils/src/tokenizer/server.ts
similarity index 100%
rename from src/utils/tokenizer/server.ts
rename to packages/utils/src/tokenizer/server.ts
diff --git a/src/utils/tokenizer/tokenizer.worker.ts b/packages/utils/src/tokenizer/tokenizer.worker.ts
similarity index 100%
rename from src/utils/tokenizer/tokenizer.worker.ts
rename to packages/utils/src/tokenizer/tokenizer.worker.ts
diff --git a/src/utils/toolCall.ts b/packages/utils/src/toolCall.ts
similarity index 100%
rename from src/utils/toolCall.ts
rename to packages/utils/src/toolCall.ts
diff --git a/src/utils/toolManifest.ts b/packages/utils/src/toolManifest.ts
similarity index 100%
rename from src/utils/toolManifest.ts
rename to packages/utils/src/toolManifest.ts
diff --git a/src/utils/trace.ts b/packages/utils/src/trace.ts
similarity index 100%
rename from src/utils/trace.ts
rename to packages/utils/src/trace.ts
diff --git a/src/utils/units.ts b/packages/utils/src/units.ts
similarity index 100%
rename from src/utils/units.ts
rename to packages/utils/src/units.ts
diff --git a/src/utils/uploadFIle.ts b/packages/utils/src/uploadFIle.ts
similarity index 100%
rename from src/utils/uploadFIle.ts
rename to packages/utils/src/uploadFIle.ts
diff --git a/src/utils/url.test.ts b/packages/utils/src/url.test.ts
similarity index 99%
rename from src/utils/url.test.ts
rename to packages/utils/src/url.test.ts
index 0ac056155ae..4e726da10e2 100644
--- a/src/utils/url.test.ts
+++ b/packages/utils/src/url.test.ts
@@ -1,4 +1,4 @@
-import { vi } from 'vitest';
+import { describe, expect, it } from 'vitest';
import { pathString } from './url';
import { inferContentTypeFromImageUrl, inferFileExtensionFromImageUrl, isLocalUrl } from './url';
diff --git a/src/utils/url.ts b/packages/utils/src/url.ts
similarity index 100%
rename from src/utils/url.ts
rename to packages/utils/src/url.ts
diff --git a/src/utils/uuid.ts b/packages/utils/src/uuid.ts
similarity index 100%
rename from src/utils/uuid.ts
rename to packages/utils/src/uuid.ts
diff --git a/packages/utils/tests/setup.ts b/packages/utils/tests/setup.ts
new file mode 100644
index 00000000000..34065851b6a
--- /dev/null
+++ b/packages/utils/tests/setup.ts
@@ -0,0 +1,10 @@
+// only inject in the dom environment
+if (
+ // not node runtime
+ typeof window !== 'undefined' &&
+ // not edge runtime
+ typeof (globalThis as any).EdgeRuntime !== 'string'
+) {
+ // test with canvas
+ import('vitest-canvas-mock');
+}
diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts
new file mode 100644
index 00000000000..8b33852d6ec
--- /dev/null
+++ b/packages/utils/vitest.config.ts
@@ -0,0 +1,16 @@
+import { join, resolve } from 'node:path';
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ alias: {
+ /* eslint-disable sort-keys-fix/sort-keys-fix */
+ '@/types': resolve(__dirname, '../types/src'),
+ '@/const': resolve(__dirname, '../const/src'),
+ '@': resolve(__dirname, '../../src'),
+ /* eslint-enable */
+ },
+ environment: 'happy-dom',
+ setupFiles: join(__dirname, './tests/setup.ts'),
+ },
+});
diff --git a/scripts/dbmlWorkflow/index.ts b/scripts/dbmlWorkflow/index.ts
index 51485ff2de5..442249ba9f0 100644
--- a/scripts/dbmlWorkflow/index.ts
+++ b/scripts/dbmlWorkflow/index.ts
@@ -1,7 +1,7 @@
import { pgGenerate } from 'drizzle-dbml-generator';
import { join } from 'node:path';
-import * as schema from '../../src/database/schemas';
+import * as schema from '../../packages/database/src/schemas';
const out = join(__dirname, '../../docs/development/database-schema.dbml');
const relational = true;
diff --git a/scripts/migrateClientDB/compile-migrations.ts b/scripts/migrateClientDB/compile-migrations.ts
index c33e9dff5fb..1c0b057825b 100644
--- a/scripts/migrateClientDB/compile-migrations.ts
+++ b/scripts/migrateClientDB/compile-migrations.ts
@@ -2,12 +2,12 @@ import { readMigrationFiles } from 'drizzle-orm/migrator';
import { writeFileSync } from 'node:fs';
import { join } from 'node:path';
-const dbBase = join(__dirname, '../../src/database');
+const dbBase = join(__dirname, '../../packages/database');
const migrationsFolder = join(dbBase, './migrations');
const migrations = readMigrationFiles({ migrationsFolder: migrationsFolder });
writeFileSync(
- join(dbBase, './client/migrations.json'),
+ join(dbBase, './src/core/migrations.json'),
JSON.stringify(migrations, null, 2), // null, 2 adds indentation for better readability
);
diff --git a/scripts/migrateServerDB/index.ts b/scripts/migrateServerDB/index.ts
index 8412ddf45bc..94b6a06c2fb 100644
--- a/scripts/migrateServerDB/index.ts
+++ b/scripts/migrateServerDB/index.ts
@@ -10,12 +10,12 @@ import { DB_FAIL_INIT_HINT, PGVECTOR_HINT } from './errorHint';
// dotenv_config_path parameter that's passed to Node.js
dotenv.config();
-const migrationsFolder = join(__dirname, '../../src/database/migrations');
+const migrationsFolder = join(__dirname, '../../packages/database/migrations');
const isDesktop = process.env.NEXT_PUBLIC_IS_DESKTOP_APP === '1';
const runMigrations = async () => {
- const { serverDB } = await import('../../src/database/server');
+ const { serverDB } = await import('../../packages/database/src/server');
if (process.env.DATABASE_DRIVER === 'node') {
await nodeMigrate(serverDB, { migrationsFolder });
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx
index 0684f75b1fa..6d6242f9113 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx
@@ -1,9 +1,9 @@
+import { CreateNewEvalDatasets } from '@lobechat/types';
import { Button, Form, Input } from '@lobehub/ui';
import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useKnowledgeBaseStore } from '@/store/knowledgeBase';
-import { CreateNewEvalDatasets } from '@/types/eval';
interface CreateFormProps {
knowledgeBaseId: string;
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx
index 1c7c86a1c51..1be40893dae 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx
@@ -1,6 +1,7 @@
'use client';
import { ProColumns, ProTable } from '@ant-design/pro-components';
+import { EvalDatasetRecordRefFile } from '@lobechat/types';
import { ActionIcon, Button, Text } from '@lobehub/ui';
import { Upload } from 'antd';
import { createStyles } from 'antd-style';
@@ -12,7 +13,6 @@ import { Center, Flexbox } from 'react-layout-kit';
import FileIcon from '@/components/FileIcon';
import { ragEvalService } from '@/services/ragEval';
import { useKnowledgeBaseStore } from '@/store/knowledgeBase';
-import { EvalDatasetRecordRefFile } from '@/types/eval';
const createRequest = (activeDatasetId: number) => async () => {
const records = await ragEvalService.getDatasetRecords(activeDatasetId);
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx
index 6de265c0099..dfe00a26a35 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx
@@ -1,10 +1,9 @@
+import { RAGEvalDataSetItem } from '@lobechat/types';
import { createStyles } from 'antd-style';
import { parseAsInteger, useQueryState } from 'nuqs';
import { memo } from 'react';
import { Flexbox } from 'react-layout-kit';
-import { RAGEvalDataSetItem } from '@/types/eval';
-
const useStyles = createStyles(({ css, token }) => ({
active: css`
background: ${token.colorFillTertiary};
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx
index b2888a55e27..83d056a06b5 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx
@@ -1,5 +1,6 @@
'use client';
+import { RAGEvalDataSetItem } from '@lobechat/types';
import { ActionIcon } from '@lobehub/ui';
import { PlusIcon } from 'lucide-react';
import { memo } from 'react';
@@ -7,8 +8,6 @@ import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { Virtuoso } from 'react-virtuoso';
-import { RAGEvalDataSetItem } from '@/types/eval';
-
import Item from './Item';
interface DatasetListProps {
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx
index f41b0a9fe9f..460d53ef40a 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx
@@ -1,9 +1,9 @@
+import { CreateNewEvalEvaluation } from '@lobechat/types';
import { Button, Form, Input, Select, TextArea } from '@lobehub/ui';
import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useKnowledgeBaseStore } from '@/store/knowledgeBase';
-import { CreateNewEvalEvaluation } from '@/types/eval';
interface CreateFormProps {
knowledgeBaseId: string;
diff --git a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx
index 01648db8a43..fdaa53813e6 100644
--- a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx
+++ b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx
@@ -1,6 +1,7 @@
'use client';
import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
+import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@lobechat/types';
import { ActionIcon, Button, ButtonProps, Icon } from '@lobehub/ui';
import { App } from 'antd';
import { createStyles } from 'antd-style';
@@ -12,7 +13,6 @@ import { Flexbox } from 'react-layout-kit';
import { ragEvalService } from '@/services/ragEval';
import { useKnowledgeBaseStore } from '@/store/knowledgeBase';
-import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@/types/eval';
import CreateEvaluationButton from '../CreateEvaluation';
diff --git a/src/config/aiModels/mistral.ts b/src/config/aiModels/mistral.ts
index c899f099cc2..e84d57f1c7e 100644
--- a/src/config/aiModels/mistral.ts
+++ b/src/config/aiModels/mistral.ts
@@ -24,6 +24,7 @@ const mistralChatModels: AIChatModelCard[] = [
{
abilities: {
functionCall: true,
+ vision: true,
},
contextWindowTokens: 128_000,
description:
@@ -58,6 +59,7 @@ const mistralChatModels: AIChatModelCard[] = [
{
abilities: {
functionCall: true,
+ vision: true,
},
contextWindowTokens: 131_072,
description:
diff --git a/src/features/AgentSetting/store/index.ts b/src/features/AgentSetting/store/index.ts
index fd1cfe8f3a2..7d72daa0cf4 100644
--- a/src/features/AgentSetting/store/index.ts
+++ b/src/features/AgentSetting/store/index.ts
@@ -1,12 +1,11 @@
'use client';
+import { StoreApiWithSelector } from '@lobechat/types';
import { createContext } from 'zustand-utils';
import { subscribeWithSelector } from 'zustand/middleware';
import { shallow } from 'zustand/shallow';
import { createWithEqualityFn } from 'zustand/traditional';
-import { StoreApiWithSelector } from '@/utils/zustand';
-
import { Store, store } from './action';
export type { State } from './initialState';
diff --git a/src/server/routers/async/ragEval.ts b/src/server/routers/async/ragEval.ts
index 7a1895691ef..2a7d7c209af 100644
--- a/src/server/routers/async/ragEval.ts
+++ b/src/server/routers/async/ragEval.ts
@@ -1,5 +1,6 @@
import { ModelProvider } from '@lobechat/model-runtime';
import { chainAnswerWithContext } from '@lobechat/prompts';
+import { EvalEvaluationStatus } from '@lobechat/types';
import { TRPCError } from '@trpc/server';
import OpenAI from 'openai';
import { z } from 'zod';
@@ -17,7 +18,6 @@ import { asyncAuthedProcedure, asyncRouter as router } from '@/libs/trpc/async';
import { initModelRuntimeWithUserPayload } from '@/server/modules/ModelRuntime';
import { ChunkService } from '@/server/services/chunk';
import { AsyncTaskError } from '@/types/asyncTask';
-import { EvalEvaluationStatus } from '@/types/eval';
const ragEvalProcedure = asyncAuthedProcedure.use(async (opts) => {
const { ctx } = opts;
diff --git a/src/server/routers/lambda/ragEval.ts b/src/server/routers/lambda/ragEval.ts
index 2fdde6d6900..e47d3b135a1 100644
--- a/src/server/routers/lambda/ragEval.ts
+++ b/src/server/routers/lambda/ragEval.ts
@@ -1,4 +1,13 @@
/* eslint-disable sort-keys-fix/sort-keys-fix */
+import {
+ EvalDatasetRecord,
+ EvalEvaluationStatus,
+ InsertEvalDatasetRecord,
+ RAGEvalDataSetItem,
+ insertEvalDatasetRecordSchema,
+ insertEvalDatasetsSchema,
+ insertEvalEvaluationSchema,
+} from '@lobechat/types';
import { TRPCError } from '@trpc/server';
import dayjs from 'dayjs';
import JSONL from 'jsonl-parse-stringify';
@@ -17,15 +26,6 @@ import { authedProcedure, router } from '@/libs/trpc/lambda';
import { keyVaults, serverDatabase } from '@/libs/trpc/lambda/middleware';
import { createAsyncCaller } from '@/server/routers/async';
import { FileService } from '@/server/services/file';
-import {
- EvalDatasetRecord,
- EvalEvaluationStatus,
- InsertEvalDatasetRecord,
- RAGEvalDataSetItem,
- insertEvalDatasetRecordSchema,
- insertEvalDatasetsSchema,
- insertEvalEvaluationSchema,
-} from '@/types/eval';
const ragEvalProcedure = authedProcedure
.use(serverDatabase)
diff --git a/src/services/config.ts b/src/services/config.ts
index 1a02e2dbc4b..d46c8707817 100644
--- a/src/services/config.ts
+++ b/src/services/config.ts
@@ -94,7 +94,7 @@ class ConfigService {
data: any,
mode: 'pglite' | 'postgres',
): Promise => {
- const { default: json } = await import('@/database/client/migrations.json');
+ const { default: json } = await import('@/database/core/migrations.json');
const latestHash = json.at(-1)?.hash;
if (!latestHash) {
throw new Error('Not find database sql hash');
diff --git a/src/services/ragEval.ts b/src/services/ragEval.ts
index 7d35566e147..eb2b1ca0732 100644
--- a/src/services/ragEval.ts
+++ b/src/services/ragEval.ts
@@ -1,5 +1,3 @@
-import { lambdaClient } from '@/libs/trpc/client';
-import { uploadService } from '@/services/upload';
import {
CreateNewEvalDatasets,
CreateNewEvalEvaluation,
@@ -7,7 +5,10 @@ import {
RAGEvalDataSetItem,
RAGEvalEvaluationItem,
insertEvalDatasetsSchema,
-} from '@/types/eval';
+} from '@lobechat/types';
+
+import { lambdaClient } from '@/libs/trpc/client';
+import { uploadService } from '@/services/upload';
class RAGEvalService {
// Dataset
diff --git a/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts b/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts
index 7338e631c80..c5713a3bb13 100644
--- a/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts
+++ b/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts
@@ -1,3 +1,9 @@
+import {
+ CreateNewEvalDatasets,
+ EvalDatasetRecord,
+ RAGEvalDataSetItem,
+ insertEvalDatasetRecordSchema,
+} from '@lobechat/types';
import { SWRResponse, mutate } from 'swr';
import { StateCreator } from 'zustand/vanilla';
@@ -5,12 +11,6 @@ import { notification } from '@/components/AntdStaticMethods';
import { useClientDataSWR } from '@/libs/swr';
import { ragEvalService } from '@/services/ragEval';
import { KnowledgeBaseStore } from '@/store/knowledgeBase/store';
-import {
- CreateNewEvalDatasets,
- EvalDatasetRecord,
- RAGEvalDataSetItem,
- insertEvalDatasetRecordSchema,
-} from '@/types/eval';
const FETCH_DATASET_LIST_KEY = 'FETCH_DATASET_LIST';
const FETCH_DATASET_RECORD_KEY = 'FETCH_DATASET_RECORD_KEY';
diff --git a/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts b/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts
index f14ef577d52..8d28c97e565 100644
--- a/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts
+++ b/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts
@@ -1,10 +1,10 @@
+import { CreateNewEvalEvaluation, RAGEvalDataSetItem } from '@lobechat/types';
import { SWRResponse, mutate } from 'swr';
import { StateCreator } from 'zustand/vanilla';
import { useClientDataSWR } from '@/libs/swr';
import { ragEvalService } from '@/services/ragEval';
import { KnowledgeBaseStore } from '@/store/knowledgeBase/store';
-import { CreateNewEvalEvaluation, RAGEvalDataSetItem } from '@/types/eval';
const FETCH_EVALUATION_LIST_KEY = 'FETCH_EVALUATION_LIST_KEY';
diff --git a/src/store/serverConfig/store.ts b/src/store/serverConfig/store.ts
index 61082b5fbf9..5a709321fe3 100644
--- a/src/store/serverConfig/store.ts
+++ b/src/store/serverConfig/store.ts
@@ -1,3 +1,4 @@
+import { StoreApiWithSelector } from '@lobechat/types';
import { StoreApi } from 'zustand';
import { createContext } from 'zustand-utils';
import { shallow } from 'zustand/shallow';
@@ -8,7 +9,6 @@ import { DEFAULT_FEATURE_FLAGS, IFeatureFlags } from '@/config/featureFlags';
import { createDevtools } from '@/store/middleware/createDevtools';
import { GlobalServerConfig } from '@/types/serverConfig';
import { merge } from '@/utils/merge';
-import { StoreApiWithSelector } from '@/utils/zustand';
import { ServerConfigAction, createServerConfigSlice } from './action';
diff --git a/src/utils/client/switchLang.test.ts b/src/utils/client/switchLang.test.ts
index b5a20a8257a..3b2a26129b6 100644
--- a/src/utils/client/switchLang.test.ts
+++ b/src/utils/client/switchLang.test.ts
@@ -1,9 +1,9 @@
+import { setCookie } from '@lobechat/utils';
import { changeLanguage } from 'i18next';
import { describe, expect, it, vi } from 'vitest';
import { LOBE_LOCALE_COOKIE } from '@/const/locale';
import { LocaleMode } from '@/types/locale';
-import { setCookie } from '@/utils/client/cookie';
import { switchLang } from './switchLang';
@@ -11,7 +11,7 @@ vi.mock('i18next', () => ({
changeLanguage: vi.fn(),
}));
-vi.mock('./cookie', () => ({
+vi.mock('@lobechat/utils', () => ({
setCookie: vi.fn(),
}));
diff --git a/src/utils/client/switchLang.ts b/src/utils/client/switchLang.ts
index f808c38cccf..34e7739adb3 100644
--- a/src/utils/client/switchLang.ts
+++ b/src/utils/client/switchLang.ts
@@ -1,10 +1,9 @@
+import { LOBE_LOCALE_COOKIE } from '@lobechat/const';
+import { setCookie } from '@lobechat/utils';
import { changeLanguage } from 'i18next';
-import { LOBE_LOCALE_COOKIE } from '@/const/locale';
import { LocaleMode } from '@/types/locale';
-import { setCookie } from './cookie';
-
export const switchLang = (locale: LocaleMode) => {
const lang = locale === 'auto' ? navigator.language : locale;
diff --git a/tests/setup.ts b/tests/setup.ts
index 59f04de0e92..890dfd72aba 100644
--- a/tests/setup.ts
+++ b/tests/setup.ts
@@ -17,17 +17,6 @@ vi.mock('@lobehub/analytics/react', () => ({
}),
}));
-// only inject in the dom environment
-if (
- // not node runtime
- typeof window !== 'undefined' &&
- // not edge runtime
- typeof (globalThis as any).EdgeRuntime !== 'string'
-) {
- // test with canvas
- await import('vitest-canvas-mock');
-}
-
// node runtime
if (typeof window === 'undefined') {
// test with polyfill crypto
diff --git a/tsconfig.json b/tsconfig.json
index 211925d02e2..34103106393 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -20,7 +20,9 @@
"paths": {
"@/libs/model-runtime": ["./packages/model-runtime/src/index.ts"],
"@/libs/model-runtime/*": ["./packages/model-runtime/src/*"],
+ "@/database/*": ["./packages/database/src/*", "./src/database/*"],
"@/const/*": ["./packages/const/src/*"],
+ "@/utils/*": ["./packages/utils/src/*", "./src/utils/*"],
"@/types/*": ["./packages/types/src/*", "./src/types/*"],
"@/*": ["./src/*"],
"~test-utils": ["./tests/utils.tsx"]
diff --git a/vitest.config.ts b/vitest.config.ts
index a8d8c53659d..e66fc00a9a3 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -10,6 +10,12 @@ export default defineConfig({
alias: {
/* eslint-disable sort-keys-fix/sort-keys-fix */
'@/libs/model-runtime': resolve(__dirname, './packages/model-runtime/src'),
+ '@/database/_deprecated': resolve(__dirname, './src/database/_deprecated'),
+ '@/database': resolve(__dirname, './packages/database/src'),
+ '@/utils/client/switchLang': resolve(__dirname, './src/utils/client/switchLang'),
+ // TODO: after refactor the errorResponse, we can remove it
+ '@/utils/errorResponse': resolve(__dirname, './src/utils/errorResponse'),
+ '@/utils': resolve(__dirname, './packages/utils/src'),
'@/types': resolve(__dirname, './packages/types/src'),
'@/const': resolve(__dirname, './packages/const/src'),
'@': resolve(__dirname, './src'),
@@ -40,8 +46,6 @@ export default defineConfig({
'**/build/**',
'**/apps/desktop/**',
'**/packages/**',
- 'src/database/server/**/**',
- 'src/database/repositories/dataImporter/deprecated/**/**',
],
globals: true,
server: {