Compare commits

...

27 Commits

Author SHA1 Message Date
semantic-release-bot fdad557049 🔖 chore(release): v0.85.3 [skip ci]
### [Version 0.85.3](https://github.com/lobehub/lobe-chat/compare/v0.85.2...v0.85.3)
<sup>Released on **2023-10-10**</sup>

#### 💄 Styles

- **misc**: Add new components, modify display properties, and update settings feature, Replace 100vh with 100% to fix mobile scroll problem.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Styles

* **misc**: Add new components, modify display properties, and update settings feature ([87a4a46](https://github.com/lobehub/lobe-chat/commit/87a4a46))
* **misc**: Replace 100vh with 100% to fix mobile scroll problem ([2ef3c94](https://github.com/lobehub/lobe-chat/commit/2ef3c94))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
2023-10-10 17:23:02 +00:00
canisminor1990 2ef3c947fa 💄 style: Replace 100vh with 100% to fix mobile scroll problem 2023-10-11 01:19:19 +08:00
canisminor1990 87a4a469dc 💄 style: Add new components, modify display properties, and update settings feature
This commit introduces new components, modifies display properties, and updates the settings feature. It also includes changes to translations and styling. Additionally, a condition is added to check if the app is a progressive web app before rendering a specific component.
2023-10-11 00:58:11 +08:00
canisminor1990 bdb866c702 🔧 chore: Fix i18n diff and workflow token 2023-10-11 00:07:50 +08:00
semantic-release-bot 7513abbdbc 🔖 chore(release): v0.85.2 [skip ci]
### [Version&nbsp;0.85.2](https://github.com/lobehub/lobe-chat/compare/v0.85.1...v0.85.2)
<sup>Released on **2023-10-10**</sup>

#### 🐛 Bug Fixes

- **misc**: Add apikey form when there is no default api key in env.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### What's fixed

* **misc**: Add apikey form when there is no default api key in env, closes [#290](https://github.com/lobehub/lobe-chat/issues/290) ([2c907e9](https://github.com/lobehub/lobe-chat/commit/2c907e9))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
2023-10-10 15:17:29 +00:00
Arvin Xu 2c907e9bf1 🐛 fix: add apikey form when there is no default api key in env (#290)
* 🐛 fix: add apikey form when there is no default api key in env

* 🌐 style: update i18n
2023-10-10 23:15:58 +08:00
semantic-release-bot e9b80d0d42 🔖 chore(release): v0.85.1 [skip ci]
### [Version&nbsp;0.85.1](https://github.com/lobehub/lobe-chat/compare/v0.85.0...v0.85.1)
<sup>Released on **2023-10-10**</sup>

#### 🐛 Bug Fixes

- **misc**: Fix mobile safearea (fix.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### What's fixed

* **misc**: Fix mobile safearea (fix, closes [#211](https://github.com/lobehub/lobe-chat/issues/211) ([68775b8](https://github.com/lobehub/lobe-chat/commit/68775b8))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
2023-10-10 14:58:31 +00:00
canisminor1990 68775b8376 🐛 fix: Fix mobile safearea (fix #211) 2023-10-10 22:56:38 +08:00
CanisMinor caf8ba0272 ⚒️ chore: Update sync.yml [skip ci] 2023-10-10 22:35:59 +08:00
semantic-release-bot af2f5e6912 🔖 chore(release): v0.85.0 [skip ci]
## [Version&nbsp;0.85.0](https://github.com/lobehub/lobe-chat/compare/v0.84.0...v0.85.0)
<sup>Released on **2023-10-10**</sup>

####  Features

- **misc**: Add ja_JP, ko_KR and update workflow.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### What's improved

* **misc**: Add ja_JP, ko_KR and update workflow ([57512a0](https://github.com/lobehub/lobe-chat/commit/57512a0))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
2023-10-10 14:24:17 +00:00
canisminor1990 57512a0745 feat: Add ja_JP, ko_KR and update workflow 2023-10-10 22:21:28 +08:00
CanisMinor aec0674c63 Merge pull request #288 from lobehub/renovate/actions-checkout-4.x
Update actions/checkout action to v4
2023-10-10 14:44:55 +08:00
renovate[bot] a562d88059 Update actions/checkout action to v4 2023-10-10 06:44:27 +00:00
semantic-release-bot 79157d54f8 🔖 chore(release): v0.84.0 [skip ci]
## [Version&nbsp;0.84.0](https://github.com/lobehub/lobe-chat/compare/v0.83.10...v0.84.0)
<sup>Released on **2023-10-10**</sup>

####  Features

- **misc**: Support detect new version and upgrade action.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### What's improved

* **misc**: Support detect new version and upgrade action, closes [#282](https://github.com/lobehub/lobe-chat/issues/282) ([5da19b2](https://github.com/lobehub/lobe-chat/commit/5da19b2))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
2023-10-10 02:19:09 +00:00
Arvin Xu 5da19b242a feat: support detect new version and upgrade action (#282) 2023-10-10 10:17:24 +08:00
Arvin Xu fa06c3f760 📝 docs: Update README.md [skip ci] 2023-10-10 10:11:20 +08:00
Arvin Xu e521083a2b 🔧 chore: update lighthouse-badger-advanced.yml 2023-10-10 09:55:34 +08:00
CanisMinor 8e43388655 🔧 chore: Update sync.yml [skip ci] 2023-10-10 09:34:06 +08:00
CanisMinor 0825c2e401 🔧 chore: Update sync.yml [skip ci] 2023-10-10 09:29:09 +08:00
canisminor1990 0e07d18826 📝 docs: Update docs 2023-10-10 02:17:55 +08:00
canisminor1990 f7d1c4f089 📝 docs: Add lighthouse report 2023-10-10 02:15:30 +08:00
CanisMinor 6335100f37 ⚒️ chore: Create lighthouse-badger-advanced.yml 2023-10-10 01:36:44 +08:00
CanisMinor aae9a7cf28 Delete docs/lighthouse directory 2023-10-10 01:33:08 +08:00
lobehubbot 023484027f 🤖 chore: Lighthouse Results | Welcome 2023-10-09 17:22:49 +00:00
lobehubbot 5919b19633 🤖 chore: Lighthouse Results | Chat 2023-10-09 17:22:31 +00:00
lobehubbot d6b1ee85be 🤖 chore: Lighthouse Results | Market 2023-10-09 17:22:27 +00:00
lobehubbot ee9a404f2a 🤖 chore: Lighthouse Results | Settings 2023-10-09 17:22:19 +00:00
106 changed files with 1945 additions and 240 deletions
@@ -18,5 +18,6 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'check-inactive'
token: ${{ secrets.GH_TOKEN }}
inactive-label: 'Inactive'
inactive-day: 30
@@ -18,6 +18,7 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issues'
token: ${{ secrets.GH_TOKEN }}
labels: '✅ Fixed'
inactive-day: 3
body: |
@@ -28,6 +29,7 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issues'
token: ${{ secrets.GH_TOKEN }}
labels: '🤔 Need Reproduce'
inactive-day: 3
body: |
@@ -38,6 +40,7 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issues'
token: ${{ secrets.GH_TOKEN }}
labels: "🙅🏻‍♀️ WON'T DO"
inactive-day: 3
body: |
@@ -21,5 +21,6 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'remove-labels'
token: ${{ secrets.GH_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'Inactive'
@@ -0,0 +1,74 @@
name: Lighthouse Badger
env:
TOKEN_NAME: 'GH_TOKEN'
REPO_BRANCH: 'lobehub/lobe-chat lighthouse'
USER_NAME: 'lobehubbot'
USER_EMAIL: 'i@lobehub.com'
AUDIT_TYPE: 'both'
MOBILE_LIGHTHOUSE_PARAMS: '--throttling.cpuSlowdownMultiplier=2'
DESKTOP_LIGHTHOUSE_PARAMS: '--preset=desktop --throttling.cpuSlowdownMultiplier=1'
COMMIT_MESSAGE: '🤖 chore: Lighthouse Results Refreshed'
on:
schedule:
- cron: '0 0 * * *' # every day
workflow_dispatch:
jobs:
lighthouse-badger-advanced:
name: ${{ matrix.NAME }}
runs-on: ubuntu-22.04
timeout-minutes: 8
strategy:
fail-fast: false
matrix:
include:
- NAME: 'LobeChat | Welcome'
URLS: 'https://chat-preview.lobehub.com/welcome'
BADGES_ARGS: '-b pagespeed -o lighthouse/welcome -r'
COMMIT_MESSAGE: '🤖 chore: Lighthouse Results | Welcome'
- NAME: 'LobeChat | Chat'
URLS: 'https://chat-preview.lobehub.com/chat'
BADGES_ARGS: '-b pagespeed -o lighthouse/chat -r'
COMMIT_MESSAGE: '🤖 chore: Lighthouse Results | Chat'
- NAME: 'LobeChat | Market'
URLS: 'https://chat-preview.lobehub.com/market'
BADGES_ARGS: '-b pagespeed -o lighthouse/market -r'
COMMIT_MESSAGE: '🤖 chore: Lighthouse Results | Market'
- NAME: 'LobeChat | Settings'
URLS: 'https://chat-preview.lobehub.com/settings'
BADGES_ARGS: '-b pagespeed -o lighthouse/settings -r'
COMMIT_MESSAGE: '🤖 chore: Lighthouse Results | Settings'
####################################################################
# THAT'S IT; YOU DON'T HAVE TO DEFINE ANYTHING IN THE FOLLOWING
####################################################################
steps:
- name: Preparatory Tasks
run: |
REPOSITORY=`expr "${{ env.REPO_BRANCH }}" : "\([^ ]*\)"`
BRANCH=`expr "${{ env.REPO_BRANCH }}" : ".* \([^ ]*\)"`
echo "REPOSITORY=$REPOSITORY" >> $GITHUB_ENV
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
env:
REPO_BRANCH: ${{ matrix.REPO_BRANCH || env.REPO_BRANCH }}
- uses: actions/checkout@v4
with:
repository: ${{ env.REPOSITORY }}
token: ${{ secrets[matrix.TOKEN_NAME] || secrets[env.TOKEN_NAME] }}
ref: ${{ env.BRANCH }}
- uses: actions/checkout@v4
with:
repository: 'myactionway/lighthouse-badges'
path: temp_lighthouse_badges_nested
- uses: myactionway/lighthouse-badger-action@v2.2
with:
urls: ${{ matrix.URLS }}
badges_args: ${{ matrix.BADGES_ARGS }}
audit_type: ${{ matrix.AUDIT_TYPE || env.AUDIT_TYPE }}
mobile_lighthouse_params: ${{ matrix.MOBILE_LIGHTHOUSE_PARAMS || env.MOBILE_LIGHTHOUSE_PARAMS }}
desktop_lighthouse_params: ${{ matrix.DESKTOP_LIGHTHOUSE_PARAMS || env.DESKTOP_LIGHTHOUSE_PARAMS }}
user_name: ${{ matrix.USER_NAME || env.USER_NAME }}
user_email: ${{ matrix.USER_EMAIL || env.USER_EMAIL }}
commit_message: ${{ matrix.COMMIT_MESSAGE || env.COMMIT_MESSAGE }}
max_push_attempts: 5
+23
View File
@@ -0,0 +1,23 @@
name: PR Welcome
on:
pull_request:
types:
- closed
jobs:
if_merged:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions-cool/pr-welcome@main
with:
token: ${{ secrets.GITHUB_TOKEN }}
comment: |
🎉 Great PR @${{ github.event.pull_request.user.login }} 🎉
The growth of project is inseparable from user feedback and contribution, thanks for your contribution ❤️
项目的成长离不开用户反馈和贡献,感谢您的贡献 ❤️
emoji: 'hooray'
pr-emoji: '+1, heart'
+13 -2
View File
@@ -2,6 +2,8 @@ name: Upstream Sync
permissions:
contents: write
issues: write
actions: write
on:
schedule:
@@ -38,6 +40,15 @@ jobs:
uses: actions-cool/issues-helper@v3
with:
actions: 'create-issue'
token: ${{ secrets.GITHUB_TOKEN }}
title: '🚨 同步失败 | Sync Fail'
body: '由于 [LobeChat][lobechat] 上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次,请查看[详细教程][tutorial-zh-CN]\n---\nDue to a change in the workflow file of the [LobeChat][lobechat] upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. Please refer to the detailed [Tutorial][tutorial-en-US] for instructions.\n\n[lobechat]: https://github.com/lobehub/lobe-chat\n[tutorial-zh-CN]: https://github.com/lobehub/lobe-chat/wiki/Upstream-Sync.zh-CN\n[tutorial-en-US]: https://github.com/lobehub/lobe-chat/wiki/Upstream-Sync.zh-CN'
labels: '🚨 Sync Fail'
body: |
Due to a change in the workflow file of the [LobeChat][lobechat] upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. Please refer to the detailed [Tutorial][tutorial-en-US] for instructions.
由于 [LobeChat][lobechat] 上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次,请查看 [详细教程][tutorial-zh-CN]
![](https://github-production-user-asset-6210df.s3.amazonaws.com/17870709/273954625-df80c890-0822-4ac2-95e6-c990785cbed5.png)
[lobechat]: https://github.com/lobehub/lobe-chat
[tutorial-zh-CN]: https://github.com/lobehub/lobe-chat/wiki/Upstream-Sync.zh-CN
[tutorial-en-US]: https://github.com/lobehub/lobe-chat/wiki/Upstream-Sync
+1 -2
View File
@@ -6,8 +6,7 @@ module.exports = defineConfig({
entry: 'locales/zh_CN',
entryLocale: 'zh_CN',
output: 'locales',
outputLocales: ['zh_TW', 'en_US', 'ru_RU'],
splitToken: 2500,
outputLocales: ['zh_TW', 'en_US', 'ru_RU', 'ja_JP', 'ko_KR'],
temperature: 0,
modelName: 'gpt-3.5-turbo',
});
+126
View File
@@ -2,6 +2,132 @@
# Changelog
### [Version 0.85.3](https://github.com/lobehub/lobe-chat/compare/v0.85.2...v0.85.3)
<sup>Released on **2023-10-10**</sup>
#### 💄 Styles
- **misc**: Add new components, modify display properties, and update settings feature, Replace 100vh with 100% to fix mobile scroll problem.
<br/>
<details>
<summary><kbd>Improvements and Fixes</kbd></summary>
#### Styles
- **misc**: Add new components, modify display properties, and update settings feature ([87a4a46](https://github.com/lobehub/lobe-chat/commit/87a4a46))
- **misc**: Replace 100vh with 100% to fix mobile scroll problem ([2ef3c94](https://github.com/lobehub/lobe-chat/commit/2ef3c94))
</details>
<div align="right">
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
</div>
### [Version 0.85.2](https://github.com/lobehub/lobe-chat/compare/v0.85.1...v0.85.2)
<sup>Released on **2023-10-10**</sup>
#### 🐛 Bug Fixes
- **misc**: Add apikey form when there is no default api key in env.
<br/>
<details>
<summary><kbd>Improvements and Fixes</kbd></summary>
#### What's fixed
- **misc**: Add apikey form when there is no default api key in env, closes [#290](https://github.com/lobehub/lobe-chat/issues/290) ([2c907e9](https://github.com/lobehub/lobe-chat/commit/2c907e9))
</details>
<div align="right">
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
</div>
### [Version 0.85.1](https://github.com/lobehub/lobe-chat/compare/v0.85.0...v0.85.1)
<sup>Released on **2023-10-10**</sup>
#### 🐛 Bug Fixes
- **misc**: Fix mobile safearea (fix.
<br/>
<details>
<summary><kbd>Improvements and Fixes</kbd></summary>
#### What's fixed
- **misc**: Fix mobile safearea (fix, closes [#211](https://github.com/lobehub/lobe-chat/issues/211) ([68775b8](https://github.com/lobehub/lobe-chat/commit/68775b8))
</details>
<div align="right">
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
</div>
## [Version 0.85.0](https://github.com/lobehub/lobe-chat/compare/v0.84.0...v0.85.0)
<sup>Released on **2023-10-10**</sup>
#### ✨ Features
- **misc**: Add ja_JP, ko_KR and update workflow.
<br/>
<details>
<summary><kbd>Improvements and Fixes</kbd></summary>
#### What's improved
- **misc**: Add ja_JP, ko_KR and update workflow ([57512a0](https://github.com/lobehub/lobe-chat/commit/57512a0))
</details>
<div align="right">
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
</div>
## [Version 0.84.0](https://github.com/lobehub/lobe-chat/compare/v0.83.10...v0.84.0)
<sup>Released on **2023-10-10**</sup>
#### ✨ Features
- **misc**: Support detect new version and upgrade action.
<br/>
<details>
<summary><kbd>Improvements and Fixes</kbd></summary>
#### What's improved
- **misc**: Support detect new version and upgrade action, closes [#282](https://github.com/lobehub/lobe-chat/issues/282) ([5da19b2](https://github.com/lobehub/lobe-chat/commit/5da19b2))
</details>
<div align="right">
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
</div>
### [Version 0.83.10](https://github.com/lobehub/lobe-chat/compare/v0.83.9...v0.83.10)
<sup>Released on **2023-10-09**</sup>
+21
View File
@@ -46,6 +46,7 @@ LobeChat is a open-source, extensible ([Function Calling][fc-link]), high-perfor
- [👋🏻 Getting Started & Join Our Community](#-getting-started--join-our-community)
- [✨ Features](#-features)
- [📸 Snapshot](#-snapshot)
- [⚡️ Performance](#-performance)
- [🛳 Self Hosting](#-self-hosting)
- [Keep Updated](#keep-updated)
- [📦 Ecosystem](#-ecosystem)
@@ -154,6 +155,22 @@ We have carried out a series of optimization designs for mobile devices to enhan
</div>
## ⚡️ Performance
> **Note**\
> The complete list of reports can be found in the [📘 Lighthouse Reports](https://github.com/lobehub/lobe-chat/wiki/Lighthouse)
| Desktop | Mobile |
| :-----------------------------------------: | :----------------------------------------: |
| ![][chat-desktop] | ![][chat-mobile] |
| [📑 Lighthouse Report][chat-desktop-report] | [📑 Lighthouse Report][chat-mobile-report] |
<div align="right">
[![][back-to-top]](#readme-top)
</div>
## 🛳 Self Hosting
LobeChat provides a [self-hosted version][deploy-link] with Vercel. This allows you to build your own chatbot within a few minutes, without any prior knowledge. If you want to deploy this service yourself, you can follow these steps:
@@ -297,6 +314,10 @@ This project is [MIT](./LICENSE) licensed.
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
[bun-link]: https://bun.sh
[bun-shield]: https://img.shields.io/badge/-speedup%20with%20bun-black?logo=bun&style=for-the-badge
[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
[chat-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/mobile/chat_preview_lobehub_com_chat.html
[chat-plugin-realtime-weather]: https://github.com/lobehub/chat-plugin-realtime-weather
[chat-plugin-sdk]: https://github.com/lobehub/chat-plugin-sdk
[chat-plugin-search-engine]: https://github.com/lobehub/chat-plugin-search-engine
+21
View File
@@ -46,6 +46,7 @@ LobeChat 是一个开源的、可扩展的([Function Calling][fc-link])高
- [👋🏻 开始使用 & 交流](#-开始使用--交流)
- [✨ 功能特性](#-功能特性)
- [📸 快照预览](#-快照预览)
- [⚡️ 性能测试](#-性能测试)
- [🛳 开箱即用](#-开箱即用)
- [保持更新](#保持更新)
- [📦 生态系统](#-生态系统)
@@ -156,6 +157,22 @@ LobeChat 提供了两种独特的主题模式 - 明亮模式和暗黑模式,
</div>
## ⚡️ 性能测试
> **Note**\
> 完整测试报告可见 [📘 Lighthouse 性能测试](https://github.com/lobehub/lobe-chat/wiki/Lighthouse.zh-CN)
| Desktop | Mobile |
| :-------------------------------------------: | :------------------------------------------: |
| ![][chat-desktop] | ![][chat-mobile] |
| [📑 Lighthouse 测试报告][chat-desktop-report] | [📑 Lighthouse 测试报告][chat-mobile-report] |
<div align="right">
[![][back-to-top]](#readme-top)
</div>
## 🛳 开箱即用
LobeChat 提供了 Vercel 的 [自托管版本][deploy-link]。这使你可以在几分钟内构建自己的聊天机器人,无需任何基础知识。如果想自己部署该服务,可以按照以下步骤进行操作:
@@ -299,6 +316,10 @@ This project is [MIT](./LICENSE) licensed.
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
[bun-link]: https://bun.sh
[bun-shield]: https://img.shields.io/badge/-speedup%20with%20bun-black?logo=bun&style=for-the-badge
[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_lobehub_com_chat.html
[chat-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/mobile/pagespeed.svg
[chat-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/mobile/chat_lobehub_com_chat.html
[chat-plugin-realtime-weather]: https://github.com/lobehub/chat-plugin-realtime-weather
[chat-plugin-sdk]: https://github.com/lobehub/chat-plugin-sdk
[chat-plugin-search-engine]: https://github.com/lobehub/chat-plugin-search-engine
+1
View File
@@ -17,6 +17,7 @@ LobeChat is a open-source, extensible ([Function Calling][fc-url]), high-perform
- [Environment Variables](Environment-Variable) | [环境变量](Environment-Variable.zh-CN)
- [Maintaining Updates with LobeChat Self-Deployment](Upstream-Sync) | [自部署保持更新](Upstream-Sync.zh-CN)
- [Deploying with Azure OpenAI](Deploy-with-Azure-OpenAI) | [使用 Azure OpenAI 部署](Deploy-with-Azure-OpenAI.zh-CN)
- [Lighthouse Report](Lighthouse) | [性能测试](Lighthouse.zh-CN)
---
+65
View File
@@ -0,0 +1,65 @@
# Lighthouse Reports
#### TOC
- [Welcome Page](#welcome-page)
- [Chat Page](#chat-page)
- [Market Page](#market-page)
- [Settings Page](#settings-page)
## Welcome Page
> **Info**\
> <https://chat-preview.lobehub.com/welcome>
| Desktop | Mobile |
| :---------------------------------------------: | :--------------------------------------------: |
| ![][welcome-desktop] | ![][welcome-mobile] |
| [⚡️ Lighthouse Report][welcome-desktop-report] | [⚡️ Lighthouse Report][welcome-mobile-report] |
## Chat Page
> **Info**\
> <https://chat-preview.lobehub.com/chat>
| Desktop | Mobile |
| :------------------------------------------: | :-----------------------------------------: |
| ![][chat-desktop] | ![][chat-mobile] |
| [⚡️ Lighthouse Report][chat-desktop-report] | [⚡️ Lighthouse Report][chat-mobile-report] |
## Market Page
> **Info**\
> <https://chat-preview.lobehub.com/market>
| Desktop | Mobile |
| :--------------------------------------------: | :-------------------------------------------: |
| ![][market-desktop] | ![][market-mobile] |
| [⚡️ Lighthouse Report][market-desktop-report] | [⚡️ Lighthouse Report][market-mobile-report] |
## Settings Page
> **Info**\
> <https://chat-preview.lobehub.com/settings>
| Desktop | Mobile |
| :----------------------------------------------: | :---------------------------------------------: |
| ![][settings-desktop] | ![][settings-mobile] |
| [⚡️ Lighthouse Report][settings-desktop-report] | [⚡️ Lighthouse Report][settings-mobile-report] |
[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_lobehub_com_chat.html
[chat-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/mobile/pagespeed.svg
[chat-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/mobile/chat_lobehub_com_chat.html
[market-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/market/desktop/pagespeed.svg
[market-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/market/desktop/chat_lobehub_com_market.html
[market-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/market/mobile/pagespeed.svg
[market-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/market/mobile/chat_lobehub_com_market.html
[settings-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/settings/desktop/pagespeed.svg
[settings-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/settings/desktop/chat_lobehub_com_settings.html
[settings-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/settings/mobile/pagespeed.svg
[settings-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/settings/mobile/chat_lobehub_com_settings.html
[welcome-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/welcome/desktop/pagespeed.svg
[welcome-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/welcome/desktop/chat_lobehub_com_welcome.html
[welcome-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/welcome/mobile/pagespeed.svg
[welcome-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/welcome/mobile/chat_lobehub_com_welcome.html
+65
View File
@@ -0,0 +1,65 @@
# Lighthouse 测试报告
#### TOC
- [Welcome 欢迎页面](#welcome-欢迎页面)
- [Chat 聊天页面](#chat-聊天页面)
- [Market 市场页面](#market-市场页面)
- [Settings 设置页面](#settings-设置页面)
## Welcome 欢迎页面
> **Info**\
> <https://chat-preview.lobehub.com/welcome>
| Desktop | Mobile |
| :---------------------------------------------: | :--------------------------------------------: |
| ![][welcome-desktop] | ![][welcome-mobile] |
| [⚡️ Lighthouse Report][welcome-desktop-report] | [⚡️ Lighthouse Report][welcome-mobile-report] |
## Chat 聊天页面
> **Info**\
> <https://chat-preview.lobehub.com/chat>
| Desktop | Mobile |
| :------------------------------------------: | :-----------------------------------------: |
| ![][chat-desktop] | ![][chat-mobile] |
| [⚡️ Lighthouse Report][chat-desktop-report] | [⚡️ Lighthouse Report][chat-mobile-report] |
## Market 市场页面
> **Info**\
> <https://chat-preview.lobehub.com/market>
| Desktop | Mobile |
| :--------------------------------------------: | :-------------------------------------------: |
| ![][market-desktop] | ![][market-mobile] |
| [⚡️ Lighthouse Report][market-desktop-report] | [⚡️ Lighthouse Report][market-mobile-report] |
## Settings 设置页面
> **Info**\
> <https://chat-preview.lobehub.com/settings>
| Desktop | Mobile |
| :----------------------------------------------: | :---------------------------------------------: |
| ![][settings-desktop] | ![][settings-mobile] |
| [⚡️ Lighthouse Report][settings-desktop-report] | [⚡️ Lighthouse Report][settings-mobile-report] |
[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_lobehub_com_chat.html
[chat-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/chat/mobile/pagespeed.svg
[chat-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/chat/mobile/chat_lobehub_com_chat.html
[market-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/market/desktop/pagespeed.svg
[market-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/market/desktop/chat_lobehub_com_market.html
[market-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/market/mobile/pagespeed.svg
[market-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/market/mobile/chat_lobehub_com_market.html
[settings-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/settings/desktop/pagespeed.svg
[settings-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/settings/desktop/chat_lobehub_com_settings.html
[settings-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/settings/mobile/pagespeed.svg
[settings-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/settings/mobile/chat_lobehub_com_settings.html
[welcome-desktop]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/welcome/desktop/pagespeed.svg
[welcome-desktop-report]: https://lobehub.github.io/lobe-chat/lighthouse/welcome/desktop/chat_lobehub_com_welcome.html
[welcome-mobile]: https://raw.githubusercontent.com/lobehub/lobe-chat/lighthouse/lighthouse/welcome/mobile/pagespeed.svg
[welcome-mobile-report]: https://lobehub.github.io/lobe-chat/lighthouse/welcome/mobile/chat_lobehub_com_welcome.html
+1
View File
@@ -9,6 +9,7 @@
- [Environment Variables](Environment-Variable) | [中文](Environment-Variable.zh-CN)
- [Upstream Sync](Upstream-Sync) | [中文](Upstream-Sync.zh-CN)
- [Deploying with Azure OpenAI](Deploy-with-Azure-OpenAI) | [中文](Deploy-with-Azure-OpenAI.zh-CN)
- [Lighthouse Report](Lighthouse) | [中文](Lighthouse.zh-CN)
#### 🤖 Agents
+5
View File
@@ -94,5 +94,10 @@
},
"updateAgent": "Update Agent Information",
"updatePrompt": "Update Prompts",
"upgradeVersion": {
"action": "Upgrade Now",
"hasNew": "New Update Available",
"newVersion": "New version available: {{version}}"
},
"warp": "Line break"
}
+4 -3
View File
@@ -25,12 +25,13 @@
"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",
"PluginSettingsInvalid": "This plugin needs to be correctly configured before it can be used. Please check if your configuration 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"
"PluginServerError": "Plugin server request returned an error. Please check your plugin manifest file, plugin configuration, or server implementation based on the error information below",
"NoAPIKey": "OpenAI API Key is empty, please add a custom OpenAI API Key"
},
"unlock": {
"apikey": {
"description": "Enter your OpenAI API Key to bypass password verification. The application will not record your API Key.",
"title": "Use Custom API Key"
"title": "Use Custom API Key",
"description": "Enter your OpenAI API Key to start the conversation. The application will not record your API Key."
},
"confirm": "Confirm and Retry",
"password": {
+103
View File
@@ -0,0 +1,103 @@
{
"about": "について",
"advanceSettings": "詳細設定",
"agentDefaultMessage": "こんにちは、私は **{{name}}** です。すぐにチャットを始めることができますし、[エージェント設定](/chat/settings#session={{id}}) に移動して私の情報を完全にすることもできます。",
"agentDefaultMessageWithSystemRole": "こんにちは、私は **{{name}}** です。{{systemRole}}、さあ、チャットを始めましょう!",
"agentMaxToken": "セッションの最大トークン数",
"agentModel": "モデル",
"agentProfile": "エージェント情報",
"appInitializing": "LobeChat を起動しています。お待ちください...",
"archive": "アーカイブ",
"autoGenerate": "自動生成",
"autoGenerateTooltip": "ヒントワードに基づいてエージェントの説明を自動生成します",
"backToBottom": "最新メッセージを表示",
"cancel": "キャンセル",
"changelog": "更新履歴",
"clearCurrentMessages": "現在のセッションのメッセージをクリア",
"close": "閉じる",
"confirmClearCurrentMessages": "現在のセッションのメッセージをクリアします。クリア後は元に戻すことはできませんので、操作を確認してください",
"confirmRemoveSessionItemAlert": "このエージェントを削除します。削除後は元に戻すことはできませんので、操作を確認してください",
"copy": "コピー",
"copySuccess": "コピーが成功しました",
"defaultAgent": "デフォルトエージェント",
"defaultSession": "デフォルトセッション",
"delete": "削除",
"edit": "編集",
"export": "設定のエクスポート",
"exportType": {
"agent": "エージェント設定のエクスポート",
"agentWithMessage": "エージェントとメッセージのエクスポート",
"all": "グローバル設定とすべてのエージェントデータのエクスポート",
"allAgent": "すべてのエージェント設定のエクスポート",
"allAgentWithMessage": "すべてのエージェントとメッセージのエクスポート",
"globalSetting": "グローバル設定のエクスポート"
},
"feedback": "フィードバック",
"historyRange": "履歴範囲",
"import": "設定のインポート",
"inbox": {
"defaultMessage": "こんにちは、私はあなたのインテリジェントエージェントです。何でも質問してください、できる限りお答えします。より専門的でカスタマイズされたエージェントが必要な場合は、`+` をクリックしてカスタムエージェントを作成できます",
"desc": "ブレインクラスタを起動し、思考の火花を引き起こします。あなたのインテリジェントアシスタントとのすべてのコミュニケーションはここで行われます",
"title": "気軽にチャット"
},
"message": {
"function_loading": "プラグインリクエスト中..."
},
"moreSetting": "その他の設定...",
"newAgent": "新しいエージェント",
"noDescription": "説明はありません",
"ok": "OK",
"password": "パスワード",
"pin": "ピン留め",
"pinOff": "ピン留め解除",
"regenerate": "再生成",
"rename": "名前の変更",
"reset": "リセット",
"retry": "再試行",
"roleAndArchive": "役割とアーカイブ",
"searchAgentPlaceholder": "エージェントとチャットを検索...",
"send": "送信",
"sendPlaceholder": "チャット内容を入力...",
"sessionList": "エージェントリスト",
"setting": "設定",
"share": "共有",
"shareModal": {
"download": "ダウンロード",
"imageType": "画像形式",
"screenshot": "スクリーンショット",
"settings": "設定をエクスポート",
"shareToShareGPT": "ShareGPT共有リンクを生成",
"withBackground": "背景画像を含む",
"withFooter": "フッターを含む",
"withPluginInfo": "プラグイン情報を含む",
"withSystemRole": "アシスタントの役割設定を含む"
},
"stop": "停止",
"tab": {
"chat": "チャット",
"market": "発見",
"setting": "設定"
},
"temp": "一時的な",
"tokenDetail": "役割設定: {{systemRoleToken}} · チャット履歴: {{chatsToken}}",
"tokenTag": {
"overload": "制限を超える",
"remained": "残り",
"used": "使用済み"
},
"topic": {
"confirmRemoveTopic": "このトピックを削除しますか?削除後は元に戻せませんので、注意して操作してください。",
"defaultTitle": "デフォルトトピック",
"saveCurrentMessages": "現在のチャットをトピックとして保存",
"searchPlaceholder": "トピックを検索...",
"title": "トピック"
},
"updateAgent": "アシスタント情報を更新",
"updatePrompt": "プロンプトの更新",
"upgradeVersion": {
"action": "今すぐアップグレード",
"hasNew": "利用可能な更新があります",
"newVersion": "新しいバージョンが利用可能です:{{version}}"
},
"warp": "改行"
}
+6
View File
@@ -0,0 +1,6 @@
{
"topic": {
"desc": "左側のボタンをクリックして、現在の会話を履歴トピックとして保存し、新しい会話を開始します",
"title": "トピックリスト"
}
}
+43
View File
@@ -0,0 +1,43 @@
{
"pluginSettings": {
"desc": "以下の設定を完了すると、プラグインを使用することができます",
"title": "{{name}}プラグインの設定"
},
"response": {
"400": "申し訳ありませんが、サーバーはリクエストを理解できません。リクエストパラメータが正しいかどうか確認してください",
"401": "申し訳ありませんが、サーバーはリクエストを拒否しました。権限が不足しているか、有効な認証情報が提供されていない可能性があります",
"403": "申し訳ありませんが、サーバーはリクエストを拒否しました。このコンテンツにアクセスする権限がありません",
"404": "申し訳ありませんが、サーバーはリクエストしたページやリソースを見つけることができません。URLが正しいかどうか確認してください",
"405": "申し訳ありませんが、サーバーは使用されたリクエストメソッドをサポートしていません。リクエストメソッドが正しいかどうか確認してください",
"429": "申し訳ありませんが、リクエストが多すぎてサーバーが忙しいため、しばらくしてから再試行してください",
"500": "申し訳ありませんが、サーバーに一時的な問題が発生し、リクエストを完了できません。しばらくしてから再試行してください",
"502": "申し訳ありませんが、サーバーは一時的にサービスを提供できません。しばらくしてから再試行してください",
"503": "申し訳ありませんが、サーバーは現在、リクエストを処理できません。オーバーロードまたはメンテナンス中の可能性があります。しばらくしてから再試行してください",
"504": "申し訳ありませんが、サーバーは上位サーバーからの応答を待っていません。しばらくしてから再試行してください",
"PluginMarketIndexNotFound": "申し訳ありませんが、プラグインのインデックスが見つかりませんでした。インデックスのアドレスが正しいかどうか確認してください",
"PluginMetaNotFound": "申し訳ありませんが、インデックスでプラグインが見つかりませんでした。プラグインの設定情報をインデックスで確認してください",
"PluginMetaInvalid": "申し訳ありませんが、プラグインのメタ情報の検証に失敗しました。プラグインのメタ情報の形式が正しいかどうか確認してください",
"PluginApiParamsError": "申し訳ありませんが、プラグインのリクエストパラメータの検証に失敗しました。パラメータとAPIの説明が一致しているかどうか確認してください",
"PluginSettingsInvalid": "このプラグインを使用するには、正しい設定が必要です。設定が正しいかどうか確認してください",
"PluginServerError": "プラグインサーバーのリクエストエラーが発生しました。以下のエラーメッセージを参考に、プラグインのマニフェストファイル、設定、サーバー実装を確認してください",
"InvalidAccessCode": "パスワードが正しくないか空です。正しいアクセスパスワードを入力するか、カスタムのOpenAI APIキーを追加してください",
"OpenAIBizError": "OpenAIサービスのリクエストエラーが発生しました。以下の情報に基づいて問題を解決したり、再試行したりしてください",
"PluginMarketIndexInvalid": "申し訳ありませんが、プラグインのインデックスの検証に失敗しました。インデックスファイルの形式が正しいかどうかを確認してください",
"PluginManifestNotFound": "申し訳ありませんが、サーバーでプラグインのマニフェストファイル (manifest.json) が見つかりませんでした。プラグインのマニフェストファイルのアドレスが正しいかどうかを確認してください",
"PluginManifestInvalid": "申し訳ありませんが、このプラグインのマニフェストの検証に失敗しました。マニフェストの形式が正しいかどうかを確認してください",
"PluginApiNotFound": "申し訳ありませんが、プラグインのマニフェストに指定されたAPIが見つかりませんでした。リクエストメソッドとプラグインのマニフェストのAPIが一致しているかどうかを確認してください",
"NoAPIKey": "OpenAI APIキーが空です。カスタムOpenAI APIキーを追加してください。"
},
"unlock": {
"apikey": {
"title": "カスタムAPIキーの使用",
"description": "OpenAI APIキーを入力すると、会話を開始できます。アプリはあなたのAPIキーを記録しません。"
},
"closeMessage": "ヒントを閉じる",
"confirm": "確認して再試行",
"password": {
"description": "管理者によってアプリが暗号化されました。アプリをロック解除するには、アプリのパスワードを入力してください。パスワードは1回だけ入力すればよいです",
"title": "パスワードを入力してアプリをロック解除"
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"addAgent": "助手を追加する",
"search": {
"placeholder": "助手の名前、説明、またはキーワードを検索..."
},
"sidebar": {
"comment": "コメント",
"prompt": "プロンプト",
"title": "助手の詳細"
},
"submitAgent": "助手を提出する",
"title": {
"allAgents": "すべての助手",
"recentSubmits": "最近の追加"
}
}
+107
View File
@@ -0,0 +1,107 @@
{
"debug": {
"arguments": "引数",
"function_call": "関数呼び出し",
"response": "レスポンス"
},
"dev": {
"confirmDeleteDevPlugin": "このローカルプラグインを削除しますか?削除後は元に戻せません。",
"deleteSuccess": "プラグインが正常に削除されました",
"manifest": {
"identifier": {
"desc": "プラグインの一意の識別子",
"label": "識別子"
},
"mode": {
"local": "ビジュアル設定",
"local-tooltip": "ビジュアル設定は一時的にサポートされていません",
"url": "オンラインリンク"
},
"name": {
"desc": "プラグインのタイトル",
"label": "タイトル",
"placeholder": "検索エンジン"
}
},
"meta": {
"author": {
"desc": "プラグインの作者",
"label": "作者"
},
"avatar": {
"desc": "プラグインのアイコン、絵文字やURLを使用できます",
"label": "アイコン"
},
"description": {
"desc": "プラグインの説明",
"label": "説明",
"placeholder": "検索エンジンで情報を取得します"
},
"formFieldRequired": "このフィールドは必須です",
"homepage": {
"desc": "プラグインのホームページ",
"label": "ホームページ"
},
"identifier": {
"desc": "プラグインの一意の識別子、マニフェストから自動的に識別されます",
"errorDuplicate": "識別子が既存のプラグインと重複しています。識別子を変更してください",
"label": "識別子",
"pattenErrorMessage": "英数字、-、_ のみ入力できます"
},
"manifest": {
"desc": "LobeChatはこのリンクを使用してプラグインをインストールします",
"jsonInvalid": "マニフェストが規格に準拠していません。検証結果:\n\n{{error}}",
"label": "プラグインのマニフェストURL",
"preview": "マニフェストのプレビュー",
"refresh": "更新",
"requestError": "リンクのリクエストに失敗しました。有効なリンクを入力し、クロスオリジンリクエストが許可されているか確認してください",
"urlError": "このリンクはJSON形式のコンテンツを返していません。有効なリンクを入力してください"
},
"title": {
"desc": "プラグインのタイトル",
"label": "タイトル",
"placeholder": "検索エンジン"
}
},
"metaConfig": "プラグインのメタ情報の設定",
"modalDesc": "カスタムプラグインを追加すると、プラグインの開発検証やセッションで直接使用できます。プラグインの開発ドキュメントについては、参照してください",
"preview": {
"card": "プラグインのプレビュー表示",
"desc": "プラグインの説明のプレビュー",
"title": "プラグイン名のプレビュー"
},
"save": "保存",
"saveSuccess": "プラグインの設定が正常に保存されました",
"tabs": {
"manifest": "機能のマニフェスト",
"meta": "プラグインのメタ情報"
},
"title": "カスタムプラグインの追加",
"update": "更新",
"updateSuccess": "プラグインの設定が正常に更新されました"
},
"list": {
"item": {
"deprecated.title": "削除済み",
"local.config": "設定",
"local.title": "カスタム"
}
},
"loading": {
"content": "データの取得中...",
"plugin": "プラグインの実行中..."
},
"pluginList": "プラグインリスト",
"plugins": {
"unknown": "プラグインの検出中..."
},
"setting": "プラグインの設定",
"settings": {
"indexUrl": {
"title": "マーケットインデックス",
"tooltip": "オンライン編集は現在サポートされていません。デプロイ時の環境変数を使用して設定してください"
},
"modalDesc": "プラグインマーケットのアドレスを設定すると、カスタムのプラグインマーケットを使用できます",
"title": "プラグインマーケットの設定"
}
}
+225
View File
@@ -0,0 +1,225 @@
{
"danger": {
"clear": {
"action": "クリア",
"confirm": "すべてのチャットデータをクリアしますか?",
"desc": "すべてのセッションデータをクリアします",
"success": "すべてのセッションメッセージがクリアされました",
"title": "すべてのセッションメッセージをクリア"
},
"reset": {
"action": "リセット",
"confirm": "すべての設定をリセットしますか?",
"currentVersion": "現在のバージョン",
"desc": "すべての設定項目をデフォルト値にリセットします",
"title": "すべての設定をリセット"
}
},
"header": {
"global": "グローバル設定",
"session": "セッション設定",
"sessionWithName": "セッション設定 · {{name}}"
},
"llm": {
"AzureOpenAI": {
"endpoint": {
"desc": "Azureポータルでリソースを確認すると、この値は「キーとエンドポイント」セクションで見つけることができます",
"placeholder": "https://docs-test-001.openai.azure.com",
"title": "Azure APIアドレス"
},
"models": {
"desc": "サポートされているモデル",
"title": "モデルリスト"
},
"title": "Azure OpenAI設定",
"token": {
"desc": "Azureポータルでリソースを確認すると、この値は「キーとエンドポイント」セクションで見つけることができます。KEY1またはKEY2を使用できます",
"placeholder": "Azure APIキー",
"title": "APIキー"
}
},
"OpenAI": {
"azureApiVersion": {
"desc": "AzureのAPIバージョンは、YYYY-MM-DD形式に従います。[最新バージョン](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)を参照してください",
"fetch": "リストを取得",
"title": "Azure APIバージョン"
},
"check": {
"button": "チェック",
"desc": "APIキーとプロキシアドレスが正しく入力されているかをテストします",
"pass": "チェックに合格しました",
"title": "接続性のチェック"
},
"endpoint": {
"desc": "デフォルトのアドレス以外に、http(s)://を含める必要があります",
"placeholder": "https://api.openai.com/v1",
"title": "エンドポイントプロキシアドレス"
},
"models": {
"count": "{{count}}モデルがサポートされています",
"desc": "サポートされているモデル",
"fetch": "モデルリストを取得",
"notSupport": "Azure OpenAIではモデルリストの表示はサポートされていません",
"notSupportTip": "デプロイ名とモデル名が一致していることを確認する必要があります",
"refetch": "モデルリストを再取得",
"title": "モデルリスト"
},
"title": "OpenAI設定",
"token": {
"desc": "独自のOpenAIキーを使用します",
"placeholder": "OpenAI APIキー",
"title": "APIキー"
},
"useAzure": {
"desc": "Azureが提供するOpenAIサービスを使用します",
"fetch": "リストを取得",
"serverConfig": "管理者がサーバー側でAzure OpenAIを設定しており、切り替えが禁止されています",
"title": "Azure OpenAI"
}
},
"waitingForMore": "他のモデルは現在 <1>計画中</1> です。お楽しみに ✨"
},
"settingAgent": {
"avatar": {
"title": "アバター"
},
"backgroundColor": {
"title": "背景色"
},
"description": {
"placeholder": "アシスタントの説明を入力してください",
"title": "説明"
},
"name": {
"placeholder": "アシスタントの名前を入力してください",
"title": "名前"
},
"prompt": {
"placeholder": "キャラクタープロンプトを入力してください",
"title": "キャラクター設定"
},
"tag": {
"placeholder": "タグを入力してください",
"title": "タグ"
},
"title": "アシスタント情報"
},
"settingChat": {
"chatStyleType": {
"title": "チャットウィンドウのスタイル",
"type": {
"chat": "対話モード",
"docs": "ドキュメントモード"
}
},
"compressThreshold": {
"desc": "非圧縮の履歴メッセージがこの値を超えると、圧縮されます",
"title": "履歴メッセージの圧縮閾値"
},
"enableCompressThreshold": {
"title": "履歴メッセージの圧縮閾値を有効にする"
},
"enableHistoryCount": {
"alias": "制限なし",
"limited": "{{number}}件の会話メッセージのみ含む",
"title": "履歴メッセージ数の制限",
"unlimited": "履歴メッセージ数の制限なし"
},
"historyCount": {
"desc": "リクエストごとに含まれる履歴メッセージ数",
"title": "履歴メッセージ数"
},
"inputTemplate": {
"desc": "ユーザーの最新のメッセージがこのテンプレートに埋め込まれます",
"placeholder": "プリプロセステンプレート {{text}} はリアルタイムの入力情報に置き換えられます",
"title": "ユーザー入力のプリプロセス"
},
"title": "チャット設定"
},
"settingModel": {
"enableMaxTokens": {
"title": "単一応答制限を有効にする"
},
"frequencyPenalty": {
"desc": "値が大きいほど、重複する単語が減少する可能性が高くなります",
"title": "頻度ペナルティ"
},
"maxTokens": {
"desc": "単一の対話で使用される最大トークン数",
"title": "単一応答制限"
},
"model": {
"desc": "ChatGPTモデル",
"list": {
"gpt-3.5-turbo": "GPT 3.5",
"gpt-3.5-turbo-16k": "GPT 3.5 (16K)",
"gpt-4": "GPT 4",
"gpt-4-32k": "GPT 4 (32K)"
},
"title": "モデル"
},
"presencePenalty": {
"desc": "値が大きいほど、新しいトピックに展開する可能性が高くなります",
"title": "トピックの新鮮さ"
},
"temperature": {
"desc": "値が大きいほど、応答がよりランダムになります",
"title": "ランダム性",
"titleWithValue": "ランダム性 {{value}}"
},
"title": "モデル設定",
"topP": {
"desc": "ランダム性と同様ですが、ランダム性とは同時に変更しないでください",
"title": "トップPサンプリング"
}
},
"settingPlugin": {
"add": "追加",
"addTooltip": "カスタムプラグインを追加",
"clearDeprecated": "無効なプラグインを削除",
"config": "{{id}}プラグインの設定",
"settings": "プラグインマーケットの設定",
"title": "プラグインリスト"
},
"settingSystem": {
"accessCode": {
"desc": "管理者が暗号化アクセスを有効にしています",
"placeholder": "アクセスコードを入力してください",
"title": "アクセスコード"
},
"title": "システム設定"
},
"settingTheme": {
"avatar": {
"title": "アバター"
},
"fontSize": {
"desc": "チャットのテキストサイズ",
"title": "フォントサイズ"
},
"lang": {
"autoMode": "システムに従う",
"title": "言語"
},
"neutralColor": {
"desc": "異なる色調のグレースケールのカスタマイズ",
"title": "中立色"
},
"primaryColor": {
"desc": "カスタムテーマカラー",
"title": "テーマカラー"
},
"themeMode": {
"auto": "自動",
"dark": "ダーク",
"light": "ライト",
"title": "テーマ"
},
"title": "テーマ設定"
},
"tab": {
"agent": "デフォルトのアシスタント",
"common": "一般設定",
"llm": "言語モデル"
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"button": {
"import": "設定をインポート",
"start": "すぐに開始"
},
"header": "ようこそ",
"pickAgent": "または以下のアシスタントテンプレートから選択してください",
"skip": "作成をスキップ",
"slogan": {
"desc1": "脳のクラスターを開始し、思考の火花を引き起こします。あなたのスマートアシスタントは常にそこにあります。",
"desc2": "最初のアシスタントを作成して、始めましょう〜",
"title": "より賢い脳を自分に与える"
}
}
+103
View File
@@ -0,0 +1,103 @@
{
"about": "소개",
"advanceSettings": "고급 설정",
"agentDefaultMessage": "안녕하세요, 저는 **{{name}}**입니다. 바로 대화를 시작하거나 [도우미 설정](/chat/settings#session={{id}})으로 이동하여 제 정보를 완성할 수 있습니다.",
"agentDefaultMessageWithSystemRole": "안녕하세요, 저는 **{{name}}**입니다. {{systemRole}}입니다. 대화를 시작해봅시다!",
"agentMaxToken": "세션 최대 길이",
"agentModel": "모델",
"agentProfile": "도우미 정보",
"appInitializing": "LobeChat을 시작하는 중입니다. 잠시 기다려주세요...",
"archive": "보관함",
"autoGenerate": "자동 생성",
"autoGenerateTooltip": "도우미 설명을 자동으로 완성합니다.",
"backToBottom": "최신 메시지 보기",
"cancel": "취소",
"changelog": "변경 내역",
"clearCurrentMessages": "현재 대화 메시지 지우기",
"close": "닫기",
"confirmClearCurrentMessages": "현재 대화 메시지를 지우시겠습니까? 지운 후에는 복구할 수 없습니다. 작업을 확인하세요.",
"confirmRemoveSessionItemAlert": "도우미를 삭제하시겠습니까? 삭제한 후에는 복구할 수 없습니다. 작업을 확인하세요.",
"copy": "복사",
"copySuccess": "복사 완료",
"defaultAgent": "기본 도우미",
"defaultSession": "기본 도우미",
"delete": "삭제",
"edit": "편집",
"export": "설정 내보내기",
"exportType": {
"agent": "도우미 설정 내보내기",
"agentWithMessage": "도우미와 메시지 내보내기",
"all": "전역 설정과 모든 도우미 데이터 내보내기",
"allAgent": "모든 도우미 설정 내보내기",
"allAgentWithMessage": "모든 도우미와 메시지 내보내기",
"globalSetting": "전역 설정 내보내기"
},
"feedback": "피드백",
"historyRange": "기록 범위",
"import": "설정 가져오기",
"inbox": {
"defaultMessage": "안녕하세요, 저는 인공지능 도우미입니다. 궁금한 점이 있으면 물어보세요. 가능한 한 답변해드리겠습니다. 더 전문적이거나 맞춤화된 도우미가 필요하다면 `+`를 클릭하여 사용자 정의 도우미를 만들 수 있습니다.",
"desc": "뇌 클러스터를 활성화하여 창의적인 아이디어를 끄집어내세요. 여기에서 모든 것을 대화하는 인공지능 도우미와 소통하세요.",
"title": "무작위 대화"
},
"message": {
"function_loading": "플러그인 요청 중..."
},
"moreSetting": "추가 설정...",
"newAgent": "새 도우미",
"noDescription": "설명 없음",
"ok": "확인",
"password": "비밀번호",
"pin": "고정",
"pinOff": "고정 해제",
"regenerate": "재생성",
"rename": "이름 변경",
"reset": "재설정",
"retry": "재시도",
"roleAndArchive": "역할 및 기록",
"searchAgentPlaceholder": "도우미와 대화 검색...",
"send": "보내기",
"sendPlaceholder": "대화 내용 입력...",
"sessionList": "도우미 목록",
"setting": "설정",
"share": "공유",
"shareModal": {
"download": "스크린샷 다운로드",
"imageType": "이미지 형식",
"screenshot": "스크린샷",
"settings": "내보내기 설정",
"shareToShareGPT": "ShareGPT 공유 링크 생성",
"withBackground": "배경 이미지 포함",
"withFooter": "푸터 포함",
"withPluginInfo": "플러그인 정보 포함",
"withSystemRole": "어시스턴트 역할 포함"
},
"stop": "중지",
"tab": {
"chat": "채팅",
"market": "탐색",
"setting": "설정"
},
"temp": "임시",
"tokenDetail": "역할 설정: {{systemRoleToken}} · 이전 메시지: {{chatsToken}}",
"tokenTag": {
"overload": "제한 초과",
"remained": "남음",
"used": "사용됨"
},
"topic": {
"confirmRemoveTopic": "이 주제를 삭제하려고 합니다. 삭제 후에는 복구할 수 없으니 주의하세요.",
"defaultTitle": "기본 주제",
"saveCurrentMessages": "현재 대화를 주제로 저장",
"searchPlaceholder": "주제 검색...",
"title": "주제"
},
"updateAgent": "어시스턴트 정보 업데이트",
"updatePrompt": "프롬프트 문구 업데이트",
"upgradeVersion": {
"action": "지금 업그레이드",
"hasNew": "사용 가능한 업데이트가 있습니다",
"newVersion": "새 버전 사용 가능: {{version}}"
},
"warp": "줄바꿈"
}
+6
View File
@@ -0,0 +1,6 @@
{
"topic": {
"desc": "현재 대화를 히스토리 토픽으로 저장하고 새로운 대화를 시작하려면 왼쪽 버튼을 클릭하세요.",
"title": "토픽 목록"
}
}
+43
View File
@@ -0,0 +1,43 @@
{
"pluginSettings": {
"desc": "다음 구성을 완료하면 플러그인을 사용할 수 있습니다.",
"title": "{{name}} 플러그인 설정"
},
"response": {
"400": "죄송합니다. 서버가 요청을 이해하지 못했습니다. 요청 매개변수가 올바른지 확인해주세요.",
"401": "죄송합니다. 서버가 요청을 거부했습니다. 권한이 부족하거나 유효한 인증 정보를 제공하지 않았을 수 있습니다.",
"403": "죄송합니다. 서버가 요청을 거부했습니다. 이 콘텐츠에 대한 액세스 권한이 없습니다.",
"404": "죄송합니다. 서버가 요청한 페이지나 리소스를 찾을 수 없습니다. URL이 올바른지 확인해주세요.",
"405": "죄송합니다. 서버가 사용한 요청 메서드를 지원하지 않습니다. 요청 메서드가 올바른지 확인해주세요.",
"429": "죄송합니다. 요청이 너무 많아 서버가 약간 지친 상태입니다. 잠시 후에 다시 시도해주세요.",
"500": "죄송합니다. 서버에 문제가 발생하여 요청을 완료할 수 없습니다. 잠시 후에 다시 시도해주세요.",
"502": "죄송합니다. 서버가 잠시 서비스를 제공할 수 없는 상태입니다. 잠시 후에 다시 시도해주세요.",
"503": "죄송합니다. 서버가 현재 요청을 처리할 수 없습니다. 과부하 또는 유지 보수 중일 수 있습니다. 잠시 후에 다시 시도해주세요.",
"504": "죄송합니다. 서버가 상위 서버의 응답을 기다리지 못했습니다. 잠시 후에 다시 시도해주세요.",
"PluginMarketIndexNotFound": "죄송합니다. 서버에서 플러그인 인덱스를 찾을 수 없습니다. 인덱스 주소가 올바른지 확인해주세요.",
"PluginMarketIndexInvalid": "죄송합니다. 플러그인 인덱스 유효성 검사에 실패했습니다. 인덱스 파일 형식이 올바른지 확인해주세요.",
"PluginMetaNotFound": "죄송합니다. 인덱스에서 해당 플러그인을 찾을 수 없습니다. 플러그인의 구성 정보를 인덱스에서 확인해주세요.",
"PluginMetaInvalid": "죄송합니다. 해당 플러그인의 메타 정보 유효성 검사에 실패했습니다. 플러그인 메타 정보 형식이 올바른지 확인해주세요.",
"PluginManifestNotFound": "죄송합니다. 서버에서 해당 플러그인의 설명서 (manifest.json)를 찾을 수 없습니다. 플러그인 설명 파일 주소가 올바른지 확인해주세요.",
"PluginManifestInvalid": "죄송합니다. 해당 플러그인의 설명서 유효성 검사에 실패했습니다. 설명서 형식이 올바른지 확인해주세요.",
"PluginApiNotFound": "죄송합니다. 플러그인 설명서에 해당 API가 없습니다. 요청 메서드와 플러그인 설명서 API가 일치하는지 확인해주세요.",
"PluginApiParamsError": "죄송합니다. 플러그인 요청의 입력 매개변수 유효성 검사에 실패했습니다. 입력 매개변수와 API 설명 정보가 일치하는지 확인해주세요.",
"PluginSettingsInvalid": "플러그인을 사용하려면 올바른 구성이 필요합니다. 구성이 올바른지 확인해주세요.",
"PluginServerError": "플러그인 서버 요청이 오류로 반환되었습니다. 플러그인 설명 파일, 플러그인 구성 또는 서버 구현을 확인해주세요.",
"InvalidAccessCode": "암호가 올바르지 않거나 비어 있습니다. 올바른 액세스 암호를 입력하거나 사용자 지정 OpenAI API 키를 추가해주세요.",
"OpenAIBizError": "OpenAI 서비스 요청 중 오류가 발생했습니다. 아래 정보를 확인하고 문제를 해결하거나 다시 시도해주세요.",
"NoAPIKey": "OpenAI API 키가 비어 있습니다. 사용자 정의 OpenAI API 키를 추가해주세요."
},
"unlock": {
"apikey": {
"title": "사용자 정의 API 키 사용",
"description": "OpenAI API 키를 입력하면 대화를 시작할 수 있습니다. 애플리케이션은 API 키를 기록하지 않습니다."
},
"closeMessage": "알림 닫기",
"confirm": "확인 및 다시 시도",
"password": {
"description": "관리자가 애플리케이션 암호화를 활성화했습니다. 애플리케이션을 잠금 해제하려면 애플리케이션 비밀번호를 입력하십시오. 비밀번호는 한 번만 입력하면 됩니다.",
"title": "암호 입력하여 애플리케이션 잠금 해제"
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"addAgent": "보조 프로그램 추가",
"search": {
"placeholder": "보조 프로그램 이름, 설명 또는 키워드 검색..."
},
"sidebar": {
"comment": "의견",
"prompt": "프롬프트",
"title": "보조 프로그램 세부 정보"
},
"submitAgent": "보조 프로그램 제출",
"title": {
"allAgents": "모든 보조 프로그램",
"recentSubmits": "최근 추가"
}
}
+107
View File
@@ -0,0 +1,107 @@
{
"debug": {
"arguments": "함수 호출 인수",
"function_call": "함수 호출",
"response": "응답"
},
"dev": {
"confirmDeleteDevPlugin": "로컬 플러그인을 삭제하시겠습니까? 삭제 후에는 복구할 수 없습니다.",
"deleteSuccess": "플러그인이 성공적으로 삭제되었습니다.",
"manifest": {
"identifier": {
"desc": "플러그인의 고유 식별자",
"label": "식별자"
},
"mode": {
"local": "시각적 구성",
"local-tooltip": "시각적 구성은 일시적으로 지원되지 않습니다.",
"url": "온라인 링크"
},
"name": {
"desc": "플러그인 제목",
"label": "제목",
"placeholder": "검색 엔진"
}
},
"meta": {
"author": {
"desc": "플러그인 작성자",
"label": "작성자"
},
"avatar": {
"desc": "플러그인 아이콘으로는 Emoji 또는 URL을 사용할 수 있습니다.",
"label": "아이콘"
},
"description": {
"desc": "플러그인 설명",
"label": "설명",
"placeholder": "검색 엔진에서 정보 가져오기"
},
"formFieldRequired": "이 필드는 필수 입력 사항입니다.",
"homepage": {
"desc": "플러그인 홈페이지",
"label": "홈페이지"
},
"identifier": {
"desc": "플러그인의 고유 식별자는 manifest에서 자동으로 인식됩니다.",
"errorDuplicate": "식별자가 이미 있는 플러그인과 중복되었습니다. 식별자를 수정해주세요.",
"label": "식별자",
"pattenErrorMessage": "영문자, 숫자, - 및 _만 입력할 수 있습니다."
},
"manifest": {
"desc": "LobeChat은 이 링크를 통해 플러그인을 설치합니다.",
"jsonInvalid": "manifest가 규칙에 맞지 않습니다. 유효성 검사 결과: \n\n {{error}}",
"label": "플러그인 설명 파일 URL 주소",
"preview": "Manifest 미리보기",
"refresh": "새로 고침",
"requestError": "이 링크를 요청하는 중에 오류가 발생했습니다. 유효한 링크를 입력하고 링크가 크로스 도메인 액세스를 허용하는지 확인해주세요.",
"urlError": "이 링크는 JSON 형식의 내용을 반환하지 않습니다. 유효한 링크를 입력해주세요."
},
"title": {
"desc": "플러그인 제목",
"label": "제목",
"placeholder": "검색 엔진"
}
},
"metaConfig": "플러그인 메타 정보 구성",
"modalDesc": "사용자 정의 플러그인을 추가하면 플러그인 개발 검증 및 세션에서 직접 사용할 수 있습니다. 플러그인 개발 문서는 참조해주세요.",
"preview": {
"card": "플러그인 미리보기",
"desc": "플러그인 설명 미리보기",
"title": "플러그인 이름 미리보기"
},
"save": "저장",
"saveSuccess": "플러그인 설정이 성공적으로 저장되었습니다.",
"tabs": {
"manifest": "기능 설명 목록 (Manifest)",
"meta": "플러그인 메타 정보"
},
"title": "사용자 정의 플러그인 추가",
"update": "업데이트",
"updateSuccess": "플러그인 설정이 성공적으로 업데이트되었습니다."
},
"list": {
"item": {
"deprecated.title": "삭제됨",
"local.config": "구성",
"local.title": "사용자 정의"
}
},
"loading": {
"content": "데이터 가져오는 중...",
"plugin": "플러그인 실행 중..."
},
"pluginList": "플러그인 목록",
"plugins": {
"unknown": "플러그인 검사 중..."
},
"setting": "플러그인 설정",
"settings": {
"indexUrl": {
"title": "마켓 인덱스",
"tooltip": "온라인 편집은 지원되지 않습니다. 배포 환경 변수를 통해 설정해주세요."
},
"modalDesc": "플러그인 마켓의 주소를 구성하면 사용자 정의 플러그인 마켓을 사용할 수 있습니다.",
"title": "플러그인 마켓 설정"
}
}
+225
View File
@@ -0,0 +1,225 @@
{
"danger": {
"clear": {
"action": "지금 지우기",
"confirm": "모든 채팅 데이터를 지우시겠습니까?",
"desc": "모든 대화 데이터를 지웁니다.",
"success": "모든 대화 메시지가 지워졌습니다.",
"title": "모든 대화 메시지 지우기"
},
"reset": {
"action": "지금 재설정",
"confirm": "모든 설정을 재설정하시겠습니까?",
"currentVersion": "현재 버전",
"desc": "모든 설정 항목을 기본값으로 재설정합니다.",
"title": "모든 설정 재설정"
}
},
"header": {
"global": "전역 설정",
"session": "세션 설정",
"sessionWithName": "세션 설정 · {{name}}"
},
"llm": {
"AzureOpenAI": {
"endpoint": {
"desc": "Azure 포털에서 리소스를 확인할 때 이 값을 '키 및 엔드포인트' 섹션에서 찾을 수 있습니다.",
"placeholder": "https://docs-test-001.openai.azure.com",
"title": "Azure API 주소"
},
"models": {
"desc": "지원되는 모델",
"title": "모델 목록"
},
"title": "Azure OpenAI 설정",
"token": {
"desc": "Azure 포털에서 리소스를 확인할 때 이 값을 '키 및 엔드포인트' 섹션에서 찾을 수 있습니다. KEY1 또는 KEY2를 사용할 수 있습니다.",
"placeholder": "Azure API 키",
"title": "API 키"
}
},
"OpenAI": {
"azureApiVersion": {
"desc": "Azure의 API 버전입니다. YYYY-MM-DD 형식을 따릅니다. [최신 버전](https://learn.microsoft.com/ko-kr/azure/ai-services/openai/reference#chat-completions)을 확인하세요.",
"fetch": "목록 가져오기",
"title": "Azure API 버전"
},
"check": {
"button": "확인",
"desc": "API 키와 프록시 주소가 올바르게 입력되었는지 테스트합니다.",
"pass": "확인 완료",
"title": "연결성 확인"
},
"endpoint": {
"desc": "기본 주소 외에도 반드시 http(s)://를 포함해야 합니다.",
"placeholder": "https://api.openai.com/v1",
"title": "인터페이스 프록시 주소"
},
"models": {
"count": "총 {{count}}개의 모델 지원",
"desc": "지원되는 모델",
"fetch": "모델 목록 가져오기",
"notSupport": "Azure OpenAI에서 모델 목록을 볼 수 없습니다.",
"notSupportTip": "배포 이름과 모델 이름이 일치하는지 확인해야 합니다.",
"refetch": "모델 목록 다시 가져오기",
"title": "모델 목록"
},
"title": "OpenAI 설정",
"token": {
"desc": "자체 OpenAI 키 사용",
"placeholder": "OpenAI API 키",
"title": "API 키"
},
"useAzure": {
"desc": "Azure에서 제공하는 OpenAI 서비스 사용",
"fetch": "목록 가져오기",
"serverConfig": "관리자가 서버에서 Azure OpenAI를 구성했으므로 변경이 금지되었습니다.",
"title": "Azure OpenAI"
}
},
"waitingForMore": "더 많은 모델이 <1>계획 중</1>에 있으니 기대해주세요 ✨"
},
"settingAgent": {
"avatar": {
"title": "아바타"
},
"backgroundColor": {
"title": "배경색"
},
"description": {
"placeholder": "도우미 설명을 입력하세요.",
"title": "도우미 설명"
},
"name": {
"placeholder": "도우미 이름을 입력하세요.",
"title": "이름"
},
"prompt": {
"placeholder": "역할 프롬프트 힌트를 입력하세요.",
"title": "역할 설정"
},
"tag": {
"placeholder": "태그를 입력하세요.",
"title": "태그"
},
"title": "도우미 정보"
},
"settingChat": {
"chatStyleType": {
"title": "채팅 창 스타일",
"type": {
"chat": "대화 모드",
"docs": "문서 모드"
}
},
"compressThreshold": {
"desc": "압축되지 않은 이전 메시지가이 값보다 크면 압축됩니다.",
"title": "압축 임계값"
},
"enableCompressThreshold": {
"title": "이전 메시지 길이 압축 사용"
},
"enableHistoryCount": {
"alias": "제한 없음",
"limited": "대화 메시지 {{number}} 개만 포함",
"title": "대화 메시지 제한",
"unlimited": "대화 메시지 제한 없음"
},
"historyCount": {
"desc": "요청당 포함되는 이전 메시지 수",
"title": "포함된 이전 메시지 수"
},
"inputTemplate": {
"desc": "사용자의 최신 메시지가이 템플릿에 채워집니다.",
"placeholder": "사전 처리 템플릿 {{text}}은(는) 실시간 입력 정보로 대체됩니다.",
"title": "사용자 입력 사전 처리"
},
"title": "채팅 설정"
},
"settingModel": {
"enableMaxTokens": {
"title": "단일 응답 제한 사용"
},
"frequencyPenalty": {
"desc": "값이 클수록 반복 단어가 줄어듭니다.",
"title": "빈도 패널티"
},
"maxTokens": {
"desc": "단일 상호 작용에 사용되는 최대 토큰 수",
"title": "단일 응답 제한"
},
"model": {
"desc": "ChatGPT 모델",
"list": {
"gpt-3.5-turbo": "GPT 3.5",
"gpt-3.5-turbo-16k": "GPT 3.5 (16K)",
"gpt-4": "GPT 4",
"gpt-4-32k": "GPT 4 (32K)"
},
"title": "모델"
},
"presencePenalty": {
"desc": "값이 클수록 새로운 주제로 확장될 가능성이 높아집니다.",
"title": "주제 신선도"
},
"temperature": {
"desc": "값이 클수록 응답이 더 무작위 해집니다.",
"title": "랜덤성",
"titleWithValue": "랜덤성 {{value}}"
},
"title": "모델 설정",
"topP": {
"desc": "랜덤성과 유사하지만 함께 변경하지 마십시오.",
"title": "상위 P 샘플링"
}
},
"settingPlugin": {
"add": "추가",
"addTooltip": "사용자 정의 플러그인 추가",
"clearDeprecated": "사용되지 않는 플러그인 제거",
"config": "{{id}} 플러그인 구성",
"settings": "플러그인 마켓 설정",
"title": "플러그인 목록"
},
"settingSystem": {
"accessCode": {
"desc": "관리자가 암호 액세스를 활성화했습니다.",
"placeholder": "액세스 코드를 입력하세요.",
"title": "액세스 코드"
},
"title": "시스템 설정"
},
"settingTheme": {
"avatar": {
"title": "아바타"
},
"fontSize": {
"desc": "채팅 콘텐츠의 글꼴 크기",
"title": "글꼴 크기"
},
"lang": {
"autoMode": "시스템에 따름",
"title": "언어"
},
"neutralColor": {
"desc": "다양한 색상 경향의 중립적인 사용자 정의",
"title": "중립 색상"
},
"primaryColor": {
"desc": "사용자 정의 테마 색상",
"title": "테마 색상"
},
"themeMode": {
"auto": "자동",
"dark": "다크",
"light": "라이트",
"title": "테마"
},
"title": "테마 설정"
},
"tab": {
"agent": "기본 도우미",
"common": "일반 설정",
"llm": "언어 모델"
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"button": {
"import": "구성 가져오기",
"start": "지금 시작"
},
"header": "환영합니다",
"pickAgent": "또는 다음 도우미 템플릿 중 하나를 선택하세요",
"skip": "생성 건너뛰기",
"slogan": {
"desc1": "뇌 클러스터를 시작하여 아이디어를 자극하세요. 당신의 지능형 어시스턴트가 항상 여기에 있습니다.",
"desc2": "첫 번째 어시스턴트를 만들어 보세요. 시작해 봅시다~",
"title": "더 똑똑한 뇌를 위해 스스로에게 선물하세요"
}
}
+5
View File
@@ -94,5 +94,10 @@
},
"updateAgent": "Обновление информации о помощнике",
"updatePrompt": "Обновление подсказок",
"upgradeVersion": {
"action": "Обновить сейчас",
"hasNew": "Доступно обновление",
"newVersion": "Доступна новая версия: {{version}}"
},
"warp": "Разрыв строки"
}
+4 -3
View File
@@ -25,12 +25,13 @@
"PluginApiNotFound": "К сожалению, API не существует в манифесте плагина. Пожалуйста, проверьте, соответствует ли ваш метод запроса API манифеста плагина",
"PluginApiParamsError": "К сожалению, проверка входных параметров для запроса плагина не удалась. Пожалуйста, проверьте, соответствуют ли входные параметры описанию API",
"PluginSettingsInvalid": "Этот плагин необходимо правильно настроить, прежде чем его можно будет использовать. Пожалуйста, проверьте правильность вашей конфигурации",
"PluginServerError": "Запрос сервера плагина возвратил ошибку. Проверьте файл манифеста плагина, конфигурацию плагина или реализацию сервера на основе информации об ошибке ниже"
"PluginServerError": "Запрос сервера плагина возвратил ошибку. Проверьте файл манифеста плагина, конфигурацию плагина или реализацию сервера на основе информации об ошибке ниже",
"NoAPIKey": "Ключ OpenAI API пуст, пожалуйста, добавьте свой собственный ключ OpenAI API"
},
"unlock": {
"apikey": {
"description": "Введите свой ключ API OpenAI, чтобы обойти проверку пароля. Приложение не будет записывать ваш ключ API.",
"title": "Использовать собственный ключ API"
"title": "Использовать собственный ключ API",
"description": "Введите свой ключ API OpenAI, чтобы начать сеанс. Приложение не будет сохранять ваш ключ API."
},
"confirm": "Подтвердить и повторить попытку",
"password": {
+5
View File
@@ -94,5 +94,10 @@
},
"updateAgent": "更新助理信息",
"updatePrompt": "更新提示词",
"upgradeVersion": {
"action": "立即升级",
"hasNew": "有可用更新",
"newVersion": "有新版本可用:{{version}}"
},
"warp": "换行"
}
+3 -2
View File
@@ -25,11 +25,12 @@
"PluginSettingsInvalid": "该插件需要正确配置后才可以使用,请检查你的配置是否正确",
"PluginServerError": "插件服务端请求返回出错,请检查根据下面的报错信息检查你的插件描述文件、插件配置或服务端实现",
"InvalidAccessCode": "密码不正确或为空,请输入正确的访问密码,或者添加自定义 OpenAI API Key",
"OpenAIBizError": "请求 OpenAI 服务出错,请根据以下信息排查或重试"
"OpenAIBizError": "请求 OpenAI 服务出错,请根据以下信息排查或重试",
"NoAPIKey": "OpenAI API Key 为空,请添加自定义 OpenAI API Key"
},
"unlock": {
"apikey": {
"description": "输入你的 OpenAI API Key 即可绕过密码验证。应用不会记录你的 API Key",
"description": "输入你的 OpenAI API Key 即可开始会话。应用不会记录你的 API Key",
"title": "使用自定义 API Key"
},
"closeMessage": "关闭提示",
+5
View File
@@ -94,5 +94,10 @@
},
"updateAgent": "更新助理資訊",
"updatePrompt": "更新提示",
"upgradeVersion": {
"action": "立即升級",
"hasNew": "有可用更新",
"newVersion": "有新版本可用:{{version}}"
},
"warp": "換行"
}
+4 -3
View File
@@ -25,12 +25,13 @@
"PluginApiNotFound": "抱歉,外掛描述檔案中不存在該 API。請檢查您的請求方法與外掛清單 API 是否相符",
"PluginApiParamsError": "抱歉,該外掛請求的輸入參數驗證失敗。請檢查輸入參數與 API 描述資訊是否相符",
"PluginSettingsInvalid": "該外掛需要正確設定後才可以使用。請檢查您的設定是否正確",
"PluginServerError": "外掛伺服器請求回傳錯誤。請根據下面的錯誤資訊檢查您的外掛描述檔案、外掛設定或伺服器實作"
"PluginServerError": "外掛伺服器請求回傳錯誤。請根據下面的錯誤資訊檢查您的外掛描述檔案、外掛設定或伺服器實作",
"NoAPIKey": "OpenAI API 金鑰為空,請添加自訂 OpenAI API 金鑰"
},
"unlock": {
"apikey": {
"description": "輸入您的 OpenAI API Key 以繞過密碼驗證。應用程式不會記錄您的 API Key",
"title": "使用自定義 API Key"
"title": "使用自定義 API Key",
"description": "輸入你的 OpenAI API Key 即可開始會話。應用程式不會記錄你的 API Key"
},
"confirm": "確認並重試",
"password": {
+5 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@lobehub/chat",
"version": "0.83.10",
"version": "0.85.3",
"description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
"keywords": [
"chatbot",
@@ -107,6 +107,7 @@
"remark": "^14",
"remark-gfm": "^3",
"remark-html": "^15",
"semver": "^7",
"swr": "^2",
"systemjs": "^6",
"ts-md5": "^1",
@@ -127,11 +128,13 @@
"@testing-library/jest-dom": "^6",
"@testing-library/react": "^14",
"@types/chroma-js": "^2",
"@types/lodash": "^4",
"@types/lodash-es": "^4",
"@types/mixpanel-browser": "^2",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"@types/semver": "^7",
"@types/systemjs": "^6",
"@types/ua-parser-js": "^0.7",
"@types/uuid": "^9",
@@ -144,6 +147,7 @@
"husky": "^8",
"jsdom": "^22",
"lint-staged": "^14",
"lodash": "^4",
"next-pwa": "^5",
"node-fetch": "^3",
"prettier": "^3",
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+35 -6
View File
@@ -1,17 +1,31 @@
{
"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",
"display": "fullscreen",
"display": "standalone",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
"type": "image/png",
"purpose": "any"
},
{
"src": "/icons/maskable-icon-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
"type": "image/png",
"purpose": "any"
},
{
"src": "/icons/maskable-icon-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"id": "/",
@@ -20,13 +34,28 @@
"scope": "/",
"screenshots": [
{
"src": "https://registry.npmmirror.com/@lobehub/assets-favicons/1.4.0/files/assets/og-960x540.png",
"sizes": "960x540",
"src": "/screenshots/screenshot-1.png",
"sizes": "750x1334",
"type": "image/png"
},
{
"src": "/screenshots/screenshot-2.png",
"sizes": "750x1334",
"type": "image/png"
},
{
"src": "/screenshots/screenshot-3.png",
"sizes": "750x1334",
"type": "image/png"
},
{
"src": "/screenshots/screenshot-4.png",
"sizes": "750x1334",
"type": "image/png"
}
],
"short_name": "LobeChat",
"splash_pages": null,
"start_url": "/",
"start_url": ".",
"theme_color": "#000000"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

+2 -1
View File
@@ -1,5 +1,6 @@
import { consola } from 'consola';
import { colors } from 'consola/utils';
import { unset } from 'lodash';
import { existsSync } from 'node:fs';
import {
@@ -8,7 +9,7 @@ import {
localesResourcesFilepath,
outputLocaleJsonFilepath,
} from './const';
import { diff, readJSON, tagWhite, tagYellow, unset, writeJSON } from './utils';
import { diff, readJSON, tagWhite, tagYellow, writeJSON } from './utils';
export const genDiff = () => {
consola.start(`Diff between Dev/Prod local...`);
+3 -9
View File
@@ -1,6 +1,7 @@
import { consola } from 'consola';
import { colors } from 'consola/utils';
import { tocForResources } from 'i18next-resources-for-ts';
import { isObject } from 'lodash';
import { readFileSync, writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
@@ -58,8 +59,8 @@ export const diff = (obj1: any, obj2: any, prefix: string = ''): string[] => {
let result: string[] = [];
for (const key in obj1) {
if (!obj2[key]) continue;
if (typeof obj1[key] === 'object' && obj1[key] !== null && obj2[key]) {
result = result.concat(diff(obj1[key], obj2[key], `${key}.`));
if (isObject(obj1[key]) && isObject(obj2[key])) {
result = [...result, ...diff(obj1[key], obj2[key], `${prefix}${key}.`)];
} else if (obj1[key] !== obj2[key]) {
result.push(`${prefix}${key}`);
}
@@ -67,13 +68,6 @@ export const diff = (obj1: any, obj2: any, prefix: string = ''): string[] => {
return result;
};
export const unset = (obj: any, key: string) => {
const keys = key.split('.');
const lastKey = keys.pop();
const lastObj = keys.reduce((obj, key) => (obj[key] = obj[key] || {}), obj);
if (lastKey) delete lastObj[lastKey];
};
export const tagBlue = (text: string) => colors.bgBlueBright(colors.black(` ${text} `));
export const tagYellow = (text: string) => colors.bgYellowBright(colors.black(` ${text} `));
export const tagGreen = (text: string) => colors.bgGreenBright(colors.black(` ${text} `));
+2 -2
View File
@@ -9,12 +9,12 @@ interface AuthConfig {
export const checkAuth = ({ apiKey, accessCode }: AuthConfig) => {
const { ACCESS_CODE } = getServerConfig();
// 如果存在 apiKey
// if apiKey exist
if (apiKey) {
return { auth: true };
}
// 如果不存在,则检查 accessCode
// if accessCode doesn't exist
if (!ACCESS_CODE) return { auth: true };
if (accessCode !== ACCESS_CODE) {
+19 -5
View File
@@ -2,7 +2,7 @@ import OpenAI from 'openai';
import { getServerConfig } from '@/config/server';
import { getOpenAIAuthFromRequest } from '@/const/fetch';
import { ErrorType } from '@/types/fetch';
import { ChatErrorType, ErrorType } from '@/types/fetch';
import { OpenAIStreamPayload } from '@/types/openai';
import { checkAuth } from '../../auth';
@@ -29,10 +29,24 @@ export const POST = async (req: Request) => {
const { USE_AZURE_OPENAI } = getServerConfig();
const useAzureOpenAI = useAzure || USE_AZURE_OPENAI;
if (useAzureOpenAI) {
openai = createAzureOpenai({ apiVersion, endpoint, model: payload.model, userApiKey: apiKey });
} else {
openai = createOpenai(apiKey, endpoint);
try {
if (useAzureOpenAI) {
openai = createAzureOpenai({
apiVersion,
endpoint,
model: payload.model,
userApiKey: apiKey,
});
} else {
openai = createOpenai(apiKey, endpoint);
}
} catch (error) {
if ((error as Error).cause === ChatErrorType.NoAPIKey) {
return createErrorResponse(ChatErrorType.NoAPIKey);
}
console.error(error); // log error to trace it
return createErrorResponse(ChatErrorType.InternalServerError);
}
return createChatCompletion({ openai, payload });
+4 -1
View File
@@ -2,6 +2,7 @@ import OpenAI, { ClientOptions } from 'openai';
import urlJoin from 'url-join';
import { getServerConfig } from '@/config/server';
import { ChatErrorType } from '@/types/fetch';
// 创建 Azure OpenAI 实例
export const createAzureOpenai = (params: {
@@ -17,7 +18,9 @@ export const createAzureOpenai = (params: {
const defaultApiVersion = AZURE_API_VERSION || '2023-08-01-preview';
const apiVersion = !params.apiVersion ? defaultApiVersion : params.apiVersion;
const apiKey = !params.userApiKey ? AZURE_API_KEY ?? '' : params.userApiKey;
const apiKey = !params.userApiKey ? AZURE_API_KEY : params.userApiKey;
if (!apiKey) throw new Error('AZURE_API_KEY is empty', { cause: ChatErrorType.NoAPIKey });
const config: ClientOptions = {
apiKey,
+6 -6
View File
@@ -1,6 +1,7 @@
import OpenAI, { ClientOptions } from 'openai';
import OpenAI from 'openai';
import { getServerConfig } from '@/config/server';
import { ChatErrorType } from '@/types/fetch';
// 创建 OpenAI 实例
export const createOpenai = (userApiKey: string | null, endpoint?: string | null) => {
@@ -8,10 +9,9 @@ export const createOpenai = (userApiKey: string | null, endpoint?: string | null
const baseURL = endpoint ? endpoint : OPENAI_PROXY_URL ? OPENAI_PROXY_URL : undefined;
const config: ClientOptions = {
apiKey: !userApiKey ? OPENAI_API_KEY : userApiKey,
baseURL,
};
const apiKey = !userApiKey ? OPENAI_API_KEY : userApiKey;
return new OpenAI(config);
if (!apiKey) throw new Error('OPENAI_API_KEY is empty', { cause: ChatErrorType.NoAPIKey });
return new OpenAI({ apiKey, baseURL });
};
+1
View File
@@ -2,6 +2,7 @@ import { ChatErrorType, ErrorResponse, ErrorType } from '@/types/fetch';
const getStatus = (errorType: ErrorType) => {
switch (errorType) {
case ChatErrorType.NoAPIKey:
case ChatErrorType.InvalidAccessCode: {
return 401;
}
+1 -1
View File
@@ -18,7 +18,7 @@ const DesktopPage = memo(() => (
<Layout>
<PageTitle />
<ChatHeader />
<Flexbox flex={1} height={'calc(100vh - 64px)'} horizontal>
<Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
<Conversation chatInput={<ChatInput />} />
<SideBar />
</Flexbox>
+1 -1
View File
@@ -16,7 +16,7 @@ export default memo(({ children }: PropsWithChildren) => {
<ResponsiveSessionList />
<Flexbox
flex={1}
height={'100vh'}
height={'100%'}
id={'lobe-conversion-container'}
style={{ position: 'relative' }}
>
+1 -1
View File
@@ -10,7 +10,7 @@ import Layout from './layout.mobile';
const Chat = memo(() => (
<Layout>
<Flexbox height={'calc(100vh - 44px)'} horizontal>
<Flexbox height={'calc(100% - 44px)'} horizontal>
<Conversation chatInput={<ChatInput />} mobile />
<TopicList />
</Flexbox>
@@ -19,7 +19,7 @@ const SaveTopic = memo(() => {
return (
<Tooltip title={t('topic.saveCurrentMessages')}>
<Render icon={icon} onClick={saveToTopic} />
<Render aria-label={t('topic.saveCurrentMessages')} icon={icon} onClick={saveToTopic} />
</Tooltip>
);
});
@@ -0,0 +1,12 @@
import { memo } from 'react';
import APIKeyForm from './ApiKeyForm';
import { ErrorActionContainer } from './style';
const OpenAPIKey = memo<{ id: string }>(({ id }) => (
<ErrorActionContainer>
<APIKeyForm id={id} />
</ErrorActionContainer>
));
export default OpenAPIKey;
@@ -2,8 +2,8 @@ import { Highlighter } from '@lobehub/ui';
import { memo } from 'react';
import { Flexbox } from 'react-layout-kit';
import APIKeyForm from './ApiKeyForm';
import { ErrorActionContainer, useStyles } from './style';
import OpenAPIKey from './OpenAPIKey';
import { useStyles } from './style';
interface OpenAIError {
code: 'invalid_api_key' | string;
@@ -21,13 +21,8 @@ const OpenAiBizError = memo<{ content: OpenAIErrorResponse; id: string }>(({ con
const errorCode = content.error?.code;
if (errorCode === 'invalid_api_key') {
return (
<ErrorActionContainer>
<APIKeyForm id={id} />
</ErrorActionContainer>
);
}
if (errorCode === 'invalid_api_key') return <OpenAPIKey id={id} />;
return (
<Flexbox className={styles.container} style={{ maxWidth: 600 }}>
<Highlighter language={'json'}>{JSON.stringify(content, null, 2)}</Highlighter>
@@ -5,6 +5,7 @@ import { ChatMessage } from '@/types/chatMessage';
import { ChatErrorType, ErrorType } from '@/types/fetch';
import InvalidAccess from './InvalidAccess';
import OpenAPIKey from './OpenAPIKey';
import OpenAiBizError from './OpenAiBizError';
import PluginError from './Plugin/PluginError';
import PluginSettings from './Plugin/PluginSettings';
@@ -36,6 +37,10 @@ export const renderErrorMessage: RenderErrorMessage = (error, message: ChatMessa
return <InvalidAccess id={message.id} />;
}
case ChatErrorType.NoAPIKey: {
return <OpenAPIKey id={message.id} />;
}
case ChatErrorType.OpenAIBizError: {
return <OpenAiBizError content={(error as any).body} id={message.id} />;
}
@@ -37,6 +37,7 @@ const Inbox = memo(() => {
return (
<Link
aria-label={INBOX_SESSION_ID}
href={SESSION_CHAT_URL(INBOX_SESSION_ID, mobile)}
onClick={(e) => {
e.preventDefault();
@@ -24,6 +24,7 @@ const SessionList = memo(() => {
) : list.length > 0 ? (
list.map(({ id }) => (
<Link
aria-label={id}
href={SESSION_CHAT_URL(id, mobile)}
key={id}
onClick={(e) => {
+1 -1
View File
@@ -9,7 +9,7 @@ const Loading = () => {
const { t } = useTranslation();
return (
<Flexbox height={'100vh'} width={'100%'}>
<Flexbox height={'100%'} width={'100%'}>
<Center flex={1} gap={12} width={'100%'}>
<Logo extra={'Chat'} size={48} type={'combine'} />
<Center gap={16} horizontal>
@@ -53,7 +53,7 @@ const SideBar = memo(() => {
<DraggablePanelContainer
style={{
flex: 'none',
height: '100vh',
height: '100%',
minWidth: MARKET_SIDEBAR_WIDTH,
}}
>
+1 -1
View File
@@ -22,7 +22,7 @@ const Header = memo(() => {
return (
<ChatHeader
left={
<Link href={'/'}>
<Link aria-label={'home'} href={'/'}>
<Logo className={styles.logo} extra={'Discover'} size={36} type={'text'} />
</Link>
}
+2 -2
View File
@@ -34,12 +34,12 @@ const MarketLayout = memo<PropsWithChildren>(({ children }) => {
<AppLayoutDesktop>
<Flexbox
flex={1}
height={'100vh'}
height={'100%'}
id={'lobe-market-container'}
style={{ position: 'relative' }}
>
<Header />
<Flexbox flex={1} height={'calc(100vh - 64px)'} horizontal>
<Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
<Flexbox align={'center'} flex={1} style={{ overflow: 'auto', padding: 16 }}>
<SafeSpacing />
@@ -50,6 +50,7 @@ const AgentCardBanner = memo<AgentCardBannerProps>(
{...props}
>
<Avatar
alt={'banner'}
avatar={meta.avatar}
background={meta.backgroundColor || theme.colorBgContainer}
className={styles.bannerImg}
@@ -47,7 +47,7 @@ const Header = memo(() => {
))}
</Center>
<div className={styles.desc}>{description}</div>
<Link className={styles.author} href={homepage} target={'_blank'}>
<Link aria-label={author} className={styles.author} href={homepage} target={'_blank'}>
@{author}
</Link>
<Button
@@ -14,7 +14,7 @@ export default memo(({ children }: PropsWithChildren) => {
return (
<AppLayoutDesktop>
<SideBar />
<Flexbox flex={1} height={'100vh'} style={{ position: 'relative' }}>
<Flexbox flex={1} height={'100%'} style={{ position: 'relative' }}>
<Header />
<Flexbox align={'center'} flex={1} padding={24} style={{ overflow: 'auto' }}>
<SafeSpacing />
+2 -2
View File
@@ -5,8 +5,8 @@ import { createStyles } from 'antd-style';
import { memo } from 'react';
import { Center } from 'react-layout-kit';
import pkg from '@/../package.json';
import AgentCardBanner from '@/app/market/features/AgentCard/AgentCardBanner';
import { CURRENT_VERSION } from '@/const/version';
import AvatarWithUpload from '@/features/AvatarWithUpload';
import { useGlobalStore, useSwitchSideBarOnInit } from '@/store/global';
import { SidebarTabKey } from '@/store/global/initialState';
@@ -50,7 +50,7 @@ const Setting = memo(() => {
<ExtraList />
<Center style={{ paddingInline: 64 }}>
<Divider>
<span className={styles.footer}>LobeChat v{pkg.version}</span>
<span className={styles.footer}>LobeChat v{CURRENT_VERSION}</span>
</Divider>
</Center>
</div>
+4
View File
@@ -4,20 +4,24 @@ import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import PageTitle from '@/components/PageTitle';
import { CURRENT_VERSION } from '@/const/version';
import { useSwitchSideBarOnInit } from '@/store/global/hooks/useSwitchSettingsOnInit';
import { SettingsTabs } from '@/store/global/initialState';
import { genSiteHeadTitle } from '@/utils/genSiteHeadTitle';
import Footer from '../features/Footer';
import Common from './Common';
export default memo(() => {
useSwitchSideBarOnInit(SettingsTabs.Common);
const { t } = useTranslation('setting');
const pageTitle = genSiteHeadTitle(t('tab.common'));
return (
<>
<PageTitle title={pageTitle} />
<Common />
<Footer>LobeChat v{CURRENT_VERSION}</Footer>
</>
);
});
+24
View File
@@ -0,0 +1,24 @@
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: 14px;
color: ${token.colorTextDescription};
`,
);
const Footer = memo<PropsWithChildren>(({ children }) => {
const { styles } = useStyles();
return (
<Center style={{ maxWidth: 600, width: '100%' }}>
<Divider>
<span className={styles}>{children}</span>
</Divider>
</Center>
);
});
export default Footer;
@@ -22,6 +22,7 @@ const List = memo(() => {
return items.map(({ value, icon, label }) => (
<Link
aria-label={label}
href={`/settings/${value}`}
key={value}
onClick={() => {
+3 -1
View File
@@ -5,6 +5,7 @@ import { Flexbox } from 'react-layout-kit';
import FolderPanel from '@/features/FolderPanel';
import UpgradeAlert from '../UpgradeAlert';
import List from './List';
const useStyles = createStyles(({ stylish, token, css }) => ({
@@ -26,9 +27,10 @@ const SideBar = memo(() => {
<DraggablePanelBody className={styles.body} style={{ padding: 0 }}>
<Flexbox className={styles.top} padding={16}>
<div>
<Logo className={styles.logo} size={36} type={'text'} />
<Logo className={styles.logo} extra={'Settings'} size={36} type={'text'} />
</div>
</Flexbox>
<UpgradeAlert />
<List />
</DraggablePanelBody>
</FolderPanel>
@@ -0,0 +1,32 @@
import { Alert, Button } from 'antd';
import Link from 'next/link';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { MANUAL_UPGRADE_URL } from '@/const/version';
import { useGlobalStore } from '@/store/global';
const UpgradeAlert = memo(() => {
const [hasNewVersion, latestVersion] = useGlobalStore((s) => [s.hasNewVersion, s.latestVersion]);
const { t } = useTranslation('common');
return (
hasNewVersion && (
<Alert
action={
<Link aria-label={t('upgradeVersion.action')} href={MANUAL_UPGRADE_URL} target={'_blank'}>
<Button size={'small'} type={'primary'}>
{t('upgradeVersion.action')}
</Button>
</Link>
}
banner
closable
message={t('upgradeVersion.newVersion', { version: latestVersion })}
type={'info'}
/>
)
);
});
export default UpgradeAlert;
+7 -25
View File
@@ -3,10 +3,8 @@ import { Form as AntForm, AutoComplete, Input, Switch } from 'antd';
import { createStyles } from 'antd-style';
import { debounce } from 'lodash-es';
import { Webhook } from 'lucide-react';
import Link from 'next/link';
import { memo } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { useTranslation } from 'react-i18next';
import { FORM_STYLE } from '@/const/layoutTokens';
import { settingsSelectors, useEffectAfterGlobalHydrated, useGlobalStore } from '@/store/global';
@@ -24,9 +22,6 @@ const useStyles = createStyles(({ css, token }) => ({
color: ${token.colorTextDescription} !important;
}
`,
plan: css`
color: ${token.colorTextDescription};
`,
tip: css`
font-size: 12px;
color: ${token.colorTextDescription};
@@ -139,25 +134,12 @@ const LLM = memo(() => {
};
return (
<Flexbox align={'center'} gap={24} width={'100%'}>
<Form
form={form}
items={[openAI]}
onValuesChange={debounce(setSettings, 100)}
{...FORM_STYLE}
/>
<Flexbox align={'center'} className={styles.plan}>
<div>
<Trans i18nKey="llm.waitingForMore" ns={'setting'}>
<Link href="https://github.com/lobehub/lobe-chat/issues/151" target="_blank">
</Link>
</Trans>
</div>
</Flexbox>
</Flexbox>
<Form
form={form}
items={[openAI]}
onValuesChange={debounce(setSettings, 100)}
{...FORM_STYLE}
/>
);
});
+16 -1
View File
@@ -1,8 +1,10 @@
'use client';
import Link from 'next/link';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Trans, useTranslation } from 'react-i18next';
import Footer from '@/app/settings/features/Footer';
import PageTitle from '@/components/PageTitle';
import { useSwitchSideBarOnInit } from '@/store/global/hooks/useSwitchSettingsOnInit';
import { SettingsTabs } from '@/store/global/initialState';
@@ -18,6 +20,19 @@ export default memo(() => {
<>
<PageTitle title={pageTitle} />
<LLM />
<Footer>
<Trans i18nKey="llm.waitingForMore" ns={'setting'}>
<Link
aria-label={'todo'}
href="https://github.com/lobehub/lobe-chat/issues/151"
target="_blank"
>
</Link>
</Trans>
</Footer>
</>
);
});
+14 -3
View File
@@ -6,7 +6,7 @@ import { Book, Github } from 'lucide-react';
import { memo } from 'react';
import { Flexbox } from 'react-layout-kit';
import { CHANGELOG, DISCORD, GITHUB } from '@/const/url';
import { DISCORD, GITHUB, WIKI } from '@/const/url';
const Footer = memo(() => {
const theme = useTheme();
@@ -21,9 +21,20 @@ const Footer = memo(() => {
icon={DiscordIcon}
onClick={() => window.open(DISCORD, '__blank')}
size={'site'}
title={'Discord'}
/>
<ActionIcon
icon={Book}
onClick={() => window.open(WIKI, '__blank')}
size={'site'}
title={'Wiki'}
/>
<ActionIcon
icon={Github}
onClick={() => window.open(GITHUB, '__blank')}
size={'site'}
title={'GitHub'}
/>
<ActionIcon icon={Book} onClick={() => window.open(CHANGELOG, '__blank')} size={'site'} />
<ActionIcon icon={Github} onClick={() => window.open(GITHUB, '__blank')} size={'site'} />
</Flexbox>
</Flexbox>
);
@@ -10,7 +10,7 @@ const Showcase = memo(() => (
<Flexbox
flex={1}
justify={'center'}
style={{ height: '100vh', position: 'relative', width: '100%' }}
style={{ height: '100%', position: 'relative', width: '100%' }}
>
<GridShowcase>
<Banner />
+2 -5
View File
@@ -1,5 +1,4 @@
import { Logo } from '@lobehub/ui';
import Link from 'next/link';
import { PropsWithChildren, memo } from 'react';
import { Center, Flexbox } from 'react-layout-kit';
@@ -14,13 +13,11 @@ const Desktop = memo<PropsWithChildren>(({ children }) => {
<Center
className={styles.layout}
flex={1}
height={'100vh'}
height={'100%'}
horizontal
style={{ position: 'relative' }}
>
<Link href={'/'}>
<Logo className={styles.logo} size={36} type={'text'} />
</Link>
<Logo className={styles.logo} size={36} type={'text'} />
<Flexbox className={styles.view} flex={1}>
{children}
</Flexbox>
@@ -4,7 +4,7 @@ import { Center, Flexbox } from 'react-layout-kit';
import Banner from '@/app/welcome/features/Banner';
const Showcase = memo(() => (
<Flexbox align={'center'} justify={'center'} style={{ height: 'calc(100vh - 44px)' }}>
<Flexbox align={'center'} justify={'center'} style={{ height: 'calc(100% - 44px)' }}>
<Center gap={16}>
<Banner mobile />
</Center>
+1 -1
View File
@@ -12,7 +12,7 @@ const MobileLayout = memo<PropsWithChildren>(({ children }) => {
return (
<AppLayoutMobile navBar={<Header />} showTabBar style={{ background: theme.colorBgLayout }}>
<div style={{ paddingInline: 16 }}>{children}</div>
<div style={{ height: '100%', paddingInline: 16 }}>{children}</div>
</AppLayoutMobile>
);
});
+16 -17
View File
@@ -4,12 +4,10 @@ import { Icon } from '@lobehub/ui';
import { useSize } from 'ahooks';
import { Button, Upload } from 'antd';
import { SendHorizonal } from 'lucide-react';
import Link from 'next/link';
import { memo, useCallback, useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { SESSION_CHAT_URL } from '@/const/url';
import { useImportConfig } from '@/hooks/useImportConfig';
import { useSessionStore } from '@/store/session';
@@ -23,8 +21,12 @@ const Banner = memo<{ mobile?: boolean }>(({ mobile }) => {
const width = domSize?.width || 1024;
const { t } = useTranslation('welcome');
const { styles } = useStyles();
const switchSession = useSessionStore((s) => s.switchSession);
const [switchSession, switchBackToChat, router, isMobile] = useSessionStore((s) => [
s.switchSession,
s.switchBackToChat,
s.router,
s.isMobile,
]);
const handleImport = useCallback((e: any) => {
importConfig(e);
switchSession();
@@ -47,20 +49,17 @@ const Banner = memo<{ mobile?: boolean }>(({ mobile }) => {
{t('button.import')}
</Button>
</Upload>
<Link
href={SESSION_CHAT_URL()}
onClick={(e) => {
e.preventDefault();
switchSession();
}}
<Button
block={mobile}
onClick={() => (isMobile ? router?.push('/chat') : switchBackToChat())}
size={'large'}
type={'primary'}
>
<Button block={mobile} size={'large'} type={'primary'}>
<Flexbox align={'center'} gap={4} horizontal justify={'center'}>
{t('button.start')}
<Icon icon={SendHorizonal} />
</Flexbox>
</Button>
</Link>
<Flexbox align={'center'} gap={4} horizontal justify={'center'}>
{t('button.start')}
<Icon icon={SendHorizonal} />
</Flexbox>
</Button>
</Flexbox>
</>
);
+1 -1
View File
@@ -60,7 +60,7 @@ export const useStyles = createStyles(({ css, token, stylish, cx, prefixCls }) =
overflow-y: auto;
max-width: 1024px;
height: 100vh;
height: 100%;
padding: 32px 16px;
`,
),
+1 -1
View File
@@ -2,7 +2,7 @@ import type { FormProps } from '@lobehub/ui';
export const HEADER_HEIGHT = 64;
export const MOBILE_NABBAR_HEIGHT = 44;
export const MOBILE_TABBAR_HEIGHT = 48;
export const MOBILE_TABBAR_HEIGHT = 60;
export const CHAT_TEXTAREA_HEIGHT = 200;
export const CHAT_TEXTAREA_HEIGHT_MOBILE = 120;
export const CHAT_SIDEBAR_WIDTH = 280;
+2 -1
View File
@@ -8,7 +8,8 @@ import { DEFAULT_LANG, checkLang } from './locale';
import { INBOX_SESSION_ID } from './session';
export const GITHUB = pkg.homepage;
export const CHANGELOG = `${pkg.homepage}/blob/master/CHANGELOG.md`;
export const CHANGELOG = urlJoin(GITHUB, 'blob/master/CHANGELOG.md');
export const WIKI = urlJoin(GITHUB, 'wiki');
export const ABOUT = pkg.homepage;
export const FEEDBACK = pkg.bugs.url;
export const DISCORD = 'https://discord.gg/AYFPHvv2jT';
+6
View File
@@ -0,0 +1,6 @@
import pkg from '@/../package.json';
export const CURRENT_VERSION = pkg.version;
export const MANUAL_UPGRADE_URL =
'https://github.com/lobehub/lobe-chat/blob/main/docs/Upstream-Sync.md';
+2 -2
View File
@@ -8,7 +8,7 @@ import { useGlobalStore } from '@/store/global';
export const useStyles = createStyles(({ css, token }) => ({
panel: css`
height: 100vh;
height: 100%;
color: ${token.colorTextSecondary};
background: ${token.colorBgContainer};
`,
@@ -48,7 +48,7 @@ const FolderPanel = memo<PropsWithChildren>(({ children }) => {
updatePreference({ sessionsWidth: nextWidth });
}}
placement="left"
size={{ height: '100vh', width: sessionsWidth }}
size={{ height: '100%', width: sessionsWidth }}
>
<DraggablePanelContainer style={{ flex: 'none', height: '100%', minWidth: FOLDER_WIDTH }}>
{children}
+107 -81
View File
@@ -1,6 +1,7 @@
import { ActionIcon, DiscordIcon, Icon } from '@lobehub/ui';
import { Dropdown, MenuProps, Upload } from 'antd';
import { Badge, ConfigProvider, Dropdown, MenuProps, Upload } from 'antd';
import {
Book,
Feather,
FileClock,
Github,
@@ -11,13 +12,14 @@ import {
Settings2,
} from 'lucide-react';
import { useRouter } from 'next/navigation';
import { memo, useMemo } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { ABOUT, CHANGELOG, DISCORD, FEEDBACK, GITHUB } from '@/const/url';
import { ABOUT, CHANGELOG, DISCORD, FEEDBACK, GITHUB, WIKI } from '@/const/url';
import { useExportConfig } from '@/hooks/useExportConfig';
import { useImportConfig } from '@/hooks/useImportConfig';
import { GlobalStore } from '@/store/global';
import { GlobalStore, useGlobalStore } from '@/store/global';
import { SidebarTabKey } from '@/store/global/initialState';
export interface BottomActionProps {
@@ -31,83 +33,97 @@ const BottomActions = memo<BottomActionProps>(({ tab, setTab }) => {
const { exportSessions, exportSettings, exportAll, exportAgents } = useExportConfig();
const { importConfig } = useImportConfig();
const items: MenuProps['items'] = useMemo(
() => [
{
icon: <Icon icon={HardDriveUpload} />,
key: 'import',
label: (
<Upload maxCount={1} onChange={importConfig} showUploadList={false}>
{t('import')}
</Upload>
),
},
{
children: [
{
key: 'allAgent',
label: <div>{t('exportType.allAgent')}</div>,
onClick: exportAgents,
},
{
key: 'allAgentWithMessage',
label: <div>{t('exportType.allAgentWithMessage')}</div>,
onClick: exportSessions,
},
{
key: 'globalSetting',
label: <div>{t('exportType.globalSetting')}</div>,
onClick: exportSettings,
},
{
type: 'divider',
},
{
key: 'all',
label: <div>{t('exportType.all')}</div>,
onClick: exportAll,
},
],
icon: <Icon icon={HardDriveDownload} />,
key: 'export',
label: t('export'),
},
{
type: 'divider',
},
{
icon: <Icon icon={Feather} />,
key: 'feedback',
label: t('feedback'),
onClick: () => window.open(FEEDBACK, '__blank'),
},
{
icon: <Icon icon={FileClock} />,
key: 'changelog',
label: t('changelog'),
onClick: () => window.open(CHANGELOG, '__blank'),
},
{
icon: <Icon icon={Heart} />,
key: 'about',
label: t('about'),
onClick: () => window.open(ABOUT, '__blank'),
},
{
type: 'divider',
},
{
icon: <Icon icon={Settings} />,
key: 'setting',
label: t('setting'),
onClick: () => {
setTab(SidebarTabKey.Setting);
router.push('/settings/common');
const [hasNewVersion, useCheckLatestVersion] = useGlobalStore((s) => [
s.hasNewVersion,
s.useCheckLatestVersion,
]);
useCheckLatestVersion();
const items: MenuProps['items'] = [
{
icon: <Icon icon={HardDriveUpload} />,
key: 'import',
label: (
<Upload maxCount={1} onChange={importConfig} showUploadList={false}>
{t('import')}
</Upload>
),
},
{
children: [
{
key: 'allAgent',
label: <div>{t('exportType.allAgent')}</div>,
onClick: exportAgents,
},
{
key: 'allAgentWithMessage',
label: <div>{t('exportType.allAgentWithMessage')}</div>,
onClick: exportSessions,
},
{
key: 'globalSetting',
label: <div>{t('exportType.globalSetting')}</div>,
onClick: exportSettings,
},
{
type: 'divider',
},
{
key: 'all',
label: <div>{t('exportType.all')}</div>,
onClick: exportAll,
},
],
icon: <Icon icon={HardDriveDownload} />,
key: 'export',
label: t('export'),
},
{
type: 'divider',
},
{
icon: <Icon icon={Feather} />,
key: 'feedback',
label: t('feedback'),
onClick: () => window.open(FEEDBACK, '__blank'),
},
{
icon: <Icon icon={FileClock} />,
key: 'changelog',
label: t('changelog'),
onClick: () => window.open(CHANGELOG, '__blank'),
},
{
icon: <Icon icon={Book} />,
key: 'wiki',
label: 'WIKI',
onClick: () => window.open(WIKI, '__blank'),
},
{
icon: <Icon icon={Heart} />,
key: 'about',
label: t('about'),
onClick: () => window.open(ABOUT, '__blank'),
},
{
type: 'divider',
},
{
icon: <Icon icon={Settings} />,
key: 'setting',
label: (
<Flexbox align={'center'} distribution={'space-between'} gap={8} horizontal>
{t('setting')} {hasNewVersion && <Badge count={t('upgradeVersion.hasNew')} />}
</Flexbox>
),
onClick: () => {
setTab(SidebarTabKey.Setting);
router.push('/settings/common');
},
],
[],
);
},
];
return (
<>
@@ -121,10 +137,20 @@ const BottomActions = memo<BottomActionProps>(({ tab, setTab }) => {
icon={Github}
onClick={() => window.open(GITHUB, '__blank')}
placement={'right'}
title={'Github'}
title={'GitHub'}
/>
<Dropdown arrow={false} menu={{ items }} trigger={['click']}>
<ActionIcon active={tab === SidebarTabKey.Setting} icon={Settings2} />
{hasNewVersion ? (
<Flexbox>
<ConfigProvider theme={{ components: { Badge: { dotSize: 8 } } }}>
<Badge dot offset={[-4, 4]}>
<ActionIcon active={tab === SidebarTabKey.Setting} icon={Settings2} />
</Badge>
</ConfigProvider>
</Flexbox>
) : (
<ActionIcon active={tab === SidebarTabKey.Setting} icon={Settings2} />
)}
</Dropdown>
</>
);
+1 -1
View File
@@ -14,7 +14,7 @@ export default memo(() => {
<SideNav
avatar={<AvatarWithUpload id={'avatar'} />}
bottomActions={<BottomActions setTab={setTab} tab={tab} />}
style={{ height: '100vh' }}
style={{ height: '100%' }}
topActions={<TopActions setTab={setTab} tab={tab} />}
/>
);
+1
View File
@@ -10,6 +10,7 @@ const AppLayoutDesktop = memo<PropsWithChildren>(({ children }) => {
const theme = useTheme();
return (
<Flexbox
height={'100%'}
horizontal
style={isPWA ? { borderTop: `1px solid ${theme.colorBorder}` } : {}}
width={'100%'}
+1 -1
View File
@@ -16,7 +16,7 @@ const useStyles = createStyles(({ css, cx, stylish }) => ({
overflow-y: auto;
width: 100vw;
height: 100vh;
height: 100%;
`,
),
mobileNavBar: css`
+3 -3
View File
@@ -20,9 +20,9 @@ export interface AppThemeProps {
const AppTheme = memo<AppThemeProps>(
({ children, defaultAppearance, defaultPrimaryColor, defaultNeutralColor }) => {
// console.log('server:appearance', defaultAppearance);
// console.log('server:primaryColor', defaultPrimaryColor);
// console.log('server:neutralColor', defaultNeutralColor);
// console.debug('server:appearance', defaultAppearance);
// console.debug('server:primaryColor', defaultPrimaryColor);
// console.debug('server:neutralColor', defaultNeutralColor);
const themeMode = useGlobalStore((s) => s.settings.themeMode);
const [primaryColor, neutralColor] = useGlobalStore((s) => [
+2 -2
View File
@@ -20,9 +20,9 @@ const InnerLocale = memo<LocaleLayoutProps>(({ children, lang }) => {
} else {
// if on browser side, init i18n instance only once
if (!i18n.instance.isInitialized)
// console.log('locale', lang);
// console.debug('locale', lang);
i18n.init().then(() => {
// console.log('inited.');
// console.debug('inited.');
});
}
+1 -1
View File
@@ -7,7 +7,7 @@ const Loading = memo(() => (
<div
style={{
backdropFilter: 'blur(3px)',
height: '100vh',
height: '100%',
width: '100vw',
zIndex: 100,
}}
+5
View File
@@ -96,5 +96,10 @@ export default {
},
updateAgent: '更新助理信息',
updatePrompt: '更新提示词',
upgradeVersion: {
action: '立即升级',
hasNew: '有可用更新',
newVersion: '有新版本可用:{{version}}',
},
warp: '换行',
};
+2 -1
View File
@@ -32,11 +32,12 @@ export default {
InvalidAccessCode: '密码不正确或为空,请输入正确的访问密码,或者添加自定义 OpenAI API Key',
OpenAIBizError: '请求 OpenAI 服务出错,请根据以下信息排查或重试',
NoAPIKey: 'OpenAI API Key 为空,请添加自定义 OpenAI API Key',
/* eslint-enable */
},
unlock: {
apikey: {
description: '输入你的 OpenAI API Key 即可绕过密码验证。应用不会记录你的 API Key',
description: '输入你的 OpenAI API Key 即可开始会话。应用不会记录你的 API Key',
title: '使用自定义 API Key',
},
closeMessage: '关闭提示',
+8 -1
View File
@@ -1,4 +1,3 @@
import type { Locales } from '@/types/locale';
type LocaleOptions = {
@@ -19,6 +18,14 @@ export const localeOptions: LocaleOptions = [
label: 'English',
value: 'en-US',
},
{
label: '日本語',
value: 'ja-JP',
},
{
label: '한국어',
value: 'ko-KR',
},
{
label: 'Russian',
value: 'ru-RU',
+4
View File
@@ -1,10 +1,14 @@
import en_US from './en_US';
import ja_JP from './ja_JP';
import ko_KR from './ko_KR';
import ru_RU from './ru_RU';
import zh_CN from './zh_CN';
import zh_TW from './zh_TW';
const resources = {
'en-US': en_US,
'ja-JP': ja_JP,
'ko-KR': ko_KR,
'ru-RU': ru_RU,
'zh-CN': zh_CN,
'zh-TW': zh_TW,
+19
View File
@@ -0,0 +1,19 @@
import common from '../../../locales/ja_JP/common.json';
import empty from '../../../locales/ja_JP/empty.json';
import error from '../../../locales/ja_JP/error.json';
import market from '../../../locales/ja_JP/market.json';
import plugin from '../../../locales/ja_JP/plugin.json';
import setting from '../../../locales/ja_JP/setting.json';
import welcome from '../../../locales/ja_JP/welcome.json';
const resources = {
common,
empty,
error,
market,
plugin,
setting,
welcome,
} as const;
export default resources;
+19
View File
@@ -0,0 +1,19 @@
import common from '../../../locales/ko_KR/common.json';
import empty from '../../../locales/ko_KR/empty.json';
import error from '../../../locales/ko_KR/error.json';
import market from '../../../locales/ko_KR/market.json';
import plugin from '../../../locales/ko_KR/plugin.json';
import setting from '../../../locales/ko_KR/setting.json';
import welcome from '../../../locales/ko_KR/welcome.json';
const resources = {
common,
empty,
error,
market,
plugin,
setting,
welcome,
} as const;
export default resources;
+11 -1
View File
@@ -1 +1,11 @@
fetch('https://registry.npmmirror.com/@lobehub/chat');
const VERSION_URL = 'https://registry.npmmirror.com/@lobehub/chat';
/**
* get latest version from npm
*/
export const featLatestVersion = async (): Promise<string> => {
const res = await fetch(VERSION_URL);
const data = await res.json();
return data['dist-tags']?.latest;
};

Some files were not shown because too many files have changed in this diff Show More