diff --git a/.env.example b/.env.example
index 9d986c02b873..f1b8bdf21794 100644
--- a/.env.example
+++ b/.env.example
@@ -104,6 +104,14 @@ OPENAI_API_KEY=sk-xxxxxxxxx
# MINIMAX_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+### DeepSeek AI ####
+
+# DEEPSEEK_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+### Qwen AI ####
+
+# QWEN_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
########################################
############ Market Service ############
########################################
@@ -121,3 +129,55 @@ OPENAI_API_KEY=sk-xxxxxxxxx
# set the plugin settings
# the format is `plugin-identifier:key1=value1;key2=value2`, multiple settings fields are separated by semicolons `;`, multiple plugin settings are separated by commas `,`.
# PLUGIN_SETTINGS=search-engine:SERPAPI_API_KEY=xxxxx
+
+
+########################################
+##### S3 Object Storage Service ########
+########################################
+
+# S3 keys
+#S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+#S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+
+# Bucket name
+#S3_BUCKET=lobechat
+
+# Bucket request endpoint
+#S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+
+# Public access domain for the bucket
+#NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+
+# Bucket region, such as us-west-1, generally not needed to add
+# but some service providers may require configuration
+# S3_REGION=us-west-1
+
+
+########################################
+############ Auth Service ##############
+########################################
+
+
+# Clerk related configurations
+
+# Clerk public key and secret key
+#NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxx
+#CLERK_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxxxx
+
+# you need to config the clerk webhook secret key if you want to use the clerk with database
+#CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxx
+
+
+########################################
+########## Server Database #############
+########################################
+
+# Specify the service mode as server if you want to use the server database
+#NEXT_PUBLIC_SERVICE_MODE=server
+
+# Postgres database URL
+#DATABASE_URL=postgres://username:password@host:port/database
+
+# use `openssl rand -base64 32` to generate a key for the encryption of the database
+# we use this key to encrypt the user api key
+#KEY_VAULTS_SECRET=xxxxx/xxxxxxxxxxxxxx=
diff --git a/.eslintignore b/.eslintignore
index b24520330465..a0afbcb77f1b 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -10,9 +10,8 @@ coverage
# test
jest*
-_test_
-__test__
*.test.ts
+*.test.tsx
# umi
.umi
diff --git a/.github/ISSUE_TEMPLATE/1_bug_report.yml b/.github/ISSUE_TEMPLATE/1_bug_report.yml
index 54502db117e0..da46729467f9 100644
--- a/.github/ISSUE_TEMPLATE/1_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/1_bug_report.yml
@@ -5,53 +5,64 @@ labels: ['🐛 Bug']
body:
- type: dropdown
attributes:
- label: '💻 Operating System'
+ label: '📦 Environment'
+ multiple: true
options:
- - Windows
- - macOS
- - Ubuntu
- - Other Linux
- - iOS
- - Android
- - Other
+ - 'Official Preview'
+ - 'Vercel'
+ - 'Zeabur'
+ - 'Sealos'
+ - 'Netlify'
+ - 'Docker'
+ - 'Other'
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: '📌 Version'
validations:
required: true
+
- type: dropdown
attributes:
- label: '📦 Environment'
+ label: '💻 Operating System'
+ multiple: true
options:
- - Official Preview
- - Vercel / Zeabur / Sealos
- - Docker
- - Other
+ - 'Windows'
+ - 'macOS'
+ - 'Ubuntu'
+ - 'Other Linux'
+ - 'iOS'
+ - 'Android'
+ - 'Other'
validations:
required: true
-
- type: dropdown
attributes:
label: '🌐 Browser'
+ multiple: true
options:
- - Chrome
- - Edge
- - Safari
- - Firefox
- - Other
+ - 'Chrome'
+ - 'Edge'
+ - 'Safari'
+ - 'Firefox'
+ - 'Other'
validations:
required: true
- type: textarea
attributes:
label: '🐛 Bug Description'
- description: A clear and concise description of the bug.
+ description: A clear and concise description of the bug, if the above option is `Other`, please also explain in detail.
validations:
required: true
- - type: textarea
- attributes:
- label: '🚦 Expected Behavior'
- description: A clear and concise description of what you expected to happen.
- type: textarea
attributes:
label: '📷 Recurrence Steps'
description: A clear and concise description of how to recurrence.
+ - type: textarea
+ attributes:
+ label: '🚦 Expected Behavior'
+ description: A clear and concise description of what you expected to happen.
- type: textarea
attributes:
label: '📝 Additional Information'
diff --git a/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml b/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml
index d16427e4f4b6..3580c854254b 100644
--- a/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml
+++ b/.github/ISSUE_TEMPLATE/1_bug_report_cn.yml
@@ -5,54 +5,64 @@ labels: ['🐛 Bug']
body:
- type: dropdown
attributes:
- label: '💻 系统环境'
+ label: '📦 部署环境'
+ multiple: true
options:
- - Windows
- - macOS
- - Ubuntu
- - Other Linux
- - iOS
- - Android
- - Other
+ - 'Official Preview'
+ - 'Vercel'
+ - 'Zeabur'
+ - 'Sealos'
+ - 'Netlify'
+ - 'Docker'
+ - 'Other'
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: '📌 软件版本'
validations:
required: true
- type: dropdown
attributes:
- label: '📦 部署环境'
+ label: '💻 系统环境'
+ multiple: true
options:
- - Official Preview
- - Vercel / Zeabur / Sealos
- - Docker
- - Other
+ - 'Windows'
+ - 'macOS'
+ - 'Ubuntu'
+ - 'Other Linux'
+ - 'iOS'
+ - 'Android'
+ - 'Other'
validations:
required: true
-
- type: dropdown
attributes:
label: '🌐 浏览器'
+ multiple: true
options:
- - Chrome
- - Edge
- - Safari
- - Firefox
- - Other
+ - 'Chrome'
+ - 'Edge'
+ - 'Safari'
+ - 'Firefox'
+ - 'Other'
validations:
required: true
- type: textarea
attributes:
label: '🐛 问题描述'
- description: 请提供一个清晰且简洁的问题描述。
+ description: 请提供一个清晰且简洁的问题描述,若上述选项为`Other`,也请详细说明。
validations:
required: true
- - type: textarea
- attributes:
- label: '🚦 期望结果'
- description: 请提供一个清晰且简洁的描述,说明您期望发生什么。
- type: textarea
attributes:
label: '📷 复现步骤'
description: 请提供一个清晰且简洁的描述,说明如何复现问题。
+ - type: textarea
+ attributes:
+ label: '🚦 期望结果'
+ description: 请提供一个清晰且简洁的描述,说明您期望发生什么。
- type: textarea
attributes:
label: '📝 补充信息'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b7ab5da31e15..86db21bf0544 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -8,6 +8,17 @@ jobs:
release:
name: Release
runs-on: ubuntu-latest
+
+ services:
+ postgres:
+ image: postgres:16
+ env:
+ POSTGRES_PASSWORD: postgres
+ options: >-
+ --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
+ ports:
+ - 5432:5432
+
steps:
- uses: actions/checkout@v4
@@ -22,8 +33,16 @@ jobs:
- name: Lint
run: bun run lint
- - name: Test
- run: bun run test
+ - name: Test Server Coverage
+ run: bun run test-server:coverage
+ env:
+ DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres
+ DATABASE_DRIVER: node
+ NEXT_PUBLIC_SERVICE_MODE: server
+ KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s=
+
+ - name: Test App Coverage
+ run: bun run test-app:coverage
- name: Release
run: bun run release
diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index c1e15054e0b2..abc93f81ba01 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -7,7 +7,7 @@ permissions:
on:
schedule:
- - cron: '0 * * * *' # every hour
+ - cron: '0 */6 * * *' # every 6 hours
workflow_dispatch:
jobs:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index c3a674676cd4..f67c4123b7d7 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,9 +1,23 @@
name: Test CI
+
on: [push, pull_request]
+
jobs:
test:
runs-on: ubuntu-latest
+ services:
+ postgres:
+ image: postgres:16
+ env:
+ POSTGRES_PASSWORD: postgres
+ options: >-
+ --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
+
+
+ ports:
+ - 5432:5432
+
steps:
- uses: actions/checkout@v4
@@ -18,10 +32,27 @@ jobs:
- name: Lint
run: bun run lint
- - name: Test and coverage
- run: bun run test:coverage
+ - name: Test Server Coverage
+ run: bun run test-server:coverage
+ env:
+ DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres
+ DATABASE_DRIVER: node
+ NEXT_PUBLIC_SERVICE_MODE: server
+ KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s=
+
+ - name: Upload Server coverage to Codecov
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./coverage/server/lcov.info
+ flags: server
+
+ - name: Test App Coverage
+ run: bun run test-app:coverage
- - name: Upload coverage to Codecov
+ - name: Upload App Coverage to Codecov
uses: codecov/codecov-action@v4
with:
- token: ${{ secrets.CODECOV_TOKEN }} # required
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./coverage/app/lcov.info
+ flags: app
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce459bb57a78..960298bcc71c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,2827 @@
# Changelog
+### [Version 1.1.6](https://github.com/lobehub/lobe-chat/compare/v1.1.5...v1.1.6)
+
+Released on **2024-06-23**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the server db implement.
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix incorrect baseURL for Groq in client mode.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the server db implement, closes [#2991](https://github.com/lobehub/lobe-chat/issues/2991) ([fa78599](https://github.com/lobehub/lobe-chat/commit/fa78599))
+
+#### What's fixed
+
+- **misc**: Fix incorrect baseURL for Groq in client mode, closes [#2747](https://github.com/lobehub/lobe-chat/issues/2747) ([af14225](https://github.com/lobehub/lobe-chat/commit/af14225))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.1.5](https://github.com/lobehub/lobe-chat/compare/v1.1.4...v1.1.5)
+
+Released on **2024-06-23**
+
+#### ♻ Code Refactoring
+
+- **misc**: Remove deprecated env.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Remove deprecated env, closes [#2983](https://github.com/lobehub/lobe-chat/issues/2983) ([15a681f](https://github.com/lobehub/lobe-chat/commit/15a681f))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.1.4](https://github.com/lobehub/lobe-chat/compare/v1.1.3...v1.1.4)
+
+Released on **2024-06-22**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Create first-time user on server db.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Create first-time user on server db, closes [#2977](https://github.com/lobehub/lobe-chat/issues/2977) ([6f53f35](https://github.com/lobehub/lobe-chat/commit/6f53f35))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.1.3](https://github.com/lobehub/lobe-chat/compare/v1.1.2...v1.1.3)
+
+Released on **2024-06-21**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Ollama not enabled client fetch by default.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Ollama not enabled client fetch by default, closes [#2961](https://github.com/lobehub/lobe-chat/issues/2961) ([90db48e](https://github.com/lobehub/lobe-chat/commit/90db48e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.1.2](https://github.com/lobehub/lobe-chat/compare/v1.1.1...v1.1.2)
+
+Released on **2024-06-20**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.1.1](https://github.com/lobehub/lobe-chat/compare/v1.1.0...v1.1.1)
+
+Released on **2024-06-20**
+
+#### 💄 Styles
+
+- **misc**: Fixed System Agent missing in mobile layout.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fixed System Agent missing in mobile layout, closes [#2954](https://github.com/lobehub/lobe-chat/issues/2954) ([596b9c8](https://github.com/lobehub/lobe-chat/commit/596b9c8))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 1.1.0](https://github.com/lobehub/lobe-chat/compare/v1.0.14...v1.1.0)
+
+Released on **2024-06-20**
+
+#### ✨ Features
+
+- **misc**: Supoort Claude 3.5 Sonnet.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Supoort Claude 3.5 Sonnet, closes [#2955](https://github.com/lobehub/lobe-chat/issues/2955) ([aa1d7b7](https://github.com/lobehub/lobe-chat/commit/aa1d7b7))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.14](https://github.com/lobehub/lobe-chat/compare/v1.0.13...v1.0.14)
+
+Released on **2024-06-20**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix to send image without text.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix to send image without text, closes [#2952](https://github.com/lobehub/lobe-chat/issues/2952) ([b3e915e](https://github.com/lobehub/lobe-chat/commit/b3e915e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.13](https://github.com/lobehub/lobe-chat/compare/v1.0.12...v1.0.13)
+
+Released on **2024-06-19**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix and improve tool calling.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix and improve tool calling, closes [#2941](https://github.com/lobehub/lobe-chat/issues/2941) ([ea06536](https://github.com/lobehub/lobe-chat/commit/ea06536))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.12](https://github.com/lobehub/lobe-chat/compare/v1.0.11...v1.0.12)
+
+Released on **2024-06-19**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix auto avatar.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix auto avatar, closes [#2939](https://github.com/lobehub/lobe-chat/issues/2939) ([f40300c](https://github.com/lobehub/lobe-chat/commit/f40300c))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.11](https://github.com/lobehub/lobe-chat/compare/v1.0.10...v1.0.11)
+
+Released on **2024-06-19**
+
+#### 💄 Styles
+
+- **misc**: Fix phi3 icon display under OpenRouter.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix phi3 icon display under OpenRouter, closes [#2877](https://github.com/lobehub/lobe-chat/issues/2877) ([4173015](https://github.com/lobehub/lobe-chat/commit/4173015))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.10](https://github.com/lobehub/lobe-chat/compare/v1.0.9...v1.0.10)
+
+Released on **2024-06-19**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Typo in reset settings.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Typo in reset settings, closes [#2926](https://github.com/lobehub/lobe-chat/issues/2926) ([93d460a](https://github.com/lobehub/lobe-chat/commit/93d460a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.9](https://github.com/lobehub/lobe-chat/compare/v1.0.8...v1.0.9)
+
+Released on **2024-06-19**
+
+#### 💄 Styles
+
+- **model**: Update `deepseek-coder` model.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **model**: Update `deepseek-coder` model, closes [#2927](https://github.com/lobehub/lobe-chat/issues/2927) ([c8d45e4](https://github.com/lobehub/lobe-chat/commit/c8d45e4))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.8](https://github.com/lobehub/lobe-chat/compare/v1.0.7...v1.0.8)
+
+Released on **2024-06-18**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix hydration mismatch on macOS.
+
+#### 💄 Styles
+
+- **misc**: Update brand and improve docs.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix hydration mismatch on macOS, closes [#2913](https://github.com/lobehub/lobe-chat/issues/2913) ([cd9a143](https://github.com/lobehub/lobe-chat/commit/cd9a143))
+
+#### Styles
+
+- **misc**: Update brand and improve docs, closes [#2917](https://github.com/lobehub/lobe-chat/issues/2917) ([2b54cae](https://github.com/lobehub/lobe-chat/commit/2b54cae))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.7](https://github.com/lobehub/lobe-chat/compare/v1.0.6...v1.0.7)
+
+Released on **2024-06-18**
+
+#### ♻ Code Refactoring
+
+- **misc**: Remove some i18n text.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Remove some i18n text, closes [#2862](https://github.com/lobehub/lobe-chat/issues/2862) ([1fd7d76](https://github.com/lobehub/lobe-chat/commit/1fd7d76))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.6](https://github.com/lobehub/lobe-chat/compare/v1.0.5...v1.0.6)
+
+Released on **2024-06-17**
+
+#### 💄 Styles
+
+- **misc**: Fix footer being cut on wide screen.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix footer being cut on wide screen, closes [#2905](https://github.com/lobehub/lobe-chat/issues/2905) ([3a1e0cf](https://github.com/lobehub/lobe-chat/commit/3a1e0cf))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.5](https://github.com/lobehub/lobe-chat/compare/v1.0.4...v1.0.5)
+
+Released on **2024-06-17**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix onboard and auth for community version.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix onboard and auth for community version, closes [#2908](https://github.com/lobehub/lobe-chat/issues/2908) ([b02020d](https://github.com/lobehub/lobe-chat/commit/b02020d))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.4](https://github.com/lobehub/lobe-chat/compare/v1.0.3...v1.0.4)
+
+Released on **2024-06-17**
+
+#### 💄 Styles
+
+- **misc**: Add stepfun as a new provider.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add stepfun as a new provider, closes [#2803](https://github.com/lobehub/lobe-chat/issues/2803) ([e1989a1](https://github.com/lobehub/lobe-chat/commit/e1989a1))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.3](https://github.com/lobehub/lobe-chat/compare/v1.0.2...v1.0.3)
+
+Released on **2024-06-17**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix clerk `UNAUTHORIZED` auth error.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix clerk `UNAUTHORIZED` auth error, closes [#2907](https://github.com/lobehub/lobe-chat/issues/2907) ([bb33ba4](https://github.com/lobehub/lobe-chat/commit/bb33ba4))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.2](https://github.com/lobehub/lobe-chat/compare/v1.0.1...v1.0.2)
+
+Released on **2024-06-17**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Openai key and openai proxy are invalid in feature flags.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Openai key and openai proxy are invalid in feature flags, closes [#2886](https://github.com/lobehub/lobe-chat/issues/2886) ([ec4f481](https://github.com/lobehub/lobe-chat/commit/ec4f481))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 1.0.1](https://github.com/lobehub/lobe-chat/compare/v1.0.0...v1.0.1)
+
+Released on **2024-06-17**
+
+#### 💄 Styles
+
+- **misc**: Remove r2 cdn url.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Remove r2 cdn url, closes [#2878](https://github.com/lobehub/lobe-chat/issues/2878) ([19fd4d5](https://github.com/lobehub/lobe-chat/commit/19fd4d5))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.164.0](https://github.com/lobehub/lobe-chat/compare/v0.163.0...v0.164.0)
+
+Released on **2024-06-17**
+
+#### ✨ Features
+
+- **misc**: Release LobeChat 1.0.
+
+#### 🔧 Chores
+
+- **misc**: Bump version.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Release LobeChat 1.0, closes [#2897](https://github.com/lobehub/lobe-chat/issues/2897) ([97bb377](https://github.com/lobehub/lobe-chat/commit/97bb377))
+
+#### Chores
+
+- **misc**: Bump version, closes [#2896](https://github.com/lobehub/lobe-chat/issues/2896) ([6e2d03b](https://github.com/lobehub/lobe-chat/commit/6e2d03b))
+
+
+
+#### 💥 BREAKING CHANGES
+
+- **misc**: Update LICENSE to Apache 2.0
+- **misc**: update to 1.0.0
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.163.0](https://github.com/lobehub/lobe-chat/compare/v0.162.25...v0.163.0)
+
+Released on **2024-06-17**
+
+#### ✨ Features
+
+- **misc**: Support server db mode with Postgres / Drizzle ORM / tRPC.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Support server db mode with Postgres / Drizzle ORM / tRPC, closes [#2556](https://github.com/lobehub/lobe-chat/issues/2556) ([b26afbf](https://github.com/lobehub/lobe-chat/commit/b26afbf))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.25](https://github.com/lobehub/lobe-chat/compare/v0.162.24...v0.162.25)
+
+Released on **2024-06-16**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix issues for client fetch.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix issues for client fetch, closes [#2753](https://github.com/lobehub/lobe-chat/issues/2753) ([6f5be5d](https://github.com/lobehub/lobe-chat/commit/6f5be5d))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.24](https://github.com/lobehub/lobe-chat/compare/v0.162.23...v0.162.24)
+
+Released on **2024-06-14**
+
+#### 💄 Styles
+
+- **misc**: Update error card style, Update settings footer style and about page.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Update error card style, closes [#2868](https://github.com/lobehub/lobe-chat/issues/2868) ([a9d678b](https://github.com/lobehub/lobe-chat/commit/a9d678b))
+- **misc**: Update settings footer style and about page, closes [#2846](https://github.com/lobehub/lobe-chat/issues/2846) ([d815109](https://github.com/lobehub/lobe-chat/commit/d815109))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.23](https://github.com/lobehub/lobe-chat/compare/v0.162.22...v0.162.23)
+
+Released on **2024-06-12**
+
+#### 💄 Styles
+
+- **misc**: Add Qwen2 models, Add Zhipu new models.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add Qwen2 models, closes [#2832](https://github.com/lobehub/lobe-chat/issues/2832) ([fb97be9](https://github.com/lobehub/lobe-chat/commit/fb97be9))
+- **misc**: Add Zhipu new models, closes [#2830](https://github.com/lobehub/lobe-chat/issues/2830) ([5be43f0](https://github.com/lobehub/lobe-chat/commit/5be43f0))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.22](https://github.com/lobehub/lobe-chat/compare/v0.162.21...v0.162.22)
+
+Released on **2024-06-11**
+
+#### 💄 Styles
+
+- **misc**: Expand `Clear` tooltip maxWidth.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Expand `Clear` tooltip maxWidth, closes [#2822](https://github.com/lobehub/lobe-chat/issues/2822) ([a5c3d6f](https://github.com/lobehub/lobe-chat/commit/a5c3d6f))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.21](https://github.com/lobehub/lobe-chat/compare/v0.162.20...v0.162.21)
+
+Released on **2024-06-09**
+
+#### 💄 Styles
+
+- **misc**: Do not show noDescription in new sesstion.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Do not show noDescription in new sesstion, closes [#2749](https://github.com/lobehub/lobe-chat/issues/2749) ([30b00aa](https://github.com/lobehub/lobe-chat/commit/30b00aa))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.20](https://github.com/lobehub/lobe-chat/compare/v0.162.19...v0.162.20)
+
+Released on **2024-06-08**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.19](https://github.com/lobehub/lobe-chat/compare/v0.162.18...v0.162.19)
+
+Released on **2024-06-07**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix OpenAi BaseURL in api form.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix OpenAi BaseURL in api form, closes [#2806](https://github.com/lobehub/lobe-chat/issues/2806) ([1392957](https://github.com/lobehub/lobe-chat/commit/1392957))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.18](https://github.com/lobehub/lobe-chat/compare/v0.162.17...v0.162.18)
+
+Released on **2024-06-06**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor model provider implement.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor model provider implement, closes [#2801](https://github.com/lobehub/lobe-chat/issues/2801) ([7bb4fec](https://github.com/lobehub/lobe-chat/commit/7bb4fec))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.17](https://github.com/lobehub/lobe-chat/compare/v0.162.16...v0.162.17)
+
+Released on **2024-06-04**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix `response.undefined` error with some provider.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix `response.undefined` error with some provider, closes [#2782](https://github.com/lobehub/lobe-chat/issues/2782) ([5676899](https://github.com/lobehub/lobe-chat/commit/5676899))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.16](https://github.com/lobehub/lobe-chat/compare/v0.162.15...v0.162.16)
+
+Released on **2024-06-04**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.15](https://github.com/lobehub/lobe-chat/compare/v0.162.14...v0.162.15)
+
+Released on **2024-06-03**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix send button loading on only add user message.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix send button loading on only add user message, closes [#2774](https://github.com/lobehub/lobe-chat/issues/2774) ([a7f2982](https://github.com/lobehub/lobe-chat/commit/a7f2982))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.14](https://github.com/lobehub/lobe-chat/compare/v0.162.13...v0.162.14)
+
+Released on **2024-06-03**
+
+#### 💄 Styles
+
+- **misc**: Improve loading state.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Improve loading state, closes [#2767](https://github.com/lobehub/lobe-chat/issues/2767) ([fbdfde9](https://github.com/lobehub/lobe-chat/commit/fbdfde9))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.13](https://github.com/lobehub/lobe-chat/compare/v0.162.12...v0.162.13)
+
+Released on **2024-06-01**
+
+#### 💄 Styles
+
+- **misc**: Improve config upload modal.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Improve config upload modal, closes [#2745](https://github.com/lobehub/lobe-chat/issues/2745) ([af9af9f](https://github.com/lobehub/lobe-chat/commit/af9af9f))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.12](https://github.com/lobehub/lobe-chat/compare/v0.162.11...v0.162.12)
+
+Released on **2024-05-31**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor session meta method.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor session meta method, closes [#2737](https://github.com/lobehub/lobe-chat/issues/2737) ([b103c3c](https://github.com/lobehub/lobe-chat/commit/b103c3c))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.11](https://github.com/lobehub/lobe-chat/compare/v0.162.10...v0.162.11)
+
+Released on **2024-05-29**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix import config.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix import config, closes [#2720](https://github.com/lobehub/lobe-chat/issues/2720) ([a5ddd9a](https://github.com/lobehub/lobe-chat/commit/a5ddd9a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.10](https://github.com/lobehub/lobe-chat/compare/v0.162.9...v0.162.10)
+
+Released on **2024-05-29**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the config import for server import.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the config import for server import, closes [#2718](https://github.com/lobehub/lobe-chat/issues/2718) ([d4ee64b](https://github.com/lobehub/lobe-chat/commit/d4ee64b))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.9](https://github.com/lobehub/lobe-chat/compare/v0.162.8...v0.162.9)
+
+Released on **2024-05-29**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the settings to add optimistic updating.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the settings to add optimistic updating, closes [#2709](https://github.com/lobehub/lobe-chat/issues/2709) ([fade53e](https://github.com/lobehub/lobe-chat/commit/fade53e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.8](https://github.com/lobehub/lobe-chat/compare/v0.162.7...v0.162.8)
+
+Released on **2024-05-28**
+
+#### 💄 Styles
+
+- **misc**: Add optimistic loading for image uploading.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add optimistic loading for image uploading, closes [#2700](https://github.com/lobehub/lobe-chat/issues/2700) ([f99c9ce](https://github.com/lobehub/lobe-chat/commit/f99c9ce))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.7](https://github.com/lobehub/lobe-chat/compare/v0.162.6...v0.162.7)
+
+Released on **2024-05-28**
+
+#### 💄 Styles
+
+- **misc**: Improve display of `set limited history messages`, `randomness` and `voice input`.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Improve display of `set limited history messages`, `randomness` and `voice input`, closes [#2586](https://github.com/lobehub/lobe-chat/issues/2586) ([22c9b9c](https://github.com/lobehub/lobe-chat/commit/22c9b9c))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.6](https://github.com/lobehub/lobe-chat/compare/v0.162.5...v0.162.6)
+
+Released on **2024-05-28**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix the default agent not work correctly on new device.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix the default agent not work correctly on new device, closes [#2699](https://github.com/lobehub/lobe-chat/issues/2699) ([e4c7536](https://github.com/lobehub/lobe-chat/commit/e4c7536))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.5](https://github.com/lobehub/lobe-chat/compare/v0.162.4...v0.162.5)
+
+Released on **2024-05-28**
+
+#### 💄 Styles
+
+- **misc**: Add `SYSTEM_AGENT` env.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add `SYSTEM_AGENT` env, closes [#2694](https://github.com/lobehub/lobe-chat/issues/2694) ([0dfcf8d](https://github.com/lobehub/lobe-chat/commit/0dfcf8d))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.4](https://github.com/lobehub/lobe-chat/compare/v0.162.3...v0.162.4)
+
+Released on **2024-05-28**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix auto focus issues.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix auto focus issues, closes [#2697](https://github.com/lobehub/lobe-chat/issues/2697) ([8df856e](https://github.com/lobehub/lobe-chat/commit/8df856e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.3](https://github.com/lobehub/lobe-chat/compare/v0.162.2...v0.162.3)
+
+Released on **2024-05-28**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.2](https://github.com/lobehub/lobe-chat/compare/v0.162.1...v0.162.2)
+
+Released on **2024-05-28**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor agent store data.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor agent store data, closes [#2690](https://github.com/lobehub/lobe-chat/issues/2690) ([e201937](https://github.com/lobehub/lobe-chat/commit/e201937))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.162.1](https://github.com/lobehub/lobe-chat/compare/v0.162.0...v0.162.1)
+
+Released on **2024-05-27**
+
+#### 💄 Styles
+
+- **misc**: Improve the display effect of plug-in API name and description.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Improve the display effect of plug-in API name and description, closes [#2678](https://github.com/lobehub/lobe-chat/issues/2678) ([19cd0b9](https://github.com/lobehub/lobe-chat/commit/19cd0b9))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.162.0](https://github.com/lobehub/lobe-chat/compare/v0.161.25...v0.162.0)
+
+Released on **2024-05-27**
+
+#### ✨ Features
+
+- **misc**: Support topic agent.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Support topic agent, closes [#2683](https://github.com/lobehub/lobe-chat/issues/2683) ([56865fe](https://github.com/lobehub/lobe-chat/commit/56865fe))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.25](https://github.com/lobehub/lobe-chat/compare/v0.161.24...v0.161.25)
+
+Released on **2024-05-27**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix trpc/edge path error when setting `NEXT_PUBLIC_BASE_PATH`.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix trpc/edge path error when setting `NEXT_PUBLIC_BASE_PATH`, closes [#2681](https://github.com/lobehub/lobe-chat/issues/2681) ([622b390](https://github.com/lobehub/lobe-chat/commit/622b390))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.24](https://github.com/lobehub/lobe-chat/compare/v0.161.23...v0.161.24)
+
+Released on **2024-05-27**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix the missing user id in chat compeletition and fix remove unstarred topic not working.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix the missing user id in chat compeletition and fix remove unstarred topic not working, closes [#2677](https://github.com/lobehub/lobe-chat/issues/2677) ([c9fb2de](https://github.com/lobehub/lobe-chat/commit/c9fb2de))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.23](https://github.com/lobehub/lobe-chat/compare/v0.161.22...v0.161.23)
+
+Released on **2024-05-27**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor `keyVaults` and rename `endpoint` to `baseURL`.
+
+#### 💄 Styles
+
+- **misc**: Fix PluginStore layout.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor `keyVaults` and rename `endpoint` to `baseURL`, closes [#2673](https://github.com/lobehub/lobe-chat/issues/2673) ([4049bc7](https://github.com/lobehub/lobe-chat/commit/4049bc7))
+
+#### Styles
+
+- **misc**: Fix PluginStore layout, closes [#2590](https://github.com/lobehub/lobe-chat/issues/2590) [#2511](https://github.com/lobehub/lobe-chat/issues/2511) ([e1ae39b](https://github.com/lobehub/lobe-chat/commit/e1ae39b))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.22](https://github.com/lobehub/lobe-chat/compare/v0.161.21...v0.161.22)
+
+Released on **2024-05-26**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix connection checker.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix connection checker, closes [#2672](https://github.com/lobehub/lobe-chat/issues/2672) ([bef8926](https://github.com/lobehub/lobe-chat/commit/bef8926))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.21](https://github.com/lobehub/lobe-chat/compare/v0.161.20...v0.161.21)
+
+Released on **2024-05-26**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix the batch import error.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix the batch import error, closes [#2671](https://github.com/lobehub/lobe-chat/issues/2671) ([db8f2c6](https://github.com/lobehub/lobe-chat/commit/db8f2c6))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.20](https://github.com/lobehub/lobe-chat/compare/v0.161.19...v0.161.20)
+
+Released on **2024-05-26**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix vercel build.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix vercel build, closes [#2666](https://github.com/lobehub/lobe-chat/issues/2666) ([cb70e4a](https://github.com/lobehub/lobe-chat/commit/cb70e4a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.19](https://github.com/lobehub/lobe-chat/compare/v0.161.18...v0.161.19)
+
+Released on **2024-05-25**
+
+#### 💄 Styles
+
+- **misc**: Update token tag popover style.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Update token tag popover style, closes [#2631](https://github.com/lobehub/lobe-chat/issues/2631) ([7635129](https://github.com/lobehub/lobe-chat/commit/7635129))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.18](https://github.com/lobehub/lobe-chat/compare/v0.161.17...v0.161.18)
+
+Released on **2024-05-25**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix aws log.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix aws log ([58f3ed1](https://github.com/lobehub/lobe-chat/commit/58f3ed1))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.17](https://github.com/lobehub/lobe-chat/compare/v0.161.16...v0.161.17)
+
+Released on **2024-05-25**
+
+#### ♻ Code Refactoring
+
+- **misc**: Migrate some agent config to `chatConfig`.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Migrate some agent config to `chatConfig`, closes [#2646](https://github.com/lobehub/lobe-chat/issues/2646) ([2f311dc](https://github.com/lobehub/lobe-chat/commit/2f311dc))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.16](https://github.com/lobehub/lobe-chat/compare/v0.161.15...v0.161.16)
+
+Released on **2024-05-25**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix bedrock show by default on vercel.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix bedrock show by default on vercel, closes [#2634](https://github.com/lobehub/lobe-chat/issues/2634) ([7ad3af2](https://github.com/lobehub/lobe-chat/commit/7ad3af2))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.15](https://github.com/lobehub/lobe-chat/compare/v0.161.14...v0.161.15)
+
+Released on **2024-05-24**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix avatar missing on client DB mode.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix avatar missing on client DB mode, closes [#2645](https://github.com/lobehub/lobe-chat/issues/2645) ([12726c2](https://github.com/lobehub/lobe-chat/commit/12726c2))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.14](https://github.com/lobehub/lobe-chat/compare/v0.161.13...v0.161.14)
+
+Released on **2024-05-24**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the global app status and fix PWA installer.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the global app status and fix PWA installer, closes [#2637](https://github.com/lobehub/lobe-chat/issues/2637) ([1f70305](https://github.com/lobehub/lobe-chat/commit/1f70305))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.13](https://github.com/lobehub/lobe-chat/compare/v0.161.12...v0.161.13)
+
+Released on **2024-05-24**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.12](https://github.com/lobehub/lobe-chat/compare/v0.161.11...v0.161.12)
+
+Released on **2024-05-23**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the home redirect implement.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the home redirect implement, closes [#2626](https://github.com/lobehub/lobe-chat/issues/2626) ([ab4216e](https://github.com/lobehub/lobe-chat/commit/ab4216e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.11](https://github.com/lobehub/lobe-chat/compare/v0.161.10...v0.161.11)
+
+Released on **2024-05-23**
+
+#### 💄 Styles
+
+- **misc**: Improve PWA install guide.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Improve PWA install guide, closes [#2617](https://github.com/lobehub/lobe-chat/issues/2617) ([7fee545](https://github.com/lobehub/lobe-chat/commit/7fee545))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.10](https://github.com/lobehub/lobe-chat/compare/v0.161.9...v0.161.10)
+
+Released on **2024-05-23**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Refactor user store and fix custom model list form.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Refactor user store and fix custom model list form, closes [#2620](https://github.com/lobehub/lobe-chat/issues/2620) ([81ea886](https://github.com/lobehub/lobe-chat/commit/81ea886))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.9](https://github.com/lobehub/lobe-chat/compare/v0.161.8...v0.161.9)
+
+Released on **2024-05-23**
+
+#### 💄 Styles
+
+- **misc**: Fix image style and improve drag upload box.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix image style and improve drag upload box, closes [#2610](https://github.com/lobehub/lobe-chat/issues/2610) ([5e1a4d6](https://github.com/lobehub/lobe-chat/commit/5e1a4d6))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.8](https://github.com/lobehub/lobe-chat/compare/v0.161.7...v0.161.8)
+
+Released on **2024-05-22**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.7](https://github.com/lobehub/lobe-chat/compare/v0.161.6...v0.161.7)
+
+Released on **2024-05-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor to serverDB ENV.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor to serverDB ENV, closes [#2612](https://github.com/lobehub/lobe-chat/issues/2612) ([fa1409e](https://github.com/lobehub/lobe-chat/commit/fa1409e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.6](https://github.com/lobehub/lobe-chat/compare/v0.161.5...v0.161.6)
+
+Released on **2024-05-22**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.5](https://github.com/lobehub/lobe-chat/compare/v0.161.4...v0.161.5)
+
+Released on **2024-05-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Move feature flags ENV.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Move feature flags ENV, closes [#2605](https://github.com/lobehub/lobe-chat/issues/2605) ([054a404](https://github.com/lobehub/lobe-chat/commit/054a404))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.4](https://github.com/lobehub/lobe-chat/compare/v0.161.3...v0.161.4)
+
+Released on **2024-05-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the app ENV.
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix market and plugin cache.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the app ENV, closes [#2604](https://github.com/lobehub/lobe-chat/issues/2604) ([acc0fdc](https://github.com/lobehub/lobe-chat/commit/acc0fdc))
+
+#### What's fixed
+
+- **misc**: Fix market and plugin cache, closes [#2608](https://github.com/lobehub/lobe-chat/issues/2608) ([a3f161e](https://github.com/lobehub/lobe-chat/commit/a3f161e))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.3](https://github.com/lobehub/lobe-chat/compare/v0.161.2...v0.161.3)
+
+Released on **2024-05-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the langfuse env.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the langfuse env, closes [#2602](https://github.com/lobehub/lobe-chat/issues/2602) ([cbebfbc](https://github.com/lobehub/lobe-chat/commit/cbebfbc))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.2](https://github.com/lobehub/lobe-chat/compare/v0.161.1...v0.161.2)
+
+Released on **2024-05-22**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the llm env.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the llm env, closes [#2592](https://github.com/lobehub/lobe-chat/issues/2592) ([5eb225a](https://github.com/lobehub/lobe-chat/commit/5eb225a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.161.1](https://github.com/lobehub/lobe-chat/compare/v0.161.0...v0.161.1)
+
+Released on **2024-05-22**
+
+#### 💄 Styles
+
+- **misc**: Fix setting modal style problem.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix setting modal style problem, closes [#2599](https://github.com/lobehub/lobe-chat/issues/2599) ([1a3f8f3](https://github.com/lobehub/lobe-chat/commit/1a3f8f3))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.161.0](https://github.com/lobehub/lobe-chat/compare/v0.160.8...v0.161.0)
+
+Released on **2024-05-21**
+
+#### ✨ Features
+
+- **misc**: Add system agent to select another model provider for translation.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Add system agent to select another model provider for translation, closes [#1902](https://github.com/lobehub/lobe-chat/issues/1902) ([3945387](https://github.com/lobehub/lobe-chat/commit/3945387))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.8](https://github.com/lobehub/lobe-chat/compare/v0.160.7...v0.160.8)
+
+Released on **2024-05-21**
+
+#### 💄 Styles
+
+- **misc**: `Tooltip` should not be selected & Model selector overlaps with reset button.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: `Tooltip` should not be selected & Model selector overlaps with reset button, closes [#2500](https://github.com/lobehub/lobe-chat/issues/2500) [#2511](https://github.com/lobehub/lobe-chat/issues/2511) [#2581](https://github.com/lobehub/lobe-chat/issues/2581) ([0c62fb7](https://github.com/lobehub/lobe-chat/commit/0c62fb7))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.7](https://github.com/lobehub/lobe-chat/compare/v0.160.6...v0.160.7)
+
+Released on **2024-05-21**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix duplicate model panel key.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix duplicate model panel key, closes [#2591](https://github.com/lobehub/lobe-chat/issues/2591) ([c733fcf](https://github.com/lobehub/lobe-chat/commit/c733fcf))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.6](https://github.com/lobehub/lobe-chat/compare/v0.160.5...v0.160.6)
+
+Released on **2024-05-21**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor a Notification component, refactor code, refactor message action, refactor the type, refactor user preference.
+
+#### 💄 Styles
+
+- **misc**: Add ENABLED_OPENAI env, add fetch error notification, improve openai fetch client switch, improve redirect when login.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor a Notification component ([28db3d5](https://github.com/lobehub/lobe-chat/commit/28db3d5))
+- **misc**: Refactor code, closes [#2584](https://github.com/lobehub/lobe-chat/issues/2584) ([086244c](https://github.com/lobehub/lobe-chat/commit/086244c))
+- **misc**: Refactor message action ([224bd67](https://github.com/lobehub/lobe-chat/commit/224bd67))
+- **misc**: Refactor the type ([ddf1abf](https://github.com/lobehub/lobe-chat/commit/ddf1abf))
+- **misc**: Refactor user preference ([1823b0d](https://github.com/lobehub/lobe-chat/commit/1823b0d))
+
+#### Styles
+
+- **misc**: Add ENABLED_OPENAI env ([35f6230](https://github.com/lobehub/lobe-chat/commit/35f6230))
+- **misc**: Add fetch error notification ([0186b4b](https://github.com/lobehub/lobe-chat/commit/0186b4b))
+- **misc**: Improve openai fetch client switch ([3cad470](https://github.com/lobehub/lobe-chat/commit/3cad470))
+- **misc**: Improve redirect when login ([cb26655](https://github.com/lobehub/lobe-chat/commit/cb26655))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.5](https://github.com/lobehub/lobe-chat/compare/v0.160.4...v0.160.5)
+
+Released on **2024-05-20**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor analytics env.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor analytics env, closes [#2570](https://github.com/lobehub/lobe-chat/issues/2570) ([d809d3f](https://github.com/lobehub/lobe-chat/commit/d809d3f))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.4](https://github.com/lobehub/lobe-chat/compare/v0.160.3...v0.160.4)
+
+Released on **2024-05-20**
+
+#### 💄 Styles
+
+- **misc**: Modify bedrock provided model.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Modify bedrock provided model, closes [#2473](https://github.com/lobehub/lobe-chat/issues/2473) ([a1fabf6](https://github.com/lobehub/lobe-chat/commit/a1fabf6))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.3](https://github.com/lobehub/lobe-chat/compare/v0.160.2...v0.160.3)
+
+Released on **2024-05-19**
+
+#### 💄 Styles
+
+- **misc**: Add two feature flags: check_updates 、welcome_suggest.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add two feature flags: check_updates 、welcome_suggest, closes [#2555](https://github.com/lobehub/lobe-chat/issues/2555) ([84c69c9](https://github.com/lobehub/lobe-chat/commit/84c69c9))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.2](https://github.com/lobehub/lobe-chat/compare/v0.160.1...v0.160.2)
+
+Released on **2024-05-19**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Upgrade antd and fix lint type.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Upgrade antd and fix lint type, closes [#2567](https://github.com/lobehub/lobe-chat/issues/2567) ([efe28da](https://github.com/lobehub/lobe-chat/commit/efe28da))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.160.1](https://github.com/lobehub/lobe-chat/compare/v0.160.0...v0.160.1)
+
+Released on **2024-05-18**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix enable ollama env.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix enable ollama env ([9c3f5a8](https://github.com/lobehub/lobe-chat/commit/9c3f5a8))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.160.0](https://github.com/lobehub/lobe-chat/compare/v0.159.12...v0.160.0)
+
+Released on **2024-05-18**
+
+#### ✨ Features
+
+- **misc**: Bump version and add enable ollama env.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Bump version and add enable ollama env, closes [#2554](https://github.com/lobehub/lobe-chat/issues/2554) ([f5ce7c9](https://github.com/lobehub/lobe-chat/commit/f5ce7c9))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.12](https://github.com/lobehub/lobe-chat/compare/v0.159.11...v0.159.12)
+
+Released on **2024-05-15**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor the create message flow to fix some bugs.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor the create message flow to fix some bugs, closes [#2521](https://github.com/lobehub/lobe-chat/issues/2521) ([7263a33](https://github.com/lobehub/lobe-chat/commit/7263a33))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.11](https://github.com/lobehub/lobe-chat/compare/v0.159.10...v0.159.11)
+
+Released on **2024-05-15**
+
+#### 💄 Styles
+
+- **misc**: Add Gemini 1.5 Flash model.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add Gemini 1.5 Flash model, closes [#2507](https://github.com/lobehub/lobe-chat/issues/2507) ([5568472](https://github.com/lobehub/lobe-chat/commit/5568472))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.10](https://github.com/lobehub/lobe-chat/compare/v0.159.9...v0.159.10)
+
+Released on **2024-05-15**
+
+#### 💄 Styles
+
+- **misc**: Fix setting modal on responsive and some other style problem.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix setting modal on responsive and some other style problem, closes [#2512](https://github.com/lobehub/lobe-chat/issues/2512) ([f6b4ca4](https://github.com/lobehub/lobe-chat/commit/f6b4ca4))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.9](https://github.com/lobehub/lobe-chat/compare/v0.159.8...v0.159.9)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix agent config on page init.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix agent config on page init, closes [#2506](https://github.com/lobehub/lobe-chat/issues/2506) ([90e742d](https://github.com/lobehub/lobe-chat/commit/90e742d))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.8](https://github.com/lobehub/lobe-chat/compare/v0.159.7...v0.159.8)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix retry issue when hide page.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix retry issue when hide page, closes [#2503](https://github.com/lobehub/lobe-chat/issues/2503) ([24489bc](https://github.com/lobehub/lobe-chat/commit/24489bc))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.7](https://github.com/lobehub/lobe-chat/compare/v0.159.6...v0.159.7)
+
+Released on **2024-05-14**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.6](https://github.com/lobehub/lobe-chat/compare/v0.159.5...v0.159.6)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Login button not show on user panel.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Login button not show on user panel, closes [#2496](https://github.com/lobehub/lobe-chat/issues/2496) ([39637fb](https://github.com/lobehub/lobe-chat/commit/39637fb))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.5](https://github.com/lobehub/lobe-chat/compare/v0.159.4...v0.159.5)
+
+Released on **2024-05-14**
+
+#### 💄 Styles
+
+- **misc**: Fix scroll and expand.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix scroll and expand, closes [#2470](https://github.com/lobehub/lobe-chat/issues/2470) ([8b1202a](https://github.com/lobehub/lobe-chat/commit/8b1202a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.4](https://github.com/lobehub/lobe-chat/compare/v0.159.3...v0.159.4)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Refresh model config form & mobile footer button lost.
+
+#### 💄 Styles
+
+- **misc**: Add GPT-4o model, update perplexity models, updates 01.AI model list.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Refresh model config form & mobile footer button lost, closes [#2318](https://github.com/lobehub/lobe-chat/issues/2318) [#2319](https://github.com/lobehub/lobe-chat/issues/2319) [#1811](https://github.com/lobehub/lobe-chat/issues/1811) ([eadcefc](https://github.com/lobehub/lobe-chat/commit/eadcefc))
+
+#### Styles
+
+- **misc**: Add GPT-4o model, closes [#2481](https://github.com/lobehub/lobe-chat/issues/2481) ([ae6a03f](https://github.com/lobehub/lobe-chat/commit/ae6a03f))
+- **misc**: Update perplexity models, closes [#2469](https://github.com/lobehub/lobe-chat/issues/2469) ([488cde7](https://github.com/lobehub/lobe-chat/commit/488cde7))
+- **misc**: Updates 01.AI model list, closes [#2471](https://github.com/lobehub/lobe-chat/issues/2471) ([f28711a](https://github.com/lobehub/lobe-chat/commit/f28711a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.3](https://github.com/lobehub/lobe-chat/compare/v0.159.2...v0.159.3)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix DeepSeek using wrong model ID.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix DeepSeek using wrong model ID, closes [#2484](https://github.com/lobehub/lobe-chat/issues/2484) ([465dbfc](https://github.com/lobehub/lobe-chat/commit/465dbfc))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.2](https://github.com/lobehub/lobe-chat/compare/v0.159.1...v0.159.2)
+
+Released on **2024-05-14**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Dragging text mistakenly as image.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Dragging text mistakenly as image, closes [#2111](https://github.com/lobehub/lobe-chat/issues/2111) ([3c047ef](https://github.com/lobehub/lobe-chat/commit/3c047ef))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.159.1](https://github.com/lobehub/lobe-chat/compare/v0.159.0...v0.159.1)
+
+Released on **2024-05-14**
+
+#### ♻ Code Refactoring
+
+- **misc**: Move next-auth hooks to user store actions.
+
+#### 🐛 Bug Fixes
+
+- **misc**: Pin `antd@5.17.0` to fix build error.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Move next-auth hooks to user store actions, closes [#2364](https://github.com/lobehub/lobe-chat/issues/2364) ([6dbcd70](https://github.com/lobehub/lobe-chat/commit/6dbcd70))
+
+#### What's fixed
+
+- **misc**: Pin `antd@5.17.0` to fix build error, closes [#2483](https://github.com/lobehub/lobe-chat/issues/2483) ([aa03833](https://github.com/lobehub/lobe-chat/commit/aa03833))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.159.0](https://github.com/lobehub/lobe-chat/compare/v0.158.2...v0.159.0)
+
+Released on **2024-05-14**
+
+#### ✨ Features
+
+- **misc**: Support DeepSeek as new model provider.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Support DeepSeek as new model provider, closes [#2446](https://github.com/lobehub/lobe-chat/issues/2446) ([18028f3](https://github.com/lobehub/lobe-chat/commit/18028f3))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.158.2](https://github.com/lobehub/lobe-chat/compare/v0.158.1...v0.158.2)
+
+Released on **2024-05-13**
+
+#### 💄 Styles
+
+- **misc**: Fix TelemetryNotification zindex.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Fix TelemetryNotification zindex, closes [#2476](https://github.com/lobehub/lobe-chat/issues/2476) ([54524ab](https://github.com/lobehub/lobe-chat/commit/54524ab))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.158.1](https://github.com/lobehub/lobe-chat/compare/v0.158.0...v0.158.1)
+
+Released on **2024-05-13**
+
+#### 💄 Styles
+
+- **misc**: Add PWA install and metadata & ld generate.
+
+
+
+
+Improvements and Fixes
+
+#### Styles
+
+- **misc**: Add PWA install and metadata & ld generate, closes [#2438](https://github.com/lobehub/lobe-chat/issues/2438) ([6e9c69a](https://github.com/lobehub/lobe-chat/commit/6e9c69a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.158.0](https://github.com/lobehub/lobe-chat/compare/v0.157.2...v0.158.0)
+
+Released on **2024-05-13**
+
+#### ✨ Features
+
+- **misc**: Add user profile page.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: Add user profile page, closes [#2433](https://github.com/lobehub/lobe-chat/issues/2433) ([91f7294](https://github.com/lobehub/lobe-chat/commit/91f7294))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.157.2](https://github.com/lobehub/lobe-chat/compare/v0.157.1...v0.157.2)
+
+Released on **2024-05-13**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix azure openai stream.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix azure openai stream, closes [#2465](https://github.com/lobehub/lobe-chat/issues/2465) ([760fe67](https://github.com/lobehub/lobe-chat/commit/760fe67))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.157.1](https://github.com/lobehub/lobe-chat/compare/v0.157.0...v0.157.1)
+
+Released on **2024-05-12**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix dalle error.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix dalle error ([7c493de](https://github.com/lobehub/lobe-chat/commit/7c493de))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.157.0](https://github.com/lobehub/lobe-chat/compare/v0.156.2...v0.157.0)
+
+Released on **2024-05-11**
+
+#### ✨ Features
+
+- **misc**: upgrade to the new `tool calls` mode.
+
+
+
+
+Improvements and Fixes
+
+#### What's improved
+
+- **misc**: upgrade to the new `tool calls` mode, closes [#2414](https://github.com/lobehub/lobe-chat/issues/2414) ([7404f3b](https://github.com/lobehub/lobe-chat/commit/7404f3b))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.156.2](https://github.com/lobehub/lobe-chat/compare/v0.156.1...v0.156.2)
+
+Released on **2024-05-10**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.156.1](https://github.com/lobehub/lobe-chat/compare/v0.156.0...v0.156.1)
+
+Released on **2024-05-10**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Azure OpenAI Vision models issue.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Azure OpenAI Vision models issue, closes [#2429](https://github.com/lobehub/lobe-chat/issues/2429) ([9b8a4b1](https://github.com/lobehub/lobe-chat/commit/9b8a4b1))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+## [Version 0.156.0](https://github.com/lobehub/lobe-chat/compare/v0.155.9...v0.156.0)
+
+Released on **2024-05-09**
+
+#### ♻ Code Refactoring
+
+- **misc**: Refactor to improve provider locale.
+
+#### ✨ Features
+
+- **misc**: Support perplexity proxy url.
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix anthropic messages need pairs, fix parameter conditions for perplexity, fix Perplexity duplicate token.
+
+#### 💄 Styles
+
+- **misc**: Improve groq location error, improve location error, improve model provider ux, support groq proxy url.
+
+
+
+
+Improvements and Fixes
+
+#### Code refactoring
+
+- **misc**: Refactor to improve provider locale ([538b7bc](https://github.com/lobehub/lobe-chat/commit/538b7bc))
+
+#### What's improved
+
+- **misc**: Support perplexity proxy url ([30bbe61](https://github.com/lobehub/lobe-chat/commit/30bbe61))
+
+#### What's fixed
+
+- **misc**: Fix anthropic messages need pairs ([0e01db0](https://github.com/lobehub/lobe-chat/commit/0e01db0))
+- **misc**: Fix parameter conditions for perplexity ([156cf5f](https://github.com/lobehub/lobe-chat/commit/156cf5f))
+- **misc**: Fix Perplexity duplicate token ([6695c4b](https://github.com/lobehub/lobe-chat/commit/6695c4b))
+
+#### Styles
+
+- **misc**: Improve groq location error ([023c21b](https://github.com/lobehub/lobe-chat/commit/023c21b))
+- **misc**: Improve location error ([862c0ae](https://github.com/lobehub/lobe-chat/commit/862c0ae))
+- **misc**: Improve model provider ux, closes [#2439](https://github.com/lobehub/lobe-chat/issues/2439) ([0deb079](https://github.com/lobehub/lobe-chat/commit/0deb079))
+- **misc**: Support groq proxy url ([ba1ba2a](https://github.com/lobehub/lobe-chat/commit/ba1ba2a))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.9](https://github.com/lobehub/lobe-chat/compare/v0.155.8...v0.155.9)
+
+Released on **2024-05-09**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.8](https://github.com/lobehub/lobe-chat/compare/v0.155.7...v0.155.8)
+
+Released on **2024-05-09**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix mobile session style.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix mobile session style ([998a191](https://github.com/lobehub/lobe-chat/commit/998a191))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.7](https://github.com/lobehub/lobe-chat/compare/v0.155.6...v0.155.7)
+
+Released on **2024-05-08**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix panel expand.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix panel expand ([5e78089](https://github.com/lobehub/lobe-chat/commit/5e78089))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.6](https://github.com/lobehub/lobe-chat/compare/v0.155.5...v0.155.6)
+
+Released on **2024-05-08**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix editing long message issue.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix editing long message issue, closes [#2431](https://github.com/lobehub/lobe-chat/issues/2431) ([380d8da](https://github.com/lobehub/lobe-chat/commit/380d8da))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.5](https://github.com/lobehub/lobe-chat/compare/v0.155.4...v0.155.5)
+
+Released on **2024-05-08**
+
+
+
+
+Improvements and Fixes
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
+### [Version 0.155.4](https://github.com/lobehub/lobe-chat/compare/v0.155.3...v0.155.4)
+
+Released on **2024-05-08**
+
+#### 🐛 Bug Fixes
+
+- **misc**: Fix Agent Settings Form.
+
+
+
+
+Improvements and Fixes
+
+#### What's fixed
+
+- **misc**: Fix Agent Settings Form ([12c62a0](https://github.com/lobehub/lobe-chat/commit/12c62a0))
+
+
+
+
+
+[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
+
+
+
### [Version 0.155.3](https://github.com/lobehub/lobe-chat/compare/v0.155.2...v0.155.3)
Released on **2024-05-08**
diff --git a/Dockerfile b/Dockerfile
index 0f3bd32a20fb..6ace0247d4cd 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -44,8 +44,11 @@ ENV NEXT_PUBLIC_ANALYTICS_UMAMI ""
ENV NEXT_PUBLIC_UMAMI_SCRIPT_URL ""
ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID ""
+# Node
+ENV NODE_OPTIONS "--max-old-space-size=8192"
-RUN pnpm run build:docker # run build standalone for docker version
+# run build standalone for docker version
+RUN npm run build:docker
## Production image, copy all the files and run next
FROM base AS runner
@@ -126,4 +129,10 @@ ENV TOGETHERAI_API_KEY ""
# Minimax
ENV MINIMAX_API_KEY ""
+# DeepSeek
+ENV DEEPSEEK_API_KEY ""
+
+# Qwen
+ENV QWEN_API_KEY ""
+
CMD ["node", "server.js"]
diff --git a/LICENSE b/LICENSE
index 3d6b955bf5ee..4704b86e70a5 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,38 @@
-MIT License
-
-Copyright (c) 2023 - current LobeHub
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+Apache License Version 2.0
+
+Copyright (c) 2024/06/17 - current LobeHub LLC. All rights reserved.
+
+----------
+
+From 1.0, LobeChat is licensed under the Apache License 2.0, with the following additional conditions:
+
+1. The commercial usage of LobeChat:
+
+ a. LobeChat may be utilized commercially, including as a frontend and backend service without modifying the source code.
+
+ b. a commercial license must be obtained from the producer if you want to develop and distribute a derivative work based on LobeChat.
+
+Please contact hello@lobehub.com by email to inquire about licensing matters.
+
+
+2. As a contributor, you should agree that:
+
+ a. The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary.
+
+ b. Your contributed code may be used for commercial purposes, including but not limited to its cloud edition.
+
+Apart from the specific conditions mentioned above, all other rights and restrictions follow the Apache License 2.0. Detailed information about the Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0.
+
+----------
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/README.md b/README.md
index c4a96a82902f..f28f37c8e8bc 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ An open-source, modern-design ChatGPT/LLMs UI/Framework.
Supports speech-synthesis, multi-modal, and extensible ([function call][docs-functionc-call]) plugin system.
One-click **FREE** deployment of your private OpenAI ChatGPT/Claude/Gemini/Groq/Ollama chat application.
-**English** · [简体中文](./README.zh-CN.md) · [Changelog](./CHANGELOG.md) · [Documents][docs] · [Report Bug][github-issues-link] · [Request Feature][github-issues-link]
+**English** · [简体中文](./README.zh-CN.md) · [Official Site][official-site] · [Changelog](./CHANGELOG.md) · [Documents][docs] · [Blog][blog] · [Feedback][github-issues-link]
@@ -59,9 +59,11 @@ One-click **FREE** deployment of your private OpenAI ChatGPT/Claude/Gemini/Groq/
- [`5` Text to Image Generation](#5-text-to-image-generation)
- [`6` Plugin System (Function Calling)](#6-plugin-system-function-calling)
- [`7` Agent Market (GPTs)](#7-agent-market-gpts)
- - [`8` Progressive Web App (PWA)](#8-progressive-web-app-pwa)
- - [`9` Mobile Device Adaptation](#9-mobile-device-adaptation)
- - [`10` Custom Themes](#10-custom-themes)
+ - [`8` Support Local / Remote Database](#8-support-local--remote-database)
+ - [`9` Support Multi-User Management](#9-support-multi-user-management)
+ - [`10` Progressive Web App (PWA)](#10-progressive-web-app-pwa)
+ - [`11` Mobile Device Adaptation](#11-mobile-device-adaptation)
+ - [`12` Custom Themes](#12-custom-themes)
- [`*` What's more](#-whats-more)
- [⚡️ Performance](#️-performance)
- [🛳 Self Hosting](#-self-hosting)
@@ -130,6 +132,8 @@ We have implemented support for the following model service providers:
- **ChatGLM**: Added the **ChatGLM** series models from Zhipuai (GLM-4/GLM-4-vision/GLM-3-turbo), providing users with another efficient conversation model choice. [Learn more](https://www.zhipuai.cn/)
- **Moonshot AI (Dark Side of the Moon)**: Integrated with the Moonshot series models, an innovative AI startup from China, aiming to provide deeper conversation understanding. [Learn more](https://www.moonshot.cn/)
- **Minimax**: Integrated the Minimax models, including the MoE model **abab6**, offers a broader range of choices. [Learn more](https://www.minimaxi.com/)
+- **DeepSeek**: Integrated with the DeepSeek series models, an innovative AI startup from China, The product has been designed to provide a model that balances performance with price. [Learn more](https://www.deepseek.com/)
+- **Qwen**: Integrated the Qwen series models, including the latest **qwen-turbo**, **qwen-plus** and **qwen-max**. [Lean more](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction)
At the same time, we are also planning to support more model service providers, such as Replicate and Perplexity, to further enrich our service provider library. If you would like LobeChat to support your favorite service provider, feel free to join our [community discussion](https://github.com/lobehub/lobe-chat/discussions/1284).
@@ -222,14 +226,14 @@ In addition, these plugins are not limited to news aggregation, but can also ext
-| Recent Submits | Description |
-| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
-| [Search1API](https://chat-preview.lobehub.com/settings/agent)By **fatwang2** on **2024-05-06** | Search aggregation service, specifically designed for LLMs `web` `search` |
-| [Social Search](https://chat-preview.lobehub.com/settings/agent)By **say-apps** on **2024-05-02** | The Social Search provides access to tweets, users, followers, images, media and more. `social` `twitter` `x` `search` |
-| [Search Google via Serper](https://chat-preview.lobehub.com/settings/agent)By **Barry** on **2024-04-30** | Google search engine via Serper.dev free API (2500x🆓/month) `web` `search` |
-| [NFT Guru](https://chat-preview.lobehub.com/settings/agent)By **swap** on **2024-04-03** | Discover current prices of NFTs across major platforms and keep track of the rapidly changing marketplace with real-time `crypto` `nft` |
+| Recent Submits | Description |
+| ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| [Social Search](https://chat-preview.lobehub.com/settings/agent)By **say-apps** on **2024-06-02** | The Social Search provides access to tweets, users, followers, images, media and more. `social` `twitter` `x` `search` |
+| [Space](https://chat-preview.lobehub.com/settings/agent)By **automateyournetwork** on **2024-05-12** | Space data including NASA. `space` `nasa` |
+| [Search1API](https://chat-preview.lobehub.com/settings/agent)By **fatwang2** on **2024-05-06** | Search aggregation service, specifically designed for LLMs `web` `search` |
+| [Search Google via Serper](https://chat-preview.lobehub.com/settings/agent)By **Barry** on **2024-04-30** | Google search engine via Serper.dev free API (2500x🆓/month) `web` `search` |
-> 📊 Total plugins: [**57** ](https://github.com/lobehub/lobe-chat-plugins)
+> 📊 Total plugins: [**52** ](https://github.com/lobehub/lobe-chat-plugins)
@@ -261,14 +265,14 @@ Our marketplace is not just a showcase platform but also a collaborative space.
-| Recent Submits | Description |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [Video to Blog Post Assistant](https://chat-preview.lobehub.com/market?agent=video-2-blog-assistant)By **[yayoinoyume](https://github.com/yayoinoyume)** on **2024-05-06** | Helps you quickly organize messy subtitles into beautiful blog posts `subtitle-organization` `blog-post-formatting` `video-to-blog` |
-| [Art Evaluation Tutor](https://chat-preview.lobehub.com/market?agent=wanwusheng-art)By **[dingyufei615](https://github.com/dingyufei615)** on **2024-05-06** | Specializes in teaching children's art, meticulously evaluates works, pays attention to details, and adapts to students of different age groups. `art-education` `evaluation` `creativity` `teaching` `painting` |
-| [iOS Code Artist](https://chat-preview.lobehub.com/market?agent=ios-develop)By **[Alcu1n](https://github.com/Alcu1n)** on **2024-05-03** | iOS development expert with 15 years of experience, proficient in Swift, SwiftUI, Flutter. Clear logic in code, precise debugging, providing project frameworks from 0 to 1. `i-os-development` `coding` `debugging` `project-planning` `logical-thinking` |
-| [Sales Description Specialist](https://chat-preview.lobehub.com/market?agent=verkauf-kleinanzeigen)By **[highseen](https://github.com/highseen)** on **2024-04-30** | Assists in the sale of used items through research, pricing, description, and title creation. `product-sales` `research` `description` |
+| Recent Submits | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [Fastapi Project Development Assistant](https://chat-preview.lobehub.com/market?agent=fastapi-development)By **[xwxw098](https://github.com/xwxw098)** on **2024-06-19** | Proficient in Python modular development, skilled in using FastAPI, PostgreSQL, Tortoise-ORM, and other technologies, able to provide clear code structure and detailed comments for large projects. `fast-api` `python` `modular-development` |
+| [IT Systems Architect](https://chat-preview.lobehub.com/market?agent=it-system-architect)By **[a562314](https://github.com/a562314)** on **2024-06-19** | Senior IT architect specializing in requirements analysis, system design, technology selection, and cross-platform system optimization. With over 5 years of experience, proficient in Windows, macOS, and Linux operating systems, skilled in troubleshooting, and security protection. `it-architecture-design` `problem-solving` `agile-development` `system-optimization` `cross-platform-skills` `teamwork` |
+| [Linux Kernel Expert](https://chat-preview.lobehub.com/market?agent=linux-kernel)By **[wming126](https://github.com/wming126)** on **2024-06-19** | Role Description: I am an expert in Linux kernel, with a deep understanding and analytical ability of the latest kernel source code (as of June 2024). I can provide users with detailed and accurate information about the Linux kernel. `linux` `kernel` |
+| [NovelAI Drawing Assistant](https://chat-preview.lobehub.com/market?agent=novel-ai-pormpt-helper)By **[WallBreakerNO4](https://github.com/WallBreakerNO4)** on **2024-06-18** | I can turn the scenes you describe into prompts for NovelAI `deep-learning` `image-generation` `algorithm` `prompt` |
-> 📊 Total agents: [**247** ](https://github.com/lobehub/lobe-chat-agents)
+> 📊 Total agents: [**292** ](https://github.com/lobehub/lobe-chat-agents)
@@ -278,9 +282,44 @@ Our marketplace is not just a showcase platform but also a collaborative space.
+[![][image-feat-database]][docs-feat-database]
+
+### `8` [Support Local / Remote Database][docs-feat-database]
+
+LobeChat supports the use of both server-side and local databases. Depending on your needs, you can choose the appropriate deployment solution:
+
+- **Local database**: suitable for users who want more control over their data and privacy protection. LobeChat uses CRDT (Conflict-Free Replicated Data Type) technology to achieve multi-device synchronization. This is an experimental feature aimed at providing a seamless data synchronization experience.
+- **Server-side database**: suitable for users who want a more convenient user experience. LobeChat supports PostgreSQL as a server-side database. For detailed documentation on how to configure the server-side database, please visit [Configure Server-side Database](https://lobehub.com/docs/self-hosting/advanced/server-database).
+
+Regardless of which database you choose, LobeChat can provide you with an excellent user experience.
+
+
+
+[![][back-to-top]](#readme-top)
+
+
+
+[![][image-feat-auth]][docs-feat-auth]
+
+### `9` [Support Multi-User Management][docs-feat-auth]
+
+LobeChat supports multi-user management and provides two main user authentication and management solutions to meet different needs:
+
+- **next-auth**: LobeChat integrates `next-auth`, a flexible and powerful identity verification library that supports multiple authentication methods, including OAuth, email login, credential login, etc. With `next-auth`, you can easily implement user registration, login, session management, social login, and other functions to ensure the security and privacy of user data.
+
+- **Clerk**: For users who need more advanced user management features, LobeChat also supports `Clerk`, a modern user management platform. `Clerk` provides richer functions, such as multi-factor authentication (MFA), user profile management, login activity monitoring, etc. With `Clerk`, you can get higher security and flexibility, and easily cope with complex user management needs.
+
+Regardless of which user management solution you choose, LobeChat can provide you with an excellent user experience and powerful functional support.
+
+
+
+[![][back-to-top]](#readme-top)
+
+
+
[![][image-feat-pwa]][docs-feat-pwa]
-### `8` [Progressive Web App (PWA)][docs-feat-pwa]
+### `10` [Progressive Web App (PWA)][docs-feat-pwa]
We deeply understand the importance of providing a seamless experience for users in today's multi-device environment.
Therefore, we have adopted Progressive Web Application ([PWA](https://support.google.com/chrome/answer/9658361)) technology,
@@ -307,7 +346,7 @@ providing smooth animations, responsive layouts, and adapting to different devic
[![][image-feat-mobile]][docs-feat-mobile]
-### `9` [Mobile Device Adaptation][docs-feat-mobile]
+### `11` [Mobile Device Adaptation][docs-feat-mobile]
We have carried out a series of optimization designs for mobile devices to enhance the user's mobile experience. Currently, we are iterating on the mobile user experience to achieve smoother and more intuitive interactions. If you have any suggestions or ideas, we welcome you to provide feedback through GitHub Issues or Pull Requests.
@@ -319,7 +358,7 @@ We have carried out a series of optimization designs for mobile devices to enhan
[![][image-feat-theme]][docs-feat-theme]
-### `10` [Custom Themes][docs-feat-theme]
+### `12` [Custom Themes][docs-feat-theme]
As a design-engineering-oriented application, LobeChat places great emphasis on users' personalized experiences,
hence introducing flexible and diverse theme modes, including a light mode for daytime and a dark mode for nighttime.
@@ -627,11 +666,12 @@ Every bit counts and your one-time donation sparkles in our galaxy of support! Y
Copyright © 2024 [LobeHub][profile-link].
-This project is [MIT](./LICENSE) licensed.
+This project is [Apache 2.0](./LICENSE) licensed.
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
+[blog]: https://lobehub.com/blog
[chat-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/desktop/pagespeed.svg
[chat-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/desktop/chat_preview_lobehub_com_chat.html
[chat-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/mobile/pagespeed.svg
@@ -658,11 +698,13 @@ This project is [MIT](./LICENSE) licensed.
[docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
[docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
[docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
-[docs]: https://lobehub.com/docs
+[docs]: https://lobehub.com/docs/usage/start
[docs-dev-guide]: https://github.com/lobehub/lobe-chat/wiki/index
[docs-docker]: https://lobehub.com/docs/self-hosting/platform/docker
[docs-env-var]: https://lobehub.com/docs/self-hosting/environment-variables
[docs-feat-agent]: https://lobehub.com/docs/usage/features/agent-market
+[docs-feat-auth]: https://lobehub.com/docs/usage/features/auth
+[docs-feat-database]: https://lobehub.com/docs/usage/features/database
[docs-feat-local]: https://lobehub.com/docs/usage/features/local-llm
[docs-feat-mobile]: https://lobehub.com/docs/usage/features/mobile
[docs-feat-plugin]: https://lobehub.com/docs/usage/features/plugin-system
@@ -672,7 +714,7 @@ This project is [MIT](./LICENSE) licensed.
[docs-feat-theme]: https://lobehub.com/docs/usage/features/theme
[docs-feat-tts]: https://lobehub.com/docs/usage/features/tts
[docs-feat-vision]: https://lobehub.com/docs/usage/features/vision
-[docs-functionc-call]: https://platform.openai.com/docs/guides/function-calling
+[docs-functionc-call]: https://lobehub.com/blog/openai-function-call
[docs-lighthouse]: https://github.com/lobehub/lobe-chat/wiki/Lighthouse
[docs-plugin-dev]: https://lobehub.com/docs/usage/plugins/development
[docs-self-hosting]: https://lobehub.com/docs/self-hosting/start
@@ -692,7 +734,7 @@ This project is [MIT](./LICENSE) licensed.
[github-issues-link]: https://github.com/lobehub/lobe-chat/issues
[github-issues-shield]: https://img.shields.io/github/issues/lobehub/lobe-chat?color=ff80eb&labelColor=black&style=flat-square
[github-license-link]: https://github.com/lobehub/lobe-chat/blob/main/LICENSE
-[github-license-shield]: https://img.shields.io/github/license/lobehub/lobe-chat?color=white&labelColor=black&style=flat-square
+[github-license-shield]: https://img.shields.io/badge/license-apache%202.0-white?labelColor=black&style=flat-square
[github-project-link]: https://github.com/lobehub/lobe-chat/projects
[github-release-link]: https://github.com/lobehub/lobe-chat/releases
[github-release-shield]: https://img.shields.io/github/v/release/lobehub/lobe-chat?color=369eff&labelColor=black&logo=github&style=flat-square
@@ -704,6 +746,8 @@ This project is [MIT](./LICENSE) licensed.
[github-trending-url]: https://trendshift.io/repositories/2256
[image-banner]: https://github.com/lobehub/lobe-chat/assets/28616219/9f155dff-4737-429f-9cad-a70a1a860c5f
[image-feat-agent]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/268670869-f1ffbf66-42b6-42cf-a937-9ce1f8328514.png
+[image-feat-auth]: https://github.com/lobehub/lobe-chat/assets/17870709/8ce70e15-40df-451e-b700-66090fe5b8c2
+[image-feat-database]: https://github.com/lobehub/lobe-chat/assets/17870709/c27a0234-a4e9-40e5-8bcb-42d5ce7e40f9
[image-feat-local]: https://github.com/lobehub/lobe-chat/assets/28616219/ca9a21bc-ea6c-4c90-bf4a-fa53b4fb2b5c
[image-feat-mobile]: https://gw.alipayobjects.com/zos/kitchen/R441AuFS4W/mobile.webp
[image-feat-plugin]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/268670883-33c43a5c-a512-467e-855c-fa299548cce5.png
@@ -713,7 +757,7 @@ This project is [MIT](./LICENSE) licensed.
[image-feat-theme]: https://gw.alipayobjects.com/zos/kitchen/pvus1lo%26Z7/darkmode.webp
[image-feat-tts]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/284072124-c9853d8d-f1b5-44a8-a305-45ebc0f6d19a.png
[image-feat-vision]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/284072129-382bdf30-e3d6-4411-b5a0-249710b8ba08.png
-[image-overview]: https://github.com/lobehub/lobe-chat/assets/28616219/8b04c3c9-3d71-4fb4-bd9b-a4f415c5876d
+[image-overview]: https://github.com/lobehub/lobe-chat/assets/17870709/56b95d48-f573-41cd-8b38-387bf88bc4bf
[image-star]: https://github.com/lobehub/lobe-chat/assets/17870709/cb06b748-513f-47c2-8740-d876858d7855
[issues-link]: https://img.shields.io/github/issues/lobehub/lobe-chat.svg?style=flat
[lobe-chat-plugins]: https://github.com/lobehub/lobe-chat-plugins
@@ -733,6 +777,7 @@ This project is [MIT](./LICENSE) licensed.
[lobe-ui-github]: https://github.com/lobehub/lobe-ui
[lobe-ui-link]: https://www.npmjs.com/package/@lobehub/ui
[lobe-ui-shield]: https://img.shields.io/npm/v/@lobehub/ui?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
+[official-site]: https://lobehub.com
[pr-welcome-link]: https://github.com/lobehub/lobe-chat/pulls
[pr-welcome-shield]: https://img.shields.io/badge/🤯_pr_welcome-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge
[profile-link]: https://github.com/lobehub
@@ -757,5 +802,5 @@ This project is [MIT](./LICENSE) licensed.
[submit-plugin-link]: https://github.com/lobehub/lobe-chat-plugins
[submit-plugin-shield]: https://img.shields.io/badge/🧩/🏪_submit_plugin-%E2%86%92-95f3d9?labelColor=black&style=for-the-badge
[vercel-link]: https://chat-preview.lobehub.com
-[vercel-shield]: https://img.shields.io/website?down_message=offline&label=vercel&labelColor=black&logo=vercel&style=flat-square&up_message=online&url=https%3A%2F%2Fsummer-heart-0930.chufeiyun1688.workers.dev%3A443%2Fhttps%2Fchat-preview.lobehub.com
-[vercel-shield-badge]: https://img.shields.io/website?down_message=offline&label=try%20lobechat&labelColor=black&logo=vercel&style=for-the-badge&up_message=online&url=https%3A%2F%2Fsummer-heart-0930.chufeiyun1688.workers.dev%3A443%2Fhttps%2Fchat-preview.lobehub.com
+[vercel-shield]: https://img.shields.io/badge/vercel-online-55b467?labelColor=black&logo=vercel&style=flat-square
+[vercel-shield-badge]: https://img.shields.io/badge/TRY%20LOBECHAT-ONLINE-55b467?labelColor=black&logo=vercel&style=for-the-badge
diff --git a/README.zh-CN.md b/README.zh-CN.md
index c06efe148e2e..d536eaa13ae2 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -8,7 +8,7 @@
支持语音合成、多模态、可扩展的([function call][docs-functionc-call])插件系统
一键**免费**拥有你自己的 ChatGPT/Gemini/Claude/Ollama 应用
-[English](./README.md) · **简体中文** · [更新日志](./CHANGELOG.md) · [文档][github-document-link] · [报告问题][github-issues-link] · [请求功能][github-issues-link]
+[English](./README.md) · **简体中文** · [官网][official-site] · [更新日志](./CHANGELOG.md) · [文档][docs] · [博客][blog] · [反馈问题][github-issues-link]
@@ -58,9 +58,11 @@
- [`5` Text to Image 文生图](#5-text-to-image-文生图)
- [`6` 插件系统 (Function Calling)](#6-插件系统-function-calling)
- [`7` 助手市场 (GPTs)](#7-助手市场-gpts)
- - [`8` 渐进式 Web 应用 (PWA)](#8-渐进式-web-应用-pwa)
- - [`9` 移动设备适配](#9-移动设备适配)
- - [`10` 自定义主题](#10-自定义主题)
+ - [`8` 支持本地 / 远程数据库](#8-支持本地--远程数据库)
+ - [`9` 支持多用户管理](#9-支持多用户管理)
+ - [`10` 渐进式 Web 应用 (PWA)](#10-渐进式-web-应用-pwa)
+ - [`11` 移动设备适配](#11-移动设备适配)
+ - [`12` 自定义主题](#12-自定义主题)
- [更多特性](#更多特性)
- [⚡️ 性能测试](#️-性能测试)
- [🛳 开箱即用](#-开箱即用)
@@ -129,6 +131,8 @@
- **Groq**:接入了 Groq 的 AI 模型,高效处理消息序列,生成回应,胜任多轮对话及单次交互任务。[了解更多](https://groq.com/)
- **OpenRouter**:其支持包括 **Claude 3**,**Gemma**,**Mistral**,**Llama2**和**Cohere**等模型路由,支持智能路由优化,提升使用效率,开放且灵活。[了解更多](https://openrouter.ai/)
- **Minimax**: 接入了 Minimax 的 AI 模型,包括 MoE 模型 **abab6**,提供了更多的选择空间。[了解更多](https://www.minimaxi.com/)
+- **DeepSeek**: 接入了 DeepSeek 的 AI 模型,包括最新的 **DeepSeek-V2**,提供兼顾性能与价格的模型。[了解更多](https://www.deepseek.com/)
+- **Qwen**: 接入了 Qwen 的 AI 模型,包括最新的 **qwen-turbo**,**qwen-plus** 和 **qwen-max** 等模型。[了解更多](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction)
同时,我们也在计划支持更多的模型服务商,如 Replicate 和 Perplexity 等,以进一步丰富我们的服务商库。如果你希望让 LobeChat 支持你喜爱的服务商,欢迎加入我们的[社区讨论](https://github.com/lobehub/lobe-chat/discussions/1284)。
@@ -214,14 +218,14 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
-| 最近新增 | 插件描述 |
-| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- |
-| [Search1API](https://chat-preview.lobehub.com/settings/agent)By **fatwang2** on **2024-05-06** | 搜索聚合服务,专为 LLMs 设计 `web` `search` |
-| [社交搜索](https://chat-preview.lobehub.com/settings/agent)By **say-apps** on **2024-05-02** | 社交搜索提供访问推文、用户、关注者、图片、媒体等功能。 `社交` `推特` `x` `搜索` |
-| [通过 Serper 搜索 Google](https://chat-preview.lobehub.com/settings/agent)By **Barry** on **2024-04-30** | 通过 Serper.dev 免费 API 进行 Google 搜索引擎(每月 2500 次🆓) `网络` `搜索` |
-| [NFT Guru](https://chat-preview.lobehub.com/settings/agent)By **swap** on **2024-04-03** | 发现主要平台上 NFT 的当前价格,并通过实时跟踪快速变化的市场了解情况 `加密货币` `nft` |
+| 最近新增 | 插件描述 |
+| ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
+| [社交搜索](https://chat-preview.lobehub.com/settings/agent)By **say-apps** on **2024-06-02** | 社交搜索提供访问推文、用户、关注者、图片、媒体等功能。 `社交` `推特` `x` `搜索` |
+| [空间](https://chat-preview.lobehub.com/settings/agent)By **automateyournetwork** on **2024-05-12** | 包括 NASA 的空间数据。 `空间` `nasa` |
+| [Search1API](https://chat-preview.lobehub.com/settings/agent)By **fatwang2** on **2024-05-06** | 搜索聚合服务,专为 LLMs 设计 `web` `search` |
+| [通过 Serper 搜索 Google](https://chat-preview.lobehub.com/settings/agent)By **Barry** on **2024-04-30** | 通过 Serper.dev 免费 API 进行 Google 搜索引擎(每月 2500 次🆓) `网络` `搜索` |
-> 📊 Total plugins: [**57** ](https://github.com/lobehub/lobe-chat-plugins)
+> 📊 Total plugins: [**52** ](https://github.com/lobehub/lobe-chat-plugins)
@@ -249,14 +253,14 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
-| 最近新增 | 助手说明 |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [视频转博客文章助手](https://chat-preview.lobehub.com/market?agent=video-2-blog-assistant)By **[yayoinoyume](https://github.com/yayoinoyume)** on **2024-05-06** | 帮你快速整理缭乱的字幕,变成精美的博客文章 `字幕整理` `博文格式` `视频变博客` |
-| [美术评价导师](https://chat-preview.lobehub.com/market?agent=wanwusheng-art)By **[dingyufei615](https://github.com/dingyufei615)** on **2024-05-06** | 擅长少儿美术教学,细致评价作品,关注细节,适应不同年龄段学生。 `美术教育` `评价` `创意` `教学` `绘画` |
-| [iOS 代码艺术家](https://chat-preview.lobehub.com/market?agent=ios-develop)By **[Alcu1n](https://github.com/Alcu1n)** on **2024-05-03** | iOS 开发专家,15 年经验,精通 Swift、SwiftUI、Flutter。逻辑清晰的代码,精准 debug,提供 0 到 1 的项目框架。 `i-os开发` `编码` `调试` `项目规划` `逻辑思维` |
-| [销售描述专家](https://chat-preview.lobehub.com/market?agent=verkauf-kleinanzeigen)By **[highseen](https://github.com/highseen)** on **2024-04-30** | 通过研究、定价、描述和标题设计帮助销售二手物品。 `产品销售` `研究` `描述` |
+| 最近新增 | 助手说明 |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [Fastapi 项目开发助手](https://chat-preview.lobehub.com/market?agent=fastapi-development)By **[xwxw098](https://github.com/xwxw098)** on **2024-06-19** | 擅长 Python 模块化开发,熟练运用 FastAPI、PostgreSQL、Tortoise-ORM 等技术栈,能为大型项目提供清晰的代码结构并添加详细注释。 `fast-api` `python` `模块化开发` |
+| [IT 系统架构师](https://chat-preview.lobehub.com/market?agent=it-system-architect)By **[a562314](https://github.com/a562314)** on **2024-06-19** | 资深 IT 架构师,擅长需求分析、系统设计、技术选型和跨平台系统优化。5 年以上经验,精通 Windows、macOS 和 Linux 三大操作系统,具备故障排除和安全防护能力 `it架构设计` `问题解决` `敏捷开发` `系统优化` `跨平台技能` |
+| [Linux 内核专家](https://chat-preview.lobehub.com/market?agent=linux-kernel)By **[wming126](https://github.com/wming126)** on **2024-06-19** | 角色描述: 我是一位精通 Linux 内核的专家,对最新内核源代码(截至 2024 年 6 月)有着深入的理解和分析能力。我可以为用户提供关于 Linux 内核的详细、准确的信息。 `linux` `kernel` |
+| [NovelAI 绘画助手](https://chat-preview.lobehub.com/market?agent=novel-ai-pormpt-helper)By **[WallBreakerNO4](https://github.com/WallBreakerNO4)** on **2024-06-18** | 我能将你描述的场景转成 NovelAI 的 prompt `深度学习` `图像生成` `算法` `提示符` |
-> 📊 Total agents: [**247** ](https://github.com/lobehub/lobe-chat-agents)
+> 📊 Total agents: [**292** ](https://github.com/lobehub/lobe-chat-agents)
@@ -266,9 +270,44 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
+[![][image-feat-database]][docs-feat-database]
+
+### `8` [支持本地 / 远程数据库][docs-feat-database]
+
+LobeChat 支持同时使用服务端数据库和本地数据库。根据您的需求,您可以选择合适的部署方案:
+
+- 本地数据库:适合希望对数据有更多掌控感和隐私保护的用户。LobeChat 采用了 CRDT (Conflict-Free Replicated Data Type) 技术,实现了多端同步功能。这是一项实验性功能,旨在提供无缝的数据同步体验。
+- 服务端数据库:适合希望更便捷使用体验的用户。LobeChat 支持 PostgreSQL 作为服务端数据库。关于如何配置服务端数据库的详细文档,请前往 [配置服务端数据库](https://lobehub.com/zh/docs/self-hosting/advanced/server-database)。
+
+无论您选择哪种数据库,LobeChat 都能为您提供卓越的用户体验。
+
+
+
+[![][back-to-top]](#readme-top)
+
+
+
+[![][image-feat-auth]][docs-feat-auth]
+
+### `9` [支持多用户管理][docs-feat-auth]
+
+LobeChat 支持多用户管理,提供了两种主要的用户认证和管理方案,以满足不同需求:
+
+- **next-auth**:LobeChat 集成了 `next-auth`,一个灵活且强大的身份验证库,支持多种身份验证方式,包括 OAuth、邮件登录、凭证登录等。通过 `next-auth`,您可以轻松实现用户的注册、登录、会话管理以及社交登录等功能,确保用户数据的安全性和隐私性。
+
+- **Clerk**:对于需要更高级用户管理功能的用户,LobeChat 还支持 `Clerk`,一个现代化的用户管理平台。`Clerk` 提供了更丰富的功能,如多因素认证 (MFA)、白名单、用户管理、登录活动监控等。通过 `Clerk`,您可以获得更高的安全性和灵活性,轻松应对生产级的用户管理需求。
+
+您可以根据自己的需求,选择合适的用户管理方案。
+
+
+
+[![][back-to-top]](#readme-top)
+
+
+
[![][image-feat-pwa]][docs-feat-pwa]
-### `8` [渐进式 Web 应用 (PWA)][docs-feat-pwa]
+### `10` [渐进式 Web 应用 (PWA)][docs-feat-pwa]
我们深知在当今多设备环境下为用户提供无缝体验的重要性。为此,我们采用了渐进式 Web 应用 [PWA](https://support.google.com/chrome/answer/9658361) 技术,
这是一种能够将网页应用提升至接近原生应用体验的现代 Web 技术。通过 PWA,LobeChat 能够在桌面和移动设备上提供高度优化的用户体验,同时保持轻量级和高性能的特点。
@@ -291,7 +330,7 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
[![][image-feat-mobile]][docs-feat-mobile]
-### `9` [移动设备适配][docs-feat-mobile]
+### `11` [移动设备适配][docs-feat-mobile]
针对移动设备进行了一系列的优化设计,以提升用户的移动体验。目前,我们正在对移动端的用户体验进行版本迭代,以实现更加流畅和直观的交互。如果您有任何建议或想法,我们非常欢迎您通过 GitHub Issues 或者 Pull Requests 提供反馈。
@@ -303,7 +342,7 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
[![][image-feat-theme]][docs-feat-theme]
-### `10` [自定义主题][docs-feat-theme]
+### `12` [自定义主题][docs-feat-theme]
作为设计工程师出身,LobeChat 在界面设计上充分考虑用户的个性化体验,因此引入了灵活多变的主题模式,其中包括日间的亮色模式和夜间的深色模式。
除了主题模式的切换,还提供了一系列的颜色定制选项,允许用户根据自己的喜好来调整应用的主题色彩。无论是想要沉稳的深蓝,还是希望活泼的桃粉,或者是专业的灰白,用户都能够在 LobeChat 中找到匹配自己风格的颜色选择。
@@ -648,11 +687,12 @@ $ pnpm run dev
Copyright © 2023 [LobeHub][profile-link].
-This project is [MIT](./LICENSE) licensed.
+This project is [Apache 2.0](./LICENSE) licensed.
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
+[blog]: https://lobehub.com/zh/blog
[chat-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/desktop/pagespeed.svg
[chat-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/desktop/chat_preview_lobehub_com_chat.html
[chat-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/mobile/pagespeed.svg
@@ -679,10 +719,13 @@ This project is [MIT](./LICENSE) licensed.
[docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
[docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
[docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
+[docs]: https://lobehub.com/zh/docs/usage/start
[docs-dev-guide]: https://github.com/lobehub/lobe-chat/wiki/index
[docs-docker]: https://lobehub.com/docs/self-hosting/platform/docker
[docs-env-var]: https://lobehub.com/docs/self-hosting/environment-variables
[docs-feat-agent]: https://lobehub.com/docs/usage/features/agent-market
+[docs-feat-auth]: https://lobehub.com/docs/usage/features/auth
+[docs-feat-database]: https://lobehub.com/docs/usage/features/database
[docs-feat-local]: https://lobehub.com/docs/usage/features/local-llm
[docs-feat-mobile]: https://lobehub.com/docs/usage/features/mobile
[docs-feat-plugin]: https://lobehub.com/docs/usage/features/plugin-system
@@ -692,7 +735,7 @@ This project is [MIT](./LICENSE) licensed.
[docs-feat-theme]: https://lobehub.com/docs/usage/features/theme
[docs-feat-tts]: https://lobehub.com/docs/usage/features/tts
[docs-feat-vision]: https://lobehub.com/docs/usage/features/vision
-[docs-functionc-call]: https://platform.openai.com/docs/guides/function-calling
+[docs-functionc-call]: https://lobehub.com/zh/blog/openai-function-call
[docs-lighthouse]: https://github.com/lobehub/lobe-chat/wiki/Lighthouse.zh-CN
[docs-plugin-dev]: https://lobehub.com/docs/usage/plugins/development
[docs-self-hosting]: https://lobehub.com/docs/self-hosting/start
@@ -707,13 +750,12 @@ This project is [MIT](./LICENSE) licensed.
[github-action-test-shield]: https://img.shields.io/github/actions/workflow/status/lobehub/lobe-chat/test.yml?label=test&labelColor=black&logo=githubactions&logoColor=white&style=flat-square
[github-contributors-link]: https://github.com/lobehub/lobe-chat/graphs/contributors
[github-contributors-shield]: https://img.shields.io/github/contributors/lobehub/lobe-chat?color=c4f042&labelColor=black&style=flat-square
-[github-document-link]: https://lobehub.com/docs
[github-forks-link]: https://github.com/lobehub/lobe-chat/network/members
[github-forks-shield]: https://img.shields.io/github/forks/lobehub/lobe-chat?color=8ae8ff&labelColor=black&style=flat-square
[github-issues-link]: https://github.com/lobehub/lobe-chat/issues
[github-issues-shield]: https://img.shields.io/github/issues/lobehub/lobe-chat?color=ff80eb&labelColor=black&style=flat-square
[github-license-link]: https://github.com/lobehub/lobe-chat/blob/main/LICENSE
-[github-license-shield]: https://img.shields.io/github/license/lobehub/lobe-chat?color=white&labelColor=black&style=flat-square
+[github-license-shield]: https://img.shields.io/badge/license-apache%202.0-white?labelColor=black&style=flat-square
[github-project-link]: https://github.com/lobehub/lobe-chat/projects
[github-release-link]: https://github.com/lobehub/lobe-chat/releases
[github-release-shield]: https://img.shields.io/github/v/release/lobehub/lobe-chat?color=369eff&labelColor=black&logo=github&style=flat-square
@@ -725,6 +767,8 @@ This project is [MIT](./LICENSE) licensed.
[github-trending-url]: https://trendshift.io/repositories/2256
[image-banner]: https://github.com/lobehub/lobe-chat/assets/28616219/9f155dff-4737-429f-9cad-a70a1a860c5f
[image-feat-agent]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/268670869-f1ffbf66-42b6-42cf-a937-9ce1f8328514.png
+[image-feat-auth]: https://github.com/lobehub/lobe-chat/assets/17870709/8ce70e15-40df-451e-b700-66090fe5b8c2
+[image-feat-database]: https://github.com/lobehub/lobe-chat/assets/17870709/c27a0234-a4e9-40e5-8bcb-42d5ce7e40f9
[image-feat-local]: https://github.com/lobehub/lobe-chat/assets/28616219/ca9a21bc-ea6c-4c90-bf4a-fa53b4fb2b5c
[image-feat-mobile]: https://gw.alipayobjects.com/zos/kitchen/R441AuFS4W/mobile.webp
[image-feat-plugin]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/268670883-33c43a5c-a512-467e-855c-fa299548cce5.png
@@ -734,7 +778,7 @@ This project is [MIT](./LICENSE) licensed.
[image-feat-theme]: https://gw.alipayobjects.com/zos/kitchen/pvus1lo%26Z7/darkmode.webp
[image-feat-tts]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/284072124-c9853d8d-f1b5-44a8-a305-45ebc0f6d19a.png
[image-feat-vision]: https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/284072129-382bdf30-e3d6-4411-b5a0-249710b8ba08.png
-[image-overview]: https://github.com/lobehub/lobe-chat/assets/28616219/8b04c3c9-3d71-4fb4-bd9b-a4f415c5876d
+[image-overview]: https://github.com/lobehub/lobe-chat/assets/17870709/56b95d48-f573-41cd-8b38-387bf88bc4bf
[image-star]: https://github.com/lobehub/lobe-chat/assets/17870709/cb06b748-513f-47c2-8740-d876858d7855
[issues-link]: https://img.shields.io/github/issues/lobehub/lobe-chat.svg?style=flat
[lobe-chat-plugins]: https://github.com/lobehub/lobe-chat-plugins
@@ -754,6 +798,7 @@ This project is [MIT](./LICENSE) licensed.
[lobe-ui-github]: https://github.com/lobehub/lobe-ui
[lobe-ui-link]: https://www.npmjs.com/package/@lobehub/ui
[lobe-ui-shield]: https://img.shields.io/npm/v/@lobehub/ui?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
+[official-site]: https://lobehub.com
[pr-welcome-link]: https://github.com/lobehub/lobe-chat/pulls
[pr-welcome-shield]: https://img.shields.io/badge/🤯_pr_welcome-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge
[profile-link]: https://github.com/lobehub
@@ -776,5 +821,5 @@ This project is [MIT](./LICENSE) licensed.
[submit-plugin-link]: https://github.com/lobehub/lobe-chat-plugins
[submit-plugin-shield]: https://img.shields.io/badge/🧩/🏪_submit_plugin-%E2%86%92-95f3d9?labelColor=black&style=for-the-badge
[vercel-link]: https://chat-preview.lobehub.com
-[vercel-shield]: https://img.shields.io/website?down_message=offline&label=vercel&labelColor=black&logo=vercel&style=flat-square&up_message=online&url=https%3A%2F%2Fsummer-heart-0930.chufeiyun1688.workers.dev%3A443%2Fhttps%2Fchat-preview.lobehub.com
-[vercel-shield-badge]: https://img.shields.io/website?down_message=offline&label=try%20lobechat&labelColor=black&logo=vercel&style=for-the-badge&up_message=online&url=https%3A%2F%2Fsummer-heart-0930.chufeiyun1688.workers.dev%3A443%2Fhttps%2Fchat-preview.lobehub.com
+[vercel-shield]: https://img.shields.io/badge/vercel-online-55b467?labelColor=black&logo=vercel&style=flat-square
+[vercel-shield-badge]: https://img.shields.io/badge/TRY%20LOBECHAT-ONLINE-55b467?labelColor=black&logo=vercel&style=for-the-badge
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 000000000000..5fb59f6206cb
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,11 @@
+coverage:
+ status:
+ project:
+ default: off
+ server:
+ flags:
+ - server
+ app:
+ flags:
+ - app
+ patch: off
diff --git a/contributing/Basic/Feature-Development.md b/contributing/Basic/Feature-Development.md
index f04c0897a999..a56bc8861ed4 100644
--- a/contributing/Basic/Feature-Development.md
+++ b/contributing/Basic/Feature-Development.md
@@ -4,14 +4,14 @@ This document aims to guide developers on how to develop a complete feature requ
We will use the implementation of sessionGroup as an example: [✨ feat: add session group manager](https://github.com/lobehub/lobe-chat/pull/1055), and explain the complete implementation process through the following six main sections:
-1. Data Model / Database Definition
-2. Service Implementation / Model Implementation
-3. Frontend Data Flow Store Implementation
-4. UI Implementation and Action Binding
-5. Data Migration
-6. Data Import and Export
+1. [Data Model / Database Definition](#1-data-model--database-definition)
+2. [Service Implementation / Model Implementation](#2-service-implementation--model-implementation)
+3. [Frontend Data Flow Store Implementation](#3-frontend-data-flow-store-implementation)
+4. [UI Implementation and Action Binding](#4-ui-implementation-and-action-binding)
+5. [Data Migration](#5-data-migration)
+6. [Data Import and Export](#6-data-import-and-export)
-## 1. Database Section
+## 1. Data Model / Database Definition
To implement the Session Group feature, it is necessary to define the relevant data model and indexes at the database level.
@@ -119,7 +119,7 @@ As a result, you can now view the `sessionGroups` table in the `LOBE_CHAT_DB` in
![](https://github.com/lobehub/lobe-chat/assets/28616219/aea50f66-4060-4a32-88c8-b3c672d05be8)
-## 2. Model and Service Section
+## 2. Service Implementation / Model Implementation
### Define Model
@@ -176,7 +176,7 @@ class SessionService {
}
```
-## 3. Store Action Section
+## 3. Frontend Data Flow Store Implementation
In the LobeChat application, the Store module is used to manage the frontend state of the application. The Actions within it are functions that trigger state updates, usually by calling methods in the service layer to perform actual data processing operations and then updating the state in the Store. We use `zustand` as the underlying dependency for the Store module. For a detailed practical introduction to state management, you can refer to [📘 Best Practices for State Management](../State-Management/State-Management-Intro.zh-CN.md).
@@ -351,7 +351,7 @@ Since all data retrieval in the UI is implemented using syntax like `useSessionS
>
> If you are not familiar with the concept and functionality of selectors, you can refer to the section [📘 Data Storage and Retrieval Module](./State-Management-Selectors.en-US) for relevant information.
-## IV. UI Section
+## 4. UI Implementation and Action Binding
Bind Store Action in the UI component to implement interactive logic, for example `CreateGroupModal`:
@@ -570,7 +570,7 @@ export class LocalDB extends Dexie {
This is our data migration strategy. When performing the migration, it is essential to ensure the correctness of the migration script and validate the migration results through thorough testing.
-## VI. Data Import and Export
+## 6. Data Import and Export
In LobeChat, the data import and export feature is designed to ensure that users can migrate their data between different devices. This includes session, topic, message, and settings data. In the implementation of the Session Group feature, we also need to handle data import and export to ensure that the complete exported data can be restored exactly the same on other devices.
diff --git a/contributing/Basic/Feature-Development.zh-CN.md b/contributing/Basic/Feature-Development.zh-CN.md
index 9f0a92b7cf6d..643eda51ebd7 100644
--- a/contributing/Basic/Feature-Development.zh-CN.md
+++ b/contributing/Basic/Feature-Development.zh-CN.md
@@ -4,14 +4,14 @@
我们将以 sessionGroup 的实现为示例:[✨ feat: add session group manager](https://github.com/lobehub/lobe-chat/pull/1055) , 通过以下六个主要部分来阐述完整的实现流程:
-1. 数据模型 / 数据库定义
-2. Service 实现 / Model 实现
-3. 前端数据流 Store 实现
-4. UI 实现与 action 绑定
-5. 数据迁移
-6. 数据导入导出
+1. [数据模型 / 数据库定义](#一数据模型--数据库定义)
+2. [Service 实现 / Model 实现](#二service-实现--model-实现)
+3. [前端数据流 Store 实现](#三前端数据流-store-实现)
+4. [UI 实现与 action 绑定](#四ui-实现与-action-绑定)
+5. [数据迁移](#五数据迁移)
+6. [数据导入导出](#六数据导入导出)
-## 一、数据库部分
+## 一、数据模型 / 数据库定义
为了实现 Session Group 功能,首先需要在数据库层面定义相关的数据模型和索引。
@@ -119,7 +119,7 @@ export class LocalDB extends Dexie {
![](https://github.com/lobehub/lobe-chat/assets/28616219/aea50f66-4060-4a32-88c8-b3c672d05be8)
-## 二、Model 与 Service 部分
+## 二、Service 实现 / Model 实现
### 定义 Model
@@ -176,7 +176,7 @@ class SessionService {
}
```
-## 三、Store Action 部分
+## 三、前端数据流 Store 实现
在 LobeChat 应用中,Store 是用于管理应用前端状态的模块。其中的 Action 是触发状态更新的函数,通常会调用服务层的方法来执行实际的数据处理操作,然后更新 Store 中的状态。我们采用了 `zustand` 作为 Store 模块的底层依赖,对于状态管理的详细实践介绍,可以查阅 [📘 状态管理最佳实践](../State-Management/State-Management-Intro.zh-CN.md)
@@ -351,7 +351,7 @@ const customSessionGroups = (s: SessionStore): CustomSessionGroup[] => s.customS
>
> 如果你对 Selectors 的概念和功能不太了解,可以查阅 [📘 数据存储取数模块](../State-Management/State-Management-Selectors.zh-CN.md) 部分了解相关内容。
-## 四、UI 部分
+## 四、UI 实现与 action 绑定
在 UI 组件中绑定 Store Action 实现交互逻辑,例如 `CreateGroupModal`:
diff --git a/contributing/Basic/Intro.md b/contributing/Basic/Intro.md
index 086a80ad9968..7ac6ea9e6e03 100644
--- a/contributing/Basic/Intro.md
+++ b/contributing/Basic/Intro.md
@@ -1,22 +1,26 @@
# Technical Development Getting Started Guide
-Welcome to the LobeChat technical development getting started guide. LobeChat is an AI conversation application built on the Next.js framework, which integrates a series of technology stacks to achieve diverse functions and features. This guide will provide a detailed introduction to the main technical components of LobeChat and how to configure and use these technologies in your development environment.
+Welcome to the LobeChat Technical Development Getting Started Guide. LobeChat is an AI conversation application built on the Next.js framework, incorporating a range of technology stacks to achieve diverse functionalities and features. This guide will detail the main technical components of LobeChat and how to configure and use these technologies in your development environment.
#### TOC
- [Basic Technology Stack](#basic-technology-stack)
- [Folder Directory Structure](#folder-directory-structure)
+- [Local Development Environment Setup](#local-development-environment-setup)
+- [Code Style and Contribution Guide](#code-style-and-contribution-guide)
+- [Internationalization Implementation Guide](#internationalization-implementation-guide)
+- [Appendix: Resources and References](#appendix-resources-and-references)
## Basic Technology Stack
-The core technology stack of LobeChat includes:
+The core technology stack of LobeChat is as follows:
-- **Framework**: We have chosen [Next.js](https://nextjs.org/), a powerful React framework that provides key features such as server-side rendering, routing framework, and Router Handler for our project.
-- **Component Library**: We use [Ant Design (antd)](https://ant.design/) as the basic component library, and also introduce [lobe-ui](https://github.com/lobehub/lobe-ui) as our business component library.
-- **State Management**: We have opted for [zustand](https://github.com/pmndrs/zustand), a lightweight and easy-to-use state management library.
+- **Framework**: We chose [Next.js](https://nextjs.org/), a powerful React framework that provides key features such as server-side rendering, routing framework, and Router Handler.
+- **Component Library**: We use [Ant Design (antd)](https://ant.design/) as the basic component library, along with [lobe-ui](https://github.com/lobehub/lobe-ui) as our business component library.
+- **State Management**: We selected [zustand](https://github.com/pmndrs/zustand), a lightweight and easy-to-use state management library.
- **Network Requests**: We use [swr](https://swr.vercel.app/), a React Hooks library for data fetching.
-- **Routing**: For routing management, we directly use the solution provided by [Next.js](https://nextjs.org/) itself.
-- **Internationalization**: We use [i18next](https://www.i18next.com/) to implement multi-language support for the application.
+- **Routing**: For routing management, we directly use the solution provided by [Next.js](https://nextjs.org/).
+- **Internationalization**: We use [i18next](https://www.i18next.com/) to support multiple languages in the application.
- **Styling**: We use [antd-style](https://github.com/ant-design/antd-style), a CSS-in-JS library that complements Ant Design.
- **Unit Testing**: We use [vitest](https://github.com/vitest-dev/vitest) for unit testing.
@@ -26,18 +30,82 @@ The folder directory structure of LobeChat is as follows:
```bash
src
-├── app # Main logic of the application and code related to state management
+├── app # Code related to the main logic and state management of the application
├── components # Reusable UI components
-├── config # Application configuration files, including client-side environment variables and server-side environment variables
+├── config # Application configuration files, including client and server environment variables
├── const # Used to define constants, such as action types, route names, etc.
-├── features # Function modules related to business features, such as Agent settings, plugin development pop-ups, etc.
-├── hooks # Custom utility hooks reused throughout the application
+├── features # Business-related feature modules, such as Agent settings, plugin development pop-ups, etc.
+├── hooks # Custom utility Hooks reusable across the application
├── layout # Application layout components, such as navigation bars, sidebars, etc.
├── locales # Language files for internationalization
├── services # Encapsulated backend service interfaces, such as HTTP requests
├── store # Zustand store for state management
├── types # TypeScript type definition files
-└── utils # Common utility functions
+└── utils # General utility functions
```
-For a detailed introduction to the directory structure, please refer to: [Folder Directory Structure](Folder-Structure.en-US.md)
+For a detailed introduction to the directory structure, see: [Folder Directory Structure](Folder-Structure.zh-CN.md)
+
+## Local Development Environment Setup
+
+This section outlines setting up the development environment and local development. Before starting, please ensure that Node.js, Git, and your chosen package manager (Bun or PNPM) are installed in your local environment.
+
+We recommend using WebStorm as your integrated development environment (IDE).
+
+1. **Get the code**: Clone the LobeChat code repository locally:
+
+```bash
+git clone https://github.com/lobehub/lobe-chat.git
+```
+
+2. **Install dependencies**: Enter the project directory and install the required dependencies:
+
+```bash
+cd lobe-chat
+# If you use Bun
+bun install
+# If you use PNPM
+pnpm install
+```
+
+3. **Run and debug**: Start the local development server and begin your development journey:
+
+```bash
+# Start the development server with Bun
+bun run dev
+# Visit http://localhost:3010 to view the application
+```
+
+> \[!IMPORTANT]\
+> If you encounter the error "Could not find 'stylelint-config-recommended'" when installing dependencies with `npm`, please reinstall the dependencies using `pnpm` or `bun`.
+
+Now, you should be able to see the welcome page of LobeChat in your browser. For a detailed environment setup guide, please refer to [Development Environment Setup Guide](Setup-Development.zh-CN.md).
+
+## Code Style and Contribution Guide
+
+In the LobeChat project, we place great emphasis on the quality and consistency of the code. For this reason, we have established a series of code style standards and contribution processes to ensure that every developer can smoothly participate in the project. Here are the code style and contribution guidelines you need to follow as a developer.
+
+- **Code Style**: We use `@lobehub/lint` to unify the code style, including ESLint, Prettier, remarklint, and stylelint configurations. Please adhere to our code standards to maintain code consistency and readability.
+- **Contribution Process**: We use gitmoji and semantic release for code submission and release processes. Please use gitmoji to annotate your commit messages and ensure compliance with the semantic release standards so that our automation systems can correctly handle version control and releases.
+
+All contributions will undergo code review. Maintainers may suggest modifications or requirements. Please respond actively to review comments and make timely adjustments. We look forward to your participation and contribution.
+
+For detailed code style and contribution guidelines, please refer to [Code Style and Contribution Guide](Contributing-Guidelines.zh-CN.md).
+
+## Internationalization Implementation Guide
+
+LobeChat uses `i18next` and `lobe-i18n` to implement multilingual support, ensuring a global user experience.
+
+Internationalization files are located in `src/locales`, containing the default language (Chinese). We generate other language JSON files automatically through `lobe-i18n`.
+
+If you want to add a new language, follow specific steps detailed in [New Language Addition Guide](../Internationalization/Add-New-Locale.zh-CN.md). We encourage you to participate in our internationalization efforts to provide better services to global users.
+
+For a detailed guide on internationalization implementation, please refer to [Internationalization Implementation Guide](../Internationalization/Internationalization-Implementation.zh-CN.md).
+
+## Appendix: Resources and References
+
+To support developers in better understanding and using the technology stack of LobeChat, we provide a comprehensive list of resources and references — [LobeChat Resources and References](https://github.com/lobehub/lobe-chat/wiki/Resources.zh-CN) - Visit our maintained list of resources, including tutorials, articles, and other useful links.
+
+We encourage developers to utilize these resources to deepen their learning and enhance their skills, join community discussions through [LobeChat GitHub Discussions](https://github.com/lobehub/lobe-chat/discussions) or [Discord](https://discord.com/invite/AYFPHvv2jT), ask questions, or share your experiences.
+
+If you have any questions or need further assistance, please do not hesitate to contact us through the above channels.
diff --git a/contributing/Basic/Intro.zh-CN.md b/contributing/Basic/Intro.zh-CN.md
index 61316ef89e78..5030401e305c 100644
--- a/contributing/Basic/Intro.zh-CN.md
+++ b/contributing/Basic/Intro.zh-CN.md
@@ -76,6 +76,9 @@ bun run dev
# 访问 http://localhost:3010 查看应用
```
+> \[!IMPORTANT]\
+> 如果使用`npm`安装依赖出现`Could not find "stylelint-config-recommended"`错误,请使用 `pnpm` 或者 `bun` 重新安装依赖。
+
现在,你应该可以在浏览器中看到 LobeChat 的欢迎页面。详细的环境配置指南,请参考 [开发环境设置指南](Setup-Development.zh-CN.md)。
## 代码风格与贡献指南
diff --git a/docs/self-hosting/advanced/authentication.mdx b/docs/self-hosting/advanced/authentication.mdx
index 02570c1ffcf5..c8517740365f 100644
--- a/docs/self-hosting/advanced/authentication.mdx
+++ b/docs/self-hosting/advanced/authentication.mdx
@@ -25,6 +25,15 @@ By setting the environment variables NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK
## Next Auth
+Before using NextAuth, please set the following variables in LobeChat's environment variables:
+
+| Environment Variable | Type | Description |
+| --- | --- | --- |
+| `NEXT_AUTH_SECRET` | Required | The key used to encrypt Auth.js session tokens. You can use the following command: `openssl rand -base64 32`, or visit `https://generate-secret.vercel.app/32` to generate the key. |
+| `ACCESS_CODE` | Required | Add a password to access this service. You can set a sufficiently long random password to "disable" access code authorization. |
+| `NEXTAUTH_URL` | Optional | This URL specifies the callback address for Auth.js when performing OAuth verification. Set this only if the default generated redirect address is incorrect. `https://example.com/api/auth` |
+| `NEXT_AUTH_SSO_PROVIDERS` | Optional | This environment variable is used to enable multiple identity verification sources simultaneously, separated by commas, for example, `auth0,azure-ad,authentik`. |
+
Currently supported identity verification services include:
diff --git a/docs/self-hosting/advanced/authentication.zh-CN.mdx b/docs/self-hosting/advanced/authentication.zh-CN.mdx
index 3bbd5cb91f11..df69d357f6d4 100644
--- a/docs/self-hosting/advanced/authentication.zh-CN.mdx
+++ b/docs/self-hosting/advanced/authentication.zh-CN.mdx
@@ -22,6 +22,15 @@ LobeChat 与 Clerk 做了深度集成,能够为用户提供一个更加安全
## Next Auth
+在使用 NextAuth 之前,请先在 LobeChat 的环境变量中设置以下变量:
+
+| 环境变量 | 类型 | 描述 |
+| --- | --- | --- |
+| `NEXT_AUTH_SECRET` | 必选 | 用于加密 Auth.js 会话令牌的密钥。您可以使用以下命令: `openssl rand -base64 32`,或者访问 `https://generate-secret.vercel.app/32` 生成秘钥。 |
+| `ACCESS_CODE` | 必选 | 添加访问此服务的密码,你可以设置一个足够长的随机密码以 “禁用” 访问码授权 |
+| `NEXTAUTH_URL` | 可选 | 该 URL 用于指定 Auth.js 在执行 OAuth 验证时的回调地址,当默认生成的重定向地址发生不正确时才需要设置。`https://example.com/api/auth` |
+| `NEXT_AUTH_SSO_PROVIDERS` | 可选 | 该环境变量用于同时启用多个身份验证源,以逗号 `,` 分割,例如 `auth0,azure-ad,authentik`。 |
+
目前支持的身份验证服务有:
diff --git a/docs/self-hosting/advanced/feature-flags.mdx b/docs/self-hosting/advanced/feature-flags.mdx
new file mode 100644
index 000000000000..38391fb55e26
--- /dev/null
+++ b/docs/self-hosting/advanced/feature-flags.mdx
@@ -0,0 +1,47 @@
+---
+title: LobeChat Feature Flags Environment Variables Configuration Guide
+description: >-
+ Learn how to use environment variables to customize LobeChat's feature flags,
+ including controlling whether a feature is enabled or disabled, or enabling or
+ disabling features for specific user groups or environments as needed.
+tags:
+ - LobeChat
+ - Environment Variables
+ - Configuration Guide
+ - Feature Flags
+---
+
+# Feature Flags
+
+In addition to basic environment variable configuration, LobeChat also offers feature flags to control whether a feature is enabled globally, or to enable or disable features for specific user groups or environments as needed.
+
+## Feature Flags Environment Variable `FEATURE_FLAGS`
+
+- Type: Optional
+- Description: Used to control LobeChat's feature functionalities. Supports multiple feature flags, using `+` to add a feature and `-` to disable a feature. Separate multiple feature flags with a comma `,` and enclose the entire value in quotes `"` to avoid parsing errors.
+- Default: `-`
+- Example: `"-welcome_suggest"`
+
+All features are controlled by the `FEATURE_FLAGS` variable as the sole configuration variable.
+
+You can achieve various feature combinations using the above configuration syntax. All feature flags are Boolean values, enabled with `+` and disabled with `-`.
+
+
+ Attention: Unlike the `OPENAI_MODEL_LIST` variable, the `FEATURE_FLAGS` variable does not support
+ the `all` keyword. You need to manually control all feature flags (otherwise, they will adopt
+ their default values).
+
+
+| Configuration Item | Description | Default Value |
+| ------------------------- | ----------------------------------------------- | ------------- |
+| `webrtc_sync` | Enables WebRTC sync functionality. | Disabled |
+| `language_model_settings` | Enables language model settings. | Enabled |
+| `openai_api_key` | Allows users to customize the OpenAI API Key. | Enabled |
+| `openai_proxy_url` | Allows users to customize the OpenAI proxy URL. | Enabled |
+| `create_session` | Allows users to create sessions. | Enabled |
+| `edit_agent` | Allows users to edit assistants. | Enabled |
+| `dalle` | Enables the DALL-E functionality. | Enabled |
+| `check_updates` | Allows checking for updates. | Enabled |
+| `welcome_suggest` | Displays welcome suggestions. | Enabled |
+
+You can always check the [featureFlags](https://github.com/lobehub/lobe-chat/blob/main/src/config/featureFlags/schema.ts) to get the latest list of feature flags.
diff --git a/docs/self-hosting/advanced/feature-flags.zh-CN.mdx b/docs/self-hosting/advanced/feature-flags.zh-CN.mdx
new file mode 100644
index 000000000000..149654a92452
--- /dev/null
+++ b/docs/self-hosting/advanced/feature-flags.zh-CN.mdx
@@ -0,0 +1,43 @@
+---
+title: LobeChat 特性标志环境变量配置指南
+description: 了解如何使用环境变量自定义 LobeChat 的特性标志,包括控制否启用某个功能、或者根据需要对特定用户群体或环境启用或禁用功能。
+tags:
+ - LobeChat
+ - 环境变量
+ - 配置指南
+ - 特征标志
+---
+
+# 特性标志
+
+除了基础的环境变量配置外,LobeChat 还提供了一些特性标志(Feature Flags),用于控制是否全局启用某个功能,或者根据需要对特定用户群体或环境启用或禁用功能。
+
+## 特性标志环境变量 `FEATURE_FLAGS`
+
+- 类型:可选
+- 描述:用于控制 LobeChat 的特性功能,支持多个功能标志,使用 `+` 增加一个功能,使用 `-` 来关闭一个功能,多个功能标志之间使用英文逗号 `,` 隔开,最外层建议添加引号 `"` 以避免解析错误。
+- 默认值:`-`
+- 示例:`"-welcome_suggest"`
+
+所有的功能统一以特性标志 `FEATURE_FLAGS` 作为唯一的配置变量。
+
+你可以通过上述配置语法来实现更多的功能组合。所有的功能配置项都是布尔类型,通过 `+` 来启用,通过 `-` 来关闭。
+
+
+ 注意:与 `OPENAI_MODEL_LIST` 变量不同,`FEATURE_FLAGS` 变量不支持 `all`
+ 关键字,你需要手动控制所有的功能标志(否则它们会采用对应的默认值)。
+
+
+| 配置项 | 解释 | 默认值 |
+| ------------------------- | -------------------------------- | ------ |
+| `webrtc_sync` | 启用 WebRTC 同步功能。 | 关闭 |
+| `language_model_settings` | 启用语言模型设置。 | 开启 |
+| `openai_api_key` | 允许用户自定义 OpenAI API Key。 | 开启 |
+| `openai_proxy_url` | 允许用户自定义 OpenAI 代理 URL。 | 开启 |
+| `create_session` | 允许用户创建会话。 | 开启 |
+| `edit_agent` | 允许用户编辑助手。 | 开启 |
+| `dalle` | 启用 DALL-E 功能。 | 开启 |
+| `check_updates` | 允许检查更新。 | 开启 |
+| `welcome_suggest` | 显示欢迎建议。 | 开启 |
+
+你可以随时检查 [featureFlags](https://github.com/lobehub/lobe-chat/blob/main/src/config/featureFlags/schema.ts) 以获取最新的特性标志列表。
diff --git a/docs/self-hosting/advanced/model-list.mdx b/docs/self-hosting/advanced/model-list.mdx
index 9fa9eaafa21d..94c5c37408d2 100644
--- a/docs/self-hosting/advanced/model-list.mdx
+++ b/docs/self-hosting/advanced/model-list.mdx
@@ -12,7 +12,7 @@ tags:
# Model List
-LobeChat supports customizing the model list during deployment. You can use `+` to add a model, `-` to hide a model, and use `model name=display name` to customize the display name of a model, separated by English commas. The basic syntax is as follows:
+LobeChat supports customizing the model list during deployment. This configuration is done in the environment for each [model provider](/docs/self-hosting/environment-variables/model-provider). You can use `+` to add a model, `-` to hide a model, and use `model name=display name` to customize the display name of a model, separated by English commas. The basic syntax is as follows:
```text
id=displayName,model2,model3
diff --git a/docs/self-hosting/advanced/model-list.zh-CN.mdx b/docs/self-hosting/advanced/model-list.zh-CN.mdx
index 52949e1bce00..a4ac2e0fed5f 100644
--- a/docs/self-hosting/advanced/model-list.zh-CN.mdx
+++ b/docs/self-hosting/advanced/model-list.zh-CN.mdx
@@ -8,6 +8,7 @@ tags:
- 模型展示名
- 模型能力
---
+
# Model List
LobeChat 支持在部署时自定义模型列表,可以使用 `+` 增加一个模型,使用 `-` 来隐藏一个模型,使用 `模型名=展示名<扩展配置>` 来自定义模型的展示名,用英文逗号隔开。通过 `<>` 来添加扩展配置。基本语法如下:
diff --git a/docs/self-hosting/advanced/server-database.mdx b/docs/self-hosting/advanced/server-database.mdx
new file mode 100644
index 000000000000..0209abbfa340
--- /dev/null
+++ b/docs/self-hosting/advanced/server-database.mdx
@@ -0,0 +1,404 @@
+---
+title: Deploying Server-Side Database - Configuration Guide for LobeChat on Vercel
+description: >-
+ Learn how to deploy the server-side database version of LobeChat on Vercel,
+ including database configuration, identity authentication service setup, and
+ S3 storage service configuration.
+tags:
+ - Server-Side Database
+ - Vercel Deployment
+ - Postgres Database
+ - Identity Authentication
+ - S3 Storage Service
+ - Configuration Guide
+---
+
+# Deploying Server-Side Database
+
+LobeChat defaults to using a client-side database (IndexedDB) but also supports using a server-side database. LobeChat uses Postgres as the backend storage database. PostgreSQL is a powerful open-source relational database management system with high scalability and standard SQL support. It provides rich data types, concurrency control, data integrity, security, and programmability, making it suitable for complex applications and large-scale data management.
+
+This article will detail how to deploy the server-side database version of LobeChat on Vercel, including: 1) database configuration; 2) identity authentication service configuration; 3) steps for setting up the S3 storage service.
+
+
+ Due to workload constraints, currently only deployment on Vercel using the server-side database
+ version is supported, with Docker version support planned for future iterations.
+
+
+Before deploying the server, please export your backup!
+
+## 1. Configure the Database
+
+
+
+### Prepare a Server-Side Database Instance and Obtain the Connection URL
+
+Before deployment, make sure you have prepared a Postgres database instance. You can choose either of the following methods:
+
+- `A.` Use Serverless Postgres instances like Vercel/Neon;
+- `B.` Use self-deployed Postgres instances like Docker.
+
+The configuration for both methods is slightly different, which will be distinguished in the next step.
+
+### Add Environment Variables in Vercel
+
+In Vercel's deployment environment variables, add the `DATABASE_URL` and other environment variables. Fill in the prepared Postgres database connection URL. The typical format for the database connection URL is `postgres://username:password@host:port/database`.
+
+
+
+
+
+Variables required for Serverless Postgres are as follows:
+
+```shell
+# Serverless Postgres DB Url
+DATABASE_URL=
+
+# Specify the service mode as server, otherwise it won't enter the server-side database
+NEXT_PUBLIC_SERVICE_MODE=server
+```
+
+An example of how to fill in Vercel is shown below:
+
+
+
+
+
+
+ Variables required for Node Postgres are as follows:
+
+```shell
+# Node Postgres DB Url
+DATABASE_URL=
+
+# Specify the Postgres database driver as node
+DATABASE_DRIVER=node
+
+# Specify the service mode as server, otherwise it won't enter the server-side database
+NEXT_PUBLIC_SERVICE_MODE=server
+```
+
+An example of how to fill in Vercel is shown below:
+
+
+
+
+
+
+
+### Add the `KEY_VAULTS_SECRET` Environment Variable
+
+After adding the `DATABASE_URL` environment variable, you need to add a `KEY_VAULTS_SECRET` environment variable. This variable is used to encrypt sensitive information like user-stored API keys. You can generate a random 32-character string as the key using `openssl rand -base64 32`.
+
+```shell
+KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk=
+```
+
+Add this to the Vercel environment variables as well.
+
+
+
+## 2. Configure the Identity Authentication Service
+
+A server-side database needs to be paired with an identity authentication service to function properly. Therefore, the corresponding identity authentication service needs to be configured.
+
+
+ Due to workload constraints, currently only Clerk is supported as an identity authentication
+ service solution. Integration with Next-Auth for server-side database is under development.
+
+
+
+
+### Prepare the Clerk Identity Authentication Service
+
+Go to [Clerk](https://clerk.com?utm_source=lobehub&utm_medium=docs) to register and create an application to obtain the corresponding Public Key and Secret Key.
+
+
+ If you are unfamiliar with Clerk, you can refer to [Authentication
+ Service-Clerk](/en/docs/self-hosting/advanced/authentication#clerk) for details on using Clerk.
+
+
+### Add Public and Private Key Environment Variables in Vercel
+
+In Vercel's deployment environment variables, add the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` and `CLERK_SECRET_KEY` environment variables. You can click on "API Keys" in the menu, then copy the corresponding values and paste them into Vercel's environment variables.
+
+
+
+The environment variables required for this step are as follows:
+
+```shell
+NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxx
+CLERK_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxxxx
+```
+
+Add these variables to Vercel:
+
+
+
+### Create and Configure a Webhook in Clerk
+
+Since we let Clerk handle user authentication and management entirely, we need Clerk to notify our application and store data in the database when there are changes in the user lifecycle (create, update, delete). We achieve this using the Webhook provided by Clerk.
+
+We need to add an endpoint in Clerk's Webhooks to inform Clerk to send notifications to this endpoint when a user's status changes.
+
+
+
+
+
+Fill in your Vercel project's URL in the endpoint, such as `https://your-project.vercel.app/api/webhooks/clerk`. Then, in the Subscribe to events section, check the three user events (`user.created`, `user.deleted`, `user.updated`), and click create.
+
+
+
+### Add the Webhook Secret to Vercel Environment Variables
+
+After creation, you can find the secret of this Webhook in the bottom right corner:
+
+
+
+The corresponding environment variable name for this secret is `CLERK_WEBHOOK_SECRET`:
+
+```shell
+CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxx
+```
+
+Add this to Vercel's environment variables:
+
+
+
+
+
+
+
+You have now successfully configured the Clerk identity authentication service. Next, we will configure the S3 storage service.
+
+## 3. Configure S3 Storage Service
+
+LobeChat has long supported multimodal AI conversations, involving the function of uploading images to AI. In the client-side database solution, image files are stored as binary data in the browser's indexedDB database. However, this solution is not feasible in the server-side database. We need to configure the S3 storage service to store a large number of image files, and S3 can also serve as a storage solution for file uploads.
+
+
+ In this article, S3 refers to a compatible S3 storage solution, which supports object storage
+ systems that comply with the Amazon S3 API. Common examples include Cloudflare R2 etc., all of
+ which support S3-compatible APIs.
+
+
+
+
+### Configure and Obtain S3 Bucket
+
+You need to go to your S3 service provider (such as AWS S3, Cloudflare R2, etc.) and create a new storage bucket. Below is an example of the creation process using Cloudflare R2.
+
+The interface of Cloudflare R2 is shown below:
+
+
+
+When creating the bucket, specify its name and then click create.
+
+
+
+### Obtain Environment Variables for the Bucket
+
+In the settings of the R2 storage bucket, you can view the bucket configuration information:
+
+
+
+The corresponding environment variables are:
+
+```shell
+# Bucket name
+S3_BUCKET=lobechat
+# Bucket request endpoint
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# Public domain for accessing the bucket
+NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+```
+
+### Obtain S3 Key Environment Variables
+
+You need to obtain the access key for S3 so that the LobeChat server has permission to access the S3 storage service. In R2, you can configure the access key in the account details:
+
+
+
+Click the button in the upper right corner to create an API token, then enter the API Token creation page.
+
+
+
+Since our server-side database needs to read and write to the S3 storage service, the permissions need to be set to read and write, and only select the bucket we created, then click create.
+
+
+
+After creation, you can see the corresponding S3 API token.
+
+
+
+The corresponding environment variables are:
+
+```shell
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+```
+
+### Add the Corresponding Environment Variables in Vercel
+
+The steps to obtain the required environment variables may vary for different S3 service providers, but the obtained environment variables should be consistent in the end:
+
+```shell
+# S3 Key
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+
+# Bucket name
+S3_BUCKET=lobechat
+# Bucket request endpoint
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# Public domain for accessing the bucket
+NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+
+# Bucket region, such as us-west-1, generally not required to add, but some service providers may need to configure
+# S3_REGION=us-west-1
+```
+
+Then enter the above environment variables into Vercel's environment variables:
+
+
+
+### Configure Cross-Origin Resource Sharing (CORS)
+
+Since S3 storage services are often on a separate domain, cross-origin access needs to be configured.
+
+In R2, you can find the CORS configuration in the settings of the storage bucket:
+
+
+
+Add a CORS rule to allow requests from your domain (in this case, `https://your-project.vercel.app`):
+
+
+
+Example configuration:
+
+```json
+[
+ {
+ "AllowedOrigins": ["https://your-project.vercel.app"],
+ "AllowedMethods": ["GET", "PUT", "HEAD", "POST", "DELETE"],
+ "AllowedHeaders": ["*"]
+ }
+]
+```
+
+After configuration, click save.
+
+
+
+## 4. Deployment and Verification
+
+After completing the above steps, the configuration of the server database should be done. Next, we can deploy LobeChat to Vercel and then visit your Vercel link to verify if the server database is working correctly.
+
+
+ ### Redeploy the latest commit
+
+After configuring the environment variables, you need to redeploy the latest commit and wait for the deployment to complete.
+
+
+
+### Check if the features are working properly
+
+If you click on the login button in the top left corner and the login popup appears normally, then you have configured it successfully. Enjoy using it\~
+
+
+
+
+
+
+
+
+
+
+
+## Appendix
+
+### Overview of Server Database Environment Variables
+
+For easy copying, here is a summary of the environment variables required to configure the server data:
+
+```shell
+# Specify the service mode as server
+NEXT_PUBLIC_SERVICE_MODE=server
+
+# Postgres database URL
+DATABASE_URL=
+KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk=
+
+# Clerk related configurations
+NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxx
+CLERK_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxxxx
+CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxx
+
+# S3 related configurations
+# S3 keys
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+
+# Bucket name
+S3_BUCKET=lobechat
+# Bucket request endpoint
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# Public access domain for the bucket
+NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+# Bucket region, such as us-west-1, generally not needed to add, but some service providers may require configuration
+# S3_REGION=us-west-1
+```
diff --git a/docs/self-hosting/advanced/server-database.zh-CN.mdx b/docs/self-hosting/advanced/server-database.zh-CN.mdx
new file mode 100644
index 000000000000..eb84934814fb
--- /dev/null
+++ b/docs/self-hosting/advanced/server-database.zh-CN.mdx
@@ -0,0 +1,392 @@
+---
+title: 使用服务端数据库部署 - 配置 Postgres、Clerk 和 S3 存储服务
+description: 本文详细介绍如何在 Vercel 中部署服务端数据库版 LobeChat,包括数据库配置、身份验证服务配置和 S3 存储服务的设置步骤。
+tags:
+ - 服务端数据库
+ - Postgres
+ - Clerk
+ - S3存储服务
+ - Vercel部署
+ - 数据库配置
+ - 身份验证服务
+ - 环境变量配置
+---
+
+# 使用服务端数据库部署
+
+LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库。LobeChat 采用了 Postgres 作为后端存储数据库。PostgreSQL是一种强大的开源关系型数据库管理系统,具备高度扩展性和标准SQL支持。它提供了丰富的数据类型、并发处理、数据完整性、安全性及可编程性,适用于复杂应用和大规模数据管理。
+
+本文将详细介绍如何在 Vercel 中部署服务端数据库版 LobeChat,包括: 1)数据库配置;2)身份验证服务配置;3) S3 存储服务的设置步骤。
+
+
+ 限于工作量原因,目前仅支持在 Vercel 中部署使用服务端数据库版本,Docker 版本将会在后续迭代中支持。
+
+
+在部署服务端之前,请导出你的备份!
+
+## 一、 配置数据库
+
+
+
+### 准备服务端数据库实例,获取连接 URL
+
+在部署之前,请确保你已经准备好 Postgres 数据库实例,你可以选择以下任一方式:
+
+- `A.` 使用 Vercel / Neon 等 Serverless Postgres 实例;
+- `B.` 使用 Docker 等自部署 Postgres 实例。
+
+两者的配置方式略有不同,在下一步会有所区分。
+
+### 在 Vercel 中添加环境变量
+
+在 Vercel 的部署环境变量中,添加 `DATABASE_URL` 等环境变量,将上一步准备好的 Postgres 数据库连接 URL 填入其中。数据库连接 URL 的通常格式为 `postgres://username:password@host:port/database`。
+
+
+
+
+
+ Serverless Postgres 需要填写的变量如下:
+
+ ```shell
+ # Serverless Postgres DB Url
+ DATABASE_URL=
+
+ # 指定 service mode 为 server,否则不会进入服务端数据库
+ NEXT_PUBLIC_SERVICE_MODE=server
+ ```
+
+ 在 Vercel 中填写的示例如下:
+
+
+
+
+
+
+ Node Postgres 需要填写的变量如下:
+
+ ```shell
+ # Node Postgres DB Url
+ DATABASE_URL=
+
+ # 指定 Postgres database driver 为 node
+ DATABASE_DRIVER=node
+
+ # 指定 service mode 为 server,否则不会进入服务端数据库
+ NEXT_PUBLIC_SERVICE_MODE=server
+ ```
+
+ 在 Vercel 中填写的示例如下:
+
+
+
+
+
+
+
+### 添加 `KEY_VAULTS_SECRET` 环境变量
+
+在完成数据库 DATABASE_URL 环境变量添加后,需要添加一个 `KEY_VAULTS_SECRET` 环境变量。该变量用于加密用户存储的 apikey 等敏感信息。你可以使用 `openssl rand -base64 32` 生成一个随机的 32 位字符串作为密钥。
+
+```shell
+KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk=
+```
+
+同样需要将其添加到 Vercel 环境变量中。
+
+
+
+## 二、 配置身份验证服务
+
+服务端数据库需要搭配用户身份验证服务才可以正常使用。因此需要配置对应的身份验证服务。
+
+
+ 同样由于工作量原因,目前仅支持 Clerk 作为身份验证服务方案, Next-Auth 的服务端数据库集成有待开发
+
+
+
+
+### 准备 Clerk 身份验证服务
+
+前往 [Clerk](https://clerk.com?utm_source=lobehub&utm_medium=docs) 注册并创建应用,获取相应的 Public Key 和 Secret Key。
+
+
+ 如果对 Clerk 不太了解,可以查阅
+ [身份验证服务-Clerk](/zh/docs/self-hosting/advanced/authentication#clerk) 了解 Clerk 的使用详情。
+
+
+### 在 Vercel 中添加公、私钥环境变量
+
+在 Vercel 的部署环境变量中,添加 `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` 和 `CLERK_SECRET_KEY` 环境变量。你可以在菜单中点击「API Keys」,然后复制对应的值填入 Vercel 的环境变量中。
+
+
+
+此步骤所需的环境变量如下:
+
+```shell
+NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxx
+CLERK_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxxxx
+```
+
+添加上述变量到 Vercel 中:
+
+
+
+### 在 Clerk 中创建并配置 Webhook
+
+由于我们让 Clerk 完全接管用户鉴权与管理,因此我们需要在 Clerk 用户生命周期变更时(创建、更新、删除)中通知我们的应用并存储落库。我们通过 Clerk 提供的 Webhook 来实现这一诉求。
+
+我们需要在 Clerk 的 Webhooks 中添加一个端点(Endpoint),告诉 Clerk 当用户发生变更时,向这个端点发送通知。
+
+
+
+在 endppint 中填写你的 Vercel 项目的 URL,如 `https://your-project.vercel.app/api/webhooks/clerk`。然后在订阅事件(Subscribe to events)中,勾选 user 的三个事件(`user.created` 、`user.deleted`、`user.updated`),然后点击创建。
+
+
+
+### 将 Webhook 秘钥添加到 Vercel 环境变量
+
+创建完毕后,可以在右下角找到该 Webhook 的秘钥:
+
+
+
+这个秘钥所对应的环境变量名为 `CLERK_WEBHOOK_SECRET`:
+
+```shell
+CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxx
+```
+
+将其添加到 Vercel 的环境变量中:
+
+
+
+
+
+这样,你已经成功配置了 Clerk 身份验证服务。接下来我们将配置 S3 存储服务。
+
+## 三、 配置 S3 存储服务
+
+LobeChat 在很早以前就支持了多模态 的 AI 会话,其中涉及到图片上传给 AI 的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 indexedDB 数据库,但在服务端数据库中这个方案并不可行。我们需要配置 S3 存储服务来存储大量的图片文件,同时 S3 也可以作为文件上传的存储方案。
+
+
+ 在本文,S3所指代的是指兼容 S3 存储方案,即支持 Amazon S3 API 的对象存储系统,常见例如 Cloudflare
+ R2 、阿里云 OSS 等均支持 S3 兼容 API。
+
+
+
+
+ ### 配置并获取 S3 存储桶
+
+ 你需要前往你的 S3 服务提供商(如 AWS S3、Cloudflare R2 等)并创建一个新的存储桶(Bucket)。接下来以 Cloudflare R2 为例,介绍创建流程。
+
+ 下图是 Cloudflare R2 的界面:
+
+
+
+ 创建存储桶时将指定其名称,然后点击创建。
+
+
+ ### 获取存储桶相关环境变量
+
+ 在 R2 存储桶的设置中,可以看到桶配置的信息:
+
+
+
+其对应的环境变量为:
+
+```shell
+# 存储桶的名称
+S3_BUCKET=lobechat
+# 存储桶的请求端点
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# 存储桶对外的访问域名
+NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+```
+
+ ### 获取 S3 密钥环境变量
+
+ 你需要获取 S3 的访问密钥,以便 LobeChat 的服务端有权限访问 S3 存储服务。在 R2 中,你可以在账户详情中配置访问密钥:
+
+
+
+ 点击右上角按钮创建 API token,进入创建 API Token 页面
+
+
+
+ 鉴于我们的服务端数据库需要读写 S3 存储服务,因此权限需要选择读与写,并只选择我们所创建的存储桶,然后点击创建。
+
+
+
+ 创建完成后,就可以看到对应的 S3 API token
+
+
+
+ 其对应的环境变量为:
+
+```shell
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+```
+
+### 在 Vercel 中添加对应的环境变量
+
+ 不同 S3 服务商获取所需环境变量的步骤可能有所不同,但最终获得到的环境变量应该都是一致的:
+
+```shell
+# S3 秘钥
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+
+# 存储桶的名称
+S3_BUCKET=lobechat
+# 存储桶的请求端点
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# 存储桶对外的访问域名
+NEXT_PUBLIC_S3_DOMAIN=https://s3-dev.your-domain.com
+
+# 桶的区域,如 us-west-1,一般来说不需要添加,但某些服务商则需要配置
+# S3_REGION=us-west-1
+```
+
+然后将上述环境变量填入 Vercel 的环境变量中:
+
+
+
+ ### 配置跨域
+
+ 由于 S3 存储服务往往是一个独立的网址,因此需要配置跨域访问。
+
+ 在 R2 中,你可以在存储桶的设置中找到跨域配置:
+
+
+
+ 添加跨域规则,允许你的域名(在上文是 `https://your-project.vercel.app`)来源的请求:
+
+
+
+示例配置如下:
+
+```json
+[
+ {
+ "AllowedOrigins": ["https://your-project.vercel.app"],
+ "AllowedMethods": ["GET", "PUT", "HEAD", "POST", "DELETE"],
+ "AllowedHeaders": ["*"]
+ }
+]
+```
+
+配置后点击保存即可。
+
+
+
+## 四、部署并验证
+
+通过上述步骤之后,我们应该就完成了服务端数据库的配置。接下来我们可以将 LobeChat 部署到 Vercel 上,然后访问你的 Vercel 链接,验证服务端数据库是否正常工作。
+
+
+ ### 重新部署最新的 commit
+
+配置好环境变量后,你需要重新部署最新的 commit,并等待部署完成。
+
+
+
+### 检查功能是否正常
+
+如果你点击左上角登录,可以正常显示登录弹窗,那么说明你已经配置成功了,尽情享用吧~
+
+
+
+
+
+
+
+## 附录
+
+### 服务端数据库环境变量一览
+
+为方便一键复制,在此汇总配置服务端数据所需要的环境变量:
+
+```shell
+# 指定服务模式为 server
+NEXT_PUBLIC_SERVICE_MODE=server
+
+# Postgres 数据库 URL
+DATABASE_URL=
+KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk=
+
+# Clerk 相关配置
+NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxx
+CLERK_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxxxx
+CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxx
+
+# S3 相关配置
+# S3 秘钥
+S3_ACCESS_KEY_ID=9998d6757e276cf9f1edbd325b7083a6
+S3_SECRET_ACCESS_KEY=55af75d8eb6b99f189f6a35f855336ea62cd9c4751a5cf4337c53c1d3f497ac2
+
+# 存储桶的名称
+S3_BUCKET=lobechat
+# 存储桶的请求端点
+S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
+# 存储桶对外的访问域名
+NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com
+# 桶的区域,如 us-west-1,一般来说不需要添加,但某些服务商则需要配置
+# S3_REGION=us-west-1
+```
diff --git a/docs/self-hosting/advanced/settings-url-share.mdx b/docs/self-hosting/advanced/settings-url-share.mdx
index 179cdb516a2b..c12a09ac26d8 100644
--- a/docs/self-hosting/advanced/settings-url-share.mdx
+++ b/docs/self-hosting/advanced/settings-url-share.mdx
@@ -1,9 +1,25 @@
-# Share settings via URL
+---
+title: Share Settings via URL - Import and Export Configuration Settings
+description: >-
+ Learn how to import and export configuration settings for LobeChat via URL.
+ Understand the supported settings, URL format, and parameter schema for
+ keyVaults and languageModel.
+tags:
+ - Share Settings
+ - URL Import
+ - URL Export
+ - Configuration Settings
+ - LobeChat
+ - Parameter Schema
+---
+
+# Share settings via URL
LobeChat support import settings from external URL to quickly set up LobeChat configuration.
The currently supported settings are:
+- `keyVaults`: provider api key and baseURL settings
- `languageModel`: Language model settings
## Import from URL
@@ -12,18 +28,18 @@ Use the following URL format to import settings parameters from an external URL:
```plaintext
https://lobehub.com/?settings=
-https://lobehub.com/?settings={"languageModel":{"openai":{"apiKey":"user-key","endpoint":"https://lobehub.com/v1"}}}
+https://lobehub.com/?settings={"keyVaults":{"openai":{"apiKey":"user-key","baseURL":"https://your-proxy.com/v1"}}}
```
Example of settings in JSON format:
```json
{
- "languageModel": {
- "openai": {
- "apiKey": "user-key"
- }
+ "keyVaults": {
+ "openai": {
+ "apiKey": "user-key"
}
+ }
}
```
@@ -32,69 +48,100 @@ Example of settings in JSON format:
```ts
// Generate settings to export to URL
const settings = {
- languageModel: {
+ keyVaults: {
openai: {
- apiKey: 'user-key',
- endpoint: 'https://lobehub.com/v1'
+ apiKey: 'user-key',
+ baseURL: 'https://your-proxy.com/v1',
},
-}};
+ },
+};
// Convert settings to a JSON formatted string
const url = `/?settings=${JSON.stringify(settings)}`;
-console.log(url);
-// /?settings={"languageModel":{"openai":{"apiKey":"user-key","endpoint":"https://lobehub.com/v1"}}}
+console.log(url);
+// /?settings={"keyVaults":{"openai":{"apiKey":"user-key","baseURL":"https://your-proxy.com/v1"}}}
```
- LobeChat does not verify the correctness of the settings parameters in the URL, nor provide encryption or decryption methods. Please use with caution.
+ LobeChat does not verify the correctness of the settings parameters in the URL, nor provide
+ encryption or decryption methods. Please use with caution.
## Parameter schema
-### languageModel
+### keyVaults
- Property name and type
-| Property name | Type |
-|---------------|--------------------------------|
-| anthropic | GeneralModelProviderConfig |
-| azure | AzureOpenAIConfig |
-| bedrock | AWSBedrockConfig |
-| google | GeneralModelProviderConfig |
-| groq | GeneralModelProviderConfig |
-| minimax | GeneralModelProviderConfig |
-| mistral | GeneralModelProviderConfig |
-| moonshot | GeneralModelProviderConfig |
-| ollama | GeneralModelProviderConfig |
-| openai | GeneralModelProviderConfig |
-| openrouter | GeneralModelProviderConfig |
-| perplexity | GeneralModelProviderConfig |
-| togetherai | GeneralModelProviderConfig |
-| zeroone | GeneralModelProviderConfig |
-| zhipu | GeneralModelProviderConfig |
-
-- Type `GeneralModelProviderConfig`
-
-| Property name | Type | Description |
-|-----------------------|--------------------------|-----------------------------------------------------------------------------|
-| apiKey | string | The API key for the model provider. |
-| autoFetchModelLists | boolean | Whether to automatically fetch model lists. |
-| enabled | boolean | Whether the model provider is enabled. |
-| enabledModels | string[] | null | The IDs of the enabled models. |
-| endpoint | string | The endpoint for the model provider. |
-| fetchOnClient | boolean | Whether to fetch on the client. |
-
-- Type `AzureOpenAIConfig`
-> Inherits the fields from `GeneralModelProviderConfig`
-
-| Property name | Type | Description |
-|-----------------------|--------------------------|-----------------------------------------------------------------------------|
-| apiVersion | string | The API version for Azure OpenAI. |
-
-- Type `AWSBedrockConfig`
-> Inherits all fields from `GeneralModelProviderConfig` except `apiKey, endpoint`
-
-| Property name | Type | Description |
-| accessKeyId | string | The access key ID for AWS Bedrock. |
-| region | string | The region for AWS Bedrock. |
-| secretAccessKey | string | The secret access key for AWS Bedrock. |
+| Property name | Type |
+| ------------- | -------------------------- |
+| anthropic | `OpenAICompatibleKeyVault` |
+| azure | `AzureOpenAIKeyVault` |
+| bedrock | `AWSBedrockKeyVault` |
+| google | `OpenAICompatibleKeyVault` |
+| groq | `OpenAICompatibleKeyVault` |
+| minimax | `OpenAICompatibleKeyVault` |
+| mistral | `OpenAICompatibleKeyVault` |
+| moonshot | `OpenAICompatibleKeyVault` |
+| ollama | `OpenAICompatibleKeyVault` |
+| openai | `OpenAICompatibleKeyVault` |
+| openrouter | `OpenAICompatibleKeyVault` |
+| perplexity | `OpenAICompatibleKeyVault` |
+| togetherai | `OpenAICompatibleKeyVault` |
+| zeroone | `OpenAICompatibleKeyVault` |
+| zhipu | `OpenAICompatibleKeyVault` |
+
+- Type `OpenAICompatibleKeyVault`
+
+| Property name | Type | Description |
+| ------------- | ------ | ------------------------------------ |
+| apiKey | string | The API key for the model provider. |
+| baseURL | string | The endpoint for the model provider. |
+
+- Type `AzureOpenAIKeyVault`
+
+| Property name | Type | Description |
+| ------------- | ------ | ------------------------------------ |
+| apiVersion | string | The API version for Azure OpenAI. |
+| apiKey | string | The API key for the model provider. |
+| endpoint | string | The endpoint for the model provider. |
+
+- Type `AWSBedrockKeyVault`
+
+| Property name | Type | Description |
+| --------------- | ------ | -------------------------------------- |
+| accessKeyId | string | The access key ID for AWS Bedrock. |
+| region | string | The region for AWS Bedrock. |
+| secretAccessKey | string | The secret access key for AWS Bedrock. |
+
+### languageModel
+
+```ts
+export type UserModelProviderConfig = Record;
+```
+| Property name | Type |
+| ------------- | ---------------- |
+| anthropic | `ProviderConfig` |
+| azure | `ProviderConfig` |
+| bedrock | `ProviderConfig` |
+| google | `ProviderConfig` |
+| groq | `ProviderConfig` |
+| minimax | `ProviderConfig` |
+| mistral | `ProviderConfig` |
+| moonshot | `ProviderConfig` |
+| ollama | `ProviderConfig` |
+| openai | `ProviderConfig` |
+| openrouter | `ProviderConfig` |
+| perplexity | `ProviderConfig` |
+| togetherai | `ProviderConfig` |
+| zeroone | `ProviderConfig` |
+| zhipu | `ProviderConfig` |
+
+- Type `ProviderConfig`
+
+| Property name | Type | Description |
+| ------------------- | -------- | ------------------------------------------- | ------------------------------ |
+| autoFetchModelLists | boolean | Whether to automatically fetch model lists. |
+| enabled | boolean | Whether the model provider is enabled. |
+| enabledModels | string[] | null | The IDs of the enabled models. |
+| fetchOnClient | boolean | Whether to fetch on the client. |
diff --git a/docs/self-hosting/advanced/settings-url-share.zh-CN.mdx b/docs/self-hosting/advanced/settings-url-share.zh-CN.mdx
index 269c687cbc65..14f47b5fc715 100644
--- a/docs/self-hosting/advanced/settings-url-share.zh-CN.mdx
+++ b/docs/self-hosting/advanced/settings-url-share.zh-CN.mdx
@@ -1,10 +1,25 @@
+---
+title: URL 分享设置参数 - LobeChat 配置快速设置
+description: 了解如何从外部 URL 导入和导出 LobeChat 的设置参数,包括 keyVaults 和 languageModel,以及参数格式和类型。
+tags:
+ - URL 分享
+ - 设置参数
+ - LobeChat
+ - keyVaults
+ - languageModel
+ - JSON 格式
+ - URL 导入
+ - URL 导出
+---
+
# URL 分享设置参数
LobeChat 支持从外部 URL 导入设置参数,以便于快速设置 LobeChat 的配置。
目前支持的设置项有:
-- `languageModel`:语言模型设置
+- `keyVaults`: 模型供应商相关秘钥设置
+- `languageModel`:语言模型设置
## 从 URL 中导入
@@ -12,18 +27,18 @@ LobeChat 支持从外部 URL 导入设置参数,以便于快速设置 LobeChat
```plaintext
https://lobehub.com/?settings=
-https://lobehub.com/?settings={"languageModel":{"openai":{"apiKey":"user-key","endpoint":"https://lobehub.com/v1"}}}
+https://lobehub.com/?settings={"keyVaults":{"openai":{"apiKey":"user-key","baseURL":"https://your-proxy.com/v1"}}}
```
JSON格式的设置示例:
```json
{
- "languageModel": {
- "openai": {
- "apiKey": "user-key"
- }
+ "keyVaults": {
+ "openai": {
+ "apiKey": "user-key"
}
+ }
}
```
@@ -32,69 +47,99 @@ JSON格式的设置示例:
```ts
// 生成要导出到 URL 的设置
const settings = {
- languageModel: {
+ keyVaults: {
openai: {
- apiKey: 'user-key',
- endpoint: 'https://lobehub.com/v1'
+ apiKey: 'user-key',
+ baseURL: 'https://your-proxy.com/v1',
},
-}};
-// 将设置转为 JSON 格式的字符串
+ },
+};
+// Convert settings to a JSON formatted string
const url = `/?settings=${JSON.stringify(settings)}`;
-console.log(url);
-// /?settings={"languageModel":{"openai":{"apiKey":"user-key","endpoint":"https://lobehub.com/v1"}}}
+console.log(url);
+// /?settings={"keyVaults":{"openai":{"apiKey":"user-key","baseURL":"https://your-proxy.com/v1"}}}
```
- LobeChat 不对 URL 中的设置参数进行正确性校验,也不提供加密、解密方法,请谨慎使用。
+ LobeChat 不对 URL 中的设置参数进行正确性校验,也不提供 URL 的加密、解密方法,请谨慎使用。
## 参数格式
-### languageModel
+### keyVaults
- 参数及其类型
-| 参数名称 | 类型 |
-|---------------|--------------------------------|
-| anthropic | GeneralModelProviderConfig |
-| azure | AzureOpenAIConfig |
-| bedrock | AWSBedrockConfig |
-| google | GeneralModelProviderConfig |
-| groq | GeneralModelProviderConfig |
-| minimax | GeneralModelProviderConfig |
-| mistral | GeneralModelProviderConfig |
-| moonshot | GeneralModelProviderConfig |
-| ollama | GeneralModelProviderConfig |
-| openai | GeneralModelProviderConfig |
-| openrouter | GeneralModelProviderConfig |
-| perplexity | GeneralModelProviderConfig |
-| togetherai | GeneralModelProviderConfig |
-| zeroone | GeneralModelProviderConfig |
-| zhipu | GeneralModelProviderConfig |
-
-- 类型 `GeneralModelProviderConfig`
-
-| 参数 | TS 类型 | 描述 |
-|-----------------------|--------------------------|-----------------------------------------------------------------------------|
-| apiKey | string | 模型的 API 密钥。 |
-| autoFetchModelLists | boolean | 是否自动获取模型列表。 |
-| enabled | boolean | 是否启用该模型。 |
-| enabledModels | string[] | 启用的模型的 ID。 |
-| endpoint | string | 模型API端点。 |
-| fetchOnClient | boolean | 是否在客户端发起请求,默认在服务端发起请求。 |
-
-- 类型 `AzureOpenAIConfig`
-> 继承 `GeneralModelProviderConfig` 中的字段
-
-| 参数 | TS 类型 | 描述 |
-|-----------------------|--------------------------|-----------------------------------------------------------------------------|
+| 参数名称 | 类型 |
+| ---------- | -------------------------- |
+| anthropic | `OpenAICompatibleKeyVault` |
+| azure | `AzureOpenAIKeyVault` |
+| bedrock | `AWSBedrockKeyVault` |
+| google | `OpenAICompatibleKeyVault` |
+| groq | `OpenAICompatibleKeyVault` |
+| minimax | `OpenAICompatibleKeyVault` |
+| mistral | `OpenAICompatibleKeyVault` |
+| moonshot | `OpenAICompatibleKeyVault` |
+| ollama | `OpenAICompatibleKeyVault` |
+| openai | `OpenAICompatibleKeyVault` |
+| openrouter | `OpenAICompatibleKeyVault` |
+| perplexity | `OpenAICompatibleKeyVault` |
+| togetherai | `OpenAICompatibleKeyVault` |
+| zeroone | `OpenAICompatibleKeyVault` |
+| zhipu | `OpenAICompatibleKeyVault` |
+
+- Type `OpenAICompatibleKeyVault`
+
+| 参数 | 类型 | 描述 |
+| ------- | ------ | ----------------- |
+| apiKey | string | 模型的 API 密钥。 |
+| baseURL | string | 模型API端点。 |
+
+- Type `AzureOpenAIKeyVault`
+
+| 参数 | 类型 | 描述 |
+| ---------- | ------ | -------------------------- |
| apiVersion | string | Azure OpenAI 的 API 版本。 |
+| apiKey | string | 模型的 API 密钥。 |
+| baseURL | string | 模型API端点。 |
+
+- Type `AWSBedrockKeyVault`
+
+| 参数 | 类型 | 描述 |
+| --------------- | ------ | --------------------------- |
+| accessKeyId | string | AWS Bedrock 的访问密钥 ID。 |
+| region | string | AWS Bedrock 的区域。 |
+| secretAccessKey | string | AWS Bedrock 的访问密钥。 |
-- 类型 `AWSBedrockConfig`
-> 继承 `GeneralModelProviderConfig` 中除 `apiKey, endpoint` 外的所有字段
+### languageModel
+
+```ts
+export type UserModelProviderConfig = Record;
+```
-| 参数 | TS 类型 | 描述 |
-|-----------------------|--------------------------|-----------------------------------------------------------------------------|
-| accessKeyId | string | AWS Bedrock 的访问密钥 ID。 |
-| region | string | AWS Bedrock 的区域。 |
-| secretAccessKey | string | AWS Bedrock 的访问密钥。 |
+| 参数名称 | 类型 |
+| ---------- | ---------------- |
+| anthropic | `ProviderConfig` |
+| azure | `ProviderConfig` |
+| bedrock | `ProviderConfig` |
+| google | `ProviderConfig` |
+| groq | `ProviderConfig` |
+| minimax | `ProviderConfig` |
+| mistral | `ProviderConfig` |
+| moonshot | `ProviderConfig` |
+| ollama | `ProviderConfig` |
+| openai | `ProviderConfig` |
+| openrouter | `ProviderConfig` |
+| perplexity | `ProviderConfig` |
+| togetherai | `ProviderConfig` |
+| zeroone | `ProviderConfig` |
+| zhipu | `ProviderConfig` |
+
+- 类型 `ProviderConfig`
+
+| 参数 | TS 类型 | 描述 |
+| ------------------- | -------- | -------------------------------------------- |
+| autoFetchModelLists | boolean | 是否自动获取模型列表。 |
+| enabled | boolean | 是否启用该模型。 |
+| enabledModels | string[] | 启用的模型的 ID。 |
+| fetchOnClient | boolean | 是否在客户端发起请求,默认在服务端发起请求。 |
diff --git a/docs/self-hosting/advanced/sso-providers/zitadel.mdx b/docs/self-hosting/advanced/sso-providers/zitadel.mdx
index 1e27a9dc54a3..b9cae84c131b 100644
--- a/docs/self-hosting/advanced/sso-providers/zitadel.mdx
+++ b/docs/self-hosting/advanced/sso-providers/zitadel.mdx
@@ -57,7 +57,8 @@ http(s)://your-domain/api/auth/callback/zitadel
- You can fill in or modify redirect URIs after creating the application, but make sure the filled
URL is consistent with the deployed URL.
- - Replace `http(s)://your-domain` with the actual URL that LobeChat is deployed to.
+- Replace `http(s)://your-domain` with the actual URL that LobeChat is deployed to.
+
Confirm the configuration and click **Create**.
@@ -76,8 +77,7 @@ Save the **ClientId** and **ClientSecret** for later use.
src="https://github.com/lobehub/lobe-chat/assets/8692892/407b4eed-7f21-4aa6-b68f-9bae2faf09d0"
/>
-In the application settings page, navigate to the **Token Settings** tab, enable **User Info inside
-ID Token** option, and click **Save**.
+In the application settings page, navigate to the **Token Settings** tab, enable **User Info inside ID Token** option, and click **Save**.
- 可以创建应用后再填写或修改重定向 URL,但请确保填写的 URL 与部署的 URL 一致。
- - 请将 `http(s)://your-domain` 替换为 LobeChat 部署的实际 URL。
+- 请将 `http(s)://your-domain` 替换为 LobeChat 部署的实际 URL。
+
确认配置并点击「创建」。
diff --git a/docs/self-hosting/advanced/upstream-sync.mdx b/docs/self-hosting/advanced/upstream-sync.mdx
index bd3f62a67e8d..5324ea0eb909 100644
--- a/docs/self-hosting/advanced/upstream-sync.mdx
+++ b/docs/self-hosting/advanced/upstream-sync.mdx
@@ -126,13 +126,13 @@ if [ $? -eq 0 ]; then
exit 0
fi
-echo "Detected Lobe-Chat update"
+echo "Detected lobe-chat update"
# Remove the old container
-echo "Removed: $(docker rm -f Lobe-Chat)"
+echo "Removed: $(docker rm -f lobe-chat)"
-# Run the new container
-echo "Started: $(docker run -d --network=host --env-file /path/to/lobe.env --name=Lobe-Chat --restart=always lobehub/lobe-chat)"
+# Run the new container(Please change the path to the env file)
+echo "Started: $(docker run -d --network=host --env-file /path/to/lobe.env --name=lobe-chat --restart=always lobehub/lobe-chat)"
# Print the update time and version
echo "Update time: $(date)"
diff --git a/docs/self-hosting/advanced/upstream-sync.zh-CN.mdx b/docs/self-hosting/advanced/upstream-sync.zh-CN.mdx
index 18623aecbde5..eab56be998a7 100644
--- a/docs/self-hosting/advanced/upstream-sync.zh-CN.mdx
+++ b/docs/self-hosting/advanced/upstream-sync.zh-CN.mdx
@@ -103,7 +103,7 @@ OPENAI_MODEL_LIST=-gpt-4,-gpt-4-32k,-gpt-3.5-turbo-16k,gpt-3.5-turbo-1106=gpt-3.
# auto-update-lobe-chat.sh
# 设置代理(可选)
-export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
+# export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
# 拉取最新的镜像并将输出存储在变量中
output=$(docker pull lobehub/lobe-chat:latest 2>&1)
@@ -121,13 +121,13 @@ if [ $? -eq 0 ]; then
exit 0
fi
-echo "Detected Lobe-Chat update"
+echo "Detected lobe-chat update"
# 删除旧的容器
-echo "Removed: $(docker rm -f Lobe-Chat)"
+echo "Removed: $(docker rm -f lobe-chat)"
-# 运行新的容器
-echo "Started: $(docker run -d --network=host --env-file /path/to/lobe.env --name=Lobe-Chat --restart=always lobehub/lobe-chat)"
+# 运行新的容器(请将env配置文件地址改为你的实际地址)
+echo "Started: $(docker run -d --network=host --env-file path/to/lobe.env --name=lobe-chat --restart=always lobehub/lobe-chat)"
# 打印更新的时间和版本
echo "Update time: $(date)"
diff --git a/docs/self-hosting/environment-variables/analytics.mdx b/docs/self-hosting/environment-variables/analytics.mdx
index f205b5b57375..770a99df5703 100644
--- a/docs/self-hosting/environment-variables/analytics.mdx
+++ b/docs/self-hosting/environment-variables/analytics.mdx
@@ -1,7 +1,5 @@
---
-title: >-
- Integrating Data Analytics Services in LobeChat: Environment Variables and
- Configuration
+title: Integrating Analytics in LobeChat
description: >-
Learn how to configure environment variables for Vercel Analytics, Google
Analytics, PostHog Analytics, and Umami Analytics in LobeChat for data
@@ -36,44 +34,30 @@ We have integrated several free/open-source data analytics services in LobeChat
## Google Analytics
-### `ENABLE_GOOGLE_ANALYTICS`
-
-- Type: Optional
-- Description: Used to configure the environment variable for Google Analytics. Set to `1` to enable Google Analytics.
-- Default: `-`
-- Example: `1`
-
### `GOOGLE_ANALYTICS_MEASUREMENT_ID`
- Type: Required
-- Description: Google Analytics Measurement ID,you can get it from the Google Analytics dashboard.
+- Description: Google Analytics Measurement ID,you can get it from the Google Analytics dashboard. Add it will auto enable Google Analytics.
- Default: `-`
- Example: `G-63LP2TV03T`
## Posthog Analytics
-### `NEXT_PUBLIC_ANALYTICS_POSTHOG`
+### `POSTHOG_KEY`
-- Type: Optional
-- Description: Used to enable the environment variable for [PostHog Analytics][posthog-analytics-url]. Set to `1` to enable PostHog Analytics.
-- Default: `-`
-- Example: `1`
-
-### `NEXT_PUBLIC_POSTHOG_KEY`
-
-- Type: Optional
-- Description: Set the PostHog project Key.
+- Type: Required
+- Description: Set the PostHog project Key. Add it will auto enable PostHog Analytics.
- Default: `-`
- Example: `phc_xxxxxxxx`
-### `NEXT_PUBLIC_POSTHOG_HOST`
+### `POSTHOG_HOST`
- Type: Optional
- Description: Set the deployment address of the PostHog service, defaulting to the official SAAS address.
- Default: `https://app.posthog.com`
- Example: `https://example.com`
-### `NEXT_PUBLIC_POSTHOG_DEBUG`
+### `DEBUG_POSTHOG_ANALYTICS`
- Type: Optional
- Description: Enable the debug mode for PostHog.
@@ -82,26 +66,19 @@ We have integrated several free/open-source data analytics services in LobeChat
## Umami Analytics
-### `NEXT_PUBLIC_ANALYTICS_UMAMI`
+### `UMAMI_WEBSITE_ID`
-- Type: Optional
-- Description: Used to enable the environment variable for [Umami Analytics][umami-analytics-url]. Set to `1` to enable Umami Analytics.
+- Type: Required
+- Description: Your Umami Website ID. Add it will auto enable Umami Analytics.
- Default: `-`
-- Example: `1`
+- Example: `E738D82A-EE9E-4806-A81F-0CA3CAE57F65`
-### `NEXT_PUBLIC_UMAMI_SCRIPT_URL`
+### `UMAMI_SCRIPT_URL`
- Type: Optional
- Description: The URL of the Umami script, defaulting to the script URL provided by Umami Cloud.
- Default: `https://analytics.umami.is/script.js`
- Example: `https://umami.your-site.com/script.js`
-### `NEXT_PUBLIC_UMAMI_WEBSITE_ID`
-
-- Type: Required
-- Description: Your Umami Website ID.
-- Default: `-`
-- Example: `E738D82A-EE9E-4806-A81F-0CA3CAE57F65`
-
[posthog-analytics-url]: https://posthog.com
[umami-analytics-url]: https://umami.is
diff --git a/docs/self-hosting/environment-variables/analytics.zh-CN.mdx b/docs/self-hosting/environment-variables/analytics.zh-CN.mdx
index b6853c6cc483..df02c2d86b1b 100644
--- a/docs/self-hosting/environment-variables/analytics.zh-CN.mdx
+++ b/docs/self-hosting/environment-variables/analytics.zh-CN.mdx
@@ -32,44 +32,30 @@ tags:
## Google Analytics
-### `ENABLE_GOOGLE_ANALYTICS`
-
-- 类型:必选
-- 描述:用于配置 Google Analytics 的环境变量,当设为 `1` 时开启 Google Analytics
-- 默认值: `-`
-- 示例:`1`
-
### `GOOGLE_ANALYTICS_MEASUREMENT_ID`
- 类型:必选
-- 描述:Google Analytics 的 Measurement ID,如果开启了 Google Analytics,此项必填
+- 描述:Google Analytics 的 Measurement ID,填写此项后将自动开启 Google Analytics
- 默认值: `-`
- 示例:`G-63LP2TV03T`
## Posthog Analytics
-### `NEXT_PUBLIC_ANALYTICS_POSTHOG`
-
-- 类型:可选
-- 描述:用于开启 [PostHog Analytics][posthog-analytics-url] 的环境变量,设为 `1` 时开启 PostHog Analytics
-- 默认值: `-`
-- 示例:`1`
+### `POSTHOG_KEY`
-### `NEXT_PUBLIC_POSTHOG_KEY`
-
-- 类型:可选
-- 描述:设置 PostHog 项目 Key
+- 类型:必选
+- 描述:设置 PostHog 项目 Key,设置此项后将自动开启 PostHog Analytics
- 默认值: `-`
- 示例:`phc_xxxxxxxx`
-### `NEXT_PUBLIC_POSTHOG_HOST`
+### `POSTHOG_HOST`
- 类型:可选
-- 描述:设置 PostHog 服务的部署地址,默认为官方的 SAAS 地址
+- 描述:设置 PostHog 服务的部署地址,默认为官方的 SaaS 地址
- 默认值:`https://app.posthog.com`
- 示例:`https://example.com`
-### `NEXT_PUBLIC_POSTHOG_DEBUG`
+### `POSTHOG_DEBUG`
- 类型:可选
- 描述:开启 PostHog 的调试模式
@@ -78,26 +64,19 @@ tags:
## Umami Analytics
-### `NEXT_PUBLIC_ANALYTICS_UMAMI`
+### `UMAMI_WEBSITE_ID`
-- 类型:可选
-- 描述:用于开启 [Umami Analytics][umami-analytics-url] 的环境变量,设为 `1` 时开启 Umami Analytics
-- 默认值: `-`
-- 示例:`1`
+- 类型:必选
+- 描述:你的 Umami 的 Website ID,填写此项后将自动开启 Umami Analytics
+- 默认值:`-`
+- 示例:`E738D82A-EE9E-4806-A81F-0CA3CAE57F65`
-### `NEXT_PUBLIC_UMAMI_SCRIPT_URL`
+### `UMAMI_SCRIPT_URL`
- 类型:可选
- 描述:Umami 脚本的网址,默认为 Umami Cloud 提供的脚本网址
- 默认值:`https://analytics.umami.is/script.js`
- 示例:`https://umami.your-site.com/script.js`
-### `NEXT_PUBLIC_UMAMI_WEBSITE_ID`
-
-- 类型:必选
-- 描述:你的 Umami 的 Website ID
-- 默认值:`-`
-- 示例:`E738D82A-EE9E-4806-A81F-0CA3CAE57F65`
-
[posthog-analytics-url]: https://posthog.com
[umami-analytics-url]: https://umami.is
diff --git a/docs/self-hosting/environment-variables/basic.mdx b/docs/self-hosting/environment-variables/basic.mdx
index 1ed7dce56236..b6f0342e91ff 100644
--- a/docs/self-hosting/environment-variables/basic.mdx
+++ b/docs/self-hosting/environment-variables/basic.mdx
@@ -36,7 +36,7 @@ LobeChat provides some additional configuration options during deployment, which
When using the `random` mode, a random API Key will be selected from the available multiple API Keys.
-When using the `turn` mode, the API Keys will be retrieved in a round-robin manner according to the specified order.
+When using the `turn` mode, the API Keys will be retrieved in a polling manner according to the specified order.
### `NEXT_PUBLIC_BASE_PATH`
@@ -50,7 +50,7 @@ When using the `turn` mode, the API Keys will be retrieved in a round-robin mann
- Type: Optional
- Description: Used to configure the default settings for the LobeChat default agent. It supports various data types and structures, including key-value pairs, nested fields, array values, and more.
- Default: -
-- Example: `'model=gpt-4-1106-preview;params.max_tokens=300;plugins=search-engine,lobe-image-designer`
+- Example: `'model=gpt-4-1106-preview;params.max_tokens=300;plugins=search-engine,lobe-image-designer'`
The `DEFAULT_AGENT_CONFIG` is used to configure the default settings for the LobeChat default agent. It supports various data types and structures, including key-value pairs, nested fields, array values, and more. The table below provides detailed information on the configuration options, examples, and corresponding explanations for the `DEFAULT_AGENT_CONFIG` environment variable:
@@ -61,8 +61,8 @@ The `DEFAULT_AGENT_CONFIG` is used to configure the default settings for the Lob
| Array | `plugins=search-engine,lobe-image-designer` | Enable the `search-engine` and `lobe-image-designer` plugins. |
| Chinese Comma | `plugins=search-engine,lobe-image-designer` | Same as above, demonstrating support for Chinese comma separation. |
| Multiple Configurations | `model=glm-4;provider=zhipu` | Set the model to `glm-4` and the model provider to `zhipu`. |
-| Numeric Value | `params.max_tokens=300` | Set the maximum tokens to `300`. |
-| Boolean Value | `enableAutoCreateTopic=true` | Enable automatic topic creation. |
+| Numeric Value | `params.max_tokens=300`, `chatConfig.historyCount=5` | Set the maximum tokens to `300`, Set the number of historical messages to 5. |
+| Boolean Value | `chatConfig.enableAutoCreateTopic=true`, `chatConfig.enableCompressThreshold=true`, `chatConfig.enableHistoryCount=true` | Enable automatic topic creation, History length compression threshold, number of historical records. |
| Special Characters | `inputTemplate="Hello; I am a bot;"` | Set the input template to `Hello; I am a bot;`. |
| Error Handling | `model=gpt-4;maxToken` | Ignore invalid entry `maxToken` and only parse `model=gpt-4`. |
| Value Override | `model=gpt-4;model=gpt-4-1106-preview` | If a key is repeated, use the value that appears last; in this case, the value of `model` is `gpt-4-1106-preview`. |
@@ -71,6 +71,15 @@ Further reading:
- [[RFC] 022 - Default Assistant Parameters Configuration via Environment Variables](https://github.com/lobehub/lobe-chat/discussions/913)
+### `FEATURE_FLAGS`
+
+- Type: Optional
+- Description: Used to control LobeChat's feature functionalities. Supports multiple feature flags, using `+` to add a feature and `-` to disable a feature. Separate multiple feature flags with a comma `,` and enclose the entire value in quotes `"` to avoid parsing errors.
+- Default: `-`
+- Example: `"-welcome_suggest"`
+
+For specific content, please refer to the [Feature Flags](/docs/self-hosting/advanced/feature-flags) documentation.
+
## Plugin Service
### `PLUGINS_INDEX_URL`
diff --git a/docs/self-hosting/environment-variables/basic.zh-CN.mdx b/docs/self-hosting/environment-variables/basic.zh-CN.mdx
index 61bfc55a28de..ab6812211970 100644
--- a/docs/self-hosting/environment-variables/basic.zh-CN.mdx
+++ b/docs/self-hosting/environment-variables/basic.zh-CN.mdx
@@ -32,7 +32,7 @@ LobeChat 在部署时提供了一些额外的配置项,你可以使用环境
使用 `random` 模式下,将在多个 API Keys 中随机获取一个 API Key。
-使用 `turn` 模式下,将按照填写的顺序,轮训获取得到 API Key。
+使用 `turn` 模式下,将按照填写的顺序,轮询获取得到 API Key。
### `NEXT_PUBLIC_BASE_PATH`
@@ -46,7 +46,7 @@ LobeChat 在部署时提供了一些额外的配置项,你可以使用环境
- 类型:可选
- 描述:用于配置 LobeChat 默认助理的默认配置。它支持多种数据类型和结构,包括键值对、嵌套字段、数组值等。
- 默认值:`-`
-- 示例:`'model=gpt-4-1106-preview;params.max_tokens=300;plugins=search-engine,lobe-image-designer`
+- 示例:`'model=gpt-4-1106-preview;params.max_tokens=300;plugins=search-engine,lobe-image-designer'`
`DEFAULT_AGENT_CONFIG` 用于配置 LobeChat 默认助理的默认配置。它支持多种数据类型和结构,包括键值对、嵌套字段、数组值等。下表详细说明了 `DEFAULT_AGENT_CONFIG` 环境变量的配置项、示例以及相应解释:
@@ -57,8 +57,8 @@ LobeChat 在部署时提供了一些额外的配置项,你可以使用环境
| 数组 | `plugins=search-engine,lobe-image-designer` | 启用 `search-engine` 和 `lobe-image-designer` 插件。 |
| 中文逗号 | `plugins=search-engine,lobe-image-designer` | 同上,演示支持中文逗号分隔。 |
| 多个配置项 | `model=glm-4;provider=zhipu` | 设置模型为 `glm-4` 且模型服务商为 `zhipu`。 |
-| 数字值 | `params.max_tokens=300` | 设置最大令牌数为 `300`。 |
-| 布尔值 | `enableAutoCreateTopic=true` | 启用自动创建主题。 |
+| 数字值 | `params.max_tokens=300`, `chatConfig.historyCount=5` | 设置最大令牌数为 `300`,设置历史消息条数为5。 |
+| 布尔值 | `chatConfig.enableAutoCreateTopic=true`,`chatConfig.enableCompressThreshold=true`, `chatConfig.enableHistoryCount=true` | 启用自动创建主题,历史长度压缩阈值,历史记录条数。 |
| 特殊字符 | `inputTemplate="Hello; I am a bot;"` | 设置输入模板为 `Hello; I am a bot;`。 |
| 错误处理 | `model=gpt-4;maxToken` | 忽略无效条目 `maxToken`,仅解析出 `model=gpt-4`。 |
| 值覆盖 | `model=gpt-4;model=gpt-4-1106-preview` | 如果键重复,使用最后一次出现的值,此处 `model` 的值为 `gpt-4-1106-preview`。 |
@@ -67,6 +67,15 @@ LobeChat 在部署时提供了一些额外的配置项,你可以使用环境
- [[RFC] 022 - 环境变量配置默认助手参数](https://github.com/lobehub/lobe-chat/discussions/913)
+### `FEATURE_FLAGS`
+
+- 类型:可选
+- 描述:用于控制 LobeChat 的特性功能,支持多个功能标志,使用 `+` 增加一个功能,使用 `-` 来关闭一个功能,多个功能标志之间使用英文逗号 `,` 隔开,最外层建议添加引号 `"` 以避免解析错误。
+- 默认值:`-`
+- 示例:`"-welcome_suggest"`
+
+具体的内容可以参见 [特性标志](/zh/docs/self-hosting/advanced/feature-flags) 中的说明。
+
## 插件服务
### `PLUGINS_INDEX_URL`
diff --git a/docs/self-hosting/environment-variables/model-provider.mdx b/docs/self-hosting/environment-variables/model-provider.mdx
index a23b940b4202..515b6d6b7263 100644
--- a/docs/self-hosting/environment-variables/model-provider.mdx
+++ b/docs/self-hosting/environment-variables/model-provider.mdx
@@ -15,6 +15,13 @@ When deploying LobeChat, a rich set of environment variables related to model se
## OpenAI
+### `ENABLED_OPENAI`
+
+- Type:Optional
+- Description:Enables OpenAI as a model provider by default, turns off the OpenAI service when set to `0`
+- Default:`1`
+- Example:`0`
+
### `OPENAI_API_KEY`
- Type: Required
@@ -125,6 +132,13 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
## AWS Bedrock
+### `ENABLED_AWS_BEDROCK`
+
+- Type:Optional
+- Description:Enables AWS Bedrock as a model provider by default, turns on the AWS Bedrock service when set to `1`
+- Default:`0`
+- Example:`1`
+
### `AWS_ACCESS_KEY_ID`
- Type: Required
@@ -146,6 +160,15 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Default: `us-east-1`
- Example: `us-east-1`
+## DeepSeek AI
+
+### `DEEPSEEK_API_KEY`
+
+- Type: Required
+- Description: This is the API key you applied for in the DeepSeek AI service
+- Default: -
+- Example: `sk-xxxxxx...xxxxxx`
+
## OpenRouter AI
### `OPENROUTER_API_KEY`
@@ -153,7 +176,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied for in the OpenRouter AI service
- Default: -
-- Example: `sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=`
+- Example: `sk-or-v1-xxxxxx...xxxxxx=`
### `OPENROUTER_MODEL_LIST`
@@ -169,7 +192,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied for in the TogetherAI service
- Default: -
-- Example: `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- Example: `xxxxxx...xxxxxx`
### `TOGETHERAI_MODEL_LIST`
@@ -180,6 +203,13 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
## Ollama
+### `ENABLED_OLLAMA`
+
+- Type:Optional
+- Description:Enables Ollama as a model provider by default, turns off the Ollama service when set to `0`
+- Default:`1`
+- Example:`0`
+
### `OLLAMA_PROXY_URL`
- Type: Required
@@ -210,7 +240,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied from Perplexity AI
- Default: -
-- Example: `pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- Example: `pplx-xxxxxx...xxxxxx`
## Minimax AI
@@ -219,7 +249,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied for in the Minimax AI service
- Default: -
-- Example: `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- Example: `xxxxxx...xxxxxx`
## Mistral AI
@@ -228,7 +258,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied for in the Mistral AI service
- Default: -
-- Example: `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=`
+- Example: `xxxxxx...xxxxxx=`
## Groq AI
@@ -237,7 +267,7 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied from Groq AI
- Default: -
-- Example: `gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- Example: `gsk_xxxxxx...xxxxxx`
## ZHIPU AI
@@ -255,6 +285,15 @@ If you need to use Azure OpenAI to provide model services, you can refer to the
- Type: Required
- Description: This is the API key you applied for in the 01.AI service
- Default: -
-- 示例:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- Example:`xxxxxx...xxxxxx`
+
+## Qwen
+
+### `QWEN_API_KEY`
+
+- Type: Required
+- Description: This is the DashScope API key you can obtain from Alibaba Cloud
+- Default: -
+- Example:`sk-xxxxx...xxxxx`
[model-list]: /docs/self-hosting/advanced/model-list
diff --git a/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx b/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx
index 0e716da21fe7..bf84641ecc5a 100644
--- a/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx
+++ b/docs/self-hosting/environment-variables/model-provider.zh-CN.mdx
@@ -15,6 +15,13 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
## OpenAI
+### `ENABLED_OPENAI`
+
+- 类型:可选
+- 描述:默认启用 OpenAI 作为模型供应商,当设为 0 时关闭 OpenAI 服务
+- 默认值:`1`
+- 示例:`0`
+
### `OPENAI_API_KEY`
- 类型:必选
@@ -123,6 +130,13 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
## AWS Bedrock
+### `ENABLED_AWS_BEDROCK`
+
+- 类型:可选
+- 描述:当设为 1 时启用 AWS Bedrock 服务
+- 默认值:`0`
+- 示例:`1`
+
### `AWS_ACCESS_KEY_ID`
- 类型:必选
@@ -144,6 +158,15 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 默认值:`us-east-1`
- 示例:`us-east-1`
+## DeepSeek AI
+
+### `DEEPSEEK_API_KEY`
+
+- 类型:必选
+- 描述:这是你在 DeepSeek AI 服务中申请的 API 密钥
+- 默认值:-
+- 示例:`sk-xxxxxx...xxxxxx`
+
## OpenRouter AI
### `OPENROUTER_API_KEY`
@@ -151,7 +174,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 OpenRouter AI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=`
+- 示例:`sk-or-v1-xxxxxx...xxxxxx=`
### `OPENROUTER_MODEL_LIST`
@@ -167,7 +190,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 TogetherAI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- 示例:`xxxxxx...xxxxxx`
### `TOGETHERAI_MODEL_LIST`
@@ -178,6 +201,13 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
## Ollama
+### `ENABLED_OLLAMA`
+
+- 类型:可选
+- 描述:默认启用 Ollama 作为模型供应商,当设为 0 时关闭 Ollama 服务
+- 默认值:`1`
+- 示例:`0`
+
### `OLLAMA_PROXY_URL`
- 类型:必选
@@ -208,7 +238,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 Perplexity AI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`pplx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- 示例:`pplx-xxxxxx...xxxxxx`
## Minimax AI
@@ -217,7 +247,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 Minimax AI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- 示例:`xxxxxx...xxxxxx`
## Mistral AI
@@ -226,7 +256,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 Mistral AI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=`
+- 示例:`xxxxxx...xxxxxx=`
## Groq AI
@@ -235,7 +265,7 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在 Groq AI 服务中申请的 API 密钥
- 默认值:-
-- 示例:`gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- 示例:`gsk_xxxxxx...xxxxxx`
## 智谱 AI
@@ -253,6 +283,15 @@ LobeChat 在部署时提供了丰富的模型服务商相关的环境变量,
- 类型:必选
- 描述:这是你在零一万物服务中申请的 API 密钥
- 默认值:-
-- 示例:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
+- 示例:`xxxxxx...xxxxxx`
[model-list]: /docs/self-hosting/advanced/model-list
+
+## 通义千问
+
+### `QWEN_API_KEY`
+
+- 类型:必选
+- 描述:这是你在阿里云百炼平台上获取的 DashScope API 密钥
+- 默认值:-
+- 示例:`sk-xxxxx...xxxxx`
diff --git a/docs/self-hosting/examples/ollama.mdx b/docs/self-hosting/examples/ollama.mdx
index 2f1b15003ade..94569c104503 100644
--- a/docs/self-hosting/examples/ollama.mdx
+++ b/docs/self-hosting/examples/ollama.mdx
@@ -40,13 +40,13 @@ When you first initiate Ollama, it is configured to allow access only from the l
### Ollama Environment Variables
-| Environment Variable | Description | Default Value | Additional Information |
-| -------------------- | ----------------------------------- | --------------------------------------------------- | ---------------------------------------------------- |
-| `OLLAMA_HOST` | Specifies the host and port for binding | "127.0.0.1:11434" | Use "0.0.0.0:port" to make the service accessible from any machine |
-| `OLLAMA_ORIGINS` | Comma-separated list of permitted cross-origin sources | Restricted to local access | Set to "*" to avoid CORS, please set on demand |
-| `OLLAMA_MODELS` | Path to the directory where models are located | "~/.ollama/models" or "/usr/share/ollama/.ollama/models" | Can be customized based on requirements |
-| `OLLAMA_KEEP_ALIVE` | Duration that the model stays loaded in GPU memory | "5m" | Dynamically loading and unloading models can reduce GPU load but may increase disk I/O |
-| `OLLAMA_DEBUG` | Enable additional debugging logs by setting to 1 | Typically disabled | |
+| Environment Variable | Description | Default Value | Additional Information |
+| --- | --- | --- | --- |
+| `OLLAMA_HOST` | Specifies the host and port for binding | "127.0.0.1:11434" | Use "0.0.0.0:port" to make the service accessible from any machine |
+| `OLLAMA_ORIGINS` | Comma-separated list of permitted cross-origin sources | Restricted to local access | Set to "\*" to avoid CORS, please set on demand |
+| `OLLAMA_MODELS` | Path to the directory where models are located | "~/.ollama/models" or "/usr/share/ollama/.ollama/models" | Can be customized based on requirements |
+| `OLLAMA_KEEP_ALIVE` | Duration that the model stays loaded in GPU memory | "5m" | Dynamically loading and unloading models can reduce GPU load but may increase disk I/O |
+| `OLLAMA_DEBUG` | Enable additional debugging logs by setting to 1 | Typically disabled | |
### Setting environment variables on Windows
@@ -64,10 +64,10 @@ If Ollama is run as a macOS application, environment variables should be set usi
1. For each environment variable, call `launchctl setenv`.
- ```bash
- launchctl setenv OLLAMA_HOST "0.0.0.0"
- launchctl setenv OLLAMA_ORIGINS "*"
- ```
+ ```bash
+ launchctl setenv OLLAMA_HOST "0.0.0.0"
+ launchctl setenv OLLAMA_ORIGINS "*"
+ ```
2. Restart Ollama application.
@@ -77,25 +77,25 @@ If Ollama is run as a systemd service, environment variables should be set using
1. Edit the systemd service by calling `sudo systemctl edit ollama.service`.
- ```bash
- sudo systemctl edit ollama.service
- ```
+ ```bash
+ sudo systemctl edit ollama.service
+ ```
2. For each environment variable, add a line `Environment` under section `[Service]`:
- ```bash
- [Service]
- Environment="OLLAMA_HOST=0.0.0.0"
- Environment="OLLAMA_ORIGINS=*"
- ```
+ ```bash
+ [Service]
+ Environment="OLLAMA_HOST=0.0.0.0"
+ Environment="OLLAMA_ORIGINS=*"
+ ```
3. Save and exit.
4. Reload `systemd` and restart Ollama:
- ```bash
- sudo systemctl daemon-reload
- sudo systemctl restart ollama
- ```
+ ```bash
+ sudo systemctl daemon-reload
+ sudo systemctl restart ollama
+ ```
### Setting environment variables on Docker
diff --git a/docs/self-hosting/examples/ollama.zh-CN.mdx b/docs/self-hosting/examples/ollama.zh-CN.mdx
index 5f55fcfa24b9..65deaac62943 100644
--- a/docs/self-hosting/examples/ollama.zh-CN.mdx
+++ b/docs/self-hosting/examples/ollama.zh-CN.mdx
@@ -38,13 +38,13 @@ docker run -d -p 3210:3210 -e OLLAMA_PROXY_URL=http://host.docker.internal:11434
### Ollama 环境变量
-| 环境变量 | 描述 | 默认值 | 附加说明 |
-| ---------- | -------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- |
-| `OLLAMA_HOST` | 绑定的主机和端口 | "127.0.0.1:11434" | 设置 0.0.0.0:端口号 可以指定所有人访问特定端口 |
-| `OLLAMA_ORIGINS` | 允许的跨域源列表,逗号分隔 | 仅本地访问 | 设置 "*" 可以避免 CORS 跨域错误,按需设置 |
-| `OLLAMA_MODELS` | 模型存放的路径 | "~/.ollama/models" 或 "/usr/share/ollama/.ollama/models" | 按需指定 |
-| `OLLAMA_KEEP_ALIVE` | 模型在显存中保持加载的持续时间 | "5m" | 按需加载和释放显存可以有效降低显卡压力,但会增加硬盘读写 |
-| `OLLAMA_DEBUG` | 设置为 1 以启用额外的调试日志 | 默认关闭 | |
+| 环境变量 | 描述 | 默认值 | 附加说明 |
+| --- | --- | --- | --- |
+| `OLLAMA_HOST` | 绑定的主机和端口 | "127.0.0.1:11434" | 设置 0.0.0.0:端口号 可以指定所有人访问特定端口 |
+| `OLLAMA_ORIGINS` | 允许的跨域源列表,逗号分隔 | 仅本地访问 | 设置 "\*" 可以避免 CORS 跨域错误,按需设置 |
+| `OLLAMA_MODELS` | 模型存放的路径 | "~/.ollama/models" 或 "/usr/share/ollama/.ollama/models" | 按需指定 |
+| `OLLAMA_KEEP_ALIVE` | 模型在显存中保持加载的持续时间 | "5m" | 按需加载和释放显存可以有效降低显卡压力,但会增加硬盘读写 |
+| `OLLAMA_DEBUG` | 设置为 1 以启用额外的调试日志 | 默认关闭 | |
### 在 Windows 上设置环境变量
@@ -62,10 +62,10 @@ docker run -d -p 3210:3210 -e OLLAMA_PROXY_URL=http://host.docker.internal:11434
1. 对于每个环境变量,调用 `launchctl setenv`。
- ```bash
- launchctl setenv OLLAMA_HOST "0.0.0.0"
- launchctl setenv OLLAMA_ORIGINS "*"
- ```
+ ```bash
+ launchctl setenv OLLAMA_HOST "0.0.0.0"
+ launchctl setenv OLLAMA_ORIGINS "*"
+ ```
2. 重启 Ollama 应用程序。
@@ -75,29 +75,28 @@ docker run -d -p 3210:3210 -e OLLAMA_PROXY_URL=http://host.docker.internal:11434
1. 通过调用`sudo systemctl edit ollama.service`编辑 systemd 服务。
- ```bash
- sudo systemctl edit ollama.service
- ```
+ ```bash
+ sudo systemctl edit ollama.service
+ ```
2. 对于每个环境变量,在`[Service]`部分下添加`Environment`:
- ```bash
- [Service]
- Environment="OLLAMA_HOST=0.0.0.0"
- Environment="OLLAMA_ORIGINS=*"
- ```
+ ```bash
+ [Service]
+ Environment="OLLAMA_HOST=0.0.0.0"
+ Environment="OLLAMA_ORIGINS=*"
+ ```
3. 保存并退出。
4. 重载`systemd`并重启 Ollama:
- ```bash
- sudo systemctl daemon-reload
- sudo systemctl restart ollama
- ```
+ ```bash
+ sudo systemctl daemon-reload
+ sudo systemctl restart ollama
+ ```
### 在 Docker 上设置环境变量
如果 Ollama 作为 Docker 容器运行,你可以将环境变量添加到 `docker run` 命令中。
详细配置方法可以参考 [Ollama 官方文档](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server)。
-
diff --git a/docs/self-hosting/platform/docker-compose.zh-CN.mdx b/docs/self-hosting/platform/docker-compose.zh-CN.mdx
index e91f2378b464..fe06700610d0 100644
--- a/docs/self-hosting/platform/docker-compose.zh-CN.mdx
+++ b/docs/self-hosting/platform/docker-compose.zh-CN.mdx
@@ -67,7 +67,6 @@ services:
OPENAI_API_KEY: sk-xxxx
OPENAI_PROXY_URL: https://api-proxy.com/v1
ACCESS_CODE: lobe66
-
```
运行以下命令启动 Lobe Chat 服务:
@@ -92,7 +91,7 @@ output=$(docker pull lobehub/lobe-chat:latest 2>&1)
# Check if the pull command was executed successfully
if [ $? -ne 0 ]; then
-exit 1
+ exit 1
fi
# Check if the output contains a specific string
@@ -100,7 +99,7 @@ echo "$output" | grep -q "Image is up to date for lobehub/lobe-chat:latest"
# If the image is already up to date, do nothing
if [ $? -eq 0 ]; then
-exit 0
+ exit 0
fi
echo "Detected Lobe-Chat update"
diff --git a/docs/self-hosting/platform/vercel.mdx b/docs/self-hosting/platform/vercel.mdx
index 7aaebb95aef3..a521cf70d63d 100644
--- a/docs/self-hosting/platform/vercel.mdx
+++ b/docs/self-hosting/platform/vercel.mdx
@@ -41,6 +41,6 @@ Vercel's assigned domain DNS may be polluted in some regions, so binding a custo
If you have deployed your project using the one-click deployment steps mentioned above, you may find that you are always prompted with "updates available." This is because Vercel creates a new project for you by default instead of forking this project, which causes the inability to accurately detect updates.
- We recommend following the [Self-Hosting Upstream Sync](/docs/self-hosting/advanced/upstream-sync) steps to
- Redeploy.
+ We recommend following the [Self-Hosting Upstream Sync](/docs/self-hosting/advanced/upstream-sync)
+ steps to Redeploy.
diff --git a/docs/self-hosting/platform/vercel.zh-CN.mdx b/docs/self-hosting/platform/vercel.zh-CN.mdx
index b775a960da5e..0ebd204c0e00 100644
--- a/docs/self-hosting/platform/vercel.zh-CN.mdx
+++ b/docs/self-hosting/platform/vercel.zh-CN.mdx
@@ -40,7 +40,8 @@ Vercel 分配的域名 DNS 在某些区域被污染了,绑定自定义域名
如果你根据上述中的一键部署步骤部署了自己的项目,你可能会发现总是被提示 “有可用更新”。这是因为 Vercel 默认为你创建新项目而非 fork 本项目,这将导致无法准确检测更新。
- 我们建议按照 [📘 LobeChat 自部署保持更新](/docs/self-hosting/advanced/upstream-sync) 步骤重新部署。
+ 我们建议按照 [📘 LobeChat 自部署保持更新](/docs/self-hosting/advanced/upstream-sync)
+ 步骤重新部署。
[deploy-button-image]: https://vercel.com/button
diff --git a/docs/self-hosting/platform/zeabur.mdx b/docs/self-hosting/platform/zeabur.mdx
index e880a86d67ce..d6a4705a3e4b 100644
--- a/docs/self-hosting/platform/zeabur.mdx
+++ b/docs/self-hosting/platform/zeabur.mdx
@@ -35,3 +35,50 @@ You can use the subdomain provided by Zeabur, or choose to bind a custom domain.
[deploy-button-image]: https://zeabur.com/button.svg
[deploy-link]: https://zeabur.com/templates/VZGGTI
+
+# Deploy LobeChat with Zeabur as serverless function
+
+> Note: There are still issues with [middlewares and rewrites of next.js on Zeabur](https://github.com/lobehub/lobe-chat/pull/2775?notification_referrer_id=NT_kwDOAdi2DrQxMDkyODQ4MDc2NTozMDk3OTU5OA#issuecomment-2146713899), use at your own risk!
+
+Since Zeabur does NOT officially support FREE users deploy containerized service, you may wish to deploy LobeChat as a serverless function service. To deploy LobeChat as a serverless function service on Zeabur, you can follow the steps below:
+
+## Zeabur Deployment Process
+
+
+
+### Fork LobeChat
+
+### Add Zeabur pack config file
+
+Add a `zbpack.json` configuration file with the following content to the root dir of your fork:
+
+```json
+{
+ "ignore_dockerfile": true,
+ "serverless": true
+}
+```
+
+### Prepare your OpenAI API Key
+
+Go to [OpenAI API Key](https://platform.openai.com/account/api-keys) to get your OpenAI API Key.
+
+### Login to your [Zeabur dashboard](https://dash.zeabur.com)
+
+If you do not already have an account, you will need to register one.
+
+### Create a project and service
+
+Create a project, then create a service under this project.
+
+### Link your fork of LobeChat to the just created Zeabur service.
+
+When adding service, choose github. This may triger a oAuth depend on varies factors like how you login to Zeabur and if you have already authorized Zeabur to access all your repos
+
+### Bind a custom domain (optional)
+
+You can create a subdomain provided by Zeabur, or choose to bind a custom domain. Currently, the domains provided by Zeabur have not been contaminated, and most regions can connect directly.
+
+### Zeabur shall start auto build and you should be able to access it by the domain of your choice after a while.
+
+
diff --git a/docs/self-hosting/platform/zeabur.zh-CN.mdx b/docs/self-hosting/platform/zeabur.zh-CN.mdx
index 441820eaaacf..00ee9aa46375 100644
--- a/docs/self-hosting/platform/zeabur.zh-CN.mdx
+++ b/docs/self-hosting/platform/zeabur.zh-CN.mdx
@@ -34,3 +34,50 @@ tags:
[deploy-button-image]: https://zeabur.com/button.svg
[deploy-link]: https://zeabur.com/templates/VZGGTI
+
+# 使用 Zeabur 将 LobeChat 部署为无服务器函数
+
+> **注意:** 仍然存在关于 [Zeabur 上 next.js 的中间件和重写问题](https://github.com/lobehub/lobe-chat/pull/2775?notification_referrer_id=NT_kwDOAdi2DrQxMDkyODQ4MDc2NTozMDk3OTU5OA#issuecomment-2146713899),请自担风险!
+
+由于 Zeabur 并未官方支持免费用户部署容器化服务,您可能希望将 LobeChat 部署为无服务器函数服务。要在 Zeabur 上将 LobeChat 部署为无服务器函数服务,您可以按照以下步骤操作:
+
+## Zeabur 部署流程
+
+
+
+### Fork LobeChat
+
+### 添加 Zeabur 打包配置文件
+
+在您的分支的根目录下添加一个 `zbpack.json` 配置文件,内容如下:
+
+```json
+{
+ "ignore_dockerfile": true,
+ "serverless": true
+}
+```
+
+### 准备您的 OpenAI API 密钥
+
+前往 [OpenAI API 密钥](https://platform.openai.com/account/api-keys) 获取您的 OpenAI API 密钥。
+
+### 登录到您的 [Zeabur 仪表板](https://dash.zeabur.com)
+
+如果您尚未拥有一个账号,您需要注册一个。
+
+### 创建项目与服务。
+
+创建一个项目,并再这个项目下新建一个服务。
+
+### 将您的 LobeChat 分支链接到刚创建的 Zeabur 服务。
+
+在添加服务时,选择 github。这可能会触发一个 oAuth,取决于诸如您如何登录到 Zeabur以及您是否已经授权 Zeabur 访问所有您的存储库等各种因素。
+
+### 绑定自定义域名(可选)
+
+您可以创建 Zeabur 提供的子域名,或选择绑定自定义域名。目前,Zeabur 提供的域名尚未受到污染,大多数地区可以直接连接。
+
+### Zeabur 将开始自动构建,您应该可以在一段时间后通过您选择的域名访问它。
+
+
diff --git a/docs/usage/agents/prompt.mdx b/docs/usage/agents/prompt.mdx
index 8afb34462b91..6d38cf6b787e 100644
--- a/docs/usage/agents/prompt.mdx
+++ b/docs/usage/agents/prompt.mdx
@@ -57,7 +57,7 @@ The second prompt generates longer output and better structure. The use of the t
- **Be Clear About Your Needs:** The model's output will strive to meet your needs, so if your needs are not clear, the output may not meet expectations.
- **Use Correct Grammar and Spelling:** The model will try to mimic your language style, so if your language style is problematic, the output may also be problematic.
- **Provide Sufficient Contextual Information:** The model will generate output based on the contextual information you provide, so if the information is insufficient, it may not produce the desired results.
-
+
After formulating effective prompts for discussing issues, you now need to refine the generated results. This may involve adjusting the output to fit constraints such as word count or combining concepts from different generated results.
diff --git a/docs/usage/agents/prompt.zh-CN.mdx b/docs/usage/agents/prompt.zh-CN.mdx
index d3d48180b5f7..31578925bf49 100644
--- a/docs/usage/agents/prompt.zh-CN.mdx
+++ b/docs/usage/agents/prompt.zh-CN.mdx
@@ -53,7 +53,7 @@ tags:
- **尽量明确你的需求:** 模型的输出会尽可能满足你的需求,所以如果你的需求不明确,输出可能会不如预期。
- **使用正确的语法和拼写:** 模型会尽可能模仿你的语言风格,所以如果你的语言风格有问题,输出可能也会有问题。
- **提供足够的上下文信息:** 模型会根据你提供的上下文信息生成输出,所以如果你提供的上下文信息不足,可能无法生成你想要的结果。
-
+
在为讨论问题制定有效的提示后,您现在需要细化生成的结果。这可能涉及到调整输出以符合诸如字数等限制,或将不同生成的结果的概念组合在一起。
diff --git a/docs/usage/features/auth.mdx b/docs/usage/features/auth.mdx
new file mode 100644
index 000000000000..ba9afb971952
--- /dev/null
+++ b/docs/usage/features/auth.mdx
@@ -0,0 +1,65 @@
+---
+title: Support Multi-User Management - Identity Verification Solutions
+description: >-
+ Explore LobeChat's user authentication solutions with next-auth and Clerk for
+ flexible and secure user management. Learn about features like user
+ registration, session management, multi-factor authentication, and more.
+tags:
+ - Multi-User Management
+ - Identity Verification
+ - next-auth
+ - Clerk
+ - User Authentication
+ - Session Management
+ - Multi-Factor Authentication
+ - User Management
+---
+
+# Support Multi-User Management
+
+
+
+In modern applications, user management and identity verification are essential functions. To meet the diverse needs of different users, LobeChat provides two main user authentication and management solutions: `next-auth` and `Clerk`. Whether you are looking for simple user registration and login or need advanced multi-factor authentication and user management, LobeChat can flexibly accommodate your requirements.
+
+## next-auth: Flexible and Powerful Identity Verification Library
+
+LobeChat integrates `next-auth`, a flexible and powerful identity verification library that supports various authentication methods, including OAuth, email login, and credential login. With `next-auth`, you can easily achieve the following functions:
+
+- **User Registration and Login**: Support various authentication methods to meet different user needs.
+- **Session Management**: Efficiently manage user sessions to ensure security.
+- **Social Login**: Support quick login via various social platforms.
+- **Data Security**: Ensure the security and privacy of user data.
+
+
+ Due to workload constraints, integration of next-auth with a server-side database has not been
+ implemented yet. If you need to use a server-side database, please use Clerk.
+
+
+
+ For information on using Next-Auth, you can refer to [Authentication Services - Next
+ Auth](/docs/self-hosting/advanced/authentication#next-auth).
+
+
+## Clerk: Modern User Management Platform
+
+For users requiring advanced user management features, LobeChat also supports [Clerk](https://clerk.com), a modern user management platform. Clerk offers richer functionality to help you achieve higher security and flexibility:
+
+- **Multi-Factor Authentication (MFA)**: Provides higher security protection.
+- **User Profile Management**: Conveniently manage user information and configurations.
+- **Login Activity Monitoring**: Real-time monitoring of user login activities to ensure account security.
+- **Scalability**: Supports complex user management requirements.
+
+
+ For information on using Clerk, you can refer to [Authentication Services -
+ Clerk](/docs/self-hosting/advanced/authentication#clerk) .
+
+
+
+ If you need to use Clerk in conjunction with a server-side database, you can refer to the
+ "Configuring Authentication Services" section in [Deploying with a Server-Side
+ Database](/docs/self-hosting/advanced/server-database).
+
diff --git a/docs/usage/features/auth.zh-CN.mdx b/docs/usage/features/auth.zh-CN.mdx
new file mode 100644
index 000000000000..983c0c7b4dc7
--- /dev/null
+++ b/docs/usage/features/auth.zh-CN.mdx
@@ -0,0 +1,60 @@
+---
+title: 多用户管理支持
+description: LobeChat 提供了多种用户认证和管理方案,以满足不同用户的需求。
+tags:
+ - LobeChat
+ - 用户管理
+ - next-auth
+ - Clerk
+ - 身份验证
+ - 多因素认证
+---
+
+# 身份验证系统 / 多用户管理支持
+
+
+
+在现代应用中,用户管理和身份验证是至关重要的功能。为满足不同用户的多样化需求,LobeChat 提供了两种主要的用户认证和管理方案:`next-auth` 和 `Clerk`。无论您是追求简便的用户注册登录,还是需要更高级的多因素认证和用户管理,LobeChat 都可以灵活实现。
+
+## next-auth:灵活且强大的身份验证库
+
+LobeChat 集成了 `next-auth`,一个灵活且强大的身份验证库,支持多种身份验证方式,包括 OAuth、邮件登录、凭证登录等。通过 `next-auth`,您可以轻松实现以下功能:
+
+- **用户注册和登录**:支持多种认证方式,满足不同用户的需求。
+- **会话管理**:高效管理用户会话,确保安全性。
+- **社交登录**:支持多种社交平台的快捷登录。
+- **数据安全**:保障用户数据的安全性和隐私性。
+
+
+ 由于工作量原因,目前还没有实现 next-auth 与服务端数据库的集成,如果需要使用服务端数据库,请使用
+ Clerk 。
+
+
+
+ 关于 Next-Auth 的使用,可以查阅 [身份验证服务 - Next
+ Auth](/zh/docs/self-hosting/advanced/authentication#next-auth)。
+
+
+## Clerk:现代化用户管理平台
+
+对于需要更高级用户管理功能的用户,LobeChat 还支持 [Clerk](https://clerk.com) ,一个现代化的用户管理平台。Clerk 提供了更丰富的功能,帮助您实现更高的安全性和灵活性:
+
+- **多因素认证 (MFA)**:提供更高的安全保障。
+- **用户配置文件管理**:便捷管理用户信息和配置。
+- **登录活动监控**:实时监控用户登录活动,确保账户安全。
+- **扩展性**:支持复杂的用户管理需求。
+
+
+ 关于 Clerk 的使用,可以查阅 [身份验证服务 -
+ Clerk](/zh/docs/self-hosting/advanced/authentication#clerk)。
+
+
+
+ 如果需要在服务端数据库中搭配使用 Clerk 的使用,可以查阅
+ [使用服务端数据库部署](/zh/docs/self-hosting/advanced/server-database)
+ 中的「配置身份验证服务」部分。
+
diff --git a/docs/usage/features/database.mdx b/docs/usage/features/database.mdx
new file mode 100644
index 000000000000..83ef17bd15a5
--- /dev/null
+++ b/docs/usage/features/database.mdx
@@ -0,0 +1,60 @@
+---
+title: Local / Cloud Database Solutions for LobeChat
+description: >-
+ Explore the options of local and server-side databases for LobeChat, offering
+ data control, privacy protection, and convenient user experiences.
+tags:
+ - Local Database
+ - Server-Side Database
+ - Data Privacy
+ - Data Control
+ - CRDT Technology
+ - PostgreSQL
+ - Dirzzle ORM
+ - Clerk Authentication
+---
+
+# Local / Cloud Database
+
+
+
+In modern application development, the choice of data storage solution is crucial. To meet the needs of different users, LobeChat offers flexible configurations that support both local and server-side databases. Whether you prioritize data privacy and control or seek a convenient user experience, LobeChat can provide excellent solutions for you.
+
+## Local Database: Data Control and Privacy Protection
+
+For users who prefer more control over their data and value privacy protection, LobeChat offers support for local databases. By using IndexedDB as the storage solution and combining it with dexie as an Object-Relational Mapping (ORM) tool, LobeChat achieves efficient data management.
+
+Additionally, we have introduced Conflict-Free Replicated Data Type (CRDT) technology to ensure a seamless multi-device synchronization experience. This experimental feature aims to provide users with greater autonomy and data security.
+
+
+ LobeChat defaults to the local database solution to reduce the onboarding cost for new users.
+
+
+Furthermore, we have attempted to introduce CRDT technology to achieve cross-device synchronization based on the local database. This experimental feature aims to provide users with greater autonomy and data security.
+
+## Server-Side Database: Convenient and Efficient User Experience
+
+For users who seek a convenient user experience, LobeChat supports PostgreSQL as the server-side database. By managing data with Dirzzle ORM and combining it with Clerk for authentication, LobeChat can offer users an efficient and reliable server-side data management solution.
+
+### Server-Side Database Technology Stack
+
+- **DB**: PostgreSQL (Neon is the default)
+- **ORM**: Dirzzle ORM
+- **Auth**: Clerk
+- **Server Router**: tRPC
+
+## Deployment Solution Selection Guide
+
+### 1. Local Database
+
+The local database solution is suitable for users who wish to have strict control over their data. With LobeChat's support for local databases, you can securely store and manage data without relying on external servers. This solution is particularly suitable for users with high requirements for data privacy.
+
+### 2. Server-Side Database
+
+The server-side database solution is ideal for users who want to simplify data management processes and enjoy a convenient user experience. Through server-side databases and user authentication, LobeChat can ensure the security and efficiency of data. If you want to learn how to configure a server-side database, please refer to our [detailed documentation](/docs/self-hosting/advanced/server-database).
+
+Whether you choose a local database or a server-side database, LobeChat can provide you with an excellent user experience.
diff --git a/docs/usage/features/database.zh-CN.mdx b/docs/usage/features/database.zh-CN.mdx
new file mode 100644
index 000000000000..5716320b5ff1
--- /dev/null
+++ b/docs/usage/features/database.zh-CN.mdx
@@ -0,0 +1,54 @@
+---
+title: LobeChat 支持本地 / 云端数据库存储
+description: LobeChat 支持本地 / 云端数据存储,既能实现 Local First,同时支持数据云同步。
+tags:
+ - LobeChat
+ - IndexedDB
+ - Postgres
+ - Local First
+ - 数据云同步
+ - 数据库
+---
+
+# 本地 / 云端数据存储
+
+
+
+在现代应用开发中,数据存储方案的选择至关重要。为了满足不同用户的需求,LobeChat 提供了同时支持本地数据库和服务端数据库的灵活配置。无论您是注重数据隐私与掌控,还是追求便捷的使用体验,LobeChat 都能为您提供卓越的解决方案。
+
+## 本地数据库:数据掌控与隐私保护
+
+对于希望对数据有更多掌控感和隐私保护的用户,LobeChat 提供了本地数据库支持。采用 IndexedDB 作为存储解决方案,并结合 dexie 作为 ORM(对象关系映射),LobeChat 实现了高效的数据管理。
+
+同时,我们引入了 CRDT(Conflict-Free Replicated Data Type)技术,确保多端同步功能的无缝体验。这一实验性功能旨在为用户提供更高的自主性和数据安全性。
+
+LobeChat 默认采取本地数据库方案,以降低新用户的上手成本。
+
+此外,我们尝试引入了 CRDT(Conflict-Free Replicated Data Type)技术,在本地数据库基础上实现了跨端同步。这一实验性功能旨在为用户提供更高的自主性和数据安全性。
+
+## 服务端数据库:便捷与高效的使用体验
+
+对于追求便捷使用体验的用户,LobeChat 支持 PostgreSQL 作为服务端数据库。通过 Dirzzle ORM 管理数据,结合 Clerk 进行身份验证,LobeChat 能够为用户提供高效、可靠的服务端数据管理方案。
+
+### 服务端数据库技术栈
+
+- **DB**: PostgreSQL(默认使用 Neon)
+- **ORM**: Dirzzle ORM
+- **Auth**: Clerk
+- **Server Router**: tRPC
+
+## 部署方案选择指南
+
+### 1. 本地数据库
+
+本地数据库方案适用于那些希望对数据进行严格控制的用户。通过 LobeChat 的本地数据库支持,您可以在不依赖外部服务器的情况下,安全地存储和管理数据。这一方案特别适合对数据隐私有高要求的用户。
+
+### 2. 服务端数据库
+
+服务端数据库方案则适合那些希望简化数据管理流程,享受便捷使用体验的用户。通过服务端数据库与用户身份验证,LobeChat 能够确保数据的安全性与高效性。如果您希望了解如何配置服务端数据库,请参考我们的[详细文档](/zh/docs/self-hosting/advanced/server-database)。
+
+无论选择本地数据库还是服务端数据库,LobeChat 都能为你提供卓越的用户体验。
diff --git a/docs/usage/features/local-llm.mdx b/docs/usage/features/local-llm.mdx
index 3675b1cdd89e..a84df3c9374f 100644
--- a/docs/usage/features/local-llm.mdx
+++ b/docs/usage/features/local-llm.mdx
@@ -49,3 +49,8 @@ Compared to cloud-based solutions, a local LLM provides higher privacy and secur
### Embark on Your LobeChat & Ollama AI Journey
Now, let's embark on this exciting journey together! Through the collaboration of LobeChat and Ollama AI, explore the endless possibilities brought by AI. Whether you are a tech enthusiast or simply curious about AI communication, LobeChat will offer you an unprecedented experience.
+
+
+
+
+
diff --git a/docs/usage/features/local-llm.zh-CN.mdx b/docs/usage/features/local-llm.zh-CN.mdx
index 2f0d251372af..79be6b46ddb3 100644
--- a/docs/usage/features/local-llm.zh-CN.mdx
+++ b/docs/usage/features/local-llm.zh-CN.mdx
@@ -41,3 +41,8 @@ docker run -d -p 3210:3210 -e OLLAMA_PROXY_URL=http://host.docker.internal:11434
### 开启您的 LobeChat & Ollama AI 之旅
现在,就让我们一起开启这段激动人心的旅程吧!通过 LobeChat 与 Ollama AI 的协作,探索 AI 带来的无限可能。无论您是技术爱好者,还是对 AI 交流充满好奇,LobeChat 都将为您提供一场前所未有的体验。
+
+
+
+
+
diff --git a/docs/usage/features/multi-ai-providers.mdx b/docs/usage/features/multi-ai-providers.mdx
index 92951c42a7fa..c212badb2601 100644
--- a/docs/usage/features/multi-ai-providers.mdx
+++ b/docs/usage/features/multi-ai-providers.mdx
@@ -45,6 +45,8 @@ We have implemented support for the following model service providers:
- **01.AI (Yi Model)**: Integrated the 01.AI models, with series of APIs featuring fast inference speed, which not only shortened the processing time, but also maintained excellent model performance. [Learn more](https://01.ai/)
- **Together.ai**: Over 100 leading open-source Chat, Language, Image, Code, and Embedding models are available through the Together Inference API. For these models you pay just for what you use. [Learn more](https://www.together.ai/)
- **Minimax**: Integrated the Minimax models, including the MoE model **abab6**, offers a broader range of choices. [Learn more](https://www.minimaxi.com/)
+- **DeepSeek**: Integrated with the DeepSeek series models, an innovative AI startup from China, The product has been designed to provide a model that balances performance with price. [Learn more](https://www.deepseek.com/)
+- **Qwen**: Integrated with the Qwen series models, including the latest **qwen-turbo**, **qwen-plus** and **qwen-max**. [Learn more](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction)
At the same time, we are also planning to support more model service providers, such as Replicate and Perplexity, to further enrich our service provider library. If you would like LobeChat to support your favorite service provider, feel free to join our [community discussion](https://github.com/lobehub/lobe-chat/discussions/1284).
@@ -57,3 +59,8 @@ At the same time, we are also planning to support more model service providers,
/>
To meet the specific needs of users, LobeChat also supports the use of local models based on [Ollama](https://ollama.ai), allowing users to flexibly use their own or third-party models. For more details, see [Local Model Support](/docs/usage/features/local-llm).
+
+
+
+
+
diff --git a/docs/usage/features/multi-ai-providers.zh-CN.mdx b/docs/usage/features/multi-ai-providers.zh-CN.mdx
index 388ef8731b9b..f8605365c269 100644
--- a/docs/usage/features/multi-ai-providers.zh-CN.mdx
+++ b/docs/usage/features/multi-ai-providers.zh-CN.mdx
@@ -45,6 +45,8 @@ tags:
- **Groq**:接入了 Groq 的 AI 模型,高效处理消息序列,生成回应,胜任多轮对话及单次交互任务。[了解更多](https://groq.com/)
- **OpenRouter**:其支持包括 **Claude 3**,**Gemma**,**Mistral**,**Llama2**和**Cohere**等模型路由,支持智能路由优化,提升使用效率,开放且灵活。[了解更多](https://openrouter.ai/)
- **Minimax**: 接入了 Minimax 的 AI 模型,包括 MoE 模型 **abab6**,提供了更多的选择空间。[了解更多](https://www.minimaxi.com/)
+- **DeepSeek**: 接入了 DeepSeek 的 AI 模型,包括最新的 **DeepSeek-V2**,提供兼顾性能与价格的模型。[了解更多](https://www.deepseek.com/)
+- **Qwen (通义千问)**: 接入了 Qwen 的 AI 模型,包括最新的 **qwen-turbo**,**qwen-plus** 和 **qwen-max** 等模型。[了解更多](https://help.aliyun.com/zh/dashscope/developer-reference/model-introduction)
同时,我们也在计划支持更多的模型服务商,如 Replicate 和 Perplexity 等,以进一步丰富我们的服务商库。如果你希望让 LobeChat 支持你喜爱的服务商,欢迎加入我们的[社区讨论](https://github.com/lobehub/lobe-chat/discussions/1284)。
@@ -57,3 +59,8 @@ tags:
/>
为了满足特定用户的需求,LobeChat 还基于 [Ollama](https://ollama.ai) 支持了本地模型的使用,让用户能够更灵活地使用自己的或第三方的模型,详见 [本地模型支持](/docs/usage/features/local-llm)。
+
+
+
+
+
diff --git a/docs/usage/features/plugin-system.zh-CN.mdx b/docs/usage/features/plugin-system.zh-CN.mdx
index 8afc27a1f990..8883494c4926 100644
--- a/docs/usage/features/plugin-system.zh-CN.mdx
+++ b/docs/usage/features/plugin-system.zh-CN.mdx
@@ -40,7 +40,8 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
## 插件生态体系
- 如果你对插件开发感兴趣,请在 Wiki 中查阅我们的 [📘 插件开发指南](/docs/usage/plugins/development)。
+ 如果你对插件开发感兴趣,请在 Wiki 中查阅我们的 [📘
+ 插件开发指南](/docs/usage/plugins/development)。
- [lobe-chat-plugins][lobe-chat-plugins]:这是 LobeChat 的插件索引。它从该仓库的 index.json 中获取插件列表并显示给用户。
diff --git a/docs/usage/features/pwa.mdx b/docs/usage/features/pwa.mdx
index 67e78b419b66..606093d61c6c 100644
--- a/docs/usage/features/pwa.mdx
+++ b/docs/usage/features/pwa.mdx
@@ -28,7 +28,8 @@ If you are unfamiliar with the installation process of PWA, you can follow the s
## Running on Chrome / Edge
- On macOS, when using a Chrome-installed PWA, it is required that Chrome be open, otherwise Chrome will automatically open and then launch the PWA app.
+ On macOS, when using a Chrome-installed PWA, it is required that Chrome be open, otherwise Chrome
+ will automatically open and then launch the PWA app.
@@ -62,7 +63,7 @@ Safari PWA requires macOS Ventura or later. The PWA installed by Safari does not
- The default installed LobeChat PWA icon has a black background, you can use cmd + i to paste the following image to replace it with a white background.
+ The default installed LobeChat PWA icon has a black background, you can use cmd + i to paste the following image to replace it with a white background.
- macOS 下,使用 Chrome 安装的 PWA 时,必须要求 Chrome 是打开状态,否则会自动打开 Chrome 再打开 PWA 应用。
+ macOS 下,使用 Chrome 安装的 PWA 时,必须要求 Chrome 是打开状态,否则会自动打开 Chrome 再打开 PWA
+ 应用。
@@ -62,7 +63,7 @@ Safari PWA 需要 macOS Ventura 或更高版本。Safari 安装的 PWA 并不要
- 默认安装的 LobeChat PWA 图标是黑色背景的,您可以在自行使用 cmd + i 粘贴如下图片替换为白色背景的。
+ 默认安装的 LobeChat PWA 图标是黑色背景的,您可以在自行使用 cmd + i 粘贴如下图片替换为白色背景的。
-
+ Discover how LobeChat offers diverse AI conversation options by supporting
+ multiple model providers, providing flexibility and a wide range of choices
+ for users and developers.
+tags:
+ - LobeChat
+ - AI Conversations
+ - Model Providers
+ - Diversity
+ - Flexibility
+ - Google AI
+ - ChatGLM
+ - Moonshot AI
+ - 01 AI
+ - Together AI
+ - Ollama
+---
+
+# Using Multiple Model Providers in LobeChat
+
+
+
+In the continuous development of LobeChat, we deeply understand the importance of diversity in model providers for providing AI conversation services to meet the needs of the community. Therefore, we have expanded our support to multiple model providers instead of being limited to a single one, in order to offer users a more diverse and rich selection of conversation options.
+
+This approach allows LobeChat to adapt more flexibly to different user needs and provides developers with a wider range of choices.
+
+## Tutorial on Using Model Providers
+
+
diff --git a/docs/usage/providers.zh-CN.mdx b/docs/usage/providers.zh-CN.mdx
new file mode 100644
index 000000000000..83abd4c92931
--- /dev/null
+++ b/docs/usage/providers.zh-CN.mdx
@@ -0,0 +1,34 @@
+---
+title: 在 LobeChat 中使用多模型服务商
+description: 了解 LobeChat 在多模型服务商支持方面的最新进展,包括已支持的模型服务商和计划中的扩展,以及本地模型支持的使用方式。
+tags:
+ - LobeChat
+ - AI 会话服务
+ - 模型服务商
+ - 多模型支持
+ - 本地模型支持
+ - AWS Bedrock
+ - Google AI
+ - ChatGLM
+ - Moonshot AI
+ - 01 AI
+ - Together AI
+ - Ollama
+---
+
+# 在 LobeChat 中使用多模型服务商
+
+
+
+在 LobeChat 的不断发展过程中,我们深刻理解到在提供 AI 会话服务时模型服务商的多样性对于满足社区需求的重要性。因此,我们不再局限于单一的模型服务商,而是拓展了对多种模型服务商的支持,以便为用户提供更为丰富和多样化的会话选择。
+
+通过这种方式,LobeChat 能够更灵活地适应不同用户的需求,同时也为开发者提供了更为广泛的选择空间。
+
+## 模型服务商使用教程
+
+
diff --git a/docs/usage/providers/01ai.mdx b/docs/usage/providers/01ai.mdx
new file mode 100644
index 000000000000..406a2dc7632a
--- /dev/null
+++ b/docs/usage/providers/01ai.mdx
@@ -0,0 +1,85 @@
+---
+title: Using Zero One AI in LobeChat
+description: >-
+ Learn how to integrate and use Zero One AI in LobeChat with step-by-step
+ instructions. Obtain an API key, configure Zero One AI, and start
+ conversations with AI models.
+tags:
+ - 01.AI
+ - Zero One AI
+ - Web UI
+ - API key
+ - AI models
+---
+
+# Using Zero One AI in LobeChat
+
+
+
+[Zero One AI](https://www.01.ai/) is a global company dedicated to AI 2.0 large model technology and applications. Its billion-parameter Yi-Large closed-source model, when evaluated on Stanford University's English ranking AlpacaEval 2.0, is on par with GPT-4.
+
+This document will guide you on how to use Zero One AI in LobeChat:
+
+
+
+### Step 1: Obtain Zero One AI API Key
+
+- Register and log in to the [Zero One AI Large Model Open Platform](https://platform.lingyiwanwu.com/)
+- Go to the `Dashboard` and access the `API Key Management` menu
+- A system-generated API key has been created for you automatically, or you can create a new one on this interface
+
+
+
+- Account verification is required for first-time use
+
+
+
+- Click on the created API key
+- Copy and save the API key in the pop-up dialog box
+
+
+
+### Step 2: Configure Zero One AI in LobeChat
+
+- Access the `Settings` interface in LobeChat
+- Find the setting for `Zero One AI` under `Language Model`
+
+
+
+- Open Zero One AI and enter the obtained API key
+- Choose a 01.AI model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to Zero One AI's relevant
+ fee policies.
+
+
+
+
+You can now use the models provided by Zero One AI for conversations in LobeChat.
diff --git a/docs/usage/providers/01ai.zh-CN.mdx b/docs/usage/providers/01ai.zh-CN.mdx
new file mode 100644
index 000000000000..7caaef6d8d71
--- /dev/null
+++ b/docs/usage/providers/01ai.zh-CN.mdx
@@ -0,0 +1,85 @@
+---
+title: 在 LobeChat 中使用 01.AI 零一万物
+description: >-
+ 学习如何在 LobeChat 中配置并使用 01.AI 零一万物提供的 AI 模型进行对话。获取 API 密钥、填入设置项、选择模型,开始与 AI
+ 助手交流。
+tags:
+ - LobeChat
+ - 01.AI
+ - Zero One AI
+ - 零一万物
+ - Web UI
+ - API密钥
+ - 配置指南
+---
+
+# 在 LobeChat 中使用零一万物
+
+
+
+[零一万物](https://www.01.ai/)是一家致力于AI 2.0大模型技术和应用的全球公司,其发布的千亿参数的Yi-Large闭源模型,在斯坦福大学的英语排行AlpacaEval 2.0上,与GPT-4互有第一。
+
+本文档将指导你如何在 LobeChat 中使用零一万物:
+
+
+
+### 步骤一:获取零一万物 API 密钥
+
+- 注册并登录 [零一万物大模型开放平台](https://platform.lingyiwanwu.com/)
+- 进入`工作台`并访问`API Key管理`菜单
+- 系统已为你自动创建了一个 API 密钥,你也可以在此界面创建新的 API 密钥
+
+
+
+- 初次使用时需要完成账号认证
+
+
+
+- 点击创建好的 API 密钥
+- 在弹出的对话框中复制并保存 API 密钥
+
+
+
+### 步骤二:在LobeChat 中配置零一万物
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`零一万物`的设置项
+
+
+
+- 打开零一万物并填入获得的 API 密钥
+- 为你的 AI 助手选择一个 01.AI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考零一万物的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用零一万物提供的模型进行对话了。
diff --git a/docs/usage/providers/anthropic.mdx b/docs/usage/providers/anthropic.mdx
new file mode 100644
index 000000000000..f613634cda22
--- /dev/null
+++ b/docs/usage/providers/anthropic.mdx
@@ -0,0 +1,78 @@
+---
+title: Using Anthropic Claude in LobeChat
+description: >-
+ Learn how to integrate Anthropic Claude API in LobeChat to enhance your AI
+ assistant capabilities. Support Claude 3.5 sonnet / Claude 3 Opus / Claude 3
+ haiku
+tags:
+ - Anthropic Claude
+ - API Key
+ - AI assistant
+ - Web UI
+---
+
+# Using Anthropic Claude in LobeChat
+
+
+
+The Anthropic Claude API is now available for everyone to use. This document will guide you on how to use [Anthropic Claude](https://www.anthropic.com/api) in LobeChat:
+
+
+
+### Step 1: Obtain Anthropic Claude API Key
+
+- Create an [Anthropic Claude API](https://www.anthropic.com/api) account.
+- Get your [API key](https://console.anthropic.com/settings/keys).
+
+
+
+
+ The Claude API currently offers $5 of free credits, but it is only available in certain specific
+ countries/regions. You can go to Dashboard > Claim to see if it is applicable to your
+ country/region.
+
+
+- Set up your billing for the API key to work on [https://console.anthropic.com/settings/plans](https://console.anthropic.com/settings/plans) (choose the "Build" plan so you can add credits and only pay for usage).
+
+
+
+### Step 2: Configure Anthropic Claude in LobeChat
+
+- Access the `Settings` interface in LobeChat.
+- Find the setting for `Anthropic Claude` under `Language Models`.
+
+
+
+- Enter the obtained API key.
+- Choose an Anthropic Claude model for your AI assistant to start the conversation.
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to Anthropic Claude's
+ relevant pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Anthropic Claude in LobeChat.
diff --git a/docs/usage/providers/anthropic.zh-CN.mdx b/docs/usage/providers/anthropic.zh-CN.mdx
new file mode 100644
index 000000000000..101d34edbf67
--- /dev/null
+++ b/docs/usage/providers/anthropic.zh-CN.mdx
@@ -0,0 +1,75 @@
+---
+title: 在 LobeChat 中使用 Anthropic Claude
+description: >-
+ 学习如何在 LobeChat 中配置和使用 Anthropic Claude API, Claude 3.5 sonnet / Claude 3 Opus
+ / Claude 3 haiku
+tags:
+ - Anthropic Claude
+ - API
+ - WebUI
+ - AI助手
+---
+
+# 在 LobeChat 中使用 Anthropic Claude
+
+
+
+Anthropic Claude API 现在可供所有人使用, 本文档将指导你如何在 LobeChat 中使用 [Anthropic Claude](https://www.anthropic.com/api):
+
+
+
+### 步骤一:获取 Anthropic Claude API 密钥
+
+- 创建一个 [Anthropic Claude API](https://www.anthropic.com/api) 帐户
+- 获取您的 [API 密钥](https://console.anthropic.com/settings/keys)
+
+
+
+
+ Claude API 现在提供 5 美元的免费积分,但是,它仅适用于某些特定国家/地区,您可以转到 Dashboard >
+ Claim 查看它是否适用于您所在的国家/地区。
+
+
+- 设置您的账单,让 API 密钥在 https://console.anthropic.com/settings/plans 上工作(选择“生成”计划,以便您可以添加积分并仅为使用量付费)
+
+
+
+### 步骤二:在 LobeChat 中配置 Anthropic Claude
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`Anthropic Claude`的设置项
+
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Anthropic Claude 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Anthropic Claude 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Anthropic Claude 提供的模型进行对话了。
diff --git a/docs/usage/providers/azure.mdx b/docs/usage/providers/azure.mdx
new file mode 100644
index 000000000000..728edc593706
--- /dev/null
+++ b/docs/usage/providers/azure.mdx
@@ -0,0 +1,88 @@
+---
+title: Using Azure OpenAI in LobeChat
+description: >-
+ Learn how to integrate and configure Azure OpenAI in LobeChat to enhance your
+ AI assistant capabilities. Follow these steps to obtain the API key, configure
+ the settings, and start engaging in conversations.
+tags:
+ - Azure OpenAI
+ - AI assistant
+ - API key
+ - Configuration
+ - Conversation models
+---
+
+# Using Azure OpenAI in LobeChat
+
+
+
+This document will guide you on how to use [Azure OpenAI](https://oai.azure.com/) in LobeChat:
+
+
+
+### Step 1: Obtain Azure OpenAI API Key
+
+- If you haven't registered yet, you need to create an [Azure OpenAI account](https://oai.azure.com/).
+
+
+
+- After registration, go to the `Deployments` page and create a new deployment with your selected model.
+
+![Create a new deployment with the selected model](https://github.com/lobehub/lobe-chat/assets/17870709/4fae3e6f-e680-4471-93c4-987c19d7170a)
+
+
+
+- Navigate to the `Chat` page and click on `View Code` to obtain your endpoint and key.
+
+
+
+
+
+### Step 2: Configure Azure OpenAI in LobeChat
+
+- Access the `Settings` interface in LobeChat.
+- Find the setting for `Azure OpenAI` under `Language Model`.
+
+
+
+- Enter the API key you obtained.
+- Choose an Azure OpenAI model for your AI assistant to start the conversation.
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to Azure OpenAI's
+ relevant pricing policies.
+
+
+
+
+Now you can engage in conversations using the models provided by Azure OpenAI in LobeChat.
diff --git a/docs/usage/providers/azure.zh-CN.mdx b/docs/usage/providers/azure.zh-CN.mdx
new file mode 100644
index 000000000000..a8edbc2f964f
--- /dev/null
+++ b/docs/usage/providers/azure.zh-CN.mdx
@@ -0,0 +1,79 @@
+---
+title: 在 LobeChat 中使用 Azure OpenAI
+description: 学习如何在 LobeChat 中配置和使用 Azure OpenAI 模型进行对话,包括获取 API 密钥和选择模型。
+tags:
+ - Azure OpenAI
+ - API Key
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Azure OpenAI
+
+
+
+本文档将指导你如何在 LobeChat 中使用 [Azure OpenAI](https://oai.azure.com/):
+
+
+
+### 步骤一:获取 Azure OpenAI API 密钥
+
+- 如果尚未注册,则必须注册 [Azure OpenAI 帐户](https://oai.azure.com/)。
+
+
+
+- 注册完毕后,转到 `Deployments` 页面,然后使用您选择的模型创建新部署。
+
+
+
+- 转到 `Chat` 页面,然后单击 `View Code` 以获取您的终结点和密钥。
+
+
+
+
+### 步骤二:在 LobeChat 中配置 Azure OpenAI
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`Azure OpenAI`的设置项
+
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Azure OpenAI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Azure OpenAI 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Azure OpenAI 提供的模型进行对话了。
diff --git a/docs/usage/providers/bedrock.mdx b/docs/usage/providers/bedrock.mdx
new file mode 100644
index 000000000000..326dc537e195
--- /dev/null
+++ b/docs/usage/providers/bedrock.mdx
@@ -0,0 +1,139 @@
+---
+title: Using Amazon Bedrock in LobeChat
+description: >-
+ Learn how to integrate Amazon Bedrock models into LobeChat for AI-powered
+ conversations. Follow these steps to grant access, obtain API keys, and
+ configure Amazon Bedrock.
+tags:
+ - Amazon Bedrock
+ - Claude 3.5 sonnect
+ - API keys
+ - Claude 3 Opus
+ - Web UI
+---
+
+# Using Amazon Bedrock in LobeChat
+
+
+
+Amazon Bedrock is a fully managed foundational model API service that allows users to access models from leading AI companies (such as AI21 Labs, Anthropic, Cohere, Meta, Stability AI) and Amazon's own foundational models.
+
+This document will guide you on how to use Amazon Bedrock in LobeChat:
+
+
+### Step 1: Grant Access to Amazon Bedrock Models in AWS
+
+- Access and log in to the [AWS Console](https://console.aws.amazon.com/)
+- Search for `bedrock` and enter the `Amazon Bedrock` service
+
+
+
+- Select `Models access` from the left menu
+
+
+
+- Open model access permissions based on your needs
+
+
+
+Some models may require additional information from you
+
+### Step 2: Obtain API Access Keys
+
+- Continue searching for IAM in the AWS console and enter the IAM service
+
+
+
+- In the `Users` menu, create a new IAM user
+
+
+
+- Enter the user name in the pop-up dialog box
+
+
+
+- Add permissions for this user or join an existing user group to ensure access to Amazon Bedrock
+
+
+
+- Create an access key for the added user
+
+
+
+- Copy and securely store the access key and secret access key, as they will be needed later
+
+
+
+
+ Please securely store the keys as they will only be shown once. If you lose them accidentally, you
+ will need to create a new access key.
+
+
+### Step 3: Configure Amazon Bedrock in LobeChat
+
+- Access the `Settings` interface in LobeChat
+- Find the setting for `Amazon Bedrock` under `Language Models` and open it
+
+
+
+- Open Amazon Bedrock and enter the obtained access key and secret access key
+- Choose an Amazon Bedrock model for your assistant to start the conversation
+
+
+
+
+ You may incur charges while using the API service, please refer to Amazon Bedrock's pricing
+ policy.
+
+
+
+
+You can now engage in conversations using the models provided by Amazon Bedrock in LobeChat.
diff --git a/docs/usage/providers/bedrock.zh-CN.mdx b/docs/usage/providers/bedrock.zh-CN.mdx
new file mode 100644
index 000000000000..2397913af93e
--- /dev/null
+++ b/docs/usage/providers/bedrock.zh-CN.mdx
@@ -0,0 +1,134 @@
+---
+title: 在 LobeChat 中使用 Amazon Bedrock
+description: 学习如何在 LobeChat 中配置和使用 Amazon Bedrock,一个完全托管的基础模型API服务,以便开始对话。
+tags:
+ - Amazon Bedrock
+ - Claude 3.5 sonnect
+ - API keys
+ - Claude 3 Opus
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Amazon Bedrock
+
+
+
+Amazon Bedrock 是一个完全托管的基础模型API服务,允许用户通过API访问来自领先AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Stability AI)和Amazon自家的基础模型。
+
+本文档将指导你如何在 LobeChat 中使用 Amazon Bedrock:
+
+
+### 步骤一:在 AWS 中打开 Amazon Bedrock 模型的访问权限
+
+- 访问并登录 [AWS Console](https://console.aws.amazon.com/)
+- 搜索 beckrock 并进入 `Amazon Bedrock` 服务
+
+
+
+- 在左侧菜单中选择 `Models acess`
+
+
+
+- 根据你所需要的模型,打开模型访问权限
+
+
+
+某些模型可能需要你提供额外的信息
+
+### 步骤二:获取 API 访问密钥
+
+- 继续在 AWS console 中搜索 IAM,进入 IAM 服务
+
+
+
+- 在 `用户` 菜单中,创建一个新的 IAM 用户
+
+
+
+- 在弹出的对话框中,输入用户名称
+
+
+
+- 为这个用户添加权限,或者加入一个已有的用户组,确保用户拥有 Amazon Bedrock 的访问权限
+
+
+
+- 为已添加的用户创建访问密钥
+
+
+
+- 复制并妥善保存访问密钥以及秘密访问密钥,后续将会用到
+
+
+
+
+ 请安全地存储密钥,因为它只会出现一次。如果您意外丢失它,您将需要创建一个新访问密钥。
+
+
+### 步骤三:在 LobeChat 中配置 Amazon Bedrock
+
+- 访问LobeChat的`设置`界面
+- 在`语言模型`下找到`Amazon Bedrock`的设置项并打开
+
+
+
+- 打开 Amazon Bedrock 并填入获得的访问密钥与秘密访问密钥
+- 为你的助手选择一个 Amazone Bedrock 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Amazon Bedrock 的费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Amazone Bedrock 提供的模型进行对话了。
diff --git a/docs/usage/providers/deepseek.mdx b/docs/usage/providers/deepseek.mdx
new file mode 100644
index 000000000000..60dd80a7ad6a
--- /dev/null
+++ b/docs/usage/providers/deepseek.mdx
@@ -0,0 +1,90 @@
+---
+title: Using DeepSeek in LobeChat
+description: >-
+ Learn how to use DeepSeek-V2 in LobeChat, obtain API keys. Get started with
+ DeepSeek integration now!
+tags:
+ - DeepSeek
+ - LobeChat
+ - DeepSeek-V2
+ - API Key
+ - Web UI
+---
+
+# Using DeepSeek in LobeChat
+
+
+
+[DeepSeek](https://www.deepseek.com/) is an advanced open-source Large Language Model (LLM). The latest version, DeepSeek-V2, has made significant optimizations in architecture and performance, reducing training costs by 42.5% and inference costs by 93.3%.
+
+This document will guide you on how to use DeepSeek in LobeChat:
+
+
+
+### Step 1: Obtain DeepSeek API Key
+
+- First, you need to register and log in to the [DeepSeek](https://platform.deepseek.com/) open platform.
+
+New users will receive a free quota of 500M Tokens
+
+- Go to the `API keys` menu and click on `Create API Key`.
+
+
+
+- Enter the API key name in the pop-up dialog box.
+
+
+
+- Copy the generated API key and save it securely.
+
+
+
+
+ Please store the key securely as it will only appear once. If you accidentally lose it, you will
+ need to create a new key.
+
+
+### Step 2: Configure DeepSeek in LobeChat
+
+- Access the `App Settings` interface in LobeChat.
+- Find the setting for `DeepSeek` under `Language Models`.
+
+
+
+- Open DeepSeek and enter the obtained API key.
+- Choose a DeepSeek model for your assistant to start the conversation.
+
+
+
+
+ You may need to pay the API service provider during usage, please refer to DeepSeek's relevant
+ pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Deepseek in LobeChat.
diff --git a/docs/usage/providers/deepseek.zh-CN.mdx b/docs/usage/providers/deepseek.zh-CN.mdx
new file mode 100644
index 000000000000..aeebaca13c1a
--- /dev/null
+++ b/docs/usage/providers/deepseek.zh-CN.mdx
@@ -0,0 +1,85 @@
+---
+title: 在 LobeChat 中使用 DeepSeek
+description: 学习如何在 LobeChat 中配置和使用 DeepSeek 语言模型,获取 API 密钥并开始对话。
+tags:
+ - LobeChat
+ - DeepSeek
+ - API密钥
+ - Web UI
+---
+
+# 在 LobeChat 中使用 DeepSeek
+
+
+
+[DeepSeek](https://www.deepseek.com/) 是一款先进的开源大型语言模型(LLM)。最新版本 DeepSeek-V2 在架构和性能上进行了显著优化,同时训练成本降低了42.5%,推理成本降低了93.3%。
+
+本文档将指导你如何在 LobeChat 中使用 DeepSeek:
+
+
+
+### 步骤一:获取 DeepSeek API 密钥
+
+- 首先,你需要注册并登录 [DeepSeek](https://platform.deepseek.com/) 开放平台
+
+当前新用户将会获赠 500M Tokens 的免费额度
+
+- 进入 `API keys` 菜单,并点击 `创建 API Key`
+
+
+
+- 在弹出的对话框中输入 API 密钥名称
+
+
+
+- 复制得到的 API 密钥并妥善保存
+
+
+
+
+ 请安全地存储密钥,因为它只会出现一次。如果你意外丢失它,您将需要创建一个新密钥。
+
+
+### 步骤二:在 LobeChat 中配置 DeepSeek
+
+- 访问 LobeChat 的 `应用设置`界面
+- 在 `语言模型` 下找到 `DeepSeek` 的设置项
+
+
+
+- 打开 DeepSeek 并填入获取的 API 密钥
+- 为你的助手选择一个 DeepSeek 模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 DeepSeek 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Deepseek 提供的模型进行对话了。
diff --git a/docs/usage/providers/gemini.mdx b/docs/usage/providers/gemini.mdx
new file mode 100644
index 000000000000..87a71ef00b86
--- /dev/null
+++ b/docs/usage/providers/gemini.mdx
@@ -0,0 +1,82 @@
+---
+title: Using Google Gemini in LobeChat
+description: >-
+ Learn how to integrate and utilize Google Gemini AI in LobeChat to enhance
+ your conversational experience. Follow these steps to configure Google Gemini
+ and start leveraging its powerful capabilities.
+tags:
+ - Google Gemini
+ - AI integration
+ - Google AI Studio
+ - Web UI
+---
+
+# Using Google Gemini in LobeChat
+
+
+
+Gemini AI is a set of large language models (LLMs) created by Google AI, known for its cutting-edge advancements in multimodal understanding and processing. It is essentially a powerful artificial intelligence tool capable of handling various tasks involving different types of data, not just text.
+
+This document will guide you on how to use Google Gemini in LobeChat:
+
+
+
+### Step 1: Obtain Google API Key
+
+- Visit and log in to [Google AI Studio](https://aistudio.google.com/)
+- Navigate to `Get API Key` in the menu and click on `Create API Key`
+
+
+
+- Select a project and create an API key, or create one in a new project
+
+
+
+- Copy the API key from the pop-up dialog
+
+
+
+### Step 2: Configure OpenAI in LobeChat
+
+- Go to the `Settings` interface in LobeChat
+- Find the setting for `Google Gemini` under `Language Models`
+
+
+
+- Enable Google Gemini and enter the obtained API key
+- Choose a Gemini model for your assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to Google Gemini's
+ pricing policy.
+
+
+
+
+Congratulations! You can now use Google Gemini in LobeChat.
diff --git a/docs/usage/providers/gemini.zh-CN.mdx b/docs/usage/providers/gemini.zh-CN.mdx
new file mode 100644
index 000000000000..6712f59eb734
--- /dev/null
+++ b/docs/usage/providers/gemini.zh-CN.mdx
@@ -0,0 +1,78 @@
+---
+title: 在 LobeChat 中使用 Google Gemini
+description: 本文将指导你如何在 LobeChat 中配置并使用 Google Gemini,一个由 Google AI 创建的强大语言模型。
+tags:
+ - Google Gemini
+ - Google AI
+ - API 密钥
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Google Gemini
+
+
+
+Gemini AI是由 Google AI 创建的一组大型语言模型(LLM),以其在多模式理解和处理方面的尖端进步而闻名。它本质上是一个强大的人工智能工具,可以处理涉及不同类型数据的各种任务,而不仅仅是文本。
+
+本文档将指导你如何在 LobeChat 中使用 Google Gemini:
+
+
+
+### 步骤一:获取 Google 的 API 密钥
+
+- 访问并登录 [Google AI Studio](https://aistudio.google.com/)
+- 在 `获取 API 密钥` 菜单中 `创建 API 密钥`
+
+
+
+- 选择一个项目并创建 API 密钥,或者在新项目中创建 API 密钥
+
+
+
+- 在弹出的对话框中复制 API 密钥
+
+
+
+### 步骤二:在 LobeChat 中配置OpenAI
+
+- 访问LobeChat的`设置`界面
+- 在`语言模型`下找到`Google Gemini`的设置项
+
+
+
+- 打开 Google Gemini 并填入获得的 API 密钥
+- 为你的助手选择一个 Gemini 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Google Gemini 的费用政策。
+
+
+
+
+至此,你已经可以在 LobeChat 中使用 Google Gemini 啦。
diff --git a/docs/usage/providers/groq.mdx b/docs/usage/providers/groq.mdx
index 0e9c35ce3a7b..18f2f6755eb9 100644
--- a/docs/usage/providers/groq.mdx
+++ b/docs/usage/providers/groq.mdx
@@ -1,27 +1,23 @@
---
title: Using Groq in LobeChat
description: >-
- Integrate Groq's LPU Inference Engine with LobeChat to accelerate large
- language models. Learn how to obtain GroqCloud API keys and configure Groq in
- LobeChat for optimal performance.
+ Learn how to obtain GroqCloud API keys and configure Groq in LobeChat for
+ optimal performance.
tags:
- - Groq
- - LobeChat
- - AI solutions
- LPU Inference Engine
- GroqCloud
+ - LLAMA3
+ - Qwen2
- API keys
- - Language Model
+ - Web UI
---
-import { Callout, Steps } from 'nextra/components';
-
# Using Groq in LobeChat
Groq's [LPU Inference Engine](https://wow.groq.com/news_press/groq-lpu-inference-engine-leads-in-first-independent-llm-benchmark/) has excelled in the latest independent Large Language Model (LLM) benchmark, redefining the standard for AI solutions with its remarkable speed and efficiency. By integrating LobeChat with Groq Cloud, you can now easily leverage Groq's technology to accelerate the operation of large language models in LobeChat.
diff --git a/docs/usage/providers/groq.zh-CN.mdx b/docs/usage/providers/groq.zh-CN.mdx
index 6a66d40507b7..a0986ff3e586 100644
--- a/docs/usage/providers/groq.zh-CN.mdx
+++ b/docs/usage/providers/groq.zh-CN.mdx
@@ -1,15 +1,12 @@
---
title: 在 LobeChat 中使用 Groq
-description: >-
- 通过 LobeChat 与 Groq Cloud 的集成,利用 Groq 的技术加速大语言模型的运行。了解如何获取 GroqCloud API Key,并在
- LobeChat 中配置 Groq,体验 Groq 强大的性能。
+description: 了解如何获取 GroqCloud API Key,并在 LobeChat 中配置 Groq,体验 Groq 强大的性能。
tags:
- - Groq
- - LobeChat
- - 大语言模型
- - AI 解决方案
+ - LLAMA3
+ - Qwen2
+ - API keys
+ - Web UI
- API Key
- - GroqCloud
---
# 在 LobeChat 中使用 Groq
@@ -17,7 +14,7 @@ tags:
Groq 的 [LPU 推理引擎](https://wow.groq.com/news_press/groq-lpu-inference-engine-leads-in-first-independent-llm-benchmark/) 在最新的独立大语言模型(LLM)基准测试中表现卓越,以其惊人的速度和效率重新定义了 AI 解决方案的标准。通过 LobeChat 与 Groq Cloud 的集成,你现在可以轻松地利用 Groq 的技术,在 LobeChat 中加速大语言模型的运行。
diff --git a/docs/usage/providers/minimax.mdx b/docs/usage/providers/minimax.mdx
new file mode 100644
index 000000000000..63979aaf5a82
--- /dev/null
+++ b/docs/usage/providers/minimax.mdx
@@ -0,0 +1,87 @@
+---
+title: Using Minimax in LobeChat
+description: >-
+ Learn how to use MiniMax in LobeChat to enhance AI conversations. Obtain
+ MiniMax API key, configure MiniMax in LobeChat settings, and select a model
+ for your AI assistant.
+tags:
+ - MiniMax
+ - Web UI
+ - API Key
+ - MiniMax Models
+---
+
+# Using Minimax in LobeChat
+
+
+
+[MiniMax](https://www.minimaxi.com/) is a general artificial intelligence technology company founded in 2021, dedicated to co-creating intelligence with users. MiniMax has independently developed universal large models of different modalities, including trillion-parameter MoE text large models, speech large models, and image large models. They have also launched applications like Hai Luo AI.
+
+This document will guide you on how to use Minimax in LobeChat:
+
+
+
+### Step 1: Obtain MiniMax API Key
+
+- Register and log in to the [MiniMax Open Platform](https://www.minimaxi.com/platform)
+- In `Account Management`, locate the `API Key` menu and create a new key
+
+
+
+- Enter a name for the API key and create it
+
+
+
+- Copy the API key from the pop-up dialog box and save it securely
+
+
+
+
+ Please store the key securely as it will only appear once. If you accidentally lose it, you will
+ need to create a new key.
+
+
+### Step 2: Configure MiniMax in LobeChat
+
+- Go to the `Settings` interface of LobeChat
+- Find the setting for `MiniMax` under `Language Model`
+
+
+
+- Open Minimax and enter the obtained API key
+- Choose a MiniMax model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to MiniMax's relevant
+ pricing policies.
+
+
+
+
+You can now use the models provided by MiniMax to have conversations in LobeChat.
diff --git a/docs/usage/providers/minimax.zh-CN.mdx b/docs/usage/providers/minimax.zh-CN.mdx
new file mode 100644
index 000000000000..aee3c783f469
--- /dev/null
+++ b/docs/usage/providers/minimax.zh-CN.mdx
@@ -0,0 +1,84 @@
+---
+title: 在 LobeChat 中使用 Minimax
+description: >-
+ 学习如何在 LobeChat 中配置并使用 MiniMax 智能模型进行对话。获取 MiniMax API 密钥、配置步骤详解,开始与 MiniMax
+ 模型交互。
+tags:
+ - LobeChat
+ - MiniMax
+ - API密钥
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Minimax
+
+
+
+[MiniMax](https://www.minimaxi.com/) 是 2021 年成立的通用人工智能科技公司,致力于与用户共创智能。MiniMax 自主研发了不同模态的通用大模型,其中包括万亿参数的 MoE 文本大模型、语音大模型以及图像大模型。并推出了海螺 AI 等应用。
+
+本文档将指导你如何在 LobeChat 中使用 Minimax:
+
+
+
+### 步骤一:获取 MiniMax API 密钥
+
+- 注册并登录 [MiniMax 开放平台](https://www.minimaxi.com/platform)
+- 在 `账户管理` 中找到 `接口密钥` 菜单,并创建新的密钥
+
+
+
+- 填写一个 API 密钥的名称并创建
+
+
+
+- 在弹出的对话框中复制 API 密钥,并妥善保存
+
+
+
+
+ 请安全地存储密钥,因为它只会出现一次。如果您意外丢失它,您将需要创建一个新密钥。
+
+
+### 步骤二:在LobeChat 中配置 MiniMax
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`MiniMax`的设置项
+
+
+
+- 打开 Minimax 并填入获得的 API 密钥
+- 为你的 AI 助手选择一个 MiniMax 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 MiniMax 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 MiniMax 提供的模型进行对话了。
diff --git a/docs/usage/providers/mistral.mdx b/docs/usage/providers/mistral.mdx
new file mode 100644
index 000000000000..b3d45ecff0ff
--- /dev/null
+++ b/docs/usage/providers/mistral.mdx
@@ -0,0 +1,69 @@
+---
+title: Using Mistral AI in LobeChat
+description: >-
+ Learn how to integrate Mistral AI into LobeChat for enhanced conversational
+ experiences. Follow the steps to configure Mistral AI and start using its
+ models.
+tags:
+ - Mistral AI
+ - Web UI
+ - API key
+---
+
+# Using Mistral AI in LobeChat
+
+
+
+The Mistral AI API is now available for everyone to use. This document will guide you on how to use [Mistral AI](https://mistral.ai/) in LobeChat:
+
+
+
+### Step 1: Obtain Mistral AI API Key
+
+- Create a [Mistral AI](https://mistral.ai/) account
+- Obtain your [API key](https://console.mistral.ai/user/api-keys/)
+
+
+
+### Step 2: Configure Mistral AI in LobeChat
+
+- Go to the `Settings` interface in LobeChat
+- Find the setting for `Mistral AI` under `Language Model`
+
+
+
+
+ If you are using mistral.ai, your account must have a valid subscription for the API key to work
+ properly. Newly created API keys may take 2-3 minutes to become active. If the "Test" button
+ fails, please retry after 2-3 minutes.
+
+
+- Enter the obtained API key
+- Choose a Mistral AI model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to Mistral AI's relevant
+ pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Mistral AI in LobeChat.
diff --git a/docs/usage/providers/mistral.zh-CN.mdx b/docs/usage/providers/mistral.zh-CN.mdx
new file mode 100644
index 000000000000..34eddb1c40b1
--- /dev/null
+++ b/docs/usage/providers/mistral.zh-CN.mdx
@@ -0,0 +1,64 @@
+---
+title: 在 LobeChat 中使用 Mistral AI
+description: 学习如何在 LobeChat 中配置并使用 Mistral AI,包括获取 API 密钥和选择适合的 AI 模型进行对话。
+tags:
+ - Web UI
+ - Mistral AI
+ - API Key
+---
+
+# 在 LobeChat 中使用 Mistral AI
+
+
+
+Mistral AI API 现在可供所有人使用, 本文档将指导你如何在 LobeChat 中使用 [Mistral AI](https://mistral.ai/):
+
+
+
+### 步骤一:获取 Mistral AI API 密钥
+
+- 创建一个 [Mistral AI](https://mistral.ai/) 帐户
+- 获取您的 [API 密钥](https://console.mistral.ai/user/api-keys/)
+
+
+
+### 步骤二:在 LobeChat 中配置 Mistral AI
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`Mistral AI`的设置项
+
+
+
+
+ 如果您使用的是 mistral.ai,则您的帐户必须具有有效的订阅才能使 API 密钥正常工作。新创建的 API
+ 密钥需要 2-3 分钟才能开始工作。如果单击“测试”按钮但失败,请在 2-3 分钟后重试。
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Mistral AI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Mistral AI 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Mistral AI 提供的模型进行对话了。
diff --git a/docs/usage/providers/moonshot.mdx b/docs/usage/providers/moonshot.mdx
new file mode 100644
index 000000000000..347eb7a130f3
--- /dev/null
+++ b/docs/usage/providers/moonshot.mdx
@@ -0,0 +1,68 @@
+---
+title: Using Moonshot AI in LobeChat
+description: >-
+ Learn how to integrate Moonshot AI into LobeChat for AI-powered conversations.
+ Follow the steps to get the API key, configure Moonshot AI, and start engaging
+ with AI models.
+tags:
+ - Moonshot AI
+ - Web UI
+ - API Key
+---
+
+# Using Moonshot AI in LobeChat
+
+
+
+The Moonshot AI API is now available for everyone to use. This document will guide you on how to use [Moonshot AI](https://www.moonshot.cn/) in LobeChat:
+
+
+
+### Step 1: Get Moonshot AI API Key
+
+- Apply for your [API key](https://platform.moonshot.cn/console/api-keys)
+
+
+
+### Step 2: Configure Moonshot AI in LobeChat
+
+- Visit the `Settings` interface in LobeChat
+- Find the setting for `Moonshot AI` under `Language Models`
+
+
+
+
+ If you are using mistral.ai, your account must have a valid subscription for the API key to work
+ properly. Newly created API keys may take 2-3 minutes to become active. If the "Test" button
+ fails, please retry after 2-3 minutes.
+
+
+- Enter the API key you obtained
+- Choose a Moonshot AI model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider according to Moonshot AI's related
+ pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Moonshot AI in LobeChat.
diff --git a/docs/usage/providers/moonshot.zh-CN.mdx b/docs/usage/providers/moonshot.zh-CN.mdx
new file mode 100644
index 000000000000..3f4af9c28600
--- /dev/null
+++ b/docs/usage/providers/moonshot.zh-CN.mdx
@@ -0,0 +1,63 @@
+---
+title: 在 LobeChat 中使用 Moonshot AI
+description: 学习如何在 LobeChat 中配置和使用 Moonshot AI,包括获取 API 密钥和选择适合的 AI 模型进行对话。
+tags:
+ - Moonshot AI
+ - Web UI
+ - API Key
+---
+
+# 在 LobeChat 中使用 Moonshot AI
+
+
+
+Moonshot AI API 现在可供所有人使用, 本文档将指导你如何在 LobeChat 中使用 [Moonshot AI](https://www.moonshot.cn/):
+
+
+
+### 步骤一:获取 Moonshot AI API 密钥
+
+- 申请您的 [API 密钥](https://platform.moonshot.cn/console/api-keys)
+
+
+
+### 步骤二:在 LobeChat 中配置 Moonshot AI
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`Moonshot AI`的设置项
+
+
+
+
+ 如果您使用的是 mistral.ai,则您的帐户必须具有有效的订阅才能使 API 密钥正常工作。新创建的 API
+ 密钥需要 2-3 分钟才能开始工作。如果单击“测试”按钮但失败,请在 2-3 分钟后重试。
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Moonshot AI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Moonshot AI 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Moonshot AI 提供的模型进行对话了。
diff --git a/docs/usage/providers/ollama.mdx b/docs/usage/providers/ollama.mdx
index d2052397802b..2d7f03de2435 100644
--- a/docs/usage/providers/ollama.mdx
+++ b/docs/usage/providers/ollama.mdx
@@ -5,9 +5,10 @@ description: >-
cutting-edge AI usage.
tags:
- Ollama
- - LobeChat
- Local LLM
- Ollama WebUI
+ - Web UI
+ - API Key
---
# Using Ollama in LobeChat
@@ -16,7 +17,7 @@ tags:
alt={'Using Ollama in LobeChat'}
borderless
cover
- src={'https://github.com/lobehub/lobe-chat/assets/28616219/a2a091b8-ac45-4679-b5e0-21d711e17fef'}
+ src={'https://github.com/lobehub/lobe-chat/assets/17870709/f579b39b-e771-402c-a1d1-620e57a10c75'}
/>
Ollama is a powerful framework for running large language models (LLMs) locally, supporting various language models including Llama 2, Mistral, and more. Now, LobeChat supports integration with Ollama, meaning you can easily enhance your application by using the language models provided by Ollama in LobeChat.
diff --git a/docs/usage/providers/ollama.zh-CN.mdx b/docs/usage/providers/ollama.zh-CN.mdx
index 07fda1c97a18..2b899b47dce2 100644
--- a/docs/usage/providers/ollama.zh-CN.mdx
+++ b/docs/usage/providers/ollama.zh-CN.mdx
@@ -3,7 +3,8 @@ title: 在 LobeChat 中使用 Ollama
description: 了解如何在 LobeChat 中使用 Ollama ,在你的本地运行大型语言模型,获得最前沿的 AI 使用体验。
tags:
- Ollama
- - LobeChat
+ - Web UI
+ - API Key
- Local LLM
- Ollama WebUI
---
@@ -14,7 +15,7 @@ tags:
alt={'在 LobeChat 中使用 Ollama'}
borderless
cover
- src={'https://github.com/lobehub/lobe-chat/assets/28616219/a2a091b8-ac45-4679-b5e0-21d711e17fef'}
+ src={'https://github.com/lobehub/lobe-chat/assets/17870709/f579b39b-e771-402c-a1d1-620e57a10c75'}
/>
Ollama 是一款强大的本地运行大型语言模型(LLM)的框架,支持多种语言模型,包括 Llama 2, Mistral 等。现在,LobeChat 已经支持与 Ollama 的集成,这意味着你可以在 LobeChat 中轻松使用 Ollama 提供的语言模型来增强你的应用。
diff --git a/docs/usage/providers/ollama/gemma.mdx b/docs/usage/providers/ollama/gemma.mdx
index 69df78b07e50..80997f15eb60 100644
--- a/docs/usage/providers/ollama/gemma.mdx
+++ b/docs/usage/providers/ollama/gemma.mdx
@@ -17,7 +17,7 @@ tags:
[Gemma](https://blog.google/technology/developers/gemma-open-models/) is an open-source large language model (LLM) from Google, designed to provide a more general and flexible model for various natural language processing tasks. Now, with the integration of LobeChat and [Ollama](https://ollama.com/), you can easily use Google Gemma in LobeChat.
diff --git a/docs/usage/providers/ollama/gemma.zh-CN.mdx b/docs/usage/providers/ollama/gemma.zh-CN.mdx
index 6bcc70649065..40a201df5a6c 100644
--- a/docs/usage/providers/ollama/gemma.zh-CN.mdx
+++ b/docs/usage/providers/ollama/gemma.zh-CN.mdx
@@ -17,7 +17,7 @@ tags:
alt={'在 LobeChat 中使用 Gemma'}
cover
rounded
- src={'https://github.com/lobehub/lobe-chat/assets/28616219/e636cb41-5b7f-4949-a236-1cc1633bd223'}
+ src={'https://github.com/lobehub/lobe-chat/assets/17870709/65d2dd2a-fdcf-4f3f-a6af-4ed5164a510d'}
/>
[Gemma](https://blog.google/technology/developers/gemma-open-models/) 是 Google 开源的一款大语言模型(LLM),旨在提供一个更加通用、灵活的模型用于各种自然语言处理任务。现在,通过 LobeChat 与 [Ollama](https://ollama.com/) 的集成,你可以轻松地在 LobeChat 中使用 Google Gemma。
diff --git a/docs/usage/providers/ollama/qwen.mdx b/docs/usage/providers/ollama/qwen.mdx
index 8372e6771f0a..243c02f53846 100644
--- a/docs/usage/providers/ollama/qwen.mdx
+++ b/docs/usage/providers/ollama/qwen.mdx
@@ -14,7 +14,7 @@ tags:
[Qwen](https://github.com/QwenLM/Qwen1.5) is a large language model (LLM) open-sourced by Alibaba Cloud. It is officially defined as a constantly evolving AI large model, and it achieves more accurate Chinese recognition capabilities through more training set content.
diff --git a/docs/usage/providers/ollama/qwen.zh-CN.mdx b/docs/usage/providers/ollama/qwen.zh-CN.mdx
index 24e3e246e41b..fc9ab9192f79 100644
--- a/docs/usage/providers/ollama/qwen.zh-CN.mdx
+++ b/docs/usage/providers/ollama/qwen.zh-CN.mdx
@@ -14,7 +14,7 @@ tags:
[通义千问](https://github.com/QwenLM/Qwen1.5) 是阿里云开源的一款大语言模型(LLM),官方定义是一个不断进化的 AI 大模型,并通过更多的训练集内容达到更精准的中文识别能力。
diff --git a/docs/usage/providers/openai.mdx b/docs/usage/providers/openai.mdx
new file mode 100644
index 000000000000..55e5c79c40a2
--- /dev/null
+++ b/docs/usage/providers/openai.mdx
@@ -0,0 +1,94 @@
+---
+title: Using OpenAI in LobeChat
+description: >-
+ Learn how to integrate OpenAI API Key in LobeChat. Support GPT-4o /
+ GPT-4-turbo / GPT-4-vision
+tags:
+ - OpenAI
+ - ChatGPT
+ - GPT-4
+ - GPT-4o
+ - API Key
+ - Web UI
+---
+
+# Using OpenAI in LobeChat
+
+
+
+This document will guide you on how to use [OpenAI](https://openai.com/) in LobeChat:
+
+
+
+### Step 1: Obtain OpenAI API Key
+
+- Register for an [OpenAI account](https://platform.openai.com/signup). You will need to register using an international phone number and a non-mainland email address.
+
+- After registration, go to the [API Keys](https://platform.openai.com/api-keys) page and click on `Create new secret key` to generate a new API Key.
+
+- Open the creation window
+
+
+
+- Create API Key
+
+
+
+- Retrieve API Key
+
+
+
+
+ After registering, you generally have a free credit of $5, but it is only valid for three months.
+
+
+### Step 2: Configure OpenAI in LobeChat
+
+- Visit the `Settings` page in LobeChat
+- Find the setting for `OpenAI` under `Language Model`
+
+
+
+- Enter the obtained API Key
+- Choose an OpenAI model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to OpenAI's relevant
+ pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by OpenAI in LobeChat.
diff --git a/docs/usage/providers/openai.zh-CN.mdx b/docs/usage/providers/openai.zh-CN.mdx
new file mode 100644
index 000000000000..8e699f83621c
--- /dev/null
+++ b/docs/usage/providers/openai.zh-CN.mdx
@@ -0,0 +1,87 @@
+---
+title: 在 LobeChat 中使用 OpenAI
+description: 学习如何在 LobeChat 中配置和使用 OpenAI API Key,支持 GPT-4o / GPT-4-turbo / GPT-4-vision
+tags:
+ - ChatGPT
+ - GPT-4
+ - GPT-4o
+ - API Key
+ - Web UI
+---
+
+# 在 LobeChat 中使用 OpenAI
+
+
+
+本文档将指导你如何在 LobeChat 中使用 [OpenAI](https://openai.com/):
+
+
+
+### 步骤一:获取 OpenAI API 密钥
+
+- 注册一个 [OpenAI 账户](https://platform.openai.com/signup),你需要使用国际手机号、非大陆邮箱进行注册;
+- 注册完毕后,前往 [API Keys](https://platform.openai.com/api-keys) 页面,点击 `Create new secret key` 创建新的 API Key:
+
+- 打开创建窗口
+
+
+
+- 创建 API Key
+
+
+
+- 获取 API Key
+
+
+
+账户注册后,一般有 5 美元的免费额度,但有效期只有三个月。
+
+### 步骤二:在 LobeChat 中配置 OpenAI
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`OpenAI`的设置项
+
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 OpenAI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 OpenAI 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 OpenAI 提供的模型进行对话了。
diff --git a/docs/usage/providers/openrouter.mdx b/docs/usage/providers/openrouter.mdx
new file mode 100644
index 000000000000..b347476c9664
--- /dev/null
+++ b/docs/usage/providers/openrouter.mdx
@@ -0,0 +1,110 @@
+---
+title: Using OpenRouter in LobeChat
+description: >-
+ Learn how to integrate and utilize OpenRouter's language model APIs in
+ LobeChat. Follow these steps to register, create an API key, recharge credit,
+ and configure OpenRouter for seamless conversations.
+tags:
+ - OpenRouter
+ - LobeChat
+ - API Key
+ - Web UI
+---
+
+# Using OpenRouter in LobeChat
+
+
+
+[OpenRouter](https://openrouter.ai/) is a service that provides a variety of excellent large language model APIs, supporting models such as OpenAI (including GPT-3.5/4), Anthropic (Claude2, Instant), LLaMA 2, and PaLM Bison.
+
+This document will guide you on how to use OpenRouter in LobeChat:
+
+
+
+### Step 1: Register and Log in to OpenRouter
+
+- Visit [OpenRouter.ai](https://openrouter.ai/) and create an account
+- You can log in using your Google account or MetaMask wallet
+
+
+
+### Step 2: Create an API Key
+
+- Go to the `Keys` menu or visit [OpenRouter Keys](https://openrouter.ai/keys) directly
+- Click on `Create Key` to start the creation process
+- Name your API key in the pop-up dialog, for example, "LobeChat Key"
+- Leave the `Credit limit` blank to indicate no amount limit
+
+
+
+- Copy the API key from the pop-up dialog and save it securely
+
+
+
+
+ Please store the key securely as it will only appear once. If you lose it accidentally, you will
+ need to create a new key.
+
+
+### Step 3: Recharge Credit
+
+- Go to the `Credit` menu or visit [OpenRouter Credit](https://openrouter.ai/credits) directly
+- Click on `Manage Credits` to recharge your credit, you can check model prices at [https://openrouter.ai/models](https://openrouter.ai/models)
+- OpenRouter provides some free models that can be used without recharging
+
+
+
+### Step 4: Configure OpenRouter in LobeChat
+
+- Visit the `Settings` interface in LobeChat
+- Find the setting for `OpenRouter` under `Language Models`
+- Enable OpenRouter and enter the API key you obtained
+
+
+
+- Choose an OpenRouter model for your assistant to start the conversation
+
+
+
+
+ You may need to pay the API service provider during usage, please refer to OpenRouter's relevant
+ fee policies.
+
+
+
+
+You can now engage in conversations using the models provided by OpenRouter in LobeChat.
diff --git a/docs/usage/providers/openrouter.zh-CN.mdx b/docs/usage/providers/openrouter.zh-CN.mdx
new file mode 100644
index 000000000000..6af97b6eccae
--- /dev/null
+++ b/docs/usage/providers/openrouter.zh-CN.mdx
@@ -0,0 +1,104 @@
+---
+title: 在 LobeChat 中使用 OpenRouter
+description: 学习如何在 LobeChat 中注册、创建 API 密钥、充值信用额度并配置 OpenRouter,以便开始使用多种优秀大语言模型 API。
+tags:
+ - OpenRouter
+ - API Key
+ - Web UI
+---
+
+# 在 LobeChat 中使用 OpenRouter
+
+
+
+[OpenRouter](https://openrouter.ai/) 是一个提供多种优秀大语言模型 API 的服务,它支持 OpenAI (包括 GPT-3.5/4)、Anthropic (Claude2、Instant)、LLaMA 2 和 PaLM Bison 等众多模型。
+
+本文档将指导你如何在 LobeChat 中使用 OpenRouter:
+
+
+
+### 步骤一:注册 OpenRouter 账号并登录
+
+- 访问 [OpenRouter.ai](https://openrouter.ai/) 并创建一个账号
+- 你可以用 Google 账号或 MetaMask 钱包登录
+
+
+
+### 步骤二:创建 API 密钥
+
+- 进入 `Keys` 菜单或直接访问 [OpenRouter Keys](https://openrouter.ai/keys)
+- 点击 `Create Key` 开始创建
+- 在弹出对话框中为 API 密钥取一个名字,例如 "LobeChat Key"
+- 留空 `Credit limit` 表示不设置金额限制
+
+
+
+- 在弹出的对话框中复制 API 密钥,并妥善保存
+
+
+
+
+ 请安全地存储密钥,因为它只会出现一次。如果您意外丢失它,您将需要创建一个新密钥。
+
+
+### 步骤三:充值信用额度
+
+- 进入 `Credit` 菜单,或直接访问 [OpenRouter Credit](https://openrouter.ai/credits)
+- 点击 `Manage Credits` 充值信用额度,在 [https://openrouter.ai/models](https://openrouter.ai/models) 中可以查看模型价格
+- OpenRouter 提供了一些免费模型,未充值的情况下可以使用
+
+
+
+### 步骤四:在 LobeChat 中配置 OpenRouter
+
+- 访问 LobeChat 的 `设置` 界面
+- 在 `语言模型` 下找到 `OpenRouter` 的设置项
+- 打开 OpenRouter 并填入获得的 API 密钥
+
+
+
+- 为你的助手选择一个 OpenRouter 模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 OpenRouter 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 OpenRouter 提供的模型进行对话了。
diff --git a/docs/usage/providers/perplexity.mdx b/docs/usage/providers/perplexity.mdx
new file mode 100644
index 000000000000..ea035a32f6ea
--- /dev/null
+++ b/docs/usage/providers/perplexity.mdx
@@ -0,0 +1,62 @@
+---
+title: Using Perplexity AI in LobeChat
+description: >-
+ Learn how to integrate and use Perplexity AI in LobeChat to enhance your AI
+ assistant's capabilities.
+tags:
+ - Perplexity AI
+ - API key
+ - Web UI
+---
+
+# Using Perplexity AI in LobeChat
+
+
+
+The Perplexity AI API is now available for everyone to use. This document will guide you on how to use [Perplexity AI](https://www.perplexity.ai/) in LobeChat:
+
+
+
+### Step 1: Obtain Perplexity AI API Key
+
+- Create a [Perplexity AI](https://www.perplexity.ai/) account
+- Obtain your [API key](https://www.perplexity.ai/settings/api)
+
+
+
+### Step 2: Configure Perplexity AI in LobeChat
+
+- Go to the `Settings` interface in LobeChat
+- Find the setting for `Perplexity AI` under `Language Model`
+
+
+
+- Enter the API key you obtained
+- Choose a Perplexity AI model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to Perplexity AI's
+ relevant pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Perplexity AI in LobeChat.
diff --git a/docs/usage/providers/perplexity.zh-CN.mdx b/docs/usage/providers/perplexity.zh-CN.mdx
new file mode 100644
index 000000000000..9e5ee34da996
--- /dev/null
+++ b/docs/usage/providers/perplexity.zh-CN.mdx
@@ -0,0 +1,59 @@
+---
+title: 在 LobeChat 中使用 Perplexity AI
+description: 学习如何在 LobeChat 中配置和使用 Perplexity AI,获取 API 密钥并选择适合的语言模型开始对话。
+tags:
+ - Perplexity AI
+ - API key
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Perplexity AI
+
+
+
+Perplexity AI API 现在可供所有人使用, 本文档将指导你如何在 LobeChat 中使用 [Perplexity AI](https://www.perplexity.ai/):
+
+
+
+### 步骤一:获取 Perplexity AI API 密钥
+
+- 创建一个 [Perplexity AI](https://www.perplexity.ai/) 帐户
+- 获取您的 [API 密钥](https://www.perplexity.ai/settings/api)
+
+
+
+### 步骤二:在 LobeChat 中配置 Perplexity AI
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`Perplexity AI`的设置项
+
+
+
+- 填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Perplexity AI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Perplexity AI 的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Perplexity AI 提供的模型进行对话了。
diff --git a/docs/usage/providers/qwen.mdx b/docs/usage/providers/qwen.mdx
new file mode 100644
index 000000000000..a8b2876c69df
--- /dev/null
+++ b/docs/usage/providers/qwen.mdx
@@ -0,0 +1,92 @@
+---
+title: Using Tongyi Qianwen in LobeChat
+description: >-
+ Learn how to integrate and utilize Tongyi Qianwen, a powerful language model
+ by Alibaba Cloud, in LobeChat for various tasks. Follow the steps to activate
+ the service, obtain the API key, and configure Tongyi Qianwen for seamless
+ interaction.
+tags:
+ - Tongyi Qianwen
+ - Alibaba Cloud
+ - DashScope
+ - API key
+ - Web UI
+---
+
+# Using Tongyi Qianwen in LobeChat
+
+
+
+[Tongyi Qianwen](https://tongyi.aliyun.com/) is a large-scale language model independently developed by Alibaba Cloud, with powerful natural language understanding and generation capabilities. It can answer various questions, create text content, express opinions, write code, and play a role in multiple fields.
+
+This document will guide you on how to use Tongyi Qianwen in LobeChat:
+
+
+
+### Step 1: Activate DashScope Model Service
+
+- Visit and log in to Alibaba Cloud's [DashScope](https://dashscope.console.aliyun.com/) platform.
+- If it is your first time, you need to activate the DashScope service.
+- If you have already activated it, you can skip this step.
+
+
+
+### Step 2: Obtain DashScope API Key
+
+- Go to the `API-KEY` interface and create an API key.
+
+
+
+- Copy the API key from the pop-up dialog box and save it securely.
+
+
+
+
+ Please store the key securely as it will only appear once. If you accidentally lose it, you will
+ need to create a new key.
+
+
+### Step 3: Configure Tongyi Qianwen in LobeChat
+
+- Visit the `Settings` interface in LobeChat.
+- Find the setting for `Tongyi Qianwen` under `Language Model`.
+
+
+
+- Open Tongyi Qianwen and enter the obtained API key.
+- Choose a Qwen model for your AI assistant to start the conversation.
+
+
+
+
+ During usage, you may need to pay the API service provider. Please refer to Tongyi Qianwen's
+ relevant pricing policies.
+
+
+
+
+You can now engage in conversations using the models provided by Tongyi Qianwen in LobeChat.
diff --git a/docs/usage/providers/qwen.zh-CN.mdx b/docs/usage/providers/qwen.zh-CN.mdx
new file mode 100644
index 000000000000..3ec9561c6c4a
--- /dev/null
+++ b/docs/usage/providers/qwen.zh-CN.mdx
@@ -0,0 +1,87 @@
+---
+title: 在 LobeChat 中使用通义千问
+description: 学习如何在 LobeChat 中配置和使用阿里云的通义千问模型,提供强大的自然语言理解和生成能力。
+tags:
+ - LobeChat
+ - 通义千问
+ - DashScope
+ - DashScope
+ - API key
+ - Web UI
+---
+
+# 在 LobeChat 中使用通义千问
+
+
+
+[通义千问](https://tongyi.aliyun.com/)是阿里云自主研发的超大规模语言模型,具有强大的自然语言理解和生成能力。它可以回答各种问题、创作文字内容、表达观点看法、撰写代码等,在多个领域发挥作用。
+
+本文档将指导你如何在 LobeChat 中使用通义千问:
+
+
+
+### 步骤一:开通 DashScope 模型服务
+
+- 访问并登录阿里云 [DashScope](https://dashscope.console.aliyun.com/) 平台
+- 初次进入时需要开通 DashScope 服务
+- 若你已开通,可跳过该步骤
+
+
+
+### 步骤二:获取 DashScope API 密钥
+
+- 进入`API-KEY` 界面,并创建一个 API 密钥
+
+
+
+- 在弹出的对话框中复制 API 密钥,并妥善保存
+
+
+
+
+ 请安全地存储密钥,因为它只会出现一次。如果您意外丢失它,您将需要创建一个新密钥。
+
+
+### 步骤三:在LobeChat 中配置通义千问
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到`通义千问`的设置项
+
+
+
+- 打开通义千问并填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Qwen 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考通义千问的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用通义千问提供的模型进行对话了。
diff --git a/docs/usage/providers/stepfun.mdx b/docs/usage/providers/stepfun.mdx
new file mode 100644
index 000000000000..fac656c2f41a
--- /dev/null
+++ b/docs/usage/providers/stepfun.mdx
@@ -0,0 +1,66 @@
+---
+title: Using Stepfun in LobeChat
+description: >-
+ Learn how to integrate Stepfun AI models into LobeChat for engaging
+ conversations. Obtain Stepfun API key, configure Stepfun in LobeChat settings,
+ and select a model to start chatting.
+tags:
+ - Stepfun
+ - API key
+ - Web UI
+---
+
+# Using Stepfun in LobeChat
+
+
+
+[Stepfun](https://www.stepfun.com/) is a startup focusing on the research and development of Artificial General Intelligence (AGI). They have released the Step-1 billion-parameter language model, Step-1V billion-parameter multimodal model, and the Step-2 trillion-parameter MoE language model preview.
+
+This document will guide you on how to use Stepfun in LobeChat:
+
+
+
+### Step 1: Obtain Stepfun API Key
+
+- Visit and log in to the [Stepfun Open Platform](https://platform.stepfun.com/)
+- Go to the `API Key` menu, where the system has already created an API key for you
+- Copy the created API key
+
+
+
+### Step 2: Configure Stepfun in LobeChat
+
+- Visit the `Settings` interface in LobeChat
+- Find the setting for Stepfun under `Language Models`
+
+
+
+- Open Stepfun and enter the obtained API key
+- Choose a Stepfun model for your AI assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to Stepfun's relevant
+ pricing policies.
+
+
+
+
+You can now use the models provided by Stepfun to have conversations in LobeChat.
diff --git a/docs/usage/providers/stepfun.zh-CN.mdx b/docs/usage/providers/stepfun.zh-CN.mdx
new file mode 100644
index 000000000000..68c817967667
--- /dev/null
+++ b/docs/usage/providers/stepfun.zh-CN.mdx
@@ -0,0 +1,62 @@
+---
+title: 在 LobeChat 中使用 Stepfun Stepfun 阶跃星辰
+description: 学习如何在 LobeChat 中配置和使用 Stepfun 阶跃星辰的人工智能模型,包括获取 API 密钥和选择模型开始对话。
+tags:
+ - Stepfun 阶跃星辰
+ - API key
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Stepfun 阶跃星辰
+
+
+
+[Stepfun 阶跃星辰](https://www.stepfun.com/)是一家专注于通用人工智能(AGI)研发的创业公司,目前已推出Step-1千亿参数语言大模型、Step-1V千亿参数多模态大模型,以及Step-2万亿参数MoE语言大模型预览版。
+
+本文档将指导你如何在 LobeChat 中使用 Stepfun 阶跃星辰:
+
+
+
+### 步骤一:获取 Stepfun 阶跃星辰 API 密钥
+
+- 访问并登录 [Stepfun Stepfun 阶跃星辰开放平台](https://platform.stepfun.com/)
+- 进入`接口密钥`菜单,系统已为你创建好 API 密钥
+- 复制已创建的 API 密钥
+
+
+
+### 步骤二:在LobeChat 中配置 Stepfun Stepfun 阶跃星辰
+
+- 访问 LobeChat 的`设置`界面
+- 在`语言模型`下找到` Stepfun 阶跃星辰`的设置项
+
+
+
+- 打开 Stepfun 阶跃星辰并填入获得的 API 密钥
+- 为你的 AI 助手选择一个 Stepfun 阶跃星辰的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Stepfun 阶跃星辰的相关费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Stepfun 阶跃星辰提供的模型进行对话了。
diff --git a/docs/usage/providers/togetherai.mdx b/docs/usage/providers/togetherai.mdx
new file mode 100644
index 000000000000..529092d6f137
--- /dev/null
+++ b/docs/usage/providers/togetherai.mdx
@@ -0,0 +1,72 @@
+---
+title: Using Together AI in LobeChat
+description: >-
+ Learn how to integrate Together AI into LobeChat, obtain the API key,
+ configure settings, and start conversations with AI models.
+tags:
+ - Together AI
+ - API key
+ - Web UI
+---
+
+# Using Together AI in LobeChat
+
+
+
+[together.ai](https://www.together.ai/) is a platform focused on the field of Artificial Intelligence Generated Content (AIGC), founded in June 2022. It is dedicated to building a cloud platform for running, training, and fine-tuning open-source models, providing scalable computing power at prices lower than mainstream vendors.
+
+This document will guide you on how to use Together AI in LobeChat:
+
+
+
+### Step 1: Obtain the API Key for Together AI
+
+- Visit and log in to [Together AI API](https://api.together.ai/)
+- Upon initial login, the system will automatically create an API key for you and provide a $5.0 credit
+
+
+
+- If you haven't saved it, you can also view the API key at any time in the `API Key` interface under `Settings`
+
+
+
+### Step 2: Configure Together AI in LobeChat
+
+- Visit the `Settings` interface in LobeChat
+- Find the setting for `together.ai` under `Language Model`
+
+
+
+- Open together.ai and enter the obtained API key
+- Choose a Together AI model for your assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to Together AI's pricing
+ policy.
+
+
+
+
+You can now engage in conversations using the models provided by Together AI in LobeChat.
diff --git a/docs/usage/providers/togetherai.zh-CN.mdx b/docs/usage/providers/togetherai.zh-CN.mdx
new file mode 100644
index 000000000000..5ff52130581e
--- /dev/null
+++ b/docs/usage/providers/togetherai.zh-CN.mdx
@@ -0,0 +1,70 @@
+---
+title: 在 LobeChat 中使用 Together AI
+description: 学习如何在 LobeChat 中配置和使用 Together AI 的API密钥,以便开始对话和交互。
+tags:
+ - LobeChat
+ - Together AI
+ - API密钥
+ - Web UI
+---
+
+# 在 LobeChat 中使用 Together AI
+
+
+
+[together.ai](https://www.together.ai/) 是一家专注于生成式人工智能(AIGC)领域的平台,成立于2022年6月。 它致力于构建用于运行、训练和微调开源模型的云平台,以低于主流供应商的价格提供可扩展的计算能力。
+
+本文档将指导你如何在 LobeChat 中使用 Together AI:
+
+
+
+### 步骤一:获取 Together AI 的 API 密钥
+
+- 访问并登录 [Together AI API](https://api.together.ai/)
+- 初次登录时系统会自动为你创建好 API 密钥并赠送 $5.0 的额度
+
+
+
+- 如果你没有保存,也可以在后续任意时间,通过 `设置` 中的 `API 密钥` 界面查看
+
+
+
+### 步骤二:在 LobeChat 中配置 Together AI
+
+- 访问LobeChat的`设置`界面
+- 在`语言模型`下找到`together.ai`的设置项
+
+
+
+- 打开 together.ai 并填入获得的 API 密钥
+- 为你的助手选择一个 Together AI 的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考 Together AI 的费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用 Together AI 提供的模型进行对话了。
diff --git a/docs/usage/providers/zhipu.mdx b/docs/usage/providers/zhipu.mdx
new file mode 100644
index 000000000000..fb49fbfa2424
--- /dev/null
+++ b/docs/usage/providers/zhipu.mdx
@@ -0,0 +1,67 @@
+---
+title: Using Zhipu ChatGLM in LobeChat
+description: >-
+ Learn how to integrate and utilize Zhipu AI models in LobeChat for enhanced
+ conversational experiences. Obtain the API key, configure settings, and start
+ engaging with cognitive intelligence.
+tags:
+ - Zhipu AI
+ - ChatGLM
+ - API Key
+ - Web UI
+---
+
+# Using Zhipu ChatGLM in LobeChat
+
+
+
+[Zhipu AI](https://www.zhipuai.cn/) is a high-tech company originating from the Department of Computer Science at Tsinghua University. Established in 2019, the company focuses on natural language processing, machine learning, and big data analysis, dedicated to expanding the boundaries of artificial intelligence technology in the field of cognitive intelligence.
+
+This document will guide you on how to use Zhipu AI in LobeChat:
+
+
+
+### Step 1: Obtain the API Key for Zhipu AI
+
+- Visit and log in to the [Zhipu AI Open Platform](https://open.bigmodel.cn/)
+- Upon initial login, the system will automatically create an API key for you and gift you a resource package of 25M Tokens
+- Navigate to the `API Key` section at the top to view your API key
+
+
+
+### Step 2: Configure Zhipu AI in LobeChat
+
+- Visit the `Settings` interface in LobeChat
+- Under `Language Model`, locate the settings for Zhipu AI
+
+
+
+- Open Zhipu AI and enter the obtained API key
+- Choose a Zhipu AI model for your assistant to start the conversation
+
+
+
+
+ During usage, you may need to pay the API service provider, please refer to Zhipu AI's pricing
+ policy.
+
+
+
+
+You can now engage in conversations using the models provided by Zhipu AI in LobeChat.
diff --git a/docs/usage/providers/zhipu.zh-CN.mdx b/docs/usage/providers/zhipu.zh-CN.mdx
new file mode 100644
index 000000000000..0d865f1bd4aa
--- /dev/null
+++ b/docs/usage/providers/zhipu.zh-CN.mdx
@@ -0,0 +1,61 @@
+---
+title: 在 LobeChat 中使用智谱 ChatGLM
+description: 学习如何在 LobeChat 中配置和使用智谱AI的API密钥,开始与智谱AI提供的模型进行对话。
+tags:
+ - 智谱AI
+ - ChatGLM
+ - API Key
+ - Web UI
+---
+
+# 在 LobeChat 中使用智谱 ChatGLM
+
+
+
+[智谱AI](https://www.zhipuai.cn/) 是一家源自清华大学计算机系技术成果的高科技公司,成立于2019年,专注于自然语言处理、机器学习和大数据分析,致力于在认知智能领域拓展人工智能技术的边界。
+
+本文档将指导你如何在 LobeChat 中使用智谱 AI:
+
+
+
+### 步骤一:获取智谱 AI 的 API 密钥
+
+- 访问并登录 [智谱AI开放平台](https://open.bigmodel.cn/)
+- 初次登录时系统会自动为你创建好 API 密钥并赠送 25M Tokens 的资源包
+- 进入顶部的 `API密钥` 可以查看你的 API
+
+
+
+### 步骤二:在 LobeChat 中配置智谱AI
+
+- 访问LobeChat的`设置`界面
+- 在`语言模型`下找到`智谱AI`的设置项
+
+
+
+- 打开智谱 AI 并填入获得的 API 密钥
+- 为你的助手选择一个智谱AI的模型即可开始对话
+
+
+
+
+ 在使用过程中你可能需要向 API 服务提供商付费,请参考智谱AI的费用政策。
+
+
+
+
+至此你已经可以在 LobeChat 中使用智谱AI提供的模型进行对话了。
diff --git a/docs/usage/start.mdx b/docs/usage/start.mdx
index f77c248e4b2d..856a6a312e9b 100644
--- a/docs/usage/start.mdx
+++ b/docs/usage/start.mdx
@@ -1,5 +1,5 @@
---
-title: Get Start with LobeChat
+title: Get started with LobeChat
description: >-
Explore the exciting features in LobeChat, including Vision Model, TTS & STT,
Local LLMs, and Multi AI Providers. Discover more about Agent Market, Plugin
@@ -23,12 +23,14 @@ tags:
borderless
height={426}
margin={12}
- src={'https://github.com/lobehub/lobe-chat/assets/28616219/8b04c3c9-3d71-4fb4-bd9b-a4f415c5876d'}
+ src={'https://github.com/lobehub/lobe-chat/assets/17870709/56b95d48-f573-41cd-8b38-387bf88bc4bf'}
width={832}
/>
+ 如果你之前没有了解过 Tools Calling, 可以查看 [Function Call: Chat
+ 应用的插件基石与交互技术的变革黎明](https://lobehub.com/zh/blog/openai-function-call) 这篇文章。
+
+
+随着社区中越来越多的大语言模型支持了 Tool Calling 能力,同时得益于 LobeChat 的 Agent Runtime 架构,我们几乎实现了所有主流大语言模型( OpenAI 、Claude 、Gemini 等等)的 Tool Calling 调用能力。
+
+LobeChat 的插件实现基于模型的 Tools Calling 能力,模型本身的 Tool Calling 能力决定插件调用是否正常。作为上层应用,我们针对各个模型的 Tool Calling 做了较为完善的测试,以便帮助我们的用户了解现有的模型能力,更好地进行抉择。
+
+## 评测任务介绍
+
+我们基于实际真实的用户场景出发构建了两大组测试任务,第一组为简单的调用指令(天气查询),第二组为复杂调用指令(文生图)。这两组指令的系统描述如下:
+
+
+
+
+```md
+## Tools
+
+You can use these tools below:
+
+### Realtime Weather
+
+Get realtime weather information
+
+The APIs you can use:
+
+#### `realtime-weather____fetchCurrentWeather`
+
+获取当前天气情况
+```
+
+
+
+
+
+```md
+## Tools
+
+You can use these tools below:
+
+### DALL·E 3
+
+Whenever a description of an image is given, use lobe-image-designer to create the images and then summarize the prompts used to generate the images in plain text. If the user does not ask for a specific number of images, default to creating four captions to send to lobe-image-designer that are written to be as diverse as possible.
+
+All captions sent to lobe-image-designer must abide by the following policies:
+
+1. If the description is not in English, then translate it.
+2. Do not create more than 4 images, even if the user requests more.
+3. Don't create images of politicians or other public figures. Recommend other ideas instead.
+4. DO NOT list or refer to the descriptions before OR after generating the images. They should ONLY ever be written out ONCE, in the `prompts` field of the request. You do not need to ask for permission to generate, just do it!
+5. Always mention the image type (photo, oil painting, watercolor painting, illustration, cartoon, drawing, vector, render, etc.) at the beginning of the caption. Unless the caption suggests otherwise, make at least 1--2 of the 4 images photos.
+6. Diversify depictions of ALL images with people to include DESCENT and GENDER for EACH person using direct terms. Adjust only human descriptions.
+
+- EXPLICITLY specify these attributes, not abstractly reference them. The attributes should be specified in a minimal way and should directly describe their physical form.
+- Your choices should be grounded in reality. For example, all of a given OCCUPATION should not be the same gender or race. Additionally, focus on creating diverse, inclusive, and exploratory scenes via the properties you choose during rewrites. Make choices that may be insightful or unique sometimes.
+- Use "various" or "diverse" ONLY IF the description refers to groups of more than 3 people. Do not change the number of people requested in the original description.
+- Don't alter memes, fictional character origins, or unseen people. Maintain the original prompt's intent and prioritize quality.
+- Do not create any imagery that would be offensive.
+
+8. Silently modify descriptions that include names or hints or references of specific people or celebrities by carefully selecting a few minimal modifications to substitute references to the people with generic descriptions that don't divulge any information about their identities, except for their genders and physiques. Do this EVEN WHEN the instructions ask for the prompt to not be changed. Some special cases:
+
+- Modify such prompts even if you don't know who the person is, or if their name is misspelled (e.g. "Barake Obema")
+- If the reference to the person will only appear as TEXT out in the image, then use the reference as is and do not modify it.
+- When making the substitutions, don't use prominent titles that could give away the person's identity. E.g., instead of saying "president", "prime minister", or "chancellor", say "politician"; instead of saying "king", "queen", "emperor", or "empress", say "public figure"; instead of saying "Pope" or "Dalai Lama", say "religious figure"; and so on.
+- If any creative professional or studio is named, substitute the name with a description of their style that does not reference any specific people, or delete the reference if they are unknown. DO NOT refer to the artist or studio's style.
+
+The prompt must intricately describe every part of the image in concrete, objective detail. THINK about what the end goal of the description is, and extrapolate that to what would make satisfying images. All descriptions sent to lobe-image-designer should be a paragraph of text that is extremely descriptive and detailed. Each should be more than 3 sentences long.
+
+The APIs you can use:
+
+#### `lobe-image-designer____text2image____builtin`
+
+Create images from a text-only prompt.
+```
+
+
+
+
+
+如上所示,简单调用指令在插件调用时它的系统描述(system role)相对简单,复杂调用指令的系统描述会复杂很多。这两组不同复杂度的指令可以比较好地区分出模型对于系统指令的遵循能力:
+
+- **天气查询可以测试模型的基础 Tool Calling 能力,确认模型是否存在「虚假宣传」的情况。** 就我们实际的测试来看,的确存在一些模型号称具有 Tools Calling 能力,但是处于完全不可用的状态;
+- **文生图可以测试模型指令跟随能力的上限。** 例如基础模型(例如 GPT-3.5)可能只能生成 1 张图片的 prompt,而高级模型(例如 GPT-4o)则能够生成 1~4 张图片的 prompt。
+
+### 简单调用指令:天气查询
+
+天气查询是 Tools Calling 中一个经典的例子。
+
+天气查询插件采用的是我们自己做的一个简单的插件,它的工具定义如下:
+
+```json
+{
+ "function": {
+ "description": "获取当前天气情况",
+ "name": "realtime-weather____fetchCurrentWeather",
+ "parameters": {
+ "properties": {
+ "city": {
+ "description": "城市名称",
+ "type": "string"
+ }
+ },
+ "required": ["city"],
+ "type": "object"
+ }
+ },
+ "type": "function"
+}
+```
+
+针对这一个工具,我们构建的测试组中包含了三个指令:
+
+| 指令编号 | 指令内容 | 基础 Tool Calling 调用 | 并发调用 | 复合指令跟随 |
+| --- | --- | --- | --- | --- |
+| 指令 ① | 告诉我杭州和北京的天气,先回答我好的 | 🟢 | 🟢 | 🟢 |
+| 指令 ② | 告诉我杭州和北京的天气 | 🟢 | 🟢 | - |
+| 指令 ③ | 告诉我杭州的天气 | 🟢 | - | - |
+
+上述三个指令的复杂度逐渐递减,我们可以通过这三个指令来测试模型对于简单指令的处理能力。
+
+- 指令 ① 测试的能力项包含 「基础 Tool Calling 调用」、「并发调用」、「复合指令跟随」三项。
+- 指令 ② 测试的能力项包含 「基础 Tool Calling 调用」、「并发调用」 两项。
+- 指令 ③ 测试的能力项仅包含「基础 Tool Calling 调用」。
+
+
+ 将指令 ① 、② 、③ 按照难度递减的方式排序的目的,是为了降低测试的成本。因为当模型能通过指令 ①
+ 的测试时,我们就不需要继续测试指令 ② 和指令 ③ ,必然能通过。
+
+
+测试能力项详细说明:
+
+
+
+
+ 根据我们实际的日常使用,工具调用往往会和普通文本生成结合在一起回答。例如比较经典的 Code Interpreter 插件,ChatGPT 往往会先回复一些代码生成的思路,然后再调用 Code Interpreter 插件生成代码。
+
+ 这种情况下,我们需要模型能够正确地识别出用户的意图,然后调用对应的工具。
+
+ 因此, 指令 ① 中的「告诉我杭州和北京的天气,先回答我好的」就是一个复合指令跟随的例子。前半句期望模型调用天气查询工具,后半句期望模型回答「好的」。并且理想的顺序应该是先回答「好的」,然后再调用天气查询工具。
+
+
+
+
+ 并发工具调用(Parallel function calling)是指模型能够同时调用多个工具,或同时调用一个工具多次,这在对话中可以大大降低用户等待的时间,提升用户体验。
+
+ 并发工具调用能力由 OpenAI 于 2023年11月率先提出,目前支持并发工具调用的模型并不算多,属于是 Tools Calling 的进阶能力。
+
+ 指令 ② 中的「告诉我杭州和北京的天气」就是一个期望执行并发调用的例子。理想的情况下,单个模型的返回应该存在两个工具的调用返回。
+
+
+
+
+ 基础工具调用不必再赘述,这是 Tools Calling 的基础能力。
+
+ 指令 ③ 中的「告诉我杭州的天气」就是最基本的工具调用的例子。
+
+
+
+
+### 复杂调用指令:文生图
+
+文生图的 Tool Calling 基本照搬了 ChatGPT Plus 的指令,它的复杂度相对较高,可以测试模型对于复杂指令的跟随能力。工具定义如下:
+
+```json
+{
+ "function": {
+ "description": "Create images from a text-only prompt.",
+ "name": "lobe-image-designer____text2image____builtin",
+ "parameters": {
+ "properties": {
+ "prompts": {
+ "description": "The user's original image description, potentially modified to abide by the lobe-image-designer policies. If the user does not suggest a number of captions to create, create four of them. If creating multiple captions, make them as diverse as possible. If the user requested modifications to previous images, the captions should not simply be longer, but rather it should be refactored to integrate the suggestions into each of the captions. Generate no more than 4 images, even if the user requests more.",
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 4,
+ "minItems": 1,
+ "type": "array"
+ },
+ "quality": {
+ "default": "standard",
+ "description": "The quality of the image that will be generated. hd creates images with finer details and greater consistency across the image.",
+ "enum": ["standard", "hd"],
+ "type": "string"
+ },
+ "seeds": {
+ "description": "A list of seeds to use for each prompt. If the user asks to modify a previous image, populate this field with the seed used to generate that image from the image lobe-image-designer metadata.",
+ "items": {
+ "type": "integer"
+ },
+ "type": "array"
+ },
+ "size": {
+ "default": "1024x1024",
+ "description": "The resolution of the requested image, which can be wide, square, or tall. Use 1024x1024 (square) as the default unless the prompt suggests a wide image, 1792x1024, or a full-body portrait, in which case 1024x1792 (tall) should be used instead. Always include this parameter in the request.",
+ "enum": ["1792x1024", "1024x1024", "1024x1792"],
+ "type": "string"
+ },
+ "style": {
+ "default": "vivid",
+ "description": "The style of the generated images. Must be one of vivid or natural. Vivid causes the model to lean towards generating hyper-real and dramatic images. Natural causes the model to produce more natural, less hyper-real looking images.",
+ "enum": ["vivid", "natural"],
+ "type": "string"
+ }
+ },
+ "required": ["prompts"],
+ "type": "object"
+ }
+ },
+ "type": "function"
+}
+```
+
+针对这一个工具,我们构建的测试组中包含了两个指令:
+
+| 指令编号 | 指令内容 | 流式调用 | 复杂 Tool Calling 调用 | 并发调用 | 复合指令跟随 |
+| --- | --- | --- | --- | --- | --- |
+| 指令 ① | 我要画 3 幅画,第一幅画的主体为一只达芬奇风格的小狗,第二幅是毕加索风格的大雁,最后一幅是莫奈风格的狮子。每一幅都需要产出 2 个 prompts。请先说明你的构思,然后开始生成相应的图片。 | 🟢 | 🟢 | 🟢 | 🟢 |
+| 指令 ② | 画一只小狗 | 🟢 | 🟢 | - | - |
+
+此外,由于文生图的 prompts 的生成时间较长,这一组指令也可以清晰地测试出模型的 API 是否支持流式 Tool Calling。
+
+## 评测结果
+
+TODO
diff --git a/docs/usage/tools-calling/anthropic.mdx b/docs/usage/tools-calling/anthropic.mdx
new file mode 100644
index 000000000000..1333ed77b7e1
--- /dev/null
+++ b/docs/usage/tools-calling/anthropic.mdx
@@ -0,0 +1 @@
+TODO
diff --git a/docs/usage/tools-calling/anthropic.zh-CN.mdx b/docs/usage/tools-calling/anthropic.zh-CN.mdx
new file mode 100644
index 000000000000..f65926de764f
--- /dev/null
+++ b/docs/usage/tools-calling/anthropic.zh-CN.mdx
@@ -0,0 +1,23 @@
+---
+title: Anthropic Claude 系列 Tool Calling
+---
+
+# Anthropic Claude 系列 Tool Calling
+
+## Claude 3.5 Sonnet
+
+### 简单调用指令:天气查询
+
+TODO
+
+## Claude 3 Opus
+
+TODO
+
+## Claude 3 Sonnet
+
+TODO
+
+## Claude 3 Haiku
+
+TODO
diff --git a/docs/usage/tools-calling/google.mdx b/docs/usage/tools-calling/google.mdx
new file mode 100644
index 000000000000..1333ed77b7e1
--- /dev/null
+++ b/docs/usage/tools-calling/google.mdx
@@ -0,0 +1 @@
+TODO
diff --git a/docs/usage/tools-calling/google.zh-CN.mdx b/docs/usage/tools-calling/google.zh-CN.mdx
new file mode 100644
index 000000000000..cf7078362757
--- /dev/null
+++ b/docs/usage/tools-calling/google.zh-CN.mdx
@@ -0,0 +1,13 @@
+---
+title: Google Gemini 系列 Tool Calling
+---
+
+# Google Gemini 系列 Tool Calling
+
+## Gemini 1.5 Pro
+
+TODO
+
+## Gemini 1.5 Flash
+
+TODO
diff --git a/docs/usage/tools-calling/groq.mdx b/docs/usage/tools-calling/groq.mdx
new file mode 100644
index 000000000000..1333ed77b7e1
--- /dev/null
+++ b/docs/usage/tools-calling/groq.mdx
@@ -0,0 +1 @@
+TODO
diff --git a/docs/usage/tools-calling/groq.zh-CN.mdx b/docs/usage/tools-calling/groq.zh-CN.mdx
new file mode 100644
index 000000000000..061b5ae4dfe8
--- /dev/null
+++ b/docs/usage/tools-calling/groq.zh-CN.mdx
@@ -0,0 +1,15 @@
+---
+title: Groq Tool Calling
+---
+
+# Groq Tool Calling
+
+## LLAMA3-70B
+
+TODO
+
+## LLAMA3-8B
+
+TODO
+
+## Mixtral-8x7B
diff --git a/docs/usage/tools-calling/openai.mdx b/docs/usage/tools-calling/openai.mdx
new file mode 100644
index 000000000000..1333ed77b7e1
--- /dev/null
+++ b/docs/usage/tools-calling/openai.mdx
@@ -0,0 +1 @@
+TODO
diff --git a/docs/usage/tools-calling/openai.zh-CN.mdx b/docs/usage/tools-calling/openai.zh-CN.mdx
new file mode 100644
index 000000000000..644cc3ac0979
--- /dev/null
+++ b/docs/usage/tools-calling/openai.zh-CN.mdx
@@ -0,0 +1,831 @@
+---
+title: OpenAI GPT 系列 Tools Calling
+description: 使用 LobeChat 测试 OpenAI GPT 系列模型(GPT 3.5-turbo / GPT-4 /GPT-4o) 的工具调用能力,并展现评测结果
+tags:
+ - Tools Calling
+ - Benchmark
+ - Function Calling
+ - 工具调用
+ - 插件
+---
+
+# OpenAI GPT 系列工具调用(Tools Calling)
+
+OpenAI GPT 系列模型 Tool Calling 能力一览:
+
+| 模型 | 支持 Tool Calling | 流式 (Stream) | 并发(Parallel) | 简单指令得分 | 复杂指令 |
+| ------------- | ----------------- | --------------- | ---------------- | ------------ | -------- |
+| GPT-3.5-turbo | ✅ | ✅ | ✅ | 🌟🌟🌟 | 🌟 |
+| GPT-4-turbo | ✅ | ✅ | ✅ | 🌟🌟 | 🌟🌟 |
+| GPT-4o | ✅ | ✅ | ✅ | 🌟🌟🌟 | 🌟🌟 |
+
+
+ 关于测试指令,详见 [工具调用 Tools Calling -
+ 评测任务介绍](/zh/docs/usage/tools-calling#评测任务介绍)
+
+
+## GPT 3.5-turbo
+
+### 简单调用指令:天气查询
+
+测试指令:指令 ①
+
+
+
+
+
+
+流式 Tool Calling 原始输出:
+
+```yml
+[stream start] 2024-21-5 14:22:53.476
+[chunk 0] 2024-21-5 14:22:53.481
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
+
+[chunk 1] 2024-21-5 14:22:47.886
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"好"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 2] 2024-21-5 14:22:47.888
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"的"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 3] 2024-21-5 14:22:47.889
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":",请"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 4] 2024-21-5 14:22:47.918
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"稍"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 5] 2024-21-5 14:22:47.919
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"等"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 6] 2024-21-5 14:22:47.919
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}]}
+
+[chunk 7] 2024-21-5 14:22:47.962
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"我"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 8] 2024-21-5 14:22:47.963
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"马"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 9] 2024-21-5 14:22:47.963
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"上"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 10] 2024-21-5 14:22:48.189
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"为"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 11] 2024-21-5 14:22:48.191
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"您"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 12] 2024-21-5 14:22:48.191
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"查"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 13] 2024-21-5 14:22:48.194
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"找"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 14] 2024-21-5 14:22:48.196
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"北京"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 15] 2024-21-5 14:22:48.197
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"和"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 16] 2024-21-5 14:22:48.198
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"杭"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 17] 2024-21-5 14:22:48.199
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"州"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 18] 2024-21-5 14:22:48.200
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"的"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 19] 2024-21-5 14:22:49.30
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"天"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 20] 2024-21-5 14:22:49.31
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"气"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 21] 2024-21-5 14:22:49.32
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"信息"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 22] 2024-21-5 14:22:49.37
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"。"},"logprobs":null,"finish_reason":null}]}
+
+[chunk 23] 2024-21-5 14:22:49.39
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_5c8hmWNo6z9hgWgPnrIYAEjL","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 24] 2024-21-5 14:22:49.41
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 25] 2024-21-5 14:22:49.43
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 26] 2024-21-5 14:22:49.44
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"北京\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 27] 2024-21-5 14:22:49.46
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_BtCx1tdT0TW9Pp2Cco6lynZo","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 28] 2024-21-5 14:22:49.47
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 29] 2024-21-5 14:22:49.47
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 30] 2024-21-5 14:22:49.48
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"杭州\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 31] 2024-21-5 14:22:49.49
+{"id":"chatcmpl-9cRxXqXcytS0xohr9sczNjeWP4JHF","object":"chat.completion.chunk","created":1718950967,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}
+
+[stream finished] total chunks: 32
+```
+
+
+
+### 复杂调用指令:文生图
+
+测试指令:指令 ②
+
+
+
+
+
+
+流式 Tool Calling 原始输出:
+
+```yml
+[stream start] 2024-21-5 15:17:51.3
+[chunk 0] 2024-21-5 15:17:51.18
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_8Jyy5K4x3Zl7KDKxZRigeWlg","type":"function","function":{"name":"lobe-image-designer____text2image____builtin","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 1] 2024-21-5 15:17:51.21
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 2] 2024-21-5 15:17:51.34
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"prom"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 3] 2024-21-5 15:17:51.54
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"pts"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 4] 2024-21-5 15:17:51.56
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":[\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 5] 2024-21-5 15:17:51.60
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"A"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 6] 2024-21-5 15:17:51.63
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" photo"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 7] 2024-21-5 15:17:51.95
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" of"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 8] 2024-21-5 15:17:51.96
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 9] 2024-21-5 15:17:51.117
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" small"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 10] 2024-21-5 15:17:51.118
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 11] 2024-21-5 15:17:51.118
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" fluffy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 12] 2024-21-5 15:17:51.161
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" brown"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 13] 2024-21-5 15:17:51.161
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" and"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 14] 2024-21-5 15:17:51.162
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" white"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 15] 2024-21-5 15:17:51.194
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" puppy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 16] 2024-21-5 15:17:51.196
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 17] 2024-21-5 15:17:51.197
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" big"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 18] 2024-21-5 15:17:51.205
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 19] 2024-21-5 15:17:51.208
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" curious"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 20] 2024-21-5 15:17:51.219
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" eyes"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 21] 2024-21-5 15:17:51.219
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" standing"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 22] 2024-21-5 15:17:51.233
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" on"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 23] 2024-21-5 15:17:51.234
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 24] 2024-21-5 15:17:51.261
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" grass"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 25] 2024-21-5 15:17:51.261
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"y"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 26] 2024-21-5 15:17:51.300
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" field"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 27] 2024-21-5 15:17:51.301
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" under"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 28] 2024-21-5 15:17:51.334
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" the"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 29] 2024-21-5 15:17:51.334
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" sunlight"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 30] 2024-21-5 15:17:51.353
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":".\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 31] 2024-21-5 15:17:51.354
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"],\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 32] 2024-21-5 15:17:51.522
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"quality"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 33] 2024-21-5 15:17:51.523
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 34] 2024-21-5 15:17:51.524
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"hd"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 35] 2024-21-5 15:17:51.525
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\",\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 36] 2024-21-5 15:17:51.526
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"size"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 37] 2024-21-5 15:17:51.533
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 38] 2024-21-5 15:17:51.534
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"102"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 39] 2024-21-5 15:17:51.535
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"4"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 40] 2024-21-5 15:17:51.536
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"x"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 41] 2024-21-5 15:17:51.536
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"102"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 42] 2024-21-5 15:17:51.537
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"4"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 43] 2024-21-5 15:17:51.537
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\",\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 44] 2024-21-5 15:17:51.557
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"style"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 45] 2024-21-5 15:17:51.558
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 46] 2024-21-5 15:17:51.560
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"natural"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 47] 2024-21-5 15:17:51.560
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 48] 2024-21-5 15:17:51.561
+{"id":"chatcmpl-9cSoovX209wVb9nZr3VmPE6AgV2NS","object":"chat.completion.chunk","created":1718954270,"model":"gpt-3.5-turbo-0125","system_fingerprint":null,"choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}
+
+[stream finished] total chunks: 49
+```
+
+
+
+## GPT-4 Turbo
+
+### 简单调用指令:天气查询
+
+测试指令:指令 ①
+
+GPT-4 Turbo 在调用 Tool Calling 时并没有像 GPT-3.5 Turbo 一样回复「好的」,且经过多次测试始终一样,因此在这一条复合指令的跟随中反而不如 GPT-3.5 Turbo,但剩余两项能力均不错。
+
+当然,也有可能是因为 GPT-4 Turbo 的模型更加有“自主意识”,认为不需要输出这一句“好的”。
+
+
+
+
+
+
+流式 Tool Calling 原始输出:
+
+```yml
+
+[stream start] 2024-6-22 17:33:28.818
+
+[chunk 0] 2024-6-22 17:33:28.823
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}]}
+
+[chunk 1] 2024-6-22 17:33:28.823
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_hKvHwh1w2NEjnpTyJdQYNd2c","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 2] 2024-6-22 17:33:28.823
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 3] 2024-6-22 17:33:28.823
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 4] 2024-6-22 17:33:28.824
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"杭州\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 5] 2024-6-22 17:33:28.824
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_eq0GZi5bPMhjcahClrmObeUM","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 6] 2024-6-22 17:33:28.825
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 7] 2024-6-22 17:33:28.825
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 8] 2024-6-22 17:33:28.826
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"北京\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 9] 2024-6-22 17:33:28.826
+{"id":"chatcmpl-9crPbkOImn4LxnDRSBsrTyOTr1saK","object":"chat.completion.chunk","created":1719048807,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}
+
+[stream finished] total chunks: 10
+```
+
+
+
+### 复杂调用指令:文生图
+
+测试指令:指令 ②
+
+
+
+
+
+
+流式 Tool Calling 原始输出:
+
+```yml
+[stream start] 2024-6-22 18:24:55.268
+[chunk 0] 2024-6-22 18:24:55.272
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_lx9T9mToywwWjK8Hkag0ZyRh","type":"function","function":{"name":"lobe-image-designer____text2image____builtin","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 1] 2024-6-22 18:24:55.311
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 2] 2024-6-22 18:24:55.312
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"prom"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 3] 2024-6-22 18:24:55.381
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"pts"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 4] 2024-6-22 18:24:55.382
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":[\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 5] 2024-6-22 18:24:55.440
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Photo"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 6] 2024-6-22 18:24:55.443
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" of"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 7] 2024-6-22 18:24:55.565
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 8] 2024-6-22 18:24:55.567
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" small"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 9] 2024-6-22 18:24:55.653
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" fluffy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 10] 2024-6-22 18:24:55.656
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" dog"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 11] 2024-6-22 18:24:55.662
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 12] 2024-6-22 18:24:55.663
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" big"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 13] 2024-6-22 18:24:55.698
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" brown"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 14] 2024-6-22 18:24:55.700
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" eyes"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 15] 2024-6-22 18:24:55.790
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 16] 2024-6-22 18:24:55.790
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" sitting"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 17] 2024-6-22 18:24:55.865
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" on"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 18] 2024-6-22 18:24:55.867
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 19] 2024-6-22 18:24:55.905
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" grass"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 20] 2024-6-22 18:24:55.907
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"y"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 21] 2024-6-22 18:24:56.91
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" field"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 22] 2024-6-22 18:24:56.97
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" under"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 23] 2024-6-22 18:24:56.170
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" clear"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 24] 2024-6-22 18:24:56.173
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" blue"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 25] 2024-6-22 18:24:56.173
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" skies"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 26] 2024-6-22 18:24:56.174
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":".\",\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 27] 2024-6-22 18:24:56.174
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Illustr"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 28] 2024-6-22 18:24:56.175
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ation"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 29] 2024-6-22 18:24:56.211
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" of"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 30] 2024-6-22 18:24:56.212
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 31] 2024-6-22 18:24:56.315
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" tiny"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 32] 2024-6-22 18:24:56.320
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" puppy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 33] 2024-6-22 18:24:56.367
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 34] 2024-6-22 18:24:56.369
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 35] 2024-6-22 18:24:56.429
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" smooth"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 36] 2024-6-22 18:24:56.430
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" coat"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 37] 2024-6-22 18:24:56.553
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" and"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 38] 2024-6-22 18:24:56.555
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" per"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 39] 2024-6-22 18:24:56.602
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ky"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 40] 2024-6-22 18:24:56.604
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" ears"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 41] 2024-6-22 18:24:56.610
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" playing"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 42] 2024-6-22 18:24:56.697
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 43] 2024-6-22 18:24:56.699
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 44] 2024-6-22 18:24:56.740
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" colorful"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 45] 2024-6-22 18:24:56.748
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" ball"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 46] 2024-6-22 18:24:56.816
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" in"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 47] 2024-6-22 18:24:56.817
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 48] 2024-6-22 18:24:56.880
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" sunny"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 49] 2024-6-22 18:24:56.882
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" park"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 50] 2024-6-22 18:24:56.951
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":".\",\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 51] 2024-6-22 18:24:56.954
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Oil"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 52] 2024-6-22 18:24:57.7
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" painting"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 53] 2024-6-22 18:24:57.9
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" of"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 54] 2024-6-22 18:24:57.76
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" an"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 55] 2024-6-22 18:24:57.78
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" elegant"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 56] 2024-6-22 18:24:57.131
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" small"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 57] 2024-6-22 18:24:57.132
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" dog"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 58] 2024-6-22 18:24:57.223
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 59] 2024-6-22 18:24:57.225
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" long"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 60] 2024-6-22 18:24:57.255
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" silky"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 61] 2024-6-22 18:24:57.255
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" fur"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 62] 2024-6-22 18:24:57.348
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" and"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 63] 2024-6-22 18:24:57.350
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" expressive"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 64] 2024-6-22 18:24:57.395
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" eyes"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 65] 2024-6-22 18:24:57.395
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 66] 2024-6-22 18:24:57.475
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" resting"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 67] 2024-6-22 18:24:57.477
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" by"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 68] 2024-6-22 18:24:57.517
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 69] 2024-6-22 18:24:57.519
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" cozy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 70] 2024-6-22 18:24:57.639
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" fireplace"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 71] 2024-6-22 18:24:57.640
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" in"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 72] 2024-6-22 18:24:57.662
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 73] 2024-6-22 18:24:57.662
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" vintage"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 74] 2024-6-22 18:24:57.743
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" room"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 75] 2024-6-22 18:24:57.744
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":".\",\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 76] 2024-6-22 18:24:57.798
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Cart"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 77] 2024-6-22 18:24:57.799
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"oon"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 78] 2024-6-22 18:24:57.858
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" of"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 79] 2024-6-22 18:24:57.860
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 80] 2024-6-22 18:24:57.921
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" playful"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 81] 2024-6-22 18:24:57.922
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" small"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 82] 2024-6-22 18:24:57.987
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" dog"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 83] 2024-6-22 18:24:57.989
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 84] 2024-6-22 18:24:58.56
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" exaggerated"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 85] 2024-6-22 18:24:58.58
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" features"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 86] 2024-6-22 18:24:58.136
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 87] 2024-6-22 18:24:58.138
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" jumping"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 88] 2024-6-22 18:24:58.195
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" joy"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 89] 2024-6-22 18:24:58.196
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ously"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 90] 2024-6-22 18:24:58.269
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" in"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 91] 2024-6-22 18:24:58.271
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" a"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 92] 2024-6-22 18:24:58.392
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" backyard"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 93] 2024-6-22 18:24:58.394
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" filled"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 94] 2024-6-22 18:24:58.461
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" with"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 95] 2024-6-22 18:24:58.463
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" flowers"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 96] 2024-6-22 18:24:58.463
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" and"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 97] 2024-6-22 18:24:58.464
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" butterflies"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 98] 2024-6-22 18:24:58.548
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":".\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 99] 2024-6-22 18:24:58.550
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"],\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 100] 2024-6-22 18:24:58.591
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"quality"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 101] 2024-6-22 18:24:58.594
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 102] 2024-6-22 18:24:58.601
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"hd"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 103] 2024-6-22 18:24:58.603
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 104] 2024-6-22 18:24:58.603
+{"id":"chatcmpl-9csDOkW83jCbQaLcIEYvvQJmfW0qz","object":"chat.completion.chunk","created":1719051894,"model":"gpt-4-turbo-2024-04-09","system_fingerprint":"fp_9d7f5c6195","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}
+
+[stream finished] total chunks: 105
+```
+
+
+
+## GPT 4o
+
+### 简单调用指令:天气查询
+
+测试指令:指令 ①
+
+GPT-4o 和 3.5 一样,在简单调用指令中,能够达到非常不错的复合指令遵循能力。
+
+
+
+
+
+
+ 流式 Tool Calling 原始输出:
+
+```yaml
+[stream start] 2024-6-22 17:55:15.541
+
+[chunk 0] 2024-6-22 17:55:15.545
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
+
+[chunk 1] 2024-6-22 17:55:15.550
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"好的"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 2] 2024-6-22 17:55:15.551
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":",请"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 3] 2024-6-22 17:55:15.572
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"稍"},"logprobs":null,finish_reason":null}]}
+
+[chunk 4] 2024-6-22 17:55:15.573
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"等"},"logprobs":null,finish_reason":null}]}
+
+[chunk 5] 2024-6-22 17:55:15.592
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":",我"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 6] 2024-6-22 17:55:15.593
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"将"},"logprobs":null,finish_reason":null}]}
+
+[chunk 7] 2024-6-22 17:55:15.606
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"为"},"logprobs":null,finish_reason":null}]}
+
+[chunk 8] 2024-6-22 17:55:15.606
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"您"},"logprobs":null,finish_reason":null}]}
+
+[chunk 9] 2024-6-22 17:55:15.625
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"查询"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 10] 2024-6-22 17:55:15.626
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"杭州"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 11] 2024-6-22 17:55:15.644
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"和"},"logprobs":null,finish_reason":null}]}
+
+[chunk 12] 2024-6-22 17:55:15.645
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"北京"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 13] 2024-6-22 17:55:16.180
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"的"},"logprobs":null,finish_reason":null}]}
+
+[chunk 14] 2024-6-22 17:55:16.180
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"天气"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 15] 2024-6-22 17:55:16.180
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"情况"},"logprobs":nul"finish_reason":null}]}
+
+[chunk 16] 2024-6-22 17:55:16.180
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"content":"。"},"logprobs":null,finish_reason":null}]}
+
+[chunk 17] 2024-6-22 17:55:16.181
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_xvk2SqA8Pll2Jq7ndqlmQ35U","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 18] 2024-6-22 17:55:16.181
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 19] 2024-6-22 17:55:16.181
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 20] 2024-6-22 17:55:16.182
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"杭州\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 21] 2024-6-22 17:55:16.182
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_V6fv1cdQ4udwpQR8mRmKbA3M","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":""}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 22] 2024-6-22 17:55:16.182
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"ci"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 23] 2024-6-22 17:55:16.182
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"ty\": "}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 24] 2024-6-22 17:55:16.183
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"北京\"}"}}]},"logprobs":null,"finish_reason":null}]}
+
+[chunk 25] 2024-6-22 17:55:16.183
+{"id":"chatcmpl-9crkh8Js4rzPsOr2CUiXXkJzntcUs","object":"chat.completion.chunk","created":1719050115,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_3e7d703517","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}
+
+[stream finished] total chunks: 26
+```
+
+
+
+### 复杂调用指令:文生图
+
+测试指令:指令 ②
+
+
+
+
+
+
+ 流式 Tool Calling 原始输出:
+
+```yml
+
+```
+
+
diff --git a/drizzle.config.ts b/drizzle.config.ts
new file mode 100644
index 000000000000..aa9f64f084b5
--- /dev/null
+++ b/drizzle.config.ts
@@ -0,0 +1,29 @@
+import * as dotenv from 'dotenv';
+import type { Config } from 'drizzle-kit';
+
+// Read the .env file if it exists, or a file specified by the
+
+// dotenv_config_path parameter that's passed to Node.js
+
+dotenv.config();
+
+let connectionString = process.env.DATABASE_URL;
+
+if (process.env.NODE_ENV === 'test') {
+ console.log('current ENV:', process.env.NODE_ENV);
+ connectionString = process.env.DATABASE_TEST_URL;
+}
+
+if (!connectionString)
+ throw new Error('`DATABASE_URL` or `DATABASE_TEST_URL` not found in environment');
+
+export default {
+ dbCredentials: {
+ url: connectionString,
+ },
+ dialect: 'postgresql',
+ out: './src/database/server/migrations',
+
+ schema: './src/database/server/schemas/lobechat.ts',
+ strict: true,
+} satisfies Config;
diff --git a/locales/ar/auth.json b/locales/ar/auth.json
index 545c222a15f8..1ec19662fe1a 100644
--- a/locales/ar/auth.json
+++ b/locales/ar/auth.json
@@ -1,6 +1,8 @@
{
"login": "تسجيل الدخول",
"loginOrSignup": "تسجيل الدخول / التسجيل",
+ "profile": "الملف الشخصي",
+ "security": "الأمان",
"signout": "تسجيل الخروج",
"signup": "التسجيل"
}
diff --git a/locales/ar/chat.json b/locales/ar/chat.json
index 30dd7e61d26c..ea813e6776df 100644
--- a/locales/ar/chat.json
+++ b/locales/ar/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "مرحبًا، أنا **{{name}}**، يمكنك البدء في الدردشة معي على الفور، أو يمكنك الانتقال إلى [إعدادات المساعد](/chat/settings#session={{id}}) لتحسين معلوماتي.",
"agentDefaultMessageWithSystemRole": "مرحبًا، أنا **{{name}}**، {{systemRole}}، دعنا نبدأ الدردشة!",
+ "agentsAndConversations": "الوكلاء والمحادثات",
"backToBottom": "العودة إلى الأسفل",
"clearCurrentMessages": "مسح رسائل الجلسة الحالية",
"confirmClearCurrentMessages": "سيتم مسح رسائل الجلسة الحالية قريبًا، وبمجرد المسح لن يمكن استعادتها، يرجى تأكيد الإجراء الخاص بك",
@@ -39,7 +40,6 @@
"regenerate": "إعادة الإنشاء"
},
"newAgent": "مساعد جديد",
- "noDescription": "لا توجد وصف",
"pin": "تثبيت",
"pinOff": "إلغاء التثبيت",
"regenerate": "إعادة الإنشاء",
@@ -83,6 +83,7 @@
"chats": "رسائل المحادثة",
"rest": "المتبقي",
"systemRole": "تعيين الدور",
+ "title": "تفاصيل الرمز",
"tools": "تعيين الإضافات",
"total": "الإجمالي",
"used": "المستخدم"
diff --git a/locales/ar/common.json b/locales/ar/common.json
index 84cc49ef7c77..283e5e0b06db 100644
--- a/locales/ar/common.json
+++ b/locales/ar/common.json
@@ -1,7 +1,7 @@
{
"about": "حول",
"advanceSettings": "إعدادات متقدمة",
- "appInitializing": "جاري تهيئة LobeChat، يرجى الانتظار ...",
+ "appInitializing": "جاري تشغيل التطبيق، يرجى الانتظار...",
"autoGenerate": "توليد تلقائي",
"autoGenerateTooltip": "إكمال تلقائي بناءً على الكلمات المقترحة لوصف المساعد",
"autoGenerateTooltipDisabled": "الرجاء إدخال كلمة تلميح قبل تفعيل وظيفة الإكمال التلقائي",
@@ -9,6 +9,7 @@
"cancel": "إلغاء",
"changelog": "سجل التغييرات",
"close": "إغلاق",
+ "contact": "اتصل بنا",
"copy": "نسخ",
"copyFail": "فشل في النسخ",
"copySuccess": "تم النسخ بنجاح",
@@ -35,10 +36,33 @@
},
"feedback": "تقديم ملاحظات",
"follow": "تابعنا على {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "مشاركة ملاحظاتك الثمينة",
+ "star": "قم بإضافة نجمة على GitHub"
+ },
+ "and": "و",
+ "feedback": {
+ "action": "مشاركة الملاحظات",
+ "desc": "كل فكرة ومقترح لديك ثمين بالنسبة لنا، نحن نتطلع بشوق لمعرفة آرائك! نرحب بالتواصل معنا لتقديم ملاحظاتك حول ميزات المنتج وتجربة الاستخدام، لمساعدتنا في تحسين LobeChat بشكل أفضل.",
+ "title": "مشاركة ملاحظاتك الثمينة على GitHub"
+ },
+ "later": "لاحقًا",
+ "star": {
+ "action": "قم بإضاءة النجمة",
+ "desc": "إذا كنت تحب منتجنا وترغب في دعمنا، هل يمكنك إضافة نجمة لنا على GitHub؟ هذا الإجراء الصغير له أهمية كبيرة بالنسبة لنا، حيث يمكن أن يلهمنا لتقديم تجربة ميزات مستمرة لك.",
+ "title": "قم بإضاءة النجمة لنا على GitHub"
+ },
+ "title": "هل تحب منتجنا؟"
+ },
"fullscreen": "وضع كامل الشاشة",
"historyRange": "نطاق التاريخ",
"import": "استيراد الإعدادات",
"importModal": {
+ "error": {
+ "desc": "عذرًا، حدث استثناء أثناء عملية استيراد البيانات. يرجى المحاولة مرة أخرى، أو <1>تقديم مشكلتك1>، وسنقوم بمساعدتك على الفور في تحديد المشكلة.",
+ "title": "فشل استيراد البيانات"
+ },
"finish": {
"onlySettings": "تم استيراد إعدادات النظام بنجاح",
"start": "ابدأ الاستخدام",
@@ -46,6 +70,7 @@
"title": "اكتمال عملية الاستيراد"
},
"loading": "جاري استيراد البيانات، يرجى الانتظار...",
+ "preparing": "جاري تجهيز وحدة استيراد البيانات...",
"result": {
"added": "تمت الإضافة بنجاح",
"errors": "حدثت أخطاء أثناء الاستيراد",
@@ -56,8 +81,15 @@
"topics": "المواضيع",
"type": "نوع البيانات"
},
- "title": "استيراد البيانات"
+ "title": "استيراد البيانات",
+ "uploading": {
+ "desc": "الملف الحالي كبير نسبيًا، يتم رفعه بجد...",
+ "restTime": "الوقت المتبقي",
+ "speed": "سرعة الرفع"
+ }
},
+ "information": "المجتمع والمعلومات",
+ "installPWA": "تثبيت تطبيق المتصفح",
"lang": {
"ar": "العربية",
"bg-BG": "البلغارية",
@@ -96,7 +128,11 @@
"zh-TW": "الصينية التقليدية"
},
"layoutInitializing": "جاري تحميل التخطيط...",
- "noDescription": "لا توجد وصف",
+ "legal": "بيان قانوني",
+ "mail": {
+ "business": "شراكات تجارية",
+ "support": "الدعم عبر البريد الإلكتروني"
+ },
"oauth": "تسجيل الدخول SSO",
"officialSite": "الموقع الرسمي",
"ok": "موافق",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "مستخدم مجهول",
"billing": "إدارة الفواتير",
+ "data": "تخزين البيانات",
"defaultNickname": "مستخدم النسخة المجتمعية",
"discord": "الدعم المجتمعي",
"docs": "وثائق الاستخدام",
@@ -181,5 +218,6 @@
"profile": "إدارة الحساب",
"setting": "إعدادات التطبيق",
"usages": "إحصاءات الاستخدام"
- }
+ },
+ "version": "الإصدار"
}
diff --git a/locales/ar/components.json b/locales/ar/components.json
index 2460ce666cd7..d487f86aac98 100644
--- a/locales/ar/components.json
+++ b/locales/ar/components.json
@@ -6,7 +6,8 @@
"functionCall": "يدعم هذا النموذج استدعاء الوظائف",
"tokens": "يدعم هذا النموذج حتى {{tokens}} رمزًا في جلسة واحدة",
"vision": "يدعم هذا النموذج التعرف البصري"
- }
+ },
+ "removed": "هذا النموذج لم يعد متوفر في القائمة، سيتم إزالته تلقائيًا إذا تم إلغاء تحديده"
},
"ModelSwitchPanel": {
"emptyModel": "لا توجد نماذج ممكن تمكينها، يرجى الانتقال إلى الإعدادات لتمكينها",
diff --git a/locales/ar/error.json b/locales/ar/error.json
index d6b02f38459d..1d198aa64f3a 100644
--- a/locales/ar/error.json
+++ b/locales/ar/error.json
@@ -12,6 +12,8 @@
"retry": "إعادة التحميل",
"title": "واجهت الصفحة مشكلة ما.."
},
+ "fetchError": "فشل الطلب",
+ "fetchErrorDetail": "تفاصيل الخطأ",
"notFound": {
"backHome": "العودة إلى الصفحة الرئيسية",
"desc": "لم نتمكن من العثور على الصفحة التي تبحث عنها، يرجى التحقق مما إذا كان الرابط صحيحًا",
@@ -52,37 +54,16 @@
"503": "عذرًا، الخادم غير قادر حاليًا على معالجة طلبك، قد يكون بسبب الحمل الزائد أو الصيانة الجارية، يرجى المحاولة مرة أخرى لاحقًا",
"504": "عذرًا، الخادم لم ينتظر ردًا من الخادم الأصلي، يرجى المحاولة مرة أخرى لاحقًا",
"AgentRuntimeError": "حدث خطأ في تشغيل نموذج Lobe اللغوي، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "AnthropicBizError": "خطأ في طلب خدمة Anthropic AI، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "AzureBizError": "حدث خطأ في طلب خدمة Azure AI، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "BedrockBizError": "حدث خطأ في طلب خدمة Bedrock، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "GoogleBizError": "حدث خطأ في طلب خدمة Google، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "GroqBizError": "حدث خطأ في خدمة Groq ، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
"InvalidAccessCode": "كلمة المرور غير صحيحة أو فارغة، يرجى إدخال كلمة مرور الوصول الصحيحة أو إضافة مفتاح API مخصص",
- "InvalidAnthropicAPIKey": "مفتاح Anthropic API غير صحيح أو فارغ، يرجى التحقق من مفتاح Anthropic API وإعادة المحاولة",
- "InvalidAzureAPIKey": "مفتاح Azure API غير صحيح أو فارغ، يرجى التحقق من مفتاح Azure API وإعادة المحاولة",
"InvalidBedrockCredentials": "فشلت مصادقة Bedrock، يرجى التحقق من AccessKeyId/SecretAccessKey وإعادة المحاولة",
"InvalidClerkUser": "عذرًا، لم تقم بتسجيل الدخول بعد، يرجى تسجيل الدخول أو التسجيل للمتابعة",
- "InvalidGoogleAPIKey": "مفتاح Google API غير صحيح أو فارغ، يرجى التحقق من مفتاح Google API وإعادة المحاولة",
- "InvalidGroqAPIKey": "مفتاح Groq API غير صحيح أو فارغ، يرجى التحقق من مفتاح Groq API وإعادة المحاولة",
- "InvalidMinimaxAPIKey": "مفتاح Minimax API غير صحيح أو فارغ، يرجى التحقق من مفتاح Minimax API وإعادة المحاولة",
- "InvalidMistralAPIKey": "مفتاح Mistral AI API غير صحيح أو فارغ، يرجى التحقق من مفتاح Mistral API وإعادة المحاولة",
- "InvalidMoonshotAPIKey": "مفتاح API لـ Moonshot AI غير صحيح أو فارغ، يرجى التحقق من مفتاح API لـ Moonshot وإعادة المحاولة",
"InvalidOllamaArgs": "تكوين Ollama غير صحيح، يرجى التحقق من تكوين Ollama وإعادة المحاولة",
- "InvalidOpenRouterAPIKey": "مفتاح OpenRouter API غير صحيح أو فارغ، يرجى التحقق من مفتاح OpenRouter API وإعادة المحاولة",
- "InvalidPerplexityAPIKey": "مفتاح Perplexity API غير صحيح أو فارغ، يرجى التحقق من مفتاح Perplexity API وإعادة المحاولة",
- "InvalidTogetherAIAPIKey": "مفتاح TogetherAI API غير صحيح أو فارغ، يرجى التحقق من مفتاح TogetherAI API وإعادة المحاولة",
- "InvalidZeroOneAPIKey": "مفتاح ZeroOne API غير صحيح أو فارغ، يرجى التحقق من مفتاح ZeroOne API وإعادة المحاولة",
- "InvalidZhipuAPIKey": "مفتاح Zhipu API غير صحيح أو فارغ، يرجى التحقق من مفتاح Zhipu API وإعادة المحاولة",
+ "InvalidProviderAPIKey": "{{provider}} مفتاح API غير صحيح أو فارغ، يرجى التحقق من مفتاح API {{provider}} الخاص بك وحاول مرة أخرى",
"LocationNotSupportError": "عذرًا، لا يدعم موقعك الحالي خدمة هذا النموذج، قد يكون ذلك بسبب قيود المنطقة أو عدم توفر الخدمة. يرجى التحقق مما إذا كان الموقع الحالي يدعم استخدام هذه الخدمة، أو محاولة استخدام معلومات الموقع الأخرى.",
- "MinimaxBizError": "حدث خطأ في طلب خدمة Minimax، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "MistralBizError": "طلب خدمة Mistral AI خاطئ، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "MoonshotBizError": "حدث خطأ في خدمة جانب القمر، يرجى التحقق من المعلومات أدناه أو إعادة المحاولة",
"NoOpenAIAPIKey": "مفتاح API الخاص بـ OpenAI فارغ، يرجى إضافة مفتاح API الخاص بـ OpenAI",
"OllamaBizError": "خطأ في طلب خدمة Ollama، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
"OllamaServiceUnavailable": "خدمة Ollama غير متوفرة، يرجى التحقق من تشغيل Ollama بشكل صحيح أو إعدادات الـ Ollama للاتصال عبر النطاقات",
- "OpenAIBizError": "حدث خطأ في طلب خدمة OpenAI، يرجى التحقق من المعلومات أدناه وإعادة المحاولة",
- "OpenRouterBizError": "خطأ في طلب خدمة OpenRouter AI، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "PerplexityBizError": "خطأ في طلب خدمة Perplexity AI، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
+ "OpenAIBizError": "طلب خدمة OpenAI خاطئ، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
"PluginApiNotFound": "عذرًا، لا يوجد API للإضافة في وصف الإضافة، يرجى التحقق من تطابق طريقة الطلب الخاصة بك مع API الوصف",
"PluginApiParamsError": "عذرًا، فشلت التحقق من صحة معلمات الطلب للإضافة، يرجى التحقق من تطابق المعلمات مع معلومات الوصف",
"PluginGatewayError": "عذرًا، حدث خطأ في بوابة الإضافة، يرجى التحقق من تكوين بوابة الإضافة",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "عذرًا، فشل تهيئة عميل OpenAPI، يرجى التحقق من معلومات تكوين OpenAPI",
"PluginServerError": "خطأ في استجابة الخادم لطلب الإضافة، يرجى التحقق من ملف وصف الإضافة وتكوين الإضافة وتنفيذ الخادم وفقًا لمعلومات الخطأ أدناه",
"PluginSettingsInvalid": "تحتاج هذه الإضافة إلى تكوين صحيح قبل الاستخدام، يرجى التحقق من صحة تكوينك",
- "TogetherAIBizError": "خطأ في طلب خدمة TogetherAI AI، يرجى التحقق من المعلومات التالية أو إعادة المحاولة",
- "ZeroOneBizError": "طلب خدمة ZeroOneBiz خطأ، يرجى التحقق من المعلومات أدناه أو إعادة المحاولة",
- "ZhipuBizError": "حدث خطأ في طلب خدمة Zhipu، يرجى التحقق من المعلومات التالية أو إعادة المحاولة"
+ "ProviderBizError": "طلب خدمة {{provider}} خاطئ، يرجى التحقق من المعلومات التالية أو إعادة المحاولة"
},
"stt": {
"responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "إضافة عنوان وكيل OpenAI (اختياري)",
+ "apiKey": {
+ "description": "يمكنك بدء الجلسة عن طريق إدخال مفتاح API {{name}} الخاص بك",
+ "title": "استخدام مفتاح API {{name}} المخصص"
+ },
"closeMessage": "إغلاق الرسالة",
"confirm": "تأكيد وإعادة المحاولة",
"oauth": {
@@ -115,14 +98,6 @@
"title": "تسجيل الدخول إلى الحساب",
"welcome": "مرحبا بك!"
},
- "ollama": {
- "cancel": "إلغاء",
- "confirm": "تأكيد",
- "description": "أدخل علامة نموذج Ollama الخاصة بك لاستكمال الجلسة",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "بدء التحميل...",
- "title": "تحميل نموذج Ollama المحدد"
- },
"password": {
"description": "قام المسؤول بتشفير التطبيق، قم بإدخال كلمة مرور التطبيق لفتح التطبيق. يتعين إدخال كلمة المرور مرة واحدة فقط",
"placeholder": "الرجاء إدخال كلمة المرور",
@@ -132,5 +107,9 @@
"apiKey": "مفتاح واجهة برمجة التطبيقات المخصص",
"password": "كلمة المرور"
}
+ },
+ "upload": {
+ "desc": "التفاصيل: {{detail}}",
+ "title": "فشل تحميل الملف، يرجى التحقق من الاتصال بالشبكة أو المحاولة لاحقًا"
}
}
diff --git a/locales/ar/metadata.json b/locales/ar/metadata.json
new file mode 100644
index 000000000000..6af63d036756
--- /dev/null
+++ b/locales/ar/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "تقدم LobeChat أفضل تجربة استخدام لـ ChatGPT و OLLaMA و Gemini و Claude WebUI",
+ "title": "LobeChat: أداة أداء شخصية LLM، لتمنح نفسك عقلًا أكثر ذكاءً"
+ },
+ "market": {
+ "description": "إنشاء محتوى، كتابة نصوص، إجابة على الأسئلة، إنشاء صور، إنشاء فيديو، إنشاء صوت، وكيل ذكاء اصطناعي، سير عمل تلقائي، قم بتخصيص مساعد ذكاء اصطناعي / GPTs / OLLaMA الخاص بك",
+ "title": "سوق المساعدين"
+ },
+ "plugins": {
+ "description": "البحث، إنشاء رسوم بيانية، أكاديمي، إنشاء صور، إنشاء فيديو، إنشاء صوت، سير عمل تلقائي، قم بتخصيص قدرات الإضافات الخاصة بـ ChatGPT / OLLaMA",
+ "title": "سوق الإضافات"
+ },
+ "welcome": {
+ "description": "تقدم LobeChat أفضل تجربة استخدام لـ ChatGPT و OLLaMA و Gemini و Claude WebUI",
+ "title": "مرحبًا بك في استخدام LobeChat: أداة أداء شخصية LLM، لتمنح نفسك عقلًا أكثر ذكاءً"
+ }
+}
diff --git a/locales/ar/modelProvider.json b/locales/ar/modelProvider.json
index 57c9517afd2f..c86dcf3a884a 100644
--- a/locales/ar/modelProvider.json
+++ b/locales/ar/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "يجب أن يتضمن العنوان، بخلاف الافتراضي، http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "عنوان وكيل API"
- },
- "title": "Anthropic",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Anthropic لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Anthropic المخصص"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "نسخة API الخاصة بـ Azure، والتي تتبع تنسيق YYYY-MM-DD، راجع [الإصدارات الأحدث](https://learn.microsoft.com/zh-en/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "يمكن العثور على هذه القيمة في قسم 'المفاتيح والنقاط النهائية' عند فحص الموارد في بوابة Azure. يمكن استخدام KEY1 أو KEY2",
"placeholder": "Azure API Key",
"title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بـ Azure OpenAI الخاص بك لبدء الجلسة",
- "title": "استخدام مفتاح API الخاص بـ Azure OpenAI المخصص"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "استخدام معلومات المصادقة الخاصة بـ Bedrock المخصصة"
}
},
- "google": {
- "endpoint": {
- "desc": "بالإضافة إلى العنوان الافتراضي، يجب أن يتضمن http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "عنوان وكيل API"
- },
- "title": "Google",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Google",
- "placeholder": "Google API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Google لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Google المخصص"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Groq",
- "placeholder": "Groq API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Groq لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Groq المخصص"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Minimax",
- "placeholder": "مفتاح API Minimax",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "قم بإدخال مفتاح API Minimax الخاص بك لبدء الجلسة. لن يتم تسجيل مفتاح الـ API الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API Minimax المخصص"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Mistral AI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Mistral AI المخصص"
- }
- },
- "moonshot": {
- "title": "الجانب المظلم للقمر",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Moonshot AI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Moonshot AI المخصص"
- }
- },
"ollama": {
"checker": {
- "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
+ "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح",
+ "title": "فحص الاتصال"
},
"customModelName": {
"desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "أسماء النماذج المخصصة"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. It will resume from where it left off if you restart the download.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "أدخل عنوان واجهة برمجة التطبيقات الخاص بـ Ollama، إذا لم يتم تحديده محليًا، يمكن تركه فارغًا",
- "placeholder": "http://127.0.0.1:11434",
"title": "عنوان وكيل الواجهة"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (نسخة معاينة)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "يجب أن يتضمن العنوان، بخلاف الافتراضي، http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "عنوان وكيل الواجهة"
- },
- "title": "OpenAI",
- "token": {
- "desc": "استخدم مفتاح OpenAI الخاص بك",
- "placeholder": "OpenAI API Key",
- "title": "مفتاح OpenAI"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في OpenAI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ OpenAI المخصص"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
- },
- "customModelName": {
- "desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "أسماء النماذج المخصصة"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في OpenRouter لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ OpenRouter المخصص"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "مفتاح API"
- },
+ "title": "Ollama",
"unlock": {
- "description": "أدخل مفتاح API الخاص بك في Perplexity لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Perplexity المخصص"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "اختبر ما إذا تم إدخال عنوان الوكيل بشكل صحيح"
- },
- "customModelName": {
- "desc": "أضف نماذج مخصصة، استخدم الفاصلة (،) لفصل عدة نماذج",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "أسماء النماذج المخصصة"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في TogetherAI لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ TogetherAI المخصص"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI الأشياء الصغرى",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ 01.AI الأشياء الصغرى",
- "placeholder": "01.AI الأشياء الصغرى API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في ZeroOne لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ ZeroOne المخصص"
- }
+ "title": "01.AI الأشياء الصغرى"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "أدخل مفتاح API الخاص بـ Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "مفتاح API"
- },
- "unlock": {
- "description": "أدخل مفتاح API الخاص بك في Zhipu لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
- "title": "استخدام مفتاح API الخاص بـ Zhipu المخصص"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/ar/plugin.json b/locales/ar/plugin.json
index 62b75c38da49..c1aa952dca34 100644
--- a/locales/ar/plugin.json
+++ b/locales/ar/plugin.json
@@ -4,7 +4,9 @@
"function_call": "استدعاء الدالة",
"off": "إيقاف التصحيح",
"on": "عرض معلومات استدعاء البرنامج المساعد",
- "response": "الرد"
+ "payload": "حمولة البرنامج المساعد",
+ "response": "الرد",
+ "tool_call": "طلب استدعاء الأداة"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "جاري تشغيل الإضافة..."
},
"pluginList": "قائمة الإضافات",
- "plugins": {
- "loading": "جاري فحص الأدوات...",
- "unknown": "أداة غير معروفة"
- },
"setting": "إعدادات الإضافة",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "مثبتة"
},
"title": "متجر الإضافات"
- }
+ },
+ "unknownPlugin": "البرنامج المساعد غير معروف"
}
diff --git a/locales/ar/setting.json b/locales/ar/setting.json
index 4ad4c0cd7664..ba3a63ab31c5 100644
--- a/locales/ar/setting.json
+++ b/locales/ar/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "حول"
},
+ "agentTab": {
+ "chat": "تفضيلات الدردشة",
+ "meta": "معلومات المساعد",
+ "modal": "إعدادات النموذج",
+ "plugin": "إعدادات الإضافة",
+ "prompt": "تعيين الشخصية",
+ "tts": "خدمة النص إلى كلام"
+ },
"analytics": {
"telemetry": {
"desc": "من خلال اختيار إرسال بيانات التحليل، يمكنك مساعدتنا في تحسين تجربة مستخدم LobeChat بشكل عام",
@@ -35,10 +43,14 @@
"title": "إعدادات"
},
"llm": {
+ "apiKey": {
+ "desc": "يرجى ملء مفتاح API الخاص بك {{name}}",
+ "placeholder": "{{name}} مفتاح API",
+ "title": "مفتاح API"
+ },
"checker": {
"button": "فحص",
"desc": "اختبار ما إذا كان مفتاح واجهة البرمجة وعنوان الوكيل مملوء بشكل صحيح",
- "ollamaDesc": "اختبار عنوان الوكيل للتأكد من صحة الملء",
"pass": "تمت المراقبة",
"title": "فحص الاتصال"
},
@@ -90,22 +102,19 @@
"latestTime": "آخر تحديث: {{time}}",
"noLatestTime": "لم يتم الحصول على قائمة بعد"
},
+ "helpDoc": "دليل التكوين",
"modelList": {
"desc": "اختيار النموذج الذي سيتم عرضه في الجلسة، سيتم عرض النموذج المحدد في قائمة النماذج",
"placeholder": "الرجاء اختيار نموذج من القائمة",
"title": "قائمة النماذج",
"total": "متاح {{count}} نموذج"
},
+ "proxyUrl": {
+ "desc": "يجب أن يتضمن عنوان الوكيل API بالإضافة إلى العنوان الافتراضي http(s)://",
+ "title": "عنوان وكيل API"
+ },
"waitingForMore": "يتم <1>التخطيط لتوفير1> المزيد من النماذج، ترقبوا المزيد ✨"
},
- "ollama": {
- "download": {
- "desc": "جارٍ تنزيل النموذج، يرجى عدم إغلاق هذه الصفحة. سيتم استئناف التنزيل من حيث توقف في حالة إعادة التنزيل",
- "remainingTime": "الوقت المتبقي",
- "speed": "سرعة التنزيل",
- "title": "جارٍ تنزيل النموذج {{model}}"
- }
- },
"plugin": {
"addTooltip": "إضافة البرنامج المساعد",
"clearDeprecated": "مسح البرامج المساعدة الغير صالحة",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "غير محدود",
"limited": "يحتوي فقط على {{number}} رسالة محادثة",
+ "setlimited": "تعيين عدد الرسائل التاريخية",
"title": "تحديد عدد الرسائل التاريخية",
"unlimited": "غير محدود"
},
@@ -356,6 +366,24 @@
"title": "WebRTC مزامنة"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "نموذج إنشاء بيانات المساعد",
+ "modelDesc": "يحدد النموذج المستخدم لإنشاء اسم المساعد ووصفه وصورته وعلامته",
+ "title": "توليد معلومات المساعد تلقائيًا"
+ },
+ "title": "مساعد النظام",
+ "topic": {
+ "label": "نموذج تسمية الموضوع",
+ "modelDesc": "يحدد النموذج المستخدم لإعادة تسمية الموضوع تلقائيًا",
+ "title": "إعادة تسمية الموضوع"
+ },
+ "translation": {
+ "label": "نموذج الترجمة",
+ "modelDesc": "النموذج المحدد للاستخدام في الترجمة",
+ "title": "إعدادات مساعد الترجمة"
+ }
+ },
"tab": {
"about": "حول",
"agent": "المساعد الافتراضي",
@@ -363,6 +391,7 @@
"experiment": "تجربة",
"llm": "نموذج اللغة",
"sync": "مزامنة السحابة",
+ "system-agent": "مساعد النظام",
"tts": "خدمة الكلام"
},
"tools": {
diff --git a/locales/ar/tool.json b/locales/ar/tool.json
index a322c40105f4..6876ab6c640c 100644
--- a/locales/ar/tool.json
+++ b/locales/ar/tool.json
@@ -4,6 +4,7 @@
"downloading": "صلاحية روابط الصور المُولَّدة بواسطة DallE3 تدوم ساعة واحدة فقط، يتم تحميل الصور إلى الجهاز المحلي...",
"generate": "توليد",
"generating": "جارٍ التوليد...",
- "images": "الصور:"
+ "images": "الصور:",
+ "prompt": "كلمة تلميح"
}
}
diff --git a/locales/bg-BG/auth.json b/locales/bg-BG/auth.json
index df5e68275e97..1d88bf0f709a 100644
--- a/locales/bg-BG/auth.json
+++ b/locales/bg-BG/auth.json
@@ -1,6 +1,8 @@
{
"login": "Вход",
"loginOrSignup": "Вход / Регистрация",
+ "profile": "Профил",
+ "security": "Сигурност",
"signout": "Изход",
"signup": "Регистрация"
}
diff --git a/locales/bg-BG/chat.json b/locales/bg-BG/chat.json
index e6327c8b4da9..313f4e26da14 100644
--- a/locales/bg-BG/chat.json
+++ b/locales/bg-BG/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Здравей, аз съм **{{name}}**. Можеш да започнеш да чатиш с мен веднага, или да отидеш в [Настройки на агента](/chat/settings#session={{id}}) за да попълниш информацията ми.",
"agentDefaultMessageWithSystemRole": "Здравей, аз съм **{{name}}**, {{systemRole}}. Нека започнем да чатим!",
+ "agentsAndConversations": "агенти и разговори",
"backToBottom": "Върни се в началото",
"clearCurrentMessages": "Изчисти съобщенията от текущата сесия",
"confirmClearCurrentMessages": "На път си да изчистиш съобщенията от текущата сесия. След като бъдат изчистени, те не могат да бъдат възстановени. Моля, потвърди действието си.",
@@ -39,7 +40,6 @@
"regenerate": "Прегенерирай"
},
"newAgent": "Нов агент",
- "noDescription": "Няма налично описание",
"pin": "Закачи",
"pinOff": "Откачи",
"regenerate": "Прегенерирай",
@@ -83,6 +83,7 @@
"chats": "Чат съобщения",
"rest": "Оставащи",
"systemRole": "Настройки на ролята",
+ "title": "Детайли на токена",
"tools": "Настройки на плъгина",
"total": "Общо налични",
"used": "Общо използвани"
diff --git a/locales/bg-BG/common.json b/locales/bg-BG/common.json
index e6cc13e7b438..033f5ec7468e 100644
--- a/locales/bg-BG/common.json
+++ b/locales/bg-BG/common.json
@@ -1,7 +1,7 @@
{
"about": "Относно",
"advanceSettings": "Разширени настройки",
- "appInitializing": "LobeChat се инициализира, моля изчакайте...",
+ "appInitializing": "Приложението се стартира, моля, бъдете търпеливи...",
"autoGenerate": "Автоматично генериране",
"autoGenerateTooltip": "Автоматично генериране на описание на агент въз основа на подкани",
"autoGenerateTooltipDisabled": "Моля, попълнете подсказката, за да използвате функцията за автоматично допълване",
@@ -9,6 +9,7 @@
"cancel": "Отказ",
"changelog": "Дневник на промените",
"close": "Затвори",
+ "contact": "Свържете се с нас",
"copy": "Копирай",
"copyFail": "Копирането не е успешно",
"copySuccess": "Копирано успешно",
@@ -35,10 +36,33 @@
},
"feedback": "Обратна връзка",
"follow": "Следете ни на {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Споделете ценните си съвети",
+ "star": "Добавете звезда в GitHub"
+ },
+ "and": "и",
+ "feedback": {
+ "action": "Споделете обратна връзка",
+ "desc": "Всеки ваши идеи и предложения са от изключително значение за нас, нетърпеливи сме да чуем мнението ви! Не се колебайте да се свържете с нас, за да споделите отзиви за функциите на продукта и потребителския опит, които да ни помогнат да направим LobeChat още по-добър.",
+ "title": "Споделете ценните си отзиви в GitHub"
+ },
+ "later": "По-късно",
+ "star": {
+ "action": "Осветете звездата",
+ "desc": "Ако обичате нашия продукт и искате да ни подкрепите, можете ли да ни добавите звезда в GitHub? Този малък жест е от огромно значение за нас и ни мотивира да продължим да ви предоставяме уникално преживяване.",
+ "title": "Осветете звездата за нас в GitHub"
+ },
+ "title": "Харесвате нашия продукт?"
+ },
"fullscreen": "Цял екран",
"historyRange": "Диапазон на историята",
"import": "Импортирай конфигурация",
"importModal": {
+ "error": {
+ "desc": "Съжаляваме, възникна грешка по време на процеса на импорт на данни. Моля, опитайте отново да ги импортирате или <1>подайте проблем1>, за да можем да помогнем веднага с отстраняването на проблема.",
+ "title": "Грешка при импортиране на данни"
+ },
"finish": {
"onlySettings": "Системните настройки са импортирани успешно",
"start": "Започни да използваш",
@@ -46,6 +70,7 @@
"title": "Импортирането на данни е завършено"
},
"loading": "Импортиране на данни, моля изчакайте...",
+ "preparing": "Подготовка на модула за импорт на данни...",
"result": {
"added": "Импортирани успешно",
"errors": "Грешки при импортиране",
@@ -56,8 +81,15 @@
"topics": "Теми",
"type": "Тип данни"
},
- "title": "Импортирай данни"
+ "title": "Импортирай данни",
+ "uploading": {
+ "desc": "Текущият файл е голям и се качва...",
+ "restTime": "Оставащо време",
+ "speed": "Скорост на качване"
+ }
},
+ "information": "Общност и информация",
+ "installPWA": "Инсталиране на PWA",
"lang": {
"ar": "Арабски",
"bg-BG": "български",
@@ -96,7 +128,11 @@
"zh-TW": "Традиционен китайски"
},
"layoutInitializing": "Инициализиране на оформлението...",
- "noDescription": "Няма налично описание",
+ "legal": "Правно уведомление",
+ "mail": {
+ "business": "Бизнес сътрудничество",
+ "support": "Поддръжка по имейл"
+ },
"oauth": "SSO Вход",
"officialSite": "Официален сайт",
"ok": "Добре",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Анонимен потребител",
"billing": "Управление на сметките",
+ "data": "Съхранение на данни",
"defaultNickname": "Потребител на общността",
"discord": "Поддръжка на общността",
"docs": "Документация",
@@ -181,5 +218,6 @@
"profile": "Управление на профила",
"setting": "Настройки на приложението",
"usages": "Статистика за използване"
- }
+ },
+ "version": "Версия"
}
diff --git a/locales/bg-BG/components.json b/locales/bg-BG/components.json
index af0c1803fb91..e8941dc8716d 100644
--- a/locales/bg-BG/components.json
+++ b/locales/bg-BG/components.json
@@ -6,7 +6,8 @@
"functionCall": "Този модел поддържа функционални обаждания (Function Call)",
"tokens": "Този модел поддържа до {{tokens}} токена за една сесия",
"vision": "Този модел поддържа визуално разпознаване"
- }
+ },
+ "removed": "Този модел не се намира в списъка. Ако бъде отменен изборът, той ще бъде автоматично премахнат."
},
"ModelSwitchPanel": {
"emptyModel": "Няма активирани модели, моля, посетете настройките и ги активирайте",
diff --git a/locales/bg-BG/error.json b/locales/bg-BG/error.json
index e98dcc801fce..22052590b481 100644
--- a/locales/bg-BG/error.json
+++ b/locales/bg-BG/error.json
@@ -1,9 +1,9 @@
{
"clerkAuth": {
"loginSuccess": {
- "action": "继续会话",
- "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧",
- "title": "欢迎回来, {{nickName}}"
+ "action": "Continue Session",
+ "desc": "{{greeting}}, I'm glad to continue serving you. Let's pick up where we left off.",
+ "title": "Welcome back, {{nickName}}"
}
},
"error": {
@@ -12,6 +12,8 @@
"retry": "Опитай отново",
"title": "Страницата се е сблъскала с проблем.."
},
+ "fetchError": "Грешка при извличане",
+ "fetchErrorDetail": "Подробности за грешката",
"notFound": {
"backHome": "Върни се в началото",
"desc": "Не можем да намерим страницата, която търсите. Моля, проверете дали връзката е правилна.",
@@ -52,37 +54,16 @@
"503": "Съжаляваме, сървърът в момента не може да обработи заявката ви, вероятно поради претоварване или поддръжка. Моля, опитайте отново по-късно.",
"504": "Съжаляваме, сървърът не получи отговор от сървъра нагоре по веригата. Моля, опитайте отново по-късно.",
"AgentRuntimeError": "Грешка при изпълнение на времето за изпълнение на езиковия модел Lobe. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "AnthropicBizError": "Грешка при заявка към услугата Anthropic. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "AzureBizError": "Грешка при заявка към услугата Azure AI. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "BedrockBizError": "Грешка при заявка към услугата Bedrock. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "GoogleBizError": "Грешка при заявка към услугата Google. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "GroqBizError": "Възникна грешка при заявка към услугата Groq. Моля, отстранете неизправностите въз основа на следната информация или опитайте отново.",
"InvalidAccessCode": "Невалиден или празен код за достъп. Моля, въведете правилния код за достъп или добавете персонализиран API ключ.",
- "InvalidAnthropicAPIKey": "API ключът на Anthropic е неправилен или празен. Моля, проверете API ключа на Anthropic и опитайте отново.",
- "InvalidAzureAPIKey": "API ключът на Azure е неправилен или празен. Моля, проверете API ключа на Azure и опитайте отново.",
"InvalidBedrockCredentials": "Удостоверяването на Bedrock е неуспешно. Моля, проверете AccessKeyId/SecretAccessKey и опитайте отново.",
"InvalidClerkUser": "很抱歉,你当前尚未登录,请先登录或注册账号后继续操作",
- "InvalidGoogleAPIKey": "API ключът на Google е неправилен или празен. Моля, проверете API ключа на Google и опитайте отново.",
- "InvalidGroqAPIKey": "API ключът на Groq е неправилен или празен. Моля, проверете API ключа на Groq и опитайте отново.",
- "InvalidMinimaxAPIKey": "Невалиден или липсващ ключ за Minimax API, моля проверете ключа за Minimax API и опитайте отново",
- "InvalidMistralAPIKey": "Неправилен или празен API ключ на Mistral AI. Моля, проверете вашия API ключ на Mistral и опитайте отново.",
- "InvalidMoonshotAPIKey": "API ключът на Moonshot AI е неправилен или празен, моля, проверете API ключа на Moonshot и опитайте отново.",
"InvalidOllamaArgs": "Невалидна конфигурация на Ollama, моля, проверете конфигурацията на Ollama и опитайте отново",
- "InvalidOpenRouterAPIKey": "Невалиден или празен API ключ на OpenRouter. Моля, проверете вашия API ключ на OpenRouter и опитайте отново.",
- "InvalidPerplexityAPIKey": "API ключът на Perplexity е неправилен или празен. Моля, проверете API ключа на Perplexity и опитайте отново.",
- "InvalidTogetherAIAPIKey": "TogetherAI API ключът е неправилен или липсва, моля, проверете TogetherAI API ключа и опитайте отново",
- "InvalidZeroOneAPIKey": "API ключът на 01-AI е неправилен или празен. Моля, проверете API ключа на 01-AI и опитайте отново.",
- "InvalidZhipuAPIKey": "API ключът на Zhipu е неправилен или празен. Моля, проверете API ключа на Zhipu и опитайте отново.",
+ "InvalidProviderAPIKey": "{{provider}} API ключ е невалиден или липсва, моля проверете {{provider}} API ключа и опитайте отново",
"LocationNotSupportError": "Съжаляваме, вашето текущо местоположение не поддържа тази услуга на модела. Това може да се дължи на регионални ограничения или на недостъпност на услугата. Моля, потвърдете дали текущото местоположение поддържа използването на тази услуга или опитайте да използвате друго местоположение.",
- "MinimaxBizError": "Грешка при заявка към услугата Minimax, моля проверете информацията по-долу или опитайте отново",
- "MistralBizError": "Възникна грешка при заявка към услугата Mistral AI. Моля, отстранете неизправностите въз основа на следната информация или опитайте отново.",
- "MoonshotBizError": "Възникна грешка с услугата Moonshot, моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
"NoOpenAIAPIKey": "API ключът на OpenAI е празен, моля, добавете персонализиран API ключ на OpenAI",
"OllamaBizError": "Грешка при заявка към услугата Ollama, моля, отстранете неизправностите или опитайте отново въз основа на следната информация",
"OllamaServiceUnavailable": "Услугата Ollama не е налична. Моля, проверете дали Ollama работи правилно или дали е конфигуриран коректно за междудомейност.",
- "OpenAIBizError": "Грешка при заявка към услугата OpenAI. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "OpenRouterBizError": "Грешка при заявка към услугата OpenRouter AI. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "PerplexityBizError": "Грешка при заявка към услугата Perplexity AI. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
+ "OpenAIBizError": "Грешка в услугата на OpenAI, моля проверете следната информация или опитайте отново",
"PluginApiNotFound": "Съжаляваме, API не съществува в манифеста на плъгина. Моля, проверете дали методът на вашата заявка съвпада с API на манифеста на плъгина",
"PluginApiParamsError": "Съжаляваме, проверката на входния параметър за заявката на плъгина е неуспешна. Моля, проверете дали входните параметри съвпадат с описанието на API",
"PluginGatewayError": "Съжаляваме, възникна грешка с шлюза на плъгина. Моля, проверете дали конфигурацията на шлюза на плъгина е правилна.",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Съжаляваме, клиентът на OpenAPI не успя да се инициализира. Моля, проверете дали информацията за конфигурацията на OpenAPI е правилна.",
"PluginServerError": "Заявката към сървъра на плъгина върна грешка. Моля, проверете файла на манифеста на плъгина, конфигурацията на плъгина или изпълнението на сървъра въз основа на информацията за грешката по-долу",
"PluginSettingsInvalid": "Този плъгин трябва да бъде конфигуриран правилно, преди да може да се използва. Моля, проверете дали конфигурацията ви е правилна",
- "TogetherAIBizError": "Възникна грешка при заявка към TogetherAI AI услугата, моля, проверете следната информация или опитайте отново",
- "ZeroOneBizError": "Грешка при заявка към услугата 01-AI. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация.",
- "ZhipuBizError": "Грешка при заявка към услугата Zhipu. Моля, отстранете неизправностите или опитайте отново въз основа на следната информация."
+ "ProviderBizError": "Грешка в услугата на {{provider}}, моля проверете следната информация или опитайте отново"
},
"stt": {
"responseError": "Заявката за услуга е неуспешна, моля, проверете конфигурацията или опитайте отново"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Добавете URL адрес на OpenAI прокси (по избор)",
+ "apiKey": {
+ "description": "Въведете вашия {{name}} API ключ, за да започнете сесия",
+ "title": "Използване на персонализиран {{name}} API ключ"
+ },
"closeMessage": "Затвори съобщението",
"confirm": "Потвърди и опитай отново",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Влезте в акаунта си",
"welcome": "Добре дошли!"
},
- "ollama": {
- "cancel": "Отказ",
- "confirm": "Изтегли",
- "description": "Въведете етикета на вашия модел Ollama, за да продължите разговора",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Започване на изтеглянето...",
- "title": "Изтегляне на определения модел Ollama"
- },
"password": {
"description": "Криптирането на приложението е активирано от администратора. Въведете паролата за приложението, за да отключите приложението. Паролата трябва да бъде попълнена само веднъж.",
"placeholder": "Моля, въведете парола",
@@ -132,5 +107,9 @@
"apiKey": "Персонализиран API ключ",
"password": "Парола"
}
+ },
+ "upload": {
+ "desc": "Подробности: {{detail}}",
+ "title": "Неуспешно качване на файл, моля проверете интернет връзката или опитайте по-късно"
}
}
diff --git a/locales/bg-BG/metadata.json b/locales/bg-BG/metadata.json
new file mode 100644
index 000000000000..0e2331d7eb3d
--- /dev/null
+++ b/locales/bg-BG/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat предлага най-доброто използване на ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Личен инструмент за ефективност на LLM, даващ по-умен мозък"
+ },
+ "market": {
+ "description": "Създаване на съдържание, копирайтинг, въпроси и отговори, генериране на изображения, генериране на видео, генериране на глас, интелигентен агент, автоматизирани работни процеси, персонализирайте си собствения AI / GPTs / OLLaMA интелигентен асистент",
+ "title": "Пазар на асистенти"
+ },
+ "plugins": {
+ "description": "Търсене, генериране на диаграми, академични изследвания, генериране на изображения, генериране на видео, генериране на глас, автоматизирани работни процеси, персонализирайте си собствените способности на ChatGPT / OLLaMA с инструментите на ToolCall",
+ "title": "Пазар на добавки"
+ },
+ "welcome": {
+ "description": "LobeChat предлага най-доброто използване на ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Добре дошли в LobeChat: Личен инструмент за ефективност на LLM, даващ по-умен мозък"
+ }
+}
diff --git a/locales/bg-BG/modelProvider.json b/locales/bg-BG/modelProvider.json
index c91ecd56def1..30e481a8d1f0 100644
--- a/locales/bg-BG/modelProvider.json
+++ b/locales/bg-BG/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Освен адреса по подразбиране, задължително трябва да включва http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Адрес на API прокси"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Въведете API Key, получен от Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Anthropic API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Anthropic API ключ"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Версия на Azure API, в формат YYYY-MM-DD, вижте [най-новата версия](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Тази стойност може да бъде намерена в раздела „Ключове и крайни точки“ при проверка на ресурсите от портала на Azure. Можете да използвате KEY1 или KEY2",
"placeholder": "Azure API Key",
"title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Azure OpenAI API ключ, за да започнете сесия",
- "title": "Използване на персонализиран Azure OpenAI API ключ"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Използване на персонализирана информация за удостоверяване на Bedrock"
}
},
- "google": {
- "endpoint": {
- "desc": "Изисква се адрес, включително http(s)://, освен ако не е по подразбиране",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Адрес на API прокси"
- },
- "title": "Google",
- "token": {
- "desc": "Въведете API Key, получен от Google",
- "placeholder": "Google API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Google API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Google API ключ"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Въведете API Key, получен от Groq",
- "placeholder": "Groq API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Groq API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Groq API ключ"
- }
- },
- "minimax": {
- "title": "Минимакс",
- "token": {
- "desc": "Въведете API ключ от Минимакс",
- "placeholder": "API ключ на Минимакс",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Само въведете вашия API ключ от Минимакс, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран API ключ от Минимакс"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Въведете API Key, получен от Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Mistral AI API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Mistral AI API ключ"
- }
- },
- "moonshot": {
- "title": "Тъмната страна на Луната",
- "token": {
- "desc": "Въведете API Key, получен от Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя Moonshot AI API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Moonshot AI API ключ"
- }
- },
"ollama": {
"checker": {
- "desc": "Тестване дали адресът на прокси е попълнен правилно"
+ "desc": "Тестване дали адресът на прокси е попълнен правилно",
+ "title": "Проверка на свързаност"
},
"customModelName": {
"desc": "Добавяне на персонализирани модели, използвайте запетая (,) за разделяне на множество модели",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Имена на персонализирани модели"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. It will resume from where it left off if you restart the download.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Въведете адрес на Ollama интерфейсния прокси, оставете празно, ако локално не е указано специално",
- "placeholder": "http://127.0.0.1:11434",
"title": "Адрес на прокси интерфейс"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (преглед)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Освен адреса по подразбиране, задължително трябва да включва http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Адрес на прокси интерфейс"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Използвайте собствения си OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API ключ"
- },
- "unlock": {
- "description": "Въведете своя OpenAI API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран OpenAI API ключ"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Тестване дали адресът на прокси е попълнен правилно"
- },
- "customModelName": {
- "desc": "Добавяне на персонализирани модели, използвайте запетая (,) за разделяне на множество модели",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Имена на персонализирани модели"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Въведете API Key, получен от OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете своя OpenRouter API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран OpenRouter API ключ"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Въведете API Key, получен от Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API ключ"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Въведете вашия Perplexity API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Perplexity API ключ"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Тестване дали адресът на прокси е попълнен правилно"
- },
- "customModelName": {
- "desc": "Добавяне на персонализирани модели, използвайте запетая (,) за разделяне на множество модели",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Имена на персонализирани модели"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Въведете API Key, получен от TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете вашия TogetherAI API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран TogetherAI API ключ"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Зероуан Всичко",
- "token": {
- "desc": "Въведете API Key, получен от 01.AI Зероуан Всичко",
- "placeholder": "01.AI Зероуан Всичко API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете вашия ZeroOne API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран ZeroOne API ключ"
- }
+ "title": "01.AI Зероуан Всичко"
},
"zhipu": {
- "title": "Интелигентен албум",
- "token": {
- "desc": "Въведете API Key, получен от Интелигентен албум",
- "placeholder": "Zhipu API Key",
- "title": "API ключ"
- },
- "unlock": {
- "description": "Въведете вашия Zhipu API ключ, за да започнете сесия. Приложението няма да запази вашия API ключ",
- "title": "Използване на персонализиран Zhipu API ключ"
- }
+ "title": "Интелигентен албум"
}
}
diff --git a/locales/bg-BG/plugin.json b/locales/bg-BG/plugin.json
index 42caeb66cb09..24d6b5cc7225 100644
--- a/locales/bg-BG/plugin.json
+++ b/locales/bg-BG/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Извикване на функция",
"off": "Изключи отстраняване на грешки",
"on": "Преглед на информацията за извикване на плъгина",
- "response": "Отговор"
+ "payload": "полезна натоварване",
+ "response": "Отговор",
+ "tool_call": "заявка за инструмент"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Плъгинът работи..."
},
"pluginList": "Списък с плъгини",
- "plugins": {
- "loading": "Откриване на плъгини...",
- "unknown": "Неизвестен плъгин"
- },
"setting": "Настройки на плъгина",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Инсталирани"
},
"title": "Магазин за плъгини"
- }
+ },
+ "unknownPlugin": "Неизвестен плъгин"
}
diff --git a/locales/bg-BG/setting.json b/locales/bg-BG/setting.json
index 01ab04b0e64b..4f0948a4b964 100644
--- a/locales/bg-BG/setting.json
+++ b/locales/bg-BG/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Относно"
},
+ "agentTab": {
+ "chat": "Предпочитания за чат",
+ "meta": "Информация за асистента",
+ "modal": "Настройки на модела",
+ "plugin": "Настройки на добавката",
+ "prompt": "Настройки на ролята",
+ "tts": "Гласова услуга"
+ },
"analytics": {
"telemetry": {
"desc": "Като изберете да изпращате телеметрични данни, можете да ни помогнете да подобрим цялостното потребителско изживяване на LobeChat",
@@ -35,10 +43,14 @@
"title": "Настройки"
},
"llm": {
+ "apiKey": {
+ "desc": "Моля, въведете вашия {{name}} API ключ",
+ "placeholder": "{{name}} API ключ",
+ "title": "API ключ"
+ },
"checker": {
"button": "Провери",
"desc": "Проверете дали API ключът и адресът на прокси сървъра са попълнени правилно",
- "ollamaDesc": "Проверете дали адресът на прокси се попълва правилно",
"pass": "Проверката е успешна",
"title": "Проверка на свързаността"
},
@@ -90,22 +102,19 @@
"latestTime": "Последно актуализирано: {{time}}",
"noLatestTime": "В момента няма наличен списък"
},
+ "helpDoc": "Настройки за документация",
"modelList": {
"desc": "Изберете модел, който да се показва по време на разговор. Избраният модел ще бъде показан в списъка с модели.",
"placeholder": "Моля, изберете модел от списъка",
"title": "Списък с модели",
"total": "Общо {{count}} налични модела"
},
+ "proxyUrl": {
+ "desc": "Включващ адреса по подразбиране, трябва да включва http(s)://",
+ "title": "Адрес на API прокси"
+ },
"waitingForMore": "Още модели са <1>планирани да бъдат добавени1>, очаквайте ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama в момента изтегля модела. Моля, опитайте се да не затваряте тази страница. Изтеглянето ще продължи от мястото, където е спряло, ако рестартирате изтеглянето.",
- "remainingTime": "Оставащо време",
- "speed": "Скорост на изтегляне",
- "title": "Изтегляне на модел {{model}}"
- }
- },
"plugin": {
"addTooltip": "Персонализиран плъгин",
"clearDeprecated": "Премахване на остарели плъгини",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Неограничен",
"limited": "Включете само {{number}} съобщения от разговора",
+ "setlimited": "Задайте ограничение за използване на брой исторически съобщения",
"title": "Ограничаване на броя на съобщенията в историята",
"unlimited": "Неограничен брой съобщения в историята"
},
@@ -356,6 +366,24 @@
"title": "WebRTC синхронизиране"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Модел за генериране на помощни метаданни",
+ "modelDesc": "Модел, определен за генериране на име, описание, профилна снимка и етикети на помощник",
+ "title": "Автоматично генериране на информация за помощник"
+ },
+ "title": "Системен асистент",
+ "topic": {
+ "label": "Модел за именуване на теми",
+ "modelDesc": "Модел, определен за автоматично преименуване на теми",
+ "title": "Автоматично именуване на теми"
+ },
+ "translation": {
+ "label": "Модел за превод",
+ "modelDesc": "Определя модела, използван за превод",
+ "title": "Настройки на преводния асистент"
+ }
+ },
"tab": {
"about": "Относно",
"agent": "Агент по подразбиране",
@@ -363,6 +391,7 @@
"experiment": "Експеримент",
"llm": "Езиков модел",
"sync": "Синхронизиране в облака",
+ "system-agent": "Системен асистент",
"tts": "Текст към реч"
},
"tools": {
diff --git a/locales/bg-BG/tool.json b/locales/bg-BG/tool.json
index c08feea03dd4..0f7f661a780b 100644
--- a/locales/bg-BG/tool.json
+++ b/locales/bg-BG/tool.json
@@ -4,6 +4,7 @@
"downloading": "Връзките към изображенията, генерирани от DALL·E3, са валидни само за 1 час, кеширане на изображенията локално...",
"generate": "Генерирай",
"generating": "Генериране...",
- "images": "Изображения:"
+ "images": "Изображения:",
+ "prompt": "подсказка"
}
}
diff --git a/locales/de-DE/auth.json b/locales/de-DE/auth.json
index 0c4903a641b4..7d6a7d8c1620 100644
--- a/locales/de-DE/auth.json
+++ b/locales/de-DE/auth.json
@@ -1,6 +1,8 @@
{
"login": "Anmelden",
"loginOrSignup": "Anmelden / Registrieren",
+ "profile": "Profil",
+ "security": "Sicherheit",
"signout": "Abmelden",
"signup": "Registrieren"
}
diff --git a/locales/de-DE/chat.json b/locales/de-DE/chat.json
index c2ee10dc5391..5573842c351e 100644
--- a/locales/de-DE/chat.json
+++ b/locales/de-DE/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Hallo, ich bin **{{name}}**. Du kannst sofort mit mir chatten oder gehe zu [Assistenteneinstellungen](/chat/settings#session={{id}}), um meine Informationen zu vervollständigen.",
"agentDefaultMessageWithSystemRole": "Hallo, ich bin **{{name}}**, {{systemRole}}. Lass uns chatten!",
+ "agentsAndConversations": "Agenten und Unterhaltungen",
"backToBottom": "Zurück zum Ende",
"clearCurrentMessages": "Aktuelle Nachrichten löschen",
"confirmClearCurrentMessages": "Möchtest du wirklich die aktuellen Nachrichten löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
@@ -39,7 +40,6 @@
"regenerate": "Neu generieren"
},
"newAgent": "Neuer Assistent",
- "noDescription": "Keine Beschreibung vorhanden",
"pin": "Anheften",
"pinOff": "Anheften aufheben",
"regenerate": "Neu generieren",
@@ -83,6 +83,7 @@
"chats": "Chats",
"rest": "Verbleibend",
"systemRole": "Systemrolle",
+ "title": "Kontextdetails",
"tools": "Werkzeuge",
"total": "Insgesamt",
"used": "Verwendet"
diff --git a/locales/de-DE/common.json b/locales/de-DE/common.json
index d51112cccb4d..6de9133e3597 100644
--- a/locales/de-DE/common.json
+++ b/locales/de-DE/common.json
@@ -1,7 +1,7 @@
{
"about": "Über",
"advanceSettings": "Erweiterte Einstellungen",
- "appInitializing": "LobeChat wird initialisiert. Bitte haben Sie einen Moment Geduld...",
+ "appInitializing": "Die App wird gestartet, bitte haben Sie etwas Geduld...",
"autoGenerate": "Automatisch generieren",
"autoGenerateTooltip": "Assistentenbeschreibung automatisch auf Basis von Vorschlägen vervollständigen",
"autoGenerateTooltipDisabled": "Bitte geben Sie einen Hinweis ein, um die automatische Vervollständigung zu aktivieren",
@@ -9,6 +9,7 @@
"cancel": "Abbrechen",
"changelog": "Änderungsprotokoll",
"close": "Schließen",
+ "contact": "Kontakt",
"copy": "Kopieren",
"copyFail": "Kopieren fehlgeschlagen",
"copySuccess": "Kopieren erfolgreich",
@@ -35,10 +36,33 @@
},
"feedback": "Feedback und Vorschläge",
"follow": "Folge uns auf {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Teilen Sie uns Ihr wertvolles Feedback mit",
+ "star": "Geben Sie uns auf GitHub einen Stern"
+ },
+ "and": "und",
+ "feedback": {
+ "action": "Feedback teilen",
+ "desc": "Jede Ihrer Ideen und Vorschläge sind für uns von unschätzbarem Wert. Wir sind gespannt auf Ihre Meinung! Kontaktieren Sie uns gerne, um Feedback zu Produktfunktionen und Benutzererfahrungen zu geben und helfen Sie uns, LobeChat weiter zu verbessern.",
+ "title": "Teilen Sie uns Ihr wertvolles Feedback auf GitHub mit"
+ },
+ "later": "Später",
+ "star": {
+ "action": "Stern hinzufügen",
+ "desc": "Wenn Sie unser Produkt mögen und uns unterstützen möchten, könnten Sie uns auf GitHub einen Stern geben? Diese kleine Geste bedeutet uns viel und motiviert uns, Ihnen weiterhin besondere Erlebnisse zu bieten.",
+ "title": "Geben Sie uns auf GitHub einen Stern"
+ },
+ "title": "Mögen Sie unser Produkt?"
+ },
"fullscreen": "Vollbildmodus",
"historyRange": "Verlaufsbereich",
"import": "Importieren",
"importModal": {
+ "error": {
+ "desc": "Es tut uns sehr leid, aber beim Importieren der Daten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder <1>senden Sie uns eine Anfrage1>, damit wir das Problem umgehend für Sie lösen können.",
+ "title": "Datenimport fehlgeschlagen"
+ },
"finish": {
"onlySettings": "Systemeinstellungen erfolgreich importiert",
"start": "Starten",
@@ -46,6 +70,7 @@
"title": "Import abgeschlossen"
},
"loading": "Daten werden importiert. Bitte haben Sie einen Moment Geduld...",
+ "preparing": "Vorbereitung für den Datenimport läuft...",
"result": {
"added": "Erfolgreich importiert",
"errors": "Fehler beim Import",
@@ -56,8 +81,15 @@
"topics": "Themen",
"type": "Datentyp"
},
- "title": "Daten importieren"
+ "title": "Daten importieren",
+ "uploading": {
+ "desc": "Die Datei ist momentan zu groß und wird mit Hochdruck hochgeladen...",
+ "restTime": "Verbleibende Zeit",
+ "speed": "Upload-Geschwindigkeit"
+ }
},
+ "information": "Community und Informationen",
+ "installPWA": "Installiere die Browser-App",
"lang": {
"ar": "Arabisch",
"bg-BG": "Bulgarisch",
@@ -96,7 +128,11 @@
"zh-TW": "Chinesisch (traditionell)"
},
"layoutInitializing": "Layout wird geladen...",
- "noDescription": "Keine Beschreibung vorhanden",
+ "legal": "Rechtliches",
+ "mail": {
+ "business": "Geschäftliche Zusammenarbeit",
+ "support": "E-Mail-Support"
+ },
"oauth": "SSO-Anmeldung",
"officialSite": "Offizielle Website",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Anonymer Benutzer",
"billing": "Abrechnung verwalten",
+ "data": "Daten speichern",
"defaultNickname": "Community User",
"discord": "Community-Support",
"docs": "Dokumentation",
@@ -181,5 +218,6 @@
"profile": "Kontoverwaltung",
"setting": "App-Einstellungen",
"usages": "Nutzungsstatistiken"
- }
+ },
+ "version": "Version"
}
diff --git a/locales/de-DE/components.json b/locales/de-DE/components.json
index 800f50455452..9b191cc794ee 100644
--- a/locales/de-DE/components.json
+++ b/locales/de-DE/components.json
@@ -6,7 +6,8 @@
"functionCall": "Dieses Modell unterstützt Funktionsaufrufe.",
"tokens": "Dieses Modell unterstützt maximal {{tokens}} Tokens pro Sitzung.",
"vision": "Dieses Modell unterstützt die visuelle Erkennung."
- }
+ },
+ "removed": "Das Modell wurde aus der Liste entfernt. Wenn Sie die Auswahl aufheben, wird es automatisch entfernt."
},
"ModelSwitchPanel": {
"emptyModel": "Kein aktiviertes Modell. Bitte gehen Sie zu den Einstellungen, um es zu aktivieren.",
diff --git a/locales/de-DE/error.json b/locales/de-DE/error.json
index e52ae37253e7..3c17d127fb46 100644
--- a/locales/de-DE/error.json
+++ b/locales/de-DE/error.json
@@ -12,6 +12,8 @@
"retry": "Erneut laden",
"title": "Ein Problem ist aufgetreten auf der Seite.."
},
+ "fetchError": "Anforderung fehlgeschlagen",
+ "fetchErrorDetail": "Fehlerdetails",
"notFound": {
"backHome": "Zurück zur Startseite",
"desc": "Die von Ihnen gesuchte Seite konnte nicht gefunden werden. Bitte überprüfen Sie, ob der Link korrekt ist.",
@@ -52,37 +54,16 @@
"503": "Entschuldigung, der Server kann Ihre Anfrage derzeit nicht verarbeiten. Möglicherweise aufgrund von Überlastung oder Wartungsarbeiten. Bitte versuchen Sie es später erneut",
"504": "Entschuldigung, der Server hat keine Antwort vom Upstream-Server erhalten. Bitte versuchen Sie es später erneut",
"AgentRuntimeError": "Es ist ein Fehler bei der Ausführung des Lobe-Sprachmodells aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "AnthropicBizError": "Fehler beim Anfordern des Anthropic AI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "AzureBizError": "Es ist ein Fehler bei der Anforderung des Azure AI-Dienstes aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "BedrockBizError": "Es ist ein Fehler bei der Anforderung des Bedrock-Dienstes aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "GoogleBizError": "Es ist ein Fehler bei der Anforderung des Google-Dienstes aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "GroqBizError": "Die Anfrage an den Groq-Dienst ist fehlgeschlagen. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
"InvalidAccessCode": "Das Passwort ist ungültig oder leer. Bitte geben Sie das richtige Zugangspasswort ein oder fügen Sie einen benutzerdefinierten API-Schlüssel hinzu.",
- "InvalidAnthropicAPIKey": "Ungültiger oder leerer Anthropic API-Schlüssel. Bitte überprüfen Sie den Anthropic API-Schlüssel und versuchen Sie es erneut.",
- "InvalidAzureAPIKey": "Der Azure API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Azure API-Schlüssel und versuchen Sie es erneut.",
"InvalidBedrockCredentials": "Die Bedrock-Authentifizierung ist fehlgeschlagen. Bitte überprüfen Sie AccessKeyId/SecretAccessKey und versuchen Sie es erneut.",
"InvalidClerkUser": "Entschuldigung, du bist derzeit nicht angemeldet. Bitte melde dich an oder registriere ein Konto, um fortzufahren.",
- "InvalidGoogleAPIKey": "Der Google API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Google API-Schlüssel und versuchen Sie es erneut.",
- "InvalidGroqAPIKey": "Der Groq API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Groq API-Schlüssel und versuchen Sie es erneut.",
- "InvalidMinimaxAPIKey": "Ungültiger oder leerer Minimax-API-Schlüssel. Bitte überprüfen Sie den Minimax-API-Schlüssel und versuchen Sie es erneut.",
- "InvalidMistralAPIKey": "Der Mistral AI-API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Mistral-API-Schlüssel und versuchen Sie es erneut.",
- "InvalidMoonshotAPIKey": "Ungültiger oder leerer Moonshot AI API-Schlüssel. Bitte überprüfen Sie den Moonshot API-Schlüssel und versuchen Sie es erneut.",
"InvalidOllamaArgs": "Ollama-Konfiguration ist ungültig. Bitte überprüfen Sie die Ollama-Konfiguration und versuchen Sie es erneut.",
- "InvalidOpenRouterAPIKey": "OpenRouter API-Schlüssel ungültig oder leer. Bitte überprüfen Sie den OpenRouter API-Schlüssel und versuchen Sie es erneut.",
- "InvalidPerplexityAPIKey": "Perplexity API Key ist ungültig oder leer. Bitte überprüfen Sie den Perplexity API Key und versuchen Sie es erneut.",
- "InvalidTogetherAIAPIKey": "TogetherAI API-Schlüssel ungültig oder leer. Bitte überprüfen Sie den TogetherAI API-Schlüssel und versuchen Sie es erneut.",
- "InvalidZeroOneAPIKey": "Ungültiger oder leerer ZeroOne-API-Schlüssel. Bitte überprüfen Sie den ZeroOne-API-Schlüssel und versuchen Sie es erneut.",
- "InvalidZhipuAPIKey": "Der Zhipu API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Zhipu API-Schlüssel und versuchen Sie es erneut.",
+ "InvalidProviderAPIKey": "{{provider}} API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den {{provider}} API-Schlüssel und versuchen Sie es erneut.",
"LocationNotSupportError": "Entschuldigung, Ihr Standort unterstützt diesen Modellservice möglicherweise aufgrund von regionalen Einschränkungen oder nicht aktivierten Diensten nicht. Bitte überprüfen Sie, ob der aktuelle Standort die Verwendung dieses Dienstes unterstützt, oder versuchen Sie, andere Standortinformationen zu verwenden.",
- "MinimaxBizError": "Fehler beim Abrufen des Minimax-Dienstes. Bitte überprüfen Sie die folgenden Informationen und versuchen Sie es erneut.",
- "MistralBizError": "Beim Anfordern des Mistral AI-Dienstes ist ein Fehler aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "MoonshotBizError": "Fehler beim Abrufen des Dark Side of the Moon-Services. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
"NoOpenAIAPIKey": "Der OpenAI-API-Schlüssel ist leer. Bitte fügen Sie einen benutzerdefinierten OpenAI-API-Schlüssel hinzu",
"OllamaBizError": "Fehler bei der Anforderung des Ollama-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
"OllamaServiceUnavailable": "Der Ollama-Dienst ist nicht verfügbar. Bitte überprüfen Sie, ob Ollama ordnungsgemäß ausgeführt wird und ob die CORS-Konfiguration von Ollama korrekt ist.",
- "OpenAIBizError": "Fehler bei der OpenAI-Serviceanfrage. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut",
- "OpenRouterBizError": "Fehler bei der Anforderung des OpenRouter AI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "PerplexityBizError": "Fehler bei der Anforderung des Perplexity AI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
+ "OpenAIBizError": "Fehler bei der Anforderung des OpenAI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
"PluginApiNotFound": "Entschuldigung, das API des Plugins im Plugin-Manifest existiert nicht. Bitte überprüfen Sie, ob Ihre Anfragemethode mit dem Plugin-Manifest-API übereinstimmt",
"PluginApiParamsError": "Entschuldigung, die Eingabeüberprüfung der Plugin-Anfrage ist fehlgeschlagen. Bitte überprüfen Sie, ob die Eingabe mit den API-Beschreibungsinformationen übereinstimmt",
"PluginGatewayError": "Entschuldigung, es ist ein Fehler im Plugin-Gateway aufgetreten. Bitte überprüfen Sie die Plugin-Gateway-Konfiguration auf Richtigkeit",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Entschuldigung, die Initialisierung des OpenAPI-Clients ist fehlgeschlagen. Bitte überprüfen Sie die Konfigurationsinformationen des OpenAPI auf Richtigkeit",
"PluginServerError": "Fehler bei der Serveranfrage des Plugins. Bitte überprüfen Sie die Fehlerinformationen unten in Ihrer Plugin-Beschreibungsdatei, Plugin-Konfiguration oder Serverimplementierung",
"PluginSettingsInvalid": "Das Plugin muss korrekt konfiguriert werden, um verwendet werden zu können. Bitte überprüfen Sie Ihre Konfiguration auf Richtigkeit",
- "TogetherAIBizError": "Fehler bei der Anforderung des TogetherAI AI-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "ZeroOneBizError": "Anfrage an ZeroOneBiz-Dienst fehlgeschlagen. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
- "ZhipuBizError": "Es ist ein Fehler bei der Anforderung des Zhipu-Dienstes aufgetreten. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut."
+ "ProviderBizError": "Fehler bei der Anforderung des {{provider}}-Dienstes. Bitte überprüfen Sie die folgenden Informationen oder versuchen Sie es erneut."
},
"stt": {
"responseError": "Serviceanfrage fehlgeschlagen. Bitte überprüfen Sie die Konfiguration oder versuchen Sie es erneut"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Fügen Sie die OpenAI-Proxy-URL hinzu (optional)",
+ "apiKey": {
+ "description": "Geben Sie Ihren {{name}} API-Schlüssel ein, um die Sitzung zu starten.",
+ "title": "Verwenden Sie Ihren benutzerdefinierten {{name}} API-Schlüssel"
+ },
"closeMessage": "Hinweis schließen",
"confirm": "Bestätigen und erneut versuchen",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Anmelden",
"welcome": "Willkommen!"
},
- "ollama": {
- "cancel": "Abbrechen",
- "confirm": "Herunterladen",
- "description": "Geben Sie Ihre Ollama-Modellkennung ein, um fortzufahren",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Download startet...",
- "title": "Bestimmtes Ollama-Modell herunterladen"
- },
"password": {
"description": "Der Administrator hat die App-Verschlüsselung aktiviert. Gib das App-Passwort ein, um die App zu entsperren. Das Passwort muss nur einmal eingegeben werden.",
"placeholder": "Passwort eingeben",
@@ -132,5 +107,9 @@
"apiKey": "Benutzerdefinierter API-Schlüssel",
"password": "Passwort"
}
+ },
+ "upload": {
+ "desc": "Details: {{detail}}",
+ "title": "Dateiupload fehlgeschlagen. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es später erneut."
}
}
diff --git a/locales/de-DE/metadata.json b/locales/de-DE/metadata.json
new file mode 100644
index 000000000000..94cec38e833c
--- /dev/null
+++ b/locales/de-DE/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat bietet Ihnen das beste ChatGPT-, OLLaMA-, Gemini- und Claude-WebUI-Nutzererlebnis.",
+ "title": "LobeChat: Persönliches LLM-Produktivitätstool, um deinem Gehirn mehr Intelligenz zu verleihen"
+ },
+ "market": {
+ "description": "Inhalts-Erstellung, Copywriting, Fragen & Antworten, Bildgenerierung, Videogenerierung, Sprachgenerierung, intelligente Agenten, Automatisierungs-Workflows - gestalten Sie Ihren eigenen AI / GPTs / OLLaMA intelligenten Assistenten",
+ "title": "Assistentenmarkt"
+ },
+ "plugins": {
+ "description": "Suche, Diagrammerstellung, Akademisch, Bildgenerierung, Videogenerierung, Sprachgenerierung, Automatisierungs-Workflows - passen Sie die exklusiven ToolCall-Plugin-Fähigkeiten für ChatGPT / OLLaMA an",
+ "title": "Plugin-Markt"
+ },
+ "welcome": {
+ "description": "LobeChat bietet Ihnen das beste ChatGPT-, OLLaMA-, Gemini- und Claude-WebUI-Nutzererlebnis.",
+ "title": "Willkommen bei LobeChat: Persönliches LLM-Produktivitätstool, um deinem Gehirn mehr Intelligenz zu verleihen"
+ }
+}
diff --git a/locales/de-DE/modelProvider.json b/locales/de-DE/modelProvider.json
index 5fb4f32af92e..1984d79d96f1 100644
--- a/locales/de-DE/modelProvider.json
+++ b/locales/de-DE/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Muss neben der Standardadresse auch http(s):// enthalten",
- "placeholder": "https://api.anthropic.com",
- "title": "API-Proxy-Adresse"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Anthropic ein",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Anthropic-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Anthropic-API-Schlüssel"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Die API-Version von Azure im Format JJJJ-MM-TT, siehe [neueste Version](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Diesen Wert finden Sie im Abschnitt 'Schlüssel und Endpunkte', wenn Sie in Azure Portal Ihre Ressource überprüfen. Sie können KEY1 oder KEY2 verwenden",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Azure OpenAI-API-Schlüssel ein, um das Gespräch zu beginnen",
- "title": "Verwenden Sie einen individuellen Azure OpenAI-API-Schlüssel"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Verwenden Sie benutzerdefinierte Bedrock-Authentifizierungsinformationen"
}
},
- "google": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Google ein",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Google-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Google-API-Schlüssel"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Groq ein",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Groq-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Groq-API-Schlüssel"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Geben Sie Ihren API-Schlüssel von Minimax ein",
- "placeholder": "Minimax API-Schlüssel",
- "title": "API-Schlüssel"
- },
- "unlock": {
- "description": "Geben Sie Ihren Minimax API-Schlüssel ein, um die Sitzung zu starten. Die Anwendung speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen benutzerdefinierten Minimax API-Schlüssel"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Mistral AI ein",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Mistral AI-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Mistral AI-API-Schlüssel"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Moonshot AI ein",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Moonshot AI-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Moonshot AI-API-Schlüssel"
- }
- },
"ollama": {
"checker": {
- "desc": "Testen Sie, ob die Proxy-Adresse korrekt eingetragen wurde"
+ "desc": "Testen Sie, ob die Proxy-Adresse korrekt eingetragen wurde",
+ "title": "Konnektivitätsprüfung"
},
"customModelName": {
"desc": "Fügen Sie benutzerdefinierte Modelle hinzu, trennen Sie mehrere Modelle mit Kommas (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Benutzerdefinierte Modellnamen"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Geben Sie die Proxy-Adresse der Ollama-Schnittstelle ein, leer lassen, wenn lokal nicht spezifiziert",
- "placeholder": "http://127.0.0.1:11434",
"title": "Schnittstellen-Proxy-Adresse"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Vorschau)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Muss neben der Standardadresse auch http(s):// enthalten",
- "placeholder": "https://api.openai.com/v1",
- "title": "Schnittstellen-Proxy-Adresse"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Verwenden Sie Ihren eigenen OpenAI-Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen OpenAI-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen OpenAI-API-Schlüssel"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Testen Sie, ob die Proxy-Adresse korrekt eingetragen wurde"
- },
- "customModelName": {
- "desc": "Fügen Sie benutzerdefinierte Modelle hinzu, trennen Sie mehrere Modelle mit Kommas (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Benutzerdefinierte Modellnamen"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Geben Sie Ihren API-Key von OpenRouter AI ein",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen OpenRouter-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen OpenRouter-API-Schlüssel"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Perplexity AI ein",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Geben Sie Ihren individuellen Perplexity-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Perplexity-API-Schlüssel"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Testen Sie, ob die Proxy-Adresse korrekt eingetragen wurde"
- },
- "customModelName": {
- "desc": "Fügen Sie benutzerdefinierte Modelle hinzu, trennen Sie mehrere Modelle mit Kommas (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Benutzerdefinierte Modellnamen"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Geben Sie Ihren API-Key von TogetherAI AI ein",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen TogetherAI-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen TogetherAI-API-Schlüssel"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Alles und Nichts",
- "token": {
- "desc": "Geben Sie Ihren API-Key von 01.AI Alles und Nichts ein",
- "placeholder": "01.AI Alles und Nichts API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen ZeroOne-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen ZeroOne-API-Schlüssel"
- }
+ "title": "01.AI Alles und Nichts"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Geben Sie Ihren API-Key von Zhipu ein",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Geben Sie Ihren individuellen Zhipu-API-Schlüssel ein, um das Gespräch zu beginnen. Die App speichert Ihren API-Schlüssel nicht.",
- "title": "Verwenden Sie einen individuellen Zhipu-API-Schlüssel"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/de-DE/plugin.json b/locales/de-DE/plugin.json
index 5ae97802181f..647789272aa8 100644
--- a/locales/de-DE/plugin.json
+++ b/locales/de-DE/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Funktionsaufruf",
"off": "Debugging deaktivieren",
"on": "Plugin-Aufrufinformationen anzeigen",
- "response": "Antwort"
+ "payload": "Plugin-Payload",
+ "response": "Antwort",
+ "tool_call": "Tool Call Request"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin wird ausgeführt..."
},
"pluginList": "Plugin-Liste",
- "plugins": {
- "loading": "Plugins werden überprüft...",
- "unknown": "Unbekanntes Plugin"
- },
"setting": "Plugin-Einstellung",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installiert"
},
"title": "Plugin-Shop"
- }
+ },
+ "unknownPlugin": "Unbekanntes Plugin"
}
diff --git a/locales/de-DE/setting.json b/locales/de-DE/setting.json
index 9b0e9016d657..3c5b8e4eb880 100644
--- a/locales/de-DE/setting.json
+++ b/locales/de-DE/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Über"
},
+ "agentTab": {
+ "chat": "Chat-Präferenz",
+ "meta": "Assistenteninformation",
+ "modal": "Modell-Einstellungen",
+ "plugin": "Plugin-Einstellungen",
+ "prompt": "Rollenkonfiguration",
+ "tts": "Sprachdienst"
+ },
"analytics": {
"telemetry": {
"desc": "Durch das Senden von Telemetriedaten können Sie uns dabei helfen, die Gesamtnutzererfahrung von LobeChat zu verbessern",
@@ -35,10 +43,14 @@
"title": "Einstellungen"
},
"llm": {
+ "apiKey": {
+ "desc": "Bitte geben Sie Ihren {{name}} API-Schlüssel ein",
+ "placeholder": "{{name}} API-Schlüssel",
+ "title": "API-Schlüssel"
+ },
"checker": {
"button": "Überprüfen",
"desc": "Überprüfen Sie, ob der API-Schlüssel und die Proxy-Adresse korrekt eingegeben wurden",
- "ollamaDesc": "Testen Sie, ob die Proxy-Adresse korrekt eingegeben wurde",
"pass": "Überprüfung bestanden",
"title": "Konnektivitätsprüfung"
},
@@ -90,22 +102,19 @@
"latestTime": "Letzte Aktualisierung: {{time}}",
"noLatestTime": "Liste noch nicht abgerufen"
},
+ "helpDoc": "Konfigurationsanleitung",
"modelList": {
"desc": "Wählen Sie die Modelle aus, die in der Sitzung angezeigt werden sollen. Die ausgewählten Modelle werden in der Modellliste angezeigt.",
"placeholder": "Wählen Sie ein Modell aus der Liste aus",
"title": "Modellliste",
"total": "Insgesamt {{count}} Modelle verfügbar"
},
+ "proxyUrl": {
+ "desc": "Außer der Standardadresse muss http(s):// enthalten sein",
+ "title": "API-Proxy-Adresse"
+ },
"waitingForMore": "Weitere Modelle werden <1>geplant1>, bitte freuen Sie sich auf weitere Updates ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama lädt dieses Modell herunter. Bitte schließen Sie diese Seite nicht. Der Download wird an der abgebrochenen Stelle fortgesetzt, wenn Sie ihn erneut starten.",
- "remainingTime": "Verbleibende Zeit",
- "speed": "Download-Geschwindigkeit",
- "title": "Modell {{model}} wird heruntergeladen"
- }
- },
"plugin": {
"addTooltip": "Benutzerdefiniertes Plugin",
"clearDeprecated": "Entfernen Sie ungültige Plugins",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Unbegrenzt",
"limited": "Enthält nur {{number}} Gesprächsnachrichten",
+ "setlimited": "Setzen Sie die begrenzte Anzahl von Nachrichten",
"title": "Historiennachrichten begrenzen",
"unlimited": "Unbegrenzte Historiennachrichten"
},
@@ -356,6 +366,24 @@
"title": "WebRTC-Synchronisierung"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Assistentenmetadaten-Generierungsmodell",
+ "modelDesc": "Das Modell, das zur Generierung von Assistentennamen, -beschreibungen, -avatars und -tags verwendet wird",
+ "title": "Automatische Generierung von Assistenteninformationen"
+ },
+ "title": "Systemassistent",
+ "topic": {
+ "label": "Themenbenennungsmodell",
+ "modelDesc": "Das Modell, das für die automatische Umbenennung von Themen verwendet wird",
+ "title": "Automatische Themenbenennung"
+ },
+ "translation": {
+ "label": "Übersetzungsmodell",
+ "modelDesc": "Das für die Übersetzung verwendete Modell",
+ "title": "Einstellungen für Übersetzungsassistent"
+ }
+ },
"tab": {
"about": "Über",
"agent": "Standard-Assistent",
@@ -363,6 +391,7 @@
"experiment": "Experiment",
"llm": "Sprachmodell",
"sync": "Cloud-Synchronisierung",
+ "system-agent": "Systemassistent",
"tts": "Sprachdienste"
},
"tools": {
diff --git a/locales/de-DE/tool.json b/locales/de-DE/tool.json
index eaadb6d25850..02a9c5e5518b 100644
--- a/locales/de-DE/tool.json
+++ b/locales/de-DE/tool.json
@@ -4,6 +4,7 @@
"downloading": "Die von DallE3 generierten Bildlinks sind nur 1 Stunde lang gültig. Das Bild wird lokal zwischengespeichert...",
"generate": "Generieren",
"generating": "Generiert",
- "images": "Bilder:"
+ "images": "Bilder:",
+ "prompt": "Hinweiswort"
}
}
diff --git a/locales/en-US/auth.json b/locales/en-US/auth.json
index 5e2b68c636a1..d363724add3e 100644
--- a/locales/en-US/auth.json
+++ b/locales/en-US/auth.json
@@ -1,6 +1,8 @@
{
"login": "Login",
"loginOrSignup": "Log in / Sign up",
+ "profile": "Profile",
+ "security": "Security",
"signout": "Sign out",
"signup": "Sign up"
}
diff --git a/locales/en-US/chat.json b/locales/en-US/chat.json
index 1a653f5be6a7..b068f3504cb0 100644
--- a/locales/en-US/chat.json
+++ b/locales/en-US/chat.json
@@ -2,16 +2,17 @@
"ModelSwitch": {
"title": "Model"
},
- "agentDefaultMessage": "Hello, I'm **{{name}}**. You can start chatting with me right away, or go to [Agent Settings](/chat/settings#session={{id}}) to complete my information.",
+ "agentDefaultMessage": "Hello, I'm **{{name}}**. You can start chatting with me right away, or go to [Assistant Settings](/chat/settings#session={{id}}) to complete my information.",
"agentDefaultMessageWithSystemRole": "Hello, I'm **{{name}}**, {{systemRole}}. Let's start chatting!",
+ "agentsAndConversations": "Assistants and Conversations",
"backToBottom": "Back to bottom",
"clearCurrentMessages": "Clear current session messages",
"confirmClearCurrentMessages": "You are about to clear the current session messages. Once cleared, they cannot be retrieved. Please confirm your action.",
- "confirmRemoveSessionItemAlert": "You are about to delete this agent. Once deleted, it cannot be retrieved. Please confirm your action.",
- "confirmRemoveSessionSuccess": "Agent removed successfully",
- "defaultAgent": "Default Agent",
+ "confirmRemoveSessionItemAlert": "You are about to delete this assistant. Once deleted, it cannot be retrieved. Please confirm your action.",
+ "confirmRemoveSessionSuccess": "Assistant removed successfully",
+ "defaultAgent": "Default Assistant",
"defaultList": "Default List",
- "defaultSession": "Default Agent",
+ "defaultSession": "Default Assistant",
"duplicateSession": {
"loading": "Copying...",
"success": "Copy successful",
@@ -21,7 +22,7 @@
"emptyAgent": "No assistant available",
"historyRange": "History Range",
"inbox": {
- "desc": "Activate the brain cluster and spark creative thinking. Your virtual agent is here to communicate with you about everything.",
+ "desc": "Activate the brain cluster and spark creative thinking. Your virtual assistant is here to communicate with you about everything.",
"title": "Just Chat"
},
"input": {
@@ -38,21 +39,20 @@
"delAndRegenerate": "Delete and Regenerate",
"regenerate": "Regenerate"
},
- "newAgent": "New Agent",
- "noDescription": "No description available",
+ "newAgent": "New Assistant",
"pin": "Pin",
"pinOff": "Unpin",
"regenerate": "Regenerate",
"roleAndArchive": "Role and Archive",
- "searchAgentPlaceholder": "Search agents and conversations...",
+ "searchAgentPlaceholder": "Search assistants and conversations...",
"sendPlaceholder": "Type your message here...",
"sessionGroup": {
"config": "Group Management",
- "confirmRemoveGroupAlert": "This group is about to be deleted. After deletion, the agents in this group will be moved to the default list. Please confirm your operation.",
- "createAgentSuccess": "Agent created successfully",
+ "confirmRemoveGroupAlert": "This group is about to be deleted. After deletion, the assistants in this group will be moved to the default list. Please confirm your operation.",
+ "createAgentSuccess": "Assistant created successfully",
"createGroup": "Add New Group",
"createSuccess": "Created successfully",
- "creatingAgent": "Creating agent...",
+ "creatingAgent": "Creating assistant...",
"inputPlaceholder": "Please enter group name...",
"moveGroup": "Move to Group",
"newGroup": "New Group",
@@ -71,7 +71,7 @@
"withBackground": "Include Background Image",
"withFooter": "Include Footer",
"withPluginInfo": "Include Plugin Information",
- "withSystemRole": "Include Agent Role Setting"
+ "withSystemRole": "Include Assistant Role Setting"
},
"stt": {
"action": "Voice Input",
@@ -83,6 +83,7 @@
"chats": "Chat Messages",
"rest": "Remaining",
"systemRole": "Role Settings",
+ "title": "Context Details",
"tools": "Plugin Settings",
"total": "Total Available",
"used": "Total Used"
@@ -123,7 +124,7 @@
"action": "Text-to-Speech",
"clear": "Clear Speech"
},
- "updateAgent": "Update Agent Information",
+ "updateAgent": "Update Assistant Information",
"upload": {
"actionFiletip": "Update File",
"actionTooltip": "Upload Image",
diff --git a/locales/en-US/common.json b/locales/en-US/common.json
index 540b39ec6342..9e3f6085b389 100644
--- a/locales/en-US/common.json
+++ b/locales/en-US/common.json
@@ -1,14 +1,15 @@
{
"about": "About",
"advanceSettings": "Advanced Settings",
- "appInitializing": "LobeChat is initializing, please wait...",
+ "appInitializing": "The application is initializing, please wait patiently...",
"autoGenerate": "Auto Generate",
- "autoGenerateTooltip": "Auto-generate agent description based on prompts",
+ "autoGenerateTooltip": "Auto-generate assistant description based on prompts",
"autoGenerateTooltipDisabled": "Please enter a tooltip before using the autocomplete feature",
"blog": "Product Blog",
"cancel": "Cancel",
"changelog": "Changelog",
"close": "Close",
+ "contact": "Contact Us",
"copy": "Copy",
"copyFail": "Copy failed",
"copySuccess": "Copied successfully",
@@ -18,27 +19,50 @@
"today": "Today's New",
"topics": "Topics"
},
- "defaultAgent": "Default Agent",
- "defaultSession": "Default Agent",
+ "defaultAgent": "Default Assistant",
+ "defaultSession": "Default Assistant",
"delete": "Delete",
"document": "User Manual",
"duplicate": "Create Duplicate",
"edit": "Edit",
"export": "Export Configuration",
"exportType": {
- "agent": "Export Agent Settings",
- "agentWithMessage": "Export Agent and Messages",
- "all": "Export Global Settings and All Agent Data",
- "allAgent": "Export All Agent Settings",
- "allAgentWithMessage": "Export All Agents and Messages",
+ "agent": "Export Assistant Settings",
+ "agentWithMessage": "Export Assistant and Messages",
+ "all": "Export Global Settings and All Assistant Data",
+ "allAgent": "Export All Assistant Settings",
+ "allAgentWithMessage": "Export All Assistants and Messages",
"globalSetting": "Export Global Settings"
},
"feedback": "Feedback",
"follow": "Follow us on {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Share Your Valuable Feedback",
+ "star": "Star on GitHub"
+ },
+ "and": "and",
+ "feedback": {
+ "action": "Share Feedback",
+ "desc": "Every idea and suggestion from you is precious to us. We can't wait to hear your thoughts! Feel free to contact us to provide feedback on product features and user experience, helping us make LobeChat even better.",
+ "title": "Share Your Valuable Feedback on GitHub"
+ },
+ "later": "Later",
+ "star": {
+ "action": "Star It",
+ "desc": "If you love our product and want to support us, could you go to GitHub and give us a star? This small gesture means a lot to us and motivates us to continue providing you with great experiences.",
+ "title": "Star Us on GitHub"
+ },
+ "title": "Like Our Product?"
+ },
"fullscreen": "Full Screen Mode",
"historyRange": "History Range",
"import": "Import Configuration",
"importModal": {
+ "error": {
+ "desc": "Sorry, an error occurred during the data import process. Please try importing again, or <1>submit a request1>, and we will help you troubleshoot the issue as soon as possible.",
+ "title": "Data Import Failed"
+ },
"finish": {
"onlySettings": "System settings imported successfully",
"start": "Start using",
@@ -46,18 +70,26 @@
"title": "Data import completed"
},
"loading": "Data importing, please wait...",
+ "preparing": "Data import module is preparing...",
"result": {
"added": "Imported successfully",
"errors": "Import errors",
"messages": "Messages",
"sessionGroups": "Groups",
- "sessions": "Agents",
+ "sessions": "Assistants",
"skips": "Duplicates skipped",
"topics": "Topics",
"type": "Data Type"
},
- "title": "Import Data"
+ "title": "Import Data",
+ "uploading": {
+ "desc": "The current file is large, and is being uploaded...",
+ "restTime": "Time remaining",
+ "speed": "Upload speed"
+ }
},
+ "information": "Community and News",
+ "installPWA": "Install browser app",
"lang": {
"ar": "Arabic",
"bg-BG": "Bulgarian",
@@ -96,7 +128,11 @@
"zh-TW": "Traditional Chinese"
},
"layoutInitializing": "Initializing layout...",
- "noDescription": "No description available",
+ "legal": "Legal Disclaimer",
+ "mail": {
+ "business": "Business Cooperation",
+ "support": "Email Support"
+ },
"oauth": "SSO Login",
"officialSite": "Official Website",
"ok": "OK",
@@ -160,7 +196,7 @@
},
"temp": "Temporary",
"terms": "Terms of Service",
- "updateAgent": "Update Agent Information",
+ "updateAgent": "Update Assistant Information",
"upgradeVersion": {
"action": "Upgrade",
"hasNew": "New update available",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Anonymous User",
"billing": "Billing Management",
+ "data": "Data Storage",
"defaultNickname": "Community User",
"discord": "Community Support",
"docs": "Documentation",
@@ -181,5 +218,6 @@
"profile": "Account Management",
"setting": "App Settings",
"usages": "Usage Statistics"
- }
+ },
+ "version": "Version"
}
diff --git a/locales/en-US/components.json b/locales/en-US/components.json
index 81d811b2b1a7..039be80fa7f3 100644
--- a/locales/en-US/components.json
+++ b/locales/en-US/components.json
@@ -6,7 +6,8 @@
"functionCall": "This model supports function call.",
"tokens": "This model supports up to {{tokens}} tokens in a single session.",
"vision": "This model supports visual recognition."
- }
+ },
+ "removed": "The model is not in the list. It will be automatically removed if deselected."
},
"ModelSwitchPanel": {
"emptyModel": "No enabled model. Please go to settings to enable.",
diff --git a/locales/en-US/error.json b/locales/en-US/error.json
index f98a5e13db43..95ee2c9d4bd9 100644
--- a/locales/en-US/error.json
+++ b/locales/en-US/error.json
@@ -12,6 +12,8 @@
"retry": "Reload",
"title": "Oops, something went wrong.."
},
+ "fetchError": "Request Failed",
+ "fetchErrorDetail": "Error Details",
"notFound": {
"backHome": "Back to Home",
"desc": "We couldn't find the page you're looking for, please check if the link is correct",
@@ -52,37 +54,16 @@
"503": "Sorry, the server is currently unable to process your request, possibly due to overload or maintenance. Please try again later.",
"504": "Sorry, the server did not receive a response from the upstream server. Please try again later.",
"AgentRuntimeError": "Lobe language model runtime execution error. Please troubleshoot or retry based on the following information.",
- "AnthropicBizError": "Error requesting Anthropic service. Please troubleshoot or retry based on the following information.",
- "AzureBizError": "Error requesting Azure AI service. Please troubleshoot or retry based on the following information.",
- "BedrockBizError": "Error requesting Bedrock service. Please troubleshoot or retry based on the following information.",
- "GoogleBizError": "Error requesting Google service. Please troubleshoot or retry based on the following information.",
- "GroqBizError": "Error occurred while requesting Groq service. Please troubleshoot based on the following information or retry.",
"InvalidAccessCode": "Invalid access code or empty. Please enter the correct access code or add a custom API Key.",
- "InvalidAnthropicAPIKey": "The Anthropic API Key is incorrect or empty. Please check the Anthropic API Key and retry.",
- "InvalidAzureAPIKey": "Azure API Key is incorrect or empty. Please check the Azure API Key and retry.",
"InvalidBedrockCredentials": "Bedrock authentication failed. Please check the AccessKeyId/SecretAccessKey and retry.",
"InvalidClerkUser": "Sorry, you are not currently logged in. Please log in or register an account to continue.",
- "InvalidGoogleAPIKey": "Google API Key is incorrect or empty. Please check the Google API Key and retry.",
- "InvalidGroqAPIKey": "Groq API Key is incorrect or empty. Please check the Groq API Key and retry.",
- "InvalidMinimaxAPIKey": "Incorrect or empty Minimax API Key, please check the Minimax API Key and try again",
- "InvalidMistralAPIKey": "Incorrect or empty Mistral AI API Key. Please check your Mistral API Key and try again.",
- "InvalidMoonshotAPIKey": "The Moonshot AI API Key is incorrect or empty, please check the Moonshot API Key and try again.",
"InvalidOllamaArgs": "Invalid Ollama configuration, please check Ollama configuration and try again",
- "InvalidOpenRouterAPIKey": "Invalid or empty OpenRouter API Key. Please check your OpenRouter API Key and try again.",
- "InvalidPerplexityAPIKey": "Perplexity API Key is incorrect or empty. Please check the Perplexity API Key and retry.",
- "InvalidTogetherAIAPIKey": "Invalid or empty TogetherAI API Key. Please check your TogetherAI API Key and try again.",
- "InvalidZeroOneAPIKey": "01-AI API Key is incorrect or empty. Please check the 01-AI API Key and retry.",
- "InvalidZhipuAPIKey": "Zhipu API Key is incorrect or empty. Please check the Zhipu API Key and retry.",
+ "InvalidProviderAPIKey": "{{provider}} API Key is incorrect or empty, please check your {{provider}} API Key and try again",
"LocationNotSupportError": "We're sorry, your current location does not support this model service. This may be due to regional restrictions or the service not being available. Please confirm if the current location supports using this service, or try using a different location.",
- "MinimaxBizError": "Error occurred while requesting Minimax service, please troubleshoot or retry based on the following information",
- "MistralBizError": "Error occurred while requesting Mistral AI service. Please troubleshoot based on the following information or retry.",
- "MoonshotBizError": "There was an error with the Moonshot service, please troubleshoot or retry based on the following information.",
"NoOpenAIAPIKey": "OpenAI API Key is empty, please add a custom OpenAI API Key",
"OllamaBizError": "Error requesting Ollama service, please troubleshoot or retry based on the following information",
"OllamaServiceUnavailable": "Ollama service is unavailable. Please check if Ollama is running properly or if the cross-origin configuration of Ollama is set correctly.",
- "OpenAIBizError": "Error requesting OpenAI service. Please troubleshoot or retry based on the following information.",
- "OpenRouterBizError": "Error requesting OpenRouter AI service. Please troubleshoot or retry based on the following information.",
- "PerplexityBizError": "Error requesting Perplexity AI service. Please troubleshoot or retry based on the following information.",
+ "OpenAIBizError": "Error requesting OpenAI service, please troubleshoot or retry based on the following information",
"PluginApiNotFound": "Sorry, the API does not exist in the plugin's manifest. Please check if your request method matches the plugin manifest API",
"PluginApiParamsError": "Sorry, the input parameter validation for the plugin request failed. Please check if the input parameters match the API description",
"PluginGatewayError": "Sorry, there was an error with the plugin gateway. Please check if the plugin gateway configuration is correct.",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Sorry, the OpenAPI client failed to initialize. Please check if the OpenAPI configuration information is correct.",
"PluginServerError": "Plugin server request returned an error. Please check your plugin manifest file, plugin configuration, or server implementation based on the error information below",
"PluginSettingsInvalid": "This plugin needs to be correctly configured before it can be used. Please check if your configuration is correct",
- "TogetherAIBizError": "Error requesting TogetherAI AI service. Please troubleshoot or retry based on the following information.",
- "ZeroOneBizError": "Error requesting 01-AI service. Please troubleshoot or retry based on the following information.",
- "ZhipuBizError": "Error requesting Zhipu service. Please troubleshoot or retry based on the following information."
+ "ProviderBizError": "Error requesting {{provider}} service, please troubleshoot or retry based on the following information"
},
"stt": {
"responseError": "Service request failed, please check the configuration or try again"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Add OpenAI proxy URL (optional)",
+ "apiKey": {
+ "description": "Enter your {{name}} API Key to start the session",
+ "title": "Use custom {{name}} API Key"
+ },
"closeMessage": "Close message",
"confirm": "Confirm and Retry",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Log in to your account",
"welcome": "Welcome!"
},
- "ollama": {
- "cancel": "Cancel Download",
- "confirm": "Download",
- "description": "Enter your Ollama model tag to proceed with the conversation",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Starting download...",
- "title": "Download Specific Ollama Model"
- },
"password": {
"description": "The application encryption has been enabled by the administrator. Enter the application password to unlock the application. The password only needs to be filled in once.",
"placeholder": "Please enter password",
@@ -132,5 +107,9 @@
"apiKey": "Custom API Key",
"password": "Password"
}
+ },
+ "upload": {
+ "desc": "Details: {{detail}}",
+ "title": "File upload failed. Please check your network connection or try again later"
}
}
diff --git a/locales/en-US/market.json b/locales/en-US/market.json
index 7361584717af..5b49ec336cf1 100644
--- a/locales/en-US/market.json
+++ b/locales/en-US/market.json
@@ -1,6 +1,6 @@
{
- "addAgent": "Add Agent",
- "addAgentAndConverse": "Add Agent and Converse",
+ "addAgent": "Add Assistant",
+ "addAgentAndConverse": "Add Assistant and Converse",
"addAgentSuccess": "Successfully Added",
"guide": {
"func1": {
@@ -17,16 +17,16 @@
}
},
"search": {
- "placeholder": "Search agent name, description or keywords..."
+ "placeholder": "Search assistant name, description or keywords..."
},
"sidebar": {
"comment": "Comments",
"prompt": "Prompts",
- "title": "Agent Details"
+ "title": "Assistant Details"
},
- "submitAgent": "Submit Agent",
+ "submitAgent": "Submit Assistant",
"title": {
- "allAgents": "All Agents",
+ "allAgents": "All Assistants",
"recentSubmits": "Recent Submits"
}
}
diff --git a/locales/en-US/metadata.json b/locales/en-US/metadata.json
new file mode 100644
index 000000000000..a6f8bedd8163
--- /dev/null
+++ b/locales/en-US/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offers you the best ChatGPT, OLLaMA, Gemini, Claude WebUI user experience",
+ "title": "LobeChat: Personal LLM Productivity Tool, Give Yourself a Smarter Brain"
+ },
+ "market": {
+ "description": "Content creation, copywriting, Q&A, image generation, video generation, voice generation, smart assistants, automation workflows, customize your own AI / GPTs / OLLaMA intelligent assistant",
+ "title": "Assistant Market"
+ },
+ "plugins": {
+ "description": "Search, chart generation, academic, image generation, video generation, voice generation, automation workflows, customize ChatGPT / OLLaMA exclusive ToolCall plugin capabilities",
+ "title": "Plugin Market"
+ },
+ "welcome": {
+ "description": "LobeChat offers you the best ChatGPT, OLLaMA, Gemini, Claude WebUI user experience",
+ "title": "Welcome to LobeChat: Personal LLM Productivity Tool, Give Yourself a Smarter Brain"
+ }
+}
diff --git a/locales/en-US/modelProvider.json b/locales/en-US/modelProvider.json
index 5eb0055fe7c7..0dca43e992ca 100644
--- a/locales/en-US/modelProvider.json
+++ b/locales/en-US/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Must include http(s):// in addition to the default address",
- "placeholder": "https://api.anthropic.com",
- "title": "API Proxy Address"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Enter the API Key from Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Anthropic API Key to start the session. The app will not store your API Key",
- "title": "Use Custom Anthropic API Key"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure API version, follow the format YYYY-MM-DD, check the [latest version](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "When checking resources from the Azure portal, you can find this value in the 'Keys and Endpoints' section. You can use KEY1 or KEY2",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Enter your Azure OpenAI API Key to start the session",
- "title": "Use Custom Azure OpenAI API Key"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Use Custom Bedrock Authentication Information"
}
},
- "google": {
- "endpoint": {
- "desc": "Must include http(s):// besides the default address",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API Proxy Address"
- },
- "title": "Google",
- "token": {
- "desc": "Enter the API Key from Google",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Google API Key to start the session. The app will not store your API Key",
- "title": "Use Custom Google API Key"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Enter the API Key from Groq",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Groq API Key to start the session. The app will not store your API Key",
- "title": "Use Custom Groq API Key"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Enter your API Key from Minimax",
- "placeholder": "Minimax API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Minimax API Key to start the session. The app will not store your API Key.",
- "title": "Use Custom Minimax API Key"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Enter the API Key from Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Mistral AI API Key to start the session. The app will not store your API Key",
- "title": "Use Custom Mistral AI API Key"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Enter your API Key from Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Moonshot AI API Key to start the session. The app will not store your API Key",
- "title": "Use custom Moonshot AI API Key"
- }
- },
"ollama": {
"checker": {
- "desc": "Test if the proxy address is correctly filled in"
+ "desc": "Test if the proxy address is correctly filled in",
+ "title": "Connectivity Check"
},
"customModelName": {
"desc": "Add custom models, separate multiple models with commas",
"placeholder": "vicuna, llava, codellama, llama2:13b-text",
"title": "Custom model name"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Enter the Ollama interface proxy address, leave blank if not specified locally",
- "placeholder": "http://127.0.0.1:11434",
"title": "Interface proxy address"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Preview)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Must include http(s):// besides the default address",
- "placeholder": "https://api.openai.com/v1",
- "title": "Interface proxy address"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Use your own OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "Enter your OpenAI API Key to start the session. The app will not store your API Key",
- "title": "Use custom OpenAI API Key"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Test if the proxy address is correctly filled in"
- },
- "customModelName": {
- "desc": "Add custom models, separate multiple models with commas",
- "placeholder": "mistralai/mistral-7b-instruct:free, openchat/openchat-7b:free",
- "title": "Custom model name"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Enter your API Key from OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your OpenRouter API Key to start the session. The app will not store your API Key",
- "title": "Use custom OpenRouter API Key"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Enter your API Key from Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Enter your Perplexity API Key to start the session. The app will not store your API Key",
- "title": "Use custom Perplexity API Key"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Test if the proxy address is correctly filled in"
- },
- "customModelName": {
- "desc": "Add custom models, separate multiple models with commas",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct, teknium/OpenHermes-2-Mistral-7B",
- "title": "Custom model name"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Enter your API Key from TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your TogetherAI API Key to start the session. The app will not store your API Key",
- "title": "Use custom TogetherAI API Key"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Zero One Everything",
- "token": {
- "desc": "Enter the API Key from 01.AI Zero One Everything",
- "placeholder": "01.AI Zero One Everything API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your 01.AI Zero One Everything API Key to start the session. The app will not store your API Key.",
- "title": "Use Custom 01.AI Zero One Everything API Key"
- }
+ "title": "01.AI Zero One Everything"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Enter the API Key from Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Zhipu API Key to start the session. The app will not store your API Key.",
- "title": "Use Custom Zhipu API Key"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/en-US/plugin.json b/locales/en-US/plugin.json
index 35afb6d5c49e..9ada632581ef 100644
--- a/locales/en-US/plugin.json
+++ b/locales/en-US/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Function Call",
"off": "Turn off debug",
"on": "View plugin invocation information",
- "response": "Response"
+ "payload": "plugin payload",
+ "response": "Response",
+ "tool_call": "tool call request"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin is running..."
},
"pluginList": "Plugin List",
- "plugins": {
- "loading": "Detecting plugins...",
- "unknown": "Unknown Plugin"
- },
"setting": "Plugin Settings",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installed"
},
"title": "Plugin Store"
- }
+ },
+ "unknownPlugin": "Unknown plugin"
}
diff --git a/locales/en-US/setting.json b/locales/en-US/setting.json
index 962680e31477..50670ac41852 100644
--- a/locales/en-US/setting.json
+++ b/locales/en-US/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "About"
},
+ "agentTab": {
+ "chat": "Chat Preferences",
+ "meta": "Assistant Info",
+ "modal": "Model Settings",
+ "plugin": "Plugin Settings",
+ "prompt": "Role Configuration",
+ "tts": "Voice Service"
+ },
"analytics": {
"telemetry": {
"desc": "By opting to send telemetry data, you can help us improve the overall user experience of LobeChat",
@@ -13,7 +21,7 @@
"clear": {
"action": "Clear Now",
"confirm": "Confirm to clear all chat data?",
- "desc": "This will clear all session data, including agent, files, messages, plugins, etc.",
+ "desc": "This will clear all session data, including assistant, files, messages, plugins, etc.",
"success": "All session messages have been cleared",
"title": "Clear All Session Messages"
},
@@ -35,10 +43,14 @@
"title": "Settings"
},
"llm": {
+ "apiKey": {
+ "desc": "Please enter your {{name}} API Key",
+ "placeholder": "{{name}} API Key",
+ "title": "API Key"
+ },
"checker": {
"button": "Check",
"desc": "Test if the Api Key and proxy address are filled in correctly",
- "ollamaDesc": "Check if the proxy address is filled in correctly",
"pass": "Check Passed",
"title": "Connectivity Check"
},
@@ -90,22 +102,19 @@
"latestTime": "Last Updated: {{time}}",
"noLatestTime": "No list available yet"
},
+ "helpDoc": "Configuration Guide",
"modelList": {
"desc": "Select the models to display in the session. The selected models will be displayed in the model list.",
"placeholder": "Please select a model from the list",
"title": "Model List",
"total": "{{count}} models available in total"
},
+ "proxyUrl": {
+ "desc": "Must include http(s):// in addition to the default address",
+ "title": "API Proxy Address"
+ },
"waitingForMore": "More models are <1>planned to be added1>, stay tuned ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama is currently downloading the model. Please try not to close this page. It will resume from where it left off if you restart the download.",
- "remainingTime": "Remaining Time",
- "speed": "Download Speed",
- "title": "Downloading model {{model}}"
- }
- },
"plugin": {
"addTooltip": "Custom Plugin",
"clearDeprecated": "Remove Deprecated Plugins",
@@ -128,11 +137,11 @@
"title": "Background Color"
},
"description": {
- "placeholder": "Enter agent description",
- "title": "Agent Description"
+ "placeholder": "Enter assistant description",
+ "title": "Assistant Description"
},
"name": {
- "placeholder": "Enter agent name",
+ "placeholder": "Enter assistant name",
"title": "Name"
},
"prompt": {
@@ -143,7 +152,7 @@
"placeholder": "Enter tag",
"title": "Tag"
},
- "title": "Agent Information"
+ "title": "Assistant Information"
},
"settingChat": {
"autoCreateTopicThreshold": {
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Unlimited",
"limited": "Include only {{number}} conversation messages",
+ "setlimited": "Set limited history messages",
"title": "Limit History Message Count",
"unlimited": "Unlimited history message count"
},
@@ -279,7 +289,7 @@
"title": "Text-to-Speech Service"
},
"voice": {
- "desc": "Select a voice for the current agent, different TTS services support different voices",
+ "desc": "Select a voice for the current assistant, different TTS services support different voices",
"preview": "Voice Preview",
"title": "Text-to-Speech Voice"
}
@@ -316,11 +326,11 @@
"title": "Theme Settings"
},
"submitAgentModal": {
- "button": "Submit Agent",
- "identifier": "Agent Identifier",
- "metaMiss": "Please complete the agent information before submitting. It should include name, description, and tags",
- "placeholder": "Enter a unique identifier for the agent, e.g. web-development",
- "tooltips": "Share to the agent marketplace"
+ "button": "Submit Assistant",
+ "identifier": "Assistant Identifier",
+ "metaMiss": "Please complete the assistant information before submitting. It should include name, description, and tags",
+ "placeholder": "Enter a unique identifier for the assistant, e.g. web-development",
+ "tooltips": "Share to the assistant marketplace"
},
"sync": {
"device": {
@@ -356,13 +366,32 @@
"title": "WebRTC Sync"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Assistant Metadata Generation Model",
+ "modelDesc": "Model designated for generating assistant name, description, avatar, and tags",
+ "title": "Automatically Generate Assistant Information"
+ },
+ "title": "System Assistants",
+ "topic": {
+ "label": "Topic Naming Model",
+ "modelDesc": "Model designated for automatic topic renaming",
+ "title": "Automatic Topic Naming"
+ },
+ "translation": {
+ "label": "Translation Assistant",
+ "modelDesc": "Specific model for translate message",
+ "title": "Translation Settings"
+ }
+ },
"tab": {
"about": "About",
- "agent": "Default Agent",
+ "agent": "Default Assistant",
"common": "Common Settings",
"experiment": "Experiment",
"llm": "Language Model",
"sync": "Cloud Sync",
+ "system-agent": "System Assistant",
"tts": "Text-to-Speech"
},
"tools": {
diff --git a/locales/en-US/tool.json b/locales/en-US/tool.json
index 50d725ca0eb4..cb6c2f2d2e67 100644
--- a/locales/en-US/tool.json
+++ b/locales/en-US/tool.json
@@ -4,6 +4,7 @@
"downloading": "The image links generated by DALL·E3 are only valid for 1 hour, caching the images locally...",
"generate": "Generate",
"generating": "Generating...",
- "images": "Images:"
+ "images": "Images:",
+ "prompt": "提示词"
}
}
diff --git a/locales/en-US/welcome.json b/locales/en-US/welcome.json
index 5f27664e3179..1a48ad032f63 100644
--- a/locales/en-US/welcome.json
+++ b/locales/en-US/welcome.json
@@ -39,11 +39,11 @@
}
},
"header": "Welcome",
- "pickAgent": "Or choose from the following agent templates",
+ "pickAgent": "Or choose from the following assistant templates",
"skip": "Skip Creation",
"slogan": {
"desc1": "Pioneering the new age of thinking and creating. Built for you, the Super Individual.",
- "desc2": "Create your first agent and let's get started~",
+ "desc2": "Create your first assistant and let's get started~",
"title": "Unlock the superpower of your brain"
}
}
diff --git a/locales/es-ES/auth.json b/locales/es-ES/auth.json
index 7921d9c3b600..f62b3263fc62 100644
--- a/locales/es-ES/auth.json
+++ b/locales/es-ES/auth.json
@@ -1,6 +1,8 @@
{
"login": "Iniciar sesión",
"loginOrSignup": "Iniciar sesión / Registrarse",
+ "profile": "Perfil",
+ "security": "Seguridad",
"signout": "Cerrar sesión",
"signup": "Registrarse"
}
diff --git a/locales/es-ES/chat.json b/locales/es-ES/chat.json
index 39c5677df522..32bd0003d8fc 100644
--- a/locales/es-ES/chat.json
+++ b/locales/es-ES/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Hola, soy **{{name}}**, puedes comenzar a chatear conmigo de inmediato o ir a [Configuración del asistente](/chat/settings#session={{id}}) para completar mi información.",
"agentDefaultMessageWithSystemRole": "Hola, soy **{{name}}**, {{systemRole}}, ¡comencemos a chatear!",
+ "agentsAndConversations": "agentesYConversaciones",
"backToBottom": "Volver al fondo",
"clearCurrentMessages": "Borrar mensajes actuales",
"confirmClearCurrentMessages": "Estás a punto de borrar los mensajes de esta sesión. Una vez borrados, no se podrán recuperar. Por favor, confirma tu acción.",
@@ -39,7 +40,6 @@
"regenerate": "Regenerar"
},
"newAgent": "Nuevo asistente",
- "noDescription": "Sin descripción",
"pin": "Fijar",
"pinOff": "Desfijar",
"regenerate": "Regenerar",
@@ -83,6 +83,7 @@
"chats": "Mensajes de chat",
"rest": "Restante",
"systemRole": "Rol del sistema",
+ "title": "Detalles del token",
"tools": "Herramientas",
"total": "Total",
"used": "Utilizado"
diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json
index ec2005854e74..c16231109e90 100644
--- a/locales/es-ES/common.json
+++ b/locales/es-ES/common.json
@@ -1,7 +1,7 @@
{
"about": "Acerca de",
"advanceSettings": "Configuración avanzada",
- "appInitializing": "LobeChat está inicializando, por favor espere...",
+ "appInitializing": "Iniciando la aplicación, por favor espere...",
"autoGenerate": "Generación automática",
"autoGenerateTooltip": "Completar automáticamente la descripción del asistente basándose en las sugerencias",
"autoGenerateTooltipDisabled": "Por favor, complete la palabra clave antes de usar la función de autocompletar",
@@ -9,6 +9,7 @@
"cancel": "Cancelar",
"changelog": "Registro de cambios",
"close": "Cerrar",
+ "contact": "Contacto",
"copy": "Copiar",
"copyFail": "Fallo al copiar",
"copySuccess": "¡Copia exitosa!",
@@ -35,10 +36,33 @@
},
"feedback": "Comentarios y sugerencias",
"follow": "Síguenos en {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Comparte tus valiosas sugerencias",
+ "star": "Agrega una estrella en GitHub"
+ },
+ "and": "y",
+ "feedback": {
+ "action": "Compartir retroalimentación",
+ "desc": "Cada idea y sugerencia que nos brindes es invaluable. ¡Estamos ansiosos por conocer tu opinión! Siéntete libre de contactarnos para proporcionar comentarios sobre las funciones del producto y la experiencia de uso, ¡ayúdanos a mejorar LobeChat!",
+ "title": "Comparte tu valiosa retroalimentación en GitHub"
+ },
+ "later": "Más tarde",
+ "star": {
+ "action": "Destacar con una estrella",
+ "desc": "¿Te encanta nuestro producto y deseas apoyarnos? ¿Podrías agregar una estrella en GitHub? Este pequeño gesto significa mucho para nosotros y nos motiva a seguir brindándote una experiencia de características excepcional.",
+ "title": "Destaca con una estrella en GitHub"
+ },
+ "title": "¿Te gusta nuestro producto?"
+ },
"fullscreen": "Pantalla completa",
"historyRange": "Rango de historial",
"import": "Importar configuración",
"importModal": {
+ "error": {
+ "desc": "Lo sentimos mucho, se produjo un error durante el proceso de importación de datos. Inténtalo de nuevo o <1>envía un informe1>, y te ayudaremos a solucionar el problema lo antes posible.",
+ "title": "Error en la importación de datos"
+ },
"finish": {
"onlySettings": "La importación de la configuración del sistema se ha completado",
"start": "Comenzar a usar",
@@ -46,6 +70,7 @@
"title": "Importación de datos completada"
},
"loading": "Importando datos, por favor espere...",
+ "preparing": "Preparando el módulo de importación de datos...",
"result": {
"added": "Importación exitosa",
"errors": "Errores de importación",
@@ -56,8 +81,15 @@
"topics": "Temas",
"type": "Tipo de datos"
},
- "title": "Importar datos"
+ "title": "Importar datos",
+ "uploading": {
+ "desc": "El archivo actual es grande, se está subiendo... ",
+ "restTime": "Tiempo restante",
+ "speed": "Velocidad de carga"
+ }
},
+ "information": "Comunidad e Información",
+ "installPWA": "Instalar la aplicación del navegador",
"lang": {
"ar": "árabe",
"bg-BG": "búlgaro",
@@ -96,7 +128,11 @@
"zh-TW": "Chino tradicional"
},
"layoutInitializing": "Inicializando diseño...",
- "noDescription": "Sin descripción",
+ "legal": "Aviso Legal",
+ "mail": {
+ "business": "Colaboración Comercial",
+ "support": "Soporte por Correo"
+ },
"oauth": "Inicio de sesión SSO",
"officialSite": "Sitio oficial",
"ok": "Aceptar",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Usuario Anónimo",
"billing": "Gestión de facturación",
+ "data": "Almacenamiento de datos",
"defaultNickname": "Usuario de la comunidad",
"discord": "Soporte de la comunidad",
"docs": "Documentación de uso",
@@ -181,5 +218,6 @@
"profile": "Gestión de cuenta",
"setting": "Configuración de la aplicación",
"usages": "Estadísticas de uso"
- }
+ },
+ "version": "Versión"
}
diff --git a/locales/es-ES/components.json b/locales/es-ES/components.json
index 9100ef1a7e0f..333448d1c251 100644
--- a/locales/es-ES/components.json
+++ b/locales/es-ES/components.json
@@ -6,7 +6,8 @@
"functionCall": "Este modelo admite llamadas de función.",
"tokens": "Este modelo admite un máximo de {{tokens}} tokens por sesión.",
"vision": "Este modelo admite el reconocimiento visual."
- }
+ },
+ "removed": "El modelo no está en la lista, se eliminará automáticamente si se cancela la selección"
},
"ModelSwitchPanel": {
"emptyModel": "No hay modelos habilitados. Vaya a la configuración para habilitarlos.",
diff --git a/locales/es-ES/error.json b/locales/es-ES/error.json
index 433aa233234e..97d9636c4f39 100644
--- a/locales/es-ES/error.json
+++ b/locales/es-ES/error.json
@@ -12,6 +12,8 @@
"retry": "Reintentar",
"title": "Se ha producido un problema en la página.."
},
+ "fetchError": "Error en la solicitud",
+ "fetchErrorDetail": "Detalles del error",
"notFound": {
"backHome": "Volver a la página de inicio",
"desc": "No podemos encontrar la página que estás buscando, por favor verifica si el enlace es correcto",
@@ -52,37 +54,16 @@
"503": "Lo sentimos, el servidor no puede procesar su solicitud en este momento, posiblemente debido a una sobrecarga o mantenimiento. Por favor, inténtelo de nuevo más tarde",
"504": "Lo sentimos, el servidor no recibió respuesta del servidor upstream. Por favor, inténtelo de nuevo más tarde",
"AgentRuntimeError": "Se produjo un error en la ejecución del tiempo de ejecución del modelo de lenguaje Lobe, por favor, verifica la siguiente información o inténtalo de nuevo",
- "AnthropicBizError": "Se ha producido un error al solicitar el servicio de inteligencia artificial de Anthropic. Por favor, revisa la siguiente información o inténtalo de nuevo.",
- "AzureBizError": "Se produjo un error al solicitar el servicio de Azure AI, por favor, verifica la siguiente información o inténtalo de nuevo",
- "BedrockBizError": "Se produjo un error al solicitar el servicio de Bedrock, por favor, verifica la siguiente información o inténtalo de nuevo",
- "GoogleBizError": "Se produjo un error al solicitar el servicio de Google, por favor, verifica la siguiente información o inténtalo de nuevo",
- "GroqBizError": "Se produjo un error al solicitar el servicio Groq. Por favor, revise la siguiente información o inténtelo de nuevo",
"InvalidAccessCode": "La contraseña no es válida o está vacía. Por favor, introduce una contraseña de acceso válida o añade una clave API personalizada",
- "InvalidAnthropicAPIKey": "La clave de API de Anthropic es incorrecta o está vacía. Por favor, revisa la clave de API de Anthropic e inténtalo de nuevo.",
- "InvalidAzureAPIKey": "La clave de API de Azure es incorrecta o está vacía, por favor, verifica la clave de API de Azure e inténtalo de nuevo",
"InvalidBedrockCredentials": "La autenticación de Bedrock no se ha completado con éxito, por favor, verifica AccessKeyId/SecretAccessKey e inténtalo de nuevo",
"InvalidClerkUser": "Lo siento mucho, actualmente no has iniciado sesión. Por favor, inicia sesión o regístrate antes de continuar.",
- "InvalidGoogleAPIKey": "La clave de API de Google es incorrecta o está vacía, por favor, verifica la clave de API de Google e inténtalo de nuevo",
- "InvalidGroqAPIKey": "La clave de API de Groq es incorrecta o está vacía. Por favor, revisa la clave de API de Groq e inténtalo de nuevo.",
- "InvalidMinimaxAPIKey": "Clave de API de Minimax incorrecta o vacía, por favor, revise la clave de API de Minimax e inténtelo de nuevo",
- "InvalidMistralAPIKey": "La clave de API de Mistral AI es incorrecta o está vacía. Por favor, revise la clave de API de Mistral y vuelva a intentarlo.",
- "InvalidMoonshotAPIKey": "La clave de API de Moonshot AI no es válida o está vacía. Por favor, revise la clave de API de Moonshot e inténtelo de nuevo.",
"InvalidOllamaArgs": "La configuración de Ollama no es válida, por favor revisa la configuración de Ollama e inténtalo de nuevo",
- "InvalidOpenRouterAPIKey": "La clave de API de OpenRouter es incorrecta o está vacía. Por favor, revisa la clave de API de OpenRouter e inténtalo de nuevo",
- "InvalidPerplexityAPIKey": "La clave de API de Perplexity es inválida o está vacía. Por favor, verifica la clave de API de Perplexity e inténtalo de nuevo",
- "InvalidTogetherAIAPIKey": "La clave de API de TogetherAI es incorrecta o está vacía. Por favor, revisa la clave de API de TogetherAI e inténtalo de nuevo",
- "InvalidZeroOneAPIKey": "La clave de API de ZeroOneBiz es incorrecta o está vacía. Por favor, revise la clave de API de ZeroOneBiz e inténtelo de nuevo.",
- "InvalidZhipuAPIKey": "La clave de API de Zhipu es incorrecta o está vacía, por favor, verifica la clave de API de Zhipu e inténtalo de nuevo",
+ "InvalidProviderAPIKey": "{{provider}} API Key incorrecta o vacía, por favor revisa tu {{provider}} API Key e intenta de nuevo",
"LocationNotSupportError": "Lo sentimos, tu ubicación actual no es compatible con este servicio de modelo, puede ser debido a restricciones geográficas o a que el servicio no está disponible. Por favor, verifica si tu ubicación actual es compatible con este servicio o intenta usar otra información de ubicación.",
- "MinimaxBizError": "Error al solicitar el servicio Minimax, por favor, revise la siguiente información o inténtelo de nuevo",
- "MistralBizError": "Se produjo un error al solicitar el servicio Mistral AI. Por favor, revise la siguiente información o inténtelo de nuevo.",
- "MoonshotBizError": "Se produjo un error al solicitar el servicio de Moonshot en el lado oscuro de la luna. Por favor, revise la siguiente información o inténtelo de nuevo.",
"NoOpenAIAPIKey": "La clave de API de OpenAI está vacía. Agregue una clave de API de OpenAI personalizada",
"OllamaBizError": "Error al solicitar el servicio de Ollama, por favor verifica la siguiente información o inténtalo de nuevo",
"OllamaServiceUnavailable": "El servicio Ollama no está disponible. Por favor, verifica si Ollama está funcionando correctamente o si la configuración de Ollama para el acceso entre dominios está configurada correctamente.",
- "OpenAIBizError": "Error al solicitar el servicio OpenAI. Depure o reintente según la siguiente información",
- "OpenRouterBizError": "Error al solicitar el servicio de IA de OpenRouter. Por favor, revisa la siguiente información o inténtalo de nuevo",
- "PerplexityBizError": "Error comercial al solicitar el servicio de IA de Perplexity. Por favor, revisa la siguiente información o inténtalo de nuevo",
+ "OpenAIBizError": "Se produjo un error al solicitar el servicio de OpenAI, por favor, revise la siguiente información o inténtelo de nuevo",
"PluginApiNotFound": "Lo sentimos, el API especificado no existe en el manifiesto del complemento. Verifique si su método de solicitud coincide con el API del manifiesto del complemento",
"PluginApiParamsError": "Lo sentimos, la validación de los parámetros de entrada de la solicitud del complemento no ha pasado. Verifique si los parámetros de entrada coinciden con la información de descripción del API",
"PluginGatewayError": "Lo sentimos, se ha producido un error en la puerta de enlace del complemento. Verifique si la configuración de la puerta de enlace del complemento es correcta",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Lo sentimos, la inicialización del cliente OpenAPI ha fallado. Verifique si la información de configuración de OpenAPI es correcta",
"PluginServerError": "Error al recibir la respuesta del servidor del complemento. Verifique el archivo de descripción del complemento, la configuración del complemento o la implementación del servidor según la información de error a continuación",
"PluginSettingsInvalid": "Este complemento necesita una configuración correcta antes de poder usarse. Verifique si su configuración es correcta",
- "TogetherAIBizError": "Error al solicitar el servicio de IA de TogetherAI. Por favor, revisa la siguiente información o inténtalo de nuevo",
- "ZeroOneBizError": "Se produjo un error al solicitar el servicio ZeroOneBiz. Por favor, revise la siguiente información o inténtelo de nuevo.",
- "ZhipuBizError": "Se produjo un error al solicitar el servicio Zhipu, por favor, verifica la siguiente información o inténtalo de nuevo"
+ "ProviderBizError": "Se produjo un error al solicitar el servicio de {{provider}}, por favor, revise la siguiente información o inténtelo de nuevo"
},
"stt": {
"responseError": "Error en la solicitud de servicio. Verifique la configuración o reintente"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Agregar URL de proxy de OpenAI (opcional)",
+ "apiKey": {
+ "description": "Ingresa tu API Key de {{name}} para comenzar la sesión",
+ "title": "Usar tu propia API Key de {{name}}"
+ },
"closeMessage": "Cerrar mensaje",
"confirm": "Confirmar y volver a intentar",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Iniciar sesión",
"welcome": "¡Bienvenido!"
},
- "ollama": {
- "cancel": "Cancelar descarga",
- "confirm": "Descargar",
- "description": "Ingresa las etiquetas de tu modelo Ollama para continuar la sesión",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Iniciando descarga...",
- "title": "Descargar modelo Ollama específico"
- },
"password": {
"description": "El administrador ha activado el cifrado de la aplicación. Ingresa la contraseña de la aplicación para desbloquearla. La contraseña solo se necesita ingresar una vez",
"placeholder": "Ingresa la contraseña",
@@ -132,5 +107,9 @@
"apiKey": "Clave de API personalizada",
"password": "Contraseña"
}
+ },
+ "upload": {
+ "desc": "Detalles: {{detail}}",
+ "title": "Error al subir el archivo, por favor verifica la conexión a internet o inténtalo de nuevo más tarde"
}
}
diff --git a/locales/es-ES/metadata.json b/locales/es-ES/metadata.json
new file mode 100644
index 000000000000..ed672f377ecd
--- /dev/null
+++ b/locales/es-ES/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat ofrece la mejor experiencia de uso de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Herramienta personal de productividad LLM para tener un cerebro más inteligente"
+ },
+ "market": {
+ "description": "Creación de contenido, redacción, preguntas y respuestas, generación de imágenes, generación de videos, generación de voz, agente inteligente, flujo de trabajo automatizado, personaliza tu asistente inteligente AI / GPTs / OLLaMA exclusivo",
+ "title": "Mercado de asistentes"
+ },
+ "plugins": {
+ "description": "Búsqueda, generación de gráficos, académico, generación de imágenes, generación de videos, generación de voz, flujo de trabajo automatizado, personaliza las capacidades de los complementos ToolCall exclusivos de ChatGPT / OLLaMA",
+ "title": "Mercado de complementos"
+ },
+ "welcome": {
+ "description": "LobeChat ofrece la mejor experiencia de uso de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "¡Bienvenido a LobeChat: Herramienta personal de productividad LLM para tener un cerebro más inteligente!"
+ }
+}
diff --git a/locales/es-ES/modelProvider.json b/locales/es-ES/modelProvider.json
index ae3b47478ba5..3f8252390ba2 100644
--- a/locales/es-ES/modelProvider.json
+++ b/locales/es-ES/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Además de la dirección predeterminada, debe incluir http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Dirección del proxy de API"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Introduce la clave API proporcionada por Anthropic",
- "placeholder": "Clave API de Anthropic",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Anthropic personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Anthropic personalizada"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "La versión de la API de Azure, siguiendo el formato AAAA-MM-DD, consulta la [última versión](https://learn.microsoft.com/es-es/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Puedes encontrar este valor en la sección 'Claves y endpoint' al revisar tus recursos en el portal de Azure. Puedes usar KEY1 o KEY2",
"placeholder": "Clave API de Azure",
"title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Azure OpenAI personalizada para comenzar la sesión",
- "title": "Usar clave de API de Azure OpenAI personalizada"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Usar información de autenticación de Bedrock personalizada"
}
},
- "google": {
- "endpoint": {
- "desc": "Aparte de la dirección predeterminada, debe incluir http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Dirección del proxy de la API"
- },
- "title": "Google",
- "token": {
- "desc": "Introduce la clave API proporcionada por Google",
- "placeholder": "Clave API de Google",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Google personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Google personalizada"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Introduce la clave API proporcionada por Groq",
- "placeholder": "Clave API de Groq",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Groq personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Groq personalizada"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Introduce tu clave API de Minimax",
- "placeholder": "Clave API de Minimax",
- "title": "Clave API de Minimax"
- },
- "unlock": {
- "description": "Ingresa tu clave API de Minimax para comenzar la sesión. La aplicación no guardará tu clave API.",
- "title": "Usar clave API personalizada de Minimax"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Introduce la clave API proporcionada por Mistral AI",
- "placeholder": "Clave API de Mistral AI",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Mistral AI personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Mistral AI personalizada"
- }
- },
- "moonshot": {
- "title": "El lado oscuro de la luna",
- "token": {
- "desc": "Introduce la clave API proporcionada por Moonshot AI",
- "placeholder": "Clave API de Moonshot AI",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Moonshot AI personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Moonshot AI personalizada"
- }
- },
"ollama": {
"checker": {
- "desc": "Prueba si la dirección del proxy de la interfaz se ha introducido correctamente"
+ "desc": "Prueba si la dirección del proxy de la interfaz se ha introducido correctamente",
+ "title": "Comprobación de conectividad"
},
"customModelName": {
"desc": "Añade modelos personalizados, separa múltiples modelos con comas (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Nombre de modelos personalizados"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Introduce la dirección del proxy de la interfaz de Ollama, déjalo en blanco si no se ha especificado localmente",
- "placeholder": "http://127.0.0.1:11434",
"title": "Dirección del proxy de la interfaz"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Versión de vista previa)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Además de la dirección predeterminada, debe incluir http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Dirección del proxy de la interfaz"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Usa tu propia clave de OpenAI",
- "placeholder": "Clave API de OpenAI",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de OpenAI personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de OpenAI personalizada"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Prueba si la dirección del proxy de la interfaz se ha introducido correctamente"
- },
- "customModelName": {
- "desc": "Añade modelos personalizados, separa múltiples modelos con comas (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Nombre de modelos personalizados"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Introduce la clave API proporcionada por OpenRouter AI",
- "placeholder": "Clave API de OpenRouter AI",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de OpenRouter personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de OpenRouter personalizada"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Introduce la clave API proporcionada por Perplexity AI",
- "placeholder": "Clave API de Perplexity AI",
- "title": "Clave API"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Introduce tu clave de API de Perplexity personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Perplexity personalizada"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Prueba si la dirección del proxy de la interfaz se ha introducido correctamente"
- },
- "customModelName": {
- "desc": "Añade modelos personalizados, separa múltiples modelos con comas (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Nombre de modelos personalizados"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Introduce la clave API proporcionada por TogetherAI AI",
- "placeholder": "Clave API de TogetherAI AI",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de TogetherAI personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de TogetherAI personalizada"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Cero Uno Todo",
- "token": {
- "desc": "Introduce la clave API proporcionada por 01.AI Cero Uno Todo",
- "placeholder": "Clave API de 01.AI Cero Uno Todo",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de ZeroOne personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de ZeroOne personalizada"
- }
+ "title": "01.AI Cero Uno Todo"
},
"zhipu": {
- "title": "Inteligencia de Mapa",
- "token": {
- "desc": "Introduce la clave API proporcionada por Inteligencia de Mapa",
- "placeholder": "Clave API de Inteligencia de Mapa",
- "title": "Clave API"
- },
- "unlock": {
- "description": "Introduce tu clave de API de Zhipu personalizada para comenzar la sesión. La aplicación no guardará tu clave de API.",
- "title": "Usar clave de API de Zhipu personalizada"
- }
+ "title": "Inteligencia de Mapa"
}
}
diff --git a/locales/es-ES/plugin.json b/locales/es-ES/plugin.json
index 1fb1ce83d57a..7e98a982de76 100644
--- a/locales/es-ES/plugin.json
+++ b/locales/es-ES/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Llamada a función",
"off": "Desactivado",
"on": "Ver información de llamada de complemento",
- "response": "Respuesta"
+ "payload": "carga del complemento",
+ "response": "Respuesta",
+ "tool_call": "solicitud de llamada de herramienta"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Ejecutando complemento..."
},
"pluginList": "Lista de complementos",
- "plugins": {
- "loading": "Comprobando complementos...",
- "unknown": "Complemento desconocido"
- },
"setting": "Configuración de complementos",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Instalados"
},
"title": "Tienda de complementos"
- }
+ },
+ "unknownPlugin": "Plugin desconocido"
}
diff --git a/locales/es-ES/setting.json b/locales/es-ES/setting.json
index 482aa6c1bc6f..a3cc568f6d6e 100644
--- a/locales/es-ES/setting.json
+++ b/locales/es-ES/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Acerca de"
},
+ "agentTab": {
+ "chat": "Preferencias de chat",
+ "meta": "Información del asistente",
+ "modal": "Configuración del modelo",
+ "plugin": "Configuración de complementos",
+ "prompt": "Configuración de roles",
+ "tts": "Servicio de voz"
+ },
"analytics": {
"telemetry": {
"desc": "Al seleccionar el envío de datos de telemetría, nos ayudas a mejorar la experiencia general del usuario de LobeChat",
@@ -35,10 +43,14 @@
"title": "Configuración"
},
"llm": {
+ "apiKey": {
+ "desc": "Por favor, introduce tu clave de API de {{name}}",
+ "placeholder": "Clave de API de {{name}}",
+ "title": "Clave de API"
+ },
"checker": {
"button": "Comprobar",
"desc": "Comprueba si la clave API y la dirección del proxy están escritas correctamente",
- "ollamaDesc": "Verifica si la dirección del proxy está correctamente completada",
"pass": "Comprobación exitosa",
"title": "Comprobación de conectividad"
},
@@ -90,22 +102,19 @@
"latestTime": "Última actualización: {{time}}",
"noLatestTime": "Lista no disponible actualmente"
},
+ "helpDoc": "Tutorial de configuración",
"modelList": {
"desc": "Selecciona los modelos que se mostrarán en la conversación. Los modelos seleccionados se mostrarán en la lista de modelos.",
"placeholder": "Selecciona un modelo de la lista",
"title": "Lista de modelos",
"total": "Total de {{count}} modelos disponibles"
},
+ "proxyUrl": {
+ "desc": "Además de la dirección predeterminada, debe incluir http(s)://",
+ "title": "Dirección del proxy de la API"
+ },
"waitingForMore": "Más modelos están en <1>planificación para su incorporación1>, ¡estén atentos! ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama está descargando este modelo. Por favor, no cierres esta página. La descarga se reanudará desde donde se detuvo si se reinicia.",
- "remainingTime": "Tiempo restante",
- "speed": "Velocidad de descarga",
- "title": "Descargando el modelo {{model}}"
- }
- },
"plugin": {
"addTooltip": "Agregar complemento personalizado",
"clearDeprecated": "Eliminar complementos obsoletos",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Sin límite",
"limited": "Incluye solo {{number}} mensajes de conversación",
+ "setlimited": "Establecer cantidad de mensajes históricos",
"title": "Limitar número de mensajes históricos",
"unlimited": "Sin límite de mensajes históricos"
},
@@ -356,6 +366,24 @@
"title": "Sincronización WebRTC"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Modelo de generación de metadatos de asistente",
+ "modelDesc": "Modelo designado para generar el nombre, descripción, avatar y etiquetas del asistente",
+ "title": "Generación automática de información del asistente"
+ },
+ "title": "Asistente del sistema",
+ "topic": {
+ "label": "Modelo de nombramiento de temas",
+ "modelDesc": "Modelo designado para el renombramiento automático de temas",
+ "title": "Renombramiento automático de temas"
+ },
+ "translation": {
+ "label": "Modelo de traducción",
+ "modelDesc": "Especifica el modelo a utilizar para la traducción",
+ "title": "Configuración del asistente de traducción"
+ }
+ },
"tab": {
"about": "Acerca de",
"agent": "Asistente predeterminado",
@@ -363,6 +391,7 @@
"experiment": "Experimento",
"llm": "Modelo de lenguaje",
"sync": "Sincronización en la nube",
+ "system-agent": "Asistente del sistema",
"tts": "Servicio de voz"
},
"tools": {
diff --git a/locales/es-ES/tool.json b/locales/es-ES/tool.json
index 911f5fb59ae2..2677a4d6085b 100644
--- a/locales/es-ES/tool.json
+++ b/locales/es-ES/tool.json
@@ -4,6 +4,7 @@
"downloading": "El enlace de la imagen generada por DALL·E 3 solo es válido durante 1 hora, descargando la imagen al dispositivo local...",
"generate": "Generar",
"generating": "Generando...",
- "images": "Imágenes:"
+ "images": "Imágenes:",
+ "prompt": "Palabra de aviso"
}
}
diff --git a/locales/fr-FR/auth.json b/locales/fr-FR/auth.json
index fc5b2019b3f3..9f511646143e 100644
--- a/locales/fr-FR/auth.json
+++ b/locales/fr-FR/auth.json
@@ -1,6 +1,8 @@
{
"login": "Connexion",
"loginOrSignup": "Connexion / Inscription",
+ "profile": "Profil",
+ "security": "Sécurité",
"signout": "Déconnexion",
"signup": "Inscription"
}
diff --git a/locales/fr-FR/chat.json b/locales/fr-FR/chat.json
index fb6fdeeee8ff..79b8d18c1a76 100644
--- a/locales/fr-FR/chat.json
+++ b/locales/fr-FR/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Bonjour, je suis **{{name}}**. Vous pouvez commencer à discuter avec moi dès maintenant ou aller dans [Paramètres de l'agent](/chat/settings#session={{id}}) pour compléter mes informations.",
"agentDefaultMessageWithSystemRole": "Bonjour, je suis **{{name}}**, {{systemRole}}. Commençons la conversation !",
+ "agentsAndConversations": "Agents et conversations",
"backToBottom": "Retour en bas",
"clearCurrentMessages": "Effacer les messages actuels",
"confirmClearCurrentMessages": "Vous êtes sur le point d'effacer les messages de cette session. Cette action est irréversible. Veuillez confirmer.",
@@ -39,7 +40,6 @@
"regenerate": "Régénérer"
},
"newAgent": "Nouvel agent",
- "noDescription": "Aucune description disponible",
"pin": "Épingler",
"pinOff": "Désépingler",
"regenerate": "Regénérer",
@@ -83,6 +83,7 @@
"chats": "Messages de discussion",
"rest": "Restant disponible",
"systemRole": "Rôle système",
+ "title": "Détails du jeton",
"tools": "Paramètres du plugin",
"total": "Total disponible",
"used": "Total utilisé"
diff --git a/locales/fr-FR/common.json b/locales/fr-FR/common.json
index f213aabb1357..f9cab73bb3ac 100644
--- a/locales/fr-FR/common.json
+++ b/locales/fr-FR/common.json
@@ -1,7 +1,7 @@
{
"about": "À propos",
"advanceSettings": "Paramètres avancés",
- "appInitializing": "LobeChat est en cours de démarrage, veuillez patienter...",
+ "appInitializing": "L'application est en cours de démarrage, veuillez patienter...",
"autoGenerate": "Générer automatiquement",
"autoGenerateTooltip": "Générer automatiquement la description de l'agent basée sur les suggestions",
"autoGenerateTooltipDisabled": "Veuillez saisir un mot-clé avant d'activer la fonction de complétion automatique",
@@ -9,6 +9,7 @@
"cancel": "Annuler",
"changelog": "Journal des modifications",
"close": "Fermer",
+ "contact": "Nous contacter",
"copy": "Copier",
"copyFail": "Échec de la copie",
"copySuccess": "Copie réussie",
@@ -35,10 +36,33 @@
},
"feedback": "Retour d'information et suggestions",
"follow": "Suivez-nous sur {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Partager vos précieux commentaires",
+ "star": "Ajouter une étoile sur GitHub"
+ },
+ "and": "et",
+ "feedback": {
+ "action": "Partager des commentaires",
+ "desc": "Chaque idée et suggestion que vous avez est précieuse pour nous. Nous sommes impatients de connaître votre avis ! N'hésitez pas à nous contacter pour nous faire part de vos retours sur les fonctionnalités et l'expérience d'utilisation du produit, afin de nous aider à améliorer LobeChat.",
+ "title": "Partagez vos précieux commentaires sur GitHub"
+ },
+ "later": "Plus tard",
+ "star": {
+ "action": "Ajouter une étoile",
+ "desc": "Si vous aimez notre produit et souhaitez nous soutenir, pourriez-vous nous donner une étoile sur GitHub ? Ce petit geste est très important pour nous et nous encourage à continuer à vous offrir une expérience exceptionnelle.",
+ "title": "Ajoutez une étoile sur GitHub pour nous"
+ },
+ "title": "Vous aimez notre produit ?"
+ },
"fullscreen": "Mode plein écran",
"historyRange": "Plage d'historique",
"import": "Importer",
"importModal": {
+ "error": {
+ "desc": "Désolé, une erreur s'est produite lors de l'importation des données. Veuillez réessayer l'importation ou <1> soumettre un problème 1>, nous vous aiderons à résoudre le problème dès que possible.",
+ "title": "Échec de l'importation des données"
+ },
"finish": {
"onlySettings": "Importation des paramètres système réussie",
"start": "Commencer à utiliser",
@@ -46,6 +70,7 @@
"title": "Importation des données terminée"
},
"loading": "Importation des données en cours, veuillez patienter...",
+ "preparing": "Préparation du module d'importation des données en cours...",
"result": {
"added": "Importation réussie",
"errors": "Erreurs d'importation",
@@ -56,8 +81,15 @@
"topics": "Sujets",
"type": "Type de données"
},
- "title": "Importer des données"
+ "title": "Importer des données",
+ "uploading": {
+ "desc": "Le fichier en cours est volumineux, veuillez patienter pendant le téléchargement...",
+ "restTime": "Temps restant",
+ "speed": "Vitesse de téléchargement"
+ }
},
+ "information": "Communauté et Informations",
+ "installPWA": "Installer l'application du navigateur",
"lang": {
"ar": "arabe",
"bg-BG": "Bulgare",
@@ -96,7 +128,11 @@
"zh-TW": "Chinois traditionnel"
},
"layoutInitializing": "Initialisation de la mise en page en cours...",
- "noDescription": "Aucune description disponible",
+ "legal": "Mentions légales",
+ "mail": {
+ "business": "Partenariats commerciaux",
+ "support": "Support par e-mail"
+ },
"oauth": "Connexion SSO",
"officialSite": "Site officiel",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Utilisateur anonyme",
"billing": "Gestion de la facturation",
+ "data": "Stockage des données",
"defaultNickname": "Utilisateur de la version communautaire",
"discord": "Support de la communauté",
"docs": "Documentation d'utilisation",
@@ -181,5 +218,6 @@
"profile": "Gestion du compte",
"setting": "Paramètres de l'application",
"usages": "Statistiques d'utilisation"
- }
+ },
+ "version": "Version"
}
diff --git a/locales/fr-FR/components.json b/locales/fr-FR/components.json
index c68aca4af7a0..3a031a26939d 100644
--- a/locales/fr-FR/components.json
+++ b/locales/fr-FR/components.json
@@ -6,7 +6,8 @@
"functionCall": "Ce modèle prend en charge les appels de fonction.",
"tokens": "Ce modèle prend en charge jusqu'à {{tokens}} jetons par session.",
"vision": "Ce modèle prend en charge la reconnaissance visuelle."
- }
+ },
+ "removed": "Le modèle n'est pas dans la liste, il sera automatiquement supprimé si vous annulez la sélection"
},
"ModelSwitchPanel": {
"emptyModel": "Aucun modèle activé. Veuillez vous rendre dans les paramètres pour l'activer.",
diff --git a/locales/fr-FR/error.json b/locales/fr-FR/error.json
index 159eeb0c33d6..6dcebfcd54f5 100644
--- a/locales/fr-FR/error.json
+++ b/locales/fr-FR/error.json
@@ -12,6 +12,8 @@
"retry": "Recharger",
"title": "Un problème est survenu sur la page.."
},
+ "fetchError": "Échec de la requête",
+ "fetchErrorDetail": "Détails de l'erreur",
"notFound": {
"backHome": "Retour à la page d'accueil",
"desc": "La page que vous recherchez est introuvable. Veuillez vérifier si le lien est correct.",
@@ -52,37 +54,16 @@
"503": "Désolé, le serveur ne peut actuellement pas traiter votre requête, probablement en raison d'une surcharge ou de travaux de maintenance. Veuillez réessayer plus tard",
"504": "Désolé, le serveur n'a pas reçu de réponse de la part du serveur amont. Veuillez réessayer plus tard",
"AgentRuntimeError": "Erreur d'exécution du modèle linguistique Lobe, veuillez vérifier les informations ci-dessous ou réessayer",
- "AnthropicBizError": "Erreur commerciale lors de la demande de service Anthropic AI. Veuillez vérifier les informations ci-dessous ou réessayer.",
- "AzureBizError": "Erreur lors de la demande de service Azure AI, veuillez vérifier les informations ci-dessous ou réessayer",
- "BedrockBizError": "Erreur lors de la demande de service Bedrock, veuillez vérifier les informations ci-dessous ou réessayer",
- "GoogleBizError": "Erreur lors de la demande de service Google, veuillez vérifier les informations ci-dessous ou réessayer",
- "GroqBizError": "Une erreur s'est produite lors de la demande de service Groq. Veuillez vérifier les informations ci-dessous ou réessayer.",
"InvalidAccessCode": "Le mot de passe est incorrect ou vide. Veuillez saisir le mot de passe d'accès correct ou ajouter une clé API personnalisée.",
- "InvalidAnthropicAPIKey": "La clé API Anthropic est incorrecte ou manquante. Veuillez vérifier la clé API Anthropic et réessayer.",
- "InvalidAzureAPIKey": "Clé API Azure incorrecte ou vide, veuillez vérifier la clé API Azure et réessayer",
"InvalidBedrockCredentials": "L'authentification Bedrock a échoué, veuillez vérifier AccessKeyId/SecretAccessKey et réessayer",
"InvalidClerkUser": "Désolé, vous n'êtes pas actuellement connecté. Veuillez vous connecter ou vous inscrire avant de continuer.",
- "InvalidGoogleAPIKey": "Clé API Google incorrecte ou vide, veuillez vérifier la clé API Google et réessayer",
- "InvalidGroqAPIKey": "Clé API Groq incorrecte ou vide, veuillez vérifier la clé API Groq et réessayer",
- "InvalidMinimaxAPIKey": "Clé API Minimax incorrecte ou vide, veuillez vérifier la clé API Minimax et réessayer",
- "InvalidMistralAPIKey": "Clé API Mistral AI incorrecte ou manquante. Veuillez vérifier la clé API Mistral et réessayer.",
- "InvalidMoonshotAPIKey": "Clé API Moonshot AI incorrecte ou manquante. Veuillez vérifier la clé API Moonshot et réessayer.",
"InvalidOllamaArgs": "La configuration d'Ollama n'est pas valide, veuillez vérifier la configuration d'Ollama et réessayer",
- "InvalidOpenRouterAPIKey": "La clé d'API OpenRouter est incorrecte ou manquante. Veuillez vérifier la clé d'API OpenRouter et réessayer.",
- "InvalidPerplexityAPIKey": "La clé API Perplexity est incorrecte ou vide. Veuillez vérifier la clé API Perplexity et réessayer.",
- "InvalidTogetherAIAPIKey": "La clé d'API TogetherAI est incorrecte ou manquante. Veuillez vérifier la clé d'API TogetherAI et réessayer.",
- "InvalidZeroOneAPIKey": "La clé d'API ZeroOne est incorrecte ou vide, veuillez vérifier la clé d'API ZeroOne et réessayer",
- "InvalidZhipuAPIKey": "Clé API Zhipu incorrecte ou vide, veuillez vérifier la clé API Zhipu et réessayer",
+ "InvalidProviderAPIKey": "{{provider}} API Key incorrect or missing, please check {{provider}} API Key and try again",
"LocationNotSupportError": "Désolé, votre emplacement actuel ne prend pas en charge ce service de modèle, peut-être en raison de restrictions géographiques ou de services non disponibles. Veuillez vérifier si votre emplacement actuel prend en charge ce service ou essayer avec une autre localisation.",
- "MinimaxBizError": "Erreur de service Minimax, veuillez vérifier les informations suivantes ou réessayer",
- "MistralBizError": "Erreur de service Mistral AI. Veuillez vérifier les informations ci-dessous ou réessayer.",
- "MoonshotBizError": "Erreur de service Moonshot : une erreur s'est produite lors de la demande du service Côté Obscur de la Lune. Veuillez vérifier les informations suivantes ou réessayer.",
"NoOpenAIAPIKey": "La clé API OpenAI est vide. Veuillez ajouter une clé API OpenAI personnalisée",
"OllamaBizError": "Erreur commerciale lors de la demande de service Ollama, veuillez vérifier les informations ci-dessous ou réessayer",
"OllamaServiceUnavailable": "Le service Ollama n'est pas disponible. Veuillez vérifier si Ollama fonctionne correctement ou si la configuration de la communication inter-domaines d'Ollama est correcte.",
- "OpenAIBizError": "Erreur de service OpenAI. Veuillez diagnostiquer ou réessayer en fonction des informations ci-dessous",
- "OpenRouterBizError": "Erreur commerciale lors de la demande de service OpenRouter AI. Veuillez vérifier les informations ci-dessous ou réessayer.",
- "PerplexityBizError": "Erreur commerciale lors de la demande de service Perplexity AI. Veuillez vérifier les informations suivantes ou réessayer.",
+ "OpenAIBizError": "Erreur de service OpenAI. Veuillez vérifier les informations suivantes ou réessayer.",
"PluginApiNotFound": "Désolé, l'API spécifiée n'existe pas dans le manifeste du plugin. Veuillez vérifier que votre méthode de requête correspond à l'API du manifeste du plugin",
"PluginApiParamsError": "Désolé, la validation des paramètres d'entrée de la requête de ce plugin a échoué. Veuillez vérifier que les paramètres d'entrée correspondent aux informations de l'API",
"PluginGatewayError": "Désolé, une erreur est survenue avec la passerelle du plugin. Veuillez vérifier la configuration de la passerelle du plugin.",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Désolé, l'initialisation du client OpenAPI a échoué. Veuillez vérifier les informations de configuration d'OpenAPI.",
"PluginServerError": "Erreur de réponse du serveur du plugin. Veuillez vérifier le fichier de description du plugin, la configuration du plugin ou la mise en œuvre côté serveur en fonction des informations d'erreur ci-dessous",
"PluginSettingsInvalid": "Ce plugin doit être correctement configuré avant de pouvoir être utilisé. Veuillez vérifier votre configuration",
- "TogetherAIBizError": "Erreur commerciale lors de la demande de service TogetherAI AI. Veuillez vérifier les informations ci-dessous ou réessayer.",
- "ZeroOneBizError": "请求零一万物服务出错,请根据以下信息排查或重试",
- "ZhipuBizError": "Erreur lors de la demande de service Zhipu, veuillez vérifier les informations ci-dessous ou réessayer"
+ "ProviderBizError": "Erreur de service {{provider}}. Veuillez vérifier les informations suivantes ou réessayer."
},
"stt": {
"responseError": "Échec de la requête de service. Veuillez vérifier la configuration ou réessayer"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Ajouter une adresse de proxy OpenAI (facultatif)",
+ "apiKey": {
+ "description": "Enter your {{name}} API Key to start the session",
+ "title": "Use custom {{name}} API Key"
+ },
"closeMessage": "Fermer le message",
"confirm": "Confirmer et réessayer",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Se connecter",
"welcome": "Bienvenue !"
},
- "ollama": {
- "cancel": "Annuler le téléchargement",
- "confirm": "Télécharger",
- "description": "Entrez vos balises de modèle Ollama pour continuer la session",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Début du téléchargement...",
- "title": "Télécharger le modèle Ollama spécifié"
- },
"password": {
"description": "L'administrateur a activé le cryptage de l'application. Entrez le mot de passe de l'application pour déverrouiller. Le mot de passe ne doit être saisi qu'une seule fois.",
"placeholder": "Entrez le mot de passe",
@@ -132,5 +107,9 @@
"apiKey": "Clé API personnalisée",
"password": "Mot de passe"
}
+ },
+ "upload": {
+ "desc": "Détails : {{detail}}",
+ "title": "Échec de l'envoi du fichier, veuillez vérifier votre connexion réseau ou réessayer plus tard"
}
}
diff --git a/locales/fr-FR/metadata.json b/locales/fr-FR/metadata.json
new file mode 100644
index 000000000000..afbe6b9c890a
--- /dev/null
+++ b/locales/fr-FR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offre la meilleure expérience d'utilisation de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Outil de productivité personnel LLM, pour un cerveau plus intelligent"
+ },
+ "market": {
+ "description": "Création de contenu, rédaction, questions-réponses, génération d'images, génération de vidéos, génération vocale, agent intelligent, flux de travail automatisé, personnalisez votre agent intelligent AI / GPTs / OLLaMA",
+ "title": "Marché des agents"
+ },
+ "plugins": {
+ "description": "Recherche, génération de graphiques, académique, génération d'images, génération de vidéos, génération vocale, flux de travail automatisé, personnalisez les capacités des plugins ToolCall exclusifs de ChatGPT / OLLaMA",
+ "title": "Marché des plugins"
+ },
+ "welcome": {
+ "description": "LobeChat offre la meilleure expérience d'utilisation de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Bienvenue sur LobeChat: Outil de productivité personnel LLM, pour un cerveau plus intelligent"
+ }
+}
diff --git a/locales/fr-FR/modelProvider.json b/locales/fr-FR/modelProvider.json
index 62c51f6e9f5a..196204d65b7b 100644
--- a/locales/fr-FR/modelProvider.json
+++ b/locales/fr-FR/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "En dehors de l'adresse par défaut, doit inclure http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Adresse de l'API Proxy"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Saisissez la clé API d'Anthropic",
- "placeholder": "Clé API Anthropic",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Anthropic pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Anthropic personnalisée"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Version de l'API Azure, au format YYYY-MM-DD, consultez [la dernière version](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Lors de l'inspection des ressources sur le portail Azure, vous pouvez trouver cette valeur dans la section 'Clés et points de terminaison'. Vous pouvez utiliser KEY1 ou KEY2",
"placeholder": "Clé API Azure",
"title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Azure OpenAI pour commencer la session. L'application ne stockera pas votre configuration d'authentification.",
- "title": "Utiliser une clé API Azure OpenAI personnalisée"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Utiliser des informations d'authentification Bedrock personnalisées"
}
},
- "google": {
- "endpoint": {
- "desc": "Incluez http(s):// en plus de l'adresse par défaut",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Adresse du proxy API"
- },
- "title": "Google",
- "token": {
- "desc": "Saisissez la clé API de Google",
- "placeholder": "Clé API Google",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Google pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Google personnalisée"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Saisissez la clé API de Groq",
- "placeholder": "Clé API Groq",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Groq pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Groq personnalisée"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Entrez la clé API de Minimax",
- "placeholder": "Clé API Minimax",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Minimax pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Minimax personnalisée"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Saisissez la clé API de Mistral AI",
- "placeholder": "Clé API Mistral AI",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Mistral AI pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Mistral AI personnalisée"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Saisissez la clé API de Moonshot AI",
- "placeholder": "Clé API Moonshot AI",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Moonshot AI pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Moonshot AI personnalisée"
- }
- },
"ollama": {
"checker": {
- "desc": "Vérifiez si l'adresse du proxy est correctement saisie"
+ "desc": "Vérifiez si l'adresse du proxy est correctement saisie",
+ "title": "Vérification de la connectivité"
},
"customModelName": {
"desc": "Ajoutez un modèle personnalisé, séparez les modèles multiples par des virgules (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Nom du modèle personnalisé"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Saisissez l'adresse du proxy Ollama, laissez vide si non spécifié localement",
- "placeholder": "http://127.0.0.1:11434",
"title": "Adresse du proxy"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Preview)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "En dehors de l'adresse par défaut, doit inclure http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Adresse du proxy"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Utilisez votre propre clé OpenAI",
- "placeholder": "Clé API OpenAI",
- "title": "Clé API OpenAI"
- },
- "unlock": {
- "description": "Entrez votre clé API OpenAI pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API OpenAI personnalisée"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Vérifiez si l'adresse du proxy est correctement saisie"
- },
- "customModelName": {
- "desc": "Ajoutez un modèle personnalisé, séparez les modèles multiples par des virgules (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Nom du modèle personnalisé"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Saisissez la clé API d'OpenRouter AI",
- "placeholder": "Clé API OpenRouter AI",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API OpenRouter pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API OpenRouter personnalisée"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Enter your API Key from Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Enter your Perplexity API Key to start the session. The application will not store your API Key",
- "title": "Use custom Perplexity API Key"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Test if the proxy address is correctly filled in"
- },
- "customModelName": {
- "desc": "Add custom models, separate multiple models with commas",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct, teknium/OpenHermes-2-Mistral-7B",
- "title": "Custom model name"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Enter your API Key from TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Enter your TogetherAI API Key to start the session. The application will not store your API Key",
- "title": "Use custom TogetherAI API Key"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Zéro Un Tout",
- "token": {
- "desc": "Entrez la clé API de 01.AI Zéro Un Tout",
- "placeholder": "Clé API 01.AI Zéro Un Tout",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Zéro Un Tout pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Zéro Un Tout personnalisée"
- }
+ "title": "01.AI Zéro Un Tout"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Entrez la clé API de Zhipu",
- "placeholder": "Clé API Zhipu",
- "title": "Clé API"
- },
- "unlock": {
- "description": "Entrez votre clé API Zhipu pour commencer la session. L'application ne stockera pas votre clé API.",
- "title": "Utiliser une clé API Zhipu personnalisée"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/fr-FR/plugin.json b/locales/fr-FR/plugin.json
index bec0bce1d322..23951b67b0a2 100644
--- a/locales/fr-FR/plugin.json
+++ b/locales/fr-FR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Appel de fonction",
"off": "Désactivé",
"on": "Activer le débogage",
- "response": "Réponse"
+ "payload": "charge du plugin",
+ "response": "Réponse",
+ "tool_call": "demande d'appel d'outil"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Exécution du plugin en cours..."
},
"pluginList": "Liste des plugins",
- "plugins": {
- "loading": "Vérification des plugins en cours...",
- "unknown": "Plugin inconnu"
- },
"setting": "Paramètres des plugins",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installés"
},
"title": "Boutique de plugins"
- }
+ },
+ "unknownPlugin": "Plugin inconnu"
}
diff --git a/locales/fr-FR/setting.json b/locales/fr-FR/setting.json
index 310ab92745ab..22cc3b23a83e 100644
--- a/locales/fr-FR/setting.json
+++ b/locales/fr-FR/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "À propos"
},
+ "agentTab": {
+ "chat": "Préférences de discussion",
+ "meta": "Informations de l'agent",
+ "modal": "Paramètres du modèle",
+ "plugin": "Paramètres du plugin",
+ "prompt": "Configuration du rôle",
+ "tts": "Service vocal"
+ },
"analytics": {
"telemetry": {
"desc": "En choisissant d'envoyer des données de télémétrie, vous pouvez nous aider à améliorer l'expérience utilisateur globale de LobeChat",
@@ -35,10 +43,14 @@
"title": "Paramètres"
},
"llm": {
+ "apiKey": {
+ "desc": "Veuillez saisir votre clé API {{name}}",
+ "placeholder": "Clé API {{name}}",
+ "title": "Clé API"
+ },
"checker": {
"button": "Vérifier",
"desc": "Vérifie si la clé API et l'adresse du proxy sont correctement renseignées",
- "ollamaDesc": "Vérifiez si l'adresse du proxy est correctement renseignée",
"pass": "Vérification réussie",
"title": "Vérification de la connectivité"
},
@@ -90,22 +102,19 @@
"latestTime": "Dernière mise à jour : {{time}}",
"noLatestTime": "Aucune mise à jour disponible"
},
+ "helpDoc": "Guide de configuration",
"modelList": {
"desc": "Sélectionnez les modèles à afficher dans la session. Les modèles sélectionnés seront affichés dans la liste des modèles.",
"placeholder": "Veuillez sélectionner un modèle dans la liste",
"title": "Liste des modèles",
"total": "{{count}} modèles disponibles au total"
},
+ "proxyUrl": {
+ "desc": "Doit inclure http(s):// en plus de l'adresse par défaut",
+ "title": "Adresse du proxy de l'API"
+ },
"waitingForMore": "Plus de modèles sont en cours de <1>planification pour être ajoutés1>, restez à l'écoute ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama est en train de télécharger ce modèle. Veuillez ne pas fermer cette page. Le téléchargement reprendra là où il s'est arrêté en cas de reprise.",
- "remainingTime": "Temps restant",
- "speed": "Vitesse de téléchargement",
- "title": "Téléchargement du modèle {{model}} en cours"
- }
- },
"plugin": {
"addTooltip": "Ajouter un plugin personnalisé",
"clearDeprecated": "Effacer les plugins obsolètes",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Illimité",
"limited": "Inclure uniquement {{number}} messages de conversation",
+ "setlimited": "Définir le nombre de messages d'historique",
"title": "Limite du nombre de messages historiques",
"unlimited": "Aucune limite sur le nombre de messages historiques"
},
@@ -356,6 +366,24 @@
"title": "Synchronisation WebRTC"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Modèle de génération de métadonnées d'assistant",
+ "modelDesc": "Modèle spécifié pour générer le nom, la description, l'avatar et les balises de l'assistant",
+ "title": "Génération automatique des informations de l'assistant"
+ },
+ "title": "Agent système",
+ "topic": {
+ "label": "Modèle de nommage des sujets",
+ "modelDesc": "Modèle spécifié pour le renommage automatique des sujets",
+ "title": "Renommage automatique des sujets"
+ },
+ "translation": {
+ "label": "Modèle de traduction",
+ "modelDesc": "Modèle spécifié pour la traduction",
+ "title": "Paramètres de l'agent de traduction"
+ }
+ },
"tab": {
"about": "À propos",
"agent": "Agent par défaut",
@@ -363,6 +391,7 @@
"experiment": "Expérience",
"llm": "Modèle de langue",
"sync": "Synchronisation cloud",
+ "system-agent": "Agent système",
"tts": "Service vocal"
},
"tools": {
diff --git a/locales/fr-FR/tool.json b/locales/fr-FR/tool.json
index 42aa797eabf8..ed373d0a72ab 100644
--- a/locales/fr-FR/tool.json
+++ b/locales/fr-FR/tool.json
@@ -4,6 +4,7 @@
"downloading": "Les liens d'image générés par DallE3 ne sont valides que pendant 1 heure. Le téléchargement de l'image est en cours...",
"generate": "Générer",
"generating": "En cours de génération...",
- "images": "Images :"
+ "images": "Images :",
+ "prompt": "Mot de rappel"
}
}
diff --git a/locales/it-IT/auth.json b/locales/it-IT/auth.json
index 53732dab90b5..da602911c861 100644
--- a/locales/it-IT/auth.json
+++ b/locales/it-IT/auth.json
@@ -1,6 +1,8 @@
{
"login": "Accedi",
"loginOrSignup": "Accedi / Registrati",
+ "profile": "Profilo",
+ "security": "Sicurezza",
"signout": "Esci",
"signup": "Registrati"
}
diff --git a/locales/it-IT/chat.json b/locales/it-IT/chat.json
index 84c4a0a06f6f..28440b1e52ea 100644
--- a/locales/it-IT/chat.json
+++ b/locales/it-IT/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Ciao, sono **{{name}}**, puoi iniziare a chattare con me subito o andare a [impostazioni assistente](/chat/settings#session={{id}}) per completare le mie informazioni.",
"agentDefaultMessageWithSystemRole": "Ciao, sono **{{name}}**, {{systemRole}}, iniziamo a chattare!",
+ "agentsAndConversations": "Assistenti e Conversazioni",
"backToBottom": "Torna in fondo",
"clearCurrentMessages": "Cancella messaggi attuali",
"confirmClearCurrentMessages": "Stai per cancellare i messaggi attuali, questa operazione non potrà essere annullata. Confermi?",
@@ -39,7 +40,6 @@
"regenerate": "Rigenera"
},
"newAgent": "Nuovo assistente",
- "noDescription": "Nessuna descrizione",
"pin": "Fissa in alto",
"pinOff": "Annulla fissaggio in alto",
"regenerate": "Rigenera",
@@ -83,6 +83,7 @@
"chats": "Chat",
"rest": "Rimanenti",
"systemRole": "Ruolo di sistema",
+ "title": "Dettagli del Token",
"tools": "Strumenti",
"total": "Totale",
"used": "Utilizzati"
diff --git a/locales/it-IT/common.json b/locales/it-IT/common.json
index e5803e646d6a..0d19118fee2f 100644
--- a/locales/it-IT/common.json
+++ b/locales/it-IT/common.json
@@ -1,7 +1,7 @@
{
"about": "Informazioni",
"advanceSettings": "Impostazioni avanzate",
- "appInitializing": "LobeChat inizializzazione in corso, attendere prego...",
+ "appInitializing": "Inizializzazione dell'app in corso, attendere pazientemente...",
"autoGenerate": "Generazione automatica",
"autoGenerateTooltip": "Completamento automatico basato su suggerimenti",
"autoGenerateTooltipDisabled": "Si prega di compilare il campo suggerimento per abilitare la funzione di completamento automatico",
@@ -9,6 +9,7 @@
"cancel": "Annulla",
"changelog": "Registro modifiche",
"close": "Chiudi",
+ "contact": "Contattaci",
"copy": "Copia",
"copyFail": "Copia non riuscita",
"copySuccess": "Copia riuscita",
@@ -35,10 +36,33 @@
},
"feedback": "Feedback e suggerimenti",
"follow": "Seguici su {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Condividi i tuoi preziosi suggerimenti",
+ "star": "Aggiungi una stella su GitHub"
+ },
+ "and": "e",
+ "feedback": {
+ "action": "Condividi feedback",
+ "desc": "Ogni tua idea e suggerimento è prezioso per noi, non vediamo l'ora di conoscere la tua opinione! Contattaci per fornire feedback sulle funzionalità del prodotto e sull'esperienza utente, aiutandoci a migliorare LobeChat.",
+ "title": "Condividi il tuo prezioso feedback su GitHub"
+ },
+ "later": "Più tardi",
+ "star": {
+ "action": "Aggiungi una stella",
+ "desc": "Se ami il nostro prodotto e desideri supportarci, potresti aggiungerci una stella su GitHub? Questo piccolo gesto è di grande significato per noi e ci motiva a continuare a offrirti un'esperienza di qualità.",
+ "title": "Aggiungi una stella su GitHub per supportarci"
+ },
+ "title": "Ti piace il nostro prodotto?"
+ },
"fullscreen": "Modalità a schermo intero",
"historyRange": "Intervallo cronologico",
"import": "Importa configurazione",
"importModal": {
+ "error": {
+ "desc": "Ci dispiace molto, si è verificato un errore durante il processo di importazione dei dati. Si prega di provare a importare nuovamente, o <1>invia un problema1>, saremo pronti ad aiutarti a risolvere il problema al più presto.",
+ "title": "Importazione dei dati fallita"
+ },
"finish": {
"onlySettings": "Impostazioni di sistema importate con successo",
"start": "Inizia utilizzo",
@@ -46,6 +70,7 @@
"title": "Importazione dati completata"
},
"loading": "Importazione dati in corso, attendere prego...",
+ "preparing": "Preparazione del modulo di importazione dei dati in corso...",
"result": {
"added": "Importazione riuscita",
"errors": "Errori di importazione",
@@ -56,8 +81,15 @@
"topics": "Argomenti",
"type": "Tipo di dati"
},
- "title": "Importa dati"
+ "title": "Importa dati",
+ "uploading": {
+ "desc": "Il file attuale è troppo grande, sta venendo caricato con impegno...",
+ "restTime": "Tempo rimanente",
+ "speed": "Velocità di caricamento"
+ }
},
+ "information": "Comunità e informazioni",
+ "installPWA": "Installa l'applicazione del browser",
"lang": {
"ar": "Arabo",
"bg-BG": "bulgaro",
@@ -96,7 +128,11 @@
"zh-TW": "Cinese tradizionale"
},
"layoutInitializing": "Inizializzazione layout in corso...",
- "noDescription": "Nessuna descrizione disponibile",
+ "legal": "Avviso legale",
+ "mail": {
+ "business": "Collaborazioni commerciali",
+ "support": "Supporto via email"
+ },
"oauth": "Accesso SSO",
"officialSite": "Sito ufficiale",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Utente Anonimo",
"billing": "Gestione fatturazione",
+ "data": "Archiviazione dati",
"defaultNickname": "Utente Community",
"discord": "Supporto della community",
"docs": "Documentazione",
@@ -181,5 +218,6 @@
"profile": "Gestione account",
"setting": "Impostazioni app",
"usages": "Statistiche di utilizzo"
- }
+ },
+ "version": "Versione"
}
diff --git a/locales/it-IT/components.json b/locales/it-IT/components.json
index c118c0f71c70..59dc611e29ca 100644
--- a/locales/it-IT/components.json
+++ b/locales/it-IT/components.json
@@ -6,7 +6,8 @@
"functionCall": "Questo modello supporta la chiamata di funzioni.",
"tokens": "Questo modello supporta un massimo di {{tokens}} token per sessione.",
"vision": "Questo modello supporta il riconoscimento visivo."
- }
+ },
+ "removed": "Il modello non è più nella lista, verrà rimosso automaticamente se deselezionato"
},
"ModelSwitchPanel": {
"emptyModel": "Nessun modello attivo. Vai alle impostazioni per attivarne uno.",
diff --git a/locales/it-IT/error.json b/locales/it-IT/error.json
index c805656c03a9..1f8896ba1bbd 100644
--- a/locales/it-IT/error.json
+++ b/locales/it-IT/error.json
@@ -12,6 +12,8 @@
"retry": "Ricarica",
"title": "La pagina ha riscontrato un problema.."
},
+ "fetchError": "Errore di richiesta",
+ "fetchErrorDetail": "Dettagli dell'errore",
"notFound": {
"backHome": "Torna alla homepage",
"desc": "Non riusciamo a trovare la pagina che stai cercando, controlla che il link sia corretto",
@@ -52,37 +54,16 @@
"503": "Spiacenti, il server non può elaborare la tua richiesta al momento, probabilmente a causa di sovraccarico o manutenzione in corso. Riprova più tardi",
"504": "Spiacenti, il server non ha ricevuto risposta dal server upstream. Riprova più tardi",
"AgentRuntimeError": "Errore di esecuzione del modello linguistico Lobe, controlla le informazioni seguenti o riprova",
- "AnthropicBizError": "Si è verificato un errore durante la richiesta del servizio Anthropic AI. Si prega di controllare le informazioni seguenti o riprovare.",
- "AzureBizError": "Errore nella richiesta del servizio Azure AI, controlla le informazioni seguenti o riprova",
- "BedrockBizError": "Errore nella richiesta del servizio Bedrock, controlla le informazioni seguenti o riprova",
- "GoogleBizError": "Errore nella richiesta del servizio Google, controlla le informazioni seguenti o riprova",
- "GroqBizError": "Errore del servizio Groq, controlla le informazioni seguenti o riprova",
"InvalidAccessCode": "Password incorrect or empty, please enter the correct access password, or add a custom API Key",
- "InvalidAnthropicAPIKey": "La chiave API Anthropic non è valida o è vuota. Si prega di controllare la chiave API Anthropic e riprovare.",
- "InvalidAzureAPIKey": "Chiave API Azure non corretta o vuota, controlla la chiave API Azure e riprova",
"InvalidBedrockCredentials": "Autenticazione Bedrock non riuscita, controlla AccessKeyId/SecretAccessKey e riprova",
"InvalidClerkUser": "Spiacenti, al momento non hai effettuato l'accesso. Per favore, effettua l'accesso o registrati prima di continuare.",
- "InvalidGoogleAPIKey": "Chiave API Google non corretta o vuota, controlla la chiave API Google e riprova",
- "InvalidGroqAPIKey": "Chiave API Groq non valida o vuota, controlla la chiave API Groq e riprova",
- "InvalidMinimaxAPIKey": "Chiave API Minimax non valida o vuota, controllare la chiave API Minimax e riprovare",
- "InvalidMistralAPIKey": "Chiave API Mistral AI non valida o vuota. Si prega di controllare la chiave API Mistral e riprovare.",
- "InvalidMoonshotAPIKey": "La chiave API di Moonshot AI non è corretta o è vuota, si prega di controllare la chiave API di Moonshot e riprovare",
"InvalidOllamaArgs": "Configurazione Ollama non valida, controllare la configurazione di Ollama e riprovare",
- "InvalidOpenRouterAPIKey": "La chiave API di OpenRouter non è valida o è vuota. Si prega di controllare la chiave API di OpenRouter e riprovare.",
- "InvalidPerplexityAPIKey": "Chiave API Perplexity non valida o vuota, controlla la chiave API Perplexity e riprova",
- "InvalidTogetherAIAPIKey": "La chiave API di TogetherAI non è valida o è vuota. Si prega di controllare la chiave API di TogetherAI e riprovare.",
- "InvalidZeroOneAPIKey": "La chiave API ZeroOne non è corretta o è vuota, si prega di controllare la chiave API ZeroOne e riprovare",
- "InvalidZhipuAPIKey": "Chiave API Zhipu non corretta o vuota, controlla la chiave API Zhipu e riprova",
+ "InvalidProviderAPIKey": "{{provider}} Chiave API non valida o vuota, controlla la Chiave API di {{provider}} e riprova",
"LocationNotSupportError": "Spiacenti, la tua posizione attuale non supporta questo servizio modello, potrebbe essere a causa di restrizioni geografiche o servizi non attivati. Verifica se la posizione attuale supporta l'uso di questo servizio o prova a utilizzare un'altra posizione.",
- "MinimaxBizError": "Errore di servizio Minimax, controllare le informazioni seguenti o riprovare",
- "MistralBizError": "Errore di richiesta del servizio Mistral AI. Si prega di controllare le informazioni seguenti o riprovare.",
- "MoonshotBizError": "Si è verificato un errore nel servizio Moonshot, si prega di controllare le informazioni seguenti o riprovare",
"NoOpenAIAPIKey": "La chiave API OpenAI è vuota. Aggiungi una chiave API personalizzata OpenAI",
"OllamaBizError": "Errore di servizio Ollama, controllare le informazioni seguenti o riprovare",
"OllamaServiceUnavailable": "Servizio Ollama non disponibile: controllare che Ollama sia in esecuzione correttamente o che la configurazione di cross-origin di Ollama sia corretta",
- "OpenAIBizError": "Errore nella richiesta del servizio OpenAI. Segui le informazioni seguenti per individuare e riprovare",
- "OpenRouterBizError": "Errore di richiesta del servizio OpenRouter AI. Si prega di controllare le informazioni seguenti o riprovare.",
- "PerplexityBizError": "Errore di business nella richiesta del servizio Perplexity AI, controlla le informazioni seguenti o riprova",
+ "OpenAIBizError": "Errore di business di OpenAI. Si prega di controllare le informazioni seguenti o riprovare.",
"PluginApiNotFound": "Spiacenti, l'API specificata non esiste nel manifesto del plugin. Verifica che il metodo di richiesta corrisponda all'API del manifesto del plugin",
"PluginApiParamsError": "Spiacenti, la convalida dei parametri di input della richiesta del plugin non è riuscita. Verifica che i parametri di input corrispondano alle informazioni dell'API",
"PluginGatewayError": "Spiacenti, si è verificato un errore nel gateway del plugin. Verifica che la configurazione del gateway del plugin sia corretta",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Spiacenti, inizializzazione fallita del client OpenAPI. Verifica che le informazioni di configurazione di OpenAPI siano corrette",
"PluginServerError": "Errore nella risposta del server del plugin. Verifica il file descrittivo del plugin, la configurazione del plugin o l'implementazione del server",
"PluginSettingsInvalid": "Il plugin deve essere configurato correttamente prima di poter essere utilizzato. Verifica che la tua configurazione sia corretta",
- "TogetherAIBizError": "Errore di richiesta del servizio TogetherAI AI. Si prega di controllare le informazioni seguenti o riprovare.",
- "ZeroOneBizError": "Si è verificato un errore nel servizio ZeroOneBiz, si prega di controllare le informazioni seguenti o riprovare",
- "ZhipuBizError": "Errore nella richiesta del servizio Zhipu, controlla le informazioni seguenti o riprova"
+ "ProviderBizError": "Errore di business del fornitore {{provider}}. Si prega di controllare le informazioni seguenti o riprovare."
},
"stt": {
"responseError": "Errore nella richiesta del servizio. Verifica la configurazione o riprova"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Aggiungi URL del proxy OpenAI (opzionale)",
+ "apiKey": {
+ "description": "Inserisci la tua Chiave API {{name}} per iniziare la sessione",
+ "title": "Usa la tua Chiave API personalizzata {{name}}"
+ },
"closeMessage": "Chiudi messaggio",
"confirm": "Conferma e riprova",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Accedi all'account",
"welcome": "Benvenuto!"
},
- "ollama": {
- "cancel": "Annulla il download",
- "confirm": "Scarica",
- "description": "Inserisci l'etichetta del tuo modello Ollama per continuare la sessione",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Inizio download...",
- "title": "Scarica il modello Ollama specificato"
- },
"password": {
"description": "L'amministratore ha attivato la crittografia dell'applicazione. Inserisci la password dell'applicazione per sbloccarla. La password va inserita solo una volta.",
"placeholder": "Inserisci la password",
@@ -132,5 +107,9 @@
"apiKey": "Chiave API personalizzata",
"password": "Password"
}
+ },
+ "upload": {
+ "desc": "Dettagli: {{detail}}",
+ "title": "Caricamento del file fallito, controlla la connessione di rete o riprova più tardi"
}
}
diff --git a/locales/it-IT/metadata.json b/locales/it-IT/metadata.json
new file mode 100644
index 000000000000..d2022380324f
--- /dev/null
+++ b/locales/it-IT/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offre la migliore esperienza di utilizzo di ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: strumento personale per la produttività LLM, per un cervello più intelligente"
+ },
+ "market": {
+ "description": "Creazione di contenuti, copywriting, domande e risposte, generazione di immagini, generazione di video, generazione vocale, agente intelligente, flusso di lavoro automatizzato, personalizza il tuo assistente intelligente AI / GPTs / OLLaMA",
+ "title": "Mercato degli assistenti"
+ },
+ "plugins": {
+ "description": "Ricerca, generazione di grafici, accademico, generazione di immagini, generazione di video, generazione vocale, flusso di lavoro automatizzato, personalizza le capacità di plugin di ToolCall esclusive di ChatGPT / OLLaMA",
+ "title": "Mercato dei plugin"
+ },
+ "welcome": {
+ "description": "LobeChat offre la migliore esperienza di utilizzo di ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Benvenuto su LobeChat: strumento personale per la produttività LLM, per un cervello più intelligente"
+ }
+}
diff --git a/locales/it-IT/modelProvider.json b/locales/it-IT/modelProvider.json
index e488b950c639..07810bf158db 100644
--- a/locales/it-IT/modelProvider.json
+++ b/locales/it-IT/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Deve includere http(s):// oltre all'indirizzo predefinito",
- "placeholder": "https://api.anthropic.com",
- "title": "Indirizzo API Proxy"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Inserisci la chiave API da Anthropic",
- "placeholder": "Chiave API Anthropic",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Anthropic per avviare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API Anthropic personalizzata"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Versione dell'API di Azure, nel formato YYYY-MM-DD, consulta [ultima versione](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Quando si controllano le risorse dal portale di Azure, questo valore si trova nella sezione 'Chiavi e endpoint'. Puoi usare KEY1 o KEY2",
"placeholder": "Chiave API Azure",
"title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Azure OpenAI per avviare la sessione",
- "title": "Usa una chiave API Azure OpenAI personalizzata"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Usa le informazioni di autenticazione Bedrock personalizzate"
}
},
- "google": {
- "endpoint": {
- "desc": "Deve includere http(s):// oltre all'indirizzo predefinito",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Indirizzo dell'API Proxy"
- },
- "title": "Google",
- "token": {
- "desc": "Inserisci la chiave API da Google",
- "placeholder": "Chiave API Google",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Google per avviare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API Google personalizzata"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Inserisci la chiave API da Groq",
- "placeholder": "Chiave API Groq",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Groq per avviare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API Groq personalizzata"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Inserisci la tua chiave API Minimax",
- "placeholder": "Chiave API Minimax",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Minimax per avviare la sessione. L'applicazione non memorizzerà la tua chiave API.",
- "title": "Utilizza una chiave API Minimax personalizzata"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Inserisci la chiave API da Mistral AI",
- "placeholder": "Chiave API Mistral AI",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API Mistral AI per avviare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API Mistral AI personalizzata"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Inserisci la tua chiave API da Moonshot AI",
- "placeholder": "Chiave API Moonshot AI",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da Moonshot AI per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da Moonshot AI"
- }
- },
"ollama": {
"checker": {
- "desc": "Verifica se l'indirizzo del proxy è stato compilato correttamente"
+ "desc": "Verifica se l'indirizzo del proxy è stato compilato correttamente",
+ "title": "Controllo della connettività"
},
"customModelName": {
"desc": "Aggiungi modelli personalizzati, separati da virgola (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Nome del modello personalizzato"
},
+ "download": {
+ "desc": "Ollama sta scaricando questo modello, per favore non chiudere questa pagina. Il download verrà interrotto e riprenderà dal punto in cui si è interrotto in caso di riavvio.",
+ "remainingTime": "Tempo rimanente",
+ "speed": "Velocità di download",
+ "title": "Download del modello in corso {{model}}"
+ },
"endpoint": {
"desc": "Inserisci l'indirizzo del proxy dell'interfaccia Ollama. Lascia vuoto se non specificato localmente",
- "placeholder": "http://127.0.0.1:11434",
"title": "Indirizzo del proxy dell'interfaccia"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Versione di anteprima)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Deve includere http(s):// oltre all'indirizzo predefinito",
- "placeholder": "https://api.openai.com/v1",
- "title": "Indirizzo del proxy dell'interfaccia"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Utilizza la tua chiave OpenAI",
- "placeholder": "Chiave API OpenAI",
- "title": "Chiave API OpenAI"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da OpenAI per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da OpenAI"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Verifica se l'indirizzo del proxy è stato compilato correttamente"
- },
- "customModelName": {
- "desc": "Aggiungi modelli personalizzati, separati da virgola (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Nome del modello personalizzato"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Inserisci la tua chiave API da OpenRouter AI",
- "placeholder": "Chiave API OpenRouter AI",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da OpenRouter per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da OpenRouter"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Inserisci la tua chiave API da Perplexity AI",
- "placeholder": "Chiave API Perplexity AI",
- "title": "Chiave API"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Inserisci la tua chiave API da Perplexity per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da Perplexity"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Verifica se l'indirizzo del proxy è stato compilato correttamente"
- },
- "customModelName": {
- "desc": "Aggiungi modelli personalizzati, separati da virgola (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Nome del modello personalizzato"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Inserisci la tua chiave API da TogetherAI AI",
- "placeholder": "Chiave API TogetherAI AI",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da TogetherAI per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da TogetherAI"
+ "cancel": "Annulla download",
+ "confirm": "Download",
+ "description": "Inserisci l'etichetta del modello Ollama per continuare la sessione",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Inizio download...",
+ "title": "Scarica il modello Ollama specificato"
}
},
"zeroone": {
- "title": "01.AI ZeroOne",
- "token": {
- "desc": "Inserisci la tua chiave API da 01.AI ZeroOne",
- "placeholder": "Chiave API 01.AI ZeroOne",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da 01.AI ZeroOne per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da 01.AI ZeroOne"
- }
+ "title": "01.AI ZeroOne"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Inserisci la tua chiave API da Zhipu",
- "placeholder": "Chiave API Zhipu",
- "title": "Chiave API"
- },
- "unlock": {
- "description": "Inserisci la tua chiave API da Zhipu per iniziare la sessione. L'applicazione non memorizzerà la tua chiave API",
- "title": "Usa una chiave API personalizzata da Zhipu"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/it-IT/plugin.json b/locales/it-IT/plugin.json
index 566a45de6b54..82ea14ab5732 100644
--- a/locales/it-IT/plugin.json
+++ b/locales/it-IT/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Chiamata di funzione",
"off": "Disattivato",
"on": "Visualizza informazioni sulla chiamata del plugin",
- "response": "Risposta"
+ "payload": "carico del plugin",
+ "response": "Risposta",
+ "tool_call": "richiesta di chiamata dello strumento"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Esecuzione del plugin in corso..."
},
"pluginList": "Elenco dei plugin",
- "plugins": {
- "loading": "Rilevamento dei plugin in corso...",
- "unknown": "Plugin sconosciuto"
- },
"setting": "Impostazioni del plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installati"
},
"title": "Negozio dei plugin"
- }
+ },
+ "unknownPlugin": "Plugin sconosciuto"
}
diff --git a/locales/it-IT/setting.json b/locales/it-IT/setting.json
index e4ae685bbef5..2d9772df342b 100644
--- a/locales/it-IT/setting.json
+++ b/locales/it-IT/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Informazioni"
},
+ "agentTab": {
+ "chat": "Preferenze di chat",
+ "meta": "Informazioni assistente",
+ "modal": "Impostazioni modello",
+ "plugin": "Impostazioni plugin",
+ "prompt": "Impostazioni ruolo",
+ "tts": "Servizio vocale"
+ },
"analytics": {
"telemetry": {
"desc": "Attivando l'invio dei dati di telemetria, ci aiuti a migliorare complessivamente l'esperienza utente di LobeChat",
@@ -35,10 +43,14 @@
"title": "Impostazioni"
},
"llm": {
+ "apiKey": {
+ "desc": "Inserisci la tua chiave API {{name}}",
+ "placeholder": "Chiave API {{name}}",
+ "title": "Chiave API"
+ },
"checker": {
"button": "Verifica",
"desc": "Verifica se la chiave API e l'indirizzo del proxy sono stati inseriti correttamente",
- "ollamaDesc": "Verifica se l'indirizzo del proxy è stato compilato correttamente",
"pass": "Verifica superata",
"title": "Verifica di connettività"
},
@@ -90,22 +102,19 @@
"latestTime": "Ultimo aggiornamento: {{time}}",
"noLatestTime": "Nessun elenco disponibile al momento"
},
+ "helpDoc": "Guida alla configurazione",
"modelList": {
"desc": "Seleziona i modelli da visualizzare durante la sessione, i modelli selezionati verranno mostrati nell'elenco dei modelli",
"placeholder": "Seleziona un modello dall'elenco",
"title": "Elenco dei modelli",
"total": "Totale modelli disponibili: {{count}}"
},
+ "proxyUrl": {
+ "desc": "Deve includere http(s):// oltre all'indirizzo predefinito",
+ "title": "Indirizzo del proxy API"
+ },
"waitingForMore": "Altri modelli sono in fase di <1> pianificazione per l'integrazione 1>, resta sintonizzato ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama sta scaricando questo modello. Si prega di non chiudere questa pagina. Il download verrà ripreso dal punto in cui è stato interrotto in caso di riavvio.",
- "remainingTime": "Tempo rimanente",
- "speed": "Velocità di download",
- "title": "Download del modello {{model}} in corso"
- }
- },
"plugin": {
"addTooltip": "Aggiungi plugin personalizzato",
"clearDeprecated": "Rimuovi plugin non validi",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Illimitato",
"limited": "Include solo {{number}} messaggi di conversazione",
+ "setlimited": "Imposta il numero di messaggi storici da utilizzare",
"title": "Limita il numero di messaggi storici",
"unlimited": "Numero illimitato di messaggi storici"
},
@@ -356,6 +366,24 @@
"title": "Sincronizzazione WebRTC"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Modello di generazione metadati assistente",
+ "modelDesc": "Modello specificato per generare nome, descrizione, avatar e etichetta dell'assistente",
+ "title": "Genera automaticamente informazioni sull'assistente"
+ },
+ "title": "Assistente di sistema",
+ "topic": {
+ "label": "Modello di denominazione degli argomenti",
+ "modelDesc": "Modello designato per la ridenominazione automatica degli argomenti",
+ "title": "Ridenominazione automatica degli argomenti"
+ },
+ "translation": {
+ "label": "Modello di traduzione",
+ "modelDesc": "Modello specificato per la traduzione",
+ "title": "Impostazioni dell'assistente di traduzione"
+ }
+ },
"tab": {
"about": "Informazioni",
"agent": "Assistente predefinito",
@@ -363,6 +391,7 @@
"experiment": "实验",
"llm": "Modello linguistico",
"sync": "云端同步",
+ "system-agent": "Assistente di sistema",
"tts": "Servizio vocale"
},
"tools": {
diff --git a/locales/it-IT/tool.json b/locales/it-IT/tool.json
index cddcbe53af28..3ec2f38de749 100644
--- a/locales/it-IT/tool.json
+++ b/locales/it-IT/tool.json
@@ -4,6 +4,7 @@
"downloading": "Il link dell'immagine generata da DALL·E3 è valido solo per 1 ora, sta scaricando l'immagine in locale...",
"generate": "Genera",
"generating": "Generazione in corso...",
- "images": "Immagini:"
+ "images": "Immagini:",
+ "prompt": "parola chiave"
}
}
diff --git a/locales/ja-JP/auth.json b/locales/ja-JP/auth.json
index 35c0e6535c26..0caf5566e4ea 100644
--- a/locales/ja-JP/auth.json
+++ b/locales/ja-JP/auth.json
@@ -1,6 +1,8 @@
{
"login": "ログイン",
"loginOrSignup": "ログイン / 登録",
+ "profile": "プロフィール",
+ "security": "セキュリティ",
"signout": "ログアウト",
"signup": "サインアップ"
}
diff --git a/locales/ja-JP/chat.json b/locales/ja-JP/chat.json
index e3c26d7b0a19..0945d77aa9c4 100644
--- a/locales/ja-JP/chat.json
+++ b/locales/ja-JP/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "こんにちは、私は **{{name}}** です。すぐにチャットを開始するか、[エージェント設定](/chat/settings#session={{id}}) に移動して私の情報を完全にすることができます。",
"agentDefaultMessageWithSystemRole": "こんにちは、私は **{{name}}** です、{{systemRole}}、さあ、チャットを始めましょう!",
+ "agentsAndConversations": "エージェントと会話",
"backToBottom": "現在に戻る",
"clearCurrentMessages": "現在の会話をクリア",
"confirmClearCurrentMessages": "現在の会話をクリアします。クリアした後は元に戻すことはできません。操作を確認してください。",
@@ -39,7 +40,6 @@
"regenerate": "再生成"
},
"newAgent": "新しいエージェント",
- "noDescription": "説明なし",
"pin": "ピン留め",
"pinOff": "ピン留め解除",
"regenerate": "再生成",
@@ -83,6 +83,7 @@
"chats": "チャットメッセージ",
"rest": "残り利用可能",
"systemRole": "システムロール設定",
+ "title": "コンテキストの詳細",
"tools": "ツール設定",
"total": "合計利用可能",
"used": "合計使用"
diff --git a/locales/ja-JP/common.json b/locales/ja-JP/common.json
index 2d5e7dda93d8..eb85e053ca8c 100644
--- a/locales/ja-JP/common.json
+++ b/locales/ja-JP/common.json
@@ -1,7 +1,7 @@
{
"about": "概要",
"advanceSettings": "高度な設定",
- "appInitializing": "LobeChatを初期化中です。しばらくお待ちください...",
+ "appInitializing": "アプリケーションを初期化しています。しばらくお待ちください...",
"autoGenerate": "自動生成",
"autoGenerateTooltip": "ヒントに基づいてエージェントの説明を自動生成します",
"autoGenerateTooltipDisabled": "ツールチップを入力してから自動生成機能を使用してください",
@@ -9,6 +9,7 @@
"cancel": "キャンセル",
"changelog": "変更履歴",
"close": "閉じる",
+ "contact": "お問い合わせ",
"copy": "コピー",
"copyFail": "コピーに失敗しました",
"copySuccess": "コピーが成功しました",
@@ -35,10 +36,33 @@
},
"feedback": "フィードバック",
"follow": " {{name}} で私たちをフォローする",
+ "footer": {
+ "action": {
+ "feedback": "貴重なフィードバックを共有する",
+ "star": "GitHub でスターを付ける"
+ },
+ "and": "および",
+ "feedback": {
+ "action": "フィードバックを共有",
+ "desc": "あなたのすべてのアイデアと提案は私たちにとって非常に貴重です。私たちはあなたの意見を知りたくてたまりません!製品の機能や使用体験に関するフィードバックを提供していただければ幸いです。LobeChat をより良くするためのお手伝いをしていただけると嬉しいです。",
+ "title": "GitHub で貴重なフィードバックを共有"
+ },
+ "later": "後で",
+ "star": {
+ "action": "スターを付ける",
+ "desc": "当社の製品が気に入っていただけた場合、GitHub でスターを付けていただけますか?この小さな行動が大きな意味を持ち、私たちが継続的に特性体験を提供する励みとなります。",
+ "title": "GitHub で私たちにスターを付ける"
+ },
+ "title": "当社の製品がお気に入りですか?"
+ },
"fullscreen": "フルスクリーンモード",
"historyRange": "履歴範囲",
"import": "インポート",
"importModal": {
+ "error": {
+ "desc": "データのインポート中にエラーが発生しました。再度インポートを試すか、<1>問題を報告1>してください。問題を迅速に解決いたします。",
+ "title": "データのインポートに失敗しました"
+ },
"finish": {
"onlySettings": "システム設定のインポートが完了しました",
"start": "開始",
@@ -46,6 +70,7 @@
"title": "データのインポートが完了しました"
},
"loading": "データをインポート中です。しばらくお待ちください...",
+ "preparing": "データのインポートモジュールを準備中...",
"result": {
"added": "インポートが成功しました",
"errors": "インポートエラー",
@@ -56,8 +81,15 @@
"topics": "トピック",
"type": "データタイプ"
},
- "title": "データのインポート"
+ "title": "データのインポート",
+ "uploading": {
+ "desc": "現在のファイルは大きすぎて、アップロード中です...",
+ "restTime": "残り時間",
+ "speed": "アップロード速度"
+ }
},
+ "information": "コミュニティと情報",
+ "installPWA": "PWAをインストール",
"lang": {
"ar": "アラビア語",
"bg-BG": "ブルガリア語",
@@ -96,7 +128,11 @@
"zh-TW": "繁体字中国語"
},
"layoutInitializing": "レイアウトを初期化中...",
- "noDescription": "説明はありません",
+ "legal": "法的声明",
+ "mail": {
+ "business": "ビジネス提携",
+ "support": "メールサポート"
+ },
"oauth": "SSO ログイン",
"officialSite": "公式サイト",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "匿名ユーザー",
"billing": "請求管理",
+ "data": "データストレージ",
"defaultNickname": "コミュニティユーザー",
"discord": "コミュニティサポート",
"docs": "使用文書",
@@ -181,5 +218,6 @@
"profile": "アカウント管理",
"setting": "アプリ設定",
"usages": "利用量統計"
- }
+ },
+ "version": "バージョン"
}
diff --git a/locales/ja-JP/components.json b/locales/ja-JP/components.json
index ca36296ac429..e6239545c4ef 100644
--- a/locales/ja-JP/components.json
+++ b/locales/ja-JP/components.json
@@ -6,7 +6,8 @@
"functionCall": "このモデルは関数呼び出し(Function Call)をサポートしています。",
"tokens": "このモデルは1つのセッションあたり最大{{tokens}}トークンをサポートしています。",
"vision": "このモデルはビジョン認識をサポートしています。"
- }
+ },
+ "removed": "選択されたモデルはリストから削除されました。選択を解除すると自動的に削除されます。"
},
"ModelSwitchPanel": {
"emptyModel": "有効なモデルがありません。設定に移動して有効にしてください。",
diff --git a/locales/ja-JP/error.json b/locales/ja-JP/error.json
index 5771b7f27e59..f36a75af5f6e 100644
--- a/locales/ja-JP/error.json
+++ b/locales/ja-JP/error.json
@@ -12,6 +12,8 @@
"retry": "再読み込み",
"title": "ページに問題が発生しました.."
},
+ "fetchError": "リクエストが失敗しました",
+ "fetchErrorDetail": "エラーの詳細",
"notFound": {
"backHome": "ホームに戻る",
"desc": "お探しのページが見つかりません。リンクが正しいかどうかをご確認ください",
@@ -52,37 +54,16 @@
"503": "申し訳ありませんが、サーバーは現在、リクエストを処理できません。オーバーロードまたはメンテナンス中の可能性があります。しばらくしてから再試行してください",
"504": "申し訳ありませんが、サーバーは上位サーバーからの応答を待っていません。しばらくしてから再試行してください",
"AgentRuntimeError": "Lobe言語モデルの実行時にエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再試行してください。",
- "AnthropicBizError": "Anthropic AIサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再度お試しください。",
- "AzureBizError": "Azure AIサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再試行してください。",
- "BedrockBizError": "Bedrockサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再試行してください。",
- "GoogleBizError": "Googleサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再試行してください。",
- "GroqBizError": "Groqサービスのリクエストでエラーが発生しました。以下の情報を確認して再試行してください。",
"InvalidAccessCode": "パスワードが正しくないか空です。正しいアクセスパスワードを入力するか、カスタムAPIキーを追加してください",
- "InvalidAnthropicAPIKey": "Anthropic APIキーが正しくないか空です。Anthropic APIキーを確認してもう一度お試しください。",
- "InvalidAzureAPIKey": "Azure APIキーが正しくないか空です。Azure APIキーを確認してから再試行してください。",
"InvalidBedrockCredentials": "Bedrockの認証に失敗しました。AccessKeyId/SecretAccessKeyを確認してから再試行してください。",
"InvalidClerkUser": "申し訳ありませんが、現在ログインしていません。続行するにはログインまたはアカウント登録を行ってください",
- "InvalidGoogleAPIKey": "Google APIキーが正しくないか空です。Google APIキーを確認してから再試行してください。",
- "InvalidGroqAPIKey": "Groq APIキーが正しくないか空です。Groq APIキーを確認して再試行してください。",
- "InvalidMinimaxAPIKey": "Minimax APIキーが正しくないか空です。Minimax APIキーを確認して再試行してください。",
- "InvalidMistralAPIKey": "Mistral AI API キーが正しくないか空です。Mistral API キーを確認して再試行してください。",
- "InvalidMoonshotAPIKey": "Moonshot AI APIキーが正しくないか空です。Moonshot APIキーを確認して再試行してください。",
"InvalidOllamaArgs": "Ollamaの設定が正しくありません。Ollamaの設定を確認してからもう一度お試しください",
- "InvalidOpenRouterAPIKey": "OpenRouter API キーが正しくないか空です。OpenRouter API キーを確認してもう一度お試しください。",
- "InvalidPerplexityAPIKey": "Perplexity APIキーが正しくないか空です。Perplexity APIキーを確認してもう一度お試しください",
- "InvalidTogetherAIAPIKey": "TogetherAI API キーが正しくないか空です。TogetherAI API キーを確認してもう一度お試しください。",
- "InvalidZeroOneAPIKey": "ZeroOne APIキーが正しくないか空です。ZeroOne APIキーを確認して再試行してください。",
- "InvalidZhipuAPIKey": "Zhipu APIキーが正しくないか空です。Zhipu APIキーを確認してから再試行してください。",
+ "InvalidProviderAPIKey": "{{provider}} APIキーが正しくないか空です。{{provider}} APIキーを確認して再試行してください。",
"LocationNotSupportError": "申し訳ありませんが、お住まいの地域ではこのモデルサービスをサポートしていません。地域制限またはサービスが利用できない可能性があります。現在の位置がこのサービスをサポートしているかどうかを確認するか、他の位置情報を使用してみてください。",
- "MinimaxBizError": "Minimaxサービスのリクエストでエラーが発生しました。以下の情報を確認して再試行してください。",
- "MistralBizError": "Mistral AI サービスのリクエストでエラーが発生しました。以下の情報を確認して再試行してください。",
- "MoonshotBizError": "月の裏側サービスのリクエストでエラーが発生しました。以下の情報を確認して再試行してください。",
"NoOpenAIAPIKey": "OpenAI APIキーが空です。カスタムOpenAI APIキーを追加してください。",
"OllamaBizError": "Ollamaサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再度お試しください",
"OllamaServiceUnavailable": "Ollamaサービスが利用できません。Ollamaが正常に動作しているか、またはOllamaのクロスオリジン設定が正しく行われているかを確認してください",
- "OpenAIBizError": "OpenAIサービスのリクエストエラーが発生しました。以下の情報に基づいて問題を解決したり、再試行したりしてください",
- "OpenRouterBizError": "OpenRouter AI サービスのリクエスト中にエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、もう一度お試しください。",
- "PerplexityBizError": "Perplexity AIサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングするか、再度お試しください",
+ "OpenAIBizError": "リクエスト OpenAI サービスでエラーが発生しました。以下の情報を確認して再試行してください。",
"PluginApiNotFound": "申し訳ありませんが、プラグインのマニフェストに指定されたAPIが見つかりませんでした。リクエストメソッドとプラグインのマニフェストのAPIが一致しているかどうかを確認してください",
"PluginApiParamsError": "申し訳ありませんが、プラグインのリクエストパラメータの検証に失敗しました。パラメータとAPIの説明が一致しているかどうか確認してください",
"PluginGatewayError": "申し訳ありませんが、プラグインゲートウェイでエラーが発生しました。プラグインゲートウェイの設定を確認してください。",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "申し訳ありませんが、OpenAPIクライアントの初期化に失敗しました。OpenAPIの設定情報を確認してください。",
"PluginServerError": "プラグインサーバーのリクエストエラーが発生しました。以下のエラーメッセージを参考に、プラグインのマニフェストファイル、設定、サーバー実装を確認してください",
"PluginSettingsInvalid": "このプラグインを使用するには、正しい設定が必要です。設定が正しいかどうか確認してください",
- "TogetherAIBizError": "TogetherAI AI サービスのリクエスト中にエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、もう一度お試しください。",
- "ZeroOneBizError": "リクエストがZeroOneサービスでエラーが発生しました。以下の情報を確認して再試行してください。",
- "ZhipuBizError": "Zhipuサービスのリクエストでエラーが発生しました。以下の情報に基づいてトラブルシューティングを行うか、再試行してください。"
+ "ProviderBizError": "リクエスト {{provider}} サービスでエラーが発生しました。以下の情報を確認して再試行してください。"
},
"stt": {
"responseError": "サービスリクエストが失敗しました。設定を確認するか、もう一度お試しください"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "OpenAI 代理アドレスを追加する(オプション)",
+ "apiKey": {
+ "description": "{{name}} APIキーを入力してセッションを開始します。",
+ "title": "カスタム{{name}} APIキーを使用"
+ },
"closeMessage": "ヒントを閉じる",
"confirm": "確認して再試行",
"oauth": {
@@ -115,14 +98,6 @@
"title": "アカウントにログイン",
"welcome": "ようこそ!"
},
- "ollama": {
- "cancel": "キャンセル",
- "confirm": "ダウンロード",
- "description": "Ollamaモデルのタグを入力して、会話を続行してください",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "ダウンロードを開始しています...",
- "title": "指定のOllamaモデルをダウンロード"
- },
"password": {
"description": "管理者によってアプリが暗号化されました。アプリをロック解除するには、アプリのパスワードを入力してください。パスワードは1回だけ入力すればよいです",
"placeholder": "パスワードを入力してください",
@@ -132,5 +107,9 @@
"apiKey": "カスタムAPIキー",
"password": "パスワード"
}
+ },
+ "upload": {
+ "desc": "詳細: {{detail}}",
+ "title": "ファイルのアップロードに失敗しました。ネットワーク接続を確認するか、後でもう一度お試しください"
}
}
diff --git a/locales/ja-JP/metadata.json b/locales/ja-JP/metadata.json
new file mode 100644
index 000000000000..2cdf6c13e5d6
--- /dev/null
+++ b/locales/ja-JP/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChatは、ChatGPT、OLLaMA、Gemini、Claude WebUIの最高の使用体験を提供します",
+ "title": "LobeChat: 個人LLM効率ツール、より賢い脳を手に入れよう"
+ },
+ "market": {
+ "description": "コンテンツ作成、コピーライティング、質問回答、画像生成、動画生成、音声生成、スマートエージェント、ワークフローの自動化、あなただけのAI / GPTs / OLLaMAスマートアシスタントをカスタマイズ",
+ "title": "アシスタントマーケット"
+ },
+ "plugins": {
+ "description": "検索、チャート生成、アカデミック、画像生成、動画生成、音声生成、ワークフローの自動化、ChatGPT / OLLaMA専用のToolCallプラグイン機能をカスタマイズ",
+ "title": "プラグインマーケット"
+ },
+ "welcome": {
+ "description": "LobeChatは、ChatGPT、OLLaMA、Gemini、Claude WebUIの最高の使用体験を提供します",
+ "title": "LobeChatをご利用いただきありがとうございます:個人LLM効率ツール、より賢い脳を手に入れよう"
+ }
+}
diff --git a/locales/ja-JP/modelProvider.json b/locales/ja-JP/modelProvider.json
index 0fb9479dcf8b..d1ef2f8948b3 100644
--- a/locales/ja-JP/modelProvider.json
+++ b/locales/ja-JP/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "デフォルトアドレス以外は、http(s)://を含む必要があります",
- "placeholder": "https://api.anthropic.com",
- "title": "APIプロキシアドレス"
- },
- "title": "Anthropic",
- "token": {
- "desc": "AnthropicからのAPIキーを入力してください",
- "placeholder": "Anthropic API Key",
- "title": "APIキー"
- },
- "unlock": {
- "description": "あなたのAnthropic APIキーを入力すると、セッションを開始できます。アプリはあなたのAPIキーを記録しません。",
- "title": "カスタムAnthropic APIキーを使用する"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure の API バージョン、YYYY-MM-DD 形式に従う、[最新バージョン](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)を参照",
@@ -34,10 +17,6 @@
"desc": "Azure ポータルでリソースを確認する際に、「キーとエンドポイント」セクションでこの値を見つけることができます。KEY1 または KEY2 を使用できます",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Azure OpenAI API Key を入力するとセッションを開始できます",
- "title": "使用カスタム Azure OpenAI API Key"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "使用カスタム Bedrock 認証情報"
}
},
- "google": {
- "endpoint": {
- "desc": "デフォルトのアドレスに加えて、http(s)://を含める必要があります",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "APIプロキシアドレス"
- },
- "title": "Google",
- "token": {
- "desc": "Google の API Key を入力してください",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Google API Key を入力するとセッションを開始できます。アプリは API Key を記録しません",
- "title": "使用カスタム Google API Key"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Groq の API Key を入力してください",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Groq API Key を入力するとセッションを開始できます。アプリは API Key を記録しません",
- "title": "使用カスタム Groq API Key"
- }
- },
- "minimax": {
- "title": "ミニマックス",
- "token": {
- "desc": "ミニマックスからのAPIキーを入力してください",
- "placeholder": "ミニマックスAPIキー",
- "title": "APIキー"
- },
- "unlock": {
- "description": "ミニマックスAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムミニマックスAPIキーを使用"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Mistral AI の API Key を入力してください",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Mistral AI API Key を入力するとセッションを開始できます。アプリは API Key を記録しません",
- "title": "使用カスタム Mistral AI API Key"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Moonshot AIのAPIキーを入力してください",
- "placeholder": "Moonshot AI APIキー",
- "title": "APIキー"
- },
- "unlock": {
- "description": "Moonshot AIのAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムMoonshot AI APIキーを使用する"
- }
- },
"ollama": {
"checker": {
- "desc": "プロキシアドレスが正しく入力されているかをテストします"
+ "desc": "プロキシアドレスが正しく入力されているかをテストします",
+ "title": "連結性チェック"
},
"customModelName": {
"desc": "カスタムモデルを追加します。複数のモデルはカンマ(,)で区切ります",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "カスタムモデル名"
},
+ "download": {
+ "desc": "Ollama is currently downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Ollamaプロキシインターフェースアドレスを入力してください。ローカルで追加の指定がない場合は空白のままにしてください",
- "placeholder": "http://127.0.0.1:11434",
"title": "プロキシインターフェースアドレス"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows(プレビュー版)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "デフォルト以外のアドレスは、http(s)://を含める必要があります",
- "placeholder": "https://api.openai.com/v1",
- "title": "プロキシインターフェースアドレス"
- },
- "title": "OpenAI",
- "token": {
- "desc": "独自のOpenAIキーを使用します",
- "placeholder": "OpenAI APIキー",
- "title": "OpenAI APIキー"
- },
- "unlock": {
- "description": "OpenAIのAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムOpenAI APIキーを使用する"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "プロキシアドレスが正しく入力されているかをテストします"
- },
- "customModelName": {
- "desc": "カスタムモデルを追加します。複数のモデルはカンマ(,)で区切ります",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "カスタムモデル名"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "OpenRouter AIのAPIキーを入力してください",
- "placeholder": "OpenRouter AI APIキー",
- "title": "APIキー"
- },
- "unlock": {
- "description": "OpenRouterのAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムOpenRouter APIキーを使用する"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Perplexity AIのAPIキーを入力してください",
- "placeholder": "Perplexity AI APIキー",
- "title": "APIキー"
- },
- "unlock": {
- "description": "PerplexityのAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムPerplexity APIキーを使用する"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "プロキシアドレスが正しく入力されているかをテストします"
- },
- "customModelName": {
- "desc": "カスタムモデルを追加します。複数のモデルはカンマ(,)で区切ります",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "カスタムモデル名"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "TogetherAI AIのAPIキーを入力してください",
- "placeholder": "TogetherAI AI APIキー",
- "title": "APIキー"
- },
+ "title": "Ollama",
"unlock": {
- "description": "TogetherAIのAPIキーを入力するとセッションが開始されます。アプリはAPIキーを記録しません",
- "title": "カスタムTogetherAI APIキーを使用する"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI 零一万物",
- "token": {
- "desc": "01.AI 零一万物からのAPIキーを入力してください",
- "placeholder": "01.AI 零一万物 API Key",
- "title": "APIキー"
- },
- "unlock": {
- "description": "あなたのZeroOne APIキーを入力すると、セッションを開始できます。アプリはあなたのAPIキーを記録しません。",
- "title": "カスタムZeroOne APIキーを使用する"
- }
+ "title": "01.AI 零一万物"
},
"zhipu": {
- "title": "智谱",
- "token": {
- "desc": "智谱からのAPIキーを入力してください",
- "placeholder": "Zhipu API Key",
- "title": "APIキー"
- },
- "unlock": {
- "description": "あなたのZhipu APIキーを入力すると、セッションを開始できます。アプリはあなたのAPIキーを記録しません。",
- "title": "カスタムZhipu APIキーを使用する"
- }
+ "title": "智谱"
}
}
diff --git a/locales/ja-JP/plugin.json b/locales/ja-JP/plugin.json
index c79f47e66ff0..73dbc0c6b95c 100644
--- a/locales/ja-JP/plugin.json
+++ b/locales/ja-JP/plugin.json
@@ -4,7 +4,9 @@
"function_call": "関数呼び出し",
"off": "デバッグをオフにする",
"on": "プラグイン呼び出し情報を表示する",
- "response": "レスポンス"
+ "payload": "ペイロード",
+ "response": "レスポンス",
+ "tool_call": "ツール呼び出し"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "プラグインの実行中..."
},
"pluginList": "プラグインリスト",
- "plugins": {
- "loading": "プラグインを読み込み中...",
- "unknown": "不明なプラグイン"
- },
"setting": "プラグインの設定",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "インストール済み"
},
"title": "プラグインストア"
- }
+ },
+ "unknownPlugin": "未知のプラグイン"
}
diff --git a/locales/ja-JP/setting.json b/locales/ja-JP/setting.json
index 77b54358fe1b..f349346d661b 100644
--- a/locales/ja-JP/setting.json
+++ b/locales/ja-JP/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "について"
},
+ "agentTab": {
+ "chat": "チャット設定",
+ "meta": "メタ情報",
+ "modal": "モーダル設定",
+ "plugin": "プラグイン設定",
+ "prompt": "プロンプト設定",
+ "tts": "音声サービス"
+ },
"analytics": {
"telemetry": {
"desc": "匿名の使用データを送信することで、LobeChat の全体的なユーザーエクスペリエンスの向上にご協力いただけます",
@@ -35,10 +43,14 @@
"title": "設定"
},
"llm": {
+ "apiKey": {
+ "desc": "あなたの {{name}} API キーを入力してください",
+ "placeholder": "{{name}} API キー",
+ "title": "API キー"
+ },
"checker": {
"button": "チェック",
"desc": "APIキーとプロキシアドレスが正しく記入されているかをテスト",
- "ollamaDesc": "代理アドレスが正しく入力されているかをテストします",
"pass": "チェック合格",
"title": "接続性チェック"
},
@@ -90,22 +102,19 @@
"latestTime": "最終更新時間:{{time}}",
"noLatestTime": "リストを取得していません"
},
+ "helpDoc": "設定ガイド",
"modelList": {
"desc": "セッションで表示するモデルを選択します。選択したモデルはモデルリストに表示されます",
"placeholder": "モデルをリストから選択してください",
"title": "モデルリスト",
"total": "合計 {{count}} 個のモデルが利用可能です"
},
+ "proxyUrl": {
+ "desc": "デフォルトのアドレスに加えて、http(s)://を含める必要があります",
+ "title": "APIプロキシアドレス"
+ },
"waitingForMore": "さらに多くのモデルが <1>計画されています1>。お楽しみに ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama はモデルをダウンロード中です。ページを閉じないようにしてください。再度ダウンロードすると、中断した箇所から再開されます。",
- "remainingTime": "残り時間",
- "speed": "ダウンロード速度",
- "title": "モデル {{model}} をダウンロード中"
- }
- },
"plugin": {
"addTooltip": "カスタムプラグイン",
"clearDeprecated": "無効なプラグインをクリア",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "制限なし",
"limited": "{{number}}件の会話メッセージのみ含む",
+ "setlimited": "使用履歴メッセージ数",
"title": "過去メッセージ数を制限する",
"unlimited": "過去メッセージ数を制限しない"
},
@@ -356,6 +366,24 @@
"title": "WebRTC 同期"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "アシスタントメタデータ生成モデル",
+ "modelDesc": "アシスタントの名前、説明、アバター、ラベルを生成するために指定されたモデル",
+ "title": "アシスタント情報の自動生成"
+ },
+ "title": "システムアシスタント",
+ "topic": {
+ "label": "トピックネーミングモデル",
+ "modelDesc": "トピックの自動リネームに使用されるモデルを指定します",
+ "title": "トピックの自動リネーム"
+ },
+ "translation": {
+ "label": "翻訳モデル",
+ "modelDesc": "翻訳に使用するモデルを指定します",
+ "title": "翻訳アシスタントの設定"
+ }
+ },
"tab": {
"about": "について",
"agent": "デフォルトエージェント",
@@ -363,6 +391,7 @@
"experiment": "実験",
"llm": "言語モデル",
"sync": "クラウド同期",
+ "system-agent": "システムアシスタント",
"tts": "音声サービス"
},
"tools": {
diff --git a/locales/ja-JP/tool.json b/locales/ja-JP/tool.json
index e75367969d00..15f3716ff522 100644
--- a/locales/ja-JP/tool.json
+++ b/locales/ja-JP/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 で生成された画像リンクは有効期間が1時間しかありません。画像をローカルにキャッシュしています...",
"generate": "生成する",
"generating": "生成中...",
- "images": "画像:"
+ "images": "画像:",
+ "prompt": "プロンプト"
}
}
diff --git a/locales/ko-KR/auth.json b/locales/ko-KR/auth.json
index 6487e8da19c0..78e9446feae6 100644
--- a/locales/ko-KR/auth.json
+++ b/locales/ko-KR/auth.json
@@ -1,6 +1,8 @@
{
"login": "로그인",
"loginOrSignup": "로그인 / 가입",
+ "profile": "프로필",
+ "security": "보안",
"signout": "로그아웃",
"signup": "가입"
}
diff --git a/locales/ko-KR/chat.json b/locales/ko-KR/chat.json
index d66da5160fc4..18c0a6683428 100644
--- a/locales/ko-KR/chat.json
+++ b/locales/ko-KR/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "안녕하세요, 저는 **{{name}}**입니다. 지금 즉시 대화를 시작하거나 [도우미 설정](/chat/settings#session={{id}})으로 이동하여 내 정보를 완성할 수 있습니다.",
"agentDefaultMessageWithSystemRole": "안녕하세요, 저는 **{{name}}**입니다. {{systemRole}}입니다. 대화를 시작해 봅시다!",
+ "agentsAndConversations": "에이전트 및 대화",
"backToBottom": "하단으로 이동",
"clearCurrentMessages": "현재 대화 지우기",
"confirmClearCurrentMessages": "현재 대화를 지우시면 되돌릴 수 없습니다. 작업을 확인하시겠습니까?",
@@ -39,7 +40,6 @@
"regenerate": "다시 생성"
},
"newAgent": "새 도우미",
- "noDescription": "설명 없음",
"pin": "고정",
"pinOff": "고정 해제",
"regenerate": "재생성",
@@ -83,6 +83,7 @@
"chats": "채팅 메시지",
"rest": "남은 사용량",
"systemRole": "시스템 역할",
+ "title": "컨텍스트 세부 정보",
"tools": "도구 설정",
"total": "총 사용량",
"used": "총 사용"
diff --git a/locales/ko-KR/common.json b/locales/ko-KR/common.json
index 1bba196c00e1..ec28272f09de 100644
--- a/locales/ko-KR/common.json
+++ b/locales/ko-KR/common.json
@@ -1,7 +1,7 @@
{
"about": "소개",
"advanceSettings": "고급 설정",
- "appInitializing": "LobeChat이 초기화 중입니다. 잠시 기다려주세요...",
+ "appInitializing": "앱을 시작하는 중입니다. 잠시 기다려주세요...",
"autoGenerate": "자동 생성",
"autoGenerateTooltip": "힌트 단어를 기반으로 에이전트 설명을 자동으로 완성합니다",
"autoGenerateTooltipDisabled": "자동 완성 기능을 사용하려면 툴팁을 입력하십시오",
@@ -9,6 +9,7 @@
"cancel": "취소",
"changelog": "변경 로그",
"close": "닫기",
+ "contact": "연락처",
"copy": "복사",
"copyFail": "복사 실패",
"copySuccess": "복사 성공",
@@ -35,10 +36,33 @@
},
"feedback": "피드백 및 제안",
"follow": "{{name}}에서 우리를 팔로우하세요",
+ "footer": {
+ "action": {
+ "feedback": "소중한 의견 공유",
+ "star": "GitHub에서 별표 추가"
+ },
+ "and": "및",
+ "feedback": {
+ "action": "피드백 공유",
+ "desc": "귀하의 모든 아이디어와 제안은 저희에게 귀중합니다. 귀하의 의견을 알고 싶어 합니다! 제품 기능 및 사용 경험 피드백을 제공하여 LobeChat을 더 나아지게 하는 데 도움을 주십시오.",
+ "title": "GitHub에서 소중한 피드백 공유"
+ },
+ "later": "나중에",
+ "star": {
+ "action": "별표 표시",
+ "desc": "만약 당신이 우리 제품을 좋아하고 우리를 지원하고 싶다면, GitHub에서 우리에게 별표를 주실 수 있을까요? 이 작은 행동은 우리에게 큰 의미가 있으며, 지속적으로 특별한 경험을 제공할 수 있도록 우리를 격려할 수 있습니다.",
+ "title": "GitHub에서 우리에게 별표 표시"
+ },
+ "title": "우리 제품을 좋아하십니까?"
+ },
"fullscreen": "전체 화면",
"historyRange": "기록 범위",
"import": "가져오기",
"importModal": {
+ "error": {
+ "desc": "데이터 가져오기 중에 문제가 발생했습니다. 다시 시도하거나 <1>문제 제출1>을 클릭하여 문제를 보고하면 우리가 즉시 도와드리겠습니다.",
+ "title": "데이터 가져오기 실패"
+ },
"finish": {
"onlySettings": "시스템 설정 가져오기 성공",
"start": "시작하기",
@@ -46,6 +70,7 @@
"title": "데이터 가져오기 완료"
},
"loading": "데이터 가져오는 중입니다. 잠시 기다려주세요...",
+ "preparing": "데이터 가져오기 모듈 준비 중...",
"result": {
"added": "가져오기 성공",
"errors": "가져오기 오류",
@@ -56,8 +81,15 @@
"topics": "주제",
"type": "데이터 유형"
},
- "title": "데이터 가져오기"
+ "title": "데이터 가져오기",
+ "uploading": {
+ "desc": "현재 파일이 크기 때문에 업로드 중입니다...",
+ "restTime": "남은 시간",
+ "speed": "업로드 속도"
+ }
},
+ "information": "커뮤니티 및 정보",
+ "installPWA": "브라우저 앱 설치",
"lang": {
"ar": "아랍어",
"bg-BG": "불가리아어",
@@ -96,7 +128,11 @@
"zh-TW": "중국어(번체)"
},
"layoutInitializing": "레이아웃을 불러오는 중...",
- "noDescription": "설명 없음",
+ "legal": "법적 고지",
+ "mail": {
+ "business": "비즈니스 협력",
+ "support": "이메일 지원"
+ },
"oauth": "SSO 로그인",
"officialSite": "공식 사이트",
"ok": "확인",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "익명 사용자",
"billing": "결제 관리",
+ "data": "데이터 저장",
"defaultNickname": "커뮤니티 사용자",
"discord": "커뮤니티 지원",
"docs": "사용 설명서",
@@ -181,5 +218,6 @@
"profile": "계정 관리",
"setting": "앱 설정",
"usages": "사용량 통계"
- }
+ },
+ "version": "버전"
}
diff --git a/locales/ko-KR/components.json b/locales/ko-KR/components.json
index bd4213e1a045..1183bb946b0c 100644
--- a/locales/ko-KR/components.json
+++ b/locales/ko-KR/components.json
@@ -6,7 +6,8 @@
"functionCall": "이 모델은 함수 호출을 지원합니다",
"tokens": "이 모델은 단일 세션당 최대 {{tokens}} 토큰을 지원합니다",
"vision": "이 모델은 시각 인식을 지원합니다"
- }
+ },
+ "removed": "모델이 목록에서 제거되었습니다. 선택이 취소되면 자동으로 제거됩니다."
},
"ModelSwitchPanel": {
"emptyModel": "활성화된 모델이 없습니다. 설정으로 이동하여 활성화하세요",
diff --git a/locales/ko-KR/error.json b/locales/ko-KR/error.json
index 86d315017d45..c01cd13be265 100644
--- a/locales/ko-KR/error.json
+++ b/locales/ko-KR/error.json
@@ -12,6 +12,8 @@
"retry": "다시 시도",
"title": "페이지에서 문제가 발생했습니다."
},
+ "fetchError": "요청 실패",
+ "fetchErrorDetail": "오류 상세",
"notFound": {
"backHome": "홈페이지로 돌아가기",
"desc": "찾고 있는 페이지를 찾을 수 없습니다. 링크가 올바른지 확인해주세요.",
@@ -52,37 +54,16 @@
"503": "죄송합니다. 서버가 현재 요청을 처리할 수 없습니다. 과부하 또는 유지 보수 중일 수 있습니다. 잠시 후에 다시 시도해주세요.",
"504": "죄송합니다. 서버가 상위 서버의 응답을 기다리지 못했습니다. 잠시 후에 다시 시도해주세요.",
"AgentRuntimeError": "Lobe 언어 모델 실행 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
- "AnthropicBizError": "Anthropic AI 서비스 요청 중 오류가 발생했습니다. 다음 정보를 확인하고 다시 시도하십시오.",
- "AzureBizError": "Azure AI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
- "BedrockBizError": "Bedrock 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
- "GoogleBizError": "Google 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
- "GroqBizError": "Groq 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
"InvalidAccessCode": "액세스 코드가 잘못되었거나 비어 있습니다. 올바른 액세스 코드를 입력하거나 사용자 지정 API 키를 추가하십시오.",
- "InvalidAnthropicAPIKey": "Anthropic API 키가 잘못되었거나 비어 있습니다. Anthropic API 키를 확인하고 다시 시도하십시오.",
- "InvalidAzureAPIKey": "잘못된 또는 비어 있는 Azure API Key입니다. Azure API Key를 확인한 후 다시 시도하십시오.",
"InvalidBedrockCredentials": "Bedrock 인증에 실패했습니다. AccessKeyId/SecretAccessKey를 확인한 후 다시 시도하십시오.",
"InvalidClerkUser": "죄송합니다. 현재 로그인되어 있지 않습니다. 계속하려면 먼저 로그인하거나 계정을 등록해주세요.",
- "InvalidGoogleAPIKey": "잘못된 또는 비어 있는 Google API Key입니다. Google API Key를 확인한 후 다시 시도하십시오.",
- "InvalidGroqAPIKey": "잘못된 또는 비어 있는 Groq API Key입니다. Groq API Key를 확인한 후 다시 시도하십시오.",
- "InvalidMinimaxAPIKey": "잘못된 Minimax API 키이거나 비어 있습니다. Minimax API 키를 확인한 후 다시 시도해주세요.",
- "InvalidMistralAPIKey": "Mistral AI API 키가 잘못되었거나 비어 있습니다. Mistral API 키를 확인한 후 다시 시도해주세요.",
- "InvalidMoonshotAPIKey": "Moonshot AI API 키가 잘못되었거나 비어 있습니다. Moonshot API 키를 확인한 후 다시 시도해주세요.",
"InvalidOllamaArgs": "Ollama 구성이 잘못되었습니다. Ollama 구성을 확인한 후 다시 시도하십시오.",
- "InvalidOpenRouterAPIKey": "OpenRouter API 키가 잘못되었거나 비어 있습니다. OpenRouter API 키를 확인한 후 다시 시도하십시오.",
- "InvalidPerplexityAPIKey": "Perplexity API 키가 잘못되었거나 비어 있습니다. Perplexity API 키를 확인한 후 다시 시도하십시오.",
- "InvalidTogetherAIAPIKey": "TogetherAI API 키가 잘못되었거나 비어 있습니다. TogetherAI API 키를 확인한 후 다시 시도하십시오.",
- "InvalidZeroOneAPIKey": "잘못된 또는 빈 제로원물 API 키입니다. 제로원물 API 키를 확인하고 다시 시도해주세요.",
- "InvalidZhipuAPIKey": "잘못된 또는 비어 있는 Zhipu API Key입니다. Zhipu API Key를 확인한 후 다시 시도하십시오.",
+ "InvalidProviderAPIKey": "{{provider}} API 키가 잘못되었거나 비어 있습니다. {{provider}} API 키를 확인하고 다시 시도하십시오.",
"LocationNotSupportError": "죄송합니다. 귀하의 현재 위치는 해당 모델 서비스를 지원하지 않습니다. 지역 제한 또는 서비스 미개통으로 인한 것일 수 있습니다. 현재 위치가 해당 서비스를 지원하는지 확인하거나 다른 위치 정보를 사용해 보십시오.",
- "MinimaxBizError": "Minimax 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하거나 다시 시도해주세요.",
- "MistralBizError": "Mistral AI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
- "MoonshotBizError": "요청한 문샷 비즈니스에 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
"NoOpenAIAPIKey": "OpenAI API 키가 비어 있습니다. 사용자 정의 OpenAI API 키를 추가해주세요.",
"OllamaBizError": "Ollama 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
"OllamaServiceUnavailable": "Ollama 서비스를 사용할 수 없습니다. Ollama가 올바르게 작동하는지 또는 Ollama의 교차 도메인 구성이 올바르게 설정되었는지 확인하십시오.",
- "OpenAIBizError": "OpenAI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 문제를 해결하거나 다시 시도해주세요.",
- "OpenRouterBizError": "OpenRouter AI 서비스 요청 중 오류가 발생했습니다. 다음 정보를 확인하고 다시 시도하십시오.",
- "PerplexityBizError": "Perplexity AI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오.",
+ "OpenAIBizError": "OpenAI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
"PluginApiNotFound": "죄송합니다. 플러그인 설명서에 해당 API가 없습니다. 요청 메서드와 플러그인 설명서 API가 일치하는지 확인해주세요.",
"PluginApiParamsError": "죄송합니다. 플러그인 요청의 입력 매개변수 유효성 검사에 실패했습니다. 입력 매개변수와 API 설명 정보가 일치하는지 확인해주세요.",
"PluginGatewayError": "죄송합니다. 플러그인 게이트웨이에 오류가 발생했습니다. 플러그인 게이트웨이 구성을 확인해주세요.",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "죄송합니다. OpenAPI 클라이언트 초기화에 실패했습니다. OpenAPI 구성 정보를 확인해주세요.",
"PluginServerError": "플러그인 서버 요청이 오류로 반환되었습니다. 플러그인 설명 파일, 플러그인 구성 또는 서버 구현을 확인해주세요.",
"PluginSettingsInvalid": "플러그인을 사용하려면 올바른 구성이 필요합니다. 구성이 올바른지 확인해주세요.",
- "TogetherAIBizError": "TogetherAI AI 서비스 요청 중 오류가 발생했습니다. 다음 정보를 확인하고 다시 시도하십시오.",
- "ZeroOneBizError": "제로원물 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요.",
- "ZhipuBizError": "Zhipu 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도하십시오."
+ "ProviderBizError": "요청한 {{provider}} 서비스에서 오류가 발생했습니다. 아래 정보를 확인하고 다시 시도해주세요."
},
"stt": {
"responseError": "서비스 요청이 실패했습니다. 구성을 확인하거나 다시 시도해주세요."
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "OpenAI 프록시 주소 추가(선택 사항)",
+ "apiKey": {
+ "description": "{{name}} API 키를 입력하면 세션을 시작할 수 있습니다.",
+ "title": "사용자 정의 {{name}} API 키 사용"
+ },
"closeMessage": "알림 닫기",
"confirm": "확인 및 다시 시도",
"oauth": {
@@ -115,14 +98,6 @@
"title": "계정 로그인",
"welcome": "환영합니다!"
},
- "ollama": {
- "cancel": "다운로드 취소",
- "confirm": "다운로드",
- "description": "Ollama 모델 태그를 입력하여 세션을 계속하세요.",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "다운로드 시작 중...",
- "title": "지정된 Ollama 모델 다운로드"
- },
"password": {
"description": "관리자가 애플리케이션 암호화를 활성화했습니다. 애플리케이션을 잠금 해제하려면 애플리케이션 비밀번호를 입력하십시오. 비밀번호는 한 번만 입력하면 됩니다.",
"placeholder": "비밀번호를 입력하세요",
@@ -132,5 +107,9 @@
"apiKey": "사용자 정의 API Key",
"password": "비밀번호"
}
+ },
+ "upload": {
+ "desc": "상세 내용: {{detail}}",
+ "title": "파일 업로드 실패, 네트워크 연결을 확인하거나 나중에 다시 시도해주세요"
}
}
diff --git a/locales/ko-KR/metadata.json b/locales/ko-KR/metadata.json
new file mode 100644
index 000000000000..1403aca6a9fc
--- /dev/null
+++ b/locales/ko-KR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat은 최고의 ChatGPT, OLLaMA, Gemini, Claude WebUI 사용 경험을 제공합니다.",
+ "title": "LobeChat: 개인 LLM 생산성 도구, 더 똑똑한 두뇌를 위해"
+ },
+ "market": {
+ "description": "콘텐츠 작성, 문구, 질의응답, 이미지 생성, 비디오 생성, 음성 생성, 지능형 에이전트, 자동화된 워크플로우를 통해 AI / GPTs / OLLaMA를 맞춤 설정하세요.",
+ "title": "어시스턴트 마켓"
+ },
+ "plugins": {
+ "description": "검색, 차트 생성, 학술, 이미지 생성, 비디오 생성, 음성 생성, 자동화된 워크플로우를 통해 ChatGPT / OLLaMA 전용 ToolCall 플러그인 능력을 맞춤 설정하세요.",
+ "title": "플러그인 마켓"
+ },
+ "welcome": {
+ "description": "LobeChat은 최고의 ChatGPT, OLLaMA, Gemini, Claude WebUI 사용 경험을 제공합니다.",
+ "title": "LobeChat를 사용해 주셔서 감사합니다: 개인 LLM 생산성 도구, 더 똑똑한 두뇌를 위해"
+ }
+}
diff --git a/locales/ko-KR/modelProvider.json b/locales/ko-KR/modelProvider.json
index 648344240538..c1b96eee6ea7 100644
--- a/locales/ko-KR/modelProvider.json
+++ b/locales/ko-KR/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "기본 주소 이외에 http(s)://를 포함해야 합니다.",
- "placeholder": "https://api.anthropic.com",
- "title": "API 프록시 주소"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Anthropic에서 제공하는 API 키를 입력하세요.",
- "placeholder": "Anthropic API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Anthropic API 키를 입력하면 세션이 시작됩니다. 애플리케이션은 API 키를 기록하지 않습니다.",
- "title": "사용자 정의 Anthropic API 키 사용"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure의 API 버전은 YYYY-MM-DD 형식을 따릅니다. [최신 버전 확인](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Azure 포털에서 리소스를 확인할 때 '키 및 엔드포인트' 섹션에서 이 값을 찾을 수 있습니다. KEY1 또는 KEY2를 사용할 수 있습니다.",
"placeholder": "Azure API 키",
"title": "API 키"
- },
- "unlock": {
- "description": "Azure OpenAI API 키를 입력하면 세션이 시작됩니다.",
- "title": "사용자 정의 Azure OpenAI API 키 사용"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "사용자 정의 Bedrock 인증 정보 사용"
}
},
- "google": {
- "endpoint": {
- "desc": "기본 주소 이외에 http(s)://를 포함해야 합니다.",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 프록시 주소"
- },
- "title": "Google",
- "token": {
- "desc": "Google에서 제공하는 API 키를 입력하세요.",
- "placeholder": "Google API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Google API 키를 입력하면 세션이 시작됩니다. 애플리케이션은 API 키를 기록하지 않습니다.",
- "title": "사용자 정의 Google API 키 사용"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Groq에서 제공하는 API 키를 입력하세요.",
- "placeholder": "Groq API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Groq API 키를 입력하면 세션이 시작됩니다. 애플리케이션은 API 키를 기록하지 않습니다.",
- "title": "사용자 정의 Groq API 키 사용"
- }
- },
- "minimax": {
- "title": "최소화",
- "token": {
- "desc": "Minimax에서 가져온 API 키를 입력하십시오",
- "placeholder": "Minimax API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Minimax API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 Minimax API 키 사용"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Mistral AI에서 제공하는 API 키를 입력하세요.",
- "placeholder": "Mistral AI API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Mistral AI API 키를 입력하면 세션이 시작됩니다. 애플리케이션은 API 키를 기록하지 않습니다.",
- "title": "사용자 정의 Mistral AI API 키 사용"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "Moonshot AI의 API 키를 입력하세요",
- "placeholder": "Moonshot AI API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "Moonshot AI API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 Moonshot AI API 키 사용"
- }
- },
"ollama": {
"checker": {
- "desc": "프록시 주소가 올바르게 입력되었는지 테스트합니다"
+ "desc": "프록시 주소가 올바르게 입력되었는지 테스트합니다",
+ "title": "연결성 검사"
},
"customModelName": {
"desc": "사용자 정의 모델을 추가하려면 쉼표(,)로 구분하여 여러 모델을 입력하세요",
"placeholder": "비쿠나,야마,코델라마,야마2:13b-텍스트",
"title": "사용자 정의 모델 이름"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. It will resume from where it left off if you restart the download.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Ollama 인터페이스 프록시 주소를 입력하세요. 로컬에서 별도로 지정하지 않은 경우 비워둘 수 있습니다",
- "placeholder": "http://127.0.0.1:11434",
"title": "인터페이스 프록시 주소"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (미리보기판)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "기본 주소 이외에 http(s)://를 포함해야 합니다",
- "placeholder": "https://api.openai.com/v1",
- "title": "인터페이스 프록시 주소"
- },
- "title": "OpenAI",
- "token": {
- "desc": "자체 OpenAI 키를 사용하세요",
- "placeholder": "OpenAI API 키",
- "title": "OpenAI API 키"
- },
- "unlock": {
- "description": "OpenAI API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 OpenAI API 키 사용"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "프록시 주소가 올바르게 입력되었는지 테스트합니다"
- },
- "customModelName": {
- "desc": "사용자 정의 모델을 추가하려면 쉼표(,)로 구분하여 여러 모델을 입력하세요",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "사용자 정의 모델 이름"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "OpenRouter AI의 API 키를 입력하세요",
- "placeholder": "OpenRouter AI API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "OpenRouter API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 OpenRouter API 키 사용"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Perplexity AI의 API 키를 입력하세요",
- "placeholder": "Perplexity AI API 키",
- "title": "API 키"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Perplexity API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 Perplexity API 키 사용"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "프록시 주소가 올바르게 입력되었는지 테스트합니다"
- },
- "customModelName": {
- "desc": "사용자 정의 모델을 추가하려면 쉼표(,)로 구분하여 여러 모델을 입력하세요",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "사용자 정의 모델 이름"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "TogetherAI AI의 API 키를 입력하세요",
- "placeholder": "TogetherAI AI API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "TogetherAI API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다",
- "title": "사용자 정의 TogetherAI API 키 사용"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Zero One All Things",
- "token": {
- "desc": "01.AI Zero One All Things의 API 키를 입력하세요",
- "placeholder": "01.AI Zero One All Things API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "귀하의 Zero One All Things API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 귀하의 API 키를 기록하지 않습니다",
- "title": "사용자 정의 Zero One All Things API 키 사용"
- }
+ "title": "01.AI Zero One All Things"
},
"zhipu": {
- "title": "지푸",
- "token": {
- "desc": "지푸의 API 키를 입력하세요",
- "placeholder": "지푸 API 키",
- "title": "API 키"
- },
- "unlock": {
- "description": "귀하의 지푸 API 키를 입력하면 세션을 시작할 수 있습니다. 애플리케이션은 귀하의 API 키를 기록하지 않습니다",
- "title": "사용자 정의 지푸 API 키 사용"
- }
+ "title": "지푸"
}
}
diff --git a/locales/ko-KR/plugin.json b/locales/ko-KR/plugin.json
index 1991baf5faf6..07f66ac22ab7 100644
--- a/locales/ko-KR/plugin.json
+++ b/locales/ko-KR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "함수 호출",
"off": "디버그 끄기",
"on": "플러그인 호출 정보 보기",
- "response": "응답"
+ "payload": "페이로드",
+ "response": "응답",
+ "tool_call": "도구 호출"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "플러그인 실행 중..."
},
"pluginList": "플러그인 목록",
- "plugins": {
- "loading": "플러그인을 확인하는 중...",
- "unknown": "알 수 없는 플러그인"
- },
"setting": "플러그인 설정",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "설치됨"
},
"title": "플러그인 스토어"
- }
+ },
+ "unknownPlugin": "알 수 없는 플러그인"
}
diff --git a/locales/ko-KR/setting.json b/locales/ko-KR/setting.json
index 3f1ea2060e25..07b7cfcdd8c2 100644
--- a/locales/ko-KR/setting.json
+++ b/locales/ko-KR/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "소개"
},
+ "agentTab": {
+ "chat": "채팅 환경",
+ "meta": "도우미 정보",
+ "modal": "모델 설정",
+ "plugin": "플러그인 설정",
+ "prompt": "역할 설정",
+ "tts": "음성 서비스"
+ },
"analytics": {
"telemetry": {
"desc": "익명 사용 데이터를 보내는 것으로 LobeChat의 전반적인 사용자 경험을 개선하는 데 도움을 줄 수 있습니다",
@@ -35,10 +43,14 @@
"title": "설정"
},
"llm": {
+ "apiKey": {
+ "desc": "당신의 {{name}} API 키를 입력해주세요",
+ "placeholder": "{{name}} API 키",
+ "title": "API 키"
+ },
"checker": {
"button": "확인",
"desc": "API Key 및 프록시 주소가 올바르게 입력되었는지 테스트합니다",
- "ollamaDesc": "프록시 주소가 올바르게 입력되었는지 확인합니다.",
"pass": "확인 통과",
"title": "연결성 확인"
},
@@ -90,22 +102,19 @@
"latestTime": "마지막 업데이트 시간: {{time}}",
"noLatestTime": "목록을 아직 가져오지 않았습니다"
},
+ "helpDoc": "구성 안내",
"modelList": {
"desc": "대화에서 표시할 모델을 선택하세요. 선택한 모델은 모델 목록에 표시됩니다",
"placeholder": "모델을 선택하세요",
"title": "모델 목록",
"total": "총 {{count}} 개 모델 사용 가능"
},
+ "proxyUrl": {
+ "desc": "기본 주소 이외에 http(s)://를 포함해야 합니다.",
+ "title": "API 프록시 주소"
+ },
"waitingForMore": "<1>계획에 따라 더 많은 모델이 추가될 예정1>이니 기대해 주세요 ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama 모델을 다운로드 중입니다. 이 페이지를 닫지 말아주세요. 다시 다운로드하면 중단된 곳부터 계속됩니다.",
- "remainingTime": "남은 시간",
- "speed": "다운로드 속도",
- "title": "{{model}} 모델 다운로드 중"
- }
- },
"plugin": {
"addTooltip": "플러그인 추가",
"clearDeprecated": "사용되지 않는 플러그인 제거",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "제한 없음",
"limited": "{{number}}개의 대화 메시지만 포함",
+ "setlimited": "사용할 메시지 수 설정",
"title": "이전 메시지 수 제한",
"unlimited": "이전 메시지 수 제한 없음"
},
@@ -356,6 +366,24 @@
"title": "WebRTC 동기화"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "어시스턴트 메타 생성 모델",
+ "modelDesc": "어시스턴트 이름, 설명, 프로필 이미지, 레이블을 생성하는 데 사용되는 모델을 지정합니다.",
+ "title": "어시스턴트 정보 자동 생성"
+ },
+ "title": "시스템 도우미",
+ "topic": {
+ "label": "주제 명명 모델",
+ "modelDesc": "주제 자동 재명명에 사용되는 모델 지정",
+ "title": "주제 자동 명명"
+ },
+ "translation": {
+ "label": "번역 모델",
+ "modelDesc": "번역에 사용되는 모델 지정",
+ "title": "번역 도우미 설정"
+ }
+ },
"tab": {
"about": "소개",
"agent": "기본 에이전트",
@@ -363,6 +391,7 @@
"experiment": "실험",
"llm": "언어 모델",
"sync": "클라우드 동기화",
+ "system-agent": "시스템 도우미",
"tts": "음성 서비스"
},
"tools": {
diff --git a/locales/ko-KR/tool.json b/locales/ko-KR/tool.json
index 682e88328b82..eebaab6b0f1f 100644
--- a/locales/ko-KR/tool.json
+++ b/locales/ko-KR/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3로 생성된 이미지 링크는 1시간 동안 유효하며, 로컬에 이미지를 캐시하는 중입니다...",
"generate": "생성",
"generating": "생성 중...",
- "images": "이미지:"
+ "images": "이미지:",
+ "prompt": "알림 단어"
}
}
diff --git a/locales/nl-NL/auth.json b/locales/nl-NL/auth.json
index fd4c8776634a..94c5ab96da1d 100644
--- a/locales/nl-NL/auth.json
+++ b/locales/nl-NL/auth.json
@@ -1,6 +1,8 @@
{
"login": "Inloggen",
"loginOrSignup": "Inloggen / Registreren",
+ "profile": "Profiel",
+ "security": "Veiligheid",
"signout": "Uitloggen",
"signup": "Registreren"
}
diff --git a/locales/nl-NL/chat.json b/locales/nl-NL/chat.json
index 77e9c4f08bae..5c2662fa7745 100644
--- a/locales/nl-NL/chat.json
+++ b/locales/nl-NL/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Hallo, ik ben **{{name}}**. Je kunt meteen met me praten of naar [Assistentinstellingen](/chat/settings#session={{id}}) gaan om mijn informatie aan te vullen.",
"agentDefaultMessageWithSystemRole": "Hallo, ik ben **{{name}}**, {{systemRole}}, laten we beginnen met praten!",
+ "agentsAndConversations": "agenten en gesprekken",
"backToBottom": "Terug naar onderen",
"clearCurrentMessages": "Huidige berichten wissen",
"confirmClearCurrentMessages": "Huidige berichten worden gewist en kunnen niet worden hersteld. Bevestig je actie.",
@@ -39,7 +40,6 @@
"regenerate": "Opnieuw genereren"
},
"newAgent": "Nieuwe assistent",
- "noDescription": "Geen beschrijving beschikbaar",
"pin": "Vastzetten",
"pinOff": "Vastzetten uitschakelen",
"regenerate": "Opnieuw genereren",
@@ -83,6 +83,7 @@
"chats": "Chats",
"rest": "Rust",
"systemRole": "Systeemrol",
+ "title": "Contextuele details",
"tools": "Tools",
"total": "Totaal",
"used": "Gebruikt"
diff --git a/locales/nl-NL/common.json b/locales/nl-NL/common.json
index 18fce3d33b58..9f87828969c8 100644
--- a/locales/nl-NL/common.json
+++ b/locales/nl-NL/common.json
@@ -1,7 +1,7 @@
{
"about": "Over",
"advanceSettings": "Geavanceerde instellingen",
- "appInitializing": "LobeChat wordt geïnitialiseerd, even geduld a.u.b...",
+ "appInitializing": "Applicatie wordt gestart, gelieve geduld te hebben...",
"autoGenerate": "Automatisch genereren",
"autoGenerateTooltip": "Automatisch assistentbeschrijving genereren op basis van suggesties",
"autoGenerateTooltipDisabled": "Schakel de automatische aanvulling in nadat u een suggestiewoord heeft ingevoerd",
@@ -9,6 +9,7 @@
"cancel": "Annuleren",
"changelog": "Wijzigingslogboek",
"close": "Sluiten",
+ "contact": "Contacteer ons",
"copy": "Kopiëren",
"copyFail": "Kopiëren mislukt",
"copySuccess": "Kopiëren gelukt",
@@ -35,10 +36,33 @@
},
"feedback": "Feedback en suggesties",
"follow": "Volg ons op {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Deel uw waardevolle feedback",
+ "star": "Voeg een ster toe op GitHub"
+ },
+ "and": "en",
+ "feedback": {
+ "action": "Feedback delen",
+ "desc": "Elk van uw ideeën en suggesties is van onschatbare waarde. We horen graag uw mening! Neem gerust contact met ons op voor feedback over productfuncties en gebruikerservaring om LobeChat te helpen verbeteren.",
+ "title": "Deel uw waardevolle feedback op GitHub"
+ },
+ "later": "Later",
+ "star": {
+ "action": "Geef een ster",
+ "desc": "Als u van ons product houdt en ons wilt steunen, kunt u ons dan een ster geven op GitHub? Deze kleine daad is voor ons van grote betekenis en zal ons motiveren om u voortdurend een geweldige ervaring te bieden.",
+ "title": "Geef ons een ster op GitHub"
+ },
+ "title": "Houdt u van ons product?"
+ },
"fullscreen": "Volledig scherm",
"historyRange": "Geschiedenisbereik",
"import": "Importeren",
"importModal": {
+ "error": {
+ "desc": "Sorry, er is een uitzondering opgetreden tijdens het importeren van gegevens. Probeer opnieuw te importeren of <1>diend een probleem in1>, we zullen het probleem zo snel mogelijk voor je onderzoeken.",
+ "title": "Gegevens importeren mislukt"
+ },
"finish": {
"onlySettings": "Systeeminstellingen succesvol geïmporteerd",
"start": "Beginnen met gebruiken",
@@ -46,6 +70,7 @@
"title": "Gegevensimport voltooid"
},
"loading": "Gegevens worden geïmporteerd, even geduld a.u.b...",
+ "preparing": "Voorbereiden van gegevensimportmodule...",
"result": {
"added": "Succesvol geïmporteerd",
"errors": "Fouten bij importeren",
@@ -56,8 +81,15 @@
"topics": "Onderwerpen",
"type": "Gegevenstype"
},
- "title": "Gegevens importeren"
+ "title": "Gegevens importeren",
+ "uploading": {
+ "desc": "Het bestand is momenteel aan het uploaden vanwege de grote omvang...",
+ "restTime": "Resterende tijd",
+ "speed": "Uploadsnelheid"
+ }
},
+ "information": "Gemeenschap en Informatie",
+ "installPWA": "Installeer de browser-app",
"lang": {
"ar": "Arabisch",
"bg-BG": "Bulgaars",
@@ -96,7 +128,11 @@
"zh-TW": "Traditioneel Chinees"
},
"layoutInitializing": "Lay-out wordt geladen...",
- "noDescription": "Geen beschrijving beschikbaar",
+ "legal": "Juridisch",
+ "mail": {
+ "business": "Zakelijke samenwerking",
+ "support": "E-mailondersteuning"
+ },
"oauth": "SSO inloggen",
"officialSite": "Officiële website",
"ok": "Oké",
@@ -104,52 +140,52 @@
"pin": "Vastzetten",
"pinOff": "Vastzetten uitschakelen",
"privacy": "Privacybeleid",
- "regenerate": "重新生成",
- "rename": "重命名",
- "reset": "重置",
- "retry": "重试",
- "send": "发送",
- "setting": "设置",
- "share": "分享",
- "stop": "停止",
+ "regenerate": "Opnieuw genereren",
+ "rename": "Naam wijzigen",
+ "reset": "Resetten",
+ "retry": "Opnieuw proberen",
+ "send": "Verzenden",
+ "setting": "Instelling",
+ "share": "Delen",
+ "stop": "Stoppen",
"sync": {
"actions": {
- "settings": "同步设置",
- "sync": "立即同步"
+ "settings": "Synchronisatie-instellingen",
+ "sync": "Nu synchroniseren"
},
"awareness": {
- "current": "当前设备"
+ "current": "Huidig apparaat"
},
- "channel": "频道",
+ "channel": "Kanaal",
"disabled": {
"actions": {
- "enable": "开启云端同步",
- "settings": "配置同步参数"
+ "enable": "Cloudsynchronisatie inschakelen",
+ "settings": "Synchronisatie-instellingen configureren"
},
- "desc": "当前会话数据仅存储于此浏览器中。如果你需要在多个设备间同步数据,请配置并开启云端同步。",
- "title": "数据同步未开启"
+ "desc": "De huidige gespreksgegevens worden alleen opgeslagen in deze browser. Als u gegevens wilt synchroniseren tussen meerdere apparaten, configureer en schakel dan cloudsynchronisatie in.",
+ "title": "Gegevenssynchronisatie is uitgeschakeld"
},
"enabled": {
- "title": "数据同步"
+ "title": "Gegevenssynchronisatie"
},
"status": {
- "connecting": "连接中",
- "disabled": "同步未开启",
- "ready": "已连接",
- "synced": "已同步",
- "syncing": "同步中",
- "unconnected": "连接失败"
+ "connecting": "Verbinding maken",
+ "disabled": "Synchronisatie is uitgeschakeld",
+ "ready": "Verbonden",
+ "synced": "Gesynchroniseerd",
+ "syncing": "Synchroniseren",
+ "unconnected": "Verbinding mislukt"
},
- "title": "同步状态",
+ "title": "Synchronisatiestatus",
"unconnected": {
- "tip": "信令服务器连接失败,将无法建立点对点通信频道,请检查网络后重试"
+ "tip": "Verbindingsfout met de signaleringsserver. Er kan geen point-to-point-communicatiekanaal worden opgezet. Controleer het netwerk en probeer het opnieuw."
}
},
"tab": {
- "chat": "会话",
- "market": "发现",
- "me": "我",
- "setting": "设置"
+ "chat": "Chat",
+ "market": "Ontdekken",
+ "me": "Ik",
+ "setting": "Instellingen"
},
"telemetry": {
"allow": "Toestaan",
@@ -158,28 +194,30 @@
"learnMore": "Meer informatie",
"title": "Help LobeChat verbeteren"
},
- "temp": "临时",
- "terms": "Algemene voorwaarden",
- "updateAgent": "更新助理信息",
+ "temp": "tijdelijk",
+ "terms": "algemene voorwaarden",
+ "updateAgent": "update assistent",
"upgradeVersion": {
- "action": "升级",
- "hasNew": "有可用更新",
- "newVersion": "有新版本可用:{{version}}"
+ "action": "upgraden",
+ "hasNew": "nieuwe versie beschikbaar",
+ "newVersion": "nieuwe versie beschikbaar: {{version}}"
},
"userPanel": {
- "anonymousNickName": "Anonieme gebruiker",
- "billing": "账单管理",
- "defaultNickname": "Standaardgebruiker",
- "discord": "社区支持",
- "docs": "使用文档",
- "email": "邮件支持",
- "feedback": "反馈与建议",
- "help": "帮助中心",
- "moveGuide": "De instellingenknop is hierheen verplaatst",
- "plans": "订阅方案",
- "preview": "Voorbeeld",
- "profile": "账户管理",
- "setting": "应用设置",
- "usages": "用量统计"
- }
+ "anonymousNickName": "anonieme gebruiker",
+ "billing": "facturatie",
+ "data": "gegevensopslag",
+ "defaultNickname": "communitygebruiker",
+ "discord": "communityondersteuning",
+ "docs": "gebruiksaanwijzing",
+ "email": "e-mailondersteuning",
+ "feedback": "feedback en suggesties",
+ "help": "helpcentrum",
+ "moveGuide": "instellingen verplaatst naar hier",
+ "plans": "abonnementen",
+ "preview": "voorbeeldversie",
+ "profile": "accountbeheer",
+ "setting": "app-instellingen",
+ "usages": "gebruiksstatistieken"
+ },
+ "version": "Versie"
}
diff --git a/locales/nl-NL/components.json b/locales/nl-NL/components.json
index b1a2cb874327..a96f2d92c00d 100644
--- a/locales/nl-NL/components.json
+++ b/locales/nl-NL/components.json
@@ -6,7 +6,8 @@
"functionCall": "This model supports function call.",
"tokens": "This model supports up to {{tokens}} tokens in a single session.",
"vision": "This model supports visual recognition."
- }
+ },
+ "removed": "Dit model staat niet meer in de lijst. Als je het deselecteert, wordt het automatisch verwijderd."
},
"ModelSwitchPanel": {
"emptyModel": "No enabled model, please go to settings to enable.",
diff --git a/locales/nl-NL/error.json b/locales/nl-NL/error.json
index 6a391f746e28..a542f98ce9db 100644
--- a/locales/nl-NL/error.json
+++ b/locales/nl-NL/error.json
@@ -12,6 +12,8 @@
"retry": "Opnieuw proberen",
"title": "Er is een probleem opgetreden op de pagina.."
},
+ "fetchError": "Verzoek mislukt",
+ "fetchErrorDetail": "Foutdetails",
"notFound": {
"backHome": "Terug naar startpagina",
"desc": "We kunnen de pagina die je zoekt niet vinden, controleer of de link juist is",
@@ -52,37 +54,16 @@
"503": "Sorry, de server kan uw verzoek momenteel niet verwerken vanwege overbelasting of onderhoud. Probeer het later opnieuw",
"504": "Sorry, de server heeft geen reactie ontvangen van de upstream server. Probeer het later opnieuw",
"AgentRuntimeError": "Lobe language model runtime execution error, please troubleshoot or retry based on the following information",
- "AnthropicBizError": "Er is een fout opgetreden bij het aanvragen van de Anthropic AI-service. Controleer de onderstaande informatie en probeer het opnieuw.",
- "AzureBizError": "Error requesting Azure AI service, please troubleshoot or retry based on the following information",
- "BedrockBizError": "Error requesting Bedrock service, please troubleshoot or retry based on the following information",
- "GoogleBizError": "Error requesting Google service, please troubleshoot or retry based on the following information",
- "GroqBizError": "Er is een fout opgetreden bij het aanroepen van de Groq-service. Controleer de onderstaande informatie of probeer het opnieuw.",
"InvalidAccessCode": "Ongeldige toegangscode: het wachtwoord is onjuist of leeg. Voer de juiste toegangscode in of voeg een aangepaste API-sleutel toe.",
- "InvalidAnthropicAPIKey": "Anthropic API Key is onjuist of leeg. Controleer de Anthropic API Key en probeer het opnieuw.",
- "InvalidAzureAPIKey": "Incorrect or empty Azure API Key, please check the Azure API Key and retry",
"InvalidBedrockCredentials": "Bedrock authentication failed, please check AccessKeyId/SecretAccessKey and retry",
"InvalidClerkUser": "Sorry, you are not currently logged in. Please log in or register an account to continue.",
- "InvalidGoogleAPIKey": "Incorrect or empty Google API Key, please check the Google API Key and retry",
- "InvalidGroqAPIKey": "Groq API Key is onjuist of leeg. Controleer de Groq API Key en probeer het opnieuw.",
- "InvalidMinimaxAPIKey": "Ongeldige of lege Minimax API-sleutel. Controleer de Minimax API-sleutel en probeer het opnieuw.",
- "InvalidMistralAPIKey": "Ongeldige of lege Mistral AI API-sleutel. Controleer de Mistral API-sleutel en probeer het opnieuw.",
- "InvalidMoonshotAPIKey": "Moonshot AI API密钥不正确或为空,请检查Moonshot API密钥后重试",
"InvalidOllamaArgs": "Ollama-configuratie is onjuist, controleer de Ollama-configuratie en probeer het opnieuw",
- "InvalidOpenRouterAPIKey": "OpenRouter API Key is onjuist of leeg. Controleer de OpenRouter API Key en probeer het opnieuw.",
- "InvalidPerplexityAPIKey": "Perplexity API Key is onjuist of leeg. Controleer de Perplexity API Key en probeer het opnieuw.",
- "InvalidTogetherAIAPIKey": "TogetherAI API Key is onjuist of leeg. Controleer de TogetherAI API Key en probeer het opnieuw.",
- "InvalidZeroOneAPIKey": "Ongeldige ZeroOneAPI-sleutel of leeg, controleer de ZeroOneAPI-sleutel en probeer het opnieuw",
- "InvalidZhipuAPIKey": "Incorrect or empty Zhipu API Key, please check the Zhipu API Key and retry",
+ "InvalidProviderAPIKey": "{{provider}} API-sleutel is onjuist of leeg. Controleer de {{provider}} API-sleutel en probeer het opnieuw.",
"LocationNotSupportError": "Sorry, your current location does not support this model service, possibly due to regional restrictions or service not being available. Please confirm if the current location supports using this service, or try using other location information.",
- "MinimaxBizError": "Er is een fout opgetreden bij het aanroepen van de Minimax-service. Controleer de volgende informatie of probeer het opnieuw.",
- "MistralBizError": "Er is een fout opgetreden bij het aanroepen van de Mistral AI-service. Controleer de onderstaande informatie of probeer het opnieuw.",
- "MoonshotBizError": "Er is een fout opgetreden bij het aanroepen van de Moonshot-service. Controleer de volgende informatie of probeer het opnieuw.",
"NoOpenAIAPIKey": "OpenAI API-sleutel ontbreekt. Voeg een aangepaste OpenAI API-sleutel toe",
"OllamaBizError": "Fout bij het aanroepen van de Ollama-service, controleer de onderstaande informatie en probeer opnieuw",
"OllamaServiceUnavailable": "Ollama-service niet beschikbaar. Controleer of Ollama correct werkt en of de cross-origin configuratie van Ollama juist is ingesteld.",
- "OpenAIBizError": "Fout bij het aanvragen van OpenAI-service. Controleer de onderstaande informatie voor probleemoplossing of probeer opnieuw",
- "OpenRouterBizError": "Fout bij het aanvragen van OpenRouter AI-service. Controleer de onderstaande informatie en probeer opnieuw.",
- "PerplexityBizError": "Er is een fout opgetreden bij het aanvragen van de Perplexity AI-service. Controleer de onderstaande informatie en probeer het opnieuw.",
+ "OpenAIBizError": "Er is een fout opgetreden bij het aanvragen van de OpenAI-service. Controleer de volgende informatie of probeer het opnieuw.",
"PluginApiNotFound": "Sorry, de API van de plug-inbeschrijvingslijst bestaat niet. Controleer of uw verzoeksmethode overeenkomt met de plug-inbeschrijvingslijst API",
"PluginApiParamsError": "Sorry, de validatie van de invoerparameters van de plug-in is mislukt. Controleer of de invoerparameters overeenkomen met de API-beschrijving",
"PluginGatewayError": "Sorry, er is een fout opgetreden in de plug-in gateway. Controleer of de plug-in gatewayconfiguratie juist is",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Sorry, initialisatie van de OpenAPI-client is mislukt. Controleer of de configuratie van OpenAPI juist is",
"PluginServerError": "Fout bij serverrespons voor plug-in. Controleer de foutinformatie hieronder voor uw plug-inbeschrijvingsbestand, plug-inconfiguratie of serverimplementatie",
"PluginSettingsInvalid": "Deze plug-in moet correct geconfigureerd zijn voordat deze kan worden gebruikt. Controleer of uw configuratie juist is",
- "TogetherAIBizError": "Fout bij het aanvragen van TogetherAI AI-service. Controleer de onderstaande informatie en probeer opnieuw.",
- "ZeroOneBizError": "请求零一万物服务出错,请根据以下信息排查或重试",
- "ZhipuBizError": "Error requesting Zhipu service, please troubleshoot or retry based on the following information"
+ "ProviderBizError": "Er is een fout opgetreden bij het aanvragen van de {{provider}}-service. Controleer de volgende informatie of probeer het opnieuw."
},
"stt": {
"responseError": "Serviceverzoek mislukt. Controleer de configuratie of probeer opnieuw"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Voeg een optionele OpenAI-proxy-URL toe",
+ "apiKey": {
+ "description": "Voer uw {{name}} API-sleutel in om de sessie te starten.",
+ "title": "Gebruik aangepaste {{name}} API-sleutel"
+ },
"closeMessage": "Sluit bericht",
"confirm": "Bevestigen en opnieuw proberen",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Account inloggen",
"welcome": "Welkom!"
},
- "ollama": {
- "cancel": "Annuleren",
- "confirm": "Bevestigen",
- "description": "Voer uw Ollama-modeltag in om door te gaan met de sessie",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Downloaden begint...",
- "title": "Specifiek Ollama-model downloaden"
- },
"password": {
"description": "De beheerder heeft app-encryptie ingeschakeld. Voer het app-wachtwoord in om de app te ontgrendelen. Het wachtwoord hoeft slechts één keer te worden ingevoerd.",
"placeholder": "Voer het wachtwoord in",
@@ -132,5 +107,9 @@
"apiKey": "Custom API Key",
"password": "Password"
}
+ },
+ "upload": {
+ "desc": "Details: {{detail}}",
+ "title": "Bestand uploaden mislukt, controleer uw internetverbinding of probeer het later opnieuw"
}
}
diff --git a/locales/nl-NL/metadata.json b/locales/nl-NL/metadata.json
new file mode 100644
index 000000000000..62f0ff24de91
--- /dev/null
+++ b/locales/nl-NL/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat biedt je de beste ChatGPT, OLLaMA, Gemini, Claude WebUI gebruikerservaring",
+ "title": "LobeChat: Persoonlijke LLM-productiviteitstool, geef jezelf een slimmer brein"
+ },
+ "market": {
+ "description": "Content creatie, copywriting, Q&A, beeldgeneratie, videogeneratie, spraakgeneratie, intelligente agent, geautomatiseerde workflows, pas je eigen AI / GPTs / OLLaMA slimme assistent aan",
+ "title": "Assistentenmarkt"
+ },
+ "plugins": {
+ "description": "Zoeken, grafieken genereren, academisch, beeldgeneratie, videogeneratie, spraakgeneratie, geautomatiseerde workflows, pas ChatGPT / OLLaMA exclusieve ToolCall plug-inmogelijkheden aan",
+ "title": "Plug-insmarkt"
+ },
+ "welcome": {
+ "description": "LobeChat biedt je de beste ChatGPT, OLLaMA, Gemini, Claude WebUI gebruikerservaring",
+ "title": "Welkom bij LobeChat: Persoonlijke LLM-productiviteitstool, geef jezelf een slimmer brein"
+ }
+}
diff --git a/locales/nl-NL/modelProvider.json b/locales/nl-NL/modelProvider.json
index b45609b70e43..9d95b27b2e9f 100644
--- a/locales/nl-NL/modelProvider.json
+++ b/locales/nl-NL/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Naast het standaardadres moet http(s):// worden opgenomen",
- "placeholder": "https://api.anthropic.com",
- "title": "API Proxy Adres"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Voer de API Key van Anthropic in",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Anthropic API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Anthropic API-sleutel"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "De API-versie van Azure, volgt het formaat YYYY-MM-DD, raadpleeg [de nieuwste versie](https://learn.microsoft.com/nl-nl/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Dit waarde kan gevonden worden in de 'Sleutels en eindpunt' sectie wanneer je een bron in Azure Portal controleert. Je kunt KEY1 of KEY2 gebruiken",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Azure OpenAI API-sleutel in om een sessie te starten",
- "title": "Gebruik aangepaste Azure OpenAI API-sleutel"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Gebruik aangepaste Bedrock-verificatiegegevens"
}
},
- "google": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "Voer de API Key van Google in",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Google API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Google API-sleutel"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Voer de API Key van Groq in",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Groq API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Groq API-sleutel"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Voer de API Key van Minimax AI in",
- "placeholder": "Minimax API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Minimax AI API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Minimax AI API-sleutel"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Voer de API Key van Mistral AI in",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Mistral AI API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Mistral AI API-sleutel"
- }
- },
- "moonshot": {
- "title": "De Donkere Kant van de Maan",
- "token": {
- "desc": "Voer de API Key van Moonshot AI in",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Moonshot AI API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Moonshot AI API-sleutel"
- }
- },
"ollama": {
"checker": {
- "desc": "Test of het proxyadres correct is ingevuld"
+ "desc": "Test of het proxyadres correct is ingevuld",
+ "title": "Connectiviteitscontrole"
},
"customModelName": {
"desc": "Voeg aangepaste modellen toe, gebruik een komma (,) om meerdere modellen te scheiden",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Aangepaste Modelnamen"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. It will resume from where it left off if you restart the download.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Voer het Ollama interface proxyadres in, laat leeg indien niet specifiek aangegeven",
- "placeholder": "http://127.0.0.1:11434",
"title": "Interface Proxyadres"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Preview)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Naast het standaardadres moet http(s):// worden opgenomen",
- "placeholder": "https://api.openai.com/v1",
- "title": "Interface Proxyadres"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Gebruik je eigen OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "Voer uw OpenAI API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste OpenAI API-sleutel"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Test of het proxyadres correct is ingevuld"
- },
- "customModelName": {
- "desc": "Voeg aangepaste modellen toe, gebruik een komma (,) om meerdere modellen te scheiden",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Aangepaste Modelnamen"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Voer de API Key van OpenRouter AI in",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw OpenRouter API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste OpenRouter API-sleutel"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Voer de API Key van Perplexity AI in",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Voer uw Perplexity API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Perplexity API-sleutel"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Test of het proxyadres correct is ingevuld"
- },
- "customModelName": {
- "desc": "Voeg aangepaste modellen toe, gebruik een komma (,) om meerdere modellen te scheiden",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Aangepaste Modelnamen"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Voer de API Key van TogetherAI AI in",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw TogetherAI API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste TogetherAI API-sleutel"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Nul Een Alles",
- "token": {
- "desc": "Voer de API Key van 01.AI Nul Een Alles in",
- "placeholder": "01.AI Nul Een Alles API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw ZeroOne API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste ZeroOne API-sleutel"
- }
+ "title": "01.AI Nul Een Alles"
},
"zhipu": {
- "title": "Intelligent Spectrum",
- "token": {
- "desc": "Voer de API Key van Intelligent Spectrum in",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Voer uw Zhipu API-sleutel in om een sessie te starten. De app zal uw API-sleutel niet opslaan",
- "title": "Gebruik aangepaste Zhipu API-sleutel"
- }
+ "title": "Intelligent Spectrum"
}
}
diff --git a/locales/nl-NL/plugin.json b/locales/nl-NL/plugin.json
index 40952cc4432d..c9b41e1c4786 100644
--- a/locales/nl-NL/plugin.json
+++ b/locales/nl-NL/plugin.json
@@ -1,111 +1,113 @@
{
"debug": {
- "arguments": "调用参数",
- "function_call": "函数调用",
- "off": "关闭调试",
- "on": "查看插件调用信息",
- "response": "返回结果"
+ "arguments": "Argumenten",
+ "function_call": "Functieoproep",
+ "off": "Zet debug uit",
+ "on": "Bekijk plug-in oproepinformatie",
+ "payload": "plug-in payload",
+ "response": "Reactie",
+ "tool_call": "Tool-oproepverzoek"
},
"detailModal": {
"info": {
- "description": "API 描述",
- "name": "API 名称"
+ "description": "API-beschrijving",
+ "name": "API-naam"
},
"tabs": {
- "info": "插件能力",
- "manifest": "安装文件",
- "settings": "设置"
+ "info": "Plug-in mogelijkheden",
+ "manifest": "Installatiebestand",
+ "settings": "Instellingen"
},
- "title": "插件详情"
+ "title": "Plug-in Details"
},
"dev": {
- "confirmDeleteDevPlugin": "即将删除该本地插件,删除后将无法找回,是否删除该插件?",
+ "confirmDeleteDevPlugin": "Weet u zeker dat u deze lokale plug-in wilt verwijderen? Eenmaal verwijderd, kan het niet worden hersteld.",
"customParams": {
"useProxy": {
- "label": "通过代理安装(如遇到跨域访问错误,可尝试开启该选项后重新安装)"
+ "label": "Installeren via proxy (als u problemen ondervindt met toegang tot cross-origin, probeer dan deze optie in te schakelen en opnieuw te installeren)"
}
},
- "deleteSuccess": "插件删除成功",
+ "deleteSuccess": "Plug-in succesvol verwijderd",
"manifest": {
"identifier": {
- "desc": "插件的唯一标识",
- "label": "标识符"
+ "desc": "De unieke identificatie van de plug-in",
+ "label": "Identificatie"
},
"mode": {
- "local": "可视化配置",
- "local-tooltip": "暂时不支持可视化配置",
- "url": "在线链接"
+ "local": "Visuele configuratie",
+ "local-tooltip": "Visuele configuratie wordt op dit moment niet ondersteund",
+ "url": "Online link"
},
"name": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "De titel van de plug-in",
+ "label": "Titel",
+ "placeholder": "Zoekmachine"
}
},
"meta": {
"author": {
- "desc": "插件的作者",
- "label": "作者"
+ "desc": "De auteur van de plug-in",
+ "label": "Auteur"
},
"avatar": {
- "desc": "插件的图标,可以使用 Emoji,也可以使用 URL",
- "label": "图标"
+ "desc": "Het pictogram van de plug-in, kan een Emoji of een URL zijn",
+ "label": "Pictogram"
},
"description": {
- "desc": "插件描述",
- "label": "描述",
- "placeholder": "查询搜索引擎获取信息"
+ "desc": "De beschrijving van de plug-in",
+ "label": "Beschrijving",
+ "placeholder": "Informatie verkrijgen van zoekmachines"
},
- "formFieldRequired": "该字段为必填项",
+ "formFieldRequired": "Dit veld is verplicht",
"homepage": {
- "desc": "插件的首页",
- "label": "首页"
+ "desc": "De startpagina van de plug-in",
+ "label": "Startpagina"
},
"identifier": {
- "desc": "插件的唯一标识,将从 manifest 中自动识别",
- "errorDuplicate": "标识符和已有插件重复,请修改标识符",
- "label": "标识符",
- "pattenErrorMessage": "只能输入英文字符、数字 、- 和_ 这两个符号"
+ "desc": "De unieke identificatie van de plug-in, ondersteunt alleen alfanumerieke tekens, koppelteken - en underscore _",
+ "errorDuplicate": "De identificatie wordt al gebruikt door een andere plug-in, wijzig de identificatie",
+ "label": "Identificatie",
+ "pattenErrorMessage": "Alleen alfanumerieke tekens, koppelteken - en underscore _ zijn toegestaan"
},
"manifest": {
- "desc": "LobeChat 将会通过该链接安装插件",
- "label": "插件描述文件 (Manifest) URL",
- "preview": "预览 Manifest",
- "refresh": "刷新"
+ "desc": "LobeChat zal de plug-in installeren via deze link",
+ "label": "Plug-in Beschrijving (Manifest) URL",
+ "preview": "Voorbeeld",
+ "refresh": "Vernieuwen"
},
"title": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "De titel van de plug-in",
+ "label": "Titel",
+ "placeholder": "Zoekmachine"
}
},
- "metaConfig": "插件元信息配置",
- "modalDesc": "添加自定义插件后,可用于插件开发验证,也可直接在会话中使用。插件开发请参考<1>开发文档↗>",
+ "metaConfig": "Configuratie van plug-inmetadata",
+ "modalDesc": "Na het toevoegen van een aangepaste plug-in kan deze worden gebruikt voor verificatie van plug-inontwikkeling of direct in de sessie. Raadpleeg de <1>ontwikkelingsdocumentatie↗> voor plug-inontwikkeling.",
"openai": {
- "importUrl": "从 URL 链接导入",
+ "importUrl": "Importeren van URL-link",
"schema": "Schema"
},
"preview": {
- "card": "预览插件展示效果",
- "desc": "预览插件描述",
- "title": "插件名称预览"
+ "card": "Voorbeeld van plug-inweergave",
+ "desc": "Voorbeeld van plug-inbeschrijving",
+ "title": "Voorbeeld van plug-innaam"
},
- "save": "安装插件",
- "saveSuccess": "插件设置保存成功",
+ "save": "Installeer plug-in",
+ "saveSuccess": "Instellingen van plug-in succesvol opgeslagen",
"tabs": {
- "manifest": "功能描述清单 (Manifest)",
- "meta": "插件元信息"
+ "manifest": "Functiebeschrijving Manifest (Manifest)",
+ "meta": "Plug-in Metadata"
},
"title": {
- "create": "添加自定义插件",
- "edit": "编辑自定义插件"
+ "create": "Aangepaste plug-in toevoegen",
+ "edit": "Aangepaste plug-in bewerken"
},
"type": {
- "lobe": "LobeChat 插件",
- "openai": "OpenAI 插件"
+ "lobe": "LobeChat-plug-in",
+ "openai": "OpenAI-plug-in"
},
- "update": "更新",
- "updateSuccess": "插件设置更新成功"
+ "update": "Bijwerken",
+ "updateSuccess": "Instellingen van plug-in succesvol bijgewerkt"
},
"error": {
"fetchError": "Het ophalen van de manifest-link is mislukt. Zorg ervoor dat de link geldig is en controleer of de link cross-origin toegang toestaat.",
@@ -128,10 +130,6 @@
"plugin": "Plugin wordt uitgevoerd..."
},
"pluginList": "Lijst met plugins",
- "plugins": {
- "loading": "Plugins worden gecontroleerd...",
- "unknown": "Onbekende plugin"
- },
"setting": "Plugin-instellingen",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Geïnstalleerd"
},
"title": "Pluginwinkel"
- }
+ },
+ "unknownPlugin": "onbekende plugin"
}
diff --git a/locales/nl-NL/setting.json b/locales/nl-NL/setting.json
index a7212965229b..92b2dd1acde1 100644
--- a/locales/nl-NL/setting.json
+++ b/locales/nl-NL/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Over"
},
+ "agentTab": {
+ "chat": "Chatvoorkeur",
+ "meta": "Assistentinformatie",
+ "modal": "Modelinstellingen",
+ "plugin": "Plugin-instellingen",
+ "prompt": "Rolinstelling",
+ "tts": "Tekst-naar-spraakdienst"
+ },
"analytics": {
"telemetry": {
"desc": "Door te kiezen om telemetrische gegevens te verzenden, kun je ons helpen om de algehele gebruikerservaring van LobeChat te verbeteren",
@@ -35,10 +43,14 @@
"title": "Instellingen"
},
"llm": {
+ "apiKey": {
+ "desc": "Vul je {{name}} API-sleutel in",
+ "placeholder": "{{name}} API-sleutel",
+ "title": "API-sleutel"
+ },
"checker": {
"button": "Controleren",
"desc": "Test of de API-sleutel en proxyadres correct zijn ingevuld",
- "ollamaDesc": "Controleer of het proxy-adres correct is ingevuld",
"pass": "Succesvol gecontroleerd",
"title": "Connectiviteitscontrole"
},
@@ -90,22 +102,19 @@
"latestTime": "Laatst bijgewerkt: {{time}}",
"noLatestTime": "Geen lijst beschikbaar op dit moment"
},
+ "helpDoc": "configuratiehandleiding",
"modelList": {
"desc": "Selecteer het model dat in de sessie moet worden weergegeven. Het geselecteerde model wordt weergegeven in de modellijst.",
"placeholder": "Selecteer een model uit de lijst",
"title": "Modellijst",
"total": "In totaal {{count}} modellen beschikbaar"
},
+ "proxyUrl": {
+ "desc": "Moet http(s):// bevatten, naast het standaardadres",
+ "title": "API Proxy Adres"
+ },
"waitingForMore": "Meer modellen worden <1>gepland om te worden toegevoegd1>, dus blijf op de hoogte ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama is bezig met het downloaden van dit model. Gelieve deze pagina niet te sluiten. Het downloaden zal worden hervat vanaf het onderbroken punt als u opnieuw begint te downloaden.",
- "remainingTime": "Resterende tijd",
- "speed": "Downloadsnelheid",
- "title": "Model {{model}} wordt gedownload"
- }
- },
"plugin": {
"addTooltip": "Voeg aangepaste plug-in toe",
"clearDeprecated": "Verwijder verouderde plug-ins",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Onbeperkt",
"limited": "Bevat alleen {{number}} berichten",
+ "setlimited": "Stel berichtengeschiedenis in",
"title": "Berichtgeschiedenis beperken",
"unlimited": "Onbeperkt aantal berichten in de geschiedenis"
},
@@ -356,6 +366,24 @@
"title": "WebRTC Synchronisatie"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Assistentmetadata-generatiemodel",
+ "modelDesc": "Model voor het genereren van assistentnaam, beschrijving, profielfoto en labels",
+ "title": "Automatisch assistentinformatie genereren"
+ },
+ "title": "Systeemassistent",
+ "topic": {
+ "label": "Onderwerp Naamgevingsmodel",
+ "modelDesc": "Specificeer het model dat wordt gebruikt voor automatische hernoeming van onderwerpen",
+ "title": "Automatische Onderwerpnaamgeving"
+ },
+ "translation": {
+ "label": "Vertaalmodel",
+ "modelDesc": "Specificeer het model voor vertaling",
+ "title": "Instellingen voor vertaalassistent"
+ }
+ },
"tab": {
"about": "Over",
"agent": "Standaardassistent",
@@ -363,6 +391,7 @@
"experiment": "Experiment",
"llm": "Taalmodel",
"sync": "Cloudsynchronisatie",
+ "system-agent": "Systeemassistent",
"tts": "Spraakdienst"
},
"tools": {
diff --git a/locales/nl-NL/tool.json b/locales/nl-NL/tool.json
index 8a458aaad29e..52448ec512f9 100644
--- a/locales/nl-NL/tool.json
+++ b/locales/nl-NL/tool.json
@@ -4,6 +4,7 @@
"downloading": "De link naar de afbeelding gegenereerd door DallE3 is slechts 1 uur geldig. De afbeelding wordt lokaal in de cache opgeslagen...",
"generate": "Genereren",
"generating": "Bezig met genereren...",
- "images": "Afbeeldingen:"
+ "images": "Afbeeldingen:",
+ "prompt": "prompt"
}
}
diff --git a/locales/pl-PL/auth.json b/locales/pl-PL/auth.json
index 1f97ad9ed273..64f2b1584a36 100644
--- a/locales/pl-PL/auth.json
+++ b/locales/pl-PL/auth.json
@@ -1,6 +1,8 @@
{
"login": "Zaloguj się",
"loginOrSignup": "Zaloguj się / Zarejestruj się",
+ "profile": "Profil użytkownika",
+ "security": "Bezpieczeństwo",
"signout": "Wyloguj",
"signup": "Zarejestruj się"
}
diff --git a/locales/pl-PL/chat.json b/locales/pl-PL/chat.json
index d62490ccc01b..702445a7fcbe 100644
--- a/locales/pl-PL/chat.json
+++ b/locales/pl-PL/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Cześć, jestem **{{name}}**, możesz od razu zacząć ze mną rozmawiać, lub udoskonalić moje informacje, przechodząc do [Ustawień asystenta](/chat/settings#session={{id}}).",
"agentDefaultMessageWithSystemRole": "Cześć, jestem **{{name}}**, {{systemRole}}, zacznijmy rozmowę!",
+ "agentsAndConversations": "Agenci i rozmowy",
"backToBottom": "Przewiń na dół",
"clearCurrentMessages": "Wyczyść bieżącą rozmowę",
"confirmClearCurrentMessages": "Czy na pewno chcesz wyczyścić bieżącą rozmowę? Tej operacji nie można cofnąć.",
@@ -39,7 +40,6 @@
"regenerate": "Wygeneruj ponownie"
},
"newAgent": "Nowy asystent",
- "noDescription": "Brak opisu",
"pin": "Przypnij",
"pinOff": "Odepnij",
"regenerate": "Wygeneruj ponownie",
@@ -83,6 +83,7 @@
"chats": "Rozmowy",
"rest": "Pozostałe",
"systemRole": "Rola systemowa",
+ "title": "Szczegóły tokena",
"tools": "Narzędzia",
"total": "Razem",
"used": "Wykorzystane"
diff --git a/locales/pl-PL/common.json b/locales/pl-PL/common.json
index 18270eeed8c9..94c1b16e3eb5 100644
--- a/locales/pl-PL/common.json
+++ b/locales/pl-PL/common.json
@@ -1,7 +1,7 @@
{
"about": "O nas",
"advanceSettings": "Zaawansowane ustawienia",
- "appInitializing": "LobeChat inicjuje, proszę czekać...",
+ "appInitializing": "Inicjowanie aplikacji, prosimy o cierpliwość...",
"autoGenerate": "Automatyczne generowanie",
"autoGenerateTooltip": "Automatyczne uzupełnianie opisu asystenta na podstawie sugestii",
"autoGenerateTooltipDisabled": "Proszę wprowadzić słowo kluczowe przed użyciem funkcji automatycznego uzupełniania",
@@ -9,6 +9,7 @@
"cancel": "Anuluj",
"changelog": "Dziennik zmian",
"close": "Zamknij",
+ "contact": "Skontaktuj się z nami",
"copy": "Kopiuj",
"copyFail": "Nie udało się skopiować",
"copySuccess": "Skopiowano pomyślnie",
@@ -35,10 +36,33 @@
},
"feedback": "Opinie i sugestie",
"follow": "Zaobserwuj nas na {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Podziel się swoją cenną opinią",
+ "star": "Dodaj gwiazdkę na GitHubie"
+ },
+ "and": "i",
+ "feedback": {
+ "action": "Podziel się opinią",
+ "desc": "Każdy twój pomysł i sugestia są dla nas bezcenne, nie możemy się doczekać, aby poznać twoją opinię! Skontaktuj się z nami, aby podzielić się opinią na temat funkcji produktu i doświadczeń z jego użytkowania, pomóż nam ulepszyć LobeChat.",
+ "title": "Podziel się swoją cenną opinią na GitHubie"
+ },
+ "later": "Później",
+ "star": {
+ "action": "Dodaj gwiazdkę",
+ "desc": "Jeśli podoba ci się nasz produkt i chcesz nas wesprzeć, czy mógłbyś dodać gwiazdkę na GitHubie? To małe działanie ma ogromne znaczenie dla nas i motywuje nas do ciągłego zapewniania ci wyjątkowego doświadczenia.",
+ "title": "Dodaj gwiazdkę na GitHubie"
+ },
+ "title": "Podoba ci się nasz produkt?"
+ },
"fullscreen": "Tryb pełnoekranowy",
"historyRange": "Zakres historii",
"import": "Importuj ustawienia",
"importModal": {
+ "error": {
+ "desc": "Przepraszamy, wystąpił błąd podczas importowania danych. Spróbuj ponownie zaimportować, lub <1>zgłoś problem1>, a my postaramy się jak najszybciej rozwiązać problem.",
+ "title": "Import danych nie powiódł się"
+ },
"finish": {
"onlySettings": "Pomyślnie zaimportowano ustawienia systemowe",
"start": "Rozpocznij korzystanie",
@@ -46,6 +70,7 @@
"title": "Zakończono import danych"
},
"loading": "Trwa import danych, proszę czekać...",
+ "preparing": "Przygotowywanie modułu importu danych...",
"result": {
"added": "Pomyślnie zaimportowano",
"errors": "Błędy importu",
@@ -56,8 +81,15 @@
"topics": "Tematy",
"type": "Typ danych"
},
- "title": "Import danych"
+ "title": "Import danych",
+ "uploading": {
+ "desc": "Obecny plik jest duży, trwa wysyłanie...",
+ "restTime": "Pozostały czas",
+ "speed": "Prędkość wysyłania"
+ }
},
+ "information": "Społeczność i informacje",
+ "installPWA": "Zainstaluj aplikację przeglądarki",
"lang": {
"ar": "arabski",
"bg-BG": "bułgarski",
@@ -96,7 +128,11 @@
"zh-TW": "Chiński tradycyjny"
},
"layoutInitializing": "Inicjowanie układu...",
- "noDescription": "Brak opisu",
+ "legal": "Oświadczenie prawne",
+ "mail": {
+ "business": "Współpraca biznesowa",
+ "support": "Wsparcie mailowe"
+ },
"oauth": "Logowanie SSO",
"officialSite": "Oficjalna strona internetowa",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Użytkownik Anonimowy",
"billing": "Zarządzanie rachunkami",
+ "data": "Przechowywanie danych",
"defaultNickname": "Użytkownik Wersji Społecznościowej",
"discord": "Wsparcie społeczności",
"docs": "Dokumentacja",
@@ -181,5 +218,6 @@
"profile": "Zarządzanie kontem",
"setting": "Ustawienia aplikacji",
"usages": "Statystyki użycia"
- }
+ },
+ "version": "Wersja"
}
diff --git a/locales/pl-PL/components.json b/locales/pl-PL/components.json
index ead9a2de3a44..0191e3767eae 100644
--- a/locales/pl-PL/components.json
+++ b/locales/pl-PL/components.json
@@ -6,7 +6,8 @@
"functionCall": "Ten model obsługuje wywołania funkcji (Function Call).",
"tokens": "Ten model obsługuje maksymalnie {{tokens}} tokenów w pojedynczej sesji.",
"vision": "Ten model obsługuje rozpoznawanie wizualne."
- }
+ },
+ "removed": "Ten model nie znajduje się na liście, jeśli zostanie odznaczony, zostanie automatycznie usunięty"
},
"ModelSwitchPanel": {
"emptyModel": "Brak włączonych modeli, przejdź do ustawień i włącz je",
diff --git a/locales/pl-PL/error.json b/locales/pl-PL/error.json
index a1a34a4129cc..1e3fb1d01367 100644
--- a/locales/pl-PL/error.json
+++ b/locales/pl-PL/error.json
@@ -1,9 +1,9 @@
{
"clerkAuth": {
"loginSuccess": {
- "action": "继续会话",
- "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧",
- "title": "欢迎回来, {{nickName}}"
+ "action": "Continue session",
+ "desc": "{{greeting}}, it's great to continue serving you. Let's continue our previous conversation.",
+ "title": "Welcome back, {{nickName}}"
}
},
"error": {
@@ -12,6 +12,8 @@
"retry": "Ponów próbę",
"title": "Napotkano problem na stronie.."
},
+ "fetchError": "Błąd żądania",
+ "fetchErrorDetail": "Szczegóły błędu",
"notFound": {
"backHome": "Powrót do strony głównej",
"desc": "Nie możemy odnaleźć strony, której szukasz. Sprawdź, czy link jest poprawny.",
@@ -52,37 +54,16 @@
"503": "Przepraszamy, serwer tymczasowo nie może przetworzyć Twojego żądania, prawdopodobnie z powodu przeciążenia lub konserwacji. Proszę spróbuj ponownie później",
"504": "Przepraszamy, serwer nie otrzymał odpowiedzi od serwera nadrzędnego. Proszę spróbuj ponownie później",
"AgentRuntimeError": "Wystąpił błąd wykonania modelu językowego Lobe, prosimy o sprawdzenie poniższych informacji lub ponowne próbowanie.",
- "AnthropicBizError": "Wystąpił błąd biznesowy podczas żądania usługi Anthropic AI. Sprawdź poniższe informacje i spróbuj ponownie.",
- "AzureBizError": "Wystąpił błąd żądania usługi Azure AI, prosimy o sprawdzenie poniższych informacji lub ponowne próbowanie.",
- "BedrockBizError": "Wystąpił błąd żądania usługi Bedrock, prosimy o sprawdzenie poniższych informacji lub ponowne próbowanie.",
- "GoogleBizError": "Wystąpił błąd żądania usługi Google, prosimy o sprawdzenie poniższych informacji lub ponowne próbowanie.",
- "GroqBizError": "Wystąpił błąd usługi Groq. Sprawdź poniższe informacje lub spróbuj ponownie.",
"InvalidAccessCode": "Nieprawidłowy kod dostępu: Hasło jest nieprawidłowe lub puste. Proszę wprowadzić poprawne hasło dostępu lub dodać niestandardowy klucz API.",
- "InvalidAnthropicAPIKey": "Anthropic API Key jest nieprawidłowy lub pusty. Sprawdź poprawność klucza API Anthropic i spróbuj ponownie.",
- "InvalidAzureAPIKey": "Nieprawidłowy lub pusty klucz API Azure, prosimy sprawdzić klucz API Azure i spróbować ponownie.",
"InvalidBedrockCredentials": "Uwierzytelnienie Bedrock nie powiodło się, prosimy sprawdzić AccessKeyId/SecretAccessKey i spróbować ponownie.",
"InvalidClerkUser": "Przepraszamy, nie jesteś obecnie zalogowany. Proszę najpierw zalogować się lub zarejestrować, aby kontynuować.",
- "InvalidGoogleAPIKey": "Nieprawidłowy lub pusty klucz API Google, prosimy sprawdzić klucz API Google i spróbować ponownie.",
- "InvalidGroqAPIKey": "Nieprawidłowy klucz API Groq, prosimy sprawdzić klucz API Groq i spróbować ponownie.",
- "InvalidMinimaxAPIKey": "Nieprawidłowy lub pusty klucz API Minimax, proszę sprawdzić klucz API Minimax i spróbować ponownie",
- "InvalidMistralAPIKey": "Nieprawidłowy lub pusty klucz API Mistral AI. Proszę sprawdzić klucz API Mistral i spróbować ponownie.",
- "InvalidMoonshotAPIKey": "Nieprawidłowy lub pusty klucz API Moonshot AI. Proszę sprawdzić klucz API Moonshot i spróbować ponownie.",
"InvalidOllamaArgs": "Nieprawidłowa konfiguracja Ollama, sprawdź konfigurację Ollama i spróbuj ponownie",
- "InvalidOpenRouterAPIKey": "OpenRouter API Key jest nieprawidłowy lub pusty. Sprawdź klucz API OpenRouter i spróbuj ponownie.",
- "InvalidPerplexityAPIKey": "Klucz API Perplexity jest nieprawidłowy lub pusty. Sprawdź klucz API Perplexity i spróbuj ponownie.",
- "InvalidTogetherAIAPIKey": "TogetherAI API Key jest nieprawidłowy lub pusty. Sprawdź klucz API TogetherAI i spróbuj ponownie.",
- "InvalidZeroOneAPIKey": "Klucz API Zero One nieprawidłowy lub pusty, sprawdź poprawność klucza API Zero One i spróbuj ponownie",
- "InvalidZhipuAPIKey": "Nieprawidłowy lub pusty klucz API Zhipu, prosimy sprawdzić klucz API Zhipu i spróbować ponownie.",
+ "InvalidProviderAPIKey": "{{provider}} Klucz API jest nieprawidłowy lub pusty. Sprawdź Klucz API {{provider}} i spróbuj ponownie.",
"LocationNotSupportError": "Przepraszamy, Twoja lokalizacja nie obsługuje tego usługi modelu, być może ze względu na ograniczenia regionalne lub brak dostępności usługi. Proszę sprawdź, czy bieżąca lokalizacja obsługuje tę usługę, lub spróbuj użyć innych informacji o lokalizacji.",
- "MinimaxBizError": "Wystąpił błąd usługi Minimax, proszę sprawdzić poniższe informacje lub spróbować ponownie",
- "MistralBizError": "Wystąpił błąd żądania usługi Mistral AI. Proszę sprawdzić poniższe informacje lub spróbować ponownie.",
- "MoonshotBizError": "Wystąpił błąd żądania usługi Moonshot AI. Proszę sprawdzić poniższe informacje lub spróbować ponownie.",
"NoOpenAIAPIKey": "Klucz API OpenAI jest pusty. Proszę dodać niestandardowy klucz API OpenAI",
"OllamaBizError": "Błąd usługi Ollama, sprawdź poniższe informacje lub spróbuj ponownie",
"OllamaServiceUnavailable": "Usługa Ollama jest niedostępna. Sprawdź, czy Ollama działa poprawnie, lub czy poprawnie skonfigurowano ustawienia przekraczania domeny Ollama",
- "OpenAIBizError": "Błąd żądania usługi OpenAI. Proszę sprawdź poniższe informacje i spróbuj ponownie",
- "OpenRouterBizError": "Wystąpił błąd biznesowy podczas żądania usługi OpenRouter AI. Sprawdź poniższe informacje lub spróbuj ponownie.",
- "PerplexityBizError": "Błąd biznesowy podczas żądania usługi Perplexity AI. Sprawdź poniższe informacje lub spróbuj ponownie.",
+ "OpenAIBizError": "Wystąpił błąd usługi OpenAI, proszę sprawdzić poniższe informacje lub spróbować ponownie",
"PluginApiNotFound": "Przepraszamy, w manifestach wtyczki nie istnieje to API. Proszę sprawdź, czy metoda żądania jest zgodna z API w manifestach wtyczki",
"PluginApiParamsError": "Przepraszamy, walidacja parametrów wejściowych żądanej wtyczki nie powiodła się. Proszę sprawdź, czy parametry wejściowe są zgodne z informacjami opisującymi API",
"PluginGatewayError": "Przepraszamy, wystąpił błąd bramy wtyczki. Proszę sprawdź, czy konfiguracja bramy wtyczki jest poprawna",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Przepraszamy, inicjalizacja klienta OpenAPI nie powiodła się. Proszę sprawdź, czy informacje konfiguracyjne OpenAPI są poprawne",
"PluginServerError": "Błąd zwrócony przez serwer wtyczki. Proszę sprawdź plik opisowy wtyczki, konfigurację wtyczki lub implementację serwera zgodnie z poniższymi informacjami o błędzie",
"PluginSettingsInvalid": "Ta wtyczka wymaga poprawnej konfiguracji przed użyciem. Proszę sprawdź, czy Twoja konfiguracja jest poprawna",
- "TogetherAIBizError": "Wystąpił błąd biznesowy podczas żądania usługi TogetherAI AI. Sprawdź poniższe informacje lub spróbuj ponownie.",
- "ZeroOneBizError": "请求零一万物服务出错,请根据以下信息排查或重试",
- "ZhipuBizError": "Wystąpił błąd żądania usługi Zhipu, prosimy o sprawdzenie poniższych informacji lub ponowne próbowanie."
+ "ProviderBizError": "Wystąpił błąd usługi {{provider}}, proszę sprawdzić poniższe informacje lub spróbować ponownie"
},
"stt": {
"responseError": "Błąd żądania usługi. Proszę sprawdź konfigurację i spróbuj ponownie"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Dodaj adres proxy OpenAI (opcjonalnie)",
+ "apiKey": {
+ "description": "Wprowadź swój Klucz API {{name}}, aby rozpocząć sesję.",
+ "title": "Użyj niestandardowego Klucza API {{name}}"
+ },
"closeMessage": "Zamknij komunikat",
"confirm": "Potwierdź i spróbuj ponownie",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Zaloguj się",
"welcome": "Witaj!"
},
- "ollama": {
- "cancel": "Anuluj",
- "confirm": "Potwierdź",
- "description": "Wprowadź etykietę modelu Ollama, aby kontynuować sesję",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Rozpoczynanie pobierania...",
- "title": "Pobierz określony model Ollama"
- },
"password": {
"description": "Administrator włączył szyfrowanie aplikacji. Po wprowadzeniu hasła aplikacja zostanie odblokowana. Hasło należy wprowadzić tylko raz.",
"placeholder": "Wprowadź hasło",
@@ -132,5 +107,9 @@
"apiKey": "Niestandardowy klucz API",
"password": "Hasło"
}
+ },
+ "upload": {
+ "desc": "Szczegóły: {{detail}}",
+ "title": "Nie udało się przesłać pliku. Sprawdź połączenie sieciowe lub spróbuj ponownie później"
}
}
diff --git a/locales/pl-PL/metadata.json b/locales/pl-PL/metadata.json
new file mode 100644
index 000000000000..4a95e8bb5134
--- /dev/null
+++ b/locales/pl-PL/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat zapewnia najlepsze doświadczenie użytkowania ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: narzędzie do poprawy efektywności osobistej LLM, dając sobie bardziej inteligentny umysł"
+ },
+ "market": {
+ "description": "Tworzenie treści, copywriting, pytania i odpowiedzi, generowanie obrazów, generowanie wideo, generowanie głosu, inteligentny agent, automatyzacja workflowów - dostosuj swojego własnego asystenta AI / GPTs / OLLaMA",
+ "title": "Rynek asystentów"
+ },
+ "plugins": {
+ "description": "Wyszukiwanie, generowanie wykresów, akademickie, generowanie obrazów, generowanie wideo, generowanie głosu, automatyzacja workflowów - dostosuj ekskluzywne możliwości narzędzi ToolCall dla ChatGPT / OLLaMA",
+ "title": "Rynek wtyczek"
+ },
+ "welcome": {
+ "description": "LobeChat zapewnia najlepsze doświadczenie użytkowania ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Witaj w LobeChat: narzędziu do poprawy efektywności osobistej LLM, dając sobie bardziej inteligentny umysł"
+ }
+}
diff --git a/locales/pl-PL/modelProvider.json b/locales/pl-PL/modelProvider.json
index fe787a286392..c233755bd553 100644
--- a/locales/pl-PL/modelProvider.json
+++ b/locales/pl-PL/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Oprócz domyślnego adresu, musi zawierać http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Adres proxy API"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Anthropic, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Anthropic"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Wersja API Azure, stosuj format YYYY-MM-DD, zobacz [najnowszą wersję](https://learn.microsoft.com/pl-pl/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Wartość można znaleźć w sekcji 'Klucze i punkty końcowe' podczas sprawdzania zasobu w portalu Azure. Możesz użyć KEY1 lub KEY2",
"placeholder": "Azure API Key",
"title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Azure OpenAI, aby rozpocząć sesję",
- "title": "Użyj niestandardowego klucza API Azure OpenAI"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Użyj niestandardowych informacji uwierzytelniających Bedrock"
}
},
- "google": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Google",
- "placeholder": "Google API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Google, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Google"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Groq",
- "placeholder": "Groq API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Groq, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Groq"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Wprowadź klucz API Minimax",
- "placeholder": "Klucz API Minimax",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Minimax, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API.",
- "title": "Użyj niestandardowego klucza API Minimax"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Mistral AI, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Mistral AI"
- }
- },
- "moonshot": {
- "title": "Mroczna Strona Księżyca",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Moonshot AI, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Moonshot AI"
- }
- },
"ollama": {
"checker": {
- "desc": "Test czy adres proxy jest poprawnie wypełniony"
+ "desc": "Test czy adres proxy jest poprawnie wypełniony",
+ "title": "Sprawdzanie łączności"
},
"customModelName": {
"desc": "Dodaj własny model, oddzielaj modele przecinkiem (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Nazwa własnego modelu"
},
+ "download": {
+ "desc": "Ollama is currently downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Wprowadź adres rest API Ollama, jeśli lokalnie nie określono, pozostaw puste",
- "placeholder": "http://127.0.0.1:11434",
"title": "Adres proxy API"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Preview)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Oprócz domyślnego adresu, musi zawierać http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Adres proxy API"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Użyj własnego klucza OpenAI",
- "placeholder": "OpenAI API Key",
- "title": "Klucz API OpenAI"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API OpenAI, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API OpenAI"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Test czy adres proxy jest poprawnie wypełniony"
- },
- "customModelName": {
- "desc": "Dodaj własny model, oddzielaj modele przecinkiem (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Nazwa własnego modelu"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API OpenRouter, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API OpenRouter"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "Klucz API"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Wprowadź swój klucz API Perplexity, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Perplexity"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Test czy adres proxy jest poprawnie wypełniony"
- },
- "customModelName": {
- "desc": "Dodaj własny model, oddzielaj modele przecinkiem (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Nazwa własnego modelu"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API TogetherAI, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API TogetherAI"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Zero Jeden Wszystko",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od 01.AI Zero Jeden Wszystko",
- "placeholder": "01.AI Zero Jeden Wszystko API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API ZeroOne, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API ZeroOne"
- }
+ "title": "01.AI Zero Jeden Wszystko"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Wprowadź klucz API uzyskany od Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "Klucz API"
- },
- "unlock": {
- "description": "Wprowadź swój klucz API Zhipu, aby rozpocząć sesję. Aplikacja nie będzie przechowywać Twojego klucza API",
- "title": "Użyj niestandardowego klucza API Zhipu"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/pl-PL/plugin.json b/locales/pl-PL/plugin.json
index 0132b95c3082..78f0f5580e88 100644
--- a/locales/pl-PL/plugin.json
+++ b/locales/pl-PL/plugin.json
@@ -1,166 +1,165 @@
{
"debug": {
- "arguments": "参数调试",
- "function_call": "函数调用",
- "off": "关闭",
- "on": "开启调试",
- "response": "响应结果"
+ "arguments": "Argumenty",
+ "function_call": "Wywołanie funkcji",
+ "off": "Wyłącz debugowanie",
+ "on": "Wyświetl informacje o wywołaniach wtyczki",
+ "payload": "dane wejściowe wtyczki",
+ "response": "Odpowiedź",
+ "tool_call": "żądanie wywołania narzędzia"
},
"detailModal": {
"info": {
- "description": "API 描述",
- "name": "API 名称"
+ "description": "Opis interfejsu API",
+ "name": "Nazwa interfejsu API"
},
"tabs": {
- "info": "插件信息",
- "manifest": "安装清单",
- "settings": "设置"
+ "info": "Zdolności wtyczki",
+ "manifest": "Plik instalacyjny",
+ "settings": "Ustawienia"
},
- "title": "插件详情"
+ "title": "Szczegóły wtyczki"
},
"dev": {
- "confirmDeleteDevPlugin": "确认删除开发插件?删除后将无法恢复。",
+ "confirmDeleteDevPlugin": "Czy na pewno chcesz usunąć tę lokalną wtyczkę? Po usunięciu nie będzie możliwe jej odzyskanie.",
"customParams": {
"useProxy": {
- "label": "使用代理安装(如遇跨域访问错误,可尝试开启该选项后重新安装)"
+ "label": "Zainstaluj za pośrednictwem serwera proxy (jeśli występują błędy dostępu z innej domeny, spróbuj włączyć tę opcję i ponownie zainstalować)"
}
},
- "deleteSuccess": "插件删除成功",
+ "deleteSuccess": "Wtyczka została pomyślnie usunięta",
"manifest": {
"identifier": {
- "desc": "插件的唯一标识",
- "label": "标识符"
+ "desc": "Unikalny identyfikator wtyczki",
+ "label": "Identyfikator"
},
"mode": {
- "local": "本地模式",
- "local-tooltip": "暂不支持本地模式",
- "url": "在线链接"
+ "local": "Konfiguracja wizualna",
+ "local-tooltip": "Konfiguracja wizualna nie jest obecnie obsługiwana",
+ "url": "Link online"
},
"name": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "Tytuł wtyczki",
+ "label": "Tytuł",
+ "placeholder": "Wyszukiwarka"
}
},
"meta": {
"author": {
- "desc": "插件作者",
- "label": "作者"
+ "desc": "Autor wtyczki",
+ "label": "Autor"
},
"avatar": {
- "desc": "插件图标,可使用 Emoji 或 URL",
- "label": "图标"
+ "desc": "Ikona wtyczki, może być emotikonem lub adresem URL",
+ "label": "Ikona"
},
"description": {
- "desc": "插件描述",
- "label": "描述",
- "placeholder": "查询搜索引擎获取信息"
+ "desc": "Opis wtyczki",
+ "label": "Opis",
+ "placeholder": "Pobierz informacje z wyszukiwarek"
},
- "formFieldRequired": "此字段为必填项",
+ "formFieldRequired": "To pole jest wymagane",
"homepage": {
- "desc": "插件首页",
- "label": "首页"
+ "desc": "Strona główna wtyczki",
+ "label": "Strona główna"
},
"identifier": {
- "desc": "插件的唯一标识,将从清单中自动识别",
- "errorDuplicate": "标识符与现有插件重复,请修改标识符",
- "label": "标识符",
- "pattenErrorMessage": "只能输入英文字符、数字、- 和_"
+ "desc": "Unikalny identyfikator wtyczki, obsługuje tylko znaki alfanumeryczne, myślnik - i podkreślenie _",
+ "errorDuplicate": "Identyfikator jest już używany przez inną wtyczkę, proszę zmień identyfikator",
+ "label": "Identyfikator",
+ "pattenErrorMessage": "Dozwolone są tylko znaki alfanumeryczne, myślnik - i podkreślenie _"
},
"manifest": {
- "desc": "LobeChat 将通过该链接安装插件",
- "label": "插件描述文件 (Manifest) URL",
- "preview": "预览清单",
- "refresh": "刷新"
+ "desc": "LobeChat zainstaluje wtyczkę za pomocą tego linku",
+ "label": "Opis wtyczki (Manifest) URL",
+ "preview": "Podgląd",
+ "refresh": "Odśwież"
},
"title": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "Tytuł wtyczki",
+ "label": "Tytuł",
+ "placeholder": "Wyszukiwarka"
}
},
- "metaConfig": "插件元信息配置",
- "modalDesc": "添加自定义插件后,可用于插件开发验证,也可直接在会话中使用。插件开发请参考<1>开发文档↗>",
+ "metaConfig": "Konfiguracja metadanych wtyczki",
+ "modalDesc": "Po dodaniu niestandardowej wtyczki można jej używać do weryfikacji rozwoju wtyczki lub bezpośrednio w sesji. Proszę odnieść się do <1>dokumentacji rozwojowej↗> dotyczącej rozwoju wtyczki.",
"openai": {
- "importUrl": "从 URL 导入",
- "schema": "模式"
+ "importUrl": "Importuj z linku URL",
+ "schema": "Schemat"
},
"preview": {
- "card": "预览插件效果",
- "desc": "预览插件描述",
- "title": "插件名称预览"
+ "card": "Podgląd wyświetlania wtyczki",
+ "desc": "Podgląd opisu wtyczki",
+ "title": "Podgląd nazwy wtyczki"
},
- "save": "安装插件",
- "saveSuccess": "插件设置保存成功",
+ "save": "Zainstaluj wtyczkę",
+ "saveSuccess": "Ustawienia wtyczki zostały pomyślnie zapisane",
"tabs": {
- "manifest": "功能描述清单 (Manifest)",
- "meta": "插件元信息"
+ "manifest": "Opis funkcji manifestu (Manifest)",
+ "meta": "Metadane wtyczki"
},
"title": {
- "create": "添加自定义插件",
- "edit": "编辑自定义插件"
+ "create": "Dodaj niestandardową wtyczkę",
+ "edit": "Edytuj niestandardową wtyczkę"
},
"type": {
- "lobe": "LobeChat 插件",
- "openai": "OpenAI 插件"
+ "lobe": "Wtyczka LobeChat",
+ "openai": "Wtyczka OpenAI"
},
- "update": "更新",
- "updateSuccess": "插件设置更新成功"
+ "update": "Aktualizuj",
+ "updateSuccess": "Ustawienia wtyczki zostały pomyślnie zaktualizowane"
},
"error": {
- "fetchError": "请求该清单链接失败,请确保链接的有效性,并检查链接是否允许跨域访问",
- "installError": "插件 {{name}} 安装失败",
- "manifestInvalid": "清单不符合规范,校验结果: \n\n {{error}}",
- "noManifest": "描述文件不存在",
- "openAPIInvalid": "OpenAPI 解析失败,错误: \n\n {{error}}",
- "reinstallError": "插件 {{name}} 刷新失败",
- "urlError": "该链接没有返回 JSON 格式的内容,请确保是有效的链接"
+ "fetchError": "Nie udało się pobrać linku manifestu. Upewnij się, że link jest poprawny i zezwala na dostęp z innej domeny.",
+ "installError": "Instalacja wtyczki {{name}} nie powiodła się",
+ "manifestInvalid": "Manifest nie spełnia specyfikacji. Wynik walidacji: \n\n {{error}}",
+ "noManifest": "Plik manifestu nie istnieje",
+ "openAPIInvalid": "Analiza OpenAPI nie powiodła się. Błąd: \n\n {{error}}",
+ "reinstallError": "Nie udało się odświeżyć wtyczki {{name}}",
+ "urlError": "Link nie zwrócił treści w formacie JSON. Upewnij się, że jest to poprawny link."
},
"list": {
"item": {
- "deprecated.title": "已删除",
- "local.config": "配置",
- "local.title": "自定义"
+ "deprecated.title": "Usunięte",
+ "local.config": "Konfiguracja",
+ "local.title": "Lokalne"
}
},
"loading": {
- "content": "调用插件中...",
- "plugin": "插件运行中..."
+ "content": "Wywoływanie wtyczki...",
+ "plugin": "Wtyczka jest uruchomiona..."
},
- "pluginList": "插件列表",
- "plugins": {
- "loading": "插件检测中...",
- "unknown": "未知插件"
- },
- "setting": "插件设置",
+ "pluginList": "Lista wtyczek",
+ "setting": "Ustawienia wtyczki",
"settings": {
"indexUrl": {
- "title": "市场索引",
- "tooltip": "暂不支持在线编辑,请通过部署时环境变量进行设置"
+ "title": "Indeks sklepu",
+ "tooltip": "Edycja nie jest obecnie obsługiwana"
},
- "modalDesc": "配置插件市场的地址后,可以使用自定义的插件市场",
- "title": "设置插件市场"
+ "modalDesc": "Po skonfigurowaniu adresu sklepu wtyczek możesz korzystać z niestandardowego sklepu wtyczek",
+ "title": "Skonfiguruj sklep wtyczek"
},
"store": {
"actions": {
- "confirmUninstall": "即将卸载该插件,卸载后将清除该插件配置,请确认你的操作",
- "detail": "详情",
- "install": "安装",
- "manifest": "编辑安装文件",
- "settings": "设置",
- "uninstall": "卸载"
+ "confirmUninstall": "Wtyczka zostanie odinstalowana. Po odinstalowaniu konfiguracja wtyczki zostanie wyczyszczona. Potwierdź swoje działanie.",
+ "detail": "Szczegóły",
+ "install": "Instaluj",
+ "manifest": "Edytuj plik instalacyjny",
+ "settings": "Ustawienia",
+ "uninstall": "Odinstaluj"
},
- "communityPlugin": "社区插件",
- "customPlugin": "自定义",
- "empty": "暂无已安装插件",
- "installAllPlugins": "安装全部",
- "networkError": "获取插件商店失败,请检测网络连接后重试",
- "placeholder": "搜索插件名称、介绍或关键词...",
- "releasedAt": "发布于 {{createdAt}}",
+ "communityPlugin": "Wtyczka społecznościowa",
+ "customPlugin": "Niestandardowa wtyczka",
+ "empty": "Brak zainstalowanych wtyczek",
+ "installAllPlugins": "Zainstaluj wszystkie",
+ "networkError": "Nie udało się pobrać sklepu wtyczek. Sprawdź swoje połączenie sieciowe i spróbuj ponownie",
+ "placeholder": "Szukaj nazwy wtyczki, opisu lub słowa kluczowego...",
+ "releasedAt": "Wydane {{createdAt}}",
"tabs": {
- "all": "全部",
- "installed": "已安装"
+ "all": "Wszystkie",
+ "installed": "Zainstalowane"
},
- "title": "插件商店"
- }
+ "title": "Sklep wtyczek"
+ },
+ "unknownPlugin": "nieznana wtyczka"
}
diff --git a/locales/pl-PL/setting.json b/locales/pl-PL/setting.json
index 4253b0df6b9b..ade020ad8f20 100644
--- a/locales/pl-PL/setting.json
+++ b/locales/pl-PL/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "O nas"
},
+ "agentTab": {
+ "chat": "Preferencje czatu",
+ "meta": "Informacje o asystencie",
+ "modal": "Ustawienia modalne",
+ "plugin": "Ustawienia wtyczki",
+ "prompt": "Ustawienia roli",
+ "tts": "Usługi głosowe"
+ },
"analytics": {
"telemetry": {
"desc": "Poprzez wybór wysyłania danych telemetrycznych możesz pomóc nam poprawić ogólny użytkowy interfejs LobeChat",
@@ -35,10 +43,14 @@
"title": "Ustawienia"
},
"llm": {
+ "apiKey": {
+ "desc": "Proszę wprowadź swój klucz API {{name}}",
+ "placeholder": "{{name}} klucz API",
+ "title": "Klucz API"
+ },
"checker": {
"button": "Sprawdź",
"desc": "Sprawdź poprawność wypełnienia klucza API i adresu proxy",
- "ollamaDesc": "Sprawdź, czy adres proxy został poprawnie wprowadzony",
"pass": "Połączenie udane",
"title": "Test połączenia"
},
@@ -90,22 +102,19 @@
"latestTime": "Ostatnia aktualizacja: {{time}}",
"noLatestTime": "Brak dostępnej listy"
},
+ "helpDoc": "Poradnik konfiguracji",
"modelList": {
"desc": "Wybierz modele do wyświetlenia w sesji. Wybrane modele będą widoczne na liście modeli",
"placeholder": "Wybierz model z listy",
"title": "Lista modeli",
"total": "Razem dostępne są {{count}} modele"
},
+ "proxyUrl": {
+ "desc": "Oprócz domyślnego adresu, musi zawierać http(s)://",
+ "title": "Adres proxy API"
+ },
"waitingForMore": "Więcej modeli jest obecnie w <1>planach dołączenia1>, prosimy o cierpliwość ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama pobiera ten model. Prosimy nie zamykać tej strony. Gdy pobieranie zostanie wznowione, będzie kontynuowane od miejsca przerwania.",
- "remainingTime": "Czas pozostały",
- "speed": "Prędkość pobierania",
- "title": "Pobieranie modelu {{model}}"
- }
- },
"plugin": {
"addTooltip": "Dodaj niestandardowy dodatek",
"clearDeprecated": "Usuń przestarzałe dodatki",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Bez limitu",
"limited": "Zawiera tylko {{number}} wiadomości",
+ "setlimited": "Ustaw limit wiadomości historycznych",
"title": "Ograniczenie liczby wiadomości w historii",
"unlimited": "Bez limitu wiadomości w historii"
},
@@ -325,44 +335,63 @@
"sync": {
"device": {
"deviceName": {
- "hint": "添加名称以便于识别",
- "placeholder": "请输入设备名称",
- "title": "设备名称"
+ "hint": "Dodaj nazwę, aby ułatwić identyfikację",
+ "placeholder": "Wprowadź nazwę urządzenia",
+ "title": "Nazwa urządzenia"
},
- "title": "设备信息",
- "unknownBrowser": "未知浏览器",
- "unknownOS": "未知系统"
+ "title": "Informacje o urządzeniu",
+ "unknownBrowser": "Nieznana przeglądarka",
+ "unknownOS": "Nieznany system"
},
"warning": {
- "message": "本功能目前仍为实验性功能,可能存在预期外或不稳定的情况,如遇到问题请及时提交反馈。"
+ "message": "Ta funkcja jest obecnie eksperymentalna i może działać nieprzewidywalnie lub niestabilnie. W przypadku problemów prosimy o natychmiastowe zgłoszenie opinii."
},
"webrtc": {
"channelName": {
- "desc": "WebRTC 将使用此名创建同步频道,确保频道名称唯一",
- "placeholder": "请输入同步频道名称",
- "shuffle": "随机生成",
- "title": "同步频道名称"
+ "desc": "WebRTC użyje tej nazwy do utworzenia kanału synchronizacji, upewnij się, że nazwa kanału jest unikalna",
+ "placeholder": "Wprowadź nazwę kanału synchronizacji",
+ "shuffle": "Wygeneruj losowo",
+ "title": "Nazwa kanału synchronizacji"
},
"channelPassword": {
- "desc": "添加密码确保频道私密性,只有密码正确时,设备才可加入频道",
- "placeholder": "请输入同步频道密码",
- "title": "同步频道密码"
+ "desc": "Dodaj hasło, aby zapewnić prywatność kanału. Tylko urządzenia z poprawnym hasłem mogą dołączyć do kanału",
+ "placeholder": "Wprowadź hasło kanału synchronizacji",
+ "title": "Hasło kanału synchronizacji"
},
- "desc": "实时、点对点的数据通信,需设备同时在线才可同步",
+ "desc": "Bezpośrednia, punkt-do-punktu komunikacja danych w czasie rzeczywistym, wymaga jednoczesnej obecności urządzeń online do synchronizacji",
"enabled": {
- "invalid": "请填写同步频道名称后再开启",
- "title": "开启同步"
+ "invalid": "Wprowadź nazwę kanału synchronizacji przed włączeniem",
+ "title": "Włącz synchronizację"
},
- "title": "WebRTC 同步"
+ "title": "Synchronizacja WebRTC"
+ }
+ },
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Model generowania metadanych asystenta",
+ "modelDesc": "Określa model używany do generowania nazwy, opisu, awatara i etykiety asystenta",
+ "title": "Automatyczne generowanie informacji o asystencie"
+ },
+ "title": "Asystent Systemowy",
+ "topic": {
+ "label": "Model nazewnictwa tematów",
+ "modelDesc": "Określa model używany do automatycznego zmieniania nazw tematów",
+ "title": "Automatyczne nadawanie nazw tematom"
+ },
+ "translation": {
+ "label": "Model Tłumaczenia",
+ "modelDesc": "Określ model używany do tłumaczenia",
+ "title": "Ustawienia Asystenta Tłumaczenia"
}
},
"tab": {
"about": "O nas",
"agent": "Domyślny asystent",
"common": "Ustawienia ogólne",
- "experiment": "实验",
+ "experiment": "Eksperyment",
"llm": "Model językowy",
- "sync": "云端同步",
+ "sync": "Synchronizacja w chmurze",
+ "system-agent": "System Agent",
"tts": "Usługa głosowa"
},
"tools": {
diff --git a/locales/pl-PL/tool.json b/locales/pl-PL/tool.json
index ced030efea23..104d25ef5aca 100644
--- a/locales/pl-PL/tool.json
+++ b/locales/pl-PL/tool.json
@@ -4,6 +4,7 @@
"downloading": "Linki do obrazów wygenerowanych przez DallE3 są ważne tylko przez 1 godzinę. Trwa pobieranie obrazów do lokalnego bufora...",
"generate": "Generuj",
"generating": "Generowanie...",
- "images": "Obrazy:"
+ "images": "Obrazy:",
+ "prompt": "słowo kluczowe"
}
}
diff --git a/locales/pt-BR/auth.json b/locales/pt-BR/auth.json
index 59c54583b486..ef3b9cec42bd 100644
--- a/locales/pt-BR/auth.json
+++ b/locales/pt-BR/auth.json
@@ -1,6 +1,8 @@
{
"login": "Entrar",
"loginOrSignup": "Entrar / Registrar",
+ "profile": "Perfil",
+ "security": "Segurança",
"signout": "Sair",
"signup": "Cadastre-se"
}
diff --git a/locales/pt-BR/chat.json b/locales/pt-BR/chat.json
index 1e53f367f0ec..0c9ee3de7ac5 100644
--- a/locales/pt-BR/chat.json
+++ b/locales/pt-BR/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Olá, eu sou **{{name}}**, você pode começar a conversar comigo agora ou ir para [Configurações do Assistente](/chat/settings#session={{id}}) para completar minhas informações.",
"agentDefaultMessageWithSystemRole": "Olá, eu sou **{{name}}**, {{systemRole}}, vamos conversar!",
+ "agentsAndConversations": "Agentes e Conversas",
"backToBottom": "Voltar para o início",
"clearCurrentMessages": "Limpar mensagens atuais",
"confirmClearCurrentMessages": "Você está prestes a limpar as mensagens desta sessão. Depois de limpar, não será possível recuperá-las. Por favor, confirme sua ação.",
@@ -39,7 +40,6 @@
"regenerate": "Regenerar"
},
"newAgent": "Novo Assistente",
- "noDescription": "Sem descrição",
"pin": "Fixar",
"pinOff": "Desafixar",
"regenerate": "Regenerar",
@@ -83,6 +83,7 @@
"chats": "Mensagens de bate-papo",
"rest": "Restante disponível",
"systemRole": "Configuração de papel do sistema",
+ "title": "Detalhes do Token",
"tools": "Configuração de plug-ins",
"total": "Total disponível",
"used": "Total utilizado"
diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json
index 166775a3f83b..1eae463b9ef0 100644
--- a/locales/pt-BR/common.json
+++ b/locales/pt-BR/common.json
@@ -1,7 +1,7 @@
{
"about": "Sobre",
"advanceSettings": "Configurações avançadas",
- "appInitializing": "LobeChat inicializando, por favor aguarde...",
+ "appInitializing": "Inicializando o aplicativo, por favor, aguarde...",
"autoGenerate": "Auto completar",
"autoGenerateTooltip": "Auto completar descrição do assistente com base em sugestões",
"autoGenerateTooltipDisabled": "Por favor, preencha a dica antes de usar a função de preenchimento automático",
@@ -9,6 +9,7 @@
"cancel": "Cancelar",
"changelog": "Registro de alterações",
"close": "Fechar",
+ "contact": "Entre em contato",
"copy": "Copiar",
"copyFail": "Falha ao copiar",
"copySuccess": "Cópia bem-sucedida",
@@ -35,10 +36,33 @@
},
"feedback": "Feedback e sugestões",
"follow": "Siga-nos no {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Compartilhe seus valiosos comentários",
+ "star": "Dê uma estrela no GitHub"
+ },
+ "and": "e",
+ "feedback": {
+ "action": "Compartilhar feedback",
+ "desc": "Cada uma de suas ideias e sugestões é extremamente valiosa para nós. Mal podemos esperar para saber o que você pensa! Sinta-se à vontade para entrar em contato conosco para fornecer feedback sobre os recursos do produto e a experiência de uso, ajudando-nos a tornar o LobeChat ainda melhor.",
+ "title": "Compartilhe seu valioso feedback no GitHub"
+ },
+ "later": "Mais tarde",
+ "star": {
+ "action": "Dar uma estrela",
+ "desc": "Se você ama nosso produto e deseja nos apoiar, poderia nos dar uma estrela no GitHub? Esse pequeno gesto é significativo para nós e nos motiva a continuar oferecendo uma experiência de qualidade para você.",
+ "title": "Dê uma estrela para nós no GitHub"
+ },
+ "title": "Está gostando do nosso produto?"
+ },
"fullscreen": "Modo de Tela Cheia",
"historyRange": "Intervalo de histórico",
"import": "Importar configuração",
"importModal": {
+ "error": {
+ "desc": "Desculpe, ocorreu um erro durante o processo de importação de dados. Por favor, tente importar novamente ou <1>envie um problema1>, e nós iremos ajudá-lo a resolver o problema o mais rápido possível.",
+ "title": "Falha na importação de dados"
+ },
"finish": {
"onlySettings": "Configurações do sistema importadas com sucesso",
"start": "Começar a usar",
@@ -46,6 +70,7 @@
"title": "Importação de dados concluída"
},
"loading": "Importando dados, por favor aguarde...",
+ "preparing": "Preparando módulo de importação de dados...",
"result": {
"added": "Importação bem-sucedida",
"errors": "Erros na importação",
@@ -56,8 +81,15 @@
"topics": "Tópicos",
"type": "Tipo de dados"
},
- "title": "Importar dados"
+ "title": "Importar dados",
+ "uploading": {
+ "desc": "O arquivo atual é grande, estamos fazendo o upload...",
+ "restTime": "Tempo restante",
+ "speed": "Velocidade de upload"
+ }
},
+ "information": "Comunidade e Informações",
+ "installPWA": "Instalar aplicativo de navegador",
"lang": {
"ar": "árabe",
"bg-BG": "Búlgaro",
@@ -96,7 +128,11 @@
"zh-TW": "Chinês tradicional"
},
"layoutInitializing": "Inicializando layout...",
- "noDescription": "Sem descrição",
+ "legal": "Aviso Legal",
+ "mail": {
+ "business": "Parcerias Comerciais",
+ "support": "Suporte por E-mail"
+ },
"oauth": "Login SSO",
"officialSite": "Site Oficial",
"ok": "OK",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Usuário Anônimo",
"billing": "Gerenciamento de faturas",
+ "data": "Armazenamento de dados",
"defaultNickname": "Usuário da Comunidade",
"discord": "Suporte da Comunidade",
"docs": "Documentação",
@@ -181,5 +218,6 @@
"profile": "Gerenciamento de Conta",
"setting": "Configurações do Aplicativo",
"usages": "Estatísticas de Uso"
- }
+ },
+ "version": "Versão"
}
diff --git a/locales/pt-BR/components.json b/locales/pt-BR/components.json
index cc35a341689a..48b1edcd3770 100644
--- a/locales/pt-BR/components.json
+++ b/locales/pt-BR/components.json
@@ -6,7 +6,8 @@
"functionCall": "Este modelo suporta chamadas de função.",
"tokens": "Este modelo suporta no máximo {{tokens}} tokens por sessão.",
"vision": "Este modelo suporta reconhecimento visual."
- }
+ },
+ "removed": "Este modelo não está na lista, se for desmarcado, será removido automaticamente"
},
"ModelSwitchPanel": {
"emptyModel": "Nenhum modelo habilitado. Por favor, vá para as configurações e habilite um.",
diff --git a/locales/pt-BR/error.json b/locales/pt-BR/error.json
index 073e4c63d412..32f39839d107 100644
--- a/locales/pt-BR/error.json
+++ b/locales/pt-BR/error.json
@@ -12,6 +12,8 @@
"retry": "Tentar novamente",
"title": "Ocorreu um problema na página.."
},
+ "fetchError": "Falha na solicitação",
+ "fetchErrorDetail": "Detalhes do erro",
"notFound": {
"backHome": "Voltar para a página inicial",
"desc": "Não conseguimos encontrar a página que você está procurando, por favor, verifique se o link está correto",
@@ -52,37 +54,16 @@
"503": "Desculpe, o servidor não pode processar sua solicitação no momento, possivelmente devido a sobrecarga ou manutenção. Por favor, tente novamente mais tarde",
"504": "Desculpe, o servidor não recebeu resposta do servidor upstream. Por favor, tente novamente mais tarde",
"AgentRuntimeError": "Erro de execução do modelo de linguagem Lobe, por favor, verifique as informações abaixo ou tente novamente",
- "AnthropicBizError": "Erro de negócios ao solicitar o serviço Anthropic AI. Por favor, verifique as informações abaixo ou tente novamente.",
- "AzureBizError": "Erro ao solicitar o serviço Azure AI, por favor, verifique as informações abaixo ou tente novamente",
- "BedrockBizError": "Erro ao solicitar o serviço Bedrock, por favor, verifique as informações abaixo ou tente novamente",
- "GoogleBizError": "Erro ao solicitar o serviço Google, por favor, verifique as informações abaixo ou tente novamente",
- "GroqBizError": "O serviço Groq encontrou um erro. Por favor, verifique as informações abaixo ou tente novamente.",
"InvalidAccessCode": "Senha de acesso inválida ou em branco. Por favor, insira a senha de acesso correta ou adicione uma Chave de API personalizada.",
- "InvalidAnthropicAPIKey": "A chave da API Anthropic está incorreta ou vazia. Por favor, verifique a chave da API Anthropic e tente novamente.",
- "InvalidAzureAPIKey": "Chave de API Azure incorreta ou vazia, por favor, verifique a chave de API Azure e tente novamente",
"InvalidBedrockCredentials": "Credenciais Bedrock inválidas, por favor, verifique AccessKeyId/SecretAccessKey e tente novamente",
"InvalidClerkUser": "Desculpe, você ainda não fez login. Por favor, faça login ou registre uma conta antes de continuar.",
- "InvalidGoogleAPIKey": "Chave de API Google incorreta ou vazia, por favor, verifique a chave de API Google e tente novamente",
- "InvalidGroqAPIKey": "Chave de API Groq AI inválida ou em branco, verifique a chave de API Groq e tente novamente",
- "InvalidMinimaxAPIKey": "Chave de API Minimax inválida ou em branco, verifique a chave de API Minimax e tente novamente",
- "InvalidMistralAPIKey": "Chave de API Mistral AI inválida ou vazia. Por favor, verifique a chave de API Mistral e tente novamente.",
- "InvalidMoonshotAPIKey": "A chave da API Moonshot AI está incorreta ou vazia. Por favor, verifique a chave da API Moonshot e tente novamente.",
"InvalidOllamaArgs": "Configuração Ollama inválida, verifique a configuração do Ollama e tente novamente",
- "InvalidOpenRouterAPIKey": "Chave da API do OpenRouter inválida ou em branco. Por favor, verifique a chave da API do OpenRouter e tente novamente.",
- "InvalidPerplexityAPIKey": "Chave da API Perplexity inválida ou em branco, verifique a chave da API Perplexity e tente novamente",
- "InvalidTogetherAIAPIKey": "Chave da API do TogetherAI inválida ou em branco. Por favor, verifique a chave da API do TogetherAI e tente novamente.",
- "InvalidZeroOneAPIKey": "Chave de API ZeroOne inválida ou vazia, verifique a chave de API ZeroOne e tente novamente",
- "InvalidZhipuAPIKey": "Chave de API Zhipu incorreta ou vazia, por favor, verifique a chave de API Zhipu e tente novamente",
+ "InvalidProviderAPIKey": "{{provider}} API Key inválido ou em branco, por favor, verifique o {{provider}} API Key e tente novamente",
"LocationNotSupportError": "Desculpe, sua localização atual não suporta este serviço de modelo, pode ser devido a restrições geográficas ou serviço não disponível. Por favor, verifique se a localização atual suporta o uso deste serviço ou tente usar outras informações de localização.",
- "MinimaxBizError": "Erro no serviço Minimax, verifique as informações abaixo ou tente novamente",
- "MistralBizError": "Ocorreu um erro ao solicitar o serviço Mistral AI. Por favor, verifique as informações abaixo ou tente novamente.",
- "MoonshotBizError": "O serviço Moonshot na face oculta da lua encontrou um erro. Por favor, verifique as informações abaixo ou tente novamente.",
"NoOpenAIAPIKey": "A chave de API do OpenAI está em branco. Adicione uma chave de API personalizada do OpenAI",
"OllamaBizError": "Erro de negócio ao solicitar o serviço Ollama, verifique as informações a seguir ou tente novamente",
"OllamaServiceUnavailable": "O serviço Ollama não está disponível. Verifique se o Ollama está em execução corretamente ou se a configuração de CORS do Ollama está correta",
- "OpenAIBizError": "Erro ao solicitar o serviço OpenAI. Verifique ou tente novamente com base nas informações abaixo",
- "OpenRouterBizError": "Erro de negócios ao solicitar o serviço de IA do OpenRouter. Por favor, verifique as informações abaixo ou tente novamente.",
- "PerplexityBizError": "Erro de negócios ao solicitar o serviço de IA Perplexity, verifique as informações a seguir ou tente novamente",
+ "OpenAIBizError": "Erro no serviço OpenAI solicitado. Por favor, verifique as informações abaixo ou tente novamente.",
"PluginApiNotFound": "Desculpe, o API especificado não existe no manifesto do plugin. Verifique se o método de solicitação corresponde ao API do manifesto do plugin",
"PluginApiParamsError": "Desculpe, a validação dos parâmetros de entrada da solicitação do plugin falhou. Verifique se os parâmetros de entrada correspondem às informações de descrição do API",
"PluginGatewayError": "Desculpe, ocorreu um erro no gateway do plugin. Verifique se a configuração do gateway do plugin está correta",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Desculpe, a inicialização do cliente OpenAPI falhou. Verifique se as informações de configuração do OpenAPI estão corretas",
"PluginServerError": "Erro na resposta do servidor do plugin. Verifique o arquivo de descrição do plugin, a configuração do plugin ou a implementação do servidor de acordo com as informações de erro abaixo",
"PluginSettingsInvalid": "Este plugin precisa ser configurado corretamente antes de ser usado. Verifique se sua configuração está correta",
- "TogetherAIBizError": "Erro de negócios ao solicitar o serviço de IA do TogetherAI. Por favor, verifique as informações abaixo ou tente novamente.",
- "ZeroOneBizError": "Erro no serviço ZeroOneBiz, verifique as informações abaixo e tente novamente",
- "ZhipuBizError": "Erro ao solicitar o serviço Zhipu, por favor, verifique as informações abaixo ou tente novamente"
+ "ProviderBizError": "Erro no serviço {{provider}} solicitado. Por favor, verifique as informações abaixo ou tente novamente."
},
"stt": {
"responseError": "Falha na solicitação de serviço. Verifique a configuração ou tente novamente"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Adicionar URL de proxy OpenAI (opcional)",
+ "apiKey": {
+ "description": "Insira sua chave de API {{name}} para iniciar a sessão",
+ "title": "Usar chave de API personalizada {{name}}"
+ },
"closeMessage": "Fechar mensagem",
"confirm": "Confirmar e tentar novamente",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Faça login na sua conta",
"welcome": "Bem-vindo!"
},
- "ollama": {
- "cancel": "Cancelar",
- "confirm": "Confirmar",
- "description": "Digite suas tags de modelo Ollama para continuar a sessão",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Iniciando download...",
- "title": "Baixar modelo Ollama específico"
- },
"password": {
"description": "O administrador ativou a criptografia do aplicativo. Insira a senha do aplicativo para desbloqueá-lo. A senha só precisa ser inserida uma vez.",
"placeholder": "Insira a senha",
@@ -132,5 +107,9 @@
"apiKey": "Chave de API personalizada",
"password": "Senha"
}
+ },
+ "upload": {
+ "desc": "Detalhes: {{detail}}",
+ "title": "Falha ao enviar o arquivo, verifique a conexão de rede ou tente novamente mais tarde"
}
}
diff --git a/locales/pt-BR/metadata.json b/locales/pt-BR/metadata.json
new file mode 100644
index 000000000000..97a2a3cb3f11
--- /dev/null
+++ b/locales/pt-BR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat oferece a melhor experiência de uso do ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Ferramenta de produtividade pessoal LLM para um cérebro mais inteligente"
+ },
+ "market": {
+ "description": "Criação de conteúdo, redação, perguntas e respostas, geração de imagens, geração de vídeos, geração de voz, agente inteligente, fluxo de trabalho automatizado, personalize seu assistente de IA / GPTs / OLLaMA exclusivo",
+ "title": "Mercado de assistentes"
+ },
+ "plugins": {
+ "description": "Pesquisa, geração de gráficos, acadêmico, geração de imagens, geração de vídeos, geração de voz, fluxo de trabalho automatizado, personalize a capacidade de plug-in exclusiva do ChatGPT / OLLaMA com ToolCall",
+ "title": "Mercado de plug-ins"
+ },
+ "welcome": {
+ "description": "LobeChat oferece a melhor experiência de uso do ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Bem-vindo ao LobeChat: Ferramenta de produtividade pessoal LLM para um cérebro mais inteligente"
+ }
+}
diff --git a/locales/pt-BR/modelProvider.json b/locales/pt-BR/modelProvider.json
index 373f1d4860d5..1521fb28dd6b 100644
--- a/locales/pt-BR/modelProvider.json
+++ b/locales/pt-BR/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Além do endereço padrão, deve incluir http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Endereço do Proxy da API"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Insira sua API Key fornecida pela Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Anthropic para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Anthropic personalizada"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "A versão da API da Azure, seguindo o formato AAAA-MM-DD, consulte a [versão mais recente](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Você pode encontrar este valor na seção 'Chaves e Endpoints' ao verificar os recursos no portal Azure. Você pode usar KEY1 ou KEY2",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Azure OpenAI para iniciar a sessão",
- "title": "Usar chave de API Azure OpenAI personalizada"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Usar informações de autenticação Bedrock personalizadas"
}
},
- "google": {
- "endpoint": {
- "desc": "Além do endereço padrão, deve incluir http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Endereço do Proxy da API"
- },
- "title": "Google",
- "token": {
- "desc": "Insira sua API Key fornecida pelo Google",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API do Google para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API do Google personalizada"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Insira sua API Key fornecida pela Groq",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Groq para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Groq personalizada"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Insira a chave da API do Minimax",
- "placeholder": "Chave da API do Minimax",
- "title": "Chave da API"
- },
- "unlock": {
- "description": "Digite sua chave da API do Minimax para iniciar a sessão. O aplicativo não irá armazenar sua chave da API.",
- "title": "Usar chave da API personalizada do Minimax"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Insira sua API Key fornecida pela Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Mistral AI para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Mistral AI personalizada"
- }
- },
- "moonshot": {
- "title": "Lado Escuro da Lua",
- "token": {
- "desc": "Insira sua API Key fornecida pela Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Moonshot AI para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Moonshot AI personalizada"
- }
- },
"ollama": {
"checker": {
- "desc": "Teste se o endereço do proxy está corretamente preenchido"
+ "desc": "Teste se o endereço do proxy está corretamente preenchido",
+ "title": "Verificação de Conectividade"
},
"customModelName": {
"desc": "Adicione modelos personalizados, separe múltiplos modelos com vírgulas (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Nomes dos Modelos Personalizados"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please do not close this page. It will resume from where it left off if you restart the download.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Insira o endereço do proxy de interface da Ollama, se não foi especificado localmente, pode deixar em branco",
- "placeholder": "http://127.0.0.1:11434",
"title": "Endereço do Proxy de Interface"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Versão de Visualização)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Além do endereço padrão, deve incluir http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Endereço do Proxy de Interface"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Use sua própria OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API OpenAI para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API OpenAI personalizada"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Teste se o endereço do proxy está corretamente preenchido"
- },
- "customModelName": {
- "desc": "Adicione modelos personalizados, separe múltiplos modelos com vírgulas (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Nomes dos Modelos Personalizados"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Insira sua API Key fornecida pela OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API OpenRouter para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API OpenRouter personalizada"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Insira sua API Key fornecida pela Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Digite sua chave de API Perplexity para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Perplexity personalizada"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Teste se o endereço do proxy está corretamente preenchido"
- },
- "customModelName": {
- "desc": "Adicione modelos personalizados, separe múltiplos modelos com vírgulas (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Nomes dos Modelos Personalizados"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Insira sua API Key fornecida pela TogetherAI",
- "placeholder": "TogetherAI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API TogetherAI para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API TogetherAI personalizada"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Zero e Um",
- "token": {
- "desc": "Insira sua API Key fornecida pela 01.AI Zero e Um",
- "placeholder": "01.AI Zero e Um API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API ZeroOne para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API ZeroOne personalizada"
- }
+ "title": "01.AI Zero e Um"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Insira sua API Key fornecida pela Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Digite sua chave de API Zhipu para iniciar a sessão. O aplicativo não irá armazenar sua chave de API",
- "title": "Usar chave de API Zhipu personalizada"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/pt-BR/plugin.json b/locales/pt-BR/plugin.json
index 67c96efba8d3..59f08d66421f 100644
--- a/locales/pt-BR/plugin.json
+++ b/locales/pt-BR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Chamada de Função",
"off": "Desativar Depuração",
"on": "Ver Informações de Chamada de Plugin",
- "response": "Resposta"
+ "payload": "carga do plugin",
+ "response": "Resposta",
+ "tool_call": "solicitação de chamada de ferramenta"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Executando o plugin..."
},
"pluginList": "Lista de Plugins",
- "plugins": {
- "loading": "Verificando plugins...",
- "unknown": "Plugin desconhecido"
- },
"setting": "Configuração do Plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Instalados"
},
"title": "Loja de Plugins"
- }
+ },
+ "unknownPlugin": "Plugin desconhecido"
}
diff --git a/locales/pt-BR/setting.json b/locales/pt-BR/setting.json
index d8e61d59647b..0a089c8f2986 100644
--- a/locales/pt-BR/setting.json
+++ b/locales/pt-BR/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Sobre"
},
+ "agentTab": {
+ "chat": "Preferências de bate-papo",
+ "meta": "Informações do assistente",
+ "modal": "Configurações do modelo",
+ "plugin": "Configurações do plug-in",
+ "prompt": "Configuração de personagem",
+ "tts": "Serviço de voz"
+ },
"analytics": {
"telemetry": {
"desc": "Ao optar por enviar dados de telemetria, você pode nos ajudar a melhorar a experiência do usuário do LobeChat como um todo",
@@ -35,10 +43,14 @@
"title": "Configurações"
},
"llm": {
+ "apiKey": {
+ "desc": "Por favor, insira sua chave de API {{name}}",
+ "placeholder": "Chave de API {{name}}",
+ "title": "Chave de API"
+ },
"checker": {
"button": "Verificar",
"desc": "Verifica se a Api Key e o endereço do proxy estão preenchidos corretamente",
- "ollamaDesc": "Verifique se o endereço do proxy está preenchido corretamente",
"pass": "Verificação aprovada",
"title": "Verificação de Conectividade"
},
@@ -90,22 +102,19 @@
"latestTime": "Última atualização: {{time}}",
"noLatestTime": "Lista não disponível"
},
+ "helpDoc": "Tutorial de configuração",
"modelList": {
"desc": "Escolha os modelos a serem exibidos na conversa. Os modelos selecionados serão exibidos na lista de modelos.",
"placeholder": "Selecione um modelo da lista",
"title": "Lista de Modelos",
"total": "Total de {{count}} modelos disponíveis"
},
+ "proxyUrl": {
+ "desc": "Além do endereço padrão, deve incluir http(s)://",
+ "title": "Endereço do Proxy da API"
+ },
"waitingForMore": "Mais modelos estão sendo <1>planejados para serem adicionados1>, aguarde ansiosamente ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama está baixando este modelo. Por favor, evite fechar esta página. O download será retomado do ponto em que parou, caso seja reiniciado.",
- "remainingTime": "Tempo restante",
- "speed": "Velocidade de download",
- "title": "Baixando modelo {{model}}"
- }
- },
"plugin": {
"addTooltip": "Adicionar plug-in personalizado",
"clearDeprecated": "Remover plug-ins inválidos",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Sem limite",
"limited": "Incluir apenas {{number}} mensagens de conversa",
+ "setlimited": "Definir número de mensagens de histórico",
"title": "Limitar número de mensagens de histórico",
"unlimited": "Sem limite de mensagens de histórico"
},
@@ -356,6 +366,24 @@
"title": "Sincronização WebRTC"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Modelo de Geração de Metadados do Assistente",
+ "modelDesc": "Especifica o modelo usado para gerar o nome, descrição, avatar e tags do assistente",
+ "title": "Geração Automática de Informações do Assistente"
+ },
+ "title": "Assistente do Sistema",
+ "topic": {
+ "label": "Modelo de Nomeação de Tópicos",
+ "modelDesc": "Especifica o modelo usado para renomeação automática de tópicos",
+ "title": "Renomeação Automática de Tópicos"
+ },
+ "translation": {
+ "label": "Modelo de Tradução",
+ "modelDesc": "Especifica o modelo usado para tradução",
+ "title": "Configurações do Assistente de Tradução"
+ }
+ },
"tab": {
"about": "Sobre",
"agent": "Assistente Padrão",
@@ -363,6 +391,7 @@
"experiment": "Experimento",
"llm": "Modelo de Linguagem",
"sync": "Sincronização na nuvem",
+ "system-agent": "Assistente do Sistema",
"tts": "Serviço de Voz"
},
"tools": {
diff --git a/locales/pt-BR/tool.json b/locales/pt-BR/tool.json
index ab839f22144e..8c1e193b22bd 100644
--- a/locales/pt-BR/tool.json
+++ b/locales/pt-BR/tool.json
@@ -4,6 +4,7 @@
"downloading": "O link da imagem gerada pelo DALL·E3 é válido apenas por 1 hora, está baixando a imagem para o armazenamento local...",
"generate": "Gerar",
"generating": "Gerando...",
- "images": "Imagens:"
+ "images": "Imagens:",
+ "prompt": "Palavra-chave"
}
}
diff --git a/locales/ru-RU/auth.json b/locales/ru-RU/auth.json
index 4e6b39c25f5e..08be60486b09 100644
--- a/locales/ru-RU/auth.json
+++ b/locales/ru-RU/auth.json
@@ -1,6 +1,8 @@
{
"login": "Войти",
"loginOrSignup": "Войти / Зарегистрироваться",
+ "profile": "Профиль",
+ "security": "Безопасность",
"signout": "Выйти",
"signup": "Зарегистрироваться"
}
diff --git a/locales/ru-RU/chat.json b/locales/ru-RU/chat.json
index 1de1b7b05ea8..28e53049443e 100644
--- a/locales/ru-RU/chat.json
+++ b/locales/ru-RU/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Привет, я **{{name}}**. Ты можешь начать общение со мной прямо сейчас или перейти к [настройкам помощника](/chat/settings#session={{id}}), чтобы улучшить мою информацию.",
"agentDefaultMessageWithSystemRole": "Привет, я **{{name}}**, {{systemRole}}. Давай начнем разговор!",
+ "agentsAndConversations": "Агенты и беседы",
"backToBottom": "Вернуться вниз",
"clearCurrentMessages": "Очистить текущий разговор",
"confirmClearCurrentMessages": "Вы уверены, что хотите очистить текущий разговор? После этого его нельзя будет восстановить.",
@@ -39,7 +40,6 @@
"regenerate": "Пересоздать"
},
"newAgent": "Создать помощника",
- "noDescription": "Нет описания",
"pin": "Закрепить",
"pinOff": "Открепить",
"regenerate": "Сгенерировать заново",
@@ -83,6 +83,7 @@
"chats": "Чаты",
"rest": "Остаток",
"systemRole": "Роль системы",
+ "title": "Детали контекста",
"tools": "Инструменты",
"total": "Всего",
"used": "Использовано"
diff --git a/locales/ru-RU/common.json b/locales/ru-RU/common.json
index 4a897c4bf17d..0afbb78bc5bf 100644
--- a/locales/ru-RU/common.json
+++ b/locales/ru-RU/common.json
@@ -1,7 +1,7 @@
{
"about": "О нас",
"advanceSettings": "Расширенные настройки",
- "appInitializing": "LobeChat запускается, пожалуйста, подождите…",
+ "appInitializing": "Приложение запускается, пожалуйста, подождите...",
"autoGenerate": "Автозаполнение",
"autoGenerateTooltip": "Автоматическое дополнение описания агента на основе подсказок",
"autoGenerateTooltipDisabled": "Пожалуйста, введите подсказку перед использованием функции автозаполнения",
@@ -9,6 +9,7 @@
"cancel": "Отмена",
"changelog": "История изменений",
"close": "Закрыть",
+ "contact": "Свяжитесь с нами",
"copy": "Копировать",
"copyFail": "Не удалось скопировать",
"copySuccess": "Успешно скопировано",
@@ -35,10 +36,33 @@
},
"feedback": "Обратная связь и предложения",
"follow": "Подпишитесь на нас на {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Поделитесь своими ценными отзывами",
+ "star": "Поставьте звезду на GitHub"
+ },
+ "and": "и",
+ "feedback": {
+ "action": "Поделиться отзывом",
+ "desc": "Каждая ваша идея и рекомендация очень важны для нас, и мы с нетерпением ждем вашего мнения! Не стесняйтесь связаться с нами, чтобы предоставить отзыв о функциях продукта и опыте использования, чтобы помочь нам сделать LobeChat еще лучше.",
+ "title": "Поделитесь своими ценными отзывами на GitHub"
+ },
+ "later": "позже",
+ "star": {
+ "action": "Поставьте звезду",
+ "desc": "Если вам нравится наш продукт и вы хотите нас поддержать, не могли бы вы поставить нам звезду на GitHub? Это маленькое действие имеет большое значение для нас и мотивирует нас продолжать предоставлять вам лучший опыт использования.",
+ "title": "Поставьте звезду на GitHub для нас"
+ },
+ "title": "Нравится наш продукт?"
+ },
"fullscreen": "Полноэкранный режим",
"historyRange": "История",
"import": "Импорт настроек",
"importModal": {
+ "error": {
+ "desc": "Извините, произошла ошибка в процессе импорта данных. Попробуйте импортировать заново или <1>сообщите о проблеме1>, и мы постараемся помочь вам как можно скорее.",
+ "title": "Ошибка импорта данных"
+ },
"finish": {
"onlySettings": "Настройки системы успешно импортированы",
"start": "Начать использование",
@@ -46,6 +70,7 @@
"title": "Импорт данных завершен"
},
"loading": "Идет импорт данных, пожалуйста, подождите...",
+ "preparing": "Подготовка модуля импорта данных...",
"result": {
"added": "Успешно импортировано",
"errors": "Ошибка импорта",
@@ -56,8 +81,15 @@
"topics": "Темы",
"type": "Тип данных"
},
- "title": "Импорт данных"
+ "title": "Импорт данных",
+ "uploading": {
+ "desc": "Файл сейчас загружается, так как он довольно большой...",
+ "restTime": "Оставшееся время",
+ "speed": "Скорость загрузки"
+ }
},
+ "information": "Сообщество и информация",
+ "installPWA": "Установить веб-приложение",
"lang": {
"ar": "арабский",
"bg-BG": "болгарский",
@@ -96,7 +128,11 @@
"zh-TW": "Традиционный китайский"
},
"layoutInitializing": "Инициализация макета...",
- "noDescription": "Нет описания",
+ "legal": "Юридическое уведомление",
+ "mail": {
+ "business": "Деловое сотрудничество",
+ "support": "Поддержка по электронной почте"
+ },
"oauth": "Вход через единую учетную запись (SSO)",
"officialSite": "Официальный сайт",
"ok": "ОК",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Анонимный пользователь",
"billing": "Управление счетами",
+ "data": "Хранилище данных",
"defaultNickname": "Пользователь сообщества",
"discord": "Поддержка сообщества",
"docs": "Документация",
@@ -181,5 +218,6 @@
"profile": "Управление аккаунтом",
"setting": "Настройки приложения",
"usages": "Статистика использования"
- }
+ },
+ "version": "Версия"
}
diff --git a/locales/ru-RU/components.json b/locales/ru-RU/components.json
index 21d35c3c86b9..9b80b2a82faf 100644
--- a/locales/ru-RU/components.json
+++ b/locales/ru-RU/components.json
@@ -6,7 +6,8 @@
"functionCall": "Эта модель поддерживает вызов функций",
"tokens": "Эта модель поддерживает до {{tokens}} токенов в одной сессии",
"vision": "Эта модель поддерживает распознавание изображений"
- }
+ },
+ "removed": "Эта модель не находится в списке. Если вы ее отмените, она будет автоматически удалена"
},
"ModelSwitchPanel": {
"emptyModel": "Нет активированных моделей. Пожалуйста, перейдите в настройки и включите модель",
diff --git a/locales/ru-RU/error.json b/locales/ru-RU/error.json
index c7cc2a238e9c..d499fd1e1ab9 100644
--- a/locales/ru-RU/error.json
+++ b/locales/ru-RU/error.json
@@ -1,9 +1,9 @@
{
"clerkAuth": {
"loginSuccess": {
- "action": "继续会话",
- "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧",
- "title": "欢迎回来, {{nickName}}"
+ "action": "Продолжить разговор",
+ "desc": "{{greeting}}, рады снова быть к вашим услугам. Давайте продолжим нашу беседу",
+ "title": "Добро пожаловать обратно, {{nickName}}"
}
},
"error": {
@@ -12,6 +12,8 @@
"retry": "Повторить попытку",
"title": "Произошла проблема на странице.."
},
+ "fetchError": "Ошибка запроса",
+ "fetchErrorDetail": "Подробности ошибки",
"notFound": {
"backHome": "Вернуться на главную",
"desc": "Мы не можем найти страницу, которую вы ищете. Пожалуйста, проверьте правильность ссылки",
@@ -52,37 +54,16 @@
"503": "К сожалению, сервер в настоящее время не может обработать ваш запрос, возможно, из-за перегрузки или технического обслуживания. Повторите попытку позже.",
"504": "К сожалению, сервер не получил ответа от вышестоящего сервера. Повторите попытку позже.",
"AgentRuntimeError": "Ошибка выполнения времени выполнения языковой модели Lobe, пожалуйста, проверьте и повторите попытку в соответствии с предоставленной информацией",
- "AnthropicBizError": "Ошибка запроса к сервису Anthropic AI. Пожалуйста, проверьте информацию ниже или повторите попытку",
- "AzureBizError": "Ошибка запроса службы Azure AI, пожалуйста, проверьте и повторите попытку в соответствии с предоставленной информацией",
- "BedrockBizError": "Ошибка запроса службы Bedrock, пожалуйста, проверьте и повторите попытку в соответствии с предоставленной информацией",
- "GoogleBizError": "Ошибка запроса службы Google, пожалуйста, проверьте и повторите попытку в соответствии с предоставленной информацией",
- "GroqBizError": "Ошибка обращения к сервису Groq. Пожалуйста, проверьте следующую информацию или повторите попытку",
"InvalidAccessCode": "Неверный код доступа: введите правильный код доступа или добавьте пользовательский ключ API",
- "InvalidAnthropicAPIKey": "Anthropic API Key недействителен или отсутствует. Пожалуйста, проверьте Anthropic API Key и повторите попытку",
- "InvalidAzureAPIKey": "Неверный или пустой ключ API Azure, пожалуйста, проверьте ключ API Azure и повторите попытку",
"InvalidBedrockCredentials": "Аутентификация Bedrock не прошла, пожалуйста, проверьте AccessKeyId/SecretAccessKey и повторите попытку",
"InvalidClerkUser": "Извините, вы еще не вошли в систему. Пожалуйста, войдите или зарегистрируйтесь, прежде чем продолжить",
- "InvalidGoogleAPIKey": "Неверный или пустой ключ API Google, пожалуйста, проверьте ключ API Google и повторите попытку",
- "InvalidGroqAPIKey": "Неверный или пустой ключ API Groq, пожалуйста, проверьте ключ API Groq и повторите попытку",
- "InvalidMinimaxAPIKey": "Неверный или пустой ключ Minimax API. Пожалуйста, проверьте ключ Minimax API и повторите попытку",
- "InvalidMistralAPIKey": "Неверный или пустой ключ API Mistral AI. Пожалуйста, проверьте ключ API Mistral и повторите попытку",
- "InvalidMoonshotAPIKey": "Moonshot AI API Key неверный или пустой, пожалуйста, проверьте ключ API Moonshot и повторите попытку",
"InvalidOllamaArgs": "Неверная конфигурация Ollama, пожалуйста, проверьте конфигурацию Ollama и повторите попытку",
- "InvalidOpenRouterAPIKey": "OpenRouter API Key недействителен или отсутствует. Пожалуйста, проверьте правильность OpenRouter API Key и повторите попытку",
- "InvalidPerplexityAPIKey": "Неверный или пустой ключ API Perplexity. Пожалуйста, проверьте ключ API Perplexity и повторите попытку",
- "InvalidTogetherAIAPIKey": "TogetherAI API Key недействителен или отсутствует. Пожалуйста, проверьте правильность TogetherAI API Key и повторите попытку",
- "InvalidZeroOneAPIKey": "Неверный или пустой ключ API ZeroOne. Пожалуйста, проверьте ключ API ZeroOne и повторите попытку",
- "InvalidZhipuAPIKey": "Неверный или пустой ключ API Zhipu, пожалуйста, проверьте ключ API Zhipu и повторите попытку",
+ "InvalidProviderAPIKey": "{{provider}} API ключ недействителен или отсутствует. Пожалуйста, проверьте ключ API {{provider}} и повторите попытку",
"LocationNotSupportError": "Извините, ваше текущее местоположение не поддерживает эту службу модели, возможно из-за ограничений региона или недоступности службы. Пожалуйста, убедитесь, что текущее местоположение поддерживает использование этой службы, или попробуйте использовать другую информацию о местоположении.",
- "MinimaxBizError": "Ошибка обслуживания Minimax. Пожалуйста, проверьте информацию ниже или повторите попытку",
- "MistralBizError": "Ошибка запроса к службе Mistral AI. Пожалуйста, проверьте следующую информацию или повторите попытку",
- "MoonshotBizError": "请求月球暗面服务出错,请根据以下信息排查或重试",
"NoOpenAIAPIKey": "Ключ OpenAI API пуст, пожалуйста, добавьте свой собственный ключ OpenAI API",
"OllamaBizError": "Ошибка обращения к сервису Ollama, пожалуйста, проверьте следующую информацию или повторите попытку",
"OllamaServiceUnavailable": "Сервис Ollama недоступен. Пожалуйста, проверьте, работает ли Ollama правильно, и правильно ли настроена его конфигурация для кросс-доменных запросов",
- "OpenAIBizError": "Ошибка запроса службы OpenAI. Устраните неполадку или повторите попытку, основываясь на следующей информации.",
- "OpenRouterBizError": "Ошибка запроса к сервису OpenRouter AI. Пожалуйста, проверьте информацию ниже или повторите попытку",
- "PerplexityBizError": "Ошибка обращения к сервису Perplexity AI. Пожалуйста, проверьте информацию ниже или повторите попытку",
+ "OpenAIBizError": "Ошибка обслуживания OpenAI. Пожалуйста, проверьте следующую информацию или повторите попытку",
"PluginApiNotFound": "К сожалению, API не существует в манифесте плагина. Пожалуйста, проверьте, соответствует ли ваш метод запроса API манифеста плагина",
"PluginApiParamsError": "К сожалению, проверка входных параметров для запроса плагина не удалась. Пожалуйста, проверьте, соответствуют ли входные параметры описанию API",
"PluginGatewayError": "Извините, возникла ошибка шлюза плагина. Пожалуйста, проверьте правильность конфигурации шлюза плагина.",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Извините, не удалось инициализировать клиент OpenAPI. Пожалуйста, проверьте правильность информации конфигурации OpenAPI.",
"PluginServerError": "Запрос сервера плагина возвратил ошибку. Проверьте файл манифеста плагина, конфигурацию плагина или реализацию сервера на основе информации об ошибке ниже",
"PluginSettingsInvalid": "Этот плагин необходимо правильно настроить, прежде чем его можно будет использовать. Пожалуйста, проверьте правильность вашей конфигурации",
- "TogetherAIBizError": "Ошибка запроса к сервису TogetherAI AI. Пожалуйста, проверьте информацию ниже или повторите попытку",
- "ZeroOneBizError": "Ошибка обслуживания запроса к сервису ZeroOneBiz. Пожалуйста, проверьте следующую информацию и повторите попытку",
- "ZhipuBizError": "Ошибка запроса службы Zhipu, пожалуйста, проверьте и повторите попытку в соответствии с предоставленной информацией"
+ "ProviderBizError": "Ошибка обслуживания {{provider}}. Пожалуйста, проверьте следующую информацию или повторите попытку"
},
"stt": {
"responseError": "Ошибка запроса сервиса. Пожалуйста, проверьте конфигурацию или повторите попытку"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Добавить URL прокси-сервера OpenAI (необязательно)",
+ "apiKey": {
+ "description": "Просто введите ваш API ключ {{name}}, чтобы начать сеанс",
+ "title": "Используйте настраиваемый API ключ {{name}}"
+ },
"closeMessage": "Закрыть сообщение",
"confirm": "Подтвердить и повторить попытку",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Вход в аккаунт",
"welcome": "Добро пожаловать!"
},
- "ollama": {
- "cancel": "Отмена",
- "confirm": "Подтвердить",
- "description": "Введите метку вашей модели Ollama, чтобы продолжить разговор",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Начало загрузки...",
- "title": "Загрузить указанную модель Ollama"
- },
"password": {
"description": "Шифрование приложения включено администратором. Введите пароль приложения, чтобы разблокировать приложение. Пароль необходимо ввести только один раз.",
"placeholder": "Введите пароль",
@@ -132,5 +107,9 @@
"apiKey": "Пользовательский ключ API",
"password": "Пароль"
}
+ },
+ "upload": {
+ "desc": "Подробности: {{detail}}",
+ "title": "Ошибка загрузки файла. Проверьте подключение к сети или попробуйте позже"
}
}
diff --git a/locales/ru-RU/metadata.json b/locales/ru-RU/metadata.json
new file mode 100644
index 000000000000..1f8e10debb7a
--- /dev/null
+++ b/locales/ru-RU/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat предлагает вам лучший опыт использования ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: персональный инструмент для повышения эффективности LLM, чтобы сделать ваш мозг умнее"
+ },
+ "market": {
+ "description": "Создание контента, копирайтинг, вопросы и ответы, генерация изображений, видео, голоса, интеллектуальный агент, автоматизация рабочих процессов, настройте своего собственного помощника AI / GPTs / OLLaMA",
+ "title": "Рынок помощников"
+ },
+ "plugins": {
+ "description": "Поиск, создание диаграмм, академические исследования, генерация изображений, видео, голоса, автоматизация рабочих процессов, настройте специальные возможности плагинов ToolCall для ChatGPT / OLLaMA",
+ "title": "Рынок плагинов"
+ },
+ "welcome": {
+ "description": "LobeChat предлагает вам лучший опыт использования ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Добро пожаловать в LobeChat: персональный инструмент для повышения эффективности LLM, чтобы сделать ваш мозг умнее"
+ }
+}
diff --git a/locales/ru-RU/modelProvider.json b/locales/ru-RU/modelProvider.json
index 387b8ca9f8de..d4ee8caa89e2 100644
--- a/locales/ru-RU/modelProvider.json
+++ b/locales/ru-RU/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Должен включать http(s):// помимо стандартного адреса",
- "placeholder": "https://api.anthropic.com",
- "title": "Адрес API-прокси"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Введите свой API Key от Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Anthropic, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Anthropic"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Версия API Azure, следующая формату ГГГГ-ММ-ДД, см. [последнюю версию](https://learn.microsoft.com/ru-ru/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Можно найти в разделе «Ключи и конечные точки» при проверке ресурса в портале Azure. Можно использовать KEY1 или KEY2",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Azure OpenAI, чтобы начать сеанс",
- "title": "Использовать пользовательский ключ API Azure OpenAI"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Использовать пользовательскую информацию аутентификации Bedrock"
}
},
- "google": {
- "endpoint": {
- "desc": "Помимо адреса по умолчанию, должен включать http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Адрес прокси-API"
- },
- "title": "Google",
- "token": {
- "desc": "Введите свой API Key от Google",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Google, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Google"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Введите свой API Key от Groq",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Groq, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Groq"
- }
- },
- "minimax": {
- "title": "Минимакс",
- "token": {
- "desc": "Введите ключ API от Minimax",
- "placeholder": "Ключ API Minimax",
- "title": "API-ключ"
- },
- "unlock": {
- "description": "Просто введите свой ключ API от Minimax, чтобы начать сеанс. Приложение не сохраняет ваш ключ API.",
- "title": "Использовать пользовательский ключ API Minimax"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Введите свой API Key от Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Mistral AI, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Mistral AI"
- }
- },
- "moonshot": {
- "title": "Луна в тени",
- "token": {
- "desc": "Введите свой API Key от Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Moonshot AI, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Moonshot AI"
- }
- },
"ollama": {
"checker": {
- "desc": "Проверить правильность адреса прокси"
+ "desc": "Проверить правильность адреса прокси",
+ "title": "Проверка связности"
},
"customModelName": {
"desc": "Добавить кастомные модели, разделяя их через запятую (,)",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Название кастомных моделей"
},
+ "download": {
+ "desc": "Ollama is downloading the model. Please try not to close this page. The download will resume from where it left off if interrupted.",
+ "remainingTime": "Remaining Time",
+ "speed": "Download Speed",
+ "title": "Downloading model {{model}}"
+ },
"endpoint": {
"desc": "Введите адрес прокси-интерфейса Ollama, если локально не указано иное, можете оставить пустым",
- "placeholder": "http://127.0.0.1:11434",
"title": "Адрес прокси-интерфейса"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (превью)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Должен включать http(s):// помимо стандартного адреса",
- "placeholder": "https://api.openai.com/v1",
- "title": "Адрес прокси-интерфейса"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Используйте свой собственный OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API OpenAI, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API OpenAI"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Проверить правильность адреса прокси"
- },
- "customModelName": {
- "desc": "Добавить кастомные модели, разделяя их через запятую (,)",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Название кастомных моделей"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Введите свой API Key от OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API OpenRouter, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API OpenRouter"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Введите свой API Key от Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Введите свой ключ API Perplexity, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Perplexity"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Проверить правильность адреса прокси"
- },
- "customModelName": {
- "desc": "Добавить кастомные модели, разделяя их через запятую (,)",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Название кастомных моделей"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Введите свой API Key от TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API TogetherAI, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API TogetherAI"
+ "cancel": "Cancel Download",
+ "confirm": "Download",
+ "description": "Enter your Ollama model tag to continue the session",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Starting download...",
+ "title": "Download specified Ollama model"
}
},
"zeroone": {
- "title": "01.AI Цифровая Вселенная",
- "token": {
- "desc": "Введите свой API Key от 01.AI Цифровая Вселенная",
- "placeholder": "01.AI Цифровая Вселенная API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API ZeroOne, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API ZeroOne"
- }
+ "title": "01.AI Цифровая Вселенная"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Введите свой API Key от Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Введите свой ключ API Zhipu, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API",
- "title": "Использовать пользовательский ключ API Zhipu"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/ru-RU/plugin.json b/locales/ru-RU/plugin.json
index 88a5a41cd00b..ceb3b7129f3f 100644
--- a/locales/ru-RU/plugin.json
+++ b/locales/ru-RU/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Вызов функции",
"off": "Отключить отладку",
"on": "Включить отображение информации о вызовах плагинов",
- "response": "Ответ"
+ "payload": "полезная нагрузка",
+ "response": "Ответ",
+ "tool_call": "запрос на вызов инструмента"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Запуск плагина..."
},
"pluginList": "Список плагинов",
- "plugins": {
- "loading": "Загрузка плагинов...",
- "unknown": "Неизвестный плагин"
- },
"setting": "Настройка плагина",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Установленные"
},
"title": "Магазин плагинов"
- }
+ },
+ "unknownPlugin": "Неизвестный плагин"
}
diff --git a/locales/ru-RU/setting.json b/locales/ru-RU/setting.json
index 8708dafb83d8..6e7d448b04d6 100644
--- a/locales/ru-RU/setting.json
+++ b/locales/ru-RU/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "О нас"
},
+ "agentTab": {
+ "chat": "Предпочтения чата",
+ "meta": "Информация об ассистенте",
+ "modal": "Настройки модели",
+ "plugin": "Настройки плагина",
+ "prompt": "Настройки роли",
+ "tts": "Сервис озвучивания текста"
+ },
"analytics": {
"telemetry": {
"desc": "Выбрав отправку телеметрических данных, вы можете помочь нам улучшить общий пользовательский опыт LobeChat",
@@ -35,10 +43,14 @@
"title": "Настройки"
},
"llm": {
+ "apiKey": {
+ "desc": "Введите ваш {{name}} ключ API",
+ "placeholder": "{{name}} ключ API",
+ "title": "Ключ API"
+ },
"checker": {
"button": "Проверить",
"desc": "Проверьте правильность заполнения ключа API и адреса прокси",
- "ollamaDesc": "Проверьте правильность заполнения адреса прокси",
"pass": "Проверка пройдена",
"title": "Проверка доступности"
},
@@ -90,22 +102,19 @@
"latestTime": "Последнее обновление: {{time}}",
"noLatestTime": "Список пока не получен"
},
+ "helpDoc": "Руководство по настройке",
"modelList": {
"desc": "Выберите модель для отображения в сеансе, выбранная модель будет отображаться в списке моделей",
"placeholder": "Выберите модель из списка",
"title": "Список моделей",
"total": "Всего доступно {{count}} моделей"
},
+ "proxyUrl": {
+ "desc": "За исключением адреса по умолчанию, должен включать http(s)://",
+ "title": "Адрес прокси API"
+ },
"waitingForMore": "Больше моделей доступно в <1>плане подключения1>, ожидайте ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama загружает эту модель. Пожалуйста, не закрывайте эту страницу. Загрузка будет возобновлена с того же места, если вы решите начать её заново.",
- "remainingTime": "Оставшееся время",
- "speed": "Скорость загрузки",
- "title": "Загрузка модели {{model}}"
- }
- },
"plugin": {
"addTooltip": "Добавить настраиваемый плагин",
"clearDeprecated": "Удалить устаревшие плагины",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Без ограничений",
"limited": "Содержит только {{number}} сообщений",
+ "setlimited": "Установить ограничение на количество использованных сообщений",
"title": "Ограничение истории сообщений",
"unlimited": "Без ограничения истории сообщений"
},
@@ -325,44 +335,63 @@
"sync": {
"device": {
"deviceName": {
- "hint": "添加名称以便于识别",
- "placeholder": "请输入设备名称",
- "title": "设备名称"
+ "hint": "Добавьте имя для удобства идентификации",
+ "placeholder": "Введите имя устройства",
+ "title": "Имя устройства"
},
- "title": "设备信息",
- "unknownBrowser": "未知浏览器",
- "unknownOS": "未知系统"
+ "title": "Информация об устройстве",
+ "unknownBrowser": "Неизвестный браузер",
+ "unknownOS": "Неизвестная система"
},
"warning": {
- "message": "本功能目前仍为实验性功能,可能存在预期外或不稳定的情况,如遇到问题请及时提交反馈。"
+ "message": "Эта функция в настоящее время является экспериментальной и может работать нестабильно или непредсказуемо. Если вы столкнетесь с проблемами, пожалуйста, отправьте отзыв."
},
"webrtc": {
"channelName": {
- "desc": "WebRTC 将使用此名创建同步频道,确保频道名称唯一",
- "placeholder": "请输入同步频道名称",
- "shuffle": "随机生成",
- "title": "同步频道名称"
+ "desc": "WebRTC будет использовать это имя для создания канала синхронизации, убедитесь, что имя канала уникально",
+ "placeholder": "Введите имя канала синхронизации",
+ "shuffle": "Сгенерировать случайно",
+ "title": "Имя канала синхронизации"
},
"channelPassword": {
- "desc": "添加密码确保频道私密性,只有密码正确时,设备才可加入频道",
- "placeholder": "请输入同步频道密码",
- "title": "同步频道密码"
+ "desc": "Добавьте пароль для обеспечения конфиденциальности канала, только устройства с правильным паролем могут присоединиться к каналу",
+ "placeholder": "Введите пароль канала синхронизации",
+ "title": "Пароль канала синхронизации"
},
- "desc": "实时、点对点的数据通信,需设备同时在线才可同步",
+ "desc": "Реальное время, точка-точка передачи данных, устройства должны быть онлайн одновременно для синхронизации",
"enabled": {
- "invalid": "请填写同步频道名称后再开启",
- "title": "开启同步"
+ "invalid": "Пожалуйста, введите имя канала синхронизации перед включением",
+ "title": "Включить синхронизацию"
},
- "title": "WebRTC 同步"
+ "title": "WebRTC синхронизация"
+ }
+ },
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Модель генерации метаданных агента",
+ "modelDesc": "Модель, используемая для генерации имени агента, описания, аватара и меток",
+ "title": "Автоматическое создание информации об агенте"
+ },
+ "title": "Системный агент",
+ "topic": {
+ "label": "Модель именования тем",
+ "modelDesc": "Модель, используемая для автоматического переименования тем",
+ "title": "Автоматическое именование тем"
+ },
+ "translation": {
+ "label": "Модель перевода",
+ "modelDesc": "Модель, используемая для перевода",
+ "title": "Настройки помощника по переводу"
}
},
"tab": {
"about": "О нас",
"agent": "Помощник по умолчанию",
"common": "Общие настройки",
- "experiment": "实验",
+ "experiment": "Эксперимент",
"llm": "Языковая модель",
- "sync": "云端同步",
+ "sync": "Синхронизация с облаком",
+ "system-agent": "Системный агент",
"tts": "Голосовые услуги"
},
"tools": {
diff --git a/locales/ru-RU/tool.json b/locales/ru-RU/tool.json
index 171136250c3d..94b30e6ed4c1 100644
--- a/locales/ru-RU/tool.json
+++ b/locales/ru-RU/tool.json
@@ -4,6 +4,7 @@
"downloading": "Ссылка на изображение, созданное DALL·E3, действительна только в течение 1 часа. Идет кэширование изображения локально...",
"generate": "Создать",
"generating": "Создание...",
- "images": "Изображения:"
+ "images": "Изображения:",
+ "prompt": "подсказка"
}
}
diff --git a/locales/tr-TR/auth.json b/locales/tr-TR/auth.json
index a87d0eb8b9e9..ba16da2bd8b2 100644
--- a/locales/tr-TR/auth.json
+++ b/locales/tr-TR/auth.json
@@ -1,6 +1,8 @@
{
"login": "Giriş Yap",
"loginOrSignup": "Giriş Yap / Kayıt Ol",
+ "profile": "Profil",
+ "security": "Güvenlik",
"signout": "Çıkış Yap",
"signup": "Kaydol"
}
diff --git a/locales/tr-TR/chat.json b/locales/tr-TR/chat.json
index d220cf4ce99e..51526053ca9f 100644
--- a/locales/tr-TR/chat.json
+++ b/locales/tr-TR/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Merhaba, Ben **{{name}}**. Hemen benimle sohbet etmeye başlayabilirsiniz veya [Asistan Ayarları](/chat/settings#session={{id}}) sayfasına giderek bilgilerimi tamamlayabilirsiniz.",
"agentDefaultMessageWithSystemRole": "Merhaba, Ben **{{name}}**, {{systemRole}}. Hemen sohbet etmeye başlayalım!",
+ "agentsAndConversations": "Ajanlar ve Konuşmalar",
"backToBottom": "En alta git",
"clearCurrentMessages": "Mevcut oturum mesajlarını temizle",
"confirmClearCurrentMessages": "Mevcut oturum mesajlarını temizlemek üzeresiniz. Temizlendikten sonra geri alınamazlar. Lütfen eyleminizi onaylayın.",
@@ -39,7 +40,6 @@
"regenerate": "Yeniden Oluştur"
},
"newAgent": "Yeni Asistan",
- "noDescription": "Açıklama yok",
"pin": "Pin",
"pinOff": "Unpin",
"regenerate": "Tekrarla",
@@ -83,6 +83,7 @@
"chats": "Sohbetler",
"rest": "Kalan",
"systemRole": "Sistem Rolü",
+ "title": "Bağlam Detayları",
"tools": "Araçlar",
"total": "Toplam",
"used": "Kullanılan"
diff --git a/locales/tr-TR/common.json b/locales/tr-TR/common.json
index b9be9e374623..cccf92265ca9 100644
--- a/locales/tr-TR/common.json
+++ b/locales/tr-TR/common.json
@@ -1,7 +1,7 @@
{
"about": "Hakkında",
"advanceSettings": "Gelişmiş Ayarlar",
- "appInitializing": "LobeChat başlatılıyor, lütfen bekleyin...",
+ "appInitializing": "Uygulama başlatılıyor, lütfen bekleyin...",
"autoGenerate": "Otomatik Oluştur",
"autoGenerateTooltip": "Auto-generate agent description based on prompts",
"autoGenerateTooltipDisabled": "Otomatik tamamlama işlevini kullanmadan önce ipucu kelimesini girin",
@@ -9,6 +9,7 @@
"cancel": "İptal",
"changelog": "Changelog",
"close": "Kapat",
+ "contact": "Bize Ulaşın",
"copy": "Kopyala",
"copyFail": "Kopyalama başarısız oldu",
"copySuccess": "Kopyalama Başarılı",
@@ -35,10 +36,33 @@
},
"feedback": "Feedback",
"follow": "Bizi {{name}} üzerinde takip edin",
+ "footer": {
+ "action": {
+ "feedback": "Geri Bildirimde Bulun",
+ "star": "GitHub'da Yıldız Ekleyin"
+ },
+ "and": "ve",
+ "feedback": {
+ "action": "Geri Bildirim Paylaş",
+ "desc": "Her fikir ve öneriniz bizim için değerlidir, görüşlerinizi duymak için sabırsızlanıyoruz! LobeChat'in ürün özellikleri ve kullanıcı deneyimi hakkında geri bildirim sağlayarak bize yardımcı olun ve platformumuzu daha da geliştirmemize katkıda bulunun.",
+ "title": "GitHub'da Değerli Geri Bildiriminizi Paylaşın"
+ },
+ "later": "Daha Sonra",
+ "star": {
+ "action": "Yıldız Ekleyin",
+ "desc": "Ürünümüzü beğendiyseniz ve bizi desteklemek istiyorsanız, GitHub'da bize bir yıldız verebilir misiniz? Bu küçük jest bizim için büyük anlam taşır ve sizin için özellikler sunmamızı teşvik eder.",
+ "title": "GitHub'da Bize Yıldız Ekleyin"
+ },
+ "title": "Ürünümüzü Beğendiniz mi?"
+ },
"fullscreen": "Tam Ekran Modu",
"historyRange": "Geçmiş Aralığı",
"import": "İçe Aktar",
"importModal": {
+ "error": {
+ "desc": "Üzgünüz, veri aktarımı sırasında bir hata oluştu. Lütfen tekrar deneyin veya <1>bir sorun bildirin1>, sorunu çözmek için elimizden geleni yapacağız.",
+ "title": "Veri Aktarımı Başarısız"
+ },
"finish": {
"onlySettings": "Sistem ayarları başarıyla içe aktarıldı",
"start": "Başla",
@@ -46,6 +70,7 @@
"title": "Veri başarıyla aktarıldı"
},
"loading": "Veri aktarılıyor, lütfen bekleyin...",
+ "preparing": "Veri aktarımı modülü hazırlanıyor...",
"result": {
"added": "Başarıyla içe aktarıldı",
"errors": "İçe Aktarma Hataları",
@@ -56,8 +81,15 @@
"topics": "Konular",
"type": "Tip"
},
- "title": "Veri İçe Aktar"
+ "title": "Veri İçe Aktar",
+ "uploading": {
+ "desc": "Dosya şu anda büyük olduğundan, yüklenmeye çalışılıyor...",
+ "restTime": "Kalan Zaman",
+ "speed": "Yükleme Hızı"
+ }
},
+ "information": "Topluluk ve Bilgi",
+ "installPWA": "Tarayıcı Uygulamasını Yükle",
"lang": {
"ar": "Arapça",
"bg-BG": "Bulgarca",
@@ -96,7 +128,11 @@
"zh-TW": "Geleneksel Çince"
},
"layoutInitializing": "Başlatılıyor...",
- "noDescription": "Açıklama yok",
+ "legal": "Hukuki Bildirim",
+ "mail": {
+ "business": "İşbirliği",
+ "support": "E-posta Desteği"
+ },
"oauth": "SSO Girişi",
"officialSite": "Resmi Site",
"ok": "Tamam",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Anonim Kullanıcı",
"billing": "Fatura Yönetimi",
+ "data": "Veri Depolama",
"defaultNickname": "Topluluk Kullanıcısı",
"discord": "Topluluk Destek",
"docs": "Belgeler",
@@ -181,5 +218,6 @@
"profile": "Hesap Yönetimi",
"setting": "Uygulama Ayarları",
"usages": "Kullanım İstatistikleri"
- }
+ },
+ "version": "Sürüm"
}
diff --git a/locales/tr-TR/components.json b/locales/tr-TR/components.json
index 755db5663169..56cf2244fe3c 100644
--- a/locales/tr-TR/components.json
+++ b/locales/tr-TR/components.json
@@ -6,7 +6,8 @@
"functionCall": "Bu model fonksiyon çağrısını destekler",
"tokens": "Bu model tek bir oturumda en fazla {{tokens}} Token destekler",
"vision": "Bu model görüntü tanımıyı destekler"
- }
+ },
+ "removed": "Bu model listeden çıkarıldı, seçiminizi kaldırırsanız otomatik olarak kaldırılacaktır"
},
"ModelSwitchPanel": {
"emptyModel": "Etkinleştirilmiş model bulunmamaktadır, lütfen ayarlara giderek açın",
diff --git a/locales/tr-TR/error.json b/locales/tr-TR/error.json
index 45f4ed12b1aa..345235099c4f 100644
--- a/locales/tr-TR/error.json
+++ b/locales/tr-TR/error.json
@@ -12,6 +12,8 @@
"retry": "Yeniden Yükle",
"title": "Sayfa bir sorunla karşılaştı.."
},
+ "fetchError": "İstek başarısız oldu",
+ "fetchErrorDetail": "Hata detayı",
"notFound": {
"backHome": "Ana Sayfaya Dön",
"desc": "Aradığınız sayfayı bulamadık, lütfen bağlantının doğru olduğundan emin olun",
@@ -52,37 +54,16 @@
"503": "Üzgünüm, sunucu şu anda isteğinizi işleyemiyor, muhtemelen aşırı yüklenme veya bakım nedeniyle. Lütfen daha sonra tekrar deneyin.",
"504": "Üzgünüm, sunucu yukarı akış sunucusundan bir yanıt alamadı. Lütfen daha sonra tekrar deneyin.",
"AgentRuntimeError": "Lobe dil modeli çalışma zamanı hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "AnthropicBizError": "Anthropic AI hizmetine yönelik istek hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "AzureBizError": "Azure AI servisi isteği hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "BedrockBizError": "Bedrock servisi isteği hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "GoogleBizError": "Google servisi isteği hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "GroqBizError": "Groq hizmeti isteği sırasında bir hata oluştu. Lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
"InvalidAccessCode": "Geçersiz Erişim Kodu: Geçersiz veya boş bir şifre girdiniz. Lütfen doğru erişim şifresini girin veya özel API Anahtarı ekleyin.",
- "InvalidAnthropicAPIKey": "Anthropic API Key geçersiz veya boş, lütfen Anthropic API Key'inizi kontrol edip tekrar deneyin",
- "InvalidAzureAPIKey": "Azure API Anahtarı yanlış veya boş, lütfen Azure API Anahtarınızı kontrol edip tekrar deneyin",
"InvalidBedrockCredentials": "Bedrock kimlik doğrulaması geçersiz, lütfen AccessKeyId/SecretAccessKey bilgilerinizi kontrol edip tekrar deneyin",
"InvalidClerkUser": "Üzgünüz, şu anda giriş yapmadınız. Lütfen işlemlere devam etmeden önce giriş yapın veya hesap oluşturun",
- "InvalidGoogleAPIKey": "Google API Anahtarı yanlış veya boş, lütfen Google API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidGroqAPIKey": "Groq API Anahtarı yanlış veya boş, lütfen Groq API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidMinimaxAPIKey": "Minimax API Anahtarı geçersiz veya boş, lütfen Minimax API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidMistralAPIKey": "Mistral AI API Anahtarı geçersiz veya boş. Lütfen Mistral API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidMoonshotAPIKey": "Geçersiz veya boş Moonshot AI API Anahtarı, lütfen Moonshot API Anahtarınızı kontrol edip tekrar deneyin",
"InvalidOllamaArgs": "Ollama yapılandırması yanlış, lütfen Ollama yapılandırmasını kontrol edip tekrar deneyin",
- "InvalidOpenRouterAPIKey": "OpenRouter API Anahtarı geçersiz veya boş, lütfen OpenRouter API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidPerplexityAPIKey": "Perplexity API Key geçersiz veya boş, lütfen Perplexity API Key'inizi kontrol edip tekrar deneyin",
- "InvalidTogetherAIAPIKey": "TogetherAI API Anahtarı geçersiz veya boş, lütfen TogetherAI API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidZeroOneAPIKey": "SıfırBirIoT API Anahtarı geçersiz veya boş. Lütfen SıfırBirIoT API Anahtarınızı kontrol edip tekrar deneyin",
- "InvalidZhipuAPIKey": "Zhipu API Anahtarı yanlış veya boş, lütfen Zhipu API Anahtarınızı kontrol edip tekrar deneyin",
+ "InvalidProviderAPIKey": "{{provider}} API Anahtarı geçersiz veya boş, lütfen {{provider}} API Anahtarını kontrol edip tekrar deneyin",
"LocationNotSupportError": "Üzgünüz, bulunduğunuz konum bu model hizmetini desteklemiyor, muhtemelen bölge kısıtlamaları veya hizmetin henüz açılmamış olması nedeniyle. Lütfen mevcut konumun bu hizmeti kullanmaya uygun olup olmadığını doğrulayın veya başka bir konum bilgisi kullanmayı deneyin.",
- "MinimaxBizError": "Minimax hizmetine yapılan istekte hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
- "MistralBizError": "Mistral AI hizmeti isteği sırasında bir hata oluştu. Lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
- "MoonshotBizError": "Moonshot hizmetinde bir hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
"NoOpenAIAPIKey": "OpenAI API Anahtarı boş, lütfen özel bir OpenAI API Anahtarı ekleyin",
"OllamaBizError": "Ollama servisine yapılan istekte hata oluştu, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
"OllamaServiceUnavailable": "Ollama servisi kullanılamıyor, lütfen Ollama'nın düzgün çalışıp çalışmadığını kontrol edin veya Ollama'nın çapraz kaynak yapılandırmasının doğru olup olmadığını kontrol edin",
- "OpenAIBizError": "OpenAI hizmeti talep ederken hata oluştu. Aşağıdaki bilgilere dayanarak sorun giderin veya tekrar deneyin.",
- "OpenRouterBizError": "OpenRouter AI hizmetine yönelik istek hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "PerplexityBizError": "Perplexity AI hizmetine yapılan istekte hata oluştu, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
+ "OpenAIBizError": "OpenAI hizmetinde bir hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin",
"PluginApiNotFound": "Üzgünüm, eklentinin bildiriminde API mevcut değil. Lütfen istek yönteminizin eklenti bildirim API'sı ile eşleşip eşleşmediğini kontrol edin",
"PluginApiParamsError": "Üzgünüm, eklenti isteği için giriş parametre doğrulaması başarısız oldu. Lütfen giriş parametrelerinin API açıklamasıyla eşleşip eşleşmediğini kontrol edin",
"PluginGatewayError": "Üzgünüz, eklenti ağ geçidinde bir hata oluştu, lütfen eklenti ağ geçidi yapılandırmasını kontrol edin",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Üzgünüz, OpenAPI istemci başlatma hatası, lütfen OpenAPI yapılandırma bilgilerini kontrol edin",
"PluginServerError": "Eklenti sunucusu isteği bir hata ile döndü. Lütfen aşağıdaki hata bilgilerine dayanarak eklenti bildirim dosyanızı, eklenti yapılandırmanızı veya sunucu uygulamanızı kontrol edin",
"PluginSettingsInvalid": "Bu eklenti, kullanılmadan önce doğru şekilde yapılandırılmalıdır. Lütfen yapılandırmanızın doğru olup olmadığını kontrol edin",
- "TogetherAIBizError": "TogetherAI AI hizmetine yönelik istek hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "ZeroOneBizError": "SıfırBirIoT hizmetine yapılan istekte bir hata oluştu. Lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin",
- "ZhipuBizError": "Zhipu servisi isteği hatası, lütfen aşağıdaki bilgilere göre sorunu gidermeye çalışın veya tekrar deneyin"
+ "ProviderBizError": "Talep {{provider}} hizmetinde bir hata oluştu, lütfen aşağıdaki bilgilere göre sorunu giderin veya tekrar deneyin"
},
"stt": {
"responseError": "Hizmet isteği başarısız oldu, lütfen yapılandırmayı kontrol edin veya tekrar deneyin"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "OpenAI vekil adresi ekle (isteğe bağlı)",
+ "apiKey": {
+ "description": "{{name}} API Anahtarınızı girerek oturumu başlatabilirsiniz",
+ "title": "Özel {{name}} API Anahtarını kullan"
+ },
"closeMessage": "Mesajı kapat",
"confirm": "Onayla ve Yeniden Dene",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Hesaba giriş yap",
"welcome": "Hoş geldiniz!"
},
- "ollama": {
- "cancel": "İptal",
- "confirm": "Onayla",
- "description": "Ollama model etiketinizi girin ve sohbeti devam ettirmek için tamamlayın",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "İndirme başlıyor...",
- "title": "Belirtilen Ollama modelini indir"
- },
"password": {
"description": "Uygulama şifrelemesi yönetici tarafından etkinleştirilmiştir. Uygulamayı açmak için uygulama şifresini girin. Şifre sadece bir kez doldurulmalıdır.",
"placeholder": "Lütfen şifre girin",
@@ -132,5 +107,9 @@
"apiKey": "Özel API Anahtarı",
"password": "Şifre"
}
+ },
+ "upload": {
+ "desc": "Detay: {{detail}}",
+ "title": "Dosya yükleme başarısız, lütfen ağ bağlantınızı kontrol edin veya daha sonra tekrar deneyin"
}
}
diff --git a/locales/tr-TR/metadata.json b/locales/tr-TR/metadata.json
new file mode 100644
index 000000000000..c45b5a078b32
--- /dev/null
+++ b/locales/tr-TR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat size en iyi ChatGPT, OLLaMA, Gemini, Claude WebUI kullanım deneyimini sunar",
+ "title": "LobeChat: Kişisel LLM Verimlilik Aracı, Daha Akıllı Bir Beyin İçin Kendinize Bir Hediye"
+ },
+ "market": {
+ "description": "İçerik oluşturma, metin yazma, soru cevap, görüntü oluşturma, video oluşturma, ses oluşturma, akıllı ajan, otomasyon iş akışı, kendi AI / GPTs / OLLaMA akıllı asistanınızı özelleştirin",
+ "title": "Asistan Pazarı"
+ },
+ "plugins": {
+ "description": "Arama, grafik oluşturma, akademik, görüntü oluşturma, video oluşturma, ses oluşturma, otomasyon iş akışı, ChatGPT / OLLaMA için özel ToolCall eklenti yeteneklerini özelleştirin",
+ "title": "Eklenti Pazarı"
+ },
+ "welcome": {
+ "description": "LobeChat size en iyi ChatGPT, OLLaMA, Gemini, Claude WebUI kullanım deneyimini sunar",
+ "title": "LobeChat'i Kullanmaya Hoş Geldiniz: Kişisel LLM Verimlilik Aracı, Daha Akıllı Bir Beyin İçin Kendinize Bir Hediye"
+ }
+}
diff --git a/locales/tr-TR/modelProvider.json b/locales/tr-TR/modelProvider.json
index b6020115ca54..549957a54c01 100644
--- a/locales/tr-TR/modelProvider.json
+++ b/locales/tr-TR/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Varsayılan adres dışında, http(s):// içermelidir",
- "placeholder": "https://api.anthropic.com",
- "title": "API Proxy Adresi"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Anthropic'ten gelen API Key'i girin",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Anthropic API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Anthropic API Anahtarı Kullan"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure'un API versiyonu, YYYY-AA-GG formatına uygun, [en son versiyonu](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions) kontrol edin",
@@ -34,10 +17,6 @@
"desc": "Azure portalından kaynağı kontrol ederken, bu değeri \"Anahtarlar ve uç noktalar\" bölümünde bulabilirsiniz. KEY1 veya KEY2 kullanabilirsiniz",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Azure OpenAI API Anahtarınızı girerek oturumu başlatabilirsiniz",
- "title": "Özel Azure OpenAI API Anahtarı Kullan"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Özel Bedrock Kimlik Bilgilerini Kullan"
}
},
- "google": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "Google'dan gelen API Key'i girin",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Google API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Google API Anahtarı Kullan"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Groq'tan gelen API Key'i girin",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Groq API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Groq API Anahtarı Kullan"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Minimax'den API Anahtarınızı girin",
- "placeholder": "Minimax API Anahtarı",
- "title": "API Anahtarı"
- },
- "unlock": {
- "description": "Minimax API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez",
- "title": "Özel Minimax API Anahtarını Kullan"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Mistral AI'dan gelen API Key'i girin",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Mistral AI API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Mistral AI API Anahtarı Kullan"
- }
- },
- "moonshot": {
- "title": "Ay'ın Karanlık Yüzü",
- "token": {
- "desc": "Moonshot AI'dan gelen API Key'i girin",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Moonshot AI API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Moonshot AI API Anahtarı Kullan"
- }
- },
"ollama": {
"checker": {
- "desc": "Proxy adresinin doğru girilip girilmediğini test edin"
+ "desc": "Proxy adresinin doğru girilip girilmediğini test edin",
+ "title": "Bağlantı Kontrolü"
},
"customModelName": {
"desc": "Özel modeller ekleyin, birden fazla model için virgül (,) kullanın",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Özel Model Adları"
},
+ "download": {
+ "desc": "Ollama 正在下载该模型,请尽量不要关闭本页面。重新下载时将会中断处继续",
+ "remainingTime": "剩余时间",
+ "speed": "下载速度",
+ "title": "正在下载模型 {{model}} "
+ },
"endpoint": {
"desc": "Ollama arayüz proxy adresini girin, yerel olarak belirtilmemişse boş bırakılabilir",
- "placeholder": "http://127.0.0.1:11434",
"title": "Arayüz Proxy Adresi"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Önizleme)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Varsayılan adres dışında, http(s):// içermelidir",
- "placeholder": "https://api.openai.com/v1",
- "title": "Arayüz Proxy Adresi"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Kendi OpenAI Key'inizi kullanın",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "OpenAI API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel OpenAI API Anahtarı Kullan"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Proxy adresinin doğru girilip girilmediğini test edin"
- },
- "customModelName": {
- "desc": "Özel modeller ekleyin, birden fazla model için virgül (,) kullanın",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Özel Model Adları"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "OpenRouter AI'dan gelen API Key'i girin",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "OpenRouter API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel OpenRouter API Anahtarı Kullan"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Perplexity AI'dan gelen API Key'i girin",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Perplexity API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Perplexity API Anahtarı Kullan"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Proxy adresinin doğru girilip girilmediğini test edin"
- },
- "customModelName": {
- "desc": "Özel modeller ekleyin, birden fazla model için virgül (,) kullanın",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Özel Model Adları"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "TogetherAI AI'dan gelen API Key'i girin",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "TogetherAI API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel TogetherAI API Anahtarı Kullan"
+ "cancel": "取消下载",
+ "confirm": "下载",
+ "description": "输入你的 Ollama 模型标签,完成即可继续会话",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "开始下载...",
+ "title": "下载指定的 Ollama 模型"
}
},
"zeroone": {
- "title": "01.AI Sıfır Bir",
- "token": {
- "desc": "01.AI Sıfır Bir'den gelen API Key'i girin",
- "placeholder": "01.AI Sıfır Bir API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "ZeroOne API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel ZeroOne API Anahtarı Kullan"
- }
+ "title": "01.AI Sıfır Bir"
},
"zhipu": {
- "title": "Zeka Haritası",
- "token": {
- "desc": "Zeka Haritası'ndan gelen API Key'i girin",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Zhipu API Anahtarınızı girerek oturumu başlatabilirsiniz. Uygulama API Anahtarınızı kaydetmez.",
- "title": "Özel Zhipu API Anahtarı Kullan"
- }
+ "title": "Zeka Haritası"
}
}
diff --git a/locales/tr-TR/plugin.json b/locales/tr-TR/plugin.json
index 3cbbbfbdf845..6c50d4cf3d36 100644
--- a/locales/tr-TR/plugin.json
+++ b/locales/tr-TR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Fonksiyon Çağrısı",
"off": "Hata Ayıklamayı Kapat",
"on": "Eklenti Çağrı Bilgilerini Görüntüle",
- "response": "Yanıt"
+ "payload": "eklenti yükü",
+ "response": "Yanıt",
+ "tool_call": "aracı çağrı"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Eklenti çalışıyor..."
},
"pluginList": "Eklenti Listesi",
- "plugins": {
- "loading": "Eklentiler kontrol ediliyor...",
- "unknown": "Bilinmeyen eklenti"
- },
"setting": "Eklenti Ayarları",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Yüklü"
},
"title": "Eklenti Mağazası"
- }
+ },
+ "unknownPlugin": "Bilinmeyen eklenti"
}
diff --git a/locales/tr-TR/setting.json b/locales/tr-TR/setting.json
index 9d170c515495..6e48963faf08 100644
--- a/locales/tr-TR/setting.json
+++ b/locales/tr-TR/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Hakkında"
},
+ "agentTab": {
+ "chat": "Sohbet Tercihi",
+ "meta": "Asistan Bilgisi",
+ "modal": "Model Ayarları",
+ "plugin": "Eklenti Ayarları",
+ "prompt": "Karakter Ayarları",
+ "tts": "Metin Okuma Hizmeti"
+ },
"analytics": {
"telemetry": {
"desc": "Anonim kullanım verilerini göndererek LobeChat'in genel kullanıcı deneyimini iyileştirmemize yardımcı olabilirsiniz",
@@ -35,10 +43,14 @@
"title": "Ayarlar"
},
"llm": {
+ "apiKey": {
+ "desc": "Lütfen {{name}} API Anahtarınızı girin",
+ "placeholder": "{{name}} API Anahtarı",
+ "title": "API Anahtarı"
+ },
"checker": {
"button": "Kontrol Et",
"desc": "Api Anahtarı ve vekil adresinin doğru şekilde doldurulup doldurulmadığını test eder",
- "ollamaDesc": "Proxy adresinin doğru şekilde doldurulup doldurulmadığını test edin",
"pass": "Kontrol Başarılı",
"title": "Bağlantı Kontrolü"
},
@@ -90,22 +102,19 @@
"latestTime": "Son güncelleme zamanı: {{time}}",
"noLatestTime": "Liste henüz alınamadı"
},
+ "helpDoc": "Yardım Belgeleri",
"modelList": {
"desc": "Görüntülenecek modeli seçin, seçilen model model listesinde görüntülenecektir",
"placeholder": "Lütfen listeden bir model seçin",
"title": "Model Listesi",
"total": "Toplam {{count}} model kullanılabilir"
},
+ "proxyUrl": {
+ "desc": "Varsayılan adres dışında, http(s):// içermelidir",
+ "title": "API Proxy Adresi"
+ },
"waitingForMore": "Daha fazla model eklenmesi planlanıyor ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama bu modeli indiriyor, lütfen bu sayfayı kapatmamaya çalışın. Yeniden indirme durumunda kaldığı yerden devam edecektir.",
- "remainingTime": "Kalan Zaman",
- "speed": "İndirme Hızı",
- "title": "{{model}} Modeli İndiriliyor"
- }
- },
"plugin": {
"addTooltip": "Eklenti Ekle",
"clearDeprecated": "Kullanım Dışı Eklentileri Kaldır",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Sınırsız",
"limited": "Yalnızca {{number}} konuşma mesajını içerir",
+ "setlimited": "Kullanılan mesaj sayısı",
"title": "Geçmiş Mesaj Sayısı Sınırlama",
"unlimited": "Sınırsız geçmiş mesaj sayısı"
},
@@ -325,44 +335,63 @@
"sync": {
"device": {
"deviceName": {
- "hint": "添加名称以便于识别",
- "placeholder": "请输入设备名称",
- "title": "设备名称"
+ "hint": "Kolay tanımlama için isim ekleyin",
+ "placeholder": "Lütfen cihaz adını girin",
+ "title": "Cihaz Adı"
},
- "title": "设备信息",
- "unknownBrowser": "未知浏览器",
- "unknownOS": "未知系统"
+ "title": "Cihaz Bilgisi",
+ "unknownBrowser": "Bilinmeyen Tarayıcı",
+ "unknownOS": "Bilinmeyen Sistem"
},
"warning": {
- "message": "本功能目前仍为实验性功能,可能存在预期外或不稳定的情况,如遇到问题请及时提交反馈。"
+ "message": "Bu özellik şu anda deneysel bir özellik olup, beklenmedik veya kararsız durumlar yaşanabilir. Sorunla karşılaşırsanız lütfen geri bildirimde bulunun."
},
"webrtc": {
"channelName": {
- "desc": "WebRTC 将使用此名创建同步频道,确保频道名称唯一",
- "placeholder": "请输入同步频道名称",
- "shuffle": "随机生成",
- "title": "同步频道名称"
+ "desc": "WebRTC bu adı kullanarak senkronizasyon kanalı oluşturacak, kanal adının benzersiz olduğundan emin olun",
+ "placeholder": "Lütfen senkronizasyon kanalı adını girin",
+ "shuffle": "Rastgele Oluştur",
+ "title": "Senkronizasyon Kanalı Adı"
},
"channelPassword": {
- "desc": "添加密码确保频道私密性,只有密码正确时,设备才可加入频道",
- "placeholder": "请输入同步频道密码",
- "title": "同步频道密码"
+ "desc": "Kanalın gizliliğini sağlamak için şifre ekleyin, sadece doğru şifre girildiğinde cihaz kanala katılabilir",
+ "placeholder": "Lütfen senkronizasyon kanalı şifresini girin",
+ "title": "Senkronizasyon Kanalı Şifresi"
},
- "desc": "实时、点对点的数据通信,需设备同时在线才可同步",
+ "desc": "Gerçek zamanlı, noktadan noktaya veri iletişimi, senkronizasyon için cihazların aynı anda çevrimiçi olması gerekir",
"enabled": {
- "invalid": "请填写同步频道名称后再开启",
- "title": "开启同步"
+ "invalid": "Lütfen senkronizasyon kanalı adını girdikten sonra etkinleştirin",
+ "title": "Senkronizasyonu Etkinleştir"
},
- "title": "WebRTC 同步"
+ "title": "WebRTC Senkronizasyonu"
+ }
+ },
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Asistan Meta Veri Oluşturma Modeli",
+ "modelDesc": "Asistan adı, açıklaması, avatar ve etiket oluşturmak için belirlenen model",
+ "title": "Asistan Bilgilerini Otomatik Oluştur"
+ },
+ "title": "Sistem Asistanı",
+ "topic": {
+ "label": "Konu Adlandırma Modeli",
+ "modelDesc": "Konuların otomatik olarak yeniden adlandırılması için belirlenen model",
+ "title": "Konu Otomatik Adlandırma"
+ },
+ "translation": {
+ "label": "Çeviri Modeli",
+ "modelDesc": "Çeviri için belirlenen model",
+ "title": "Çeviri Asistanı Ayarları"
}
},
"tab": {
"about": "Hakkında",
"agent": "Varsayılan Asistan",
"common": "Genel Ayarlar",
- "experiment": "实验",
+ "experiment": "Deney",
"llm": "Modeller",
- "sync": "云端同步",
+ "sync": "Bulut Senkronizasyonu",
+ "system-agent": "Sistem Asistanı",
"tts": "Metin Seslendirme"
},
"tools": {
diff --git a/locales/tr-TR/tool.json b/locales/tr-TR/tool.json
index a22966f74fd7..4a5b0965510e 100644
--- a/locales/tr-TR/tool.json
+++ b/locales/tr-TR/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 tarafından oluşturulan resim bağlantıları sadece 1 saat geçerlidir, resim yerel olarak önbelleğe alınıyor...",
"generate": "Oluştur",
"generating": "Oluşturuluyor...",
- "images": "Görseller:"
+ "images": "Görseller:",
+ "prompt": "İpucu"
}
}
diff --git a/locales/vi-VN/auth.json b/locales/vi-VN/auth.json
index ccb276eb490e..08482226bad2 100644
--- a/locales/vi-VN/auth.json
+++ b/locales/vi-VN/auth.json
@@ -1,6 +1,8 @@
{
"login": "Đăng nhập",
"loginOrSignup": "Đăng nhập / Đăng ký",
+ "profile": "Hồ sơ cá nhân",
+ "security": "Bảo mật",
"signout": "Đăng xuất",
"signup": "Đăng ký"
}
diff --git a/locales/vi-VN/chat.json b/locales/vi-VN/chat.json
index 34e7a94076fe..43608aad0c28 100644
--- a/locales/vi-VN/chat.json
+++ b/locales/vi-VN/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "Xin chào, tôi là **{{name}}**, bạn có thể bắt đầu trò chuyện với tôi ngay lập tức, hoặc đến [Cài đặt trợ lý](/chat/settings#session={{id}}) để hoàn thiện thông tin của tôi.",
"agentDefaultMessageWithSystemRole": "Xin chào, tôi là **{{name}}**, {{systemRole}}. Hãy bắt đầu trò chuyện ngay!",
+ "agentsAndConversations": "Người hỗ trợ và cuộc trò chuyện",
"backToBottom": "Quay về dưới cùng",
"clearCurrentMessages": "Xóa tin nhắn hiện tại",
"confirmClearCurrentMessages": "Bạn sắp xóa tin nhắn hiện tại. Hành động này không thể hoàn tác, vui lòng xác nhận.",
@@ -39,7 +40,6 @@
"regenerate": "Tạo lại"
},
"newAgent": "Tạo trợ lý mới",
- "noDescription": "Chưa có mô tả",
"pin": "Ghim",
"pinOff": "Bỏ ghim",
"regenerate": "Tạo lại",
@@ -83,6 +83,7 @@
"chats": "Tin nhắn trò chuyện",
"rest": "Còn lại",
"systemRole": "Vai trò hệ thống",
+ "title": "Chi tiết Ngữ cảnh",
"tools": "Công cụ",
"total": "Tổng cộng",
"used": "Đã sử dụng"
diff --git a/locales/vi-VN/common.json b/locales/vi-VN/common.json
index 6033397b35f8..696bb78d0315 100644
--- a/locales/vi-VN/common.json
+++ b/locales/vi-VN/common.json
@@ -1,7 +1,7 @@
{
"about": "Giới thiệu",
"advanceSettings": "Cài đặt nâng cao",
- "appInitializing": "LobeChat đang khởi động, vui lòng chờ...",
+ "appInitializing": "Ứng dụng đang khởi động, vui lòng chờ...",
"autoGenerate": "Tự động tạo",
"autoGenerateTooltip": "Tự động hoàn thành mô tả trợ lý dựa trên từ gợi ý",
"autoGenerateTooltipDisabled": "Vui lòng nhập từ gợi ý trước khi sử dụng tính năng tự động hoàn thành",
@@ -9,6 +9,7 @@
"cancel": "Hủy",
"changelog": "Nhật ký cập nhật",
"close": "Đóng",
+ "contact": "Liên hệ chúng tôi",
"copy": "Sao chép",
"copyFail": "Sao chép thất bại",
"copySuccess": "Sao chép thành công",
@@ -35,10 +36,33 @@
},
"feedback": "Phản hồi và đề xuất",
"follow": "Theo dõi chúng tôi trên {{name}}",
+ "footer": {
+ "action": {
+ "feedback": "Chia sẻ ý kiến quý báu của bạn",
+ "star": "Đánh giá sao trên GitHub"
+ },
+ "and": "và",
+ "feedback": {
+ "action": "Chia sẻ phản hồi",
+ "desc": "Mỗi ý tưởng và đề xuất của bạn đều rất quý giá đối với chúng tôi, chúng tôi rất mong muốn biết ý kiến của bạn! Hãy liên hệ với chúng tôi để cung cấp phản hồi về tính năng và trải nghiệm sử dụng sản phẩm, giúp chúng tôi phát triển LobeChat tốt hơn.",
+ "title": "Chia sẻ phản hồi quý báu của bạn trên GitHub"
+ },
+ "later": "Sau",
+ "star": {
+ "action": "Đánh giá sao",
+ "desc": "Nếu bạn yêu thích sản phẩm của chúng tôi và muốn ủng hộ chúng tôi, hãy đánh giá sao cho chúng tôi trên GitHub nhé? Hành động nhỏ này có ý nghĩa lớn đối với chúng tôi, giúp chúng tôi tiếp tục cung cấp trải nghiệm sản phẩm tốt cho bạn.",
+ "title": "Đánh giá sao cho chúng tôi trên GitHub"
+ },
+ "title": "Yêu thích sản phẩm của chúng tôi?"
+ },
"fullscreen": "Chế độ toàn màn hình",
"historyRange": "Phạm vi lịch sử",
"import": "Nhập cấu hình",
"importModal": {
+ "error": {
+ "desc": "Xin lỗi vì quá trình nhập dữ liệu gặp sự cố. Vui lòng thử nhập lại hoặc <1>gửi vấn đề1>, chúng tôi sẽ kiểm tra vấn đề ngay lập tức.",
+ "title": "Nhập dữ liệu thất bại"
+ },
"finish": {
"onlySettings": "Nhập cài đặt hệ thống thành công",
"start": "Bắt đầu sử dụng",
@@ -46,6 +70,7 @@
"title": "Hoàn tất nhập dữ liệu"
},
"loading": "Đang nhập dữ liệu, vui lòng chờ...",
+ "preparing": "Đang chuẩn bị mô-đun nhập dữ liệu...",
"result": {
"added": "Nhập thành công",
"errors": "Lỗi nhập",
@@ -56,8 +81,15 @@
"topics": "Chủ đề",
"type": "Loại dữ liệu"
},
- "title": "Nhập dữ liệu"
+ "title": "Nhập dữ liệu",
+ "uploading": {
+ "desc": "Tập tin hiện tại quá lớn, đang cố gắng tải lên...",
+ "restTime": "Thời gian còn lại",
+ "speed": "Tốc độ tải lên"
+ }
},
+ "information": "Cộng đồng và Thông tin",
+ "installPWA": "Cài đặt ứng dụng trình duyệt",
"lang": {
"ar": "Tiếng Ả Rập",
"bg-BG": "Tiếng Bun-ga-ri",
@@ -96,7 +128,11 @@
"zh-TW": "Tiếng Trung (phồn thể)"
},
"layoutInitializing": "Đang tải bố cục...",
- "noDescription": "Chưa có mô tả",
+ "legal": "Tuyên bố về pháp lý",
+ "mail": {
+ "business": "Hợp tác kinh doanh",
+ "support": "Hỗ trợ qua email"
+ },
"oauth": "Đăng nhập SSO",
"officialSite": "Trang web chính thức",
"ok": "Đồng ý",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "Người dùng ẩn danh",
"billing": "Quản lý hóa đơn",
+ "data": "Lưu trữ dữ liệu",
"defaultNickname": "Người dùng phiên bản cộng đồng",
"discord": "Hỗ trợ cộng đồng",
"docs": "Tài liệu sử dụng",
@@ -181,5 +218,6 @@
"profile": "Quản lý tài khoản",
"setting": "Cài đặt ứng dụng",
"usages": "Thống kê sử dụng"
- }
+ },
+ "version": "Phiên bản"
}
diff --git a/locales/vi-VN/components.json b/locales/vi-VN/components.json
index 1f0fb5919979..648d69c69313 100644
--- a/locales/vi-VN/components.json
+++ b/locales/vi-VN/components.json
@@ -6,7 +6,8 @@
"functionCall": "Mô hình này hỗ trợ cuộc gọi hàm (Function Call)",
"tokens": "Mỗi phiên của mô hình này hỗ trợ tối đa {{tokens}} Tokens",
"vision": "Mô hình này hỗ trợ nhận diện hình ảnh"
- }
+ },
+ "removed": "Mô hình này không còn trong danh sách, nếu bỏ chọn sẽ tự động xóa"
},
"ModelSwitchPanel": {
"emptyModel": "Không có mô hình nào được kích hoạt, vui lòng điều chỉnh trong cài đặt",
diff --git a/locales/vi-VN/error.json b/locales/vi-VN/error.json
index 042ddd7b5ff5..4d979182e2bf 100644
--- a/locales/vi-VN/error.json
+++ b/locales/vi-VN/error.json
@@ -12,6 +12,8 @@
"retry": "Thử lại",
"title": "Trang gặp một chút vấn đề.."
},
+ "fetchError": "Yêu cầu thất bại",
+ "fetchErrorDetail": "Chi tiết lỗi",
"notFound": {
"backHome": "Quay về Trang chủ",
"desc": "Chúng tôi không thể tìm thấy trang bạn đang tìm, vui lòng kiểm tra xem liên kết có đúng không",
@@ -52,37 +54,16 @@
"503": "Xin lỗi, máy chủ hiện không thể xử lý yêu cầu của bạn, có thể do quá tải hoặc đang bảo trì, vui lòng thử lại sau",
"504": "Xin lỗi, máy chủ không đợi được phản hồi từ máy chủ upstream, vui lòng thử lại sau",
"AgentRuntimeError": "Lobe mô hình ngôn ngữ thực thi gặp lỗi, vui lòng kiểm tra và thử lại dựa trên thông tin dưới đây",
- "AnthropicBizError": "Yêu cầu dịch vụ AI Anthropic gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "AzureBizError": "Yêu cầu dịch vụ Azure AI gặp lỗi, vui lòng kiểm tra và thử lại dựa trên thông tin dưới đây",
- "BedrockBizError": "Yêu cầu dịch vụ Bedrock gặp lỗi, vui lòng kiểm tra và thử lại dựa trên thông tin dưới đây",
- "GoogleBizError": "Yêu cầu dịch vụ Google gặp lỗi, vui lòng kiểm tra và thử lại dựa trên thông tin dưới đây",
- "GroqBizError": "Yêu cầu dịch vụ Groq gặp sự cố, vui lòng kiểm tra thông tin bên dưới hoặc thử lại",
"InvalidAccessCode": "Mật khẩu truy cập không hợp lệ hoặc trống, vui lòng nhập mật khẩu truy cập đúng hoặc thêm Khóa API tùy chỉnh",
- "InvalidAnthropicAPIKey": "Khóa API Anthropic không hợp lệ hoặc trống, vui lòng kiểm tra lại và thử lại",
- "InvalidAzureAPIKey": "Khóa API Azure không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Azure và thử lại",
"InvalidBedrockCredentials": "Xác thực Bedrock không thành công, vui lòng kiểm tra AccessKeyId/SecretAccessKey và thử lại",
"InvalidClerkUser": "Xin lỗi, bạn chưa đăng nhập. Vui lòng đăng nhập hoặc đăng ký tài khoản trước khi tiếp tục.",
- "InvalidGoogleAPIKey": "Khóa API Google không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Google và thử lại",
- "InvalidGroqAPIKey": "Khóa API Groq không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Groq và thử lại",
- "InvalidMinimaxAPIKey": "Khóa API Minimax không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Minimax và thử lại",
- "InvalidMistralAPIKey": "Mistral AI API Key không hợp lệ hoặc trống, vui lòng kiểm tra lại Mistral API Key và thử lại",
- "InvalidMoonshotAPIKey": "Khóa API Moonshot AI không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Moonshot và thử lại",
"InvalidOllamaArgs": "Cấu hình Ollama không hợp lệ, vui lòng kiểm tra lại cấu hình Ollama và thử lại",
- "InvalidOpenRouterAPIKey": "OpenRouter API Key không hợp lệ hoặc trống, vui lòng kiểm tra lại và thử lại",
- "InvalidPerplexityAPIKey": "Khóa API Perplexity không hợp lệ hoặc trống, vui lòng kiểm tra lại và thử lại sau",
- "InvalidTogetherAIAPIKey": "TogetherAI API Key không hợp lệ hoặc trống, vui lòng kiểm tra lại và thử lại",
- "InvalidZeroOneAPIKey": "Khóa API ZeroOne không hợp lệ hoặc trống, vui lòng kiểm tra lại khóa API ZeroOne và thử lại",
- "InvalidZhipuAPIKey": "Khóa API Zhipu không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Zhipu và thử lại",
+ "InvalidProviderAPIKey": "{{provider}} API Key không hợp lệ hoặc trống, vui lòng kiểm tra và thử lại",
"LocationNotSupportError": "Xin lỗi, vị trí của bạn không hỗ trợ dịch vụ mô hình này, có thể do hạn chế vùng miền hoặc dịch vụ chưa được mở. Vui lòng xác nhận xem vị trí hiện tại có hỗ trợ sử dụng dịch vụ này không, hoặc thử sử dụng thông tin vị trí khác.",
- "MinimaxBizError": "Yêu cầu dịch vụ Minimax gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "MistralBizError": "Yêu cầu dịch vụ Mistral AI gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "MoonshotBizError": "Yêu cầu dịch vụ Mặt Trăng Tối gặp sự cố, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
"NoOpenAIAPIKey": "Khóa API OpenAI trống, vui lòng thêm Khóa API OpenAI tùy chỉnh",
"OllamaBizError": "Yêu cầu dịch vụ Ollama gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
"OllamaServiceUnavailable": "Dịch vụ Ollama không khả dụng, vui lòng kiểm tra xem Ollama có hoạt động bình thường không, hoặc xem xét cấu hình chéo đúng của Ollama",
- "OpenAIBizError": "Yêu cầu dịch vụ OpenAI gặp lỗi, vui lòng xác minh hoặc thử lại dựa trên thông tin dưới đây",
- "OpenRouterBizError": "Yêu cầu dịch vụ OpenRouter AI gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "PerplexityBizError": "Yêu cầu dịch vụ AI Perplexity gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại sau",
+ "OpenAIBizError": "Yêu cầu dịch vụ OpenAI gặp sự cố, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
"PluginApiNotFound": "Xin lỗi, không có API nào trong tệp mô tả plugin, vui lòng kiểm tra phương thức yêu cầu của bạn có khớp với API mô tả plugin không",
"PluginApiParamsError": "Xin lỗi, kiểm tra tham số đầu vào yêu cầu của plugin không thông qua, vui lòng kiểm tra tham số đầu vào có khớp với thông tin mô tả API không",
"PluginGatewayError": "Xin lỗi, cổng plugin gặp lỗi, vui lòng kiểm tra cấu hình cổng plugin có đúng không",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "Xin lỗi, khởi tạo khách hàng OpenAPI thất bại, vui lòng kiểm tra thông tin cấu hình OpenAPI có đúng không",
"PluginServerError": "Lỗi trả về từ máy chủ plugin, vui lòng kiểm tra tệp mô tả plugin, cấu hình plugin hoặc triển khai máy chủ theo thông tin lỗi dưới đây",
"PluginSettingsInvalid": "Plugin cần phải được cấu hình đúng trước khi sử dụng, vui lòng kiểm tra cấu hình của bạn có đúng không",
- "TogetherAIBizError": "Yêu cầu dịch vụ TogetherAI AI gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "ZeroOneBizError": "Yêu cầu dịch vụ ZeroOneBiz gặp lỗi, vui lòng kiểm tra thông tin dưới đây hoặc thử lại",
- "ZhipuBizError": "Yêu cầu dịch vụ Zhipu gặp lỗi, vui lòng kiểm tra và thử lại dựa trên thông tin dưới đây"
+ "ProviderBizError": "Yêu cầu dịch vụ {{provider}} gặp sự cố, vui lòng kiểm tra thông tin dưới đây hoặc thử lại"
},
"stt": {
"responseError": "Yêu cầu dịch vụ thất bại, vui lòng kiểm tra cấu hình hoặc thử lại"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "Thêm URL proxy OpenAI (tùy chọn)",
+ "apiKey": {
+ "description": "Nhập {{name}} API Key của bạn để bắt đầu phiên làm việc",
+ "title": "Sử dụng {{name}} API Key tùy chỉnh"
+ },
"closeMessage": "Đóng thông báo",
"confirm": "Xác nhận và thử lại",
"oauth": {
@@ -115,14 +98,6 @@
"title": "Đăng nhập tài khoản",
"welcome": "Chào mừng bạn!"
},
- "ollama": {
- "cancel": "Hủy bỏ",
- "confirm": "Tải xuống",
- "description": "Nhập nhãn mô hình Ollama của bạn để tiếp tục cuộc trò chuyện",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "Bắt đầu tải xuống...",
- "title": "Tải xuống mô hình Ollama cụ thể"
- },
"password": {
"description": "Quản trị viên đã kích hoạt mã hóa ứng dụng. Nhập mật khẩu ứng dụng để mở khóa. Chỉ cần nhập mật khẩu một lần",
"placeholder": "Nhập mật khẩu",
@@ -132,5 +107,9 @@
"apiKey": "Khóa API tùy chỉnh",
"password": "Mật khẩu"
}
+ },
+ "upload": {
+ "desc": "Chi tiết: {{detail}}",
+ "title": "Tải lên tệp thất bại, vui lòng kiểm tra kết nối mạng hoặc thử lại sau"
}
}
diff --git a/locales/vi-VN/metadata.json b/locales/vi-VN/metadata.json
new file mode 100644
index 000000000000..743c34f7533b
--- /dev/null
+++ b/locales/vi-VN/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat mang đến trải nghiệm sử dụng tốt nhất với ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Công cụ hiệu suất cá nhân LLM, giúp tăng cường trí não của bạn"
+ },
+ "market": {
+ "description": "Tạo nội dung, viết copy, trả lời câu hỏi, tạo hình ảnh, tạo video, tạo giọng nói, trợ lý thông minh, quy trình làm việc tự động, tùy chỉnh trợ lý trí tuệ AI / GPTs / OLLaMA riêng của bạn",
+ "title": "Thị trường trợ lý"
+ },
+ "plugins": {
+ "description": "Tìm kiếm, tạo biểu đồ, học thuật, tạo hình ảnh, tạo video, tạo giọng nói, quy trình làm việc tự động, tùy chỉnh khả năng plugin ToolCall riêng của ChatGPT / OLLaMA",
+ "title": "Thị trường plugin"
+ },
+ "welcome": {
+ "description": "LobeChat mang đến trải nghiệm sử dụng tốt nhất với ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Chào mừng đến với LobeChat: Công cụ hiệu suất cá nhân LLM, giúp tăng cường trí não của bạn"
+ }
+}
diff --git a/locales/vi-VN/modelProvider.json b/locales/vi-VN/modelProvider.json
index f6097bf77a94..890169ab2623 100644
--- a/locales/vi-VN/modelProvider.json
+++ b/locales/vi-VN/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "Ngoài địa chỉ mặc định, phải bao gồm http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "Địa chỉ API proxy"
- },
- "title": "Anthropic",
- "token": {
- "desc": "Nhập API Key từ Anthropic",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Anthropic của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Anthropic tùy chỉnh"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Phiên bản API của Azure, tuân theo định dạng YYYY-MM-DD, tham khảo [phiên bản mới nhất](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "Kiểm tra tài nguyên từ cổng Azure, bạn có thể tìm thấy giá trị này trong phần 'Khóa và điểm cuối'. Có thể sử dụng KEY1 hoặc KEY2",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Azure OpenAI của bạn để bắt đầu phiên làm việc",
- "title": "Sử dụng Khóa API Azure OpenAI tùy chỉnh"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "Sử dụng Thông tin Xác thực Bedrock tùy chỉnh"
}
},
- "google": {
- "endpoint": {
- "desc": "Ngoài địa chỉ mặc định, phải bao gồm http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "Địa chỉ Proxy API"
- },
- "title": "Google",
- "token": {
- "desc": "Nhập API Key từ Google",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Google của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Google tùy chỉnh"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "Nhập API Key từ Groq",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Groq của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Groq tùy chỉnh"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "Nhập API Key từ Minimax",
- "placeholder": "Minimax API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Minimax API Key của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ API Key của bạn",
- "title": "Sử dụng Minimax API Key tùy chỉnh"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "Nhập API Key từ Mistral AI",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Mistral AI của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Mistral AI tùy chỉnh"
- }
- },
- "moonshot": {
- "title": "Mặt Trăng Tối",
- "token": {
- "desc": "Nhập API Key từ Moonshot AI",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Moonshot AI của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Moonshot AI tùy chỉnh"
- }
- },
"ollama": {
"checker": {
- "desc": "Kiểm tra địa chỉ proxy có được nhập chính xác không"
+ "desc": "Kiểm tra địa chỉ proxy có được nhập chính xác không",
+ "title": "Kiểm tra tính liên thông"
},
"customModelName": {
"desc": "Thêm mô hình tùy chỉnh, sử dụng dấu phẩy (,) để tách biệt nhiều mô hình",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "Tên mô hình tùy chỉnh"
},
+ "download": {
+ "desc": "Ollama đang tải xuống mô hình này, vui lòng không đóng trang này. Quá trình tải xuống sẽ tiếp tục từ nơi đã bị gián đoạn khi tải lại",
+ "remainingTime": "Thời gian còn lại",
+ "speed": "Tốc độ tải xuống",
+ "title": "Đang tải mô hình {{model}}"
+ },
"endpoint": {
"desc": "Nhập địa chỉ proxy API của Ollama, có thể để trống nếu không chỉ định cụ thể",
- "placeholder": "http://127.0.0.1:11434",
"title": "Địa chỉ proxy API"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (Bản xem trước)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "Ngoài địa chỉ mặc định, phải bao gồm http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "Địa chỉ proxy API"
- },
- "title": "OpenAI",
- "token": {
- "desc": "Sử dụng OpenAI Key của riêng bạn",
- "placeholder": "OpenAI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API OpenAI của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API OpenAI tùy chỉnh"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "Kiểm tra địa chỉ proxy có được nhập chính xác không"
- },
- "customModelName": {
- "desc": "Thêm mô hình tùy chỉnh, sử dụng dấu phẩy (,) để tách biệt nhiều mô hình",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "Tên mô hình tùy chỉnh"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "Nhập API Key từ OpenRouter AI",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API OpenRouter của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API OpenRouter tùy chỉnh"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "Nhập API Key từ Perplexity AI",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "Nhập Khóa API Perplexity của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Perplexity tùy chỉnh"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "Kiểm tra địa chỉ proxy có được nhập chính xác không"
- },
- "customModelName": {
- "desc": "Thêm mô hình tùy chỉnh, sử dụng dấu phẩy (,) để tách biệt nhiều mô hình",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "Tên mô hình tùy chỉnh"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "Nhập API Key từ TogetherAI AI",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API TogetherAI của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API TogetherAI tùy chỉnh"
+ "cancel": "Hủy tải xuống",
+ "confirm": "Tải xuống",
+ "description": "Nhập nhãn mô hình Ollama của bạn để tiếp tục phiên làm việc",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "Bắt đầu tải xuống...",
+ "title": "Tải xuống mô hình Ollama đã chỉ định"
}
},
"zeroone": {
- "title": "01.AI Zero One",
- "token": {
- "desc": "Nhập API Key từ 01.AI Zero One",
- "placeholder": "01.AI Zero One API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API ZeroOne của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API ZeroOne tùy chỉnh"
- }
+ "title": "01.AI Zero One"
},
"zhipu": {
- "title": "Zhipu",
- "token": {
- "desc": "Nhập API Key từ Zhipu",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "Nhập Khóa API Zhipu của bạn để bắt đầu phiên làm việc. Ứng dụng sẽ không lưu trữ Khóa API của bạn",
- "title": "Sử dụng Khóa API Zhipu tùy chỉnh"
- }
+ "title": "Zhipu"
}
}
diff --git a/locales/vi-VN/plugin.json b/locales/vi-VN/plugin.json
index 34f09a9d5b8e..dadf166cbe5c 100644
--- a/locales/vi-VN/plugin.json
+++ b/locales/vi-VN/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Gọi hàm",
"off": "Tắt gỡ lỗi",
"on": "Xem thông tin gọi plugin",
- "response": "Kết quả trả về"
+ "payload": "Dữ liệu cắm",
+ "response": "Kết quả trả về",
+ "tool_call": "Yêu cầu công cụ"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin đang chạy..."
},
"pluginList": "Danh sách plugin",
- "plugins": {
- "loading": "Đang kiểm tra công cụ...",
- "unknown": "Công cụ không xác định"
- },
"setting": "Cài đặt plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Đã cài đặt"
},
"title": "Cửa hàng plugin"
- }
+ },
+ "unknownPlugin": "Plugin không xác định"
}
diff --git a/locales/vi-VN/setting.json b/locales/vi-VN/setting.json
index de4e6ddbccf5..477a354f6974 100644
--- a/locales/vi-VN/setting.json
+++ b/locales/vi-VN/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "Về chúng tôi"
},
+ "agentTab": {
+ "chat": "Tùy chọn Trò chuyện",
+ "meta": "Thông tin Trợ lý",
+ "modal": "Cài đặt Mô hình",
+ "plugin": "Cài đặt Plugin",
+ "prompt": "Thiết lập Nhân vật",
+ "tts": "Dịch vụ Giọng nói"
+ },
"analytics": {
"telemetry": {
"desc": "Bằng cách chọn gửi dữ liệu telemetri, bạn có thể giúp chúng tôi cải thiện trải nghiệm người dùng toàn diện của LobeChat",
@@ -35,10 +43,14 @@
"title": "Cài đặt"
},
"llm": {
+ "apiKey": {
+ "desc": "Vui lòng nhập {{name}} API Key của bạn",
+ "placeholder": "{{name}} API Key",
+ "title": "API Key"
+ },
"checker": {
"button": "Kiểm tra",
"desc": "Kiểm tra xem Api Key và địa chỉ proxy đã được điền đúng chưa",
- "ollamaDesc": "Kiểm tra xem địa chỉ proxy đã được điền đúng chưa",
"pass": "Kiểm tra thành công",
"title": "Kiểm tra kết nối"
},
@@ -90,22 +102,19 @@
"latestTime": "Thời gian cập nhật lần cuối: {{time}}",
"noLatestTime": "Chưa có danh sách nào được lấy"
},
+ "helpDoc": "Hướng dẫn cấu hình",
"modelList": {
"desc": "Chọn mô hình hiển thị trong cuộc trò chuyện, mô hình đã chọn sẽ được hiển thị trong danh sách mô hình",
"placeholder": "Vui lòng chọn mô hình từ danh sách",
"title": "Danh sách mô hình",
"total": "Tổng cộng có {{count}} mô hình có sẵn"
},
+ "proxyUrl": {
+ "desc": "Ngoài địa chỉ mặc định, phải bao gồm http(s)://",
+ "title": "Địa chỉ Proxy API"
+ },
"waitingForMore": "Có thêm mô hình đang <1>được lên kế hoạch tích hợp1>, hãy chờ đợi ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama đang tải xuống mô hình này, vui lòng không đóng trang này. Quá trình tải xuống sẽ tiếp tục từ nơi đã bị gián đoạn khi tải lại",
- "remainingTime": "Thời gian còn lại",
- "speed": "Tốc độ tải xuống",
- "title": "Đang tải xuống mô hình {{model}}"
- }
- },
"plugin": {
"addTooltip": "Thêm tiện ích",
"clearDeprecated": "Xóa tiện ích không còn hỗ trợ",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "Không giới hạn",
"limited": "Chỉ chứa {{number}} tin nhắn trò chuyện",
+ "setlimited": "Thiết lập số lượng tin nhắn lịch sử",
"title": "Giới hạn số lượng tin nhắn lịch sử",
"unlimited": "Không giới hạn số lượng tin nhắn lịch sử"
},
@@ -356,6 +366,24 @@
"title": "WebRTC Đồng bộ"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "Mô hình tạo siêu dữ liệu trợ lý",
+ "modelDesc": "Xác định mô hình được sử dụng để tạo tên, mô tả, hình đại diện, nhãn cho trợ lý",
+ "title": "Tự động tạo thông tin trợ lý"
+ },
+ "title": "Trợ lý hệ thống",
+ "topic": {
+ "label": "Mô hình đặt tên chủ đề",
+ "modelDesc": "Mô hình được chỉ định để tự động đặt tên chủ đề",
+ "title": "Tự động đặt tên chủ đề"
+ },
+ "translation": {
+ "label": "Mô hình dịch",
+ "modelDesc": "Chọn mô hình để dịch",
+ "title": "Cài đặt trợ lý dịch"
+ }
+ },
"tab": {
"about": "Về chúng tôi",
"agent": "Trợ lý mặc định",
@@ -363,6 +391,7 @@
"experiment": "Thử nghiệm",
"llm": "Mô hình ngôn ngữ",
"sync": "Đồng bộ trên đám mây",
+ "system-agent": "Trợ lý hệ thống",
"tts": "Dịch vụ giọng nói"
},
"tools": {
diff --git a/locales/vi-VN/tool.json b/locales/vi-VN/tool.json
index d289333ecb56..38e997bf1be1 100644
--- a/locales/vi-VN/tool.json
+++ b/locales/vi-VN/tool.json
@@ -4,6 +4,7 @@
"downloading": "Liên kết hình ảnh được tạo bởi DallE3 chỉ có hiệu lực trong 1 giờ, đang tải hình ảnh xuống máy...",
"generate": "Tạo",
"generating": "Đang tạo...",
- "images": "Hình ảnh:"
+ "images": "Hình ảnh:",
+ "prompt": "Từ khóa"
}
}
diff --git a/locales/zh-CN/auth.json b/locales/zh-CN/auth.json
index 0b4018154a78..08711d759fcc 100644
--- a/locales/zh-CN/auth.json
+++ b/locales/zh-CN/auth.json
@@ -1,6 +1,8 @@
{
"login": "登录",
"loginOrSignup": "登录 / 注册",
+ "profile": "个人资料",
+ "security": "安全",
"signout": "退出登录",
"signup": "注册"
}
diff --git a/locales/zh-CN/chat.json b/locales/zh-CN/chat.json
index f75ba9095af2..dfc336502ece 100644
--- a/locales/zh-CN/chat.json
+++ b/locales/zh-CN/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "你好,我是 **{{name}}**,你可以立即与我开始对话,也可以前往 [助手设置](/chat/settings#session={{id}}) 完善我的信息。",
"agentDefaultMessageWithSystemRole": "你好,我是 **{{name}}**,{{systemRole}},让我们开始对话吧!",
+ "agentsAndConversations": "助手与会话",
"backToBottom": "跳转至当前",
"clearCurrentMessages": "清空当前会话消息",
"confirmClearCurrentMessages": "即将清空当前会话消息,清空后将无法找回,请确认你的操作",
@@ -39,7 +40,6 @@
"regenerate": "重新生成"
},
"newAgent": "新建助手",
- "noDescription": "暂无描述",
"pin": "置顶",
"pinOff": "取消置顶",
"regenerate": "重新生成",
@@ -83,6 +83,7 @@
"chats": "会话消息",
"rest": "剩余可用",
"systemRole": "角色设定",
+ "title": "上下文明细",
"tools": "插件设定",
"total": "总共可用",
"used": "总计使用"
diff --git a/locales/zh-CN/clerk.json b/locales/zh-CN/clerk.json
index ec5038d94478..d2c2f4eafff0 100644
--- a/locales/zh-CN/clerk.json
+++ b/locales/zh-CN/clerk.json
@@ -624,7 +624,7 @@
"mobileButton__menu": "菜单",
"navbar": {
"account": "个人资料",
- "description": "管理您的帐户信息。",
+ "description": "管理您的帐户信息",
"security": "安全",
"title": "帐户"
},
diff --git a/locales/zh-CN/common.json b/locales/zh-CN/common.json
index 49cc822bfb32..0041fa2b57ad 100644
--- a/locales/zh-CN/common.json
+++ b/locales/zh-CN/common.json
@@ -1,7 +1,7 @@
{
"about": "关于",
"advanceSettings": "高级设置",
- "appInitializing": "LobeChat 启动中,请耐心等待...",
+ "appInitializing": "应用启动中,请耐心等待...",
"autoGenerate": "自动补全",
"autoGenerateTooltip": "基于提示词自动补全助手描述",
"autoGenerateTooltipDisabled": "请填写提示词后使用自动补全功能",
@@ -9,6 +9,7 @@
"cancel": "取消",
"changelog": "更新日志",
"close": "关闭",
+ "contact": "联系我们",
"copy": "复制",
"copyFail": "复制失败",
"copySuccess": "复制成功",
@@ -35,10 +36,33 @@
},
"feedback": "反馈与建议",
"follow": "在 {{name}} 上关注我们",
+ "footer": {
+ "action": {
+ "feedback": "分享您宝贵的建议",
+ "star": "在 GitHub 给添加星标"
+ },
+ "and": "并",
+ "feedback": {
+ "action": "分享反馈",
+ "desc": "您的每一个想法和建议对我们来说都弥足珍贵,我们迫不及待地想知道您的看法!欢迎联系我们提供产品功能和使用体验反馈,帮助我们将 LobeChat 建设得更好。",
+ "title": "在 GitHub 分享您宝贵的反馈"
+ },
+ "later": "稍后",
+ "star": {
+ "action": "点亮星标",
+ "desc": "如果您喜爱我们的产品,并希望支持我们,可以去 GitHub 给我们点一颗星吗?这个小小的动作对我们来说意义重大,能激励我们为您持续提供特性体验。",
+ "title": "在 GitHub 为我们点亮星标"
+ },
+ "title": "喜欢我们的产品?"
+ },
"fullscreen": "全屏模式",
"historyRange": "历史范围",
"import": "导入配置",
"importModal": {
+ "error": {
+ "desc": "非常抱歉,数据导入过程发生异常。请尝试重新导入,或 <1>提交问题1>,我们将会第一时间帮你排查问题。",
+ "title": "数据导入失败"
+ },
"finish": {
"onlySettings": "系统设置导入成功",
"start": "开始使用",
@@ -46,6 +70,7 @@
"title": "数据导入完成"
},
"loading": "数据导入中,请耐心等待...",
+ "preparing": "数据导入模块准备中...",
"result": {
"added": "导入成功",
"errors": "导入出错",
@@ -56,8 +81,15 @@
"topics": "话题",
"type": "数据类型"
},
- "title": "导入数据"
+ "title": "导入数据",
+ "uploading": {
+ "desc": "当前文件较大,正在努力上传中...",
+ "restTime": "剩余时间",
+ "speed": "上传速度"
+ }
},
+ "information": "社区与资讯",
+ "installPWA": "安装浏览器应用 (PWA)",
"lang": {
"ar": "阿拉伯语",
"bg-BG": "保加利亚语",
@@ -96,7 +128,11 @@
"zh-TW": "繁体中文"
},
"layoutInitializing": "正在加载布局...",
- "noDescription": "暂无描述",
+ "legal": "法律声明",
+ "mail": {
+ "business": "商务合作",
+ "support": "邮件支持"
+ },
"oauth": "SSO 登录",
"officialSite": "官方网站",
"ok": "确定",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "匿名用户",
"billing": "账单管理",
+ "data": "数据存储",
"defaultNickname": "社区版用户",
"discord": "社区支持",
"docs": "使用文档",
@@ -181,5 +218,6 @@
"profile": "账户管理",
"setting": "应用设置",
"usages": "用量统计"
- }
+ },
+ "version": "版本"
}
diff --git a/locales/zh-CN/components.json b/locales/zh-CN/components.json
index c431ba382188..b38762c584ea 100644
--- a/locales/zh-CN/components.json
+++ b/locales/zh-CN/components.json
@@ -6,7 +6,8 @@
"functionCall": "该模型支持函数调用(Function Call)",
"tokens": "该模型单个会话最多支持 {{tokens}} Tokens",
"vision": "该模型支持视觉识别"
- }
+ },
+ "removed": "该模型不在列表中,若取消选中将会自动移除"
},
"ModelSwitchPanel": {
"emptyModel": "没有启用的模型,请前往设置开启",
diff --git a/locales/zh-CN/error.json b/locales/zh-CN/error.json
index 2a3dca19a8ce..fd7d3ee2b6db 100644
--- a/locales/zh-CN/error.json
+++ b/locales/zh-CN/error.json
@@ -12,6 +12,8 @@
"retry": "重新加载",
"title": "页面遇到一点问题.."
},
+ "fetchError": "请求失败",
+ "fetchErrorDetail": "错误详情",
"notFound": {
"backHome": "返回首页",
"desc": "我们找不到你正在寻找的页面,请检查链接是否正确",
@@ -65,38 +67,15 @@
"PluginOpenApiInitError": "很抱歉,OpenAPI 客户端初始化失败,请检查 OpenAPI 的配置信息是否正确",
"InvalidAccessCode": "密码不正确或为空,请输入正确的访问密码,或者添加自定义 API Key",
"InvalidClerkUser": "很抱歉,你当前尚未登录,请先登录或注册账号后继续操作",
- "LocationNotSupportError": "很抱歉,你的所在位置不支持此模型服务,可能是由于地区限制或服务未开通。请确认当前位置是否支持使用此服务,或尝试使用其他位置信息。",
+ "LocationNotSupportError": "很抱歉,你的所在地区不支持此模型服务,可能是由于区域限制或服务未开通。请确认当前地区是否支持使用此服务,或尝试使用切换到其他地区后重试。",
+ "InvalidProviderAPIKey": "{{provider}} API Key 不正确或为空,请检查 {{provider}} API Key 后重试",
+ "ProviderBizError": "请求 {{provider}} 服务出错,请根据以下信息排查或重试",
+ "NoOpenAIAPIKey": "OpenAI API Key 不正确或为空,请添加自定义 OpenAI API Key",
"OpenAIBizError": "请求 OpenAI 服务出错,请根据以下信息排查或重试",
- "NoOpenAIAPIKey": "OpenAI API Key 为空,请添加自定义 OpenAI API Key",
- "ZhipuBizError": "请求智谱服务出错,请根据以下信息排查或重试",
- "InvalidZhipuAPIKey": "Zhipu API Key 不正确或为空,请检查 Zhipu API Key 后重试",
- "MistralBizError": "请求 Mistral AI 服务出错,请根据以下信息排查或重试",
- "InvalidMistralAPIKey": "Mistral AI API Key 不正确或为空,请检查 Mistral API Key 后重试",
- "MoonshotBizError": "请求月之暗面服务出错,请根据以下信息排查或重试",
- "InvalidMoonshotAPIKey": "Moonshot AI API Key 不正确或为空,请检查 Moonshot API Key 后重试",
- "GoogleBizError": "请求 Google 服务出错,请根据以下信息排查或重试",
- "InvalidGoogleAPIKey": "Google API Key 不正确或为空,请检查 Google API Key 后重试",
"InvalidBedrockCredentials": "Bedrock 鉴权未通过,请检查 AccessKeyId/SecretAccessKey 后重试",
- "BedrockBizError": "请求 Bedrock 服务出错,请根据以下信息排查或重试",
- "InvalidAzureAPIKey": "Azure API Key 不正确或为空,请检查 Azure API Key 后重试",
- "AzureBizError": "请求 Azure AI 服务出错,请根据以下信息排查或重试",
- "InvalidPerplexityAPIKey": "Perplexity API Key 不正确或为空,请检查 Perplexity API Key 后重试",
- "PerplexityBizError": "请求 Perplexity AI 服务出错,请根据以下信息排查或重试",
- "InvalidAnthropicAPIKey": "Anthropic API Key 不正确或为空,请检查 Anthropic API Key 后重试",
- "AnthropicBizError": "请求 Anthropic AI 服务出错,请根据以下信息排查或重试",
- "InvalidGroqAPIKey": "Groq API Key 不正确或为空,请检查 Groq API Key 后重试",
- "GroqBizError": "请求 Groq 服务出错,请根据以下信息排查或重试",
- "InvalidOpenRouterAPIKey": "OpenRouter API Key 不正确或为空,请检查 OpenRouter API Key 后重试",
- "OpenRouterBizError": "请求 OpenRouter AI 服务出错,请根据以下信息排查或重试",
- "InvalidTogetherAIAPIKey": "TogetherAI API Key 不正确或为空,请检查 TogetherAI API Key 后重试",
- "TogetherAIBizError": "请求 TogetherAI AI 服务出错,请根据以下信息排查或重试",
- "ZeroOneBizError": "请求零一万物服务出错,请根据以下信息排查或重试",
- "InvalidZeroOneAPIKey": "零一万物 API Key 不正确或为空,请检查零一万物 API Key 后重试",
"InvalidOllamaArgs": "Ollama 配置不正确,请检查 Ollama 配置后重试",
"OllamaBizError": "请求 Ollama 服务出错,请根据以下信息排查或重试",
"OllamaServiceUnavailable": "Ollama 服务连接失败,请检查 Ollama 是否运行正常,或是否正确设置 Ollama 的跨域配置",
- "MinimaxBizError": "请求 Minimax 服务出错,请根据以下信息排查或重试",
- "InvalidMinimaxAPIKey": "Minimax API Key 不正确或为空,请检查 Minimax API Key 后重试",
"AgentRuntimeError": "Lobe AI Runtime 执行出错,请根据以下信息排查或重试"
},
"stt": {
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "添加 OpenAI 代理地址(可选)",
+ "apiKey": {
+ "description": "输入你的 {{name}} API Key 即可开始会话",
+ "title": "使用自定义 {{name}} API Key"
+ },
"closeMessage": "关闭提示",
"confirm": "确认并重试",
"oauth": {
@@ -115,14 +98,6 @@
"title": "登录账号",
"welcome": "欢迎你!"
},
- "ollama": {
- "cancel": "取消下载",
- "confirm": "下载",
- "description": "输入你的 Ollama 模型标签,完成即可继续会话",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "开始下载...",
- "title": "下载指定的 Ollama 模型"
- },
"password": {
"description": "管理员已开启应用加密,输入应用密码后即可解锁应用。密码只需填写一次",
"placeholder": "请输入密码",
@@ -132,5 +107,9 @@
"apiKey": "自定义 API Key",
"password": "密码"
}
+ },
+ "upload": {
+ "desc": "详情: {{detail}}",
+ "title": "文件上传失败,请检查网络连接或稍后再试"
}
}
diff --git a/locales/zh-CN/metadata.json b/locales/zh-CN/metadata.json
new file mode 100644
index 000000000000..c0db09e96b7e
--- /dev/null
+++ b/locales/zh-CN/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验",
+ "title": "LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑"
+ },
+ "market": {
+ "description": "内容创作、文案、问答、图像生成、视频生成、语音生成、智能 Agent、自动化工作流,定制你专属的 AI / GPTs / OLLaMA 智能助手",
+ "title": "助手市场"
+ },
+ "plugins": {
+ "description": "搜素、图表生成、学术、图像生成、视频生成、语音生成、自动化工作流,定制 ChatGPT / OLLaMA 专属的 ToolCall 插件能力",
+ "title": "插件市场"
+ },
+ "welcome": {
+ "description": "LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验",
+ "title": "欢迎使用 LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑"
+ }
+}
diff --git a/locales/zh-CN/modelProvider.json b/locales/zh-CN/modelProvider.json
index 682dc96cbab5..6e36ee95a505 100644
--- a/locales/zh-CN/modelProvider.json
+++ b/locales/zh-CN/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "API 代理地址"
- },
- "title": "Anthropic",
- "token": {
- "desc": "填入来自 Anthropic 的 API Key",
- "placeholder": "Anthropic API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Anthropic API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Anthropic API Key"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure 的 API 版本,遵循 YYYY-MM-DD 格式,查阅[最新版本](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1 或 KEY2",
"placeholder": "Azure API Key",
"title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Azure OpenAI API Key 即可开始会话",
- "title": "使用自定义 Azure OpenAI API Key"
}
},
"bedrock": {
@@ -66,84 +45,25 @@
"title": "使用自定义 Bedrock 鉴权信息"
}
},
- "google": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "填入来自 Google 的 API Key",
- "placeholder": "Google API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Google API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Google API Key"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "填入来自 Groq 的 API Key",
- "placeholder": "Groq API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Groq API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Groq API Key"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "填入来自 Minimax 的 API Key",
- "placeholder": "Minimax API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Minimax API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Minimax API Key"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "填入来自 Mistral AI 的 API Key",
- "placeholder": "Mistral AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Mistral AI API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Mistral AI API Key"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "填入来自 Moonshot AI 的 API Key",
- "placeholder": "Moonshot AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Moonshot AI API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Moonshot AI API Key"
- }
- },
"ollama": {
"checker": {
- "desc": "测试代理地址是否正确填写"
+ "desc": "测试代理地址是否正确填写",
+ "title": "连通性检查"
},
"customModelName": {
"desc": "增加自定义模型,多个模型使用逗号(,)隔开",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "自定义模型名称"
},
+ "download": {
+ "desc": "Ollama 正在下载该模型,请尽量不要关闭本页面。重新下载时将会中断处继续",
+ "remainingTime": "剩余时间",
+ "speed": "下载速度",
+ "title": "正在下载模型 {{model}} "
+ },
"endpoint": {
"desc": "填入 Ollama 接口代理地址,本地未额外指定可留空",
- "placeholder": "http://127.0.0.1:11434",
- "title": "接口代理地址"
+ "title": "Ollama 服务地址"
},
"setup": {
"cors": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (预览版)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "除默认地址外,必须包含 http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "接口代理地址"
- },
- "title": "OpenAI",
- "token": {
- "desc": "使用自己的 OpenAI Key",
- "placeholder": "OpenAI API Key",
- "title": "OpenAI API Key"
- },
- "unlock": {
- "description": "输入你的 OpenAI API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 OpenAI API Key"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "测试代理地址是否正确填写"
- },
- "customModelName": {
- "desc": "增加自定义模型,多个模型使用逗号(,)隔开",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "自定义模型名称"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "填入来自 OpenRouter AI 的 API Key",
- "placeholder": "OpenRouter AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 OpenRouter API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 OpenRouter API Key"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "填入来自 Perplexity AI 的 API Key",
- "placeholder": "Perplexity AI API Key",
- "title": "API Key"
- },
+ "title": "Ollama",
"unlock": {
- "description": "输入你的 Perplexity API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Perplexity API Key"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "测试代理地址是否正确填写"
- },
- "customModelName": {
- "desc": "增加自定义模型,多个模型使用逗号(,)隔开",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "自定义模型名称"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "填入来自 TogetherAI AI 的 API Key",
- "placeholder": "TogetherAI AI API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 TogetherAI API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 TogetherAI API Key"
+ "cancel": "取消下载",
+ "confirm": "下载",
+ "description": "输入你的 Ollama 模型标签,完成即可继续会话",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "开始下载...",
+ "title": "下载指定的 Ollama 模型"
}
},
"zeroone": {
- "title": "01.AI 零一万物",
- "token": {
- "desc": "填入来自 01.AI 零一万物的 API Key",
- "placeholder": "01.AI 零一万物 API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的零一万物 API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义零一万物 API Key"
- }
+ "title": "01.AI 零一万物"
},
"zhipu": {
- "title": "智谱",
- "token": {
- "desc": "填入来自智谱的 API Key",
- "placeholder": "Zhipu API Key",
- "title": "API Key"
- },
- "unlock": {
- "description": "输入你的 Zhipu API Key 即可开始会话。应用不会记录你的 API Key",
- "title": "使用自定义 Zhipu API Key"
- }
+ "title": "智谱"
}
}
diff --git a/locales/zh-CN/plugin.json b/locales/zh-CN/plugin.json
index e6de6a00f34b..de096296754f 100644
--- a/locales/zh-CN/plugin.json
+++ b/locales/zh-CN/plugin.json
@@ -4,7 +4,9 @@
"function_call": "函数调用",
"off": "关闭调试",
"on": "查看插件调用信息",
- "response": "返回结果"
+ "payload": "插件载荷",
+ "response": "返回结果",
+ "tool_call": "工具调用请求"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "插件运行中..."
},
"pluginList": "插件列表",
- "plugins": {
- "loading": "工具检测中...",
- "unknown": "未知工具"
- },
"setting": "插件设置",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "已安装"
},
"title": "插件商店"
- }
+ },
+ "unknownPlugin": "未知插件"
}
diff --git a/locales/zh-CN/setting.json b/locales/zh-CN/setting.json
index fbe3fc79ef9c..7d03cf2214c4 100644
--- a/locales/zh-CN/setting.json
+++ b/locales/zh-CN/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "关于"
},
+ "agentTab": {
+ "chat": "聊天偏好",
+ "meta": "助手信息",
+ "modal": "模型设置",
+ "plugin": "插件设置",
+ "prompt": "角色设定",
+ "tts": "语音服务"
+ },
"analytics": {
"telemetry": {
"desc": "通过选择发送遥测数据,你可以帮助我们改善 LobeChat 整体用户体验",
@@ -35,10 +43,14 @@
"title": "设置"
},
"llm": {
+ "apiKey": {
+ "desc": "请填写你的 {{name}} API Key",
+ "placeholder": "{{name}} API Key",
+ "title": "API Key"
+ },
"checker": {
"button": "检查",
"desc": "测试 Api Key 与代理地址是否正确填写",
- "ollamaDesc": "测试代理地址是否正确填写",
"pass": "检查通过",
"title": "连通性检查"
},
@@ -90,22 +102,19 @@
"latestTime": "上次更新时间:{{time}}",
"noLatestTime": "暂未获取列表"
},
+ "helpDoc": "配置教程",
"modelList": {
"desc": "选择在会话中展示的模型,选择的模型会在模型列表中展示",
"placeholder": "请从列表中选择模型",
"title": "模型列表",
"total": "共 {{count}} 个模型可用"
},
+ "proxyUrl": {
+ "desc": "除默认地址外,必须包含 http(s)://",
+ "title": "API 代理地址"
+ },
"waitingForMore": "更多模型正在 <1>计划接入1> 中,敬请期待 ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama 正在下载该模型,请尽量不要关闭本页面。重新下载时将会中断处继续",
- "remainingTime": "剩余时间",
- "speed": "下载速度",
- "title": "正在下载模型 {{model}} "
- }
- },
"plugin": {
"addTooltip": "自定义插件",
"clearDeprecated": "移除无效插件",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "不限制",
"limited": "只包含 {{number}} 条会话消息",
+ "setlimited": "使用历史消息数",
"title": "限制历史消息数",
"unlimited": "不限历史消息数"
},
@@ -356,6 +366,24 @@
"title": "WebRTC 同步"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "助理元数据生成模型",
+ "modelDesc": "指定用于生成助理名称、描述、头像、标签的模型",
+ "title": "自动生成助理信息"
+ },
+ "title": "系统助手",
+ "topic": {
+ "label": "话题命名模型",
+ "modelDesc": "指定用于话题自动重命名的模型",
+ "title": "话题自动命名"
+ },
+ "translation": {
+ "label": "翻译模型",
+ "modelDesc": "指定用于翻译的模型",
+ "title": "消息内容翻译"
+ }
+ },
"tab": {
"about": "关于",
"agent": "默认助手",
@@ -363,6 +391,7 @@
"experiment": "实验",
"llm": "语言模型",
"sync": "云端同步",
+ "system-agent": "系统助手",
"tts": "语音服务"
},
"tools": {
diff --git a/locales/zh-CN/tool.json b/locales/zh-CN/tool.json
index a818d01ccf06..3f459aa66931 100644
--- a/locales/zh-CN/tool.json
+++ b/locales/zh-CN/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 生成的图片链接有效期仅1小时,正在缓存图片到本地...",
"generate": "生成",
"generating": "生成中...",
- "images": "图片:"
+ "images": "图片:",
+ "prompt": "提示词"
}
}
diff --git a/locales/zh-TW/auth.json b/locales/zh-TW/auth.json
index 574818f15a1d..b9c5c6194747 100644
--- a/locales/zh-TW/auth.json
+++ b/locales/zh-TW/auth.json
@@ -1,6 +1,8 @@
{
"login": "登入",
"loginOrSignup": "登入 / 註冊",
+ "profile": "個人檔案",
+ "security": "安全",
"signout": "登出",
"signup": "註冊"
}
diff --git a/locales/zh-TW/chat.json b/locales/zh-TW/chat.json
index c00f3bbaffbd..5dcd0e8c9e39 100644
--- a/locales/zh-TW/chat.json
+++ b/locales/zh-TW/chat.json
@@ -4,6 +4,7 @@
},
"agentDefaultMessage": "你好,我是 **{{name}}**,你可以立即與我開始對話,也可以前往 [助手設置](/chat/settings#session={{id}}) 完善我的信息。",
"agentDefaultMessageWithSystemRole": "你好,我是 **{{name}}**,{{systemRole}},讓我們開始對話吧!",
+ "agentsAndConversations": "助理與對話",
"backToBottom": "返回底部",
"clearCurrentMessages": "清空當前對話",
"confirmClearCurrentMessages": "即將清空當前對話,清空後將無法找回,請確認你的操作",
@@ -39,7 +40,6 @@
"regenerate": "重新生成"
},
"newAgent": "新建助手",
- "noDescription": "暫無描述",
"pin": "置頂",
"pinOff": "取消置頂",
"regenerate": "重新生成",
@@ -83,6 +83,7 @@
"chats": "聊天訊息",
"rest": "剩餘可用",
"systemRole": "角色設定",
+ "title": "上下文詳細資訊",
"tools": "外掛程式設定",
"total": "總共可用",
"used": "總計使用"
diff --git a/locales/zh-TW/clerk.json b/locales/zh-TW/clerk.json
index fa8bcacbe276..860c6dc17cef 100644
--- a/locales/zh-TW/clerk.json
+++ b/locales/zh-TW/clerk.json
@@ -624,7 +624,7 @@
"mobileButton__menu": "選單",
"navbar": {
"account": "個人資料",
- "description": "管理您的帳戶資訊。",
+ "description": "管理您的帳戶資訊",
"security": "安全性",
"title": "帳戶"
},
diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json
index 5e728b070408..8e5d3b2cc468 100644
--- a/locales/zh-TW/common.json
+++ b/locales/zh-TW/common.json
@@ -1,7 +1,7 @@
{
"about": "關於",
"advanceSettings": "進階設定",
- "appInitializing": "LobeChat 初始化中,請耐心等候...",
+ "appInitializing": "應用程式初始化中,請耐心等候...",
"autoGenerate": "自動生成",
"autoGenerateTooltip": "基於提示詞自動生成助手描述",
"autoGenerateTooltipDisabled": "請填寫提示詞後使用自動補全功能",
@@ -9,6 +9,7 @@
"cancel": "取消",
"changelog": "變更日誌",
"close": "關閉",
+ "contact": "聯繫我們",
"copy": "複製",
"copyFail": "複製失敗",
"copySuccess": "複製成功",
@@ -35,10 +36,33 @@
},
"feedback": "回饋與建議",
"follow": "在 {{name}} 上關注我們",
+ "footer": {
+ "action": {
+ "feedback": "分享您寶貴的建議",
+ "star": "在 GitHub 給添加星標"
+ },
+ "and": "並",
+ "feedback": {
+ "action": "分享反饋",
+ "desc": "您的每一個想法和建議對我們來說都弥足珍貴,我們迫不及待地想知道您的看法!歡迎聯繫我們提供產品功能和使用體驗反饋,幫助我們將 LobeChat 建設得更好。",
+ "title": "在 GitHub 分享您寶貴的反饋"
+ },
+ "later": "稍後",
+ "star": {
+ "action": "點亮星標",
+ "desc": "如果您喜愛我們的產品,並希望支持我們,可以去 GitHub 給我們點一顆星嗎?這個小小的動作對我們來說意義重大,能激勵我們為您持續提供特性體驗。",
+ "title": "在 GitHub 為我們點亮星標"
+ },
+ "title": "喜歡我們的產品?"
+ },
"fullscreen": "全螢幕模式",
"historyRange": "歷史範圍",
"import": "匯入設定",
"importModal": {
+ "error": {
+ "desc": "非常抱歉,資料匯入過程發生異常。請嘗試重新匯入,或 <1>提交問題1>,我們將會第一時間幫你排查問題。",
+ "title": "資料匯入失敗"
+ },
"finish": {
"onlySettings": "系統設定匯入成功",
"start": "開始使用",
@@ -46,6 +70,7 @@
"title": "資料匯入完成"
},
"loading": "資料匯入中,請耐心等候...",
+ "preparing": "資料匯入模組準備中...",
"result": {
"added": "匯入成功",
"errors": "匯入出錯",
@@ -56,8 +81,15 @@
"topics": "話題",
"type": "資料類型"
},
- "title": "匯入資料"
+ "title": "匯入資料",
+ "uploading": {
+ "desc": "當前檔案較大,正在努力上傳中...",
+ "restTime": "剩餘時間",
+ "speed": "上傳速度"
+ }
},
+ "information": "社群與資訊",
+ "installPWA": "安裝瀏覽器應用 (PWA)",
"lang": {
"ar": "阿拉伯語",
"bg-BG": "保加利亞語",
@@ -96,7 +128,11 @@
"zh-TW": "繁體中文"
},
"layoutInitializing": "正在載入版面配置...",
- "noDescription": "暫無描述",
+ "legal": "法律聲明",
+ "mail": {
+ "business": "商務合作",
+ "support": "郵件支持"
+ },
"oauth": "單一登錄(SSO)",
"officialSite": "官方網站",
"ok": "確定",
@@ -169,6 +205,7 @@
"userPanel": {
"anonymousNickName": "匿名使用者",
"billing": "帳單管理",
+ "data": "資料儲存",
"defaultNickname": "社群版使用者",
"discord": "社區支援",
"docs": "使用文件",
@@ -181,5 +218,6 @@
"profile": "帳戶管理",
"setting": "應用設定",
"usages": "用量統計"
- }
+ },
+ "version": "版本"
}
diff --git a/locales/zh-TW/components.json b/locales/zh-TW/components.json
index 303c926477bf..5aaf85e96c6b 100644
--- a/locales/zh-TW/components.json
+++ b/locales/zh-TW/components.json
@@ -6,7 +6,8 @@
"functionCall": "該模型支援函式呼叫(Function Call)",
"tokens": "該模型單一會話最多支援 {{tokens}} Tokens",
"vision": "該模型支援視覺辨識"
- }
+ },
+ "removed": "該模型不在清單中,若取消選取將會自動移除"
},
"ModelSwitchPanel": {
"emptyModel": "沒有啟用的模型,請前往設定開啟",
diff --git a/locales/zh-TW/error.json b/locales/zh-TW/error.json
index a22454f8e1f2..44704f96925c 100644
--- a/locales/zh-TW/error.json
+++ b/locales/zh-TW/error.json
@@ -12,6 +12,8 @@
"retry": "重新加載",
"title": "頁面遇到一點問題.."
},
+ "fetchError": "請求失敗",
+ "fetchErrorDetail": "錯誤詳情",
"notFound": {
"backHome": "返回首頁",
"desc": "我們找不到您正在尋找的頁面,請檢查連結是否正確",
@@ -52,37 +54,16 @@
"503": "抱歉,伺服器目前無法處理您的請求,可能是因為過載或正在進行維護。請稍後再試。",
"504": "抱歉,伺服器沒有收到上游伺服器的回應。請稍後再試。",
"AgentRuntimeError": "Lobe 語言模型運行時執行出錯,請根據以下信息排查或重試",
- "AnthropicBizError": "請求 Anthropic AI 服務出錯,請根據以下信息排查或重試",
- "AzureBizError": "請求 Azure AI 服務出錯,請根據以下信息排查或重試",
- "BedrockBizError": "請求 Bedrock 服務出錯,請根據以下信息排查或重試",
- "GoogleBizError": "請求 Google 服務出錯,請根據以下信息排查或重試",
- "GroqBizError": "請求 Groq 服務出錯,請根據以下信息排查或重試",
"InvalidAccessCode": "密碼不正確或為空,請輸入正確的訪問密碼,或添加自定義 API 金鑰",
- "InvalidAnthropicAPIKey": "Anthropic API 金鑰不正確或為空,請檢查 Anthropic API 金鑰後重試",
- "InvalidAzureAPIKey": "Azure API Key 不正確或為空,請檢查 Azure API Key 後重試",
"InvalidBedrockCredentials": "Bedrock 驗證未通過,請檢查 AccessKeyId/SecretAccessKey 後重試",
"InvalidClerkUser": "很抱歉,你當前尚未登錄,請先登錄或註冊帳號後繼續操作",
- "InvalidGoogleAPIKey": "Google API Key 不正確或為空,請檢查 Google API Key 後重試",
- "InvalidGroqAPIKey": "Groq API 金鑰不正確或為空,請檢查 Groq API 金鑰後重試",
- "InvalidMinimaxAPIKey": "Minimax API 金鑰不正確或為空,請檢查 Minimax API 金鑰後重試",
- "InvalidMistralAPIKey": "Mistral AI API Key 不正確或為空,請檢查 Mistral API Key 後重試",
- "InvalidMoonshotAPIKey": "Moonshot AI API 金鑰不正確或為空,請檢查 Moonshot API 金鑰後重試",
"InvalidOllamaArgs": "Ollama 配置不正確,請檢查 Ollama 配置後重試",
- "InvalidOpenRouterAPIKey": "OpenRouter API 金鑰不正確或為空,請檢查 OpenRouter API 金鑰後重試",
- "InvalidPerplexityAPIKey": "Perplexity API Key 不正確或為空,請檢查 Perplexity API Key 後重試",
- "InvalidTogetherAIAPIKey": "TogetherAI API 金鑰不正確或為空,請檢查 TogetherAI API 金鑰後重試",
- "InvalidZeroOneAPIKey": "零一萬物 API Key 不正確或為空,請檢查零一萬物 API Key 後重試",
- "InvalidZhipuAPIKey": "Zhipu API Key 不正確或為空,請檢查 Zhipu API Key 後重試",
+ "InvalidProviderAPIKey": "{{provider}} API 金鑰不正確或為空,請檢查 {{provider}} API 金鑰後重試",
"LocationNotSupportError": "很抱歉,你的所在位置不支持此模型服務,可能是由於地區限制或服務未開通。請確認當前位置是否支持使用此服務,或嘗試使用其他位置信息。",
- "MinimaxBizError": "請求 Minimax 服務出錯,請根據以下資訊排查或重試",
- "MistralBizError": "請求 Mistral AI 服務出錯,請根據以下信息排查或重試",
- "MoonshotBizError": "請求月球背面服務出錯,請根據以下信息排查或重試",
"NoOpenAIAPIKey": "OpenAI API 金鑰為空,請添加自訂 OpenAI API 金鑰",
"OllamaBizError": "請求 Ollama 服務出錯,請根據以下資訊排查或重試",
"OllamaServiceUnavailable": "Ollama 服務暫時無法使用,請檢查 Ollama 是否運作正常,或是否正確設定 Ollama 的跨域配置",
- "OpenAIBizError": "請求 OpenAI 服務出錯。請根據以下資訊進行排查或重試。",
- "OpenRouterBizError": "請求 OpenRouter AI 服務出錯,請根據以下信息排查或重試",
- "PerplexityBizError": "請求 Perplexity AI 服務出錯,請根據以下信息排查或重試",
+ "OpenAIBizError": "請求 OpenAI 服務出錯,請根據以下資訊排查或重試",
"PluginApiNotFound": "抱歉,外掛描述檔案中不存在該 API。請檢查您的請求方法與外掛清單 API 是否相符",
"PluginApiParamsError": "抱歉,該外掛請求的輸入參數驗證失敗。請檢查輸入參數與 API 描述資訊是否相符",
"PluginGatewayError": "很抱歉,插件網關出現錯誤,請檢查插件網關配置是否正確",
@@ -95,9 +76,7 @@
"PluginOpenApiInitError": "很抱歉,OpenAPI 客戶端初始化失敗,請檢查 OpenAPI 的配置信息是否正確",
"PluginServerError": "外掛伺服器請求回傳錯誤。請根據下面的錯誤資訊檢查您的外掛描述檔案、外掛設定或伺服器實作",
"PluginSettingsInvalid": "該外掛需要正確設定後才可以使用。請檢查您的設定是否正確",
- "TogetherAIBizError": "請求 TogetherAI AI 服務出錯,請根據以下信息排查或重試",
- "ZeroOneBizError": "請求零一萬物服務出錯,請根據以下信息排查或重試",
- "ZhipuBizError": "請求智譜服務出錯,請根據以下信息排查或重試"
+ "ProviderBizError": "請求 {{provider}} 服務出錯,請根據以下資訊排查或重試"
},
"stt": {
"responseError": "服務請求失敗,請檢查配置或重試"
@@ -107,6 +86,10 @@
},
"unlock": {
"addProxyUrl": "新增 OpenAI 代理網址(選填)",
+ "apiKey": {
+ "description": "輸入您的 {{name}} API 金鑰即可開始會話",
+ "title": "使用自定義 {{name}} API 金鑰"
+ },
"closeMessage": "關閉提示",
"confirm": "確認並重試",
"oauth": {
@@ -115,14 +98,6 @@
"title": "登錄帳號",
"welcome": "歡迎你!"
},
- "ollama": {
- "cancel": "取消下載",
- "confirm": "下載",
- "description": "輸入您的 Ollama 模型標籤,完成後即可繼續會話",
- "downloaded": "{{completed}} / {{total}}",
- "starting": "開始下載...",
- "title": "下載指定的 Ollama 模型"
- },
"password": {
"description": "管理員已啟用應用程式加密,輸入應用程式密碼後即可解鎖應用程式。密碼只需填寫一次。",
"placeholder": "請輸入密碼",
@@ -132,5 +107,9 @@
"apiKey": "自定義 API Key",
"password": "密碼"
}
+ },
+ "upload": {
+ "desc": "詳情: {{detail}}",
+ "title": "檔案上傳失敗,請檢查網路連線或稍後再試"
}
}
diff --git a/locales/zh-TW/metadata.json b/locales/zh-TW/metadata.json
new file mode 100644
index 000000000000..c206897fddaa
--- /dev/null
+++ b/locales/zh-TW/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat 帶給你最佳的 ChatGPT、OLLaMA、Gemini、Claude WebUI 使用體驗",
+ "title": "LobeChat:個人 LLM 效能工具,給自己一個更聰明的大腦"
+ },
+ "market": {
+ "description": "內容創作、文案、問答、圖像生成、視頻生成、語音生成、智能 Agent、自動化工作流,定制你專屬的 AI / GPTs / OLLaMA 智能助手",
+ "title": "助手市場"
+ },
+ "plugins": {
+ "description": "搜尋、圖表生成、學術、圖像生成、視頻生成、語音生成、自動化工作流,定制 ChatGPT / OLLaMA 專屬的 ToolCall 插件能力",
+ "title": "插件市場"
+ },
+ "welcome": {
+ "description": "LobeChat 帶給你最佳的 ChatGPT、OLLaMA、Gemini、Claude WebUI 使用體驗",
+ "title": "歡迎使用 LobeChat:個人 LLM 效能工具,給自己一個更聰明的大腦"
+ }
+}
diff --git a/locales/zh-TW/modelProvider.json b/locales/zh-TW/modelProvider.json
index 24704b648b6d..3b9baacb6b07 100644
--- a/locales/zh-TW/modelProvider.json
+++ b/locales/zh-TW/modelProvider.json
@@ -1,21 +1,4 @@
{
- "anthropic": {
- "endpoint": {
- "desc": "除預設地址外,必須包含 http(s)://",
- "placeholder": "https://api.anthropic.com",
- "title": "API 代理地址"
- },
- "title": "Anthropic",
- "token": {
- "desc": "填入來自 Anthropic 的 API 金鑰",
- "placeholder": "Anthropic API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Anthropic API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Anthropic API 金鑰"
- }
- },
"azure": {
"azureApiVersion": {
"desc": "Azure 的 API 版本,遵循 YYYY-MM-DD 格式,查閱[最新版本](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
@@ -34,10 +17,6 @@
"desc": "從 Azure 門戶檢查資源時,可在“金鑰和終點”部分中找到此值。 可以使用 KEY1 或 KEY2",
"placeholder": "Azure API 金鑰",
"title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Azure OpenAI API 金鑰即可開始會話",
- "title": "使用自定義 Azure OpenAI API 金鑰"
}
},
"bedrock": {
@@ -66,83 +45,24 @@
"title": "使用自定義 Bedrock 驗證資訊"
}
},
- "google": {
- "endpoint": {
- "desc": "除了預設地址外,必須包含 http(s)://",
- "placeholder": "https://generativelanguage.googleapis.com",
- "title": "API 代理地址"
- },
- "title": "Google",
- "token": {
- "desc": "填入來自 Google 的 API 金鑰",
- "placeholder": "Google API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Google API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Google API 金鑰"
- }
- },
- "groq": {
- "title": "Groq",
- "token": {
- "desc": "填入來自 Groq 的 API 金鑰",
- "placeholder": "Groq API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Groq API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Groq API 金鑰"
- }
- },
- "minimax": {
- "title": "Minimax",
- "token": {
- "desc": "請填入來自 Minimax 的 API 金鑰",
- "placeholder": "Minimax API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入您的 Minimax API 金鑰即可開始會話。應用程式不會記錄您的 API 金鑰",
- "title": "使用自訂 Minimax API 金鑰"
- }
- },
- "mistral": {
- "title": "Mistral AI",
- "token": {
- "desc": "填入來自 Mistral AI 的 API 金鑰",
- "placeholder": "Mistral AI API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Mistral AI API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Mistral AI API 金鑰"
- }
- },
- "moonshot": {
- "title": "Moonshot AI",
- "token": {
- "desc": "填入來自 Moonshot AI 的 API 金鑰",
- "placeholder": "Moonshot AI API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Moonshot AI API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Moonshot AI API 金鑰"
- }
- },
"ollama": {
"checker": {
- "desc": "測試代理地址是否正確填寫"
+ "desc": "測試代理地址是否正確填寫",
+ "title": "連通性檢查"
},
"customModelName": {
"desc": "增加自定義模型,多個模型使用逗號(,)隔開",
"placeholder": "vicuna,llava,codellama,llama2:13b-text",
"title": "自定義模型名稱"
},
+ "download": {
+ "desc": "Ollama 正在下載該模型,請儘量不要關閉本頁面。重新下載時將會中斷處繼續",
+ "remainingTime": "剩餘時間",
+ "speed": "下載速度",
+ "title": "正在下載模型 {{model}}"
+ },
"endpoint": {
"desc": "填入 Ollama 接口代理地址,本地未額外指定可留空",
- "placeholder": "http://127.0.0.1:11434",
"title": "接口代理地址"
},
"setup": {
@@ -169,99 +89,20 @@
"windowsTab": "Windows (預覽版)"
}
},
- "title": "Ollama"
- },
- "openai": {
- "endpoint": {
- "desc": "除默認地址外,必須包含 http(s)://",
- "placeholder": "https://api.openai.com/v1",
- "title": "接口代理地址"
- },
- "title": "OpenAI",
- "token": {
- "desc": "使用自己的 OpenAI 金鑰",
- "placeholder": "OpenAI API 金鑰",
- "title": "OpenAI API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 OpenAI API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 OpenAI API 金鑰"
- }
- },
- "openrouter": {
- "checker": {
- "desc": "測試代理地址是否正確填寫"
- },
- "customModelName": {
- "desc": "增加自定義模型,多個模型使用逗號(,)隔開",
- "placeholder": "mistralai/mistral-7b-instruct:free,openchat/openchat-7b:free",
- "title": "自定義模型名稱"
- },
- "title": "OpenRouter",
- "token": {
- "desc": "填入來自 OpenRouter AI 的 API 金鑰",
- "placeholder": "OpenRouter AI API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 OpenRouter API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 OpenRouter API 金鑰"
- }
- },
- "perplexity": {
- "title": "Perplexity",
- "token": {
- "desc": "填入來自 Perplexity AI 的 API 金鑰",
- "placeholder": "Perplexity AI API 金鑰",
- "title": "API 金鑰"
- },
+ "title": "Ollama",
"unlock": {
- "description": "輸入你的 Perplexity API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 Perplexity API 金鑰"
- }
- },
- "togetherai": {
- "checker": {
- "desc": "測試代理地址是否正確填寫"
- },
- "customModelName": {
- "desc": "增加自定義模型,多個模型使用逗號(,)隔開",
- "placeholder": "togethercomputer/Llama-2-7B-32K-Instruct,teknium/OpenHermes-2-Mistral-7B",
- "title": "自定義模型名稱"
- },
- "title": "TogetherAI",
- "token": {
- "desc": "填入來自 TogetherAI AI 的 API 金鑰",
- "placeholder": "TogetherAI AI API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 TogetherAI API 金鑰即可開始會話。應用程式不會記錄你的 API 金鑰",
- "title": "使用自定義 TogetherAI API 金鑰"
+ "cancel": "取消下載",
+ "confirm": "下載",
+ "description": "輸入你的 Ollama 模型標籤,完成即可繼續會話",
+ "downloaded": "{{completed}} / {{total}}",
+ "starting": "開始下載...",
+ "title": "下載指定的 Ollama 模型"
}
},
"zeroone": {
- "title": "01.AI 零一萬物",
- "token": {
- "desc": "填入來自 01.AI 零一萬物的 API 金鑰",
- "placeholder": "01.AI 零一萬物 API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的零一萬物 API 金鑰即可開始會話。應用不會記錄你的 API 金鑰",
- "title": "使用自定義零一萬物 API 金鑰"
- }
+ "title": "01.AI 零一萬物"
},
"zhipu": {
- "title": "智譜",
- "token": {
- "desc": "填入來自智譜的 API 金鑰",
- "placeholder": "Zhipu API 金鑰",
- "title": "API 金鑰"
- },
- "unlock": {
- "description": "輸入你的 Zhipu API 金鑰即可開始會話。應用不會記錄你的 API 金鑰",
- "title": "使用自定義 Zhipu API 金鑰"
- }
+ "title": "智譜"
}
}
diff --git a/locales/zh-TW/plugin.json b/locales/zh-TW/plugin.json
index e496bee19c29..dd7042240b85 100644
--- a/locales/zh-TW/plugin.json
+++ b/locales/zh-TW/plugin.json
@@ -4,7 +4,9 @@
"function_call": "函式呼叫",
"off": "關閉偵錯",
"on": "查看插件呼叫資訊",
- "response": "回應"
+ "payload": "插件載荷",
+ "response": "回應",
+ "tool_call": "工具呼叫"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "外掛執行中..."
},
"pluginList": "外掛清單",
- "plugins": {
- "loading": "插件檢測中...",
- "unknown": "未知插件"
- },
"setting": "插件設置",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "已安裝"
},
"title": "插件商店"
- }
+ },
+ "unknownPlugin": "未知插件"
}
diff --git a/locales/zh-TW/setting.json b/locales/zh-TW/setting.json
index 2e366c4e22c5..28b743eab6ed 100644
--- a/locales/zh-TW/setting.json
+++ b/locales/zh-TW/setting.json
@@ -2,6 +2,14 @@
"about": {
"title": "關於"
},
+ "agentTab": {
+ "chat": "聊天偏好",
+ "meta": "助手資訊",
+ "modal": "模型設定",
+ "plugin": "外掛程式設定",
+ "prompt": "角色設定",
+ "tts": "語音服務"
+ },
"analytics": {
"telemetry": {
"desc": "通過選擇發送遙測數據,你可以幫助我們改善 LobeChat 整體用戶體驗",
@@ -35,10 +43,14 @@
"title": "設定"
},
"llm": {
+ "apiKey": {
+ "desc": "請填寫您的 {{name}} API 金鑰",
+ "placeholder": "{{name}} API 金鑰",
+ "title": "API 金鑰"
+ },
"checker": {
"button": "檢查",
"desc": "測試 API 金鑰與代理地址是否正確填寫",
- "ollamaDesc": "測試代理地址是否正確填寫",
"pass": "檢查通過",
"title": "連通性檢查"
},
@@ -90,22 +102,19 @@
"latestTime": "上次更新時間:{{time}}",
"noLatestTime": "暫未獲取列表"
},
+ "helpDoc": "配置說明文件",
"modelList": {
"desc": "選擇在會話中展示的模型,選擇的模型會在模型列表中展示",
"placeholder": "請從列表中選擇模型",
"title": "模型列表",
"total": "共 {{count}} 個模型可用"
},
+ "proxyUrl": {
+ "desc": "必須包含 http(s):// 以外的預設地址",
+ "title": "API 代理位址"
+ },
"waitingForMore": "更多模型正在 <1>計劃接入1> 中,敬請期待 ✨"
},
- "ollama": {
- "download": {
- "desc": "Ollama 正在下載該模型,請儘量不要關閉本頁面。重新下載時將會中斷處繼續",
- "remainingTime": "剩餘時間",
- "speed": "下載速度",
- "title": "正在下載模型 {{model}}"
- }
- },
"plugin": {
"addTooltip": "新增自訂外掛程式",
"clearDeprecated": "清除已棄用的外掛",
@@ -171,6 +180,7 @@
"enableHistoryCount": {
"alias": "不限制",
"limited": "只包含 {{number}} 條對話訊息",
+ "setlimited": "設置限制",
"title": "限制歷史訊息數",
"unlimited": "不限歷史訊息數"
},
@@ -356,6 +366,24 @@
"title": "WebRTC 同步"
}
},
+ "systemAgent": {
+ "agentMeta": {
+ "label": "助理元數據生成模型",
+ "modelDesc": "指定用於生成助理名稱、描述、頭像、標籤的模型",
+ "title": "自動生成助理資訊"
+ },
+ "title": "系統助手",
+ "topic": {
+ "label": "話題命名模型",
+ "modelDesc": "指定用於話題自動重命名的模型",
+ "title": "話題自動命名"
+ },
+ "translation": {
+ "label": "翻譯模型",
+ "modelDesc": "指定用於翻譯的模型",
+ "title": "翻譯助手設定"
+ }
+ },
"tab": {
"about": "關於",
"agent": "默認助手",
@@ -363,6 +391,7 @@
"experiment": "實驗",
"llm": "語言模型",
"sync": "雲端同步",
+ "system-agent": "系統助手",
"tts": "語音服務"
},
"tools": {
diff --git a/locales/zh-TW/tool.json b/locales/zh-TW/tool.json
index e9a699f61ceb..b1c3c53689e9 100644
--- a/locales/zh-TW/tool.json
+++ b/locales/zh-TW/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 生成的圖片連結有效期僅1小時,正在快取圖片到本地...",
"generate": "生成",
"generating": "生成中...",
- "images": "圖片:"
+ "images": "圖片:",
+ "prompt": "提示詞"
}
}
diff --git a/netlify.toml b/netlify.toml
index ea68e6250d14..fe71667a3774 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -2,6 +2,8 @@
command = "npm run build"
publish = ".next"
+[build.environment]
+NODE_OPTIONS = "--max_old_space_size=8192"
[template.environment]
OPENAI_API_KEY = "set your OpenAI API Key"
diff --git a/next.config.mjs b/next.config.mjs
index 8914bda07988..64529518ce59 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -60,8 +60,88 @@ const nextConfig = {
},
});
+ // https://github.com/pinojs/pino/issues/688#issuecomment-637763276
+ config.externals.push('pino-pretty');
+
return config;
},
+
+ async headers() {
+ return [
+ {
+ source: '/icons/(.*).(png|jpe?g|gif|svg|ico|webp)',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/images/(.*).(png|jpe?g|gif|svg|ico|webp)',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/videos/(.*).(mp4|webm|ogg|avi|mov|wmv|flv|mkv)',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/screenshots/(.*).(png|jpe?g|gif|svg|ico|webp)',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/og/(.*).(png|jpe?g|gif|svg|ico|webp)',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/favicon.ico',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/favicon-32x32.ico',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ {
+ source: '/apple-touch-icon.png',
+ headers: [
+ {
+ key: 'Cache-Control',
+ value: 'public, max-age=31536000, immutable',
+ },
+ ],
+ },
+ ];
+ },
};
const noWrapper = (config) => config;
@@ -123,4 +203,4 @@ const withSentry =
)
: noWrapper;
-export default withBundleAnalyzer(withPWA(withSentry(nextConfig)));
+export default withBundleAnalyzer(withPWA(withSentry(nextConfig)));
\ No newline at end of file
diff --git a/package.json b/package.json
index 774148d5546b..53f3b2a3edf5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@lobehub/chat",
- "version": "0.155.3",
+ "version": "1.1.6",
"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",
@@ -27,19 +27,26 @@
"sideEffects": false,
"scripts": {
"build": "next build",
- "postbuild": "npm run build-sitemap",
+ "postbuild": "npm run build-sitemap && npm run build-migrate-db",
+ "build-migrate-db": "bun run db:migrate",
"build-sitemap": "next-sitemap --config next-sitemap.config.mjs",
"build:analyze": "ANALYZE=true next build",
"build:docker": "DOCKER=true next build && npm run build-sitemap",
+ "db:generate": "drizzle-kit generate -- dotenv_config_path='.env'",
+ "db:migrate": "MIGRATION_DB=1 tsx scripts/migrateServerDB/index.ts",
+ "db:push": "drizzle-kit push -- dotenv_config_path='.env'",
+ "db:push-test": "NODE_ENV=test drizzle-kit push -- dotenv_config_path='.env'",
+ "db:studio": "drizzle-kit studio",
+ "db:z-pull": "drizzle-kit introspect -- dotenv_config_path='.env'",
"dev": "next dev -p 3010",
"dev:clerk-proxy": "ngrok http http://localhost:3011",
- "docs:i18n": "lobe-i18n md && npm run workflow:docs && npm run lint:mdx",
- "docs:seo": "lobe-seo && npm run workflow:mdx && npm run lint:mdx",
+ "docs:i18n": "lobe-i18n md && npm run lint:mdx",
+ "docs:seo": "lobe-seo && npm run lint:mdx",
"i18n": "npm run workflow:i18n && lobe-i18n",
"lint": "npm run lint:ts && npm run lint:style && npm run type-check && npm run lint:circular",
"lint:circular": "dpdm src/**/*.ts --warning false --tree false --exit-code circular:1 -T true --skip-dynamic-imports circular",
"lint:md": "remark . --quiet --frail --output",
- "lint:mdx": "eslint \"{contributing,docs}/**/*.mdx\" --quiet --fix",
+ "lint:mdx": "npm run workflow:mdx-with-lint && prettier -c --write \"{src,docs}/**/*.mdx\" && npm run workflow:mdx-with-lint",
"lint:style": "stylelint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
"lint:ts": "eslint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
"prepare": "husky",
@@ -48,13 +55,17 @@
"release": "semantic-release",
"start": "next start",
"stylelint": "stylelint \"src/**/*.{js,jsx,ts,tsx}\" --fix",
- "test": "vitest",
- "test:coverage": "vitest run --coverage",
+ "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.server.config.ts",
+ "test-server:coverage": "vitest run --config vitest.server.config.ts --coverage",
"test:update": "vitest -u",
"type-check": "tsc --noEmit",
"workflow:docs": "tsx scripts/docsWorkflow/index.ts",
"workflow:i18n": "tsx scripts/i18nWorkflow/index.ts",
- "workflow:mdx": "tsx scripts/mdxWorkflow/index.ts",
+ "workflow:mdx": "tsx ./scripts/mdxWorkflow/index.ts",
+ "workflow:mdx-with-lint": "tsx ./scripts/mdxWorkflow/index.ts && eslint \"docs/**/*.mdx\" --quiet --fix",
"workflow:readme": "tsx scripts/readmeWorkflow/index.ts"
},
"lint-staged": {
@@ -81,156 +92,173 @@
]
},
"dependencies": {
- "@ant-design/icons": "^5.3.6",
- "@anthropic-ai/sdk": "^0.18.0",
+ "@ant-design/icons": "^5.3.7",
+ "@anthropic-ai/sdk": "^0.24.0",
"@auth/core": "0.28.0",
- "@aws-sdk/client-bedrock-runtime": "^3.565.0",
- "@azure/openai": "^1.0.0-beta.12",
+ "@aws-sdk/client-bedrock-runtime": "^3.600.0",
+ "@aws-sdk/client-s3": "^3.600.0",
+ "@aws-sdk/s3-request-presigner": "^3.600.0",
+ "@azure/openai": "1.0.0-beta.12",
"@cfworker/json-schema": "^1.12.8",
"@clerk/localizations": "2.0.0",
- "@clerk/nextjs": "^5.0.6",
- "@clerk/themes": "^2.0.0",
- "@google/generative-ai": "^0.10.0",
- "@icons-pack/react-simple-icons": "^9.4.1",
- "@lobehub/chat-plugin-sdk": "latest",
- "@lobehub/chat-plugins-gateway": "latest",
- "@lobehub/icons": "latest",
- "@lobehub/tts": "latest",
- "@lobehub/ui": "^1.138.17",
- "@next/third-parties": "^14.2.3",
- "@sentry/nextjs": "^7.112.2",
+ "@clerk/nextjs": "^5.1.6",
+ "@clerk/themes": "^2.1.10",
+ "@google/generative-ai": "^0.13.0",
+ "@icons-pack/react-simple-icons": "^9.5.0",
+ "@khmyznikov/pwa-install": "^0.3.9",
+ "@lobehub/chat-plugin-sdk": "^1.32.3",
+ "@lobehub/chat-plugins-gateway": "^1.9.0",
+ "@lobehub/icons": "^1.23.0",
+ "@lobehub/tts": "^1.24.1",
+ "@lobehub/ui": "^1.144.3",
+ "@microsoft/fetch-event-source": "^2.0.1",
+ "@neondatabase/serverless": "^0.9.3",
+ "@next/third-parties": "^14.2.4",
+ "@sentry/nextjs": "^7.117.0",
"@t3-oss/env-nextjs": "^0.10.1",
"@trpc/client": "next",
"@trpc/next": "next",
"@trpc/server": "next",
- "@vercel/analytics": "^1.2.2",
- "@vercel/speed-insights": "^1.0.10",
- "ahooks": "^3.7.11",
+ "@vercel/analytics": "^1.3.1",
+ "@vercel/speed-insights": "^1.0.12",
+ "ahooks": "^3.8.0",
"ai": "3.0.19",
- "antd": "5.16.5",
+ "antd": "^5.18.3",
"antd-style": "^3.6.2",
- "brotli-wasm": "^3.0.0",
+ "brotli-wasm": "^3.0.1",
"chroma-js": "^2.4.2",
"dayjs": "^1.11.11",
- "debug": "^4.3.4",
+ "debug": "^4.3.5",
"dexie": "^3.2.7",
"diff": "^5.2.0",
+ "drizzle-orm": "^0.31.2",
+ "drizzle-zod": "^0.5.1",
"fast-deep-equal": "^3.1.3",
"gpt-tokenizer": "^2.1.2",
- "i18next": "^23.11.3",
+ "i18next": "^23.11.5",
"i18next-browser-languagedetector": "^7.2.1",
"i18next-resources-to-backend": "^1.2.1",
"idb-keyval": "^6.2.1",
"immer": "^10.1.1",
"ip": "^2.0.1",
- "jose": "^5.2.4",
- "langfuse": "^3.8.0",
- "langfuse-core": "^3.8.0",
+ "jose": "^5.4.1",
+ "langfuse": "^3.12.2",
+ "langfuse-core": "^3.12.2",
"lodash-es": "^4.17.21",
"lucide-react": "latest",
"modern-screenshot": "^4.4.39",
"nanoid": "^5.0.7",
- "next": "^14.2.3",
+ "next": "^14.2.4",
"next-auth": "5.0.0-beta.15",
"next-sitemap": "^4.2.3",
"numeral": "^2.0.6",
- "nuqs": "^1.17.1",
- "ollama": "^0.5.0",
- "openai": "^4.39.0",
- "pino": "^9.0.0",
+ "nuqs": "^1.17.4",
+ "ollama": "^0.5.2",
+ "openai": "^4.52.0",
+ "partial-json": "^0.1.7",
+ "pg": "^8.12.0",
+ "pino": "^9.2.0",
"polished": "^4.3.1",
- "posthog-js": "^1.130.1",
+ "posthog-js": "^1.139.6",
+ "pwa-install-handler": "^2.6.0",
"query-string": "^9.0.0",
"random-words": "^2.0.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-hotkeys-hook": "^4.5.0",
- "react-i18next": "^14.1.1",
+ "react-i18next": "14.0.2",
"react-layout-kit": "^1.9.0",
"react-lazy-load": "^4.0.1",
- "react-virtuoso": "^4.7.10",
- "react-wrap-balancer": "^1.1.0",
+ "react-virtuoso": "^4.7.11",
+ "react-wrap-balancer": "^1.1.1",
"remark": "^14.0.3",
"remark-gfm": "^3.0.1",
"remark-html": "^15.0.2",
+ "resolve-accept-language": "^3.1.4",
"rtl-detect": "^1.1.2",
- "semver": "^7.6.0",
- "sharp": "^0.33.3",
+ "semver": "^7.6.2",
+ "sharp": "^0.33.4",
"superjson": "^2.2.1",
+ "svix": "^1.24.0",
"swr": "^2.2.5",
"systemjs": "^6.15.1",
"ts-md5": "^1.3.1",
- "ua-parser-js": "^1.0.37",
+ "ua-parser-js": "^1.0.38",
"url-join": "^5.0.0",
"use-merge-value": "^1.2.0",
"utility-types": "^3.11.0",
- "uuid": "^9.0.1",
+ "uuid": "^10.0.0",
+ "ws": "^8.17.1",
"y-protocols": "^1.0.6",
"y-webrtc": "^10.3.0",
- "yaml": "^2.4.2",
- "yjs": "^13.6.15",
- "zod": "^3.23.5",
+ "yaml": "^2.4.5",
+ "yjs": "^13.6.18",
+ "zod": "^3.23.8",
"zustand": "^4.5.2",
"zustand-utils": "^1.3.2"
},
"devDependencies": {
"@commitlint/cli": "^19.3.0",
- "@ducanh2912/next-pwa": "^10.2.6",
+ "@ducanh2912/next-pwa": "^10.2.7",
"@edge-runtime/vm": "^3.2.0",
"@lobehub/i18n-cli": "^1.18.1",
"@lobehub/lint": "^1.23.4",
"@lobehub/seo-cli": "^1.4.1",
- "@next/bundle-analyzer": "^14.2.3",
- "@next/eslint-plugin-next": "^14.2.3",
- "@peculiar/webcrypto": "^1.4.6",
- "@testing-library/jest-dom": "^6.4.5",
- "@testing-library/react": "^15.0.6",
+ "@next/bundle-analyzer": "^14.2.4",
+ "@next/eslint-plugin-next": "^14.2.4",
+ "@peculiar/webcrypto": "^1.5.0",
+ "@testing-library/jest-dom": "^6.4.6",
+ "@testing-library/react": "^16.0.0",
"@types/chroma-js": "^2.4.4",
"@types/debug": "^4.1.12",
- "@types/diff": "^5.2.0",
+ "@types/diff": "^5.2.1",
"@types/ip": "^1.1.3",
"@types/json-schema": "^7.0.15",
- "@types/lodash": "^4.17.0",
+ "@types/lodash": "^4.17.5",
"@types/lodash-es": "^4.17.12",
- "@types/node": "^20.12.7",
+ "@types/node": "^20.14.6",
"@types/numeral": "^2.0.5",
- "@types/react": "^18.3.1",
+ "@types/pg": "^8.11.6",
+ "@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@types/rtl-detect": "^1.0.3",
"@types/semver": "^7.5.8",
"@types/systemjs": "^6.13.5",
"@types/ua-parser-js": "^0.7.39",
- "@types/uuid": "^9.0.8",
- "@umijs/lint": "^4.1.10",
+ "@types/uuid": "^10.0.0",
+ "@types/ws": "^8.5.10",
+ "@umijs/lint": "^4.2.13",
"@vitest/coverage-v8": "~1.2.2",
"ajv-keywords": "^5.1.0",
"commitlint": "^19.3.0",
"consola": "^3.2.3",
+ "dotenv": "^16.4.5",
"dpdm": "^3.14.0",
+ "drizzle-kit": "^0.22.7",
"eslint": "^8.57.0",
"eslint-plugin-mdx": "^2.3.4",
- "fake-indexeddb": "^5.0.2",
- "glob": "^10.3.12",
+ "fake-indexeddb": "^6.0.0",
+ "glob": "^10.4.2",
"gray-matter": "^4.0.3",
- "happy-dom": "^14.7.1",
+ "happy-dom": "^14.12.0",
"husky": "^9.0.11",
"just-diff": "^6.0.2",
- "lint-staged": "^15.2.2",
+ "lint-staged": "^15.2.7",
"lodash": "^4.17.21",
"markdown-table": "^3.0.3",
"node-fetch": "^3.3.2",
"node-gyp": "^10.1.0",
"p-map": "^7.0.2",
- "prettier": "^3.2.5",
+ "prettier": "^3.3.2",
"remark-cli": "^11.0.0",
"remark-parse": "^10.0.2",
"semantic-release": "^21.1.2",
"stylelint": "^15.11.0",
- "tsx": "^4.7.3",
- "typescript": "^5.4.5",
- "unified": "^11.0.4",
+ "tsx": "^4.15.6",
+ "typescript": "^5.5.2",
+ "unified": "^11.0.5",
"unist-util-visit": "^5.0.0",
- "vite": "^5.2.10",
+ "vite": "^5.3.1",
"vitest": "~1.2.2",
"vitest-canvas-mock": "^0.3.3"
},
diff --git a/public/icons/apple-touch-icon.png b/public/apple-touch-icon.png
similarity index 100%
rename from public/icons/apple-touch-icon.png
rename to public/apple-touch-icon.png
diff --git a/public/icons/maskable-icon-192x192.png b/public/icons/icon-192x192.maskable.png
similarity index 100%
rename from public/icons/maskable-icon-192x192.png
rename to public/icons/icon-192x192.maskable.png
diff --git a/public/icons/maskable-icon-512x512.png b/public/icons/icon-512x512.maskable.png
similarity index 100%
rename from public/icons/maskable-icon-512x512.png
rename to public/icons/icon-512x512.maskable.png
diff --git a/public/manifest.json b/public/manifest.json
index 452614090a44..0fca79133299 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,61 +1,166 @@
{
"background_color": "#000000",
- "description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
+ "cache_busting_mode": "all",
+ "categories": ["productivity", "design", "development", "education"],
+ "description": "Personal LLM productivity tool, brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude WebUI. Customize AI assistant features flexibly according to personalized needs to solve problems, enhance productivity, and explore future workflow in LobeChat.",
"display": "standalone",
+ "display_override": ["tabbed"],
+ "edge_side_panel": {
+ "preferred_width": 480
+ },
+ "handle_links": "auto",
"icons": [
{
- "src": "/icons/icon-192x192.png",
+ "src": "/icons/icon-192x192.png?v=1",
"sizes": "192x192",
"type": "image/png",
- "purpose": "any"
+ "purpose": "any",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/icons/maskable-icon-192x192.png",
+ "src": "/icons/icon-192x192.maskable.png?v=1",
"sizes": "192x192",
"type": "image/png",
- "purpose": "maskable"
+ "purpose": "maskable",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/icons/icon-512x512.png",
+ "src": "/icons/icon-512x512.png?v=1",
"sizes": "512x512",
"type": "image/png",
- "purpose": "any"
+ "purpose": "any",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/icons/maskable-icon-512x512.png",
+ "src": "/icons/icon-512x512.maskable.png?v=1",
"sizes": "512x512",
"type": "image/png",
- "purpose": "maskable"
+ "purpose": "maskable",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
}
],
- "id": "/",
+ "id": "lobe-chat",
+ "immutable": "true",
+ "launch_handler": {
+ "client_mode": ["navigate-existing", "auto"]
+ },
+ "max_age": 31536000,
"name": "LobeChat",
"orientation": "portrait",
+ "related_applications": [
+ {
+ "platform": "webapp",
+ "url": "https://chat-preview.lobehub.com/manifest.json"
+ }
+ ],
"scope": "/",
"screenshots": [
{
- "src": "/screenshots/screenshot-1.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-1.mobile.png?v=1",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-2.mobile.png?v=1",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-3.mobile.png?v=1",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-4.mobile.png?v=1",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-5.mobile.png?v=1",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/screenshots/screenshot-2.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-1.desktop.png?v=1",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/screenshots/screenshot-3.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-2.desktop.png?v=1",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
},
{
- "src": "/screenshots/screenshot-4.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-3.desktop.png?v=1",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-4.desktop.png?v=1",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
+ },
+ {
+ "src": "/screenshots/shot-5.desktop.png?v=1",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide",
+ "cache_busting_mode": "query",
+ "max_age": 31536000,
+ "immutable": "true"
}
],
"short_name": "LobeChat",
"splash_pages": null,
"start_url": ".",
+ "tab_strip": {
+ "new_tab_button": {
+ "url": "/"
+ }
+ },
"theme_color": "#000000"
}
diff --git a/public/og/cover.png b/public/og/cover.png
new file mode 100644
index 000000000000..4c9ed9455155
Binary files /dev/null and b/public/og/cover.png differ
diff --git a/public/screenshots/screenshot-1.png b/public/screenshots/screenshot-1.png
deleted file mode 100644
index 207e57fb4d72..000000000000
Binary files a/public/screenshots/screenshot-1.png and /dev/null differ
diff --git a/public/screenshots/screenshot-2.png b/public/screenshots/screenshot-2.png
deleted file mode 100644
index a6f9d3e95ddb..000000000000
Binary files a/public/screenshots/screenshot-2.png and /dev/null differ
diff --git a/public/screenshots/screenshot-3.png b/public/screenshots/screenshot-3.png
deleted file mode 100644
index 170597363382..000000000000
Binary files a/public/screenshots/screenshot-3.png and /dev/null differ
diff --git a/public/screenshots/screenshot-4.png b/public/screenshots/screenshot-4.png
deleted file mode 100644
index 4772d31ec990..000000000000
Binary files a/public/screenshots/screenshot-4.png and /dev/null differ
diff --git a/public/screenshots/shot-1.desktop.png b/public/screenshots/shot-1.desktop.png
new file mode 100644
index 000000000000..9c28b281c179
Binary files /dev/null and b/public/screenshots/shot-1.desktop.png differ
diff --git a/public/screenshots/shot-1.mobile.png b/public/screenshots/shot-1.mobile.png
new file mode 100644
index 000000000000..a6c437e04c7e
Binary files /dev/null and b/public/screenshots/shot-1.mobile.png differ
diff --git a/public/screenshots/shot-2.desktop.png b/public/screenshots/shot-2.desktop.png
new file mode 100644
index 000000000000..8a61f16c503d
Binary files /dev/null and b/public/screenshots/shot-2.desktop.png differ
diff --git a/public/screenshots/shot-2.mobile.png b/public/screenshots/shot-2.mobile.png
new file mode 100644
index 000000000000..dbaabc4f2146
Binary files /dev/null and b/public/screenshots/shot-2.mobile.png differ
diff --git a/public/screenshots/shot-3.desktop.png b/public/screenshots/shot-3.desktop.png
new file mode 100644
index 000000000000..c1046fc7e0c1
Binary files /dev/null and b/public/screenshots/shot-3.desktop.png differ
diff --git a/public/screenshots/shot-3.mobile.png b/public/screenshots/shot-3.mobile.png
new file mode 100644
index 000000000000..e4bf5b225738
Binary files /dev/null and b/public/screenshots/shot-3.mobile.png differ
diff --git a/public/screenshots/shot-4.desktop.png b/public/screenshots/shot-4.desktop.png
new file mode 100644
index 000000000000..e6f0cc27864d
Binary files /dev/null and b/public/screenshots/shot-4.desktop.png differ
diff --git a/public/screenshots/shot-4.mobile.png b/public/screenshots/shot-4.mobile.png
new file mode 100644
index 000000000000..a6baa107a8e5
Binary files /dev/null and b/public/screenshots/shot-4.mobile.png differ
diff --git a/public/screenshots/shot-5.desktop.png b/public/screenshots/shot-5.desktop.png
new file mode 100644
index 000000000000..e38a8cdb7020
Binary files /dev/null and b/public/screenshots/shot-5.desktop.png differ
diff --git a/public/screenshots/shot-5.mobile.png b/public/screenshots/shot-5.mobile.png
new file mode 100644
index 000000000000..5eb8ad43fb9d
Binary files /dev/null and b/public/screenshots/shot-5.mobile.png differ
diff --git a/public/videos/feedback.mp4 b/public/videos/feedback.mp4
new file mode 100644
index 000000000000..4b4a1f1e8f67
Binary files /dev/null and b/public/videos/feedback.mp4 differ
diff --git a/public/videos/star.mp4 b/public/videos/star.mp4
new file mode 100644
index 000000000000..55dd8d5f003b
Binary files /dev/null and b/public/videos/star.mp4 differ
diff --git a/scripts/i18nWorkflow/utils.ts b/scripts/i18nWorkflow/utils.ts
index 95c2d2a997f6..bf5571817d97 100644
--- a/scripts/i18nWorkflow/utils.ts
+++ b/scripts/i18nWorkflow/utils.ts
@@ -10,12 +10,9 @@ export const readJSON = (filePath: string) => {
return JSON.parse(data);
};
-export const replaceAssistantToAgent = (text: string) =>
- text.replaceAll('assistant', 'agent').replaceAll('Assistant', 'Agent');
-
export const writeJSON = (filePath: string, data: any) => {
const jsonStr = JSON.stringify(data, null, 2);
- writeFileSync(filePath, replaceAssistantToAgent(jsonStr), 'utf8');
+ writeFileSync(filePath, jsonStr, 'utf8');
};
export const genResourcesContent = (locales: string[]) => {
diff --git a/scripts/migrateServerDB/index.ts b/scripts/migrateServerDB/index.ts
new file mode 100644
index 000000000000..d57e051b0bfe
--- /dev/null
+++ b/scripts/migrateServerDB/index.ts
@@ -0,0 +1,32 @@
+import * as dotenv from 'dotenv';
+import * as migrator from 'drizzle-orm/neon-serverless/migrator';
+import { join } from 'node:path';
+
+import { serverDB } from '../../src/database/server/core/db';
+
+// Read the `.env` file if it exists, or a file specified by the
+// dotenv_config_path parameter that's passed to Node.js
+dotenv.config();
+
+const runMigrations = async () => {
+ await migrator.migrate(serverDB, {
+ migrationsFolder: join(__dirname, '../../src/database/server/migrations'),
+ });
+ console.log('✅ database migration pass.');
+ // eslint-disable-next-line unicorn/no-process-exit
+ process.exit(0);
+};
+
+let connectionString = process.env.DATABASE_URL;
+
+// only migrate database if the connection string is available
+if (connectionString) {
+ // eslint-disable-next-line unicorn/prefer-top-level-await
+ runMigrations().catch((err) => {
+ console.error('❌ Database migrate failed:', err);
+ // eslint-disable-next-line unicorn/no-process-exit
+ process.exit(1);
+ });
+} else {
+ console.log('🟢 not find database env, migration skipped');
+}
diff --git a/src/app/(auth)/login/[[...login]]/PageTitle.tsx b/src/app/(auth)/login/[[...login]]/PageTitle.tsx
deleted file mode 100644
index 79cfdf3c830a..000000000000
--- a/src/app/(auth)/login/[[...login]]/PageTitle.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import PageTitle from '@/components/PageTitle';
-
-const Title = memo(() => {
- const { t } = useTranslation('auth');
-
- return ;
-});
-export default Title;
diff --git a/src/app/(auth)/login/[[...login]]/page.tsx b/src/app/(auth)/login/[[...login]]/page.tsx
index 2f819cafa1b3..2598f4250eb7 100644
--- a/src/app/(auth)/login/[[...login]]/page.tsx
+++ b/src/app/(auth)/login/[[...login]]/page.tsx
@@ -1,14 +1,21 @@
import { SignIn } from '@clerk/nextjs';
-import PageTitle from './PageTitle';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('signIn.start.subtitle'),
+ title: t('signIn.start.title', { applicationName: 'LobeChat' }),
+ url: '/login',
+ });
+};
const Page = () => {
- return (
- <>
-
-
- >
- );
+ return ;
};
+Page.displayName = 'Login';
+
export default Page;
diff --git a/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx b/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx
deleted file mode 100644
index a0924ce20997..000000000000
--- a/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import PageTitle from '@/components/PageTitle';
-
-const Title = memo(() => {
- const { t } = useTranslation('auth');
-
- return ;
-});
-export default Title;
diff --git a/src/app/(auth)/profile/[[...slugs]]/page.tsx b/src/app/(auth)/profile/[[...slugs]]/page.tsx
deleted file mode 100644
index 506df1465ea8..000000000000
--- a/src/app/(auth)/profile/[[...slugs]]/page.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { UserProfile } from '@clerk/nextjs';
-
-import PageTitle from './PageTitle';
-
-const Page = () => {
- return (
- <>
-
-
- >
- );
-};
-
-export default Page;
diff --git a/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx b/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx
deleted file mode 100644
index a0924ce20997..000000000000
--- a/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import PageTitle from '@/components/PageTitle';
-
-const Title = memo(() => {
- const { t } = useTranslation('auth');
-
- return ;
-});
-export default Title;
diff --git a/src/app/(auth)/signup/[[...signup]]/page.tsx b/src/app/(auth)/signup/[[...signup]]/page.tsx
index b1913f71e2a2..eeac0953592a 100644
--- a/src/app/(auth)/signup/[[...signup]]/page.tsx
+++ b/src/app/(auth)/signup/[[...signup]]/page.tsx
@@ -1,14 +1,21 @@
import { SignUp } from '@clerk/nextjs';
-import PageTitle from './PageTitle';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('signUp.start.subtitle'),
+ title: t('signUp.start.title'),
+ url: '/signup',
+ });
+};
const Page = () => {
- return (
- <>
-
-
- >
- );
+ return ;
};
+Page.displayName = 'SignUp';
+
export default Page;
diff --git a/src/app/(loading)/Redirect.tsx b/src/app/(loading)/Redirect.tsx
index a870646ad84b..bc7551fc9501 100644
--- a/src/app/(loading)/Redirect.tsx
+++ b/src/app/(loading)/Redirect.tsx
@@ -3,27 +3,47 @@
import { useRouter } from 'next/navigation';
import { memo, useEffect } from 'react';
-import { messageService } from '@/services/message';
-import { sessionService } from '@/services/session';
-
-const checkHasConversation = async () => {
- const hasMessages = await messageService.hasMessages();
- const hasAgents = await sessionService.hasSessions();
- return hasMessages || hasAgents;
-};
+import { useUserStore } from '@/store/user';
+import { authSelectors } from '@/store/user/selectors';
const Redirect = memo(() => {
const router = useRouter();
+ const [isLogin, isLoaded, isUserStateInit, isUserHasConversation, isOnboard] = useUserStore(
+ (s) => [
+ authSelectors.isLogin(s),
+ authSelectors.isLoaded(s),
+ s.isUserStateInit,
+ s.isUserHasConversation,
+ s.isOnboard,
+ ],
+ );
useEffect(() => {
- checkHasConversation().then((hasData) => {
- if (hasData) {
- router.replace('/chat');
- } else {
- router.replace('/welcome');
- }
- });
- }, []);
+ // if user auth state is not ready, wait for loading
+ if (!isLoaded) return;
+
+ // this mean user is definitely not login
+ if (!isLogin) {
+ router.replace('/welcome');
+ return;
+ }
+
+ // if user state not init, wait for loading
+ if (!isUserStateInit) return;
+
+ // user need to onboard
+ if (!isOnboard) {
+ router.replace('/onboard');
+ return;
+ }
+
+ // finally check the conversation status
+ if (isUserHasConversation) {
+ router.replace('/chat');
+ } else {
+ router.replace('/welcome');
+ }
+ }, [isUserStateInit, isLoaded, isUserHasConversation, isOnboard, isLogin]);
return null;
});
diff --git a/src/app/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx b/src/app/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx
new file mode 100644
index 000000000000..50d5f5da0ba5
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx
@@ -0,0 +1,80 @@
+import { act, render, screen } from '@testing-library/react';
+import { afterEach, describe, expect, it, vi } from 'vitest';
+
+import { useUserStore } from '@/store/user';
+
+import UserBanner from '../features/UserBanner';
+
+// Mock dependencies
+vi.mock('next/navigation', () => ({
+ useRouter: vi.fn(() => ({
+ push: vi.fn(),
+ })),
+}));
+
+vi.mock('@/features/User/UserInfo', () => ({
+ default: vi.fn(() => Mocked UserInfo
),
+}));
+
+vi.mock('@/features/User/DataStatistics', () => ({
+ default: vi.fn(() => Mocked DataStatistics
),
+}));
+
+vi.mock('@/features/User/UserLoginOrSignup/Community', () => ({
+ default: vi.fn(() => Mocked UserLoginOrSignup
),
+}));
+
+// 定义一个变量来存储 enableAuth 的值
+let enableAuth = true;
+
+// 模拟 @/const/auth 模块
+vi.mock('@/const/auth', () => ({
+ get enableAuth() {
+ return enableAuth;
+ },
+}));
+
+afterEach(() => {
+ enableAuth = true;
+});
+
+describe('UserBanner', () => {
+ it('should render UserInfo and DataStatistics when auth is disabled', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: false });
+ });
+ enableAuth = false;
+
+ render( );
+
+ expect(screen.getByText('Mocked UserInfo')).toBeInTheDocument();
+ expect(screen.getByText('Mocked DataStatistics')).toBeInTheDocument();
+ expect(screen.queryByText('Mocked UserLoginOrSignup')).not.toBeInTheDocument();
+ });
+
+ it('should render UserInfo and DataStatistics when user is logged in with auth enabled', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: true });
+ });
+ enableAuth = true;
+
+ render( );
+
+ expect(screen.getByText('Mocked UserInfo')).toBeInTheDocument();
+ expect(screen.getByText('Mocked DataStatistics')).toBeInTheDocument();
+ expect(screen.queryByText('Mocked UserLoginOrSignup')).not.toBeInTheDocument();
+ });
+
+ it('should render UserLoginOrSignup when user is not logged in with auth enabled', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: false });
+ });
+ enableAuth = true;
+
+ render( );
+
+ expect(screen.getByText('Mocked UserLoginOrSignup')).toBeInTheDocument();
+ expect(screen.queryByText('Mocked UserInfo')).not.toBeInTheDocument();
+ expect(screen.queryByText('Mocked DataStatistics')).not.toBeInTheDocument();
+ });
+});
diff --git a/src/app/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx b/src/app/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx
new file mode 100644
index 000000000000..3f27dcd742c0
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx
@@ -0,0 +1,116 @@
+import { act, renderHook } from '@testing-library/react';
+import { describe, expect, it, vi } from 'vitest';
+
+import { useUserStore } from '@/store/user';
+
+import { useCategory } from '../features/useCategory';
+
+// Mock dependencies
+vi.mock('next/navigation', () => ({
+ useRouter: vi.fn(() => ({
+ push: vi.fn(),
+ })),
+}));
+
+vi.mock('react-i18next', () => ({
+ useTranslation: vi.fn(() => ({
+ t: vi.fn((key) => key),
+ })),
+}));
+
+vi.mock('../../settings/features/useCategory', () => ({
+ useCategory: vi.fn(() => [{ key: 'extraSetting', label: 'Extra Setting' }]),
+}));
+
+// 定义一个变量来存储 enableAuth 的值
+let enableAuth = true;
+let enableClerk = true;
+// 模拟 @/const/auth 模块
+vi.mock('@/const/auth', () => ({
+ get enableAuth() {
+ return enableAuth;
+ },
+ get enableClerk() {
+ return enableClerk;
+ },
+}));
+
+afterEach(() => {
+ enableAuth = true;
+ enableClerk = true;
+});
+
+describe('useCategory', () => {
+ it('should return correct items when the user is logged in with authentication', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: true });
+ });
+ enableAuth = true;
+ enableClerk = false;
+
+ const { result } = renderHook(() => useCategory());
+
+ act(() => {
+ const items = result.current;
+ expect(items.some((item) => item.key === 'profile')).toBe(false);
+ expect(items.some((item) => item.key === 'setting')).toBe(true);
+ expect(items.some((item) => item.key === 'data')).toBe(true);
+ expect(items.some((item) => item.key === 'docs')).toBe(true);
+ expect(items.some((item) => item.key === 'feedback')).toBe(true);
+ expect(items.some((item) => item.key === 'discord')).toBe(true);
+ });
+ });
+
+ it('should return correct items when the user is logged in with Clerk', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: true });
+ });
+ enableAuth = true;
+ enableClerk = true;
+
+ const { result } = renderHook(() => useCategory());
+
+ act(() => {
+ const items = result.current;
+ expect(items.some((item) => item.key === 'profile')).toBe(true);
+ expect(items.some((item) => item.key === 'setting')).toBe(true);
+ expect(items.some((item) => item.key === 'data')).toBe(true);
+ expect(items.some((item) => item.key === 'docs')).toBe(true);
+ expect(items.some((item) => item.key === 'feedback')).toBe(true);
+ expect(items.some((item) => item.key === 'discord')).toBe(true);
+ });
+ });
+
+ it('should return correct items when the user is not logged in', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: false });
+ });
+ enableAuth = true;
+
+ const { result } = renderHook(() => useCategory());
+
+ act(() => {
+ const items = result.current;
+ expect(items.some((item) => item.key === 'profile')).toBe(false);
+ expect(items.some((item) => item.key === 'setting')).toBe(false);
+ expect(items.some((item) => item.key === 'data')).toBe(false);
+ expect(items.some((item) => item.key === 'docs')).toBe(true);
+ expect(items.some((item) => item.key === 'feedback')).toBe(true);
+ expect(items.some((item) => item.key === 'discord')).toBe(true);
+ });
+ });
+
+ it('should handle settings for non-authenticated users', () => {
+ act(() => {
+ useUserStore.setState({ isSignedIn: false });
+ });
+ enableAuth = false;
+
+ const { result } = renderHook(() => useCategory());
+
+ act(() => {
+ const items = result.current;
+ expect(items.some((item) => item.key === 'extraSetting')).toBe(true);
+ });
+ });
+});
diff --git a/src/app/(main)/(mobile)/me/(home)/features/Category.tsx b/src/app/(main)/(mobile)/me/(home)/features/Category.tsx
new file mode 100644
index 000000000000..3e47083a7f5e
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/features/Category.tsx
@@ -0,0 +1,15 @@
+'use client';
+
+import { memo } from 'react';
+
+import Cell from '@/components/Cell';
+
+import { useCategory } from './useCategory';
+
+const Category = memo(() => {
+ const items = useCategory();
+
+ return items?.map((item, index) => | );
+});
+
+export default Category;
diff --git a/src/app/(main)/(mobile)/me/features/Header.tsx b/src/app/(main)/(mobile)/me/(home)/features/Header.tsx
similarity index 62%
rename from src/app/(main)/(mobile)/me/features/Header.tsx
rename to src/app/(main)/(mobile)/me/(home)/features/Header.tsx
index 65e13b8308f4..c37ede634f09 100644
--- a/src/app/(main)/(mobile)/me/features/Header.tsx
+++ b/src/app/(main)/(mobile)/me/(home)/features/Header.tsx
@@ -1,35 +1,28 @@
'use client';
import { ActionIcon, MobileNavBar } from '@lobehub/ui';
-import { useScroll } from 'ahooks';
import { useTheme } from 'antd-style';
import { Moon, Sun } from 'lucide-react';
import { memo } from 'react';
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
import { useUserStore } from '@/store/user';
-import { mobileHeaderFixed } from '@/styles/mobileHeader';
+import { mobileHeaderSticky } from '@/styles/mobileHeader';
const Header = memo(() => {
const theme = useTheme();
- const scroll = useScroll(() => document.querySelector('#lobe-mobile-scroll-container'));
const switchThemeMode = useUserStore((s) => s.switchThemeMode);
- const showBackground = (scroll as any)?.top > 44;
return (
switchThemeMode(theme.isDarkMode ? 'light' : 'dark')}
size={MOBILE_HEADER_ICON_SIZE}
/>
}
- style={{
- ...mobileHeaderFixed,
- background: showBackground ? undefined : 'transparent',
- }}
+ style={mobileHeaderSticky}
/>
);
});
diff --git a/src/app/(main)/(mobile)/me/(home)/features/UserBanner.tsx b/src/app/(main)/(mobile)/me/(home)/features/UserBanner.tsx
new file mode 100644
index 000000000000..be2ed12e6618
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/features/UserBanner.tsx
@@ -0,0 +1,37 @@
+'use client';
+
+import { useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+import { enableAuth } from '@/const/auth';
+import DataStatistics from '@/features/User/DataStatistics';
+import UserInfo from '@/features/User/UserInfo';
+import UserLoginOrSignup from '@/features/User/UserLoginOrSignup/Community';
+import { useUserStore } from '@/store/user';
+import { authSelectors } from '@/store/user/selectors';
+
+const UserBanner = memo(() => {
+ const router = useRouter();
+ const isLoginWithAuth = useUserStore(authSelectors.isLoginWithAuth);
+
+ return (
+
+ {!enableAuth ? (
+ <>
+
+
+ >
+ ) : isLoginWithAuth ? (
+ <>
+ router.push('/me/profile')} />
+
+ >
+ ) : (
+ router.push('/login')} />
+ )}
+
+ );
+});
+
+export default UserBanner;
diff --git a/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx b/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx
new file mode 100644
index 000000000000..8cb3b96adcd0
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx
@@ -0,0 +1,118 @@
+import { DiscordIcon } from '@lobehub/ui';
+import { Book, CircleUserRound, Database, Download, Feather, Settings2 } from 'lucide-react';
+import { useRouter } from 'next/navigation';
+import { useTranslation } from 'react-i18next';
+
+import { CellProps } from '@/components/Cell';
+import { enableAuth } from '@/const/auth';
+import { DISCORD, DOCUMENTS, FEEDBACK } from '@/const/url';
+import { isServerMode } from '@/const/version';
+import { usePWAInstall } from '@/hooks/usePWAInstall';
+import { useUserStore } from '@/store/user';
+import { authSelectors } from '@/store/user/slices/auth/selectors';
+
+import { useCategory as useSettingsCategory } from '../../settings/features/useCategory';
+
+export const useCategory = () => {
+ const router = useRouter();
+ const { canInstall, install } = usePWAInstall();
+ const { t } = useTranslation(['common', 'setting', 'auth']);
+ const [isLogin, isLoginWithAuth, isLoginWithClerk] = useUserStore((s) => [
+ authSelectors.isLogin(s),
+ authSelectors.isLoginWithAuth(s),
+ authSelectors.isLoginWithClerk(s),
+ ]);
+
+ const profile: CellProps[] = [
+ {
+ icon: CircleUserRound,
+ key: 'profile',
+ label: t('userPanel.profile'),
+ onClick: () => router.push('/me/profile'),
+ },
+ ];
+
+ const settings: CellProps[] = [
+ {
+ icon: Settings2,
+ key: 'setting',
+ label: t('userPanel.setting'),
+ onClick: () => router.push('/me/settings'),
+ },
+ {
+ type: 'divider',
+ },
+ ];
+
+ const pwa: CellProps[] = [
+ {
+ icon: Download,
+ key: 'pwa',
+ label: t('installPWA'),
+ onClick: () => install(),
+ },
+ {
+ type: 'divider',
+ },
+ ];
+
+ const settingsWithoutAuth = [
+ ...useSettingsCategory(),
+ {
+ type: 'divider',
+ },
+ ];
+
+ /* ↓ cloud slot ↓ */
+
+ /* ↑ cloud slot ↑ */
+
+ const data: CellProps[] = [
+ {
+ icon: Database,
+ key: 'data',
+ label: t('userPanel.data'),
+ onClick: () => router.push('/me/data'),
+ },
+ {
+ type: 'divider',
+ },
+ ];
+
+ const helps: CellProps[] = [
+ {
+ icon: Book,
+ key: 'docs',
+ label: t('document'),
+ onClick: () => window.open(DOCUMENTS, '__blank'),
+ },
+ {
+ icon: Feather,
+ key: 'feedback',
+ label: t('feedback'),
+ onClick: () => window.open(FEEDBACK, '__blank'),
+ },
+ {
+ icon: DiscordIcon,
+ key: 'discord',
+ label: 'Discord',
+ onClick: () => window.open(DISCORD, '__blank'),
+ },
+ ];
+
+ const mainItems = [
+ {
+ type: 'divider',
+ },
+ ...(isLoginWithClerk ? profile : []),
+ ...(enableAuth ? (isLoginWithAuth ? settings : []) : settingsWithoutAuth),
+ /* ↓ cloud slot ↓ */
+
+ /* ↑ cloud slot ↑ */
+ ...(canInstall ? pwa : []),
+ ...(isLogin && !isServerMode ? data : []),
+ ...helps,
+ ].filter(Boolean) as CellProps[];
+
+ return mainItems;
+};
diff --git a/src/app/(main)/(mobile)/me/layout.tsx b/src/app/(main)/(mobile)/me/(home)/layout.tsx
similarity index 100%
rename from src/app/(main)/(mobile)/me/layout.tsx
rename to src/app/(main)/(mobile)/me/(home)/layout.tsx
diff --git a/src/app/(main)/(mobile)/me/loading.tsx b/src/app/(main)/(mobile)/me/(home)/loading.tsx
similarity index 74%
rename from src/app/(main)/(mobile)/me/loading.tsx
rename to src/app/(main)/(mobile)/me/(home)/loading.tsx
index eacbe24611ed..5db1a97cc46e 100644
--- a/src/app/(main)/(mobile)/me/loading.tsx
+++ b/src/app/(main)/(mobile)/me/(home)/loading.tsx
@@ -7,21 +7,10 @@ import { Flexbox } from 'react-layout-kit';
import Divider from '@/components/Cell/Divider';
import SkeletonLoading from '@/components/SkeletonLoading';
-import { useStyles } from './features/style';
-
const Loading = memo(() => {
- const { styles } = useStyles();
return (
<>
-
-
+
diff --git a/src/app/(main)/(mobile)/me/(home)/page.tsx b/src/app/(main)/(mobile)/me/(home)/page.tsx
new file mode 100644
index 000000000000..5db1e3f08408
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/(home)/page.tsx
@@ -0,0 +1,38 @@
+import { redirect } from 'next/navigation';
+import { Center } from 'react-layout-kit';
+
+import BrandWatermark from '@/components/BrandWatermark';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import Category from './features/Category';
+import UserBanner from './features/UserBanner';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('common');
+ return metadataModule.generate({
+ title: t('tab.me'),
+ url: '/me',
+ });
+};
+
+const Page = () => {
+ const mobile = isMobileDevice();
+
+ if (!mobile) return redirect('/chat');
+
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+};
+
+Page.displayName = 'Me';
+
+export default Page;
diff --git a/src/app/(main)/(mobile)/me/data/features/Category.tsx b/src/app/(main)/(mobile)/me/data/features/Category.tsx
new file mode 100644
index 000000000000..174d1bf0b0f4
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/data/features/Category.tsx
@@ -0,0 +1,48 @@
+'use client';
+
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import Cell, { CellProps } from '@/components/Cell';
+import DataImporter from '@/features/DataImporter';
+import { configService } from '@/services/config';
+
+const Category = memo(() => {
+ const { t } = useTranslation('common');
+ const items: CellProps[] = [
+ {
+ key: 'allAgent',
+ label: t('exportType.allAgent'),
+ onClick: configService.exportAgents,
+ },
+ {
+ key: 'allAgentWithMessage',
+ label: t('exportType.allAgentWithMessage'),
+ onClick: configService.exportSessions,
+ },
+ {
+ key: 'globalSetting',
+ label: t('exportType.globalSetting'),
+ onClick: configService.exportSettings,
+ },
+ {
+ type: 'divider',
+ },
+ {
+ key: 'all',
+ label: t('exportType.all'),
+ onClick: configService.exportAll,
+ },
+ {
+ type: 'divider',
+ },
+ {
+ key: 'import',
+ label: {t('import')} ,
+ },
+ ];
+
+ return items?.map((item, index) => | );
+});
+
+export default Category;
diff --git a/src/app/(main)/(mobile)/me/data/features/Header.tsx b/src/app/(main)/(mobile)/me/data/features/Header.tsx
new file mode 100644
index 000000000000..cb84f379dcf6
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/data/features/Header.tsx
@@ -0,0 +1,33 @@
+'use client';
+
+import { MobileNavBar, MobileNavBarTitle } from '@lobehub/ui';
+import { useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import { mobileHeaderSticky } from '@/styles/mobileHeader';
+
+const Header = memo(() => {
+ const { t } = useTranslation('common');
+
+ const router = useRouter();
+ return (
+
+ {t('userPanel.data')}
+
+ }
+ />
+ }
+ onBackClick={() => router.push('/me')}
+ showBackButton
+ style={mobileHeaderSticky}
+ />
+ );
+});
+
+export default Header;
diff --git a/src/app/(main)/(mobile)/me/data/layout.tsx b/src/app/(main)/(mobile)/me/data/layout.tsx
new file mode 100644
index 000000000000..6e2a2f2c498a
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/data/layout.tsx
@@ -0,0 +1,13 @@
+import { PropsWithChildren } from 'react';
+
+import MobileContentLayout from '@/components/server/MobileNavLayout';
+
+import Header from './features/Header';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ return }>{children};
+};
+
+Layout.displayName = 'MeDataLayout';
+
+export default Layout;
diff --git a/src/app/(main)/(mobile)/me/data/loading.tsx b/src/app/(main)/(mobile)/me/data/loading.tsx
new file mode 100644
index 000000000000..b14417168468
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/data/loading.tsx
@@ -0,0 +1,5 @@
+import SkeletonLoading from '@/components/SkeletonLoading';
+
+export default () => {
+ return ;
+};
diff --git a/src/app/(main)/(mobile)/me/data/page.tsx b/src/app/(main)/(mobile)/me/data/page.tsx
new file mode 100644
index 000000000000..6f278bf94aa9
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/data/page.tsx
@@ -0,0 +1,27 @@
+import { redirect } from 'next/navigation';
+
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import Category from './features/Category';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('common');
+ return metadataModule.generate({
+ title: t('userPanel.data'),
+ url: '/me/data',
+ });
+};
+
+const Page = () => {
+ const mobile = isMobileDevice();
+
+ if (!mobile) return redirect('/chat');
+
+ return ;
+};
+
+Page.displayName = 'MeData';
+
+export default Page;
diff --git a/src/app/(main)/(mobile)/me/features/AvatarBanner.tsx b/src/app/(main)/(mobile)/me/features/AvatarBanner.tsx
deleted file mode 100644
index a0d733b300fb..000000000000
--- a/src/app/(main)/(mobile)/me/features/AvatarBanner.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-'use client';
-
-import { PropsWithChildren, memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-
-import UserAvatar from '@/features/User/UserAvatar';
-
-import { useStyles } from './style';
-
-export const AVATAR_SIZE = 80;
-
-const AvatarBanner = memo(({ children }) => {
- const { styles } = useStyles();
-
- return (
- <>
-
-
-
-
-
- {children}
- >
- );
-});
-
-export default AvatarBanner;
diff --git a/src/app/(main)/(mobile)/me/features/Cate.tsx b/src/app/(main)/(mobile)/me/features/Cate.tsx
deleted file mode 100644
index 536b1f0b9073..000000000000
--- a/src/app/(main)/(mobile)/me/features/Cate.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-import { memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-import urlJoin from 'url-join';
-
-import { useCategory } from '@/app/(main)/settings/hooks/useCategory';
-import Cell from '@/components/Cell';
-import Divider from '@/components/Cell/Divider';
-
-const SettingCate = memo(() => {
- const settingItems = useCategory({ mobile: true });
- const router = useRouter();
-
- return (
-
- {settingItems?.map(({ key, icon, label, type }: any, index) => {
- if (type === 'divider') return ;
- return (
- router.push(urlJoin('/settings', key))}
- />
- );
- })}
- |
- );
-});
-
-export default SettingCate;
diff --git a/src/app/(main)/(mobile)/me/features/ExtraCate.tsx b/src/app/(main)/(mobile)/me/features/ExtraCate.tsx
deleted file mode 100644
index 1b534eed2e36..000000000000
--- a/src/app/(main)/(mobile)/me/features/ExtraCate.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-
-import Cell from '@/components/Cell';
-import Divider from '@/components/Cell/Divider';
-
-import { useExtraCate } from './useExtraCate';
-
-const ExtraCate = memo(() => {
- const mainItems = useExtraCate();
-
- return (
-
- {mainItems?.map(({ key, icon, label, type, onClick }: any, index) => {
- if (type === 'divider') return ;
- return | ;
- })}
-
- );
-});
-
-export default ExtraCate;
diff --git a/src/app/(main)/(mobile)/me/features/style.ts b/src/app/(main)/(mobile)/me/features/style.ts
deleted file mode 100644
index b7bf3a9cc090..000000000000
--- a/src/app/(main)/(mobile)/me/features/style.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { createStyles } from 'antd-style';
-
-export const useStyles = createStyles(({ css, token, isDarkMode }) => ({
- bannerBox: css`
- position: relative;
-
- overflow: hidden;
- flex: none;
-
- width: 100%;
- height: 100px;
-
- background: ${token.colorFill};
- `,
- bannerImg: css`
- position: absolute;
- scale: 8;
- filter: blur(6px) saturate(2);
- `,
- info: css`
- position: relative;
-
- margin-top: ${-token.borderRadiusLG}px;
-
- background: ${isDarkMode ? token.colorBgLayout : token.colorBgContainer};
- border-top-left-radius: ${token.borderRadiusLG}px;
- border-top-right-radius: ${token.borderRadiusLG}px;
- `,
-}));
diff --git a/src/app/(main)/(mobile)/me/features/useExtraCate.tsx b/src/app/(main)/(mobile)/me/features/useExtraCate.tsx
deleted file mode 100644
index 19e6c20ed77d..000000000000
--- a/src/app/(main)/(mobile)/me/features/useExtraCate.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { DiscordIcon, Icon } from '@lobehub/ui';
-import { Book, Feather, HardDriveDownload, HardDriveUpload } from 'lucide-react';
-import { useTranslation } from 'react-i18next';
-
-import { type MenuProps } from '@/components/Menu';
-import { DISCORD, DOCUMENTS, FEEDBACK } from '@/const/url';
-import DataImporter from '@/features/DataImporter';
-import { configService } from '@/services/config';
-
-export const useExtraCate = () => {
- const { t } = useTranslation(['common', 'setting']);
-
- const iconSize = { fontSize: 20 };
-
- const exports: MenuProps['items'] = [
- {
- icon: ,
- key: 'import',
- label: {t('import')} ,
- },
- {
- icon: ,
- key: 'export',
- label: t('export'),
- onClick: configService.exportAll,
- },
- {
- type: 'divider',
- },
- ];
-
- const helps: MenuProps['items'] = [
- {
- icon: ,
- key: 'docs',
- label: t('document'),
- onClick: () => window.open(DOCUMENTS, '__blank'),
- },
- {
- icon: ,
- key: 'feedback',
- label: t('feedback'),
- onClick: () => window.open(FEEDBACK, '__blank'),
- },
- {
- icon: ,
- key: 'discord',
- label: 'Discord',
- onClick: () => window.open(DISCORD, '__blank'),
- },
- ];
-
- const mainItems = [
- {
- type: 'divider',
- },
- ...exports,
- ...helps,
- ].filter(Boolean) as MenuProps['items'];
-
- return mainItems;
-};
diff --git a/src/app/(main)/(mobile)/me/page.tsx b/src/app/(main)/(mobile)/me/page.tsx
deleted file mode 100644
index 74fc75fc6fa8..000000000000
--- a/src/app/(main)/(mobile)/me/page.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { redirect } from 'next/navigation';
-import { Center } from 'react-layout-kit';
-
-import BrandWatermark from '@/components/BrandWatermark';
-import Divider from '@/components/Cell/Divider';
-import DataStatistics from '@/features/User/DataStatistics';
-import UserInfo from '@/features/User/UserInfo';
-import { isMobileDevice } from '@/utils/responsive';
-
-import AvatarBanner from './features/AvatarBanner';
-import Cate from './features/Cate';
-import ExtraCate from './features/ExtraCate';
-
-const Page = () => {
- const mobile = isMobileDevice();
-
- if (!mobile) return redirect('/chat');
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
- >
- );
-};
-
-export default Page;
diff --git a/src/app/(main)/(mobile)/me/profile/features/Category.tsx b/src/app/(main)/(mobile)/me/profile/features/Category.tsx
new file mode 100644
index 000000000000..fe3ae5a39495
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/profile/features/Category.tsx
@@ -0,0 +1,45 @@
+'use client';
+
+import { LogOut, ShieldCheck, UserCircle } from 'lucide-react';
+import { useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import Cell, { CellProps } from '@/components/Cell';
+import { useUserStore } from '@/store/user';
+
+const Category = memo(() => {
+ const router = useRouter();
+ const { t } = useTranslation('auth');
+ const signOut = useUserStore((s) => s.logout);
+ const items: CellProps[] = [
+ {
+ icon: UserCircle,
+ key: 'profile',
+ label: t('profile'),
+ onClick: () => router.push('/profile'),
+ },
+ {
+ icon: ShieldCheck,
+ key: 'security',
+ label: t('security'),
+ onClick: () => router.push('/profile/security'),
+ },
+ {
+ type: 'divider',
+ },
+ {
+ icon: LogOut,
+ key: 'logout',
+ label: t('signout', { ns: 'auth' }),
+ onClick: () => {
+ signOut();
+ router.push('/login');
+ },
+ },
+ ];
+
+ return items?.map((item, index) => | );
+});
+
+export default Category;
diff --git a/src/app/(main)/(mobile)/me/profile/features/Header.tsx b/src/app/(main)/(mobile)/me/profile/features/Header.tsx
new file mode 100644
index 000000000000..d4d72a0f5b6c
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/profile/features/Header.tsx
@@ -0,0 +1,33 @@
+'use client';
+
+import { MobileNavBar, MobileNavBarTitle } from '@lobehub/ui';
+import { useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import { mobileHeaderSticky } from '@/styles/mobileHeader';
+
+const Header = memo(() => {
+ const { t } = useTranslation('common');
+
+ const router = useRouter();
+ return (
+
+ {t('userPanel.profile')}
+
+ }
+ />
+ }
+ onBackClick={() => router.push('/me')}
+ showBackButton
+ style={mobileHeaderSticky}
+ />
+ );
+});
+
+export default Header;
diff --git a/src/app/(main)/(mobile)/me/profile/layout.tsx b/src/app/(main)/(mobile)/me/profile/layout.tsx
new file mode 100644
index 000000000000..d6da87363462
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/profile/layout.tsx
@@ -0,0 +1,16 @@
+import { notFound } from 'next/navigation';
+import { PropsWithChildren } from 'react';
+
+import MobileContentLayout from '@/components/server/MobileNavLayout';
+import { enableClerk } from '@/const/auth';
+
+import Header from './features/Header';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ if (!enableClerk) return notFound();
+ return }>{children};
+};
+
+Layout.displayName = 'MeProfileLayout';
+
+export default Layout;
diff --git a/src/app/(main)/(mobile)/me/profile/loading.tsx b/src/app/(main)/(mobile)/me/profile/loading.tsx
new file mode 100644
index 000000000000..b14417168468
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/profile/loading.tsx
@@ -0,0 +1,5 @@
+import SkeletonLoading from '@/components/SkeletonLoading';
+
+export default () => {
+ return ;
+};
diff --git a/src/app/(main)/(mobile)/me/profile/page.tsx b/src/app/(main)/(mobile)/me/profile/page.tsx
new file mode 100644
index 000000000000..120cadca1e19
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/profile/page.tsx
@@ -0,0 +1,28 @@
+import { redirect } from 'next/navigation';
+
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import Category from './features/Category';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('userProfile.navbar.title'),
+ title: t('userProfile.navbar.description'),
+ url: '/me/profile',
+ });
+};
+
+const Page = () => {
+ const mobile = isMobileDevice();
+
+ if (!mobile) return redirect('/profile');
+
+ return ;
+};
+
+Page.displayName = 'MeProfile';
+
+export default Page;
diff --git a/src/app/(main)/(mobile)/me/settings/features/Category.tsx b/src/app/(main)/(mobile)/me/settings/features/Category.tsx
new file mode 100644
index 000000000000..3e47083a7f5e
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/features/Category.tsx
@@ -0,0 +1,15 @@
+'use client';
+
+import { memo } from 'react';
+
+import Cell from '@/components/Cell';
+
+import { useCategory } from './useCategory';
+
+const Category = memo(() => {
+ const items = useCategory();
+
+ return items?.map((item, index) => | );
+});
+
+export default Category;
diff --git a/src/app/(main)/(mobile)/me/settings/features/Header.tsx b/src/app/(main)/(mobile)/me/settings/features/Header.tsx
new file mode 100644
index 000000000000..166230ef56dd
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/features/Header.tsx
@@ -0,0 +1,33 @@
+'use client';
+
+import { MobileNavBar, MobileNavBarTitle } from '@lobehub/ui';
+import { useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import { mobileHeaderSticky } from '@/styles/mobileHeader';
+
+const Header = memo(() => {
+ const { t } = useTranslation('common');
+
+ const router = useRouter();
+ return (
+
+ {t('userPanel.setting')}
+
+ }
+ />
+ }
+ onBackClick={() => router.push('/me')}
+ showBackButton
+ style={mobileHeaderSticky}
+ />
+ );
+});
+
+export default Header;
diff --git a/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx b/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx
new file mode 100644
index 000000000000..d2781dc29f97
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/features/useCategory.tsx
@@ -0,0 +1,62 @@
+import { Tag } from 'antd';
+import { Bot, Brain, Cloudy, Info, Mic2, Settings2, Sparkles } from 'lucide-react';
+import { useRouter } from 'next/navigation';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+import urlJoin from 'url-join';
+
+import { CellProps } from '@/components/Cell';
+import { SettingsTabs } from '@/store/global/initialState';
+import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
+
+export const useCategory = () => {
+ const router = useRouter();
+ const { t } = useTranslation('setting');
+ const { enableWebrtc, showLLM } = useServerConfigStore(featureFlagsSelectors);
+
+ const items: CellProps[] = [
+ {
+ icon: Settings2,
+ key: SettingsTabs.Common,
+ label: t('tab.common'),
+ },
+ {
+ icon: Sparkles,
+ key: SettingsTabs.SystemAgent,
+ label: t('tab.system-agent'),
+ },
+ enableWebrtc && {
+ icon: Cloudy,
+ key: SettingsTabs.Sync,
+ label: (
+
+ {t('tab.sync')}
+
+ {t('tab.experiment')}
+
+
+ ),
+ },
+ showLLM && {
+ icon: Brain,
+ key: SettingsTabs.LLM,
+ label: t('tab.llm'),
+ },
+ { icon: Mic2, key: SettingsTabs.TTS, label: t('tab.tts') },
+ {
+ icon: Bot,
+ key: SettingsTabs.Agent,
+ label: t('tab.agent'),
+ },
+ {
+ icon: Info,
+ key: SettingsTabs.About,
+ label: t('tab.about'),
+ },
+ ].filter(Boolean) as CellProps[];
+
+ return items.map((item) => ({
+ ...item,
+ onClick: () => router.push(urlJoin('/settings', item.key as SettingsTabs)),
+ }));
+};
diff --git a/src/app/(main)/(mobile)/me/settings/layout.tsx b/src/app/(main)/(mobile)/me/settings/layout.tsx
new file mode 100644
index 000000000000..c14dda65ac0c
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/layout.tsx
@@ -0,0 +1,13 @@
+import { PropsWithChildren } from 'react';
+
+import MobileContentLayout from '@/components/server/MobileNavLayout';
+
+import Header from './features/Header';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ return }>{children};
+};
+
+Layout.displayName = 'MeSettingsLayout';
+
+export default Layout;
diff --git a/src/app/(main)/(mobile)/me/settings/loading.tsx b/src/app/(main)/(mobile)/me/settings/loading.tsx
new file mode 100644
index 000000000000..b14417168468
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/loading.tsx
@@ -0,0 +1,5 @@
+import SkeletonLoading from '@/components/SkeletonLoading';
+
+export default () => {
+ return ;
+};
diff --git a/src/app/(main)/(mobile)/me/settings/page.tsx b/src/app/(main)/(mobile)/me/settings/page.tsx
new file mode 100644
index 000000000000..4cabe69d8734
--- /dev/null
+++ b/src/app/(main)/(mobile)/me/settings/page.tsx
@@ -0,0 +1,28 @@
+import { redirect } from 'next/navigation';
+
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import Category from './features/Category';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('setting');
+ return metadataModule.generate({
+ description: t('header.desc'),
+ title: t('header.title'),
+ url: '/me/settings',
+ });
+};
+
+const Page = () => {
+ const mobile = isMobileDevice();
+
+ if (!mobile) return redirect('/settings/common');
+
+ return ;
+};
+
+Page.displayName = 'MeSettings';
+
+export default Page;
diff --git a/src/app/(main)/@nav/_layout/Mobile.tsx b/src/app/(main)/@nav/_layout/Mobile.tsx
index d9c1959ab707..8229347d09f7 100644
--- a/src/app/(main)/@nav/_layout/Mobile.tsx
+++ b/src/app/(main)/@nav/_layout/Mobile.tsx
@@ -63,7 +63,7 @@ const Nav = memo(() => {
[t],
);
- return ;
+ return ;
});
Nav.displayName = 'MobileNav';
diff --git a/src/app/(main)/_layout/Desktop.tsx b/src/app/(main)/_layout/Desktop.tsx
index 78d8b5323d43..fe98d3072a1d 100644
--- a/src/app/(main)/_layout/Desktop.tsx
+++ b/src/app/(main)/_layout/Desktop.tsx
@@ -4,12 +4,12 @@ import { useTheme } from 'antd-style';
import { memo } from 'react';
import { Flexbox } from 'react-layout-kit';
-import { useIsPWA } from '@/hooks/useIsPWA';
+import { usePlatform } from '@/hooks/usePlatform';
import { LayoutProps } from './type';
const Layout = memo(({ children, nav }) => {
- const isPWA = useIsPWA();
+ const { isPWA } = usePlatform();
const theme = useTheme();
return (
diff --git a/src/app/(main)/_layout/Mobile.tsx b/src/app/(main)/_layout/Mobile.tsx
index 0291a7e15522..c85d6f555393 100644
--- a/src/app/(main)/_layout/Mobile.tsx
+++ b/src/app/(main)/_layout/Mobile.tsx
@@ -1,20 +1,25 @@
'use client';
import { usePathname } from 'next/navigation';
+import qs from 'query-string';
import { memo } from 'react';
+import { useQuery } from '@/hooks/useQuery';
+
import { LayoutProps } from './type';
-const MOBILE_IGNORE_NAV_ROUTES = ['/settings/', '/chat/'];
+const MOBILE_NAV_ROUTES = new Set(['/chat', '/market', '/me']);
const Layout = memo(({ children, nav }: LayoutProps) => {
+ const { showMobileWorkspace } = useQuery();
const pathname = usePathname();
- const hideNav = MOBILE_IGNORE_NAV_ROUTES.some((path) => pathname.startsWith(path));
+ const { url } = qs.parseUrl(pathname);
+ const showNav = !showMobileWorkspace && MOBILE_NAV_ROUTES.has(url);
return (
<>
{children}
- {!hideNav && nav}
+ {showNav && nav}
>
);
});
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/DragUpload.tsx b/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/DragUpload.tsx
deleted file mode 100644
index 9b275cc9de25..000000000000
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/DragUpload.tsx
+++ /dev/null
@@ -1,178 +0,0 @@
-import { Icon } from '@lobehub/ui';
-import { createStyles } from 'antd-style';
-import { FileImage, FileText, FileUpIcon } from 'lucide-react';
-import { rgba } from 'polished';
-import { memo, useEffect, useRef, useState } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Center, Flexbox } from 'react-layout-kit';
-
-import { useAgentStore } from '@/store/agent';
-import { agentSelectors } from '@/store/agent/selectors';
-import { useFileStore } from '@/store/file';
-import { useUserStore } from '@/store/user';
-import { modelProviderSelectors } from '@/store/user/selectors';
-
-const useStyles = createStyles(({ css, token, stylish }) => {
- return {
- container: css`
- width: 300px;
- height: 300px;
- padding: 16px;
-
- color: ${token.colorWhite};
-
- background: ${token.geekblue};
- border-radius: 16px;
- box-shadow:
- ${rgba(token.geekblue, 0.1)} 0 1px 1px 0 inset,
- ${rgba(token.geekblue, 0.1)} 0 50px 100px -20px,
- ${rgba(token.geekblue, 0.3)} 0 30px 60px -30px;
- `,
- content: css`
- width: 100%;
- height: 100%;
- padding: 16px;
-
- border: 2px dashed ${token.colorWhite};
- border-radius: 12px;
- `,
- desc: css`
- color: ${rgba(token.colorTextLightSolid, 0.6)};
- `,
- title: css`
- font-size: 24px;
- font-weight: bold;
- `,
- wrapper: css`
- position: fixed;
- z-index: 10000000;
- top: 0;
- left: 0;
-
- width: 100%;
- height: 100%;
-
- transition: all 0.3s ease-in-out;
-
- background: ${token.colorBgMask};
- ${stylish.blur};
- `,
- };
-});
-
-const handleDragOver = (e: DragEvent) => {
- e.preventDefault();
-};
-
-const DragUpload = memo(() => {
- const { styles } = useStyles();
- const { t } = useTranslation('chat');
- const [isDragging, setIsDragging] = useState(false);
- // When a file is dragged to a different area, the 'dragleave' event may be triggered,
- // causing isDragging to be mistakenly set to false.
- // to fix this issue, use a counter to ensure the status change only when drag event left the browser window .
- const dragCounter = useRef(0);
-
- const uploadFile = useFileStore((s) => s.uploadFile);
-
- const model = useAgentStore(agentSelectors.currentAgentModel);
-
- const enabledFiles = useUserStore(modelProviderSelectors.isModelEnabledFiles(model));
-
- const uploadImages = async (fileList: FileList | undefined) => {
- if (!fileList || fileList.length === 0) return;
-
- const pools = Array.from(fileList).map(async (file) => {
- // skip none-file items
- if (!file.type.startsWith('image') && !enabledFiles) return;
- await uploadFile(file);
- });
-
- await Promise.all(pools);
- };
-
- const handleDragEnter = (e: DragEvent) => {
- e.preventDefault();
-
- dragCounter.current += 1;
- if (e.dataTransfer?.items && e.dataTransfer.items.length > 0) {
- setIsDragging(true);
- }
- };
-
- const handleDragLeave = (e: DragEvent) => {
- e.preventDefault();
-
- // reset counter
- dragCounter.current -= 1;
-
- if (dragCounter.current === 0) {
- setIsDragging(false);
- }
- };
-
- const handleDrop = async (e: DragEvent) => {
- e.preventDefault();
- // reset counter
- dragCounter.current = 0;
-
- setIsDragging(false);
-
- // get filesList
- // TODO: support folder files upload
- const files = e.dataTransfer?.files;
-
- // upload files
- uploadImages(files);
- };
-
- const handlePaste = (event: ClipboardEvent) => {
- // get files from clipboard
-
- const files = event.clipboardData?.files;
-
- uploadImages(files);
- };
-
- useEffect(() => {
- window.addEventListener('dragenter', handleDragEnter);
- window.addEventListener('dragover', handleDragOver);
- window.addEventListener('dragleave', handleDragLeave);
- window.addEventListener('drop', handleDrop);
- window.addEventListener('paste', handlePaste);
-
- return () => {
- window.removeEventListener('dragenter', handleDragEnter);
- window.removeEventListener('dragover', handleDragOver);
- window.removeEventListener('dragleave', handleDragLeave);
- window.removeEventListener('drop', handleDrop);
- window.removeEventListener('paste', handlePaste);
- };
- }, [handleDragEnter, handleDragOver, handleDragLeave, handleDrop, handlePaste]);
-
- return (
- isDragging && (
-
-
-
-
-
-
-
-
-
-
- {t(enabledFiles ? 'upload.dragFileTitle' : 'upload.dragTitle')}
-
-
- {t(enabledFiles ? 'upload.dragFileDesc' : 'upload.dragDesc')}
-
-
-
-
-
- )
- );
-});
-
-export default DragUpload;
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/__tests__/useAutoFocus.test.ts b/src/app/(main)/chat/(desktop)/features/ChatInput/__tests__/useAutoFocus.test.ts
deleted file mode 100644
index 462f1566d6eb..000000000000
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/__tests__/useAutoFocus.test.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { act, renderHook } from '@testing-library/react';
-import { RefObject } from 'react';
-
-import { useAutoFocus } from '../useAutoFocus';
-
-enum ElType {
- div,
- input,
- markdown,
- debug,
-}
-
-// 模拟elementFromPoint方法
-document.elementFromPoint = function (x) {
- if (x === ElType.div) {
- return document.createElement('div');
- }
-
- if (x === ElType.input) {
- return document.createElement('input');
- }
-
- if (x === ElType.debug) {
- return document.createElement('pre');
- }
-
- if (x === ElType.markdown) {
- const markdownEl = document.createElement('article');
- const markdownChildEl = document.createElement('p');
- markdownEl.appendChild(markdownChildEl);
- return markdownChildEl;
- }
-
- return null;
-};
-
-describe('useAutoFocus', () => {
- it('should focus inputRef when mouseup event happens outside of input or markdown element', () => {
- const inputRef = { current: { focus: vi.fn() } } as RefObject;
- renderHook(() => useAutoFocus(inputRef));
-
- // Simulate a mousedown event on an element outside of input or markdown element
- act(() => {
- document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, clientX: ElType.div }));
- });
-
- // Simulate a mouseup event
- act(() => {
- document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
- });
-
- expect(inputRef.current?.focus).toHaveBeenCalledTimes(1);
- });
-
- it('should not focus inputRef when mouseup event happens inside of input element', () => {
- const inputRef = { current: { focus: vi.fn() } } as RefObject;
- renderHook(() => useAutoFocus(inputRef));
-
- // Simulate a mousedown event on an input element
- act(() => {
- document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, clientX: ElType.input }));
- });
-
- // Simulate a mouseup event
- act(() => {
- document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
- });
-
- expect(inputRef.current?.focus).not.toHaveBeenCalled();
- });
-
- it('should not focus inputRef when mouseup event happens inside of markdown element', () => {
- const inputRef = { current: { focus: vi.fn() } } as RefObject;
- renderHook(() => useAutoFocus(inputRef));
-
- // Simulate a mousedown event on a markdown element
- act(() => {
- document.dispatchEvent(
- new MouseEvent('mousedown', { bubbles: true, clientX: ElType.markdown }),
- );
- });
-
- // Simulate a mouseup event
- act(() => {
- document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
- });
-
- expect(inputRef.current?.focus).not.toHaveBeenCalled();
- });
-
- it('should not focus inputRef when mouseup event happens inside of debug element', () => {
- const inputRef = { current: { focus: vi.fn() } } as RefObject;
- renderHook(() => useAutoFocus(inputRef));
-
- // Simulate a mousedown event on a debug element
- act(() => {
- document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, clientX: ElType.debug }));
- });
-
- // Simulate a mouseup event
- act(() => {
- document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
- });
-
- expect(inputRef.current?.focus).not.toHaveBeenCalled();
- });
-});
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/useAutoFocus.ts b/src/app/(main)/chat/(desktop)/features/ChatInput/useAutoFocus.ts
deleted file mode 100644
index 875d32bd6670..000000000000
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/useAutoFocus.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { TextAreaRef } from 'antd/es/input/TextArea';
-import { RefObject, useEffect } from 'react';
-
-export const useAutoFocus = (inputRef: RefObject) => {
- useEffect(() => {
- let isInputOrMarkdown = false;
-
- const onMousedown = (e: MouseEvent) => {
- isInputOrMarkdown = false;
- const element = document.elementFromPoint(e.clientX, e.clientY);
- if (!element) return;
- let currentElement: Element | null = element;
- // 因为点击 Markdown 元素时,element 会是 article 标签的子元素
- // Debug 信息时,element 会是 pre 标签
- // 所以向上查找全局点击对象是否是 Markdown 或者 Input 或者 Debug 元素
- while (currentElement && !isInputOrMarkdown) {
- isInputOrMarkdown = ['TEXTAREA', 'INPUT', 'ARTICLE', 'PRE'].includes(
- currentElement.tagName,
- );
- currentElement = currentElement.parentElement;
- }
- };
-
- const onMouseup = () => {
- // 因为有时候要复制 Markdown 里生成的内容,或者点击别的 Input
- // 所以全局点击元素不是 Markdown 或者 Input 元素的话就聚焦
- if (!isInputOrMarkdown) {
- inputRef.current?.focus();
- }
- };
-
- document.addEventListener('mousedown', onMousedown);
- document.addEventListener('mouseup', onMouseup);
- return () => {
- document.removeEventListener('mousedown', onMousedown);
- document.removeEventListener('mouseup', onMouseup);
- };
- }, []);
-};
diff --git a/src/app/(main)/chat/(desktop)/features/Conversation.tsx b/src/app/(main)/chat/(desktop)/features/Conversation.tsx
deleted file mode 100644
index d12850f72945..000000000000
--- a/src/app/(main)/chat/(desktop)/features/Conversation.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { memo } from 'react';
-
-import RawConversation from '@/features/Conversation';
-
-import TelemetryNotification from '../../features/TelemetryNotification';
-import ChatInput from './ChatInput';
-import HotKeys from './HotKeys';
-
-const Conversation = memo(() => {
- return (
- <>
- } />
-
-
- >
- );
-});
-
-export default Conversation;
diff --git a/src/app/(main)/chat/(desktop)/index.tsx b/src/app/(main)/chat/(desktop)/index.tsx
deleted file mode 100644
index 2e4a5c2b3a25..000000000000
--- a/src/app/(main)/chat/(desktop)/index.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-
-import ClientResponsiveContent from '@/components/client/ClientResponsiveContent';
-
-import ChatHeader from './features/ChatHeader';
-import Conversation from './features/Conversation';
-import SideBar from './features/SideBar';
-
-const Desktop = memo(() => (
- <>
-
-
-
-
-
- >
-));
-
-export default ClientResponsiveContent({ Desktop, Mobile: () => import('../(mobile)') });
diff --git a/src/app/(main)/chat/(mobile)/features/SessionList.tsx b/src/app/(main)/chat/(mobile)/features/SessionList.tsx
deleted file mode 100644
index ec386c09dd14..000000000000
--- a/src/app/(main)/chat/(mobile)/features/SessionList.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { memo } from 'react';
-
-import SessionListContent from '../../features/SessionListContent';
-import SessionSearchBar from '../../features/SessionSearchBar';
-
-const Sessions = memo(() => {
- return (
- <>
-
-
-
-
- >
- );
-});
-
-export default Sessions;
diff --git a/src/app/(main)/chat/(mobile)/features/TopicList.tsx b/src/app/(main)/chat/(mobile)/features/TopicList.tsx
deleted file mode 100644
index abc4382e030e..000000000000
--- a/src/app/(main)/chat/(mobile)/features/TopicList.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Modal } from '@lobehub/ui';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { useGlobalStore } from '@/store/global';
-
-import TopicListContent from '../../features/TopicListContent';
-
-const Topics = memo(() => {
- const [showAgentSettings, toggleConfig] = useGlobalStore((s) => [
- s.preference.mobileShowTopic,
- s.toggleMobileTopic,
- ]);
-
- const { t } = useTranslation('chat');
-
- return (
- toggleConfig(false)}
- open={showAgentSettings}
- title={t('topic.title')}
- >
-
-
- );
-});
-
-export default Topics;
diff --git a/src/app/(main)/chat/(mobile)/index.tsx b/src/app/(main)/chat/(mobile)/index.tsx
deleted file mode 100644
index ac17bd995767..000000000000
--- a/src/app/(main)/chat/(mobile)/index.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-'use client';
-
-import { useRouter } from 'next/navigation';
-import { memo, useEffect } from 'react';
-
-import MobileContentLayout from '@/components/server/MobileNavLayout';
-
-import SessionHeader from './features/SessionHeader';
-import SessionList from './features/SessionList';
-
-const ChatMobilePage = memo(() => {
- const router = useRouter();
-
- useEffect(() => {
- router.prefetch('/chat/mobile');
- router.prefetch('/settings');
- }, []);
-
- return (
- } withNav>
-
-
- );
-});
-
-export default ChatMobilePage;
diff --git a/src/app/(main)/chat/(mobile)/mobile/ChatHeader/index.tsx b/src/app/(main)/chat/(mobile)/mobile/ChatHeader/index.tsx
deleted file mode 100644
index 61f77bdf1106..000000000000
--- a/src/app/(main)/chat/(mobile)/mobile/ChatHeader/index.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { MobileNavBar } from '@lobehub/ui';
-import { useRouter } from 'next/navigation';
-import { memo, useState } from 'react';
-
-import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
-
-import SettingButton from '../../../features/SettingButton';
-import ShareButton from '../../../features/ShareButton';
-import ChatHeaderTitle from './ChatHeaderTitle';
-
-const MobileHeader = memo(() => {
- const router = useRouter();
- const [open, setOpen] = useState(false);
-
- const { isAgentEditable } = useServerConfigStore(featureFlagsSelectors);
-
- // const items: MenuProps['items'] = [
- // {
- // icon: ,
- // key: 'share',
- // label: t('share', { ns: 'common' }),
- // onClick: () => setOpen(true),
- // },
- // !isInbox && {
- // icon: ,
- // key: 'settings',
- // label: t('header.session', { ns: 'setting' }),
- // onClick: () => router.push(pathString('/chat/settings', { hash: location.hash })),
- // },
- // ].filter(Boolean) as MenuProps['items'];
-
- return (
- }
- onBackClick={() => router.push('/chat')}
- right={
- <>
-
- {isAgentEditable && }
- {/**/}
- {/* */}
- {/* */}
- >
- }
- showBackButton
- style={{ width: '100%' }}
- />
- );
-});
-
-export default MobileHeader;
diff --git a/src/app/(main)/chat/(mobile)/mobile/page.tsx b/src/app/(main)/chat/(mobile)/mobile/page.tsx
deleted file mode 100644
index 3eed22d6e0aa..000000000000
--- a/src/app/(main)/chat/(mobile)/mobile/page.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-'use client';
-
-import dynamic from 'next/dynamic';
-import { memo } from 'react';
-
-import MobileContentLayout from '@/components/server/MobileNavLayout';
-import Conversation from '@/features/Conversation';
-
-import SessionHydration from '../../components/SessionHydration';
-import TelemetryNotification from '../../features/TelemetryNotification';
-import ChatInput from '../features/ChatInput';
-import ChatHeader from './ChatHeader';
-
-const TopicList = dynamic(() => import('../features/TopicList'));
-
-const Chat = memo(() => {
- return (
- }>
- } mobile />
-
-
-
-
- );
-});
-export default Chat;
diff --git a/src/app/(main)/chat/(workspace)/@conversation/default.tsx b/src/app/(main)/chat/(workspace)/@conversation/default.tsx
new file mode 100644
index 000000000000..5015044cc5e2
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@conversation/default.tsx
@@ -0,0 +1,23 @@
+import Conversation from '@/features/Conversation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import ChatHydration from './features/ChatHydration';
+import DesktopChatInput from './features/ChatInput/Desktop';
+import MobileChatInput from './features/ChatInput/Mobile';
+
+const ChatConversation = () => {
+ const mobile = isMobileDevice();
+ const ChatInput = mobile ? MobileChatInput : DesktopChatInput;
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+ChatConversation.displayName = 'ChatConversation';
+
+export default ChatConversation;
diff --git a/src/components/StoreHydration/ChatHydration/index.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatHydration/index.tsx
similarity index 91%
rename from src/components/StoreHydration/ChatHydration/index.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatHydration/index.tsx
index b054eb5be811..23f755cfd4b3 100644
--- a/src/components/StoreHydration/ChatHydration/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatHydration/index.tsx
@@ -1,7 +1,7 @@
'use client';
import { useQueryState } from 'nuqs';
-import { memo, useEffect } from 'react';
+import { memo, useLayoutEffect } from 'react';
import { createStoreUpdater } from 'zustand-utils';
import { useChatStore } from '@/store/chat';
@@ -14,7 +14,7 @@ const ChatHydration = memo(() => {
const [topic, setTopic] = useQueryState('topic', { history: 'replace', throttleMs: 500 });
useStoreUpdater('activeTopicId', topic);
- useEffect(() => {
+ useLayoutEffect(() => {
const unsubscribe = useChatStore.subscribe(
(s) => s.activeTopicId,
(state) => {
diff --git a/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/DragUpload.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/DragUpload.tsx
new file mode 100644
index 000000000000..1f469e789edd
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/DragUpload.tsx
@@ -0,0 +1,245 @@
+import { Icon } from '@lobehub/ui';
+import { createStyles } from 'antd-style';
+import { FileImage, FileText, FileUpIcon } from 'lucide-react';
+import { darken, lighten } from 'polished';
+import { memo, useEffect, useRef, useState } from 'react';
+import { createPortal } from 'react-dom';
+import { useTranslation } from 'react-i18next';
+import { Center, Flexbox } from 'react-layout-kit';
+
+import { useAgentStore } from '@/store/agent';
+import { agentSelectors } from '@/store/agent/selectors';
+import { useFileStore } from '@/store/file';
+import { useUserStore } from '@/store/user';
+import { modelProviderSelectors } from '@/store/user/selectors';
+
+const DRAGGING_ROOT_ID = 'dragging-root';
+const getContainer = () => document.querySelector(`#${DRAGGING_ROOT_ID}`);
+const BLOCK_SIZE = 64;
+const ICON_SIZE = 36;
+
+const useStyles = createStyles(({ css, token }) => {
+ return {
+ container: css`
+ width: 320px;
+ height: 200px;
+ padding: ${token.borderRadiusLG + 4}px;
+
+ background: ${token.geekblue};
+ border-radius: 16px;
+ `,
+ content: css`
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+
+ border: 1.5px dashed ${token.colorBorder};
+ border-radius: ${token.borderRadiusLG}px;
+ `,
+ desc: css`
+ color: #fff;
+ `,
+ icon: css`
+ color: ${darken(0.05, token.geekblue)};
+ background: ${lighten(0.38, token.geekblue)};
+ border-radius: ${token.borderRadiusLG}px;
+ `,
+ iconGroup: css`
+ margin-top: -44px;
+ `,
+ title: css`
+ font-size: 20px;
+ font-weight: bold;
+ color: #fff;
+ `,
+ wrapper: css`
+ position: fixed;
+ z-index: 9999;
+ inset: 0;
+
+ width: 100%;
+ height: 100%;
+
+ background: ${token.colorBgMask};
+ backdrop-filter: blur(4px);
+
+ transition: all 0.3s ease-in-out;
+ `,
+ };
+});
+
+const handleDragOver = (e: DragEvent) => {
+ if (!e.dataTransfer?.items || e.dataTransfer.items.length === 0) return;
+
+ const isFile = e.dataTransfer.types.includes('Files');
+ if (isFile) {
+ e.preventDefault();
+ }
+};
+
+const DragUpload = memo(() => {
+ const { styles, theme } = useStyles();
+ const { t } = useTranslation('chat');
+ const [isDragging, setIsDragging] = useState(false);
+ // When a file is dragged to a different area, the 'dragleave' event may be triggered,
+ // causing isDragging to be mistakenly set to false.
+ // to fix this issue, use a counter to ensure the status change only when drag event left the browser window .
+ const dragCounter = useRef(0);
+
+ const uploadFile = useFileStore((s) => s.uploadFile);
+
+ const model = useAgentStore(agentSelectors.currentAgentModel);
+
+ const enabledFiles = useUserStore(modelProviderSelectors.isModelEnabledFiles(model));
+
+ const uploadImages = async (fileList: FileList | undefined) => {
+ if (!fileList || fileList.length === 0) return;
+
+ const pools = Array.from(fileList).map(async (file) => {
+ // skip none-file items
+ if (!file.type.startsWith('image') && !enabledFiles) return;
+ await uploadFile(file);
+ });
+
+ await Promise.all(pools);
+ };
+
+ const handleDragEnter = (e: DragEvent) => {
+ if (!e.dataTransfer?.items || e.dataTransfer.items.length === 0) return;
+
+ const isFile = e.dataTransfer.types.includes('Files');
+ if (isFile) {
+ dragCounter.current += 1;
+ e.preventDefault();
+ setIsDragging(true);
+ }
+ };
+
+ const handleDragLeave = (e: DragEvent) => {
+ if (!e.dataTransfer?.items || e.dataTransfer.items.length === 0) return;
+
+ const isFile = e.dataTransfer.types.includes('Files');
+ if (isFile) {
+ e.preventDefault();
+
+ // reset counter
+ dragCounter.current -= 1;
+
+ if (dragCounter.current === 0) {
+ setIsDragging(false);
+ }
+ }
+ };
+
+ const handleDrop = async (e: DragEvent) => {
+ if (!e.dataTransfer?.items || e.dataTransfer.items.length === 0) return;
+
+ const isFile = e.dataTransfer.types.includes('Files');
+ if (isFile) {
+ e.preventDefault();
+
+ // reset counter
+ dragCounter.current = 0;
+
+ setIsDragging(false);
+
+ // get filesList
+ // TODO: support folder files upload
+ const files = e.dataTransfer?.files;
+
+ // upload files
+ uploadImages(files);
+ }
+ };
+
+ const handlePaste = (event: ClipboardEvent) => {
+ // get files from clipboard
+ const files = event.clipboardData?.files;
+
+ uploadImages(files);
+ };
+
+ useEffect(() => {
+ if (getContainer()) return;
+ const root = document.createElement('div');
+ root.id = DRAGGING_ROOT_ID;
+ document.body.append(root);
+
+ return () => {
+ root.remove();
+ };
+ }, []);
+
+ useEffect(() => {
+ window.addEventListener('dragenter', handleDragEnter);
+ window.addEventListener('dragover', handleDragOver);
+ window.addEventListener('dragleave', handleDragLeave);
+ window.addEventListener('drop', handleDrop);
+ window.addEventListener('paste', handlePaste);
+
+ return () => {
+ window.removeEventListener('dragenter', handleDragEnter);
+ window.removeEventListener('dragover', handleDragOver);
+ window.removeEventListener('dragleave', handleDragLeave);
+ window.removeEventListener('drop', handleDrop);
+ window.removeEventListener('paste', handlePaste);
+ };
+ }, [handleDragEnter, handleDragOver, handleDragLeave, handleDrop, handlePaste]);
+
+ if (!isDragging) return;
+
+ return createPortal(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t(enabledFiles ? 'upload.dragFileTitle' : 'upload.dragTitle')}
+
+
+ {t(enabledFiles ? 'upload.dragFileDesc' : 'upload.dragDesc')}
+
+
+
+
+ ,
+ getContainer()!,
+ );
+});
+
+export default DragUpload;
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/LocalFiles.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/LocalFiles.tsx
similarity index 77%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/Footer/LocalFiles.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/LocalFiles.tsx
index bb4d0e522a46..7775576a0fe1 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/LocalFiles.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/LocalFiles.tsx
@@ -1,6 +1,6 @@
import { memo } from 'react';
-import EditableFileList from '@/components/FileList/EditableFileList';
+import { EditableFileList } from '@/features/FileList';
import { useFileStore } from '@/store/file';
export const LocalFiles = memo(() => {
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/SendMore.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/SendMore.tsx
similarity index 92%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/Footer/SendMore.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/SendMore.tsx
index 9cfc872ca08c..394ac4b65a67 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/SendMore.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/SendMore.tsx
@@ -13,7 +13,6 @@ import { useSendMessage } from '@/features/ChatInput/useSend';
import { useChatStore } from '@/store/chat';
import { useUserStore } from '@/store/user';
import { preferenceSelectors } from '@/store/user/selectors';
-import { isMacOS } from '@/utils/platform';
const useStyles = createStyles(({ css, prefixCls }) => {
return {
@@ -25,9 +24,12 @@ const useStyles = createStyles(({ css, prefixCls }) => {
};
});
-const isMac = isMacOS();
+interface SendMoreProps {
+ disabled?: boolean;
+ isMac?: boolean;
+}
-const SendMore = memo(() => {
+const SendMore = memo(({ disabled, isMac }) => {
const { t } = useTranslation('chat');
const { styles } = useStyles();
@@ -55,6 +57,7 @@ const SendMore = memo(() => {
return (
{
icon: useCmdEnterToSend ? :
,
key: 'sendWithCmdEnter',
label: t('input.sendWithCmdEnter', {
- meta: isMac ? 'Cmd' : 'Ctrl',
+ meta: typeof isMac === 'boolean' ? (isMac ? '⌘' : 'Ctrl') : '…',
}),
onClick: () => {
updatePreference({ useCmdEnterToSend: true });
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/index.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/index.tsx
similarity index 73%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/Footer/index.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/index.tsx
index 30da5ea3a185..d6e0e6d24d2f 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/Footer/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Footer/index.tsx
@@ -1,9 +1,9 @@
import { Icon } from '@lobehub/ui';
-import { Button, Space } from 'antd';
+import { Button, Skeleton, Space } from 'antd';
import { createStyles } from 'antd-style';
import { ChevronUp, CornerDownLeft, LucideCommand } from 'lucide-react';
import { rgba } from 'polished';
-import { memo } from 'react';
+import { memo, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Center, Flexbox } from 'react-layout-kit';
@@ -13,6 +13,8 @@ import { useSendMessage } from '@/features/ChatInput/useSend';
import { useAgentStore } from '@/store/agent';
import { agentSelectors } from '@/store/agent/slices/chat';
import { useChatStore } from '@/store/chat';
+import { chatSelectors, topicSelectors } from '@/store/chat/selectors';
+import { filesSelectors, useFileStore } from '@/store/file';
import { useUserStore } from '@/store/user';
import { modelProviderSelectors, preferenceSelectors } from '@/store/user/selectors';
import { isMacOS } from '@/utils/platform';
@@ -48,8 +50,6 @@ const useStyles = createStyles(({ css, prefixCls, token }) => {
};
});
-const isMac = isMacOS();
-
interface FooterProps {
setExpand?: (expand: boolean) => void;
}
@@ -59,11 +59,22 @@ const Footer = memo(({ setExpand }) => {
const { theme, styles } = useStyles();
- const [loading, stopGenerateMessage] = useChatStore((s) => [
- !!s.chatLoadingId,
+ const [
+ isAIGenerating,
+ isHasMessageLoading,
+ isCreatingMessage,
+ isCreatingTopic,
+ stopGenerateMessage,
+ ] = useChatStore((s) => [
+ chatSelectors.isAIGenerating(s),
+ chatSelectors.isHasMessageLoading(s),
+ chatSelectors.isCreatingMessage(s),
+ topicSelectors.isCreatingTopic(s),
s.stopGenerateMessage,
]);
+ const isImageUploading = useFileStore(filesSelectors.isImageUploading);
+
const model = useAgentStore(agentSelectors.currentAgentModel);
const [useCmdEnterToSend, canUpload] = useUserStore((s) => [
@@ -73,9 +84,20 @@ const Footer = memo(({ setExpand }) => {
const sendMessage = useSendMessage();
+ const [isMac, setIsMac] = useState();
+ useEffect(() => {
+ setIsMac(isMacOS());
+ }, [setIsMac]);
+
const cmdEnter = (
-
+ {typeof isMac === 'boolean' ? (
+
+ ) : (
+
+ {' '}
+
+ )}
);
@@ -90,6 +112,9 @@ const Footer = memo(({ setExpand }) => {
const wrapperShortcut = useCmdEnterToSend ? enter : cmdEnter;
+ const buttonDisabled =
+ isImageUploading || isHasMessageLoading || isCreatingTopic || isCreatingMessage;
+
return (
(({ setExpand }) => {
horizontal
padding={'0 24px'}
>
-
+
{canUpload && (
<>
@@ -108,7 +133,7 @@ const Footer = memo(({ setExpand }) => {
>
)}
-
+
(({ setExpand }) => {
- {loading ? (
+ {isAIGenerating ? (
}
@@ -133,6 +158,8 @@ const Footer = memo(({ setExpand }) => {
) : (
{
sendMessage();
setExpand?.(false);
@@ -141,7 +168,7 @@ const Footer = memo(({ setExpand }) => {
>
{t('input.send')}
-
+
)}
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/Header/index.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Header/index.tsx
similarity index 100%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/Header/index.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/Header/index.tsx
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.test.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.test.tsx
similarity index 97%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.test.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.test.tsx
index e286a7ea2953..3fa5f18655e9 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.test.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.test.tsx
@@ -195,7 +195,7 @@ describe(' ', () => {
it('does not send message when loading or shift key is pressed', () => {
const sendMessageMock = vi.fn();
act(() => {
- useChatStore.setState({ chatLoadingId: '123', sendMessage: sendMessageMock });
+ useChatStore.setState({ chatLoadingIds: ['123'], sendMessage: sendMessageMock });
});
render( );
@@ -209,7 +209,7 @@ describe(' ', () => {
const sendMessageMock = vi.fn();
act(() => {
useChatStore.setState({
- chatLoadingId: '',
+ chatLoadingIds: [],
inputMessage: 'abc',
sendMessage: sendMessageMock,
});
@@ -228,7 +228,7 @@ describe(' ', () => {
const sendMessageMock = vi.fn();
act(() => {
useChatStore.setState({
- chatLoadingId: '',
+ chatLoadingIds: [],
inputMessage: '123',
sendMessage: sendMessageMock,
});
@@ -247,7 +247,7 @@ describe(' ', () => {
const updateInputMessageMock = vi.fn();
act(() => {
useChatStore.setState({
- chatLoadingId: '',
+ chatLoadingIds: [],
inputMessage: 'Test',
sendMessage: sendMessageMock,
updateInputMessage: updateInputMessageMock,
@@ -271,7 +271,7 @@ describe(' ', () => {
const sendMessageMock = vi.fn();
act(() => {
useChatStore.setState({
- chatLoadingId: '',
+ chatLoadingIds: [],
inputMessage: '123',
sendMessage: sendMessageMock,
});
@@ -295,7 +295,7 @@ describe(' ', () => {
const updateInputMessageMock = vi.fn();
act(() => {
useChatStore.setState({
- chatLoadingId: '',
+ chatLoadingIds: [],
inputMessage: 'Test',
sendMessage: sendMessageMock,
updateInputMessage: updateInputMessageMock,
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.tsx
similarity index 97%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.tsx
index 2bf6bb0147d9..3c998704009c 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/TextArea.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/TextArea.tsx
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
import { useSendMessage } from '@/features/ChatInput/useSend';
import { useChatStore } from '@/store/chat';
+import { chatSelectors } from '@/store/chat/selectors';
import { useUserStore } from '@/store/user';
import { preferenceSelectors } from '@/store/user/selectors';
import { isCommandPressed } from '@/utils/keyboard';
@@ -42,7 +43,7 @@ const InputArea = memo(({ setExpand }) => {
const isChineseInput = useRef(false);
const [loading, value, updateInputMessage] = useChatStore((s) => [
- !!s.chatLoadingId,
+ chatSelectors.isAIGenerating(s),
s.inputMessage,
s.updateInputMessage,
]);
diff --git a/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/__tests__/useAutoFocus.test.ts b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/__tests__/useAutoFocus.test.ts
new file mode 100644
index 000000000000..a1c96894d2f6
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/__tests__/useAutoFocus.test.ts
@@ -0,0 +1,45 @@
+import { act, renderHook } from '@testing-library/react';
+import { describe, expect, it, vi } from 'vitest';
+
+import { useChatStore } from '@/store/chat';
+import { chatSelectors } from '@/store/chat/selectors';
+
+import { useAutoFocus } from '../useAutoFocus';
+
+vi.mock('zustand/traditional');
+
+describe('useAutoFocus', () => {
+ it('should focus the input when chatKey changes', () => {
+ const focusMock = vi.fn();
+ const inputRef = { current: { focus: focusMock } };
+
+ act(() => {
+ useChatStore.setState({ activeId: '1', activeTopicId: '2' });
+ });
+
+ renderHook(() => useAutoFocus(inputRef as any));
+
+ expect(focusMock).toHaveBeenCalledTimes(1);
+
+ act(() => {
+ useChatStore.setState({ activeId: '1', activeTopicId: '3' });
+ });
+
+ renderHook(() => useAutoFocus(inputRef as any));
+
+ // I don't know why its 3, but is large than 2 is fine
+ expect(focusMock).toHaveBeenCalledTimes(3);
+ });
+
+ it('should not focus the input if inputRef is not available', () => {
+ const inputRef = { current: null };
+
+ act(() => {
+ useChatStore.setState({ activeId: '1', activeTopicId: '2' });
+ });
+
+ renderHook(() => useAutoFocus(inputRef as any));
+
+ expect(inputRef.current).toBeNull();
+ });
+});
diff --git a/src/app/(main)/chat/(desktop)/features/ChatInput/index.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx
similarity index 83%
rename from src/app/(main)/chat/(desktop)/features/ChatInput/index.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx
index fad04d9d8e2b..e7d9d4bfbd68 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatInput/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { DraggablePanel } from '@lobehub/ui';
import { memo, useState } from 'react';
import { Flexbox } from 'react-layout-kit';
@@ -8,17 +10,18 @@ import {
HEADER_HEIGHT,
} from '@/const/layoutTokens';
import { useGlobalStore } from '@/store/global';
+import { systemStatusSelectors } from '@/store/global/selectors';
import Footer from './Footer';
import Head from './Header';
import TextArea from './TextArea';
-const ChatInput = memo(() => {
+const DesktopChatInput = memo(() => {
const [expand, setExpand] = useState(false);
const [inputHeight, updatePreference] = useGlobalStore((s) => [
- s.preference.inputHeight,
- s.updatePreference,
+ systemStatusSelectors.inputHeight(s),
+ s.updateSystemStatus,
]);
return (
@@ -52,4 +55,6 @@ const ChatInput = memo(() => {
);
});
-export default ChatInput;
+DesktopChatInput.displayName = 'DesktopChatInput';
+
+export default DesktopChatInput;
diff --git a/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useAutoFocus.ts b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useAutoFocus.ts
new file mode 100644
index 000000000000..78c5505b9feb
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useAutoFocus.ts
@@ -0,0 +1,13 @@
+import { TextAreaRef } from 'antd/es/input/TextArea';
+import { RefObject, useEffect } from 'react';
+
+import { useChatStore } from '@/store/chat';
+import { chatSelectors } from '@/store/chat/selectors';
+
+export const useAutoFocus = (inputRef: RefObject) => {
+ const chatKey = useChatStore(chatSelectors.currentChatKey);
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ }, [chatKey]);
+};
diff --git a/src/app/(main)/chat/(mobile)/features/ChatInput/Files.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/Files.tsx
similarity index 62%
rename from src/app/(main)/chat/(mobile)/features/ChatInput/Files.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/Files.tsx
index 1568101e130c..9916dbfd3b28 100644
--- a/src/app/(main)/chat/(mobile)/features/ChatInput/Files.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/Files.tsx
@@ -1,6 +1,7 @@
import { memo } from 'react';
+import { Flexbox } from 'react-layout-kit';
-import EditableFileList from '@/components/FileList/EditableFileList';
+import { EditableFileList } from '@/features/FileList';
import { useFileStore } from '@/store/file';
const Files = memo(() => {
@@ -9,9 +10,9 @@ const Files = memo(() => {
if (!inputFilesList || inputFilesList?.length === 0) return null;
return (
-
-
-
+
+
+
);
});
diff --git a/src/app/(main)/chat/(mobile)/features/ChatInput/index.tsx b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx
similarity index 83%
rename from src/app/(main)/chat/(mobile)/features/ChatInput/index.tsx
rename to src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx
index 2fa8b00d5b7b..767dd6914755 100644
--- a/src/app/(main)/chat/(mobile)/features/ChatInput/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { MobileChatInputArea, MobileChatSendButton } from '@lobehub/ui';
import { useTheme } from 'antd-style';
import { memo } from 'react';
@@ -10,7 +12,7 @@ import { useChatInput } from '@/features/ChatInput/useChatInput';
import Files from './Files';
-const ChatInputMobileLayout = memo(() => {
+const MobileChatInput = memo(() => {
const { t } = useTranslation('chat');
const theme = useTheme();
const { ref, onSend, loading, value, onInput, onStop, expand, setExpand } = useChatInput();
@@ -23,11 +25,12 @@ const ChatInputMobileLayout = memo(() => {
onSend={onSend}
placeholder={t('sendPlaceholder')}
ref={ref}
- safeArea
setExpand={setExpand}
style={{
- background: `linear-gradient(to bottom, ${theme.colorFillQuaternary}, transparent)`,
+ background: theme.colorBgLayout,
+ top: expand ? 0 : undefined,
width: '100%',
+ zIndex: 101,
}}
textAreaLeftAddons={ }
textAreaRightAddons={
@@ -44,4 +47,6 @@ const ChatInputMobileLayout = memo(() => {
);
});
-export default ChatInputMobileLayout;
+MobileChatInput.displayName = 'MobileChatInput';
+
+export default MobileChatInput;
diff --git a/src/app/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx b/src/app/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx
new file mode 100644
index 000000000000..522f38621584
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx
@@ -0,0 +1,17 @@
+import { PropsWithChildren } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+import Header from '../features/Header';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ return (
+ <>
+
+
+ {children}
+
+ >
+ );
+};
+
+export default Layout;
diff --git a/src/app/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx b/src/app/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx
new file mode 100644
index 000000000000..296f57178070
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx
@@ -0,0 +1,21 @@
+import { PropsWithChildren } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+import TopicSearchBar from '../features/TopicSearchBar';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ return (
+
+
+
+ {children}
+
+
+ );
+};
+
+export default Layout;
diff --git a/src/app/(main)/chat/(workspace)/@topic/default.tsx b/src/app/(main)/chat/(workspace)/@topic/default.tsx
new file mode 100644
index 000000000000..3ab9f79f9131
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@topic/default.tsx
@@ -0,0 +1,32 @@
+// import TopicListContent from './features/TopicListContent';
+import React, { Suspense, lazy } from 'react';
+
+import { isMobileDevice } from '@/utils/responsive';
+
+import Desktop from './_layout/Desktop';
+import Mobile from './_layout/Mobile';
+import SkeletonList from './features/SkeletonList';
+import SystemRole from './features/SystemRole';
+
+const TopicContent = lazy(() => import('./features/TopicListContent'));
+
+const Topic = () => {
+ const mobile = isMobileDevice();
+
+ const Layout = mobile ? Mobile : Desktop;
+
+ return (
+ <>
+ {!mobile && }
+
+ }>
+
+
+
+ >
+ );
+};
+
+Topic.displayName = 'ChatTopic';
+
+export default Topic;
diff --git a/src/app/(main)/chat/features/TopicListContent/Header.tsx b/src/app/(main)/chat/(workspace)/@topic/features/Header.tsx
similarity index 99%
rename from src/app/(main)/chat/features/TopicListContent/Header.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/Header.tsx
index 5816fb182326..f1c5cbff25c9 100644
--- a/src/app/(main)/chat/features/TopicListContent/Header.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/Header.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { ActionIcon, Icon } from '@lobehub/ui';
import { App, Dropdown, MenuProps } from 'antd';
import { MoreHorizontal, Search, Trash } from 'lucide-react';
diff --git a/src/app/(main)/chat/features/TopicListContent/Topic/SkeletonList.tsx b/src/app/(main)/chat/(workspace)/@topic/features/SkeletonList.tsx
similarity index 95%
rename from src/app/(main)/chat/features/TopicListContent/Topic/SkeletonList.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/SkeletonList.tsx
index 1b18f4df84b8..fdcec548bcb5 100644
--- a/src/app/(main)/chat/features/TopicListContent/Topic/SkeletonList.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/SkeletonList.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { Skeleton } from 'antd';
import { createStyles } from 'antd-style';
import { memo } from 'react';
@@ -45,7 +47,7 @@ export const Placeholder = memo(() => {
});
export const SkeletonList = memo(() => (
-
+
{Array.from({ length: 8 }).map((_, i) => (
))}
diff --git a/src/app/(main)/chat/(desktop)/features/SideBar/SystemRole/index.tsx b/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx
similarity index 96%
rename from src/app/(main)/chat/(desktop)/features/SideBar/SystemRole/index.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx
index 05959b9dc6ad..69e845d1ab0b 100644
--- a/src/app/(main)/chat/(desktop)/features/SideBar/SystemRole/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { ActionIcon, EditableMessage } from '@lobehub/ui';
import { Skeleton } from 'antd';
import { Edit } from 'lucide-react';
@@ -13,6 +15,7 @@ import { useAgentStore } from '@/store/agent';
import { agentSelectors } from '@/store/agent/selectors';
import { useGlobalStore } from '@/store/global';
import { ChatSettingsTabs } from '@/store/global/initialState';
+import { systemStatusSelectors } from '@/store/global/selectors';
import { useSessionStore } from '@/store/session';
import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors';
@@ -33,7 +36,7 @@ const SystemRole = memo(() => {
]);
const [showSystemRole, toggleSystemRole] = useGlobalStore((s) => [
- s.preference.showSystemRole,
+ systemStatusSelectors.showSystemRole(s),
s.toggleSystemRole,
]);
diff --git a/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx b/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx
new file mode 100644
index 000000000000..e80a29316fad
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx
@@ -0,0 +1,18 @@
+'use client';
+
+import { memo } from 'react';
+
+import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
+import { useSessionStore } from '@/store/session';
+import { sessionSelectors } from '@/store/session/selectors';
+
+import SystemRoleContent from './SystemRoleContent';
+
+const SystemRole = memo(() => {
+ const { isAgentEditable: showSystemRole } = useServerConfigStore(featureFlagsSelectors);
+ const isInbox = useSessionStore(sessionSelectors.isInboxSession);
+
+ return showSystemRole && !isInbox && ;
+});
+
+export default SystemRole;
diff --git a/src/app/(main)/chat/(desktop)/features/SideBar/SystemRole/style.ts b/src/app/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts
similarity index 100%
rename from src/app/(main)/chat/(desktop)/features/SideBar/SystemRole/style.ts
rename to src/app/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts
diff --git a/src/app/(main)/chat/features/TopicListContent/Topic/DefaultContent.tsx b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/DefaultContent.tsx
similarity index 100%
rename from src/app/(main)/chat/features/TopicListContent/Topic/DefaultContent.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/DefaultContent.tsx
diff --git a/src/app/(main)/chat/features/TopicListContent/Topic/TopicContent.tsx b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicContent.tsx
similarity index 100%
rename from src/app/(main)/chat/features/TopicListContent/Topic/TopicContent.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicContent.tsx
diff --git a/src/app/(main)/chat/features/TopicListContent/Topic/TopicItem.tsx b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem.tsx
similarity index 90%
rename from src/app/(main)/chat/features/TopicListContent/Topic/TopicItem.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem.tsx
index 66779df79b34..896018467acf 100644
--- a/src/app/(main)/chat/features/TopicListContent/Topic/TopicItem.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem.tsx
@@ -19,9 +19,17 @@ const useStyles = createStyles(({ css, token, isDarkMode }) => ({
`,
container: css`
cursor: pointer;
+
+ margin-block: 2px;
+ margin-inline: 8px;
padding: 8px;
+
border-radius: ${token.borderRadius}px;
+ &.topic-item {
+ width: calc(100% - 16px);
+ }
+
&:hover {
background: ${token.colorFillSecondary};
}
@@ -47,7 +55,7 @@ const TopicItem = memo(({ title, active, id, fav }) => {
return (
{
diff --git a/src/app/(main)/chat/features/TopicListContent/Topic/index.tsx b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx
similarity index 67%
rename from src/app/(main)/chat/features/TopicListContent/Topic/index.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx
index 8c9f591008e4..b5baf275559a 100644
--- a/src/app/(main)/chat/features/TopicListContent/Topic/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx
@@ -1,7 +1,9 @@
+'use client';
+
import { EmptyCard } from '@lobehub/ui';
-import { css, cx, useThemeMode } from 'antd-style';
+import { useThemeMode } from 'antd-style';
import isEqual from 'fast-deep-equal';
-import React, { memo, useCallback, useRef } from 'react';
+import React, { memo, useCallback, useMemo, useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { Virtuoso, VirtuosoHandle } from 'react-virtuoso';
@@ -9,44 +11,42 @@ import { Virtuoso, VirtuosoHandle } from 'react-virtuoso';
import { imageUrl } from '@/const/url';
import { useChatStore } from '@/store/chat';
import { topicSelectors } from '@/store/chat/selectors';
+import { useSessionStore } from '@/store/session';
import { useUserStore } from '@/store/user';
import { ChatTopic } from '@/types/topic';
-import { Placeholder, SkeletonList } from './SkeletonList';
+import { Placeholder, SkeletonList } from '../SkeletonList';
import TopicItem from './TopicItem';
-const container = css`
- > div {
- padding-inline: 8px;
- }
-`;
-
-export const Topic = memo(() => {
+const TopicListContent = memo(() => {
const { t } = useTranslation('chat');
const virtuosoRef = useRef(null);
const { isDarkMode } = useThemeMode();
- const [topicsInit, activeTopicId, topicLength] = useChatStore((s) => [
+ const [topicsInit, activeTopicId, topicLength, useFetchTopics] = useChatStore((s) => [
s.topicsInit,
s.activeTopicId,
topicSelectors.currentTopicLength(s),
+ s.useFetchTopics,
]);
const [visible, updateGuideState] = useUserStore((s) => [
s.preference.guide?.topic,
s.updateGuideState,
]);
- const topics = useChatStore(
- (s) => [
- {
- favorite: false,
- id: 'default',
- title: t('topic.defaultTitle'),
- } as ChatTopic,
- ...topicSelectors.displayTopics(s),
+ const activeTopicList = useChatStore(topicSelectors.displayTopics, isEqual);
+
+ const topics = useMemo(
+ () => [
+ { favorite: false, id: 'default', title: t('topic.defaultTitle') } as ChatTopic,
+ ...(activeTopicList || []),
],
- isEqual,
+ [activeTopicList],
);
+ const [sessionId] = useSessionStore((s) => [s.activeId]);
+
+ useFetchTopics(sessionId);
+
const itemContent = useCallback(
(index: number, { id, favorite, title }: ChatTopic) =>
index === 0 ? (
@@ -59,12 +59,13 @@ export const Topic = memo(() => {
const activeIndex = topics.findIndex((topic) => topic.id === activeTopicId);
- return !topicsInit ? (
-
- ) : (
-
- {topicLength === 0 && (
-
+ // first time loading or has no data
+ if (!topicsInit || !activeTopicList) return ;
+
+ return (
+ <>
+ {topicLength === 0 && visible && (
+
{
onVisibleChange={(visible) => {
updateGuideState({ topic: visible });
}}
- style={{ marginBottom: 6 }}
+ style={{ flex: 'none', marginBottom: 12 }}
title={t('topic.guide.title')}
visible={visible}
width={200}
@@ -84,7 +85,6 @@ export const Topic = memo(() => {
)}
item.id}
data={topics}
@@ -98,6 +98,10 @@ export const Topic = memo(() => {
exit: (velocity) => Math.abs(velocity) < 10,
}}
/>
-
+ >
);
});
+
+TopicListContent.displayName = 'TopicListContent';
+
+export default TopicListContent;
diff --git a/src/app/(main)/chat/features/TopicListContent/TopicSearchBar/index.tsx b/src/app/(main)/chat/(workspace)/@topic/features/TopicSearchBar/index.tsx
similarity index 88%
rename from src/app/(main)/chat/features/TopicListContent/TopicSearchBar/index.tsx
rename to src/app/(main)/chat/(workspace)/@topic/features/TopicSearchBar/index.tsx
index cac34c72c07b..762f7f628f2b 100644
--- a/src/app/(main)/chat/features/TopicListContent/TopicSearchBar/index.tsx
+++ b/src/app/(main)/chat/(workspace)/@topic/features/TopicSearchBar/index.tsx
@@ -1,16 +1,18 @@
+'use client';
+
import { SearchBar } from '@lobehub/ui';
import { useUnmount } from 'ahooks';
-import { useResponsive } from 'antd-style';
import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useChatStore } from '@/store/chat';
+import { useServerConfigStore } from '@/store/serverConfig';
const TopicSearchBar = memo<{ onClear?: () => void }>(({ onClear }) => {
const { t } = useTranslation('chat');
const [keywords, setKeywords] = useState('');
- const { mobile } = useResponsive();
+ const mobile = useServerConfigStore((s) => s.isMobile);
const [activeSessionId, useSearchTopics] = useChatStore((s) => [s.activeId, s.useSearchTopics]);
useSearchTopics(keywords, activeSessionId);
diff --git a/src/app/(main)/chat/(desktop)/features/ChatHeader/HeaderAction.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/HeaderAction.tsx
similarity index 89%
rename from src/app/(main)/chat/(desktop)/features/ChatHeader/HeaderAction.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/HeaderAction.tsx
index 05db819f2ac2..242ac099de76 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatHeader/HeaderAction.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/HeaderAction.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { ActionIcon } from '@lobehub/ui';
import { PanelRightClose, PanelRightOpen } from 'lucide-react';
import { memo } from 'react';
@@ -5,6 +7,7 @@ import { useTranslation } from 'react-i18next';
import { DESKTOP_HEADER_ICON_SIZE } from '@/const/layoutTokens';
import { useGlobalStore } from '@/store/global';
+import { systemStatusSelectors } from '@/store/global/selectors';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
import SettingButton from '../../../features/SettingButton';
@@ -14,7 +17,7 @@ const HeaderAction = memo(() => {
const { t } = useTranslation('chat');
const [showAgentSettings, toggleConfig] = useGlobalStore((s) => [
- s.preference.showChatSideBar,
+ systemStatusSelectors.showChatSideBar(s),
s.toggleChatSideBar,
]);
diff --git a/src/app/(main)/chat/(desktop)/features/ChatHeader/Main.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx
similarity index 50%
rename from src/app/(main)/chat/(desktop)/features/ChatHeader/Main.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx
index 7fd29e4fd5a7..a851dc4c4347 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatHeader/Main.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx
@@ -1,18 +1,27 @@
-import { Avatar, ChatHeaderTitle } from '@lobehub/ui';
+'use client';
+
+import { ActionIcon, Avatar, ChatHeaderTitle } from '@lobehub/ui';
import { Skeleton } from 'antd';
-import { memo } from 'react';
+import { PanelLeftClose, PanelLeftOpen } from 'lucide-react';
+import { Suspense, memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
+import { DESKTOP_HEADER_ICON_SIZE } from '@/const/layoutTokens';
import { useOpenChatSettings } from '@/hooks/useInterceptingRoutes';
+import { useGlobalStore } from '@/store/global';
+import { systemStatusSelectors } from '@/store/global/selectors';
import { useSessionStore } from '@/store/session';
import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors';
+import { useInitAgentConfig } from '../../useInitAgentConfig';
import Tags from './Tags';
const Main = memo(() => {
const { t } = useTranslation('chat');
+ useInitAgentConfig();
+
const [init, isInbox, title, description, avatar, backgroundColor] = useSessionStore((s) => [
sessionSelectors.isSomeSessionActive(s),
sessionSelectors.isInboxSession(s),
@@ -26,6 +35,8 @@ const Main = memo(() => {
const displayTitle = isInbox ? t('inbox.title') : title;
const displayDesc = isInbox ? t('inbox.desc') : description;
+ const showSessionPanel = useGlobalStore(systemStatusSelectors.showSessionPanel);
+ const updateSystemStatus = useGlobalStore((s) => s.updateSystemStatus);
return !init ? (
@@ -37,11 +48,25 @@ const Main = memo(() => {
/>
) : (
-
+
+ {
+ {
+ updateSystemStatus({
+ sessionsWidth: showSessionPanel ? 0 : 320,
+ showSessionPanel: !showSessionPanel,
+ });
+ }}
+ size={DESKTOP_HEADER_ICON_SIZE}
+ title={t('agentsAndConversations')}
+ />
+ }
openChatSettings()}
size={40}
title={title}
/>
@@ -50,4 +75,17 @@ const Main = memo(() => {
);
});
-export default Main;
+export default () => (
+
+ }
+ >
+
+
+);
diff --git a/src/app/(main)/chat/(desktop)/features/ChatHeader/Tags.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx
similarity index 95%
rename from src/app/(main)/chat/(desktop)/features/ChatHeader/Tags.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx
index acc32e75ad24..8a387ecf08e8 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatHeader/Tags.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags.tsx
@@ -19,7 +19,7 @@ const TitleTags = memo(() => {
const showPlugin = useUserStore(modelProviderSelectors.isModelEnabledFunctionCall(model));
return (
-
+
diff --git a/src/app/(main)/chat/(desktop)/features/ChatHeader/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx
similarity index 54%
rename from src/app/(main)/chat/(desktop)/features/ChatHeader/index.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx
index 6ec17cea3793..c45c62ee4cb6 100644
--- a/src/app/(main)/chat/(desktop)/features/ChatHeader/index.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/index.tsx
@@ -1,9 +1,8 @@
import { ChatHeader } from '@lobehub/ui';
-import { memo } from 'react';
import HeaderAction from './HeaderAction';
import Main from './Main';
-const Header = memo(() => } right={ } />);
+const Header = () => } right={ } style={{ zIndex: 11 }} />;
export default Header;
diff --git a/src/app/(main)/chat/(desktop)/features/HotKeys.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/HotKeys.tsx
similarity index 98%
rename from src/app/(main)/chat/(desktop)/features/HotKeys.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/HotKeys.tsx
index d53610cfb2a9..04fa9f99322a 100644
--- a/src/app/(main)/chat/(desktop)/features/HotKeys.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/HotKeys.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import isEqual from 'fast-deep-equal';
import { useCallback } from 'react';
import { useHotkeys } from 'react-hotkeys-hook';
diff --git a/src/app/(main)/chat/(desktop)/features/SideBar/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx
similarity index 56%
rename from src/app/(main)/chat/(desktop)/features/SideBar/index.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx
index 0455b40c499b..97e415d37bee 100644
--- a/src/app/(main)/chat/(desktop)/features/SideBar/index.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/TopicPanel.tsx
@@ -1,18 +1,14 @@
+'use client';
+
import { DraggablePanel, DraggablePanelContainer } from '@lobehub/ui';
-import { createStyles } from 'antd-style';
-import dynamic from 'next/dynamic';
-import { memo } from 'react';
+import { createStyles, useResponsive } from 'antd-style';
+import isEqual from 'fast-deep-equal';
+import { PropsWithChildren, memo, useEffect, useState } from 'react';
import SafeSpacing from '@/components/SafeSpacing';
import { CHAT_SIDEBAR_WIDTH } from '@/const/layoutTokens';
import { useGlobalStore } from '@/store/global';
-import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
-import { useSessionStore } from '@/store/session';
-import { sessionSelectors } from '@/store/session/selectors';
-
-import TopicListContent from '../../../features/TopicListContent';
-
-const SystemRole = dynamic(() => import('./SystemRole'));
+import { systemStatusSelectors } from '@/store/global/selectors';
const useStyles = createStyles(({ css, token }) => ({
content: css`
@@ -21,7 +17,7 @@ const useStyles = createStyles(({ css, token }) => ({
height: 100% !important;
`,
drawer: css`
- z-index: 0;
+ z-index: 10;
background: ${token.colorBgLayout};
`,
header: css`
@@ -29,15 +25,26 @@ const useStyles = createStyles(({ css, token }) => ({
`,
}));
-const Desktop = memo(() => {
+const TopicPanel = memo(({ children }: PropsWithChildren) => {
const { styles } = useStyles();
+ const { md = true, lg = true } = useResponsive();
const [showAgentSettings, toggleConfig] = useGlobalStore((s) => [
- s.preference.showChatSideBar,
+ systemStatusSelectors.showChatSideBar(s),
s.toggleChatSideBar,
]);
- const { isAgentEditable: showSystemRole } = useServerConfigStore(featureFlagsSelectors);
- const isInbox = useSessionStore(sessionSelectors.isInboxSession);
+ const [cacheExpand, setCacheExpand] = useState(Boolean(showAgentSettings));
+
+ const handleExpand = (expand: boolean) => {
+ if (isEqual(expand, Boolean(showAgentSettings))) return;
+ toggleConfig(expand);
+ setCacheExpand(expand);
+ };
+
+ useEffect(() => {
+ if (lg && cacheExpand) toggleConfig(true);
+ if (!lg) toggleConfig(false);
+ }, [lg, cacheExpand]);
return (
{
}}
expand={showAgentSettings}
minWidth={CHAT_SIDEBAR_WIDTH}
- mode={'fixed'}
- onExpandChange={toggleConfig}
+ mode={md ? 'fixed' : 'float'}
+ onExpandChange={handleExpand}
placement={'right'}
showHandlerWideArea={false}
>
@@ -61,11 +68,10 @@ const Desktop = memo(() => {
}}
>
- {showSystemRole && !isInbox && }
-
+ {children}
);
});
-export default Desktop;
+export default TopicPanel;
diff --git a/src/app/(main)/chat/(workspace)/_layout/Desktop/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Desktop/index.tsx
new file mode 100644
index 000000000000..9a80f23077b8
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/Desktop/index.tsx
@@ -0,0 +1,35 @@
+import { Flexbox } from 'react-layout-kit';
+
+import { LayoutProps } from '../type';
+import ChatHeader from './ChatHeader';
+import HotKeys from './HotKeys';
+import TopicPanel from './TopicPanel';
+
+const Layout = ({ children, topic, conversation }: LayoutProps) => {
+ return (
+ <>
+
+
+
+ {conversation}
+
+ {children}
+ {topic}
+
+
+ >
+ );
+};
+
+Layout.displayName = 'DesktopConversationLayout';
+
+export default Layout;
diff --git a/src/app/(main)/chat/(mobile)/mobile/ChatHeader/ChatHeaderTitle.tsx b/src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/ChatHeaderTitle.tsx
similarity index 100%
rename from src/app/(main)/chat/(mobile)/mobile/ChatHeader/ChatHeaderTitle.tsx
rename to src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/ChatHeaderTitle.tsx
index 620f866784d8..388f0e6b6dc2 100644
--- a/src/app/(main)/chat/(mobile)/mobile/ChatHeader/ChatHeaderTitle.tsx
+++ b/src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/ChatHeaderTitle.tsx
@@ -30,6 +30,7 @@ const ChatHeaderTitle = memo(() => {
toggleConfig()}>
+ {topic?.title || t('topic.title')}
{
color: theme.colorTextDescription,
}}
/>
- {topic?.title || t('topic.title')}
}
title={
diff --git a/src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/index.tsx
new file mode 100644
index 000000000000..6ffa72924948
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/Mobile/ChatHeader/index.tsx
@@ -0,0 +1,37 @@
+'use client';
+
+import { MobileNavBar } from '@lobehub/ui';
+import { memo, useState } from 'react';
+
+import { useInitAgentConfig } from '@/app/(main)/chat/(workspace)/_layout/useInitAgentConfig';
+import { useQueryRoute } from '@/hooks/useQueryRoute';
+import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
+
+import SettingButton from '../../../features/SettingButton';
+import ShareButton from '../../../features/ShareButton';
+import ChatHeaderTitle from './ChatHeaderTitle';
+
+const MobileHeader = memo(() => {
+ const router = useQueryRoute();
+ const [open, setOpen] = useState(false);
+
+ const { isAgentEditable } = useServerConfigStore(featureFlagsSelectors);
+ useInitAgentConfig();
+
+ return (
+ }
+ onBackClick={() => router.push('/chat', { query: { session: '' }, replace: true })}
+ right={
+ <>
+
+ {isAgentEditable && }
+ >
+ }
+ showBackButton
+ style={{ width: '100%' }}
+ />
+ );
+});
+
+export default MobileHeader;
diff --git a/src/app/(main)/chat/(workspace)/_layout/Mobile/TopicModal.tsx b/src/app/(main)/chat/(workspace)/_layout/Mobile/TopicModal.tsx
new file mode 100644
index 000000000000..9a65cf6973e6
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/Mobile/TopicModal.tsx
@@ -0,0 +1,35 @@
+'use client';
+
+import { Modal } from '@lobehub/ui';
+import { PropsWithChildren, memo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { useGlobalStore } from '@/store/global';
+import { systemStatusSelectors } from '@/store/global/selectors';
+
+import { useWorkspaceModal } from '../../features/useWorkspaceModal';
+
+const Topics = memo(({ children }: PropsWithChildren) => {
+ const [showAgentSettings, toggleConfig] = useGlobalStore((s) => [
+ systemStatusSelectors.mobileShowTopic(s),
+ s.toggleMobileTopic,
+ ]);
+ const [open, setOpen] = useWorkspaceModal(showAgentSettings, toggleConfig);
+ const { t } = useTranslation('chat');
+
+ return (
+ setOpen(false)}
+ open={open}
+ styles={{
+ body: { padding: 0 },
+ }}
+ title={t('topic.title')}
+ >
+ {children}
+
+ );
+});
+
+export default Topics;
diff --git a/src/app/(main)/chat/(workspace)/_layout/Mobile/index.tsx b/src/app/(main)/chat/(workspace)/_layout/Mobile/index.tsx
new file mode 100644
index 000000000000..4911326adc1f
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/Mobile/index.tsx
@@ -0,0 +1,21 @@
+import MobileContentLayout from '@/components/server/MobileNavLayout';
+
+import { LayoutProps } from '../type';
+import ChatHeader from './ChatHeader';
+import TopicModal from './TopicModal';
+
+const Layout = ({ children, topic, conversation }: LayoutProps) => {
+ return (
+ <>
+ } style={{ overflowY: 'hidden' }}>
+ {conversation}
+ {children}
+
+ {topic}
+ >
+ );
+};
+
+Layout.displayName = 'MobileConversationLayout';
+
+export default Layout;
diff --git a/src/app/(main)/chat/(workspace)/_layout/type.ts b/src/app/(main)/chat/(workspace)/_layout/type.ts
new file mode 100644
index 000000000000..e7d5b6781e74
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/type.ts
@@ -0,0 +1,7 @@
+import { ReactNode } from 'react';
+
+export interface LayoutProps {
+ children: ReactNode;
+ conversation: ReactNode;
+ topic: ReactNode;
+}
diff --git a/src/app/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts b/src/app/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts
new file mode 100644
index 000000000000..82b09953e3ae
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/_layout/useInitAgentConfig.ts
@@ -0,0 +1,10 @@
+import { useAgentStore } from '@/store/agent';
+import { useSessionStore } from '@/store/session';
+
+export const useInitAgentConfig = () => {
+ const [useFetchAgentConfig] = useAgentStore((s) => [s.useFetchAgentConfig]);
+
+ const [sessionId] = useSessionStore((s) => [s.activeId]);
+
+ return useFetchAgentConfig(sessionId);
+};
diff --git a/src/app/(main)/chat/features/PluginTag/PluginStatus.tsx b/src/app/(main)/chat/(workspace)/features/PluginTag/PluginStatus.tsx
similarity index 100%
rename from src/app/(main)/chat/features/PluginTag/PluginStatus.tsx
rename to src/app/(main)/chat/(workspace)/features/PluginTag/PluginStatus.tsx
diff --git a/src/app/(main)/chat/features/PluginTag/index.tsx b/src/app/(main)/chat/(workspace)/features/PluginTag/index.tsx
similarity index 99%
rename from src/app/(main)/chat/features/PluginTag/index.tsx
rename to src/app/(main)/chat/(workspace)/features/PluginTag/index.tsx
index 5a775ffc5d8e..9cd9d46db146 100644
--- a/src/app/(main)/chat/features/PluginTag/index.tsx
+++ b/src/app/(main)/chat/(workspace)/features/PluginTag/index.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { Avatar, Icon, Tag } from '@lobehub/ui';
import type { MenuProps } from 'antd';
import { Dropdown } from 'antd';
diff --git a/src/app/(main)/chat/features/SettingButton.tsx b/src/app/(main)/chat/(workspace)/features/SettingButton.tsx
similarity index 92%
rename from src/app/(main)/chat/features/SettingButton.tsx
rename to src/app/(main)/chat/(workspace)/features/SettingButton.tsx
index c82560540ff9..e8092366746d 100644
--- a/src/app/(main)/chat/features/SettingButton.tsx
+++ b/src/app/(main)/chat/(workspace)/features/SettingButton.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { ActionIcon } from '@lobehub/ui';
import { AlignJustify } from 'lucide-react';
import { memo } from 'react';
@@ -13,7 +15,7 @@ const SettingButton = memo<{ mobile?: boolean }>(({ mobile }) => {
return (
openChatSettings()}
size={mobile ? MOBILE_HEADER_ICON_SIZE : DESKTOP_HEADER_ICON_SIZE}
title={t('header.session', { ns: 'setting' })}
/>
diff --git a/src/app/(main)/chat/features/ShareButton/Preview.tsx b/src/app/(main)/chat/(workspace)/features/ShareButton/Preview.tsx
similarity index 94%
rename from src/app/(main)/chat/features/ShareButton/Preview.tsx
rename to src/app/(main)/chat/(workspace)/features/ShareButton/Preview.tsx
index 475d09eefc4a..62408f385c55 100644
--- a/src/app/(main)/chat/features/ShareButton/Preview.tsx
+++ b/src/app/(main)/chat/(workspace)/features/ShareButton/Preview.tsx
@@ -1,4 +1,5 @@
-import { Avatar, ChatHeaderTitle, Logo, Markdown } from '@lobehub/ui';
+import { Avatar, ChatHeaderTitle, Markdown } from '@lobehub/ui';
+import { LobeChat } from '@lobehub/ui/brand';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
@@ -62,7 +63,7 @@ const Preview = memo(
{withFooter ? (
-
+
{pkg.homepage}
) : (
diff --git a/src/app/(main)/chat/features/ShareButton/ShareModal.tsx b/src/app/(main)/chat/(workspace)/features/ShareButton/ShareModal.tsx
similarity index 100%
rename from src/app/(main)/chat/features/ShareButton/ShareModal.tsx
rename to src/app/(main)/chat/(workspace)/features/ShareButton/ShareModal.tsx
diff --git a/src/app/(main)/chat/features/ShareButton/index.tsx b/src/app/(main)/chat/(workspace)/features/ShareButton/index.tsx
similarity index 85%
rename from src/app/(main)/chat/features/ShareButton/index.tsx
rename to src/app/(main)/chat/(workspace)/features/ShareButton/index.tsx
index 7bd94820c36d..302789cd5b5a 100644
--- a/src/app/(main)/chat/features/ShareButton/index.tsx
+++ b/src/app/(main)/chat/(workspace)/features/ShareButton/index.tsx
@@ -1,13 +1,16 @@
+'use client';
+
import { ActionIcon } from '@lobehub/ui';
import { Share2 } from 'lucide-react';
import dynamic from 'next/dynamic';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
-import useMergeState from 'use-merge-value';
import { DESKTOP_HEADER_ICON_SIZE, MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
import { useChatStore } from '@/store/chat';
+import { useWorkspaceModal } from '../useWorkspaceModal';
+
const ShareModal = dynamic(() => import('./ShareModal'));
interface ShareButtonProps {
mobile?: boolean;
@@ -16,11 +19,7 @@ interface ShareButtonProps {
}
const ShareButton = memo(({ mobile, setOpen, open }) => {
- const [isModalOpen, setIsModalOpen] = useMergeState(false, {
- defaultValue: false,
- onChange: setOpen,
- value: open,
- });
+ const [isModalOpen, setIsModalOpen] = useWorkspaceModal(open, setOpen);
const { t } = useTranslation('common');
const [shareLoading] = useChatStore((s) => [s.shareLoading]);
diff --git a/src/app/(main)/chat/features/ShareButton/style.ts b/src/app/(main)/chat/(workspace)/features/ShareButton/style.ts
similarity index 100%
rename from src/app/(main)/chat/features/ShareButton/style.ts
rename to src/app/(main)/chat/(workspace)/features/ShareButton/style.ts
diff --git a/src/app/(main)/chat/features/ShareButton/type.ts b/src/app/(main)/chat/(workspace)/features/ShareButton/type.ts
similarity index 100%
rename from src/app/(main)/chat/features/ShareButton/type.ts
rename to src/app/(main)/chat/(workspace)/features/ShareButton/type.ts
diff --git a/src/app/(main)/chat/features/ShareButton/useScreenshot.ts b/src/app/(main)/chat/(workspace)/features/ShareButton/useScreenshot.ts
similarity index 100%
rename from src/app/(main)/chat/features/ShareButton/useScreenshot.ts
rename to src/app/(main)/chat/(workspace)/features/ShareButton/useScreenshot.ts
diff --git a/src/app/(main)/chat/(workspace)/features/TelemetryNotification.tsx b/src/app/(main)/chat/(workspace)/features/TelemetryNotification.tsx
new file mode 100644
index 000000000000..f73122e96175
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/features/TelemetryNotification.tsx
@@ -0,0 +1,93 @@
+'use client';
+
+import { Avatar, Icon } from '@lobehub/ui';
+import { Button } from 'antd';
+import { createStyles } from 'antd-style';
+import { LucideArrowUpRightFromSquare, TelescopeIcon } from 'lucide-react';
+import Link from 'next/link';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import Notification from '@/components/Notification';
+import { PRIVACY_URL } from '@/const/url';
+import { useServerConfigStore } from '@/store/serverConfig';
+import { serverConfigSelectors } from '@/store/serverConfig/selectors';
+import { useUserStore } from '@/store/user';
+import { preferenceSelectors } from '@/store/user/selectors';
+
+const useStyles = createStyles(({ css, token }) => ({
+ desc: css`
+ color: ${token.colorTextSecondary};
+ `,
+ title: css`
+ font-size: 18px;
+ font-weight: bold;
+ `,
+}));
+
+const TelemetryNotification = memo<{ mobile?: boolean }>(({ mobile }) => {
+ const { styles, theme } = useStyles();
+
+ const { t } = useTranslation('common');
+ const shouldCheck = useServerConfigStore(serverConfigSelectors.enabledTelemetryChat);
+ const isPreferenceInit = useUserStore(preferenceSelectors.isPreferenceInit);
+
+ const [useCheckTrace, updatePreference] = useUserStore((s) => [
+ s.useCheckTrace,
+ s.updatePreference,
+ ]);
+
+ const { data: showModal, mutate } = useCheckTrace(shouldCheck && isPreferenceInit);
+
+ const updateTelemetry = (telemetry: boolean) => {
+ updatePreference({ telemetry });
+ mutate();
+ };
+
+ return (
+
+
+ }
+ background={theme.geekblue1}
+ style={{ color: theme.geekblue7 }}
+ >
+
+
+
+ {t('telemetry.title')}
+
+ {t('telemetry.desc')}
+
+
+ {t('telemetry.learnMore')}
+
+
+
+
+
+
+ {
+ updateTelemetry(true);
+ }}
+ type={'primary'}
+ >
+ {t('telemetry.allow')}
+
+ {
+ updateTelemetry(false);
+ }}
+ type={'text'}
+ >
+ {t('telemetry.deny')}
+
+
+
+
+ );
+});
+
+export default TelemetryNotification;
diff --git a/src/app/(main)/chat/(workspace)/features/useWorkspaceModal.tsx b/src/app/(main)/chat/(workspace)/features/useWorkspaceModal.tsx
new file mode 100644
index 000000000000..56be274e4a32
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/features/useWorkspaceModal.tsx
@@ -0,0 +1,27 @@
+import { useEffect } from 'react';
+import useMergeState from 'use-merge-value';
+
+import { useQuery } from '@/hooks/useQuery';
+import { useServerConfigStore } from '@/store/serverConfig';
+
+export const useWorkspaceModal = (
+ value?: boolean,
+ onChange?: (v: boolean) => void,
+): [boolean, (v: boolean) => void] => {
+ const mobile = useServerConfigStore((s) => s.isMobile);
+ const { showMobileWorkspace } = useQuery();
+ const [isModalOpen, setIsModalOpen] = useMergeState(false, {
+ defaultValue: false,
+ onChange,
+ value,
+ });
+
+ useEffect(() => {
+ if (!mobile) return;
+ if (!showMobileWorkspace) {
+ setIsModalOpen(false);
+ }
+ }, [mobile, showMobileWorkspace]);
+
+ return [isModalOpen, setIsModalOpen];
+};
diff --git a/src/app/(main)/chat/(workspace)/layout.ts b/src/app/(main)/chat/(workspace)/layout.ts
new file mode 100644
index 000000000000..e8112e9befaa
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/layout.ts
@@ -0,0 +1,11 @@
+import ServerLayout from '@/components/server/ServerLayout';
+
+import Desktop from './_layout/Desktop';
+import Mobile from './_layout/Mobile';
+import { LayoutProps } from './_layout/type';
+
+const Layout = ServerLayout({ Desktop, Mobile });
+
+Layout.displayName = 'ChatConversationLayout';
+
+export default Layout;
diff --git a/src/app/(main)/chat/(workspace)/page.tsx b/src/app/(main)/chat/(workspace)/page.tsx
new file mode 100644
index 000000000000..cfd081ec3b78
--- /dev/null
+++ b/src/app/(main)/chat/(workspace)/page.tsx
@@ -0,0 +1,39 @@
+import StructuredData from '@/components/StructuredData';
+import { ldModule } from '@/server/ld';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import PageTitle from '../features/PageTitle';
+import TelemetryNotification from './features/TelemetryNotification';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('metadata');
+ return metadataModule.generate({
+ description: t('chat.description'),
+ title: t('chat.title'),
+ url: '/chat',
+ });
+};
+
+const Page = async () => {
+ const mobile = isMobileDevice();
+ const { t } = await translation('metadata');
+ const ld = ldModule.generate({
+ description: t('chat.description'),
+ title: t('chat.title'),
+ url: '/chat',
+ });
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+Page.displayName = 'Chat';
+
+export default Page;
diff --git a/src/app/(main)/chat/@session/_layout/Desktop/PanelBody.tsx b/src/app/(main)/chat/@session/_layout/Desktop/PanelBody.tsx
new file mode 100644
index 000000000000..27547db693be
--- /dev/null
+++ b/src/app/(main)/chat/@session/_layout/Desktop/PanelBody.tsx
@@ -0,0 +1,22 @@
+'use client';
+
+import { DraggablePanelBody } from '@lobehub/ui';
+import { createStyles } from 'antd-style';
+import { PropsWithChildren, memo } from 'react';
+
+const useStyles = createStyles(
+ ({ css }) => css`
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ padding: 8px 8px 0;
+ `,
+);
+
+const PanelBody = memo(({ children }) => {
+ const { styles } = useStyles();
+
+ return {children} ;
+});
+
+export default PanelBody;
diff --git a/src/app/(main)/chat/_layout/Desktop/SessionHeader.tsx b/src/app/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx
similarity index 90%
rename from src/app/(main)/chat/_layout/Desktop/SessionHeader.tsx
rename to src/app/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx
index 082d3768aff0..b5b79a89fd4f 100644
--- a/src/app/(main)/chat/_layout/Desktop/SessionHeader.tsx
+++ b/src/app/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx
@@ -1,4 +1,7 @@
-import { ActionIcon, Logo } from '@lobehub/ui';
+'use client';
+
+import { ActionIcon } from '@lobehub/ui';
+import { LobeChat } from '@lobehub/ui/brand';
import { createStyles } from 'antd-style';
import { MessageSquarePlus } from 'lucide-react';
import { memo } from 'react';
@@ -35,7 +38,7 @@ const Header = memo(() => {
-
+
{enableWebrtc && }
{showCreateSession && (
diff --git a/src/app/(main)/chat/@session/_layout/Desktop/index.tsx b/src/app/(main)/chat/@session/_layout/Desktop/index.tsx
new file mode 100644
index 000000000000..c22a786de257
--- /dev/null
+++ b/src/app/(main)/chat/@session/_layout/Desktop/index.tsx
@@ -0,0 +1,18 @@
+import { PropsWithChildren } from 'react';
+
+import PanelBody from './PanelBody';
+import Header from './SessionHeader';
+
+const DesktopLayout = ({ children }: PropsWithChildren) => {
+ return (
+ <>
+
+ {children}
+ {/* ↓ cloud slot ↓ */}
+
+ {/* ↑ cloud slot ↑ */}
+ >
+ );
+};
+
+export default DesktopLayout;
diff --git a/src/app/(main)/chat/(mobile)/features/SessionHeader.tsx b/src/app/(main)/chat/@session/_layout/Mobile/SessionHeader.tsx
similarity index 58%
rename from src/app/(main)/chat/(mobile)/features/SessionHeader.tsx
rename to src/app/(main)/chat/@session/_layout/Mobile/SessionHeader.tsx
index 42fd68338cb6..dbde00f0be19 100644
--- a/src/app/(main)/chat/(mobile)/features/SessionHeader.tsx
+++ b/src/app/(main)/chat/@session/_layout/Mobile/SessionHeader.tsx
@@ -1,5 +1,7 @@
-import { ActionIcon, Avatar, Logo, MobileNavBar } from '@lobehub/ui';
-import { createStyles } from 'antd-style';
+'use client';
+
+import { ActionIcon, MobileNavBar } from '@lobehub/ui';
+import { LobeChat } from '@lobehub/ui/brand';
import { MessageSquarePlus } from 'lucide-react';
import { useRouter } from 'next/navigation';
import { memo } from 'react';
@@ -7,37 +9,23 @@ import { Flexbox } from 'react-layout-kit';
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
import SyncStatusInspector from '@/features/SyncStatusInspector';
+import UserAvatar from '@/features/User/UserAvatar';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
import { useSessionStore } from '@/store/session';
-import { useUserStore } from '@/store/user';
-import { userProfileSelectors } from '@/store/user/selectors';
import { mobileHeaderSticky } from '@/styles/mobileHeader';
-export const useStyles = createStyles(({ css, token }) => ({
- logo: css`
- fill: ${token.colorText};
- `,
- top: css`
- position: sticky;
- top: 0;
- `,
-}));
-
const Header = memo(() => {
const [createSession] = useSessionStore((s) => [s.createSession]);
const router = useRouter();
- const avatar = useUserStore(userProfileSelectors.userAvatar);
- const { showCreateSession } = useServerConfigStore(featureFlagsSelectors);
+ const { enableWebrtc, showCreateSession } = useServerConfigStore(featureFlagsSelectors);
return (
- router.push('/me')}>
- {avatar ?
:
}
-
-
-
+ router.push('/me')} size={32} />
+
+ {enableWebrtc && }
}
right={
diff --git a/src/app/(main)/chat/@session/_layout/Mobile/index.tsx b/src/app/(main)/chat/@session/_layout/Mobile/index.tsx
new file mode 100644
index 000000000000..0fa8af4da5ff
--- /dev/null
+++ b/src/app/(main)/chat/@session/_layout/Mobile/index.tsx
@@ -0,0 +1,22 @@
+import { PropsWithChildren } from 'react';
+
+import MobileContentLayout from '@/components/server/MobileNavLayout';
+
+import SessionSearchBar from '../../features/SessionSearchBar';
+import SessionHeader from './SessionHeader';
+
+const MobileLayout = ({ children }: PropsWithChildren) => {
+ return (
+ } withNav>
+
+
+
+ {children}
+ {/* ↓ cloud slot ↓ */}
+
+ {/* ↑ cloud slot ↑ */}
+
+ );
+};
+
+export default MobileLayout;
diff --git a/src/app/(main)/chat/@session/default.tsx b/src/app/(main)/chat/@session/default.tsx
new file mode 100644
index 000000000000..a64533d6e17f
--- /dev/null
+++ b/src/app/(main)/chat/@session/default.tsx
@@ -0,0 +1,29 @@
+import { Suspense, lazy } from 'react';
+
+import ServerLayout from '@/components/server/ServerLayout';
+
+import Desktop from './_layout/Desktop';
+import Mobile from './_layout/Mobile';
+import SessionHydration from './features/SessionHydration';
+import SkeletonList from './features/SkeletonList';
+
+const SessionListContent = lazy(() => import('./features/SessionListContent'));
+
+const Layout = ServerLayout({ Desktop, Mobile });
+
+const Session = () => {
+ return (
+ <>
+
+ }>
+
+
+
+
+ >
+ );
+};
+
+Session.displayName = 'Session';
+
+export default Session;
diff --git a/src/app/(main)/chat/components/SessionHydration/index.tsx b/src/app/(main)/chat/@session/features/SessionHydration.tsx
similarity index 63%
rename from src/app/(main)/chat/components/SessionHydration/index.tsx
rename to src/app/(main)/chat/@session/features/SessionHydration.tsx
index 57ef0e9da25f..94d18df0decd 100644
--- a/src/app/(main)/chat/components/SessionHydration/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionHydration.tsx
@@ -1,31 +1,37 @@
'use client';
-import { useResponsive } from 'antd-style';
import { useQueryState } from 'nuqs';
import { parseAsString } from 'nuqs/server';
import { memo, useEffect } from 'react';
import { createStoreUpdater } from 'zustand-utils';
+import { useAgentStore } from '@/store/agent';
+import { useChatStore } from '@/store/chat';
import { useSessionStore } from '@/store/session';
// sync outside state to useSessionStore
const SessionHydration = memo(() => {
const useStoreUpdater = createStoreUpdater(useSessionStore);
-
- const { mobile } = useResponsive();
- useStoreUpdater('isMobile', mobile);
+ const useAgentStoreUpdater = createStoreUpdater(useAgentStore);
+ const useChatStoreUpdater = createStoreUpdater(useChatStore);
+ const [switchTopic] = useChatStore((s) => [s.switchTopic]);
// two-way bindings the url and session store
const [session, setSession] = useQueryState(
'session',
- parseAsString.withDefault('inbox').withOptions({ history: 'replace', throttleMs: 500 }),
+ parseAsString.withDefault('inbox').withOptions({ history: 'replace', throttleMs: 50 }),
);
useStoreUpdater('activeId', session);
+ useAgentStoreUpdater('activeId', session);
+ useChatStoreUpdater('activeId', session);
useEffect(() => {
const unsubscribe = useSessionStore.subscribe(
(s) => s.activeId,
- (state) => setSession(state),
+ (state) => {
+ switchTopic();
+ setSession(state);
+ },
);
return () => {
diff --git a/src/app/(main)/chat/features/SessionListContent/CollapseGroup/Actions.tsx b/src/app/(main)/chat/@session/features/SessionListContent/CollapseGroup/Actions.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/CollapseGroup/Actions.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/CollapseGroup/Actions.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/CollapseGroup/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/CollapseGroup/index.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/CollapseGroup/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/CollapseGroup/index.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/DefaultMode.tsx b/src/app/(main)/chat/@session/features/SessionListContent/DefaultMode.tsx
similarity index 84%
rename from src/app/(main)/chat/features/SessionListContent/DefaultMode.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/DefaultMode.tsx
index 911163c8eef3..b81a098fcbaa 100644
--- a/src/app/(main)/chat/features/SessionListContent/DefaultMode.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/DefaultMode.tsx
@@ -4,9 +4,11 @@ import { memo, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useGlobalStore } from '@/store/global';
-import { preferenceSelectors } from '@/store/global/selectors';
+import { systemStatusSelectors } from '@/store/global/selectors';
import { useSessionStore } from '@/store/session';
import { sessionSelectors } from '@/store/session/selectors';
+import { useUserStore } from '@/store/user';
+import { authSelectors } from '@/store/user/selectors';
import { SessionDefaultGroup } from '@/types/session';
import Actions from '../SessionListContent/CollapseGroup/Actions';
@@ -16,23 +18,24 @@ import SessionList from './List';
import ConfigGroupModal from './Modals/ConfigGroupModal';
import RenameGroupModal from './Modals/RenameGroupModal';
-const SessionDefaultMode = memo(() => {
+const DefaultMode = memo(() => {
const { t } = useTranslation('chat');
const [activeGroupId, setActiveGroupId] = useState();
const [renameGroupModalOpen, setRenameGroupModalOpen] = useState(false);
const [configGroupModalOpen, setConfigGroupModalOpen] = useState(false);
+ const isLogin = useUserStore(authSelectors.isLogin);
const [useFetchSessions] = useSessionStore((s) => [s.useFetchSessions]);
- useFetchSessions();
+ useFetchSessions(isLogin);
const defaultSessions = useSessionStore(sessionSelectors.defaultSessions, isEqual);
const customSessionGroups = useSessionStore(sessionSelectors.customSessionGroups, isEqual);
const pinnedSessions = useSessionStore(sessionSelectors.pinnedSessions, isEqual);
- const [sessionGroupKeys, updatePreference] = useGlobalStore((s) => [
- preferenceSelectors.sessionGroupKeys(s),
- s.updatePreference,
+ const [sessionGroupKeys, updateSystemStatus] = useGlobalStore((s) => [
+ systemStatusSelectors.sessionGroupKeys(s),
+ s.updateSystemStatus,
]);
const items = useMemo(
@@ -80,7 +83,7 @@ const SessionDefaultMode = memo(() => {
onChange={(keys) => {
const expandSessionGroupKeys = typeof keys === 'string' ? [keys] : keys;
- updatePreference({ expandSessionGroupKeys });
+ updateSystemStatus({ expandSessionGroupKeys });
}}
/>
{activeGroupId && (
@@ -98,6 +101,6 @@ const SessionDefaultMode = memo(() => {
);
});
-SessionDefaultMode.displayName = 'SessionDefaultMode';
+DefaultMode.displayName = 'SessionDefaultMode';
-export default SessionDefaultMode;
+export default DefaultMode;
diff --git a/src/app/(main)/chat/features/SessionListContent/Inbox/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Inbox/index.tsx
similarity index 61%
rename from src/app/(main)/chat/features/SessionListContent/Inbox/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/Inbox/index.tsx
index fc325b6fccfe..0dc02c19e1e2 100644
--- a/src/app/(main)/chat/features/SessionListContent/Inbox/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/Inbox/index.tsx
@@ -5,18 +5,27 @@ import { useTranslation } from 'react-i18next';
import { DEFAULT_INBOX_AVATAR } from '@/const/meta';
import { INBOX_SESSION_ID } from '@/const/session';
import { SESSION_CHAT_URL } from '@/const/url';
-import { useIsMobile } from '@/hooks/useIsMobile';
+import { useServerConfigStore } from '@/store/serverConfig';
import { useSessionStore } from '@/store/session';
import ListItem from '../ListItem';
+import { useSwitchSession } from '../useSwitchSession';
const Inbox = memo(() => {
const { t } = useTranslation('chat');
- const mobile = useIsMobile();
+ const mobile = useServerConfigStore((s) => s.isMobile);
const activeId = useSessionStore((s) => s.activeId);
+ const switchSession = useSwitchSession();
return (
-
+ {
+ e.preventDefault();
+ switchSession(INBOX_SESSION_ID);
+ }}
+ >
({
+ modalRoot: css`
+ z-index: 2000;
+ `,
+}));
+
+interface ActionProps {
+ group: string | undefined;
+ id: string;
+ openCreateGroupModal: () => void;
+ setOpen: (open: boolean) => void;
+}
+
+const Actions = memo(({ group, id, openCreateGroupModal, setOpen }) => {
+ const { styles } = useStyles();
+ const { t } = useTranslation('chat');
+
+ const sessionCustomGroups = useSessionStore(sessionGroupSelectors.sessionGroupItems, isEqual);
+ const [pin, removeSession, pinSession, duplicateSession, updateSessionGroup] = useSessionStore(
+ (s) => {
+ const session = sessionSelectors.getSessionById(id)(s);
+ return [
+ sessionHelpers.getSessionPinned(session),
+ s.removeSession,
+ s.pinSession,
+ s.duplicateSession,
+ s.updateSessionGroupId,
+ ];
+ },
+ );
+
+ const { modal, message } = App.useApp();
+
+ const isDefault = group === SessionDefaultGroup.Default;
+ // const hasDivider = !isDefault || Object.keys(sessionByGroup).length > 0;
+
+ const items = useMemo(
+ () =>
+ (
+ [
+ {
+ icon: ,
+ key: 'pin',
+ label: t(pin ? 'pinOff' : 'pin'),
+ onClick: () => {
+ pinSession(id, !pin);
+ },
+ },
+ {
+ icon: ,
+ key: 'duplicate',
+ label: t('duplicate', { ns: 'common' }),
+ onClick: ({ domEvent }) => {
+ domEvent.stopPropagation();
+
+ duplicateSession(id);
+ },
+ },
+ {
+ type: 'divider',
+ },
+ {
+ children: [
+ ...sessionCustomGroups.map(({ id: groupId, name }) => ({
+ icon: group === groupId ? :
,
+ key: groupId,
+ label: name,
+ onClick: () => {
+ updateSessionGroup(id, groupId);
+ },
+ })),
+ {
+ icon: isDefault ? :
,
+ key: 'defaultList',
+ label: t('defaultList'),
+ onClick: () => {
+ updateSessionGroup(id, SessionDefaultGroup.Default);
+ },
+ },
+ {
+ type: 'divider',
+ },
+ {
+ icon: ,
+ key: 'createGroup',
+ label: {t('sessionGroup.createGroup')}
,
+ onClick: ({ domEvent }) => {
+ domEvent.stopPropagation();
+ openCreateGroupModal();
+ },
+ },
+ ],
+ icon: ,
+ key: 'moveGroup',
+ label: t('sessionGroup.moveGroup'),
+ },
+ {
+ type: 'divider',
+ },
+ isServerMode
+ ? undefined
+ : {
+ children: [
+ {
+ key: 'agent',
+ label: t('exportType.agent', { ns: 'common' }),
+ onClick: () => {
+ configService.exportSingleAgent(id);
+ },
+ },
+ {
+ key: 'agentWithMessage',
+ label: t('exportType.agentWithMessage', { ns: 'common' }),
+ onClick: () => {
+ configService.exportSingleSession(id);
+ },
+ },
+ ],
+ icon: ,
+ key: 'export',
+ label: t('export', { ns: 'common' }),
+ },
+ {
+ danger: true,
+ icon: ,
+ key: 'delete',
+ label: t('delete', { ns: 'common' }),
+ onClick: ({ domEvent }) => {
+ domEvent.stopPropagation();
+ modal.confirm({
+ centered: true,
+ okButtonProps: { danger: true },
+ onOk: async () => {
+ await removeSession(id);
+ message.success(t('confirmRemoveSessionSuccess'));
+ },
+ rootClassName: styles.modalRoot,
+ title: t('confirmRemoveSessionItemAlert'),
+ });
+ },
+ },
+ ] as ItemType[]
+ ).filter(Boolean),
+ [id, pin],
+ );
+
+ return (
+ {
+ domEvent.stopPropagation();
+ },
+ }}
+ onOpenChange={setOpen}
+ trigger={['click']}
+ >
+
+
+ );
+});
+
+export default Actions;
diff --git a/src/app/(main)/chat/features/SessionListContent/List/Item/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx
similarity index 88%
rename from src/app/(main)/chat/features/SessionListContent/List/Item/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx
index 40fbd26e4cdf..b3f514a8af62 100644
--- a/src/app/(main)/chat/features/SessionListContent/List/Item/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx
@@ -4,7 +4,9 @@ import { shallow } from 'zustand/shallow';
import ModelTag from '@/components/ModelTag';
import { useAgentStore } from '@/store/agent';
+import { agentSelectors } from '@/store/agent/selectors';
import { useChatStore } from '@/store/chat';
+import { chatSelectors } from '@/store/chat/selectors';
import { useSessionStore } from '@/store/session';
import { sessionHelpers } from '@/store/session/helpers';
import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors';
@@ -20,10 +22,10 @@ interface SessionItemProps {
const SessionItem = memo(({ id }) => {
const [open, setOpen] = useState(false);
const [createGroupModalOpen, setCreateGroupModalOpen] = useState(false);
- const [defaultModel] = useAgentStore((s) => [s.defaultAgentConfig.model]);
+ const [defaultModel] = useAgentStore((s) => [agentSelectors.inboxAgentModel(s)]);
const [active] = useSessionStore((s) => [s.activeId === id]);
- const [loading] = useChatStore((s) => [!!s.chatLoadingId && id === s.activeId]);
+ const [loading] = useChatStore((s) => [chatSelectors.isAIGenerating(s) && id === s.activeId]);
const [pin, title, description, avatar, avatarBackground, updateAt, model, group] =
useSessionStore((s) => {
@@ -74,7 +76,7 @@ const SessionItem = memo(({ id }) => {
addon={addon}
avatar={avatar}
avatarBackground={avatarBackground}
- date={updateAt}
+ date={updateAt?.valueOf()}
description={description}
loading={loading}
pin={pin}
diff --git a/src/app/(main)/chat/features/SessionListContent/List/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/List/index.tsx
similarity index 74%
rename from src/app/(main)/chat/features/SessionListContent/List/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/List/index.tsx
index 40c953ae96bb..deb74888b919 100644
--- a/src/app/(main)/chat/features/SessionListContent/List/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/List/index.tsx
@@ -1,5 +1,5 @@
import { Empty } from 'antd';
-import { createStyles, useResponsive } from 'antd-style';
+import { createStyles } from 'antd-style';
import Link from 'next/link';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
@@ -12,7 +12,8 @@ import { useSessionStore } from '@/store/session';
import { sessionSelectors } from '@/store/session/selectors';
import { LobeAgentSession } from '@/types/session';
-import SkeletonList from '../SkeletonList';
+import SkeletonList from '../../SkeletonList';
+import { useSwitchSession } from '../useSwitchSession';
import AddButton from './AddButton';
import SessionItem from './Item';
@@ -21,7 +22,6 @@ const useStyles = createStyles(
min-height: 70px;
`,
);
-
interface SessionListProps {
dataSource?: LobeAgentSession[];
groupId?: string;
@@ -29,11 +29,13 @@ interface SessionListProps {
}
const SessionList = memo(({ dataSource, groupId, showAddButton = true }) => {
const { t } = useTranslation('chat');
- const isInit = useSessionStore((s) => sessionSelectors.isSessionListInit(s));
- const { showCreateSession } = useServerConfigStore(featureFlagsSelectors);
const { styles } = useStyles();
- const { mobile } = useResponsive();
+ const isInit = useSessionStore(sessionSelectors.isSessionListInit);
+ const { showCreateSession } = useServerConfigStore(featureFlagsSelectors);
+ const mobile = useServerConfigStore((s) => s.isMobile);
+
+ const switchSession = useSwitchSession();
const isEmpty = !dataSource || dataSource.length === 0;
return !isInit ? (
@@ -41,7 +43,14 @@ const SessionList = memo(({ dataSource, groupId, showAddButton
) : !isEmpty ? (
dataSource.map(({ id }) => (
-
+ {
+ e.preventDefault();
+ switchSession(id);
+ }}
+ >
diff --git a/src/app/(main)/chat/features/SessionListContent/ListItem/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/ListItem/index.tsx
similarity index 71%
rename from src/app/(main)/chat/features/SessionListContent/ListItem/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/ListItem/index.tsx
index 1528279539d2..e45415c37cb2 100644
--- a/src/app/(main)/chat/features/SessionListContent/ListItem/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/ListItem/index.tsx
@@ -1,11 +1,13 @@
import { Avatar, List, ListItemProps } from '@lobehub/ui';
import { useHover } from 'ahooks';
-import { createStyles, useResponsive } from 'antd-style';
+import { createStyles } from 'antd-style';
import { memo, useMemo, useRef } from 'react';
+import { useServerConfigStore } from '@/store/serverConfig';
+
const { Item } = List;
-const useStyles = createStyles(({ css, token, responsive }) => {
+const useStyles = createStyles(({ css, token }) => {
return {
container: css`
position: relative;
@@ -15,11 +17,11 @@ const useStyles = createStyles(({ css, token, responsive }) => {
padding-left: 8px;
border-radius: ${token.borderRadius}px;
- ${responsive.mobile} {
- margin-block: 0;
- padding-left: 12px;
- border-radius: 0;
- }
+ `,
+ mobile: css`
+ margin-block: 0;
+ padding-left: 12px;
+ border-radius: 0;
`,
title: css`
line-height: 1.2;
@@ -31,8 +33,8 @@ const ListItem = memo {
const ref = useRef(null);
const isHovering = useHover(ref);
- const { mobile } = useResponsive();
- const { styles } = useStyles();
+ const mobile = useServerConfigStore((s) => s.isMobile);
+ const { cx, styles } = useStyles();
const avatarRender = useMemo(
() => (
@@ -52,9 +54,9 @@ const ListItem = memo{title}}
{...(props as any)}
/>
diff --git a/src/app/(main)/chat/features/SessionListContent/Modals/ConfigGroupModal/GroupItem.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/GroupItem.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/Modals/ConfigGroupModal/GroupItem.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/GroupItem.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/Modals/ConfigGroupModal/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/Modals/ConfigGroupModal/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/Modals/ConfigGroupModal/index.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/Modals/CreateGroupModal.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Modals/CreateGroupModal.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/Modals/CreateGroupModal.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/Modals/CreateGroupModal.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/Modals/RenameGroupModal.tsx b/src/app/(main)/chat/@session/features/SessionListContent/Modals/RenameGroupModal.tsx
similarity index 100%
rename from src/app/(main)/chat/features/SessionListContent/Modals/RenameGroupModal.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/Modals/RenameGroupModal.tsx
diff --git a/src/app/(main)/chat/features/SessionListContent/SearchMode.tsx b/src/app/(main)/chat/@session/features/SessionListContent/SearchMode.tsx
similarity index 74%
rename from src/app/(main)/chat/features/SessionListContent/SearchMode.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/SearchMode.tsx
index 3682e3e1cee7..d817af36b756 100644
--- a/src/app/(main)/chat/features/SessionListContent/SearchMode.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/SearchMode.tsx
@@ -2,10 +2,10 @@ import { memo } from 'react';
import { useSessionStore } from '@/store/session';
+import SkeletonList from '../SkeletonList';
import SessionList from './List';
-import SkeletonList from './SkeletonList';
-const SessionListContent = memo(() => {
+const SearchMode = memo(() => {
const [sessionSearchKeywords, useSearchSessions] = useSessionStore((s) => [
s.sessionSearchKeywords,
s.useSearchSessions,
@@ -16,4 +16,6 @@ const SessionListContent = memo(() => {
return isLoading ? : ;
});
-export default SessionListContent;
+SearchMode.displayName = 'SessionSearchMode';
+
+export default SearchMode;
diff --git a/src/app/(main)/chat/features/SessionListContent/index.tsx b/src/app/(main)/chat/@session/features/SessionListContent/index.tsx
similarity index 96%
rename from src/app/(main)/chat/features/SessionListContent/index.tsx
rename to src/app/(main)/chat/@session/features/SessionListContent/index.tsx
index 4a4fa6ac7b77..97f658ac4e7c 100644
--- a/src/app/(main)/chat/features/SessionListContent/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionListContent/index.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import { memo } from 'react';
import { useSessionStore } from '@/store/session';
diff --git a/src/app/(main)/chat/@session/features/SessionListContent/useSwitchSession.ts b/src/app/(main)/chat/@session/features/SessionListContent/useSwitchSession.ts
new file mode 100644
index 000000000000..acead63d61b9
--- /dev/null
+++ b/src/app/(main)/chat/@session/features/SessionListContent/useSwitchSession.ts
@@ -0,0 +1,26 @@
+import { useCallback } from 'react';
+
+import { useQueryRoute } from '@/hooks/useQueryRoute';
+import { useServerConfigStore } from '@/store/serverConfig';
+import { useSessionStore } from '@/store/session';
+
+export const useSwitchSession = () => {
+ const switchSession = useSessionStore((s) => s.switchSession);
+ const mobile = useServerConfigStore((s) => s.isMobile);
+ const router = useQueryRoute();
+
+ return useCallback(
+ (id: string) => {
+ switchSession(id);
+
+ if (mobile) {
+ setTimeout(() => {
+ router.push('/chat', {
+ query: { session: id, showMobileWorkspace: 'true' },
+ });
+ }, 50);
+ }
+ },
+ [mobile],
+ );
+};
diff --git a/src/app/(main)/chat/features/SessionSearchBar/index.tsx b/src/app/(main)/chat/@session/features/SessionSearchBar.tsx
similarity index 79%
rename from src/app/(main)/chat/features/SessionSearchBar/index.tsx
rename to src/app/(main)/chat/@session/features/SessionSearchBar.tsx
index 2cd60b2058d8..22eddf0fc551 100644
--- a/src/app/(main)/chat/features/SessionSearchBar/index.tsx
+++ b/src/app/(main)/chat/@session/features/SessionSearchBar.tsx
@@ -1,11 +1,12 @@
+'use client';
+
import { SearchBar } from '@lobehub/ui';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
-import { useIsMobile } from '@/hooks/useIsMobile';
import { useSessionStore } from '@/store/session';
-const SessionSearchBar = memo<{ mobile?: boolean }>(({ mobile: controlledMobile }) => {
+const SessionSearchBar = memo<{ mobile?: boolean }>(({ mobile }) => {
const { t } = useTranslation('chat');
const [keywords, useSearchSessions, updateSearchKeywords] = useSessionStore((s) => [
@@ -16,9 +17,6 @@ const SessionSearchBar = memo<{ mobile?: boolean }>(({ mobile: controlledMobile
const { isValidating } = useSearchSessions(keywords);
- const isMobile = useIsMobile();
- const mobile = controlledMobile ?? isMobile;
-
return (
- cx(
- stylish.noScrollbar,
- css`
- display: flex;
- flex-direction: column;
- gap: 2px;
- padding: 8px 8px 0;
- `,
- ),
-);
-
-const Sessions = memo(() => {
- const { styles } = useStyles();
-
- return (
-
-
-
-
-
-
- );
-});
-
-Sessions.displayName = 'SessionsList';
-
-export default Sessions;
diff --git a/src/app/(main)/chat/_layout/Desktop/SessionPanel.tsx b/src/app/(main)/chat/_layout/Desktop/SessionPanel.tsx
new file mode 100644
index 000000000000..4db2ceb0f298
--- /dev/null
+++ b/src/app/(main)/chat/_layout/Desktop/SessionPanel.tsx
@@ -0,0 +1,75 @@
+'use client';
+
+import { DraggablePanel, DraggablePanelContainer, type DraggablePanelProps } from '@lobehub/ui';
+import { createStyles, useResponsive } from 'antd-style';
+import isEqual from 'fast-deep-equal';
+import { PropsWithChildren, memo, useEffect, useState } from 'react';
+
+import { FOLDER_WIDTH } from '@/const/layoutTokens';
+import { useGlobalStore } from '@/store/global';
+import { systemStatusSelectors } from '@/store/global/selectors';
+
+export const useStyles = createStyles(({ css, token }) => ({
+ panel: css`
+ height: 100%;
+ color: ${token.colorTextSecondary};
+ background: ${token.colorBgContainer};
+ `,
+}));
+
+const SessionPanel = memo(({ children }) => {
+ const { md = true } = useResponsive();
+
+ const { styles } = useStyles();
+ const [sessionsWidth, sessionExpandable, updatePreference] = useGlobalStore((s) => [
+ systemStatusSelectors.sessionWidth(s),
+ systemStatusSelectors.showSessionPanel(s),
+ s.updateSystemStatus,
+ ]);
+
+ const [cacheExpand, setCacheExpand] = useState(Boolean(sessionExpandable));
+ const [tmpWidth, setWidth] = useState(sessionsWidth);
+ if (tmpWidth !== sessionsWidth) setWidth(sessionsWidth);
+
+ const handleExpand = (expand: boolean) => {
+ if (isEqual(expand, sessionExpandable)) return;
+ updatePreference({ showSessionPanel: expand });
+ setCacheExpand(expand);
+ };
+
+ const handleSizeChange: DraggablePanelProps['onSizeChange'] = (_, size) => {
+ if (!size) return;
+ const nextWidth = typeof size.width === 'string' ? Number.parseInt(size.width) : size.width;
+ if (!nextWidth) return;
+
+ if (isEqual(nextWidth, sessionsWidth)) return;
+ setWidth(nextWidth);
+ updatePreference({ sessionsWidth: nextWidth });
+ };
+
+ useEffect(() => {
+ if (md && cacheExpand) updatePreference({ showSessionPanel: true });
+ if (!md) updatePreference({ showSessionPanel: false });
+ }, [md, cacheExpand]);
+
+ return (
+
+
+ {children}
+
+
+ );
+});
+
+export default SessionPanel;
diff --git a/src/app/(main)/chat/_layout/Desktop/index.tsx b/src/app/(main)/chat/_layout/Desktop/index.tsx
index 4487be9c1622..738c632c29f7 100644
--- a/src/app/(main)/chat/_layout/Desktop/index.tsx
+++ b/src/app/(main)/chat/_layout/Desktop/index.tsx
@@ -1,20 +1,27 @@
import { Flexbox } from 'react-layout-kit';
+import Migration from '../../features/Migration';
import { LayoutProps } from '../type';
-import ResponsiveSessionList from './SessionList';
+import SessionPanel from './SessionPanel';
-const Layout = ({ children }: LayoutProps) => {
+const Layout = ({ children, session }: LayoutProps) => {
return (
<>
-
- {children}
+ {session}
+
+ {children}
+
+
+ {/* ↓ cloud slot ↓ */}
+
+ {/* ↑ cloud slot ↑ */}
>
);
};
diff --git a/src/app/(main)/chat/_layout/Mobile.tsx b/src/app/(main)/chat/_layout/Mobile.tsx
new file mode 100644
index 000000000000..81fea2799d4f
--- /dev/null
+++ b/src/app/(main)/chat/_layout/Mobile.tsx
@@ -0,0 +1,49 @@
+'use client';
+
+import { createStyles } from 'antd-style';
+import { memo } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+import Migration from '@/app/(main)/chat/features/Migration';
+import { useQuery } from '@/hooks/useQuery';
+
+import { LayoutProps } from './type';
+
+const useStyles = createStyles(({ css, token }) => ({
+ main: css`
+ position: relative;
+ overflow: hidden;
+ background: ${token.colorBgLayout};
+ `,
+}));
+
+const Layout = memo(({ children, session }) => {
+ const { showMobileWorkspace } = useQuery();
+ const { styles } = useStyles();
+
+ return (
+ <>
+
+ {session}
+
+
+ {children}
+
+
+ >
+ );
+});
+
+Layout.displayName = 'MobileChatLayout';
+
+export default Layout;
diff --git a/src/app/(main)/chat/_layout/Mobile/index.tsx b/src/app/(main)/chat/_layout/Mobile/index.tsx
deleted file mode 100644
index c56a8e065ee3..000000000000
--- a/src/app/(main)/chat/_layout/Mobile/index.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { LayoutProps } from '../type';
-
-const Layout = ({ children }: LayoutProps) => {
- return children;
-};
-
-Layout.displayName = 'MobileChatLayout';
-
-export default Layout;
diff --git a/src/app/(main)/chat/_layout/type.ts b/src/app/(main)/chat/_layout/type.ts
index 4d063a09f7fa..a4fd37b3a48d 100644
--- a/src/app/(main)/chat/_layout/type.ts
+++ b/src/app/(main)/chat/_layout/type.ts
@@ -2,4 +2,5 @@ import { ReactNode } from 'react';
export interface LayoutProps {
children: ReactNode;
+ session: ReactNode;
}
diff --git a/src/app/(main)/chat/error.tsx b/src/app/(main)/chat/error.tsx
new file mode 100644
index 000000000000..071491038c70
--- /dev/null
+++ b/src/app/(main)/chat/error.tsx
@@ -0,0 +1,5 @@
+'use client';
+
+import dynamic from 'next/dynamic';
+
+export default dynamic(() => import('@/components/Error'));
diff --git a/src/app/(main)/chat/features/Migration/index.tsx b/src/app/(main)/chat/features/Migration/index.tsx
index 3927ddda06b7..788b21472563 100644
--- a/src/app/(main)/chat/features/Migration/index.tsx
+++ b/src/app/(main)/chat/features/Migration/index.tsx
@@ -3,13 +3,13 @@
import { Spin } from 'antd';
import { createStore, getMany } from 'idb-keyval';
import dynamic from 'next/dynamic';
-import { PropsWithChildren, memo, useEffect, useState } from 'react';
+import { memo, useEffect, useState } from 'react';
import { MIGRATE_KEY, V1DB_NAME, V1DB_TABLE_NAME } from './const';
const Modal = dynamic(() => import('./Modal'), { loading: () => , ssr: false });
-const Migration = memo(({ children }) => {
+const Migration = memo(() => {
const [dbState, setDbState] = useState(null);
const [open, setOpen] = useState(false);
@@ -33,12 +33,7 @@ const Migration = memo(({ children }) => {
checkMigration();
}, []);
- return (
- <>
- {open && }
- {children}
- >
- );
+ return open && ;
});
export default Migration;
diff --git a/src/app/(main)/chat/features/SessionListContent/List/Item/Actions.tsx b/src/app/(main)/chat/features/SessionListContent/List/Item/Actions.tsx
deleted file mode 100644
index 8df5cb1a10f4..000000000000
--- a/src/app/(main)/chat/features/SessionListContent/List/Item/Actions.tsx
+++ /dev/null
@@ -1,189 +0,0 @@
-import { ActionIcon, Icon } from '@lobehub/ui';
-import { App, Dropdown, type MenuProps } from 'antd';
-import { createStyles } from 'antd-style';
-import isEqual from 'fast-deep-equal';
-import {
- Check,
- HardDriveDownload,
- ListTree,
- LucideCopy,
- LucidePlus,
- MoreVertical,
- Pin,
- PinOff,
- Trash,
-} from 'lucide-react';
-import { memo, useMemo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { configService } from '@/services/config';
-import { useSessionStore } from '@/store/session';
-import { sessionHelpers } from '@/store/session/helpers';
-import { sessionGroupSelectors, sessionSelectors } from '@/store/session/selectors';
-import { SessionDefaultGroup } from '@/types/session';
-
-const useStyles = createStyles(({ css }) => ({
- modalRoot: css`
- z-index: 2000;
- `,
-}));
-
-interface ActionProps {
- group: string | undefined;
- id: string;
- openCreateGroupModal: () => void;
- setOpen: (open: boolean) => void;
-}
-
-const Actions = memo(({ group, id, openCreateGroupModal, setOpen }) => {
- const { styles } = useStyles();
- const { t } = useTranslation('chat');
-
- const sessionCustomGroups = useSessionStore(sessionGroupSelectors.sessionGroupItems, isEqual);
- const [pin, removeSession, pinSession, duplicateSession, updateSessionGroup] = useSessionStore(
- (s) => {
- const session = sessionSelectors.getSessionById(id)(s);
- return [
- sessionHelpers.getSessionPinned(session),
- s.removeSession,
- s.pinSession,
- s.duplicateSession,
- s.updateSessionGroupId,
- ];
- },
- );
-
- const { modal, message } = App.useApp();
-
- const isDefault = group === SessionDefaultGroup.Default;
- // const hasDivider = !isDefault || Object.keys(sessionByGroup).length > 0;
-
- const items: MenuProps['items'] = useMemo(
- () => [
- {
- icon: ,
- key: 'pin',
- label: t(pin ? 'pinOff' : 'pin'),
- onClick: () => {
- pinSession(id, !pin);
- },
- },
- {
- icon: ,
- key: 'duplicate',
- label: t('duplicate', { ns: 'common' }),
- onClick: ({ domEvent }) => {
- domEvent.stopPropagation();
-
- duplicateSession(id);
- },
- },
- {
- type: 'divider',
- },
- {
- children: [
- ...sessionCustomGroups.map(({ id: groupId, name }) => ({
- icon: group === groupId ? :
,
- key: groupId,
- label: name,
- onClick: () => {
- updateSessionGroup(id, groupId);
- },
- })),
- {
- icon: isDefault ? :
,
- key: 'defaultList',
- label: t('defaultList'),
- onClick: () => {
- updateSessionGroup(id, SessionDefaultGroup.Default);
- },
- },
- {
- type: 'divider',
- },
- {
- icon: ,
- key: 'createGroup',
- label: {t('sessionGroup.createGroup')}
,
- onClick: ({ domEvent }) => {
- domEvent.stopPropagation();
- openCreateGroupModal();
- },
- },
- ],
- icon: ,
- key: 'moveGroup',
- label: t('sessionGroup.moveGroup'),
- },
- {
- type: 'divider',
- },
- {
- children: [
- {
- key: 'agent',
- label: t('exportType.agent', { ns: 'common' }),
- onClick: () => {
- configService.exportSingleAgent(id);
- },
- },
- {
- key: 'agentWithMessage',
- label: t('exportType.agentWithMessage', { ns: 'common' }),
- onClick: () => {
- configService.exportSingleSession(id);
- },
- },
- ],
- icon: ,
- key: 'export',
- label: t('export', { ns: 'common' }),
- },
- {
- danger: true,
- icon: ,
- key: 'delete',
- label: t('delete', { ns: 'common' }),
- onClick: ({ domEvent }) => {
- domEvent.stopPropagation();
- modal.confirm({
- centered: true,
- okButtonProps: { danger: true },
- onOk: async () => {
- await removeSession(id);
- message.success(t('confirmRemoveSessionSuccess'));
- },
- rootClassName: styles.modalRoot,
- title: t('confirmRemoveSessionItemAlert'),
- });
- },
- },
- ],
- [id, pin],
- );
-
- return (
- {
- domEvent.stopPropagation();
- },
- }}
- onOpenChange={setOpen}
- trigger={['click']}
- >
-
-
- );
-});
-
-export default Actions;
diff --git a/src/app/(main)/chat/features/TelemetryNotification/index.tsx b/src/app/(main)/chat/features/TelemetryNotification/index.tsx
deleted file mode 100644
index 6cb9b90bcf49..000000000000
--- a/src/app/(main)/chat/features/TelemetryNotification/index.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import { Avatar, Icon } from '@lobehub/ui';
-import { Button } from 'antd';
-import { createStyles } from 'antd-style';
-import { LucideArrowUpRightFromSquare, TelescopeIcon } from 'lucide-react';
-import Link from 'next/link';
-import { rgba } from 'polished';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Flexbox } from 'react-layout-kit';
-
-import { PRIVACY_URL } from '@/const/url';
-import { useServerConfigStore } from '@/store/serverConfig';
-import { serverConfigSelectors } from '@/store/serverConfig/selectors';
-import { useUserStore } from '@/store/user';
-import { preferenceSelectors } from '@/store/user/selectors';
-
-const useStyles = createStyles(({ css, token, isDarkMode }) => ({
- container: css`
- position: absolute;
- z-index: 100;
- bottom: 16px;
- inset-inline-end: 20px;
-
- overflow: hidden;
-
- width: 422px;
-
- background: ${token.colorBgContainer};
- border: 1px solid ${token.colorSplit};
- border-radius: 8px;
- box-shadow: ${token.boxShadowSecondary};
- `,
- desc: css`
- color: ${token.colorTextSecondary};
- `,
- mobileContainer: css`
- bottom: 8px;
- inset-inline-start: 8px;
- width: calc(100% - 16px);
- `,
- title: css`
- font-size: 18px;
- font-weight: bold;
- `,
- wrapper: css`
- padding: 20px 20px 16px;
- background: linear-gradient(
- 180deg,
- ${rgba(token.colorBgContainer, 0)},
- ${token.colorBgContainer} ${isDarkMode ? '80' : '140'}px
- ),
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'%3E%3Cg fill='${token.colorFillTertiary}' %3E %3Cpolygon fill-rule='evenodd' points='8 4 12 6 8 8 6 12 4 8 0 6 4 4 6 0 8 4'/%3E%3C/g%3E%3C/svg%3E");
- `,
-}));
-
-const TelemetryNotification = memo<{ mobile?: boolean }>(({ mobile }) => {
- const { styles, theme, cx } = useStyles();
-
- const { t } = useTranslation('common');
- const shouldCheck = useServerConfigStore(serverConfigSelectors.enabledTelemetryChat);
- const isPreferenceInit = useUserStore(preferenceSelectors.isPreferenceInit);
-
- const [useCheckTrace, updatePreference] = useUserStore((s) => [
- s.useCheckTrace,
- s.updatePreference,
- ]);
-
- const { data: showModal, mutate } = useCheckTrace(shouldCheck && isPreferenceInit);
-
- const updateTelemetry = (telemetry: boolean) => {
- updatePreference({ telemetry });
- mutate();
- };
-
- return (
- showModal && (
-
-
-
- }
- background={theme.geekblue1}
- style={{ color: theme.geekblue7 }}
- >
-
-
-
- {t('telemetry.title')}
-
- {t('telemetry.desc')}
-
-
- {t('telemetry.learnMore')}
-
-
-
-
-
-
- {
- updateTelemetry(true);
- }}
- type={'primary'}
- >
- {t('telemetry.allow')}
-
- {
- updateTelemetry(false);
- }}
- type={'text'}
- >
- {t('telemetry.deny')}
-
-
-
-
-
- )
- );
-});
-
-export default TelemetryNotification;
diff --git a/src/app/(main)/chat/features/TopicListContent/index.tsx b/src/app/(main)/chat/features/TopicListContent/index.tsx
deleted file mode 100644
index 1a789d52890f..000000000000
--- a/src/app/(main)/chat/features/TopicListContent/index.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-
-import Header from './Header';
-import { Topic } from './Topic';
-import TopicSearchBar from './TopicSearchBar';
-
-const TopicListContent = memo<{ mobile?: boolean }>(({ mobile }) => {
- return (
-
- {mobile ? : }
-
-
-
-
- );
-});
-
-export default TopicListContent;
diff --git a/src/app/(main)/chat/not-found.tsx b/src/app/(main)/chat/not-found.tsx
new file mode 100644
index 000000000000..02503bc7fa46
--- /dev/null
+++ b/src/app/(main)/chat/not-found.tsx
@@ -0,0 +1,3 @@
+import dynamic from 'next/dynamic';
+
+export default dynamic(() => import('@/components/404'));
diff --git a/src/app/(main)/chat/page.tsx b/src/app/(main)/chat/page.tsx
deleted file mode 100644
index 4b3521c886ef..000000000000
--- a/src/app/(main)/chat/page.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { isMobileDevice } from '@/utils/responsive';
-
-import DesktopPage from './(desktop)';
-import MobilePage from './(mobile)';
-import SessionHydration from './components/SessionHydration';
-import Migration from './features/Migration';
-import PageTitle from './features/PageTitle';
-
-const Page = () => {
- const mobile = isMobileDevice();
-
- const Page = mobile ? MobilePage : DesktopPage;
-
- return (
- <>
-
-
-
-
-
- >
- );
-};
-
-export default Page;
diff --git a/src/app/(main)/chat/settings/_layout/Desktop/index.tsx b/src/app/(main)/chat/settings/_layout/Desktop/index.tsx
index 02e0d7bd5602..01ce35f8ccbd 100644
--- a/src/app/(main)/chat/settings/_layout/Desktop/index.tsx
+++ b/src/app/(main)/chat/settings/_layout/Desktop/index.tsx
@@ -1,25 +1,18 @@
import { PropsWithChildren } from 'react';
-import { Flexbox } from 'react-layout-kit';
import SafeSpacing from '@/components/SafeSpacing';
import { HEADER_HEIGHT } from '@/const/layoutTokens';
+import Footer from '@/features/Setting/Footer';
+import SettingContainer from '@/features/Setting/SettingContainer';
import Header from './Header';
const Layout = ({ children }: PropsWithChildren) => (
<>
-
-
-
- {children}
-
-
+ } addonBefore={ }>
+ {children}
+
>
);
diff --git a/src/app/(main)/chat/settings/_layout/Mobile/Header.tsx b/src/app/(main)/chat/settings/_layout/Mobile/Header.tsx
index beb425acdaf0..0adc952c6e5b 100644
--- a/src/app/(main)/chat/settings/_layout/Mobile/Header.tsx
+++ b/src/app/(main)/chat/settings/_layout/Mobile/Header.tsx
@@ -1,23 +1,22 @@
'use client';
import { MobileNavBar, MobileNavBarTitle } from '@lobehub/ui';
-import { useRouter } from 'next/navigation';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
+import { useQueryRoute } from '@/hooks/useQueryRoute';
import { mobileHeaderSticky } from '@/styles/mobileHeader';
-import { pathString } from '@/utils/url';
import HeaderContent from '../../features/HeaderContent';
const Header = memo(() => {
const { t } = useTranslation('setting');
- const router = useRouter();
+ const router = useQueryRoute();
return (
}
- onBackClick={() => router.push(pathString('/chat/mobile', { search: location.search }))}
+ onBackClick={() => router.push('/chat')}
right={ }
showBackButton
style={mobileHeaderSticky}
diff --git a/src/app/(main)/chat/settings/_layout/Mobile/index.tsx b/src/app/(main)/chat/settings/_layout/Mobile/index.tsx
index 47089a1b8f5f..291b79985b4c 100644
--- a/src/app/(main)/chat/settings/_layout/Mobile/index.tsx
+++ b/src/app/(main)/chat/settings/_layout/Mobile/index.tsx
@@ -3,11 +3,15 @@
import { PropsWithChildren } from 'react';
import MobileContentLayout from '@/components/server/MobileNavLayout';
+import Footer from '@/features/Setting/Footer';
import Header from './Header';
const Layout = ({ children }: PropsWithChildren) => (
- }>{children}
+ }>
+ {children}
+
+
);
Layout.displayName = 'MobileSessionSettingsLayout';
diff --git a/src/app/(main)/chat/settings/features/EditPage.tsx b/src/app/(main)/chat/settings/features/EditPage.tsx
index 616055f98ba4..c0b6e6780588 100644
--- a/src/app/(main)/chat/settings/features/EditPage.tsx
+++ b/src/app/(main)/chat/settings/features/EditPage.tsx
@@ -5,7 +5,7 @@ import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import PageTitle from '@/components/PageTitle';
-import AgentSetting from '@/features/AgentSetting';
+import { AgentSettings } from '@/features/AgentSetting';
import { useAgentStore } from '@/store/agent';
import { agentSelectors } from '@/store/agent/selectors';
import { useSessionStore } from '@/store/session';
@@ -26,7 +26,7 @@ const EditPage = memo(() => {
return (
<>
- (({ moda
const { t } = useTranslation('setting');
const id = useSessionStore((s) => s.activeId);
- const { mobile } = useResponsive();
+ const mobile = useServerConfigStore((s) => s.isMobile);
const items = useMemo(
- () => [
- {
- key: 'agent',
- label: {t('exportType.agent', { ns: 'common' })}
,
- onClick: () => {
- if (!id) return;
+ () =>
+ isServerMode
+ ? []
+ : [
+ {
+ key: 'agent',
+ label: {t('exportType.agent', { ns: 'common' })}
,
+ onClick: () => {
+ if (!id) return;
- configService.exportSingleAgent(id);
- },
- },
- {
- key: 'agentWithMessage',
- label: {t('exportType.agentWithMessage', { ns: 'common' })}
,
- onClick: () => {
- if (!id) return;
+ configService.exportSingleAgent(id);
+ },
+ },
+ {
+ key: 'agentWithMessage',
+ label: {t('exportType.agentWithMessage', { ns: 'common' })}
,
+ onClick: () => {
+ if (!id) return;
- configService.exportSingleSession(id);
- },
- },
- ],
+ configService.exportSingleSession(id);
+ },
+ },
+ ],
[],
);
return (
<>
-
- {modal ? (
- }>
- {t('export', { ns: 'common' })}
-
- ) : (
-
- )}
-
+ {!isServerMode && (
+
+ {modal ? (
+ }>
+ {t('export', { ns: 'common' })}
+
+ ) : (
+
+ )}
+
+ )}
>
);
});
diff --git a/src/app/(main)/chat/settings/features/SubmitAgentButton/SubmitAgentModal.tsx b/src/app/(main)/chat/settings/features/SubmitAgentButton/SubmitAgentModal.tsx
index a4bb45b69f18..b3b1e8df7536 100644
--- a/src/app/(main)/chat/settings/features/SubmitAgentButton/SubmitAgentModal.tsx
+++ b/src/app/(main)/chat/settings/features/SubmitAgentButton/SubmitAgentModal.tsx
@@ -17,7 +17,7 @@ import { agentSelectors } from '@/store/agent/selectors';
import { useSessionStore } from '@/store/session';
import { sessionMetaSelectors } from '@/store/session/selectors';
import { useUserStore } from '@/store/user';
-import { settingsSelectors } from '@/store/user/selectors';
+import { userGeneralSettingsSelectors } from '@/store/user/selectors';
const SubmitAgentModal = memo(({ open, onCancel }) => {
const { t } = useTranslation('setting');
@@ -25,7 +25,7 @@ const SubmitAgentModal = memo(({ open, onCancel }) => {
const systemRole = useAgentStore(agentSelectors.currentAgentSystemRole);
const theme = useTheme();
const meta = useSessionStore(sessionMetaSelectors.currentAgentMeta, isEqual);
- const language = useUserStore((s) => settingsSelectors.currentSettings(s).language);
+ const language = useUserStore((s) => userGeneralSettingsSelectors.currentLanguage(s));
const isMetaPass = Boolean(
meta && meta.title && meta.description && (meta.tags as string[])?.length > 0 && meta.avatar,
@@ -46,7 +46,7 @@ const SubmitAgentModal = memo(({ open, onCancel }) => {
'### tags',
(meta.tags as string[]).join(', '),
'### locale',
- language === 'auto' ? navigator.language : language,
+ language,
].join('\n\n');
const url = qs.stringifyUrl({
diff --git a/src/app/(main)/chat/settings/features/SubmitAgentButton/index.tsx b/src/app/(main)/chat/settings/features/SubmitAgentButton/index.tsx
index b27e4c6034d3..c584641b91c4 100644
--- a/src/app/(main)/chat/settings/features/SubmitAgentButton/index.tsx
+++ b/src/app/(main)/chat/settings/features/SubmitAgentButton/index.tsx
@@ -1,17 +1,17 @@
import { ActionIcon, Icon } from '@lobehub/ui';
import { Button } from 'antd';
-import { useResponsive } from 'antd-style';
import { Share2 } from 'lucide-react';
import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { HEADER_ICON_SIZE } from '@/const/layoutTokens';
+import { useServerConfigStore } from '@/store/serverConfig';
import SubmitAgentModal from './SubmitAgentModal';
const SubmitAgentButton = memo<{ modal?: boolean }>(({ modal }) => {
const { t } = useTranslation('setting');
- const { mobile } = useResponsive();
+ const mobile = useServerConfigStore((s) => s.isMobile);
const [isModalOpen, setIsModalOpen] = useState(false);
return (
diff --git a/src/app/(main)/chat/settings/layout.tsx b/src/app/(main)/chat/settings/layout.tsx
index 706ea1bad237..939d72bc2015 100644
--- a/src/app/(main)/chat/settings/layout.tsx
+++ b/src/app/(main)/chat/settings/layout.tsx
@@ -2,7 +2,7 @@ import { notFound } from 'next/navigation';
import { PropsWithChildren } from 'react';
import ServerLayout from '@/components/server/ServerLayout';
-import { serverFeatureFlags } from '@/config/server/featureFlags';
+import { serverFeatureFlags } from '@/config/featureFlags';
import Desktop from './_layout/Desktop';
import Mobile from './_layout/Mobile';
diff --git a/src/app/(main)/market/@detail/features/Header.tsx b/src/app/(main)/market/@detail/features/Header.tsx
index e85d028ef224..1d2fca76d6ab 100644
--- a/src/app/(main)/market/@detail/features/Header.tsx
+++ b/src/app/(main)/market/@detail/features/Header.tsx
@@ -3,13 +3,13 @@ import { App, Button, Typography } from 'antd';
import isEqual from 'fast-deep-equal';
import { startCase } from 'lodash-es';
import { useRouter } from 'next/navigation';
-import { memo } from 'react';
+import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Center, Flexbox } from 'react-layout-kit';
import { SESSION_CHAT_URL } from '@/const/url';
-import { useIsMobile } from '@/hooks/useIsMobile';
import { agentMarketSelectors, useMarketStore } from '@/store/market';
+import { useServerConfigStore } from '@/store/serverConfig';
import { useSessionStore } from '@/store/session';
import { useStyles } from './style';
@@ -23,26 +23,30 @@ const Header = memo(() => {
const { styles } = useStyles();
const createSession = useSessionStore((s) => s.createSession);
const agentItem = useMarketStore(agentMarketSelectors.currentAgentItem, isEqual);
-
+ const [isLoading, setIsLoading] = useState(false);
const { message } = App.useApp();
const { meta, createAt, author, homepage, config } = agentItem;
const { title, description, tags } = meta;
- const isMobile = useIsMobile();
+ const isMobile = useServerConfigStore((s) => s.isMobile);
const handleAddAgentAndConverse = async () => {
if (!agentItem) return;
+ setIsLoading(true);
const session = await createSession({ config, meta });
+ setIsLoading(false);
message.success(t('addAgentSuccess'));
router.push(SESSION_CHAT_URL(session, isMobile));
};
- const handleAddAgent = () => {
+ const handleAddAgent = async () => {
if (!agentItem) return;
+ setIsLoading(true);
createSession({ config, meta }, false);
message.success(t('addAgentSuccess'));
+ setIsLoading(false);
};
return (
@@ -56,10 +60,10 @@ const Header = memo(() => {
))}
{description}
-
+
{t('addAgentAndConverse')}
-
+
{t('addAgent')}
diff --git a/src/app/(main)/market/_layout/Desktop/Header.tsx b/src/app/(main)/market/_layout/Desktop/Header.tsx
index 9a0fadf58683..50e70bdfa20f 100644
--- a/src/app/(main)/market/_layout/Desktop/Header.tsx
+++ b/src/app/(main)/market/_layout/Desktop/Header.tsx
@@ -1,6 +1,7 @@
'use client';
-import { ChatHeader, Logo } from '@lobehub/ui';
+import { ChatHeader } from '@lobehub/ui';
+import { LobeChat } from '@lobehub/ui/brand';
import { createStyles } from 'antd-style';
import { memo } from 'react';
@@ -18,7 +19,7 @@ const Header = memo(() => {
return (
}
+ left={ }
right={ }
/>
);
diff --git a/src/app/(main)/market/_layout/Desktop/Hero.tsx b/src/app/(main)/market/_layout/Desktop/Hero.tsx
index abaad8b7895e..f0df7993ac3b 100644
--- a/src/app/(main)/market/_layout/Desktop/Hero.tsx
+++ b/src/app/(main)/market/_layout/Desktop/Hero.tsx
@@ -30,7 +30,7 @@ const Hero = memo(() => {
const { theme, styles } = useStyles();
return (
- Find & Use The Best Agents
+ Find & Use The Best Assistants
);
diff --git a/src/app/(main)/market/_layout/Desktop/index.tsx b/src/app/(main)/market/_layout/Desktop/index.tsx
index 3cf164bd755f..8884022a8406 100644
--- a/src/app/(main)/market/_layout/Desktop/index.tsx
+++ b/src/app/(main)/market/_layout/Desktop/index.tsx
@@ -10,29 +10,34 @@ import Hero from './Hero';
const Layout = ({ children, detail }: LayoutProps) => {
return (
-
-
-
-
-
-
-
- {children}
+ <>
+
+
+
+
+
+
+
+ {children}
+
+ {detail}
- {detail}
-
+ {/* ↓ cloud slot ↓ */}
+
+ {/* ↑ cloud slot ↑ */}
+ >
);
};
diff --git a/src/app/(main)/market/page.tsx b/src/app/(main)/market/page.tsx
index fd731f6df0eb..5a1a0ac8aca5 100644
--- a/src/app/(main)/market/page.tsx
+++ b/src/app/(main)/market/page.tsx
@@ -1,6 +1,8 @@
import { Flexbox } from 'react-layout-kit';
-import { getCanonicalUrl } from '@/const/url';
+import StructuredData from '@/components/StructuredData';
+import { ldModule } from '@/server/ld';
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
@@ -9,18 +11,25 @@ import AgentSearchBar from './features/AgentSearchBar';
import TagList from './features/TagList';
export const generateMetadata = async () => {
- const { t } = await translation('common');
- return {
- alternates: { canonical: getCanonicalUrl('/market') },
- title: t('tab.market'),
- };
+ const { t } = await translation('metadata');
+ return metadataModule.generate({
+ description: t('market.description'),
+ title: t('market.title'),
+ url: '/market',
+ });
};
-const Page = () => {
+const Page = async () => {
const mobile = isMobileDevice();
-
+ const { t } = await translation('metadata');
+ const ld = ldModule.generate({
+ description: t('market.description'),
+ title: t('market.title'),
+ url: '/market',
+ });
return (
<>
+
diff --git a/src/app/(main)/profile/[[...slugs]]/Client.tsx b/src/app/(main)/profile/[[...slugs]]/Client.tsx
new file mode 100644
index 000000000000..226f8d34de1e
--- /dev/null
+++ b/src/app/(main)/profile/[[...slugs]]/Client.tsx
@@ -0,0 +1,74 @@
+'use client';
+
+import { UserProfile } from '@clerk/nextjs';
+import { ElementsConfig } from '@clerk/types';
+import { createStyles } from 'antd-style';
+import { memo } from 'react';
+
+export const useStyles = createStyles(
+ ({ css, token, cx }, mobile: boolean) =>
+ ({
+ cardBox: css`
+ width: 100%;
+ max-width: unset;
+ height: 100%;
+
+ border: unset;
+ border-radius: unset;
+ box-shadow: unset;
+ `,
+ footer: cx(
+ mobile &&
+ css`
+ display: none;
+ `,
+ ),
+ navbar: css`
+ flex: none;
+
+ width: 280px;
+ max-width: unset;
+ margin-right: 0;
+ padding: 24px 12px 16px;
+
+ background: ${token.colorBgContainer};
+ border-right: 1px solid ${token.colorSplit};
+ `,
+ navbarMobileMenuRow: cx(
+ mobile &&
+ css`
+ display: none;
+ `,
+ ),
+ pageScrollBox: css`
+ align-self: center;
+ width: 100%;
+ max-width: 1024px;
+ `,
+ rootBox: css`
+ width: 100%;
+ height: 100%;
+ `,
+ scrollBox: css`
+ background: ${token.colorBgLayout};
+ border: unset;
+ border-radius: unset;
+ `,
+ }) as Partial<{
+ [k in keyof ElementsConfig]: any;
+ }>,
+);
+
+const Client = memo<{ mobile?: boolean }>(({ mobile }) => {
+ const { styles } = useStyles(mobile);
+
+ return (
+
+ );
+});
+
+export default Client;
diff --git a/src/app/(main)/profile/[[...slugs]]/page.tsx b/src/app/(main)/profile/[[...slugs]]/page.tsx
new file mode 100644
index 000000000000..4854d157a91c
--- /dev/null
+++ b/src/app/(main)/profile/[[...slugs]]/page.tsx
@@ -0,0 +1,21 @@
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+import { isMobileDevice } from '@/utils/responsive';
+
+import Client from './Client';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('userProfile.navbar.title'),
+ title: t('userProfile.navbar.description'),
+ url: '/profile',
+ });
+};
+
+const Page = () => {
+ const mobile = isMobileDevice();
+ return ;
+};
+
+export default Page;
diff --git a/src/app/(main)/profile/_layout/Mobile/Header.tsx b/src/app/(main)/profile/_layout/Mobile/Header.tsx
new file mode 100644
index 000000000000..ee141ba9528f
--- /dev/null
+++ b/src/app/(main)/profile/_layout/Mobile/Header.tsx
@@ -0,0 +1,26 @@
+'use client';
+
+import { MobileNavBar, MobileNavBarTitle } from '@lobehub/ui';
+import { usePathname, useRouter } from 'next/navigation';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { mobileHeaderSticky } from '@/styles/mobileHeader';
+
+const Header = memo(() => {
+ const { t } = useTranslation('auth');
+
+ const router = useRouter();
+ const pathname = usePathname();
+ const isSecurity = pathname.startsWith('/prifile/security');
+ return (
+ }
+ onBackClick={() => router.push('/me/profile')}
+ showBackButton
+ style={mobileHeaderSticky}
+ />
+ );
+});
+
+export default Header;
diff --git a/src/app/(main)/profile/_layout/Mobile/index.tsx b/src/app/(main)/profile/_layout/Mobile/index.tsx
new file mode 100644
index 000000000000..f6f20543036c
--- /dev/null
+++ b/src/app/(main)/profile/_layout/Mobile/index.tsx
@@ -0,0 +1,16 @@
+import { PropsWithChildren } from 'react';
+
+import Header from './Header';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ return (
+ <>
+
+ {children}
+ >
+ );
+};
+
+Layout.displayName = 'ProfileMobileLayout';
+
+export default Layout;
diff --git a/src/app/(main)/profile/layout.tsx b/src/app/(main)/profile/layout.tsx
new file mode 100644
index 000000000000..8c9178676cc2
--- /dev/null
+++ b/src/app/(main)/profile/layout.tsx
@@ -0,0 +1,20 @@
+import { notFound } from 'next/navigation';
+import { PropsWithChildren } from 'react';
+
+import { enableClerk } from '@/const/auth';
+import { isMobileDevice } from '@/utils/responsive';
+
+import MobileLayout from './_layout/Mobile';
+
+const Layout = ({ children }: PropsWithChildren) => {
+ if (!enableClerk) return notFound();
+
+ const mobile = isMobileDevice();
+ if (mobile) return {children} ;
+
+ return children;
+};
+
+Layout.displayName = 'ProfileLayout';
+
+export default Layout;
diff --git a/src/app/(main)/profile/loading.tsx b/src/app/(main)/profile/loading.tsx
new file mode 100644
index 000000000000..beddba1df79b
--- /dev/null
+++ b/src/app/(main)/profile/loading.tsx
@@ -0,0 +1,23 @@
+import { Flexbox } from 'react-layout-kit';
+
+import SkeletonLoading from '@/components/SkeletonLoading';
+import { isMobileDevice } from '@/utils/responsive';
+
+const Loading = () => {
+ const mobile = isMobileDevice();
+ if (mobile) return ;
+ return (
+
+
+ ;
+
+
+
+ ;
+
+
+
+ );
+};
+
+export default Loading;
diff --git a/src/app/(main)/settings/@category/default.tsx b/src/app/(main)/settings/@category/default.tsx
index f0a2f1a6c51e..eafd1d904b1a 100644
--- a/src/app/(main)/settings/@category/default.tsx
+++ b/src/app/(main)/settings/@category/default.tsx
@@ -1,5 +1,4 @@
-import UpgradeAlert from '@/app/(main)/settings/features/UpgradeAlert';
-
+import UpgradeAlert from '../features/UpgradeAlert';
import CategoryContent from './features/CategoryContent';
const Category = () => {
diff --git a/src/app/(main)/settings/_layout/Desktop/Header.tsx b/src/app/(main)/settings/_layout/Desktop/Header.tsx
index 134fdbe96a95..77e8ef25a1c4 100644
--- a/src/app/(main)/settings/_layout/Desktop/Header.tsx
+++ b/src/app/(main)/settings/_layout/Desktop/Header.tsx
@@ -1,20 +1,18 @@
'use client';
import { ActionIcon, ChatHeader, ChatHeaderTitle } from '@lobehub/ui';
-import { Drawer, type DrawerProps, Tag } from 'antd';
+import { Drawer, type DrawerProps } from 'antd';
import { createStyles } from 'antd-style';
import { Menu } from 'lucide-react';
-import { PropsWithChildren, memo, useState } from 'react';
-import { useTranslation } from 'react-i18next';
+import { ReactNode, memo, useState } from 'react';
import { Flexbox } from 'react-layout-kit';
import BrandWatermark from '@/components/BrandWatermark';
-import { useActiveSettingsKey } from '@/hooks/useActiveSettingsKey';
-import { SettingsTabs } from '@/store/global/initialState';
const useStyles = createStyles(({ token, css }) => ({
container: css`
position: relative;
+ flex: none;
height: 54px;
background: ${token.colorBgContainer};
`,
@@ -25,68 +23,63 @@ const useStyles = createStyles(({ token, css }) => ({
`,
}));
-const Header = memo>(
- ({ children, getContainer }) => {
- const [open, setOpen] = useState(false);
- const { styles, theme } = useStyles();
- const { t } = useTranslation('setting');
+interface HeaderProps extends Pick {
+ children: ReactNode;
+ title: ReactNode;
+}
- const activeKey = useActiveSettingsKey();
+const Header = memo(({ children, getContainer, title }) => {
+ const [open, setOpen] = useState(false);
+ const { styles, theme } = useStyles();
- return (
- <>
-
-
- setOpen(true)}
- size={{ blockSize: 32, fontSize: 18 }}
- />
- {t(`tab.${activeKey}`)}
- {activeKey === SettingsTabs.Sync && (
- {t('tab.experiment')}
- )}
-
- }
- />
-
- }
- />
- setOpen(false)}
- onClose={() => setOpen(false)}
- open={open}
- placement={'left'}
- rootStyle={{ position: 'absolute' }}
- style={{
- background: theme.colorBgContainer,
- borderRight: `1px solid ${theme.colorSplit}`,
- }}
- width={260}
- zIndex={10}
- >
- {children}
-
-
- >
- );
- },
-);
+ return (
+ <>
+
+ setOpen(true)}
+ size={{ blockSize: 32, fontSize: 18 }}
+ />
+ {title}
+
+ }
+ />
+ }
+ />
+ setOpen(false)}
+ onClose={() => setOpen(false)}
+ open={open}
+ placement={'left'}
+ rootStyle={{ position: 'absolute' }}
+ style={{
+ background: theme.colorBgContainer,
+ borderRight: `1px solid ${theme.colorSplit}`,
+ }}
+ width={260}
+ zIndex={10}
+ >
+ {children}
+
+
+ >
+ );
+});
export default Header;
diff --git a/src/app/(main)/settings/_layout/Desktop/index.tsx b/src/app/(main)/settings/_layout/Desktop/index.tsx
index a55bee488f88..e7b3aa4597c8 100644
--- a/src/app/(main)/settings/_layout/Desktop/index.tsx
+++ b/src/app/(main)/settings/_layout/Desktop/index.tsx
@@ -1,16 +1,25 @@
'use client';
+import { Tag } from 'antd';
import { useResponsive } from 'antd-style';
import { memo, useRef } from 'react';
+import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
+import SettingContainer from '@/features/Setting//SettingContainer';
+import Footer from '@/features/Setting/Footer';
+import { useActiveSettingsKey } from '@/hooks/useActiveSettingsKey';
+import { SettingsTabs } from '@/store/global/initialState';
+
import { LayoutProps } from '../type';
import Header from './Header';
import SideBar from './SideBar';
const Layout = memo(({ children, category }) => {
const ref = useRef(null);
- const { md = true, mobile = false } = useResponsive();
+ const { md = true } = useResponsive();
+ const { t } = useTranslation('setting');
+ const activeKey = useActiveSettingsKey();
return (
(({ children, category }) => {
{md ? (
{category}
) : (
-
- )}
-
- ref.current}
+ title={
+ <>
+ {t(`tab.${activeKey}`)}
+ {activeKey === SettingsTabs.Sync && {t('tab.experiment')} }
+ >
+ }
>
- {children}
-
-
+ {category}
+
+ )}
+ }>{children}
);
});
diff --git a/src/app/(main)/settings/_layout/Mobile/Header.tsx b/src/app/(main)/settings/_layout/Mobile/Header.tsx
index 152a6a31b06c..1d9dccb6dcd5 100644
--- a/src/app/(main)/settings/_layout/Mobile/Header.tsx
+++ b/src/app/(main)/settings/_layout/Mobile/Header.tsx
@@ -7,6 +7,7 @@ import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
+import { enableAuth } from '@/const/auth';
import { useActiveSettingsKey } from '@/hooks/useActiveSettingsKey';
import { SettingsTabs } from '@/store/global/initialState';
import { mobileHeaderSticky } from '@/styles/mobileHeader';
@@ -32,7 +33,7 @@ const Header = memo(() => {
}
/>
}
- onBackClick={() => router.push('/me')}
+ onBackClick={() => router.push(enableAuth ? '/me/settings' : '/me')}
showBackButton
style={mobileHeaderSticky}
/>
diff --git a/src/app/(main)/settings/_layout/Mobile/index.tsx b/src/app/(main)/settings/_layout/Mobile/index.tsx
index 37480864dc41..3e835d19ef93 100644
--- a/src/app/(main)/settings/_layout/Mobile/index.tsx
+++ b/src/app/(main)/settings/_layout/Mobile/index.tsx
@@ -1,10 +1,16 @@
import MobileContentLayout from '@/components/server/MobileNavLayout';
+import Footer from '@/features/Setting/Footer';
import { LayoutProps } from '../type';
import Header from './Header';
const Layout = ({ children }: LayoutProps) => {
- return }>{children};
+ return (
+ }>
+ {children}
+
+
+ );
};
Layout.displayName = 'MobileSettingsLayout';
diff --git a/src/app/(main)/settings/about/features/AboutList.tsx b/src/app/(main)/settings/about/features/AboutList.tsx
index 60cf7cf2bd2e..0a28f3009cff 100644
--- a/src/app/(main)/settings/about/features/AboutList.tsx
+++ b/src/app/(main)/settings/about/features/AboutList.tsx
@@ -1,132 +1,25 @@
'use client';
-import { Grid, Icon } from '@lobehub/ui';
-import { createStyles } from 'antd-style';
-import {
- Book,
- Feather,
- FileClock,
- Github,
- Heart,
- HeartHandshake,
- Home,
- Lock,
- Rss,
-} from 'lucide-react';
-import Link from 'next/link';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
+import { Grid } from '@lobehub/ui';
+import { FC, memo } from 'react';
import { Flexbox } from 'react-layout-kit';
-import {
- ABOUT,
- BLOG,
- CHANGELOG,
- FEEDBACK,
- GITHUB,
- OFFICIAL_SITE,
- PRIVACY_URL,
- TERMS_URL,
-} from '@/const/url';
+import { ItemCardProps } from './ItemCard';
-const useStyles = createStyles(({ css, token, responsive, isDarkMode }) => ({
- card: css`
- cursor: pointer;
+interface AboutListProps {
+ ItemRender: FC;
+ grid?: boolean;
+ items: ItemCardProps[];
+}
- padding: 20px;
+const AboutList = memo(({ grid, items, ItemRender }) => {
+ const content = items.map((item) => );
- background: ${isDarkMode ? token.colorFillTertiary : token.colorBgContainer};
- border: 1px solid ${token.colorFillSecondary};
- border-radius: ${token.borderRadiusLG}px;
-
- &:hover {
- background: ${isDarkMode ? token.colorFillSecondary : token.colorBgContainer};
- border: 1px solid ${token.colorFill};
- }
-
- ${responsive.mobile} {
- padding: 16px;
- }
- `,
- container: css`
- ${responsive.mobile} {
- padding-inline: 16px;
- }
- `,
-}));
-
-const AboutList = memo(() => {
- const { styles } = useStyles();
- const { t } = useTranslation('common');
-
- const items = [
- {
- href: OFFICIAL_SITE,
- icon: Home,
- label: t('officialSite'),
- value: 'officialSite',
- },
-
- {
- href: FEEDBACK,
- icon: Book,
- label: t('document'),
- value: 'feedback',
- },
- {
- href: BLOG,
- icon: Rss,
- label: t('blog'),
- value: 'blog',
- },
- {
- href: GITHUB,
- icon: Github,
- label: 'GitHub',
- value: 'feedback',
- },
- {
- href: FEEDBACK,
- icon: Feather,
- label: t('feedback'),
- value: 'feedback',
- },
- {
- href: CHANGELOG,
- icon: FileClock,
- label: t('changelog'),
- value: 'changelog',
- },
- {
- href: TERMS_URL,
- icon: HeartHandshake,
- label: t('terms'),
- value: 'terms',
- },
- {
- href: PRIVACY_URL,
- icon: Lock,
- label: t('privacy'),
- value: 'privacy',
- },
- {
- href: ABOUT,
- icon: Heart,
- label: t('about'),
- value: 'about',
- },
- ];
+ if (!grid) return {content} ;
return (
-
- {items.map(({ value, icon, label, href }) => (
-
-
-
- {label}
-
-
- ))}
+
+ {content}
);
});
diff --git a/src/app/(main)/settings/about/features/Analytics.tsx b/src/app/(main)/settings/about/features/Analytics.tsx
index 331596fd92e0..799191401a81 100644
--- a/src/app/(main)/settings/about/features/Analytics.tsx
+++ b/src/app/(main)/settings/about/features/Analytics.tsx
@@ -36,7 +36,7 @@ const Analytics = memo(() => {
title: t('analytics.title'),
};
- return ;
+ return ;
});
export default Analytics;
diff --git a/src/app/(main)/settings/about/features/Item.tsx b/src/app/(main)/settings/about/features/Item.tsx
deleted file mode 100644
index d9fa7a12863f..000000000000
--- a/src/app/(main)/settings/about/features/Item.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Icon, List } from '@lobehub/ui';
-import { createStyles, useResponsive } from 'antd-style';
-import { ChevronRight, type LucideIcon } from 'lucide-react';
-import { CSSProperties, ReactNode, memo } from 'react';
-
-const { Item } = List;
-
-const useStyles = createStyles(({ css, token, responsive }) => ({
- container: css`
- position: relative;
- padding-top: 16px;
- padding-bottom: 16px;
- border-radius: ${token.borderRadius}px;
- ${responsive.mobile} {
- border-radius: 0;
- }
- `,
- noHover: css`
- pointer-events: none;
- `,
-}));
-
-export interface ItemProps {
- active?: boolean;
- className?: string;
- hoverable?: boolean;
- icon: LucideIcon;
- label: ReactNode;
- style?: CSSProperties;
-}
-
-const SettingItem = memo(
- ({ label, icon, hoverable = true, active = false, style, className }) => {
- const { cx, styles } = useStyles();
- const { mobile } = useResponsive();
- return (
- }
- className={cx(styles.container, !hoverable && styles.noHover, className)}
- style={style}
- title={label as string}
- >
- {mobile && }
-
- );
- },
-);
-
-export default SettingItem;
diff --git a/src/app/(main)/settings/about/features/ItemCard.tsx b/src/app/(main)/settings/about/features/ItemCard.tsx
new file mode 100644
index 000000000000..99001d6d1e4e
--- /dev/null
+++ b/src/app/(main)/settings/about/features/ItemCard.tsx
@@ -0,0 +1,45 @@
+import { Icon } from '@lobehub/ui';
+import { createStyles } from 'antd-style';
+import { LucideIcon } from 'lucide-react';
+import Link from 'next/link';
+import { memo } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+const useStyles = createStyles(({ css, token, isDarkMode }) => ({
+ card: css`
+ cursor: pointer;
+
+ padding: 12px 16px;
+
+ background: ${isDarkMode ? token.colorFillTertiary : token.colorBgContainer};
+ border: 1px solid ${token.colorFillSecondary};
+ border-radius: ${token.borderRadiusLG}px;
+
+ &:hover {
+ background: ${isDarkMode ? token.colorFillSecondary : token.colorBgContainer};
+ border: 1px solid ${token.colorFill};
+ }
+ `,
+}));
+
+export interface ItemCardProps {
+ href: string;
+ icon?: LucideIcon;
+ label: string;
+ value: string;
+}
+
+const ItemCard = memo(({ label, icon, href }) => {
+ const { styles, theme } = useStyles();
+
+ return (
+
+
+ {icon && }
+ {label}
+
+
+ );
+});
+
+export default ItemCard;
diff --git a/src/app/(main)/settings/about/features/ItemLink.tsx b/src/app/(main)/settings/about/features/ItemLink.tsx
new file mode 100644
index 000000000000..39cf343a7c22
--- /dev/null
+++ b/src/app/(main)/settings/about/features/ItemLink.tsx
@@ -0,0 +1,32 @@
+import { Icon } from '@lobehub/ui';
+import { useTheme } from 'antd-style';
+import { LucideIcon, SquareArrowOutUpRight } from 'lucide-react';
+import Link from 'next/link';
+import { memo } from 'react';
+import { Flexbox } from 'react-layout-kit';
+
+export interface ItemLinkProps {
+ href: string;
+ icon?: LucideIcon;
+ label: string;
+ value: string;
+}
+
+const ItemLink = memo(({ label, href }) => {
+ const theme = useTheme();
+
+ return (
+
+
+ {label}
+
+
+
+ );
+});
+
+export default ItemLink;
diff --git a/src/app/(main)/settings/about/features/Version.tsx b/src/app/(main)/settings/about/features/Version.tsx
new file mode 100644
index 000000000000..fb026c73dd40
--- /dev/null
+++ b/src/app/(main)/settings/about/features/Version.tsx
@@ -0,0 +1,74 @@
+import { Button, Tag } from 'antd';
+import { createStyles } from 'antd-style';
+import Image from 'next/image';
+import Link from 'next/link';
+import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Center, Flexbox } from 'react-layout-kit';
+
+import { MANUAL_UPGRADE_URL, OFFICIAL_SITE, RELEASES_URL } from '@/const/url';
+import { CURRENT_VERSION } from '@/const/version';
+import { useGlobalStore } from '@/store/global';
+
+const useStyles = createStyles(({ css, token }) => ({
+ logo: css`
+ overflow: hidden;
+ background: ${token.colorBgContainer};
+ border-radius: ${token.borderRadiusLG * 2}px;
+ box-shadow: 0 0 0 1px ${token.colorFillSecondary} inset;
+ `,
+}));
+
+const Version = memo<{ mobile?: boolean }>(({ mobile }) => {
+ const [hasNewVersion, latestVersion] = useGlobalStore((s) => [s.hasNewVersion, s.latestVersion]);
+ const { t } = useTranslation('common');
+ const { styles, theme } = useStyles();
+ return (
+
+
+
+
+
+
+
+
+ LobeChat
+
+
+ v{CURRENT_VERSION}
+
+ {hasNewVersion && (
+
+ {t('upgradeVersion.newVersion', { version: `v${latestVersion}` })}
+
+ )}
+
+
+
+
+
+ {t('changelog')}
+
+ {hasNewVersion && (
+
+
+ {t('upgradeVersion.action')}
+
+
+ )}
+
+
+ );
+});
+
+export default Version;
diff --git a/src/app/(main)/settings/about/index.tsx b/src/app/(main)/settings/about/index.tsx
index d9a7a050f345..ece9b7cda4a4 100644
--- a/src/app/(main)/settings/about/index.tsx
+++ b/src/app/(main)/settings/about/index.tsx
@@ -1,43 +1,136 @@
'use client';
-import { Logo, Tag } from '@lobehub/ui';
-import Link from 'next/link';
+import { SiDiscord, SiGithub, SiMedium, SiRss, SiX } from '@icons-pack/react-simple-icons';
+import { Form } from '@lobehub/ui';
+import { Divider } from 'antd';
+import { createStyles } from 'antd-style';
import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
-import { OFFICIAL_SITE, RELEASES_URL } from '@/const/url';
-import { CURRENT_VERSION } from '@/const/version';
-import Follow from '@/features/Follow';
+import {
+ BLOG,
+ DISCORD,
+ EMAIL_BUSINESS,
+ EMAIL_SUPPORT,
+ GITHUB,
+ MEDIDUM,
+ OFFICIAL_SITE,
+ PRIVACY_URL,
+ TERMS_URL,
+ X,
+ mailTo,
+} from '@/const/url';
import { useServerConfigStore } from '@/store/serverConfig';
import { serverConfigSelectors } from '@/store/serverConfig/selectors';
import AboutList from './features/AboutList';
import Analytics from './features/Analytics';
+import ItemCard from './features/ItemCard';
+import ItemLink from './features/ItemLink';
+import Version from './features/Version';
-const COPYRIGHT = `© 2023-${new Date().getFullYear()} LobeHub, LLC`;
+const useStyles = createStyles(({ css, token }) => ({
+ title: css`
+ font-size: 14px;
+ font-weight: bold;
+ color: ${token.colorTextSecondary};
+ `,
+}));
-const Page = memo(({ mobile }: { mobile?: boolean }) => {
+const Page = memo<{ mobile?: boolean }>(({ mobile }) => {
+ const { t } = useTranslation('common');
+ const { styles } = useStyles();
const enabledTelemetryChat = useServerConfigStore(serverConfigSelectors.enabledTelemetryChat);
return (
-
-
-
-
-
- LobeChat
-
-
- v{CURRENT_VERSION}
-
-
-
- {enabledTelemetryChat && }
-
-
- Empowering your AI dreams by LobeHub
- {COPYRIGHT}
-
+ <>
+
+
+ {t('version')}
+
+
+ {t('contact')}
+
+
+ {t('information')}
+
+
+ {t('legal')}
+
+
+
+ {enabledTelemetryChat && }
+ >
);
});
diff --git a/src/app/(main)/settings/about/page.tsx b/src/app/(main)/settings/about/page.tsx
index 838aa41315b3..0798bfac5480 100644
--- a/src/app/(main)/settings/about/page.tsx
+++ b/src/app/(main)/settings/about/page.tsx
@@ -1,3 +1,4 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
@@ -5,9 +6,11 @@ import Page from './index';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.about'),
- };
+ url: '/settings/about',
+ });
};
export default () => {
diff --git a/src/app/(main)/settings/agent/index.tsx b/src/app/(main)/settings/agent/index.tsx
index e6d49917903f..4e293b0169b0 100644
--- a/src/app/(main)/settings/agent/index.tsx
+++ b/src/app/(main)/settings/agent/index.tsx
@@ -4,7 +4,7 @@ import isEqual from 'fast-deep-equal';
import { memo } from 'react';
import { INBOX_SESSION_ID } from '@/const/session';
-import AgentSettings from '@/features/AgentSetting';
+import { AgentSettings } from '@/features/AgentSetting';
import { useUserStore } from '@/store/user';
import { settingsSelectors } from '@/store/user/selectors';
diff --git a/src/app/(main)/settings/agent/page.tsx b/src/app/(main)/settings/agent/page.tsx
index c47984c050b0..ed35b90c3779 100644
--- a/src/app/(main)/settings/agent/page.tsx
+++ b/src/app/(main)/settings/agent/page.tsx
@@ -1,10 +1,12 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.agent'),
- };
+ url: '/settings/agent',
+ });
};
-
export { default } from './index';
diff --git a/src/app/(main)/settings/common/features/Common.tsx b/src/app/(main)/settings/common/features/Common.tsx
index cd1db5a1e886..cad5baeedcda 100644
--- a/src/app/(main)/settings/common/features/Common.tsx
+++ b/src/app/(main)/settings/common/features/Common.tsx
@@ -3,7 +3,6 @@
import { Form, type ItemGroup } from '@lobehub/ui';
import { App, Button, Input } from 'antd';
import isEqual from 'fast-deep-equal';
-import { signIn, signOut } from 'next-auth/react';
import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
@@ -12,6 +11,8 @@ import { FORM_STYLE } from '@/const/layoutTokens';
import { DEFAULT_SETTINGS } from '@/const/settings';
import { useChatStore } from '@/store/chat';
import { useFileStore } from '@/store/file';
+import { useServerConfigStore } from '@/store/serverConfig';
+import { serverConfigSelectors } from '@/store/serverConfig/selectors';
import { useSessionStore } from '@/store/session';
import { useToolStore } from '@/store/tool';
import { useUserStore } from '@/store/user';
@@ -19,16 +20,13 @@ import { settingsSelectors, userProfileSelectors } from '@/store/user/selectors'
type SettingItemGroup = ItemGroup;
-export interface SettingsCommonProps {
- showAccessCodeConfig: boolean;
- showOAuthLogin?: boolean;
-}
-
-const Common = memo(({ showAccessCodeConfig, showOAuthLogin }) => {
+const Common = memo(() => {
const { t } = useTranslation('setting');
const [form] = Form.useForm();
const isSignedIn = useUserStore((s) => s.isSignedIn);
+ const showAccessCodeConfig = useServerConfigStore(serverConfigSelectors.enabledAccessCode);
+ const showOAuthLogin = useServerConfigStore(serverConfigSelectors.enabledOAuthSSO);
const user = useUserStore(userProfileSelectors.userProfile, isEqual);
const [clearSessions, clearSessionGroups] = useSessionStore((s) => [
@@ -42,7 +40,12 @@ const Common = memo(({ showAccessCodeConfig, showOAuthLogin
const [removeAllFiles] = useFileStore((s) => [s.removeAllFiles]);
const removeAllPlugins = useToolStore((s) => s.removeAllPlugins);
const settings = useUserStore(settingsSelectors.currentSettings, isEqual);
- const [setSettings, resetSettings] = useUserStore((s) => [s.setSettings, s.resetSettings]);
+ const [setSettings, resetSettings, signIn, signOut] = useUserStore((s) => [
+ s.setSettings,
+ s.resetSettings,
+ s.openLogin,
+ s.logout,
+ ]);
const { message, modal } = App.useApp();
@@ -107,7 +110,7 @@ const Common = memo(({ showAccessCodeConfig, showOAuthLogin
desc: t('settingSystem.accessCode.desc'),
hidden: !showAccessCodeConfig,
label: t('settingSystem.accessCode.title'),
- name: 'password',
+ name: ['keyVaults', 'password'],
},
{
children: isSignedIn ? (
@@ -132,8 +135,8 @@ const Common = memo(({ showAccessCodeConfig, showOAuthLogin
{t('danger.reset.action')}
),
- desc: t('danger.reset.title'),
- label: t('danger.reset.desc'),
+ desc: t('danger.reset.desc'),
+ label: t('danger.reset.title'),
minWidth: undefined,
},
{
diff --git a/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesNeutral.tsx b/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesNeutral.tsx
index ee6a9757079e..a998790bba76 100644
--- a/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesNeutral.tsx
+++ b/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesNeutral.tsx
@@ -8,17 +8,17 @@ import {
import { memo } from 'react';
import { useUserStore } from '@/store/user';
-import { settingsSelectors } from '@/store/user/selectors';
+import { userGeneralSettingsSelectors } from '@/store/user/selectors';
const ThemeSwatchesNeutral = memo(() => {
- const [neutralColor, setSettings] = useUserStore((s) => [
- settingsSelectors.currentSettings(s).neutralColor,
- s.setSettings,
+ const [neutralColor, updateGeneralConfig] = useUserStore((s) => [
+ userGeneralSettingsSelectors.neutralColor(s),
+ s.updateGeneralConfig,
]);
const handleSelect = (v: any) => {
const name = findCustomThemeName('neutral', v) as NeutralColors;
- setSettings({ neutralColor: name || '' });
+ updateGeneralConfig({ neutralColor: name || '' });
};
return (
diff --git a/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesPrimary.tsx b/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesPrimary.tsx
index d2bd3c902093..a8649760a618 100644
--- a/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesPrimary.tsx
+++ b/src/app/(main)/settings/common/features/Theme/ThemeSwatches/ThemeSwatchesPrimary.tsx
@@ -8,17 +8,17 @@ import {
import { memo } from 'react';
import { useUserStore } from '@/store/user';
-import { settingsSelectors } from '@/store/user/selectors';
+import { userGeneralSettingsSelectors } from '@/store/user/selectors';
const ThemeSwatchesPrimary = memo(() => {
- const [primaryColor, setSettings] = useUserStore((s) => [
- settingsSelectors.currentSettings(s).primaryColor,
- s.setSettings,
+ const [primaryColor, updateGeneralConfig] = useUserStore((s) => [
+ userGeneralSettingsSelectors.primaryColor(s),
+ s.updateGeneralConfig,
]);
const handleSelect = (v: any) => {
const name = findCustomThemeName('primary', v) as PrimaryColors;
- setSettings({ primaryColor: name || '' });
+ updateGeneralConfig({ primaryColor: name || '' });
};
return (
diff --git a/src/app/(main)/settings/common/features/Theme/index.tsx b/src/app/(main)/settings/common/features/Theme/index.tsx
index 6f1440c01a9e..4721bd285784 100644
--- a/src/app/(main)/settings/common/features/Theme/index.tsx
+++ b/src/app/(main)/settings/common/features/Theme/index.tsx
@@ -14,7 +14,7 @@ import { imageUrl } from '@/const/url';
import AvatarWithUpload from '@/features/AvatarWithUpload';
import { localeOptions } from '@/locales/resources';
import { useUserStore } from '@/store/user';
-import { settingsSelectors } from '@/store/user/selectors';
+import { settingsSelectors, userGeneralSettingsSelectors } from '@/store/user/selectors';
import { switchLang } from '@/utils/client/switchLang';
import { ThemeSwatchesNeutral, ThemeSwatchesPrimary } from './ThemeSwatches';
@@ -25,6 +25,7 @@ const Theme = memo(() => {
const { t } = useTranslation('setting');
const [form] = Form.useForm();
const settings = useUserStore(settingsSelectors.currentSettings, isEqual);
+ const themeMode = useUserStore(userGeneralSettingsSelectors.currentThemeMode);
const [setThemeMode, setSettings] = useUserStore((s) => [s.switchThemeMode, s.setSettings]);
useSyncSettings(form);
@@ -40,7 +41,6 @@ const Theme = memo(() => {
{
children: (
{
},
]}
unoptimized={false}
+ value={themeMode}
width={100}
/>
),
@@ -78,7 +79,7 @@ const Theme = memo(() => {
/>
),
label: t('settingTheme.lang.title'),
- name: 'language',
+ name: ['general', 'language'],
},
{
children: (
@@ -113,7 +114,7 @@ const Theme = memo(() => {
),
desc: t('settingTheme.fontSize.desc'),
label: t('settingTheme.fontSize.title'),
- name: 'fontSize',
+ name: ['general', 'fontSize'],
},
{
children: ,
diff --git a/src/app/(main)/settings/common/index.tsx b/src/app/(main)/settings/common/index.tsx
index 5017da805f48..5cd7510c01c7 100644
--- a/src/app/(main)/settings/common/index.tsx
+++ b/src/app/(main)/settings/common/index.tsx
@@ -1,19 +1,11 @@
-import { authEnv } from '@/config/auth';
-import { getServerConfig } from '@/config/server';
-
import Common from './features/Common';
import Theme from './features/Theme';
const Page = () => {
- const { SHOW_ACCESS_CODE_CONFIG } = getServerConfig();
-
return (
<>
-
+
>
);
};
diff --git a/src/app/(main)/settings/common/page.tsx b/src/app/(main)/settings/common/page.tsx
index aee71a1c4fa4..93d377c03be9 100644
--- a/src/app/(main)/settings/common/page.tsx
+++ b/src/app/(main)/settings/common/page.tsx
@@ -1,10 +1,13 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.common'),
- };
+ url: '/settings/common',
+ });
};
export { default } from './index';
diff --git a/src/app/(main)/settings/features/Footer.tsx b/src/app/(main)/settings/features/Footer.tsx
deleted file mode 100644
index 4348dccf5674..000000000000
--- a/src/app/(main)/settings/features/Footer.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-'use client';
-
-import { Divider } from 'antd';
-import { createStyles } from 'antd-style';
-import { PropsWithChildren, memo } from 'react';
-import { Center } from 'react-layout-kit';
-
-const useStyles = createStyles(
- ({ css, token }) => css`
- font-size: 12px;
- color: ${token.colorTextQuaternary};
- `,
-);
-
-const Footer = memo(({ children }) => {
- const { styles } = useStyles();
- return (
-
-
- {children}
-
-
- );
-});
-
-export default Footer;
diff --git a/src/app/(main)/settings/hooks/useCategory.tsx b/src/app/(main)/settings/hooks/useCategory.tsx
index 1ce9b8090a1b..ebb200dab21a 100644
--- a/src/app/(main)/settings/hooks/useCategory.tsx
+++ b/src/app/(main)/settings/hooks/useCategory.tsx
@@ -1,6 +1,7 @@
import { Icon } from '@lobehub/ui';
import { Tag } from 'antd';
-import { Bot, Brain, Cloudy, Info, Mic2, Settings2 } from 'lucide-react';
+import { Bot, Brain, Cloudy, Info, Mic2, Settings2, Sparkles } from 'lucide-react';
+import Link from 'next/link';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
@@ -9,51 +10,81 @@ import type { MenuProps } from '@/components/Menu';
import { SettingsTabs } from '@/store/global/initialState';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
-interface UseCategoryOptions {
- mobile?: boolean;
-}
-
-export const useCategory = ({ mobile }: UseCategoryOptions = {}) => {
+export const useCategory = () => {
const { t } = useTranslation('setting');
const { enableWebrtc, showLLM } = useServerConfigStore(featureFlagsSelectors);
- const iconSize = mobile ? { fontSize: 20 } : undefined;
-
const cateItems: MenuProps['items'] = useMemo(
() =>
[
{
- icon: ,
+ icon: ,
key: SettingsTabs.Common,
- label: t('tab.common'),
+ label: (
+ e.preventDefault()}>
+ {t('tab.common')}
+
+ ),
+ },
+ {
+ icon: ,
+ key: SettingsTabs.SystemAgent,
+ label: (
+ e.preventDefault()}>
+ {t('tab.system-agent')}
+
+ ),
},
enableWebrtc && {
- icon: ,
+ icon: ,
key: SettingsTabs.Sync,
label: (
-
- {t('tab.sync')}
-
- {t('tab.experiment')}
-
-
+ e.preventDefault()}>
+
+ {t('tab.sync')}
+
+ {t('tab.experiment')}
+
+
+
),
},
showLLM && {
- icon: ,
+ icon: ,
key: SettingsTabs.LLM,
- label: t('tab.llm'),
+ label: (
+ e.preventDefault()}>
+ {t('tab.llm')}
+
+ ),
+ },
+
+ {
+ icon: ,
+ key: SettingsTabs.TTS,
+ label: (
+ e.preventDefault()}>
+ {t('tab.tts')}
+
+ ),
},
- { icon: , key: SettingsTabs.TTS, label: t('tab.tts') },
{
- icon: ,
+ icon: ,
key: SettingsTabs.Agent,
- label: t('tab.agent'),
+ label: (
+ e.preventDefault()}>
+ {t('tab.agent')}
+
+ ),
},
{
- icon: ,
+ icon: ,
key: SettingsTabs.About,
- label: t('tab.about'),
+ label: (
+ e.preventDefault()}>
+ {t('tab.about')}
+
+ ),
},
].filter(Boolean) as MenuProps['items'],
[t, enableWebrtc, showLLM],
diff --git a/src/app/(main)/settings/llm/Anthropic/index.tsx b/src/app/(main)/settings/llm/Anthropic/index.tsx
deleted file mode 100644
index e13fc210cce3..000000000000
--- a/src/app/(main)/settings/llm/Anthropic/index.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import { Anthropic, Claude } from '@lobehub/icons';
-import { useTheme } from 'antd-style';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const AnthropicProvider = memo(() => {
- const { isDarkMode } = useTheme();
- return (
- }
- />
- );
-});
-
-export default AnthropicProvider;
diff --git a/src/app/(main)/settings/llm/Azure/index.tsx b/src/app/(main)/settings/llm/Azure/index.tsx
deleted file mode 100644
index 09b05b56e37a..000000000000
--- a/src/app/(main)/settings/llm/Azure/index.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-'use client';
-
-import { Azure, OpenAI } from '@lobehub/icons';
-import { Markdown } from '@lobehub/ui';
-import { AutoComplete, Divider, Input } from 'antd';
-import { createStyles } from 'antd-style';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Flexbox } from 'react-layout-kit';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-import { useUserStore } from '@/store/user';
-import { modelProviderSelectors } from '@/store/user/selectors';
-
-import ProviderConfig from '../components/ProviderConfig';
-import { LLMProviderApiTokenKey, LLMProviderBaseUrlKey, LLMProviderConfigKey } from '../const';
-
-const useStyles = createStyles(({ css, token }) => ({
- markdown: css`
- p {
- color: ${token.colorTextDescription} !important;
- }
- `,
- tip: css`
- font-size: 12px;
- color: ${token.colorTextDescription};
- `,
-}));
-
-const providerKey = ModelProvider.Azure;
-
-const AzureOpenAIProvider = memo(() => {
- const { t } = useTranslation('modelProvider');
-
- const { styles } = useStyles();
-
- // Get the first model card's deployment name as the check model
- const checkModel = useUserStore((s) => {
- const chatModelCards = modelProviderSelectors.getModelCardsById(providerKey)(s);
-
- if (chatModelCards.length > 0) {
- return chatModelCards[0].deploymentName;
- }
-
- return 'gpt-35-turbo';
- });
-
- return (
-
- ),
- desc: t('azure.token.desc'),
- label: t('azure.token.title'),
- name: [LLMProviderConfigKey, providerKey, LLMProviderApiTokenKey],
- },
- {
- children: ,
- desc: t('azure.endpoint.desc'),
- label: t('azure.endpoint.title'),
- name: [LLMProviderConfigKey, providerKey, LLMProviderBaseUrlKey],
- },
- {
- children: (
- ({ label: i, value: i }))}
- placeholder={'20XX-XX-XX'}
- />
- ),
- desc: (
-
- {t('azure.azureApiVersion.desc')}
-
- ),
- label: t('azure.azureApiVersion.title'),
- name: [LLMProviderConfigKey, providerKey, 'apiVersion'],
- },
- ]}
- checkModel={checkModel}
- modelList={{
- azureDeployName: true,
- notFoundContent: t('azure.empty'),
- placeholder: t('azure.modelListPlaceholder'),
- }}
- provider={providerKey}
- title={
-
-
-
-
-
- }
- />
- );
-});
-
-export default AzureOpenAIProvider;
diff --git a/src/app/(main)/settings/llm/Bedrock/index.tsx b/src/app/(main)/settings/llm/Bedrock/index.tsx
deleted file mode 100644
index 91295e143a94..000000000000
--- a/src/app/(main)/settings/llm/Bedrock/index.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-'use client';
-
-import { Aws, Bedrock } from '@lobehub/icons';
-import { Divider, Input, Select } from 'antd';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-import { Flexbox } from 'react-layout-kit';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-import { GlobalLLMProviderKey } from '@/types/settings';
-
-import ProviderConfig from '../components/ProviderConfig';
-import { LLMProviderConfigKey } from '../const';
-
-const providerKey: GlobalLLMProviderKey = 'bedrock';
-
-const BedrockProvider = memo(() => {
- const { t } = useTranslation('modelProvider');
-
- return (
-
- ),
- desc: t(`${providerKey}.accessKeyId.desc`),
- label: t(`${providerKey}.accessKeyId.title`),
- name: [LLMProviderConfigKey, providerKey, 'accessKeyId'],
- },
- {
- children: (
-
- ),
- desc: t(`${providerKey}.secretAccessKey.desc`),
- label: t(`${providerKey}.secretAccessKey.title`),
- name: [LLMProviderConfigKey, providerKey, 'secretAccessKey'],
- },
- {
- children: (
- ({
- label: i,
- value: i,
- }))}
- placeholder={'us-east-1'}
- />
- ),
- desc: t(`${providerKey}.region.desc`),
- label: t(`${providerKey}.region.title`),
- name: [LLMProviderConfigKey, providerKey, 'region'],
- },
- ]}
- checkModel={'anthropic.claude-instant-v1'}
- provider={ModelProvider.Bedrock}
- title={
-
-
-
-
-
- }
- />
- );
-});
-
-export default BedrockProvider;
diff --git a/src/app/(main)/settings/llm/Google/index.tsx b/src/app/(main)/settings/llm/Google/index.tsx
deleted file mode 100644
index 96312c0249aa..000000000000
--- a/src/app/(main)/settings/llm/Google/index.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-'use client';
-
-import { Gemini, Google } from '@lobehub/icons';
-import { Divider } from 'antd';
-import { memo } from 'react';
-import { Flexbox } from 'react-layout-kit';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const GoogleProvider = memo(() => {
- return (
-
-
-
-
-
- }
- />
- );
-});
-
-export default GoogleProvider;
diff --git a/src/app/(main)/settings/llm/Groq/index.tsx b/src/app/(main)/settings/llm/Groq/index.tsx
deleted file mode 100644
index b339f04ffd93..000000000000
--- a/src/app/(main)/settings/llm/Groq/index.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import { Groq } from '@lobehub/icons';
-import { useTheme } from 'antd-style';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const GroqProvider = memo(() => {
- const theme = useTheme();
-
- return (
- }
- />
- );
-});
-
-export default GroqProvider;
diff --git a/src/app/(main)/settings/llm/Minimax/index.tsx b/src/app/(main)/settings/llm/Minimax/index.tsx
deleted file mode 100644
index 1d11742cce74..000000000000
--- a/src/app/(main)/settings/llm/Minimax/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-
-import { Minimax } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const MinimaxProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default MinimaxProvider;
diff --git a/src/app/(main)/settings/llm/Mistral/index.tsx b/src/app/(main)/settings/llm/Mistral/index.tsx
deleted file mode 100644
index 3a6223f999c0..000000000000
--- a/src/app/(main)/settings/llm/Mistral/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-
-import { Mistral } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const MistralProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default MistralProvider;
diff --git a/src/app/(main)/settings/llm/Moonshot/index.tsx b/src/app/(main)/settings/llm/Moonshot/index.tsx
deleted file mode 100644
index e4cfc2c13742..000000000000
--- a/src/app/(main)/settings/llm/Moonshot/index.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-'use client';
-
-import { Moonshot } from '@lobehub/icons';
-import { useTheme } from 'antd-style';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const MoonshotProvider = memo(() => {
- const theme = useTheme();
-
- return (
-
- }
- />
- );
-});
-
-export default MoonshotProvider;
diff --git a/src/app/(main)/settings/llm/Ollama/index.tsx b/src/app/(main)/settings/llm/Ollama/index.tsx
deleted file mode 100644
index 788abf5b4abf..000000000000
--- a/src/app/(main)/settings/llm/Ollama/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-'use client';
-
-import { Ollama } from '@lobehub/icons';
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-import Checker from './Checker';
-
-const OllamaProvider = memo(() => {
- const { t } = useTranslation('setting');
-
- return (
- ,
- desc: t('llm.checker.ollamaDesc'),
- label: t('llm.checker.title'),
- minWidth: undefined,
- }}
- modelList={{ showModelFetcher: true }}
- provider={ModelProvider.Ollama}
- showApiKey={false}
- showBrowserRequest
- showEndpoint
- title={ }
- />
- );
-});
-
-export default OllamaProvider;
diff --git a/src/app/(main)/settings/llm/OpenAI/index.tsx b/src/app/(main)/settings/llm/OpenAI/index.tsx
deleted file mode 100644
index 1928efc12e21..000000000000
--- a/src/app/(main)/settings/llm/OpenAI/index.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-'use client';
-
-import { OpenAI } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const OpenAIProvider = memo(() => {
- const { showOpenAIProxyUrl, showOpenAIApiKey } = useServerConfigStore(featureFlagsSelectors);
-
- return (
- }
- />
- );
-});
-
-export default OpenAIProvider;
diff --git a/src/app/(main)/settings/llm/OpenRouter/index.tsx b/src/app/(main)/settings/llm/OpenRouter/index.tsx
deleted file mode 100644
index f9721ef53922..000000000000
--- a/src/app/(main)/settings/llm/OpenRouter/index.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-'use client';
-
-import { OpenRouter } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const OpenRouterProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default OpenRouterProvider;
diff --git a/src/app/(main)/settings/llm/Perplexity/index.tsx b/src/app/(main)/settings/llm/Perplexity/index.tsx
deleted file mode 100644
index 419d901b0483..000000000000
--- a/src/app/(main)/settings/llm/Perplexity/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-
-import { Perplexity } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const PerplexityProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default PerplexityProvider;
diff --git a/src/app/(main)/settings/llm/ProviderList/Azure/index.tsx b/src/app/(main)/settings/llm/ProviderList/Azure/index.tsx
new file mode 100644
index 000000000000..68cbdb90b3bf
--- /dev/null
+++ b/src/app/(main)/settings/llm/ProviderList/Azure/index.tsx
@@ -0,0 +1,107 @@
+'use client';
+
+import { Azure, OpenAI } from '@lobehub/icons';
+import { Markdown } from '@lobehub/ui';
+import { AutoComplete, Divider, Input } from 'antd';
+import { createStyles } from 'antd-style';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import { AzureProviderCard } from '@/config/modelProviders';
+import { ModelProvider } from '@/libs/agent-runtime';
+import { useUserStore } from '@/store/user';
+import { modelProviderSelectors } from '@/store/user/selectors';
+
+import { KeyVaultsConfigKey, LLMProviderApiTokenKey } from '../../const';
+import { ProviderItem } from '../../type';
+
+const useStyles = createStyles(({ css, token }) => ({
+ markdown: css`
+ p {
+ color: ${token.colorTextDescription} !important;
+ }
+ `,
+ tip: css`
+ font-size: 12px;
+ color: ${token.colorTextDescription};
+ `,
+}));
+
+const providerKey = ModelProvider.Azure;
+
+const AzureOpenAIBrand = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export const useAzureProvider = (): ProviderItem => {
+ const { t } = useTranslation('modelProvider');
+ const { styles } = useStyles();
+
+ // Get the first model card's deployment name as the check model
+ const checkModel = useUserStore((s) => {
+ const chatModelCards = modelProviderSelectors.getModelCardsById(providerKey)(s);
+
+ if (chatModelCards.length > 0) {
+ return chatModelCards[0].deploymentName;
+ }
+
+ return 'gpt-35-turbo';
+ });
+ return {
+ ...AzureProviderCard,
+ apiKeyItems: [
+ {
+ children: (
+
+ ),
+ desc: t('azure.token.desc'),
+ label: t('azure.token.title'),
+ name: [KeyVaultsConfigKey, providerKey, LLMProviderApiTokenKey],
+ },
+ {
+ children: ,
+ desc: t('azure.endpoint.desc'),
+ label: t('azure.endpoint.title'),
+ name: [KeyVaultsConfigKey, providerKey, 'endpoint'],
+ },
+ {
+ children: (
+ ({ label: i, value: i }))}
+ placeholder={'20XX-XX-XX'}
+ />
+ ),
+ desc: (
+
+ {t('azure.azureApiVersion.desc')}
+
+ ),
+ label: t('azure.azureApiVersion.title'),
+ name: [KeyVaultsConfigKey, providerKey, 'apiVersion'],
+ },
+ ],
+ checkModel,
+ modelList: {
+ azureDeployName: true,
+ notFoundContent: t('azure.empty'),
+ placeholder: t('azure.modelListPlaceholder'),
+ },
+ title: ,
+ };
+};
diff --git a/src/app/(main)/settings/llm/ProviderList/Bedrock/index.tsx b/src/app/(main)/settings/llm/ProviderList/Bedrock/index.tsx
new file mode 100644
index 000000000000..1192de646c3b
--- /dev/null
+++ b/src/app/(main)/settings/llm/ProviderList/Bedrock/index.tsx
@@ -0,0 +1,68 @@
+'use client';
+
+import { Aws, Bedrock } from '@lobehub/icons';
+import { Divider, Input, Select } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { Flexbox } from 'react-layout-kit';
+
+import { BedrockProviderCard } from '@/config/modelProviders';
+import { GlobalLLMProviderKey } from '@/types/user/settings';
+
+import { KeyVaultsConfigKey } from '../../const';
+import { ProviderItem } from '../../type';
+
+const providerKey: GlobalLLMProviderKey = 'bedrock';
+
+export const useBedrockProvider = (): ProviderItem => {
+ const { t } = useTranslation('modelProvider');
+
+ return {
+ ...BedrockProviderCard,
+ apiKeyItems: [
+ {
+ children: (
+
+ ),
+ desc: t(`${providerKey}.accessKeyId.desc`),
+ label: t(`${providerKey}.accessKeyId.title`),
+ name: [KeyVaultsConfigKey, providerKey, 'accessKeyId'],
+ },
+ {
+ children: (
+
+ ),
+ desc: t(`${providerKey}.secretAccessKey.desc`),
+ label: t(`${providerKey}.secretAccessKey.title`),
+ name: [KeyVaultsConfigKey, providerKey, 'secretAccessKey'],
+ },
+ {
+ children: (
+ ({
+ label: i,
+ value: i,
+ }))}
+ placeholder={'us-east-1'}
+ />
+ ),
+ desc: t(`${providerKey}.region.desc`),
+ label: t(`${providerKey}.region.title`),
+ name: [KeyVaultsConfigKey, providerKey, 'region'],
+ },
+ ],
+ title: (
+
+
+
+
+
+ ),
+ };
+};
diff --git a/src/app/(main)/settings/llm/Ollama/Checker.tsx b/src/app/(main)/settings/llm/ProviderList/Ollama/Checker.tsx
similarity index 98%
rename from src/app/(main)/settings/llm/Ollama/Checker.tsx
rename to src/app/(main)/settings/llm/ProviderList/Ollama/Checker.tsx
index 5dade1c35643..fa6ec60f16d1 100644
--- a/src/app/(main)/settings/llm/Ollama/Checker.tsx
+++ b/src/app/(main)/settings/llm/ProviderList/Ollama/Checker.tsx
@@ -27,7 +27,7 @@ const OllamaChecker = memo(() => {
);
const checkConnection = () => {
- mutate();
+ mutate().catch();
};
const isMobile = useIsMobile();
diff --git a/src/app/(main)/settings/llm/ProviderList/Ollama/index.tsx b/src/app/(main)/settings/llm/ProviderList/Ollama/index.tsx
new file mode 100644
index 000000000000..fc3ad0b82bc0
--- /dev/null
+++ b/src/app/(main)/settings/llm/ProviderList/Ollama/index.tsx
@@ -0,0 +1,29 @@
+'use client';
+
+import { Ollama } from '@lobehub/icons';
+import { useTranslation } from 'react-i18next';
+
+import { OllamaProviderCard } from '@/config/modelProviders';
+
+import { ProviderItem } from '../../type';
+import Checker from './Checker';
+
+export const useOllamaProvider = (): ProviderItem => {
+ const { t } = useTranslation('modelProvider');
+
+ return {
+ ...OllamaProviderCard,
+ checkerItem: {
+ children: ,
+ desc: t('ollama.checker.desc'),
+ label: t('ollama.checker.title'),
+ minWidth: undefined,
+ },
+ proxyUrl: {
+ desc: t('ollama.endpoint.desc'),
+ placeholder: 'http://127.0.0.1:11434',
+ title: t('ollama.endpoint.title'),
+ },
+ title: ,
+ };
+};
diff --git a/src/app/(main)/settings/llm/ProviderList/OpenAI/index.tsx b/src/app/(main)/settings/llm/ProviderList/OpenAI/index.tsx
new file mode 100644
index 000000000000..8e0b88a5ba67
--- /dev/null
+++ b/src/app/(main)/settings/llm/ProviderList/OpenAI/index.tsx
@@ -0,0 +1,20 @@
+'use client';
+
+import { OpenAI } from '@lobehub/icons';
+
+import { OpenAIProviderCard } from '@/config/modelProviders';
+import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
+
+import { ProviderItem } from '../../type';
+
+export const useOpenAIProvider = (): ProviderItem => {
+ const { showOpenAIProxyUrl, showOpenAIApiKey } = useServerConfigStore(featureFlagsSelectors);
+ return {
+ ...OpenAIProviderCard,
+ proxyUrl: showOpenAIProxyUrl && {
+ placeholder: 'https://api.openai.com/v1',
+ },
+ showApiKey: showOpenAIApiKey,
+ title: ,
+ };
+};
diff --git a/src/app/(main)/settings/llm/ProviderList/providers.tsx b/src/app/(main)/settings/llm/ProviderList/providers.tsx
new file mode 100644
index 000000000000..39258bb13964
--- /dev/null
+++ b/src/app/(main)/settings/llm/ProviderList/providers.tsx
@@ -0,0 +1,176 @@
+import {
+ Anthropic,
+ Claude,
+ DeepSeek,
+ Gemini,
+ Google,
+ Groq,
+ Minimax,
+ Mistral,
+ Moonshot,
+ OpenRouter,
+ Perplexity,
+ Stepfun,
+ Together,
+ Tongyi,
+ ZeroOne,
+ Zhipu,
+} from '@lobehub/icons';
+import { Divider } from 'antd';
+import { useTheme } from 'antd-style';
+import { useMemo } from 'react';
+import { Flexbox } from 'react-layout-kit';
+import urlJoin from 'url-join';
+
+import {
+ AnthropicProviderCard,
+ DeepSeekProviderCard,
+ GoogleProviderCard,
+ GroqProviderCard,
+ MinimaxProviderCard,
+ MistralProviderCard,
+ MoonshotProviderCard,
+ OpenRouterProviderCard,
+ PerplexityProviderCard,
+ QwenProviderCard,
+ StepfunProviderCard,
+ TogetherAIProviderCard,
+ ZeroOneProviderCard,
+ ZhiPuProviderCard,
+} from '@/config/modelProviders';
+
+import { ProviderItem } from '../type';
+import { useAzureProvider } from './Azure';
+import { useBedrockProvider } from './Bedrock';
+import { useOllamaProvider } from './Ollama';
+import { useOpenAIProvider } from './OpenAI';
+
+const BASE_DOC_URL = 'https://lobehub.com/docs/usage/providers';
+
+const AnthropicBrand = () => {
+ const { isDarkMode } = useTheme();
+ return ;
+};
+
+const MoonshotBrand = () => {
+ const theme = useTheme();
+ return (
+
+ );
+};
+
+const GroqBrand = () => {
+ const theme = useTheme();
+
+ return ;
+};
+
+const GoogleBrand = () => (
+
+
+
+
+
+);
+
+export const useProviderList = (): ProviderItem[] => {
+ const azureProvider = useAzureProvider();
+ const ollamaProvider = useOllamaProvider();
+ const openAIProvider = useOpenAIProvider();
+ const bedrockProvider = useBedrockProvider();
+
+ return useMemo(
+ () => [
+ {
+ ...openAIProvider,
+ docUrl: urlJoin(BASE_DOC_URL, 'openai'),
+ },
+ {
+ ...ollamaProvider,
+ docUrl: urlJoin(BASE_DOC_URL, 'ollama'),
+ },
+ {
+ ...azureProvider,
+ docUrl: urlJoin(BASE_DOC_URL, 'azure'),
+ },
+ {
+ ...GoogleProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'gemini'),
+ title: ,
+ },
+ {
+ ...AnthropicProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'anthropic'),
+ title: ,
+ },
+ {
+ ...bedrockProvider,
+ docUrl: urlJoin(BASE_DOC_URL, 'bedrock'),
+ },
+ {
+ ...GroqProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'groq'),
+ title: ,
+ },
+ {
+ ...OpenRouterProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'openrouter'),
+ title: ,
+ },
+ {
+ ...TogetherAIProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'togetherai'),
+ title: ,
+ },
+ {
+ ...QwenProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'qwen'),
+ title: ,
+ },
+ {
+ ...DeepSeekProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'deepseek'),
+ title: ,
+ },
+ {
+ ...MinimaxProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'minimax'),
+ title: ,
+ },
+ {
+ ...MistralProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'mistral'),
+ title: ,
+ },
+ {
+ ...MoonshotProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'moonshot'),
+ title: ,
+ },
+ {
+ ...PerplexityProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'perplexity'),
+ title: ,
+ },
+ {
+ ...ZhiPuProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'zhipu'),
+ title: ,
+ },
+ {
+ ...ZeroOneProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, '01ai'),
+ title: ,
+ },
+ {
+ ...StepfunProviderCard,
+ docUrl: urlJoin(BASE_DOC_URL, 'stepfun'),
+ title: ,
+ },
+ ],
+ [azureProvider, ollamaProvider, ollamaProvider, bedrockProvider],
+ );
+};
diff --git a/src/app/(main)/settings/llm/TogetherAI/index.tsx b/src/app/(main)/settings/llm/TogetherAI/index.tsx
deleted file mode 100644
index 44a77e3f6ee6..000000000000
--- a/src/app/(main)/settings/llm/TogetherAI/index.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-'use client';
-
-import { Together } from '@lobehub/icons';
-import { memo } from 'react';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const TogetherAIProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default TogetherAIProvider;
diff --git a/src/app/(main)/settings/llm/ZeroOne/index.tsx b/src/app/(main)/settings/llm/ZeroOne/index.tsx
deleted file mode 100644
index bfe825568553..000000000000
--- a/src/app/(main)/settings/llm/ZeroOne/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-
-import { ZeroOne } from '@lobehub/icons';
-import { memo } from 'react';
-
-import { ModelProvider } from '@/libs/agent-runtime';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const ZeroOneProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default ZeroOneProvider;
diff --git a/src/app/(main)/settings/llm/Zhipu/index.tsx b/src/app/(main)/settings/llm/Zhipu/index.tsx
deleted file mode 100644
index d80afbae4091..000000000000
--- a/src/app/(main)/settings/llm/Zhipu/index.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-'use client';
-
-import { Zhipu } from '@lobehub/icons';
-import { memo } from 'react';
-
-import ProviderConfig from '../components/ProviderConfig';
-
-const ZhipuProvider = memo(() => {
- return (
- }
- />
- );
-});
-
-export default ZhipuProvider;
diff --git a/src/app/(main)/settings/llm/components/Checker.tsx b/src/app/(main)/settings/llm/components/Checker.tsx
index 599b3a7a9cc7..ad8c205135cb 100644
--- a/src/app/(main)/settings/llm/components/Checker.tsx
+++ b/src/app/(main)/settings/llm/components/Checker.tsx
@@ -50,10 +50,19 @@ const Checker = memo(({ model, provider }) => {
const [error, setError] = useState();
const checkConnection = async () => {
- const data = await chatService.fetchPresetTaskResult({
+ let isError = false;
+
+ await chatService.fetchPresetTaskResult({
onError: (_, rawError) => {
setError(rawError);
setPass(false);
+ isError = true;
+ },
+ onFinish: async () => {
+ if (!isError) {
+ setError(undefined);
+ setPass(true);
+ }
},
onLoadingChange: (loading) => {
setLoading(loading);
@@ -74,11 +83,6 @@ const Checker = memo(({ model, provider }) => {
traceName: TraceNameMap.ConnectivityChecker,
},
});
-
- if (data) {
- setError(undefined);
- setPass(true);
- }
};
const isMobile = useIsMobile();
diff --git a/src/app/(main)/settings/llm/components/Footer.tsx b/src/app/(main)/settings/llm/components/Footer.tsx
index 00febb8e1707..9e7dbcf86f59 100644
--- a/src/app/(main)/settings/llm/components/Footer.tsx
+++ b/src/app/(main)/settings/llm/components/Footer.tsx
@@ -1,16 +1,25 @@
'use client';
-import { Divider } from 'antd';
+import { useTheme } from 'antd-style';
import Link from 'next/link';
import { memo } from 'react';
import { Trans } from 'react-i18next';
+import { Center } from 'react-layout-kit';
import { MORE_MODEL_PROVIDER_REQUEST_URL } from '@/const/url';
const Footer = memo(() => {
+ const theme = useTheme();
return (
-
-
+
+
更多模型正在
@@ -18,8 +27,8 @@ const Footer = memo(() => {
中 ,敬请期待 ✨
-
-
+
+
);
});
diff --git a/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx b/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx
index 88107c0a7564..21e1d5d03d23 100644
--- a/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx
+++ b/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx
@@ -1,15 +1,17 @@
'use client';
-import { Form, type FormItemProps, type ItemGroup } from '@lobehub/ui';
+import { Form, type FormItemProps, type ItemGroup, Tooltip } from '@lobehub/ui';
import { Input, Switch } from 'antd';
import { createStyles } from 'antd-style';
import { debounce } from 'lodash-es';
+import Link from 'next/link';
import { ReactNode, memo } from 'react';
import { useTranslation } from 'react-i18next';
-import { Flexbox } from 'react-layout-kit';
+import { Center, Flexbox } from 'react-layout-kit';
import { useSyncSettings } from '@/app/(main)/settings/hooks/useSyncSettings';
import {
+ KeyVaultsConfigKey,
LLMProviderApiTokenKey,
LLMProviderBaseUrlKey,
LLMProviderConfigKey,
@@ -17,13 +19,14 @@ import {
} from '@/app/(main)/settings/llm/const';
import { FORM_STYLE } from '@/const/layoutTokens';
import { useUserStore } from '@/store/user';
-import { modelConfigSelectors } from '@/store/user/selectors';
-import { GlobalLLMProviderKey } from '@/types/settings';
+import { keyVaultsConfigSelectors, modelConfigSelectors } from '@/store/user/selectors';
+import { ModelProviderCard } from '@/types/llm';
+import { GlobalLLMProviderKey } from '@/types/user/settings';
import Checker from '../Checker';
import ProviderModelListSelect from '../ProviderModelList';
-const useStyles = createStyles(({ css, prefixCls, responsive }) => ({
+const useStyles = createStyles(({ css, prefixCls, responsive, token }) => ({
form: css`
.${prefixCls}-form-item-control:has(.${prefixCls}-input,.${prefixCls}-select) {
flex: none;
@@ -38,6 +41,19 @@ const useStyles = createStyles(({ css, prefixCls, responsive }) => ({
font-size: 12px;
}
`,
+ help: css`
+ font-size: 12px;
+ font-weight: 500;
+ color: ${token.colorTextDescription};
+
+ background: ${token.colorFillTertiary};
+ border-radius: 50%;
+
+ &:hover {
+ color: ${token.colorText};
+ background: ${token.colorFill};
+ }
+ `,
safariIconWidthFix: css`
svg {
width: unset !important;
@@ -45,53 +61,57 @@ const useStyles = createStyles(({ css, prefixCls, responsive }) => ({
`,
}));
-interface ProviderConfigProps {
+export interface ProviderConfigProps extends Omit {
apiKeyItems?: FormItemProps[];
canDeactivate?: boolean;
- checkModel?: string;
checkerItem?: FormItemProps;
+ className?: string;
+ docUrl?: string;
+ hideSwitch?: boolean;
+ id: GlobalLLMProviderKey;
modelList?: {
azureDeployName?: boolean;
notFoundContent?: ReactNode;
placeholder?: string;
showModelFetcher?: boolean;
};
- provider: GlobalLLMProviderKey;
- showApiKey?: boolean;
- showBrowserRequest?: boolean;
- showEndpoint?: boolean;
title: ReactNode;
}
const ProviderConfig = memo(
({
apiKeyItems,
- provider,
- showEndpoint,
+ id,
+ proxyUrl,
showApiKey = true,
checkModel,
canDeactivate = true,
title,
checkerItem,
modelList,
- showBrowserRequest,
+ defaultShowBrowserRequest,
+ disableBrowserRequest,
+ className,
+ name,
+ docUrl,
}) => {
const { t } = useTranslation('setting');
- const { t: modelT } = useTranslation('modelProvider');
const [form] = Form.useForm();
- const { styles } = useStyles();
+ const { cx, styles } = useStyles();
const [
toggleProviderEnabled,
setSettings,
enabled,
isFetchOnClient,
isProviderEndpointNotEmpty,
+ isProviderApiKeyNotEmpty,
] = useUserStore((s) => [
s.toggleProviderEnabled,
s.setSettings,
- modelConfigSelectors.isProviderEnabled(provider)(s),
- modelConfigSelectors.isProviderFetchOnClient(provider)(s),
- modelConfigSelectors.isProviderEndpointNotEmpty(provider)(s),
+ modelConfigSelectors.isProviderEnabled(id)(s),
+ modelConfigSelectors.isProviderFetchOnClient(id)(s),
+ keyVaultsConfigSelectors.isProviderEndpointNotEmpty(id)(s),
+ keyVaultsConfigSelectors.isProviderApiKeyNotEmpty(id)(s),
]);
useSyncSettings(form);
@@ -103,72 +123,99 @@ const ProviderConfig = memo(
children: (
),
- desc: modelT(`${provider}.token.desc` as any),
- label: modelT(`${provider}.token.title` as any),
- name: [LLMProviderConfigKey, provider, LLMProviderApiTokenKey],
+ desc: t(`llm.apiKey.desc`, { name }),
+ label: t(`llm.apiKey.title`),
+ name: [KeyVaultsConfigKey, id, LLMProviderApiTokenKey],
},
];
+ const showEndpoint = !!proxyUrl;
const formItems = [
...apiKeyItem,
showEndpoint && {
- children: (
-
- ),
- desc: modelT(`${provider}.endpoint.desc` as any),
- label: modelT(`${provider}.endpoint.title` as any),
- name: [LLMProviderConfigKey, provider, LLMProviderBaseUrlKey],
- },
- (showBrowserRequest || (showEndpoint && isProviderEndpointNotEmpty)) && {
- children: (
- {
- setSettings({ [LLMProviderConfigKey]: { [provider]: { fetchOnClient: enabled } } });
- }}
- value={isFetchOnClient}
- />
- ),
- desc: t('llm.fetchOnClient.desc'),
- label: t('llm.fetchOnClient.title'),
- minWidth: undefined,
+ children: ,
+ desc: proxyUrl?.desc || t('llm.proxyUrl.desc'),
+ label: proxyUrl?.title || t('llm.proxyUrl.title'),
+ name: [KeyVaultsConfigKey, id, LLMProviderBaseUrlKey],
},
+ /*
+ * Conditions to show Client Fetch Switch
+ * 1. provider is not disabled browser request
+ * 2. provider show browser request by default
+ * 3. Provider allow to edit endpoint and the value of endpoint is not empty
+ * 4. There is an apikey provided by user
+ */
+ !disableBrowserRequest &&
+ (defaultShowBrowserRequest ||
+ (showEndpoint && isProviderEndpointNotEmpty) ||
+ (showApiKey && isProviderApiKeyNotEmpty)) && {
+ children: (
+ {
+ setSettings({ [LLMProviderConfigKey]: { [id]: { fetchOnClient: enabled } } });
+ }}
+ value={isFetchOnClient}
+ />
+ ),
+ desc: t('llm.fetchOnClient.desc'),
+ label: t('llm.fetchOnClient.title'),
+ minWidth: undefined,
+ },
{
children: (
),
desc: t('llm.modelList.desc'),
label: t('llm.modelList.title'),
- name: [LLMProviderConfigKey, provider, LLMProviderModelListKey],
+ name: [LLMProviderConfigKey, id, LLMProviderModelListKey],
},
checkerItem ?? {
- children: ,
+ children: ,
desc: t('llm.checker.desc'),
label: t('llm.checker.title'),
minWidth: undefined,
},
].filter(Boolean) as FormItemProps[];
+ /* ↓ cloud slot ↓ */
+
+ /* ↑ cloud slot ↑ */
+
const model: ItemGroup = {
children: formItems,
defaultActive: canDeactivate ? enabled : undefined,
- extra: canDeactivate ? (
- {
- toggleProviderEnabled(provider, enabled);
- }}
- value={enabled}
- />
- ) : undefined,
+
+ extra: (
+
+ {docUrl && (
+
+ e.stopPropagation()} target={'_blank'}>
+
+ ?
+
+
+
+ )}
+ {canDeactivate ? (
+ {
+ toggleProviderEnabled(id, enabled);
+ }}
+ value={enabled}
+ />
+ ) : undefined}
+
+ ),
title: (
(
return (