Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d89d1e288d | ||
|
|
cd89d11d0b | ||
|
|
cf0053a060 | ||
|
|
019da4399e | ||
|
|
044961bb01 | ||
|
|
2374c81edb | ||
|
|
699760713e | ||
|
|
d75413cc49 | ||
|
|
8175f199d2 | ||
|
|
f8c2f396c1 | ||
|
|
8217647df8 | ||
|
|
288c9eeeca | ||
|
|
4d09ff7c8a | ||
|
|
5fa059017c | ||
|
|
323f10844b | ||
|
|
ee035390db | ||
|
|
be743bf799 | ||
|
|
a59f84f2bf | ||
|
|
ed0cf2997d | ||
|
|
7f00c74097 | ||
|
|
f007417fa4 | ||
|
|
27c5e2a3ac | ||
|
|
e90dc0c12b | ||
|
|
837fd8c9ff | ||
|
|
ce0b1004f3 | ||
|
|
1ff1c46e37 | ||
|
|
afa3e499dc | ||
|
|
70ce5746bc | ||
|
|
35d4292d29 | ||
|
|
8bbc44e7bf | ||
|
|
3dcb4be6e4 | ||
|
|
83f8072625 | ||
|
|
3992121b71 | ||
|
|
d08806f0c9 | ||
|
|
85ac73efcc | ||
|
|
7cc5a6b347 | ||
|
|
983e4d436d | ||
|
|
727826f1b1 | ||
|
|
386659109c | ||
|
|
bd9e8bf45e | ||
|
|
4e40530a8c | ||
|
|
ea69a350f4 |
52
README.md
52
README.md
@@ -1,14 +1,29 @@
|
|||||||
<p align="center">
|
<div align="center">
|
||||||
<img alt="demo" src="./demos/demo.gif?v=1">
|
<h1>ChatGPT UI</h1>
|
||||||
</p>
|
</div>
|
||||||
|
|
||||||
[English](./README.md) | [中文](./docs/zh/README.md)
|
[English](./README.md) | [中文](./docs/zh/README.md)
|
||||||
|
|
||||||
# ChatGPT UI
|
|
||||||
|
|
||||||
A ChatGPT web client that supports multiple users, multiple database connections for persistent data storage, supports i18n. Provides Docker images and quick deployment scripts.
|
A ChatGPT web client that supports multiple users, multiple database connections for persistent data storage, supports i18n. Provides Docker images and quick deployment scripts.
|
||||||
|
|
||||||
|
https://user-images.githubusercontent.com/46235412/227156264-ca17ab17-999b-414f-ab06-3f75b5235bfe.mp4
|
||||||
|
|
||||||
|
|
||||||
## 📢Updates
|
## 📢Updates
|
||||||
|
|
||||||
|
<details open>
|
||||||
|
<summary><strong>2023-03-27</strong></summary>
|
||||||
|
🚀 Support gpt-4 model. You can select the model in the "Model Parameters" of the front-end.
|
||||||
|
The GPT-4 model requires whitelist access from OpenAI.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details open>
|
||||||
|
<summary><strong>2023-03-23</strong></summary>
|
||||||
|
Added web search capability to generate more relevant and up-to-date answers from ChatGPT!
|
||||||
|
This feature is off by default, you can turn it on in `Chat->Settings` in the admin panel, there is a record `open_web_search` in Settings, set its value to True.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
<summary><strong>2023-03-15</strong></summary>
|
<summary><strong>2023-03-15</strong></summary>
|
||||||
|
|
||||||
@@ -17,17 +32,7 @@ Add "open_registration" setting option in the admin panel to control whether use
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details open>
|
<details>
|
||||||
<summary><strong>2023-03-10</strong></summary>
|
|
||||||
|
|
||||||
Add 2 environment variables to control the typewriter effect:
|
|
||||||
|
|
||||||
- `NUXT_PUBLIC_TYPEWRITER=true` to enable/disable the typewriter effect
|
|
||||||
- `NUXT_PUBLIC_TYPEWRITER_DELAY=50` to set the delay time for each character in milliseconds.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details open>
|
|
||||||
<summary><strong>2023-03-04</strong></summary>
|
<summary><strong>2023-03-04</strong></summary>
|
||||||
|
|
||||||
**Update to the latest official chat model** `gpt-3.5-turbo`
|
**Update to the latest official chat model** `gpt-3.5-turbo`
|
||||||
@@ -90,9 +95,6 @@ services:
|
|||||||
image: wongsaang/chatgpt-ui-client:latest
|
image: wongsaang/chatgpt-ui-client:latest
|
||||||
environment:
|
environment:
|
||||||
- SERVER_DOMAIN=http://backend-web-server
|
- SERVER_DOMAIN=http://backend-web-server
|
||||||
- NUXT_PUBLIC_APP_NAME='ChatGPT UI' # App name
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER=true # Enable typewriter effect, default is false
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER_DELAY=100 # Typewriter effect delay time, default is 50ms
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend-web-server
|
- backend-web-server
|
||||||
ports:
|
ports:
|
||||||
@@ -108,12 +110,14 @@ services:
|
|||||||
- DJANGO_SUPERUSER_USERNAME=admin # default superuser name
|
- DJANGO_SUPERUSER_USERNAME=admin # default superuser name
|
||||||
- DJANGO_SUPERUSER_PASSWORD=password # default superuser password
|
- DJANGO_SUPERUSER_PASSWORD=password # default superuser password
|
||||||
- DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
|
- DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
|
||||||
|
- ACCOUNT_EMAIL_VERIFICATION=none # Determines the e-mail verification method during signup – choose one of "none", "optional", or "mandatory". Default is "optional". If you don't need to verify the email, you can set it to "none".
|
||||||
# If you want to use the email verification function, you need to configure the following parameters
|
# If you want to use the email verification function, you need to configure the following parameters
|
||||||
# - EMAIL_HOST=SMTP server address
|
# - EMAIL_HOST=SMTP server address
|
||||||
# - EMAIL_PORT=SMTP server port
|
# - EMAIL_PORT=SMTP server port
|
||||||
# - EMAIL_HOST_USER=
|
# - EMAIL_HOST_USER=
|
||||||
# - EMAIL_HOST_PASSWORD=
|
# - EMAIL_HOST_PASSWORD=
|
||||||
# - EMAIL_USE_TLS=True
|
# - EMAIL_USE_TLS=True
|
||||||
|
# - EMAIL_FROM=no-reply@example.com #Default sender email address
|
||||||
ports:
|
ports:
|
||||||
- '8000:8000'
|
- '8000:8000'
|
||||||
networks:
|
networks:
|
||||||
@@ -155,6 +159,16 @@ Before you can start chatting, you need to add an OpenAI API key. In the Setting
|
|||||||
|
|
||||||
Now you can access the web client at `http(s)://your.domain` or `http://123.123.123.123` to start chatting.
|
Now you can access the web client at `http(s)://your.domain` or `http://123.123.123.123` to start chatting.
|
||||||
|
|
||||||
|
## Donation
|
||||||
|
|
||||||
|
> If it is helpful to you, it is also helping me.
|
||||||
|
|
||||||
|
If you want to support me, Buy me a coffee ❤️ [https://www.buymeacoffee.com/WongSaang](https://www.buymeacoffee.com/WongSaang)
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img height="150" src="https://github.com/WongSaang/chatgpt-ui/blob/main/demos/bmc_qr.png?raw=true"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|||||||
1
app.vue
1
app.vue
@@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VitePwaManifest />
|
|
||||||
<NuxtLoadingIndicator />
|
<NuxtLoadingIndicator />
|
||||||
<NuxtLayout>
|
<NuxtLayout>
|
||||||
<NuxtPage />
|
<NuxtPage />
|
||||||
|
|||||||
@@ -9,6 +9,14 @@ const props = defineProps({
|
|||||||
messageIndex: {
|
messageIndex: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
usePrompt: {
|
||||||
|
type: Function,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
deleteMessage: {
|
||||||
|
type: Function,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -24,12 +32,16 @@ const copyMessage = () => {
|
|||||||
showSnackbar('Copied!')
|
showSnackbar('Copied!')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const editMessage = () => {
|
||||||
|
props.usePrompt(props.message.message)
|
||||||
|
}
|
||||||
|
|
||||||
const deleteMessage = async () => {
|
const deleteMessage = async () => {
|
||||||
const { data, error } = await useAuthFetch(`/api/chat/messages/${props.message.id}/`, {
|
const { data, error } = await useAuthFetch(`/api/chat/messages/${props.message.id}/`, {
|
||||||
method: 'DELETE'
|
method: 'DELETE'
|
||||||
})
|
})
|
||||||
if (!error.value) {
|
if (!error.value) {
|
||||||
this.$emit('deleteMessage', props.messageIndex)
|
props.deleteMessage(props.messageIndex)
|
||||||
showSnackbar('Deleted!')
|
showSnackbar('Deleted!')
|
||||||
}
|
}
|
||||||
showSnackbar('Delete failed')
|
showSnackbar('Delete failed')
|
||||||
@@ -53,14 +65,22 @@ const deleteMessage = async () => {
|
|||||||
<v-list>
|
<v-list>
|
||||||
<v-list-item
|
<v-list-item
|
||||||
@click="copyMessage()"
|
@click="copyMessage()"
|
||||||
|
:title="$t('copy')"
|
||||||
|
prepend-icon="content_copy"
|
||||||
|
>
|
||||||
|
</v-list-item>
|
||||||
|
<v-list-item
|
||||||
|
@click="editMessage()"
|
||||||
|
:title="$t('edit')"
|
||||||
|
prepend-icon="edit"
|
||||||
|
>
|
||||||
|
</v-list-item>
|
||||||
|
<v-list-item
|
||||||
|
@click="deleteMessage()"
|
||||||
|
:title="$t('delete')"
|
||||||
|
prepend-icon="delete"
|
||||||
>
|
>
|
||||||
<v-list-item-title>{{ $t('copy') }}</v-list-item-title>
|
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<!-- <v-list-item-->
|
|
||||||
<!-- @click="deleteMessage()"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <v-list-item-title>{{ $t('delete') }}</v-list-item-title>-->
|
|
||||||
<!-- </v-list-item>-->
|
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-menu>
|
</v-menu>
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
|
||||||
const dialog = ref(false)
|
const dialog = ref(false)
|
||||||
const currentModel = useCurrentModel()
|
const currentModel = useCurrentModel()
|
||||||
const availableModels = [
|
const availableModels = [
|
||||||
DEFAULT_MODEL.name
|
'gpt-3.5-turbo',
|
||||||
|
'gpt-4'
|
||||||
]
|
]
|
||||||
|
const currentModelDefault = ref(MODELS[currentModel.value.name])
|
||||||
|
|
||||||
watch(currentModel, (newVal, oldVal) => {
|
watch(currentModel, (newVal, oldVal) => {
|
||||||
|
currentModelDefault.value = MODELS[newVal.name]
|
||||||
saveCurrentModel(newVal)
|
saveCurrentModel(newVal)
|
||||||
}, { deep: true })
|
}, { deep: true })
|
||||||
|
|
||||||
@@ -83,7 +87,7 @@ watch(currentModel, (newVal, oldVal) => {
|
|||||||
single-line
|
single-line
|
||||||
density="compact"
|
density="compact"
|
||||||
type="number"
|
type="number"
|
||||||
max="2048"
|
:max="currentModelDefault.total_tokens"
|
||||||
step="1"
|
step="1"
|
||||||
style="width: 100px"
|
style="width: 100px"
|
||||||
class="flex-grow-0"
|
class="flex-grow-0"
|
||||||
@@ -93,7 +97,7 @@ watch(currentModel, (newVal, oldVal) => {
|
|||||||
<v-col cols="12">
|
<v-col cols="12">
|
||||||
<v-slider
|
<v-slider
|
||||||
v-model="currentModel.max_tokens"
|
v-model="currentModel.max_tokens"
|
||||||
:max="2048"
|
:max="currentModelDefault.total_tokens"
|
||||||
:step="1"
|
:step="1"
|
||||||
hide-details
|
hide-details
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -12,14 +12,19 @@ const md = new MarkdownIt({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const props = defineProps(['content'])
|
const props = defineProps({
|
||||||
|
message: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const contentHtml = ref('')
|
const contentHtml = ref('')
|
||||||
|
|
||||||
const contentElm = ref(null)
|
const contentElm = ref(null)
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
contentHtml.value = props.content ? md.render(props.content) : ''
|
contentHtml.value = props.message.message ? md.render(props.message.message) : ''
|
||||||
})
|
})
|
||||||
|
|
||||||
const bindCopyCodeToButtons = () => {
|
const bindCopyCodeToButtons = () => {
|
||||||
@@ -54,11 +59,19 @@ onUpdated(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div
|
<v-card
|
||||||
ref="contentElm"
|
:color="message.is_bot ? '' : 'primary'"
|
||||||
v-html="contentHtml"
|
rounded="lg"
|
||||||
class="chat-msg-content"
|
elevation="2"
|
||||||
></div>
|
>
|
||||||
|
<v-card-text>
|
||||||
|
<div
|
||||||
|
ref="contentElm"
|
||||||
|
v-html="contentHtml"
|
||||||
|
class="chat-msg-content"
|
||||||
|
></div>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -1,17 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-textarea
|
<div
|
||||||
v-model="message"
|
class="flex-grow-1 d-flex align-center justify-space-between"
|
||||||
:label="$t('writeAMessage')"
|
>
|
||||||
:placeholder="hint"
|
<v-textarea
|
||||||
rows="1"
|
v-model="message"
|
||||||
:auto-grow="autoGrow"
|
:label="$t('writeAMessage')"
|
||||||
:disabled="disabled"
|
:placeholder="hint"
|
||||||
:loading="loading"
|
:rows="rows"
|
||||||
:hide-details="true"
|
max-rows="8"
|
||||||
append-inner-icon="send"
|
:auto-grow="autoGrow"
|
||||||
@keyup.enter.exact="enterOnly"
|
:disabled="disabled"
|
||||||
@click:appendInner="clickSendBtn"
|
:loading="loading"
|
||||||
></v-textarea>
|
:hide-details="true"
|
||||||
|
clearable
|
||||||
|
variant="outlined"
|
||||||
|
@keydown.enter.exact="enterOnly"
|
||||||
|
></v-textarea>
|
||||||
|
<v-btn
|
||||||
|
:disabled="loading"
|
||||||
|
icon="send"
|
||||||
|
title="Send"
|
||||||
|
class="ml-3"
|
||||||
|
@click="clickSendBtn"
|
||||||
|
></v-btn>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -39,7 +51,7 @@ export default {
|
|||||||
message(val) {
|
message(val) {
|
||||||
const lines = val.split(/\r\n|\r|\n/).length;
|
const lines = val.split(/\r\n|\r|\n/).length;
|
||||||
if (lines > 8) {
|
if (lines > 8) {
|
||||||
this.rows = lines;
|
this.rows = 8;
|
||||||
this.autoGrow = false;
|
this.autoGrow = false;
|
||||||
} else {
|
} else {
|
||||||
this.rows = 1;
|
this.rows = 1;
|
||||||
@@ -65,7 +77,8 @@ export default {
|
|||||||
clickSendBtn () {
|
clickSendBtn () {
|
||||||
this.send()
|
this.send()
|
||||||
},
|
},
|
||||||
enterOnly () {
|
enterOnly (event) {
|
||||||
|
event.preventDefault();
|
||||||
if (!isMobile()) {
|
if (!isMobile()) {
|
||||||
this.send()
|
this.send()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
const menu = ref(false)
|
const menu = ref(false)
|
||||||
const prompts = ref([])
|
const prompts = ref([])
|
||||||
const editingPrompt = ref(null)
|
const editingPrompt = ref(null)
|
||||||
|
const newTitlePrompt = ref(null)
|
||||||
const newPrompt = ref('')
|
const newPrompt = ref('')
|
||||||
const submittingNewPrompt = ref(false)
|
const submittingNewPrompt = ref(false)
|
||||||
const promptInputErrorMessage = ref('')
|
const promptInputErrorMessage = ref('')
|
||||||
@@ -24,11 +25,13 @@ const addPrompt = async () => {
|
|||||||
const { data, error } = await useAuthFetch('/api/chat/prompts/', {
|
const { data, error } = await useAuthFetch('/api/chat/prompts/', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
|
title: newTitlePrompt.value,
|
||||||
prompt: newPrompt.value
|
prompt: newPrompt.value
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
if (!error.value) {
|
if (!error.value) {
|
||||||
prompts.value.push(data.value)
|
prompts.value.push(data.value)
|
||||||
|
newTitlePrompt.value = null
|
||||||
newPrompt.value = ''
|
newPrompt.value = ''
|
||||||
}
|
}
|
||||||
submittingNewPrompt.value = false
|
submittingNewPrompt.value = false
|
||||||
@@ -43,6 +46,7 @@ const updatePrompt = async (index) => {
|
|||||||
const { data, error } = await useAuthFetch(`/api/chat/prompts/${editingPrompt.value.id}/`, {
|
const { data, error } = await useAuthFetch(`/api/chat/prompts/${editingPrompt.value.id}/`, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
|
title: editingPrompt.value.title,
|
||||||
prompt: editingPrompt.value.prompt
|
prompt: editingPrompt.value.prompt
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -96,10 +100,12 @@ onMounted( () => {
|
|||||||
<template v-slot:activator="{ props }">
|
<template v-slot:activator="{ props }">
|
||||||
<v-btn
|
<v-btn
|
||||||
v-bind="props"
|
v-bind="props"
|
||||||
icon="speaker_notes"
|
icon
|
||||||
title="Common prompts"
|
>
|
||||||
class="mr-3"
|
<v-icon
|
||||||
></v-btn>
|
icon="speaker_notes"
|
||||||
|
></v-icon>
|
||||||
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<v-container>
|
<v-container>
|
||||||
@@ -108,7 +114,7 @@ onMounted( () => {
|
|||||||
max-width="500"
|
max-width="500"
|
||||||
>
|
>
|
||||||
<v-card-title>
|
<v-card-title>
|
||||||
<span class="headline">Frequently prompts</span>
|
<span class="headline">{{ $t('frequentlyPrompts') }}</span>
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
|
|
||||||
<v-divider></v-divider>
|
<v-divider></v-divider>
|
||||||
@@ -125,35 +131,47 @@ onMounted( () => {
|
|||||||
>
|
>
|
||||||
<v-list-item
|
<v-list-item
|
||||||
active-color="primary"
|
active-color="primary"
|
||||||
rounded="xl"
|
|
||||||
v-if="editingPrompt && editingPrompt.id === prompt.id"
|
v-if="editingPrompt && editingPrompt.id === prompt.id"
|
||||||
>
|
>
|
||||||
<v-textarea
|
<div class="d-flex flex-row" :style="{ marginTop: '5px' }">
|
||||||
rows="2"
|
<div class="flex-grow-1">
|
||||||
v-model="editingPrompt.prompt"
|
<v-text-field
|
||||||
:loading="editingPrompt.updating"
|
v-model="editingPrompt.title"
|
||||||
variant="underlined"
|
:loading="editingPrompt.updating"
|
||||||
hide-details
|
:label="$t('titlePrompt')"
|
||||||
density="compact"
|
variant="underlined"
|
||||||
>
|
density="compact"
|
||||||
<template v-slot:append>
|
hide-details
|
||||||
<div class="d-flex flex-column">
|
>
|
||||||
<v-btn
|
</v-text-field>
|
||||||
icon="done"
|
<v-textarea
|
||||||
variant="text"
|
rows="2"
|
||||||
:loading="editingPrompt.updating"
|
v-model="editingPrompt.prompt"
|
||||||
@click="updatePrompt(idx)"
|
:loading="editingPrompt.updating"
|
||||||
>
|
variant="underlined"
|
||||||
</v-btn>
|
density="compact"
|
||||||
<v-btn
|
hide-details
|
||||||
icon="close"
|
>
|
||||||
variant="text"
|
</v-textarea>
|
||||||
@click="cancelEditPrompt()"
|
</div>
|
||||||
>
|
<div>
|
||||||
</v-btn>
|
<div class="d-flex flex-column">
|
||||||
</div>
|
<v-btn
|
||||||
</template>
|
icon="done"
|
||||||
</v-textarea>
|
variant="text"
|
||||||
|
:loading="editingPrompt.updating"
|
||||||
|
@click="updatePrompt(idx)"
|
||||||
|
>
|
||||||
|
</v-btn>
|
||||||
|
<v-btn
|
||||||
|
icon="close"
|
||||||
|
variant="text"
|
||||||
|
@click="cancelEditPrompt()"
|
||||||
|
>
|
||||||
|
</v-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item
|
<v-list-item
|
||||||
v-if="!editingPrompt || editingPrompt.id !== prompt.id"
|
v-if="!editingPrompt || editingPrompt.id !== prompt.id"
|
||||||
@@ -161,7 +179,7 @@ onMounted( () => {
|
|||||||
active-color="primary"
|
active-color="primary"
|
||||||
@click="selectPrompt(prompt)"
|
@click="selectPrompt(prompt)"
|
||||||
>
|
>
|
||||||
<v-list-item-title>{{ prompt.prompt }}</v-list-item-title>
|
<v-list-item-title>{{ prompt.title ? prompt.title : prompt.prompt }}</v-list-item-title>
|
||||||
<template v-slot:append>
|
<template v-slot:append>
|
||||||
<v-btn
|
<v-btn
|
||||||
icon="edit"
|
icon="edit"
|
||||||
@@ -182,6 +200,25 @@ onMounted( () => {
|
|||||||
</v-list-item>
|
</v-list-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<v-list-item
|
||||||
|
active-color="primary"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="pt-3"
|
||||||
|
>
|
||||||
|
<v-text-field
|
||||||
|
rows="1"
|
||||||
|
v-model="newTitlePrompt"
|
||||||
|
:label="$t('titlePrompt')"
|
||||||
|
variant="outlined"
|
||||||
|
density="compact"
|
||||||
|
hide-details
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
</v-text-field>
|
||||||
|
</div>
|
||||||
|
</v-list-item>
|
||||||
|
|
||||||
<v-list-item
|
<v-list-item
|
||||||
active-color="primary"
|
active-color="primary"
|
||||||
>
|
>
|
||||||
@@ -191,7 +228,7 @@ onMounted( () => {
|
|||||||
<v-textarea
|
<v-textarea
|
||||||
rows="2"
|
rows="2"
|
||||||
v-model="newPrompt"
|
v-model="newPrompt"
|
||||||
label="Add a new prompt"
|
:label="$t('addNewPrompt')"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
density="compact"
|
density="compact"
|
||||||
:error-messages="promptInputErrorMessage"
|
:error-messages="promptInputErrorMessage"
|
||||||
@@ -209,7 +246,7 @@ onMounted( () => {
|
|||||||
@click="addPrompt()"
|
@click="addPrompt()"
|
||||||
>
|
>
|
||||||
<v-icon icon="add"></v-icon>
|
<v-icon icon="add"></v-icon>
|
||||||
Add prompt
|
{{ $t('addPrompt') }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
|
|||||||
@@ -15,26 +15,23 @@
|
|||||||
</template>
|
</template>
|
||||||
<v-card>
|
<v-card>
|
||||||
<v-toolbar
|
<v-toolbar
|
||||||
dark
|
|
||||||
color="primary"
|
|
||||||
>
|
>
|
||||||
<v-btn
|
<v-btn
|
||||||
icon
|
icon
|
||||||
dark
|
|
||||||
@click="dialog = false"
|
@click="dialog = false"
|
||||||
>
|
>
|
||||||
<v-icon>close</v-icon>
|
<v-icon icon="close"></v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-toolbar-title>{{ $t('language') }}</v-toolbar-title>
|
<v-toolbar-title>{{ $t('language') }}</v-toolbar-title>
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
<!-- <v-toolbar-items>-->
|
<v-toolbar-items>
|
||||||
<!-- <v-btn-->
|
<v-btn
|
||||||
<!-- variant="text"-->
|
variant="text"
|
||||||
<!-- @click="dialog = false"-->
|
@click="dialog = false"
|
||||||
<!-- >-->
|
>
|
||||||
<!-- Save-->
|
Save
|
||||||
<!-- </v-btn>-->
|
</v-btn>
|
||||||
<!-- </v-toolbar-items>-->
|
</v-toolbar-items>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
<v-list
|
<v-list
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
export const useModels = () => useState('models', () => getStoredModels())
|
// export const useModels = () => useState('models', () => getStoredModels())
|
||||||
|
|
||||||
export const useCurrentModel = () => useState('currentModel', () => getCurrentModel())
|
export const useCurrentModel = () => useState('currentModel', () => getCurrentModel())
|
||||||
|
|
||||||
@@ -8,3 +8,5 @@ export const useApiKey = () => useState('apiKey', () => getStoredApiKey())
|
|||||||
export const useConversion = () => useState('conversion', () => getDefaultConversionData())
|
export const useConversion = () => useState('conversion', () => getDefaultConversionData())
|
||||||
|
|
||||||
export const useConversions = () => useState('conversions', () => [])
|
export const useConversions = () => useState('conversions', () => [])
|
||||||
|
|
||||||
|
export const useSettings = () => useState('settings', () => {})
|
||||||
BIN
demos/bmc_qr.png
Normal file
BIN
demos/bmc_qr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
BIN
demos/demo.mp4
Normal file
BIN
demos/demo.mp4
Normal file
Binary file not shown.
@@ -65,6 +65,6 @@ sudo curl -L "https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker
|
|||||||
|
|
||||||
echo "Starting services..."
|
echo "Starting services..."
|
||||||
|
|
||||||
sudo APP_DOMAIN="${APP_DOMAIN}:${SERVER_PORT}" CLIENT_PORT=${CLIENT_PORT} SERVER_PORT=${SERVER_PORT} WSGI_PORT=${WSGI_PORT} docker-compose up --pull -d
|
sudo APP_DOMAIN="${APP_DOMAIN}:${SERVER_PORT}" CLIENT_PORT=${CLIENT_PORT} SERVER_PORT=${SERVER_PORT} WSGI_PORT=${WSGI_PORT} docker-compose up --pull always -d
|
||||||
|
|
||||||
echo "Done"
|
echo "Done"
|
||||||
16
docker-compose.dev.yml
Normal file
16
docker-compose.dev.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
client:
|
||||||
|
platform: linux/x86_64
|
||||||
|
build: .
|
||||||
|
environment:
|
||||||
|
SERVER_DOMAIN: http://web-server
|
||||||
|
ports:
|
||||||
|
- '${CLIENT_PORT:-8080}:80'
|
||||||
|
networks:
|
||||||
|
- chatgpt_network
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
networks:
|
||||||
|
chatgpt_network:
|
||||||
|
external: True
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
client:
|
client:
|
||||||
|
platform: linux/x86_64
|
||||||
image: wongsaang/chatgpt-ui-client:latest
|
image: wongsaang/chatgpt-ui-client:latest
|
||||||
environment:
|
environment:
|
||||||
- SERVER_DOMAIN=http://backend-web-server
|
- SERVER_DOMAIN=http://backend-web-server
|
||||||
- NUXT_PUBLIC_APP_NAME='ChatGPT UI'
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER=true
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER_DELAY=100
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend-web-server
|
- backend-web-server
|
||||||
ports:
|
ports:
|
||||||
@@ -15,6 +13,7 @@ services:
|
|||||||
- chatgpt_ui_network
|
- chatgpt_ui_network
|
||||||
restart: always
|
restart: always
|
||||||
backend-wsgi-server:
|
backend-wsgi-server:
|
||||||
|
platform: linux/x86_64
|
||||||
image: wongsaang/chatgpt-ui-wsgi-server:latest
|
image: wongsaang/chatgpt-ui-wsgi-server:latest
|
||||||
environment:
|
environment:
|
||||||
- APP_DOMAIN=${APP_DOMAIN:-localhost:9000}
|
- APP_DOMAIN=${APP_DOMAIN:-localhost:9000}
|
||||||
@@ -22,18 +21,21 @@ services:
|
|||||||
- DJANGO_SUPERUSER_USERNAME=admin # default superuser name
|
- DJANGO_SUPERUSER_USERNAME=admin # default superuser name
|
||||||
- DJANGO_SUPERUSER_PASSWORD=password # default superuser password
|
- DJANGO_SUPERUSER_PASSWORD=password # default superuser password
|
||||||
- DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
|
- DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
|
||||||
|
- ACCOUNT_EMAIL_VERIFICATION=${ACCOUNT_EMAIL_VERIFICATION:-none} # Determines the e-mail verification method during signup – choose one of "none", "optional", or "mandatory". Default is "optional". If you don't need to verify the email, you can set it to "none".
|
||||||
# If you want to use the email verification function, you need to configure the following parameters
|
# If you want to use the email verification function, you need to configure the following parameters
|
||||||
# - EMAIL_HOST=SMTP server address
|
# - EMAIL_HOST=SMTP server address
|
||||||
# - EMAIL_PORT=SMTP server port
|
# - EMAIL_PORT=SMTP server port
|
||||||
# - EMAIL_HOST_USER=
|
# - EMAIL_HOST_USER=
|
||||||
# - EMAIL_HOST_PASSWORD=
|
# - EMAIL_HOST_PASSWORD=
|
||||||
# - EMAIL_USE_TLS=True
|
# - EMAIL_USE_TLS=True
|
||||||
|
# - EMAIL_FROM=no-reply@example.com #Default sender email address
|
||||||
ports:
|
ports:
|
||||||
- '${WSGI_PORT:-8000}:8000'
|
- '${WSGI_PORT:-8000}:8000'
|
||||||
networks:
|
networks:
|
||||||
- chatgpt_ui_network
|
- chatgpt_ui_network
|
||||||
restart: always
|
restart: always
|
||||||
backend-web-server:
|
backend-web-server:
|
||||||
|
platform: linux/x86_64
|
||||||
image: wongsaang/chatgpt-ui-web-server:latest
|
image: wongsaang/chatgpt-ui-web-server:latest
|
||||||
environment:
|
environment:
|
||||||
- BACKEND_URL=http://backend-wsgi-server:8000
|
- BACKEND_URL=http://backend-wsgi-server:8000
|
||||||
|
|||||||
@@ -1,14 +1,27 @@
|
|||||||
<p align="center">
|
<div align="center">
|
||||||
<img alt="demo" src="../../demos/demo.gif?v=1">
|
<h1>ChatGPT UI</h1>
|
||||||
</p>
|
</div>
|
||||||
|
|
||||||
[English](../../README.md) | [中文](./docs/zh/README.md)
|
[English](../../README.md) | [中文](./docs/zh/README.md)
|
||||||
|
|
||||||
# ChatGPT UI
|
|
||||||
|
|
||||||
ChatGPT Web 客户端,支持多用户,支持 Mysql、PostgreSQL 等多种数据库连接进行数据持久化存储,支持多语言。提供 Docker 镜像和快速部署脚本。
|
ChatGPT Web 客户端,支持多用户,支持 Mysql、PostgreSQL 等多种数据库连接进行数据持久化存储,支持多语言。提供 Docker 镜像和快速部署脚本。
|
||||||
|
|
||||||
|
https://user-images.githubusercontent.com/46235412/227156264-ca17ab17-999b-414f-ab06-3f75b5235bfe.mp4
|
||||||
|
|
||||||
|
|
||||||
## 📢 更新
|
## 📢 更新
|
||||||
|
|
||||||
|
<details open>
|
||||||
|
<summary><strong>2023-03-27</strong></summary>
|
||||||
|
🚀 支持 gpt-4 模型。你可以在前端的“模型参数”中选择模型,gpt-4 模型需要通过 openai 的白名单才能使用。
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details open>
|
||||||
|
<summary><strong>2023-03-23</strong></summary>
|
||||||
|
增加网页搜索能力,使得 ChatGPT 生成的回答更与时俱进!
|
||||||
|
该功能默认处于关闭状态,你可以在管理后台的 `Chat->Settings` 中开启它,在 Settings 中有一个 `open_web_search` 的记录,把它的值设置为 True。
|
||||||
|
</details>
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
<summary><strong>2023-03-15</strong></summary>
|
<summary><strong>2023-03-15</strong></summary>
|
||||||
|
|
||||||
@@ -16,17 +29,7 @@ ChatGPT Web 客户端,支持多用户,支持 Mysql、PostgreSQL 等多种数
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details open>
|
<details>
|
||||||
<summary><strong>2023-03-10</strong></summary>
|
|
||||||
|
|
||||||
增加 2 个环境变量来控制打字机效果, 详见下方 docker-compose 配置的环境变量说明
|
|
||||||
|
|
||||||
- `NUXT_PUBLIC_TYPEWRITER` 是否开启打字机效果
|
|
||||||
- `NUXT_PUBLIC_TYPEWRITER_DELAY` 每个字的延迟时间,单位:毫秒
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details open>
|
|
||||||
<summary><strong>2023-03-04</strong></summary>
|
<summary><strong>2023-03-04</strong></summary>
|
||||||
|
|
||||||
**使用最新的官方聊天模型** `gpt-3.5-turbo`
|
**使用最新的官方聊天模型** `gpt-3.5-turbo`
|
||||||
@@ -88,9 +91,6 @@ services:
|
|||||||
image: wongsaang/chatgpt-ui-client:latest
|
image: wongsaang/chatgpt-ui-client:latest
|
||||||
environment:
|
environment:
|
||||||
- SERVER_DOMAIN=http://backend-web-server
|
- SERVER_DOMAIN=http://backend-web-server
|
||||||
- NUXT_PUBLIC_APP_NAME='ChatGPT UI' # App 名称,默认为 ChatGPT UI
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER=true # 是否启用打字机效果,默认关闭
|
|
||||||
- NUXT_PUBLIC_TYPEWRITER_DELAY=100 # 打字机效果的延迟时间,默认 50毫秒
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend-web-server
|
- backend-web-server
|
||||||
ports:
|
ports:
|
||||||
@@ -106,12 +106,14 @@ services:
|
|||||||
- DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户
|
- DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户
|
||||||
- DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码
|
- DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码
|
||||||
- DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱
|
- DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱
|
||||||
|
- ACCOUNT_EMAIL_VERIFICATION=none # 邮箱验证方式,可选值: none, optional, mandatory. 默认为 optional。如果你不需要验证用户的邮箱,可以设置为 none。
|
||||||
# 如果您想使用电子邮件验证功能,需要配置以下参数:
|
# 如果您想使用电子邮件验证功能,需要配置以下参数:
|
||||||
# - EMAIL_HOST=SMTP server address
|
# - EMAIL_HOST=SMTP server address
|
||||||
# - EMAIL_PORT=SMTP server port
|
# - EMAIL_PORT=SMTP server port
|
||||||
# - EMAIL_HOST_USER=
|
# - EMAIL_HOST_USER=
|
||||||
# - EMAIL_HOST_PASSWORD=
|
# - EMAIL_HOST_PASSWORD=
|
||||||
# - EMAIL_USE_TLS=True
|
# - EMAIL_USE_TLS=True
|
||||||
|
# - EMAIL_FROM=no-reply@example.com #默认发件邮箱地址
|
||||||
ports:
|
ports:
|
||||||
- '8000:8000'
|
- '8000:8000'
|
||||||
networks:
|
networks:
|
||||||
@@ -153,6 +155,16 @@ networks:
|
|||||||
现在可以访问客户端地址 `http(s)://your.domain` / `http://123.123.123.123` 开始聊天。
|
现在可以访问客户端地址 `http(s)://your.domain` / `http://123.123.123.123` 开始聊天。
|
||||||
|
|
||||||
|
|
||||||
|
## 续杯咖啡
|
||||||
|
|
||||||
|
> 如果对您有帮助,也是在帮助我自己.
|
||||||
|
|
||||||
|
如果你想支持我,给我续杯咖啡吧 ❤️ [https://www.buymeacoffee.com/WongSaang](https://www.buymeacoffee.com/WongSaang)
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img height="150" src="https://github.com/WongSaang/chatgpt-ui/blob/main/demos/bmc_qr.png?raw=true"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
"saveAndClose": "Save & Close",
|
"saveAndClose": "Save & Close",
|
||||||
"pleaseSelectAtLeastOneModelDot": "Please select at least one model.",
|
"pleaseSelectAtLeastOneModelDot": "Please select at least one model.",
|
||||||
"writeAMessage": "Write a message",
|
"writeAMessage": "Write a message",
|
||||||
|
"frequentlyPrompts": "Frequently prompts",
|
||||||
|
"addPrompt": "Add prompt",
|
||||||
|
"titlePrompt": "Title",
|
||||||
|
"addNewPrompt": "Add a new prompt",
|
||||||
"pressEnterToSendYourMessageOrShiftEnterToAddANewLine": "Press Enter to send your message or Shift+Enter to add a new line",
|
"pressEnterToSendYourMessageOrShiftEnterToAddANewLine": "Press Enter to send your message or Shift+Enter to add a new line",
|
||||||
"lightMode": "Light Mode",
|
"lightMode": "Light Mode",
|
||||||
"darkMode": "Dark Mode",
|
"darkMode": "Dark Mode",
|
||||||
@@ -29,9 +33,13 @@
|
|||||||
"me": "Me",
|
"me": "Me",
|
||||||
"ai": "AI"
|
"ai": "AI"
|
||||||
},
|
},
|
||||||
|
"edit": "Edit",
|
||||||
"copy": "Copy",
|
"copy": "Copy",
|
||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
|
"signOut": "Sign out",
|
||||||
|
"webSearch": "Web Search",
|
||||||
|
"webSearchDefaultPrompt": "Web search results:\n\n[web_results]\nCurrent date: [current_date]\n\nInstructions: Using the provided web search results, write a comprehensive reply to the given query. Make sure to cite results using [[number](URL)] notation after the reference. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject.\nQuery: [query]",
|
||||||
"welcomeScreen": {
|
"welcomeScreen": {
|
||||||
"introduction1": "is an unofficial client for ChatGPT, but uses the official OpenAI API.",
|
"introduction1": "is an unofficial client for ChatGPT, but uses the official OpenAI API.",
|
||||||
"introduction2": "You will need an OpenAI API Key before you can use this client.",
|
"introduction2": "You will need an OpenAI API Key before you can use this client.",
|
||||||
|
|||||||
65
lang/ru-RU.json
Normal file
65
lang/ru-RU.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"welcomeTo": "Добро пожаловать в",
|
||||||
|
"language": "Язык",
|
||||||
|
"setApiKey": "Установить ключ API",
|
||||||
|
"setOpenAIApiKey": "Установить ключ API OpenAI",
|
||||||
|
"openAIApiKey": "Ключ API OpenAI",
|
||||||
|
"getAKey": "Получить ключ",
|
||||||
|
"openAIModels": "Модели OpenAI",
|
||||||
|
"aboutTheModels": "О моделях",
|
||||||
|
"saveAndClose": "Сохранить & Закрыть",
|
||||||
|
"pleaseSelectAtLeastOneModelDot": "Выберите хотя бы одну модель.",
|
||||||
|
"writeAMessage": "Напишите сообщение",
|
||||||
|
"frequentlyPrompts": "Список подсказок",
|
||||||
|
"addPrompt": "Добавить подсказку",
|
||||||
|
"titlePrompt": "Заголовок",
|
||||||
|
"addNewPrompt": "Добавитьте новую подсказку",
|
||||||
|
"pressEnterToSendYourMessageOrShiftEnterToAddANewLine": "Нажмите Enter, чтобы отправить сообщение, или Shift+Enter, чтобы добавить новую строку.",
|
||||||
|
"lightMode": "Светлая",
|
||||||
|
"darkMode": "Темная",
|
||||||
|
"followSystem": "Системная",
|
||||||
|
"themeMode": "Тема",
|
||||||
|
"feedback": "Обратная связь",
|
||||||
|
"newConversation": "Новый чат",
|
||||||
|
"clearConversations": "Очистить чаты",
|
||||||
|
"modelParameters": "Параметры модели",
|
||||||
|
"model": "Модель",
|
||||||
|
"temperature": "Temperature",
|
||||||
|
"topP": "Top P",
|
||||||
|
"frequencyPenalty": "Frequency Penalty",
|
||||||
|
"presencePenalty": "Presence Penalty",
|
||||||
|
"maxTokens": "Max Tokens",
|
||||||
|
"roles": {
|
||||||
|
"me": "Я",
|
||||||
|
"ai": "AI"
|
||||||
|
},
|
||||||
|
"edit": "Редактировать",
|
||||||
|
"copy": "Копировать",
|
||||||
|
"copied": "Скопировано",
|
||||||
|
"delete": "Удалить",
|
||||||
|
"signOut": "Выход",
|
||||||
|
"webSearch": "Поиск в интернете",
|
||||||
|
"webSearchDefaultPrompt": "Результаты веб-поиска:\n\n[web_results]\nТекущая дата: [current_date]\n\nИнструкции: Используя предоставленные результаты веб-поиска, напишите развернутый ответ на заданный запрос. Обязательно цитируйте результаты, используя обозначение [[number](URL)] после ссылки. Если предоставленные результаты поиска относятся к нескольким темам с одинаковым названием, напишите отдельные ответы для каждой темы.\nЗапрос: [query]",
|
||||||
|
"welcomeScreen": {
|
||||||
|
"introduction1": "является неофициальным клиентом для ChatGPT, но использует официальный API OpenAI.",
|
||||||
|
"introduction2": "Вам понадобится ключ API OpenAI, прежде чем вы сможете использовать этот клиент.",
|
||||||
|
"examples": {
|
||||||
|
"title": "Примеры",
|
||||||
|
"item1": "\"Объясни, что такое квантовые вычисления простыми словами\"",
|
||||||
|
"item2": "\"Предложи несколько креативных идей для дня рождения 10-летнего ребенка?\"",
|
||||||
|
"item3": "\"Как сделать HTTP-запрос в Javascript?\""
|
||||||
|
},
|
||||||
|
"capabilities": {
|
||||||
|
"title": "Возможности",
|
||||||
|
"item1": "Помнит, что пользователь сказал ранее в разговоре",
|
||||||
|
"item2": "Позволяет пользователю вносить последующие исправления",
|
||||||
|
"item3": "Научен отклонять неуместные запросы"
|
||||||
|
},
|
||||||
|
"limitations": {
|
||||||
|
"title": "Ограничения",
|
||||||
|
"item1": "Иногда может генерировать неверную информацию",
|
||||||
|
"item2": "Иногда может создавать вредные инструкции или предвзятый контент",
|
||||||
|
"item3": "Ограниченное знание мира и событий после 2021 года"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,10 @@
|
|||||||
"saveAndClose": "保存并关闭",
|
"saveAndClose": "保存并关闭",
|
||||||
"pleaseSelectAtLeastOneModelDot": "请至少选择一个模型",
|
"pleaseSelectAtLeastOneModelDot": "请至少选择一个模型",
|
||||||
"writeAMessage": "输入信息",
|
"writeAMessage": "输入信息",
|
||||||
|
"frequentlyPrompts": "Frequently prompts",
|
||||||
|
"addPrompt": "Add prompt",
|
||||||
|
"titlePrompt": "Title",
|
||||||
|
"addNewPrompt": "Add a new prompt",
|
||||||
"pressEnterToSendYourMessageOrShiftEnterToAddANewLine": "按回车键发送您的信息,或按Shift+Enter键添加新行",
|
"pressEnterToSendYourMessageOrShiftEnterToAddANewLine": "按回车键发送您的信息,或按Shift+Enter键添加新行",
|
||||||
"lightMode": "明亮模式",
|
"lightMode": "明亮模式",
|
||||||
"darkMode": "暗色模式",
|
"darkMode": "暗色模式",
|
||||||
@@ -29,9 +33,13 @@
|
|||||||
"me": "我",
|
"me": "我",
|
||||||
"ai": "AI"
|
"ai": "AI"
|
||||||
},
|
},
|
||||||
|
"edit": "编辑",
|
||||||
"copy": "复制",
|
"copy": "复制",
|
||||||
"copied": "已复制",
|
"copied": "已复制",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
|
"signOut": "退出登录",
|
||||||
|
"webSearch": "网页搜索",
|
||||||
|
"webSearchDefaultPrompt": "网络搜索结果:\n\n[web_results]\n当前日期:[current_date]\n\n说明:使用提供的网络搜索结果,对给定的查询写出全面的回复。确保在引用参考文献后使用 [[number](URL)] 符号进行引用结果. 如果提供的搜索结果涉及到多个具有相同名称的主题,请针对每个主题编写单独的答案。\n查询:[query]",
|
||||||
"welcomeScreen": {
|
"welcomeScreen": {
|
||||||
"introduction1": "是一个非官方的ChatGPT客户端,但使用OpenAI的官方API",
|
"introduction1": "是一个非官方的ChatGPT客户端,但使用OpenAI的官方API",
|
||||||
"introduction2": "在使用本客户端之前,您需要一个OpenAI API密钥。",
|
"introduction2": "在使用本客户端之前,您需要一个OpenAI API密钥。",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {useDisplay} from "vuetify";
|
import {useDisplay} from "vuetify";
|
||||||
|
|
||||||
const { $i18n } = useNuxtApp()
|
const { $i18n, $auth } = useNuxtApp()
|
||||||
const runtimeConfig = useRuntimeConfig()
|
const runtimeConfig = useRuntimeConfig()
|
||||||
const colorMode = useColorMode()
|
const colorMode = useColorMode()
|
||||||
const drawer = ref(null)
|
const drawer = ref(null)
|
||||||
@@ -84,12 +84,32 @@ const loadConversations = async () => {
|
|||||||
|
|
||||||
const {mdAndUp} = useDisplay()
|
const {mdAndUp} = useDisplay()
|
||||||
|
|
||||||
|
|
||||||
const drawerPermanent = computed(() => {
|
const drawerPermanent = computed(() => {
|
||||||
return mdAndUp.value
|
return mdAndUp.value
|
||||||
})
|
})
|
||||||
|
|
||||||
onNuxtReady(async () => {
|
const signOut = async () => {
|
||||||
|
const { data, error } = await useFetch('/api/account/logout/', {
|
||||||
|
method: 'POST'
|
||||||
|
})
|
||||||
|
if (!error.value) {
|
||||||
|
await $auth.logout()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const settings = useSettings()
|
||||||
|
const showApiKeySetting = ref(false)
|
||||||
|
watchEffect(() => {
|
||||||
|
if (settings.value) {
|
||||||
|
const settingsValue = toRaw(settings.value)
|
||||||
|
showApiKeySetting.value = settingsValue.open_api_key_setting && settingsValue.open_api_key_setting === 'True'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
loadConversations()
|
loadConversations()
|
||||||
|
loadSettings()
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -228,6 +248,10 @@ onNuxtReady(async () => {
|
|||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
|
|
||||||
|
<ApiKeyDialog
|
||||||
|
v-if="showApiKeySetting"
|
||||||
|
/>
|
||||||
|
|
||||||
<ModelParameters/>
|
<ModelParameters/>
|
||||||
|
|
||||||
<v-menu
|
<v-menu
|
||||||
@@ -261,6 +285,14 @@ onNuxtReady(async () => {
|
|||||||
:title="$t('feedback')"
|
:title="$t('feedback')"
|
||||||
@click="feedback"
|
@click="feedback"
|
||||||
></v-list-item>
|
></v-list-item>
|
||||||
|
|
||||||
|
<v-list-item
|
||||||
|
rounded="xl"
|
||||||
|
prepend-icon="logout"
|
||||||
|
:title="$t('signOut')"
|
||||||
|
@click="signOut"
|
||||||
|
></v-list-item>
|
||||||
|
|
||||||
</v-list>
|
</v-list>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -281,72 +313,12 @@ onNuxtReady(async () => {
|
|||||||
@click="createNewConversion()"
|
@click="createNewConversion()"
|
||||||
></v-btn>
|
></v-btn>
|
||||||
|
|
||||||
<!-- <v-menu-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <template v-slot:activator="{ props }">-->
|
|
||||||
<!-- <v-btn-->
|
|
||||||
<!-- v-bind="props"-->
|
|
||||||
<!-- icon="help_outline"-->
|
|
||||||
<!-- title="Feedback"-->
|
|
||||||
<!-- ></v-btn>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<!-- <v-list-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <v-list-item-->
|
|
||||||
<!-- @click="feedback"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <v-list-item-title>{{ $t('feedback') }}</v-list-item-title>-->
|
|
||||||
<!-- </v-list-item>-->
|
|
||||||
<!-- </v-list>-->
|
|
||||||
<!-- </v-menu>-->
|
|
||||||
</v-app-bar>
|
</v-app-bar>
|
||||||
|
|
||||||
<v-main>
|
<v-main>
|
||||||
<NuxtPage/>
|
<NuxtPage/>
|
||||||
</v-main>
|
</v-main>
|
||||||
|
|
||||||
<div>
|
|
||||||
<div
|
|
||||||
v-if="$pwa?.offlineReady || $pwa?.needRefresh"
|
|
||||||
class="pwa-toast"
|
|
||||||
role="alert"
|
|
||||||
>
|
|
||||||
<div class="message">
|
|
||||||
<span v-if="$pwa.offlineReady">
|
|
||||||
App ready to work offline
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
New content available, click on reload button to update.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
v-if="$pwa.needRefresh"
|
|
||||||
@click="$pwa.updateServiceWorker()"
|
|
||||||
>
|
|
||||||
Reload
|
|
||||||
</button>
|
|
||||||
<button @click="$pwa.cancelPrompt()">
|
|
||||||
Close
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="$pwa?.showInstallPrompt && !$pwa?.offlineReady && !$pwa?.needRefresh"
|
|
||||||
class="pwa-toast"
|
|
||||||
role="alert"
|
|
||||||
>
|
|
||||||
<div class="message">
|
|
||||||
<span>
|
|
||||||
Install PWA
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<button @click="$pwa.install()">
|
|
||||||
Install
|
|
||||||
</button>
|
|
||||||
<button @click="$pwa.cancelInstall()">
|
|
||||||
Cancel
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</v-app>
|
</v-app>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -362,26 +334,4 @@ onNuxtReady(async () => {
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pwa-toast {
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
margin: 16px;
|
|
||||||
padding: 12px;
|
|
||||||
border: 1px solid #8885;
|
|
||||||
border-radius: 4px;
|
|
||||||
z-index: 1;
|
|
||||||
text-align: left;
|
|
||||||
box-shadow: 3px 4px 5px 0 #8885;
|
|
||||||
}
|
|
||||||
.pwa-toast .message {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
.pwa-toast button {
|
|
||||||
border: 1px solid #8885;
|
|
||||||
outline: none;
|
|
||||||
margin-right: 5px;
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 3px 10px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
const appName = 'ChatGPT UI'
|
const appName = process.env.NUXT_PUBLIC_APP_NAME ?? 'ChatGPT UI'
|
||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
dev: false,
|
dev: false,
|
||||||
@@ -14,6 +14,7 @@ export default defineNuxtConfig({
|
|||||||
appName: appName,
|
appName: appName,
|
||||||
typewriter: false,
|
typewriter: false,
|
||||||
typewriterDelay: 50,
|
typewriterDelay: 50,
|
||||||
|
customApiKey: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
@@ -25,36 +26,18 @@ export default defineNuxtConfig({
|
|||||||
'highlight.js/styles/panda-syntax-dark.css',
|
'highlight.js/styles/panda-syntax-dark.css',
|
||||||
],
|
],
|
||||||
modules: [
|
modules: [
|
||||||
'@vite-pwa/nuxt',
|
'@kevinmarrec/nuxt-pwa',
|
||||||
'@nuxtjs/color-mode',
|
'@nuxtjs/color-mode',
|
||||||
'@nuxtjs/i18n',
|
'@nuxtjs/i18n',
|
||||||
],
|
],
|
||||||
pwa: {
|
pwa: {
|
||||||
registerType: 'autoUpdate',
|
|
||||||
manifest: {
|
manifest: {
|
||||||
name: appName,
|
name: appName,
|
||||||
short_name: appName,
|
short_name: appName,
|
||||||
icons: [
|
description: 'A ChatGPT web Client'
|
||||||
{
|
|
||||||
src: 'icon-black.svg',
|
|
||||||
sizes: '900x900',
|
|
||||||
purpose: 'any maskable',
|
|
||||||
}
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
workbox: {
|
workbox: {
|
||||||
navigateFallback: '/',
|
enabled: process.env.DEBUT_PWA === 'true',
|
||||||
globPatterns: ['**/*.{js,css,html,png,svg,ico}'],
|
|
||||||
},
|
|
||||||
client: {
|
|
||||||
installPrompt: true,
|
|
||||||
// you don't need to include this: only for testing purposes
|
|
||||||
// if enabling periodic sync for update use 1 hour or so (periodicSyncForUpdates: 3600)
|
|
||||||
periodicSyncForUpdates: 20,
|
|
||||||
},
|
|
||||||
devOptions: {
|
|
||||||
enabled: true,
|
|
||||||
type: 'module',
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
i18n: {
|
i18n: {
|
||||||
@@ -71,6 +54,12 @@ export default defineNuxtConfig({
|
|||||||
iso: 'zh-CN',
|
iso: 'zh-CN',
|
||||||
name: '简体中文',
|
name: '简体中文',
|
||||||
file: 'zh-CN.json',
|
file: 'zh-CN.json',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: 'ru',
|
||||||
|
iso: 'ru-RU',
|
||||||
|
name: 'Русский',
|
||||||
|
file: 'ru-RU.json',
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
lazy: true,
|
lazy: true,
|
||||||
@@ -83,7 +72,7 @@ export default defineNuxtConfig({
|
|||||||
nitro: {
|
nitro: {
|
||||||
devProxy: {
|
devProxy: {
|
||||||
"/api": {
|
"/api": {
|
||||||
target: "http://localhost:8000/api",
|
target: process.env.NUXT_DEV_SERVER ?? 'http://localhost:8000/api',
|
||||||
prependPath: true,
|
prependPath: true,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,14 +8,15 @@
|
|||||||
"postinstall": "nuxt prepare"
|
"postinstall": "nuxt prepare"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@kevinmarrec/nuxt-pwa": "^0.17.0",
|
||||||
"@nuxtjs/color-mode": "^3.2.0",
|
"@nuxtjs/color-mode": "^3.2.0",
|
||||||
"@nuxtjs/i18n": "^8.0.0-beta.9",
|
"@nuxtjs/i18n": "^8.0.0-beta.9",
|
||||||
|
"@vite-pwa/nuxt": "^0.0.7",
|
||||||
"material-design-icons-iconfont": "^6.7.0",
|
"material-design-icons-iconfont": "^6.7.0",
|
||||||
"nuxt": "^3.2.0"
|
"nuxt": "^3.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@microsoft/fetch-event-source": "^2.0.1",
|
"@microsoft/fetch-event-source": "^2.0.1",
|
||||||
"@vite-pwa/nuxt": "^0.0.7",
|
|
||||||
"copy-to-clipboard": "^3.3.3",
|
"copy-to-clipboard": "^3.3.3",
|
||||||
"highlight.js": "^11.7.0",
|
"highlight.js": "^11.7.0",
|
||||||
"is-mobile": "^3.1.1",
|
"is-mobile": "^3.1.1",
|
||||||
|
|||||||
@@ -45,24 +45,32 @@ onNuxtReady(() => {
|
|||||||
elevation="0"
|
elevation="0"
|
||||||
>
|
>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h2 class="text-h4">Verify your email</h2>
|
<div v-if="route.query.email_verification_required && route.query.email_verification_required === 'none'">
|
||||||
<p class="text-body-2 mt-5">
|
<h2 class="text-h4">Your registration is successful</h2>
|
||||||
We've sent a verification email to <strong>{{ $auth.user.email }}</strong>. <br>
|
<p class="mt-5">
|
||||||
Please check your inbox and click the link to verify your email address.
|
You can now <NuxtLink to="/account/signin">login</NuxtLink> to your account.
|
||||||
</p>
|
</p>
|
||||||
<p v-if="errorMsg"
|
</div>
|
||||||
class="text-red"
|
<div v-else>
|
||||||
>{{ errorMsg }}</p>
|
<h2 class="text-h4">Verify your email</h2>
|
||||||
<v-btn
|
<p class="mt-5">
|
||||||
variant="text"
|
We've sent a verification email to <strong>{{ $auth.user.email }}</strong>. <br>
|
||||||
class="mt-5"
|
Please check your inbox and click the link to verify your email address.
|
||||||
color="primary"
|
</p>
|
||||||
:loading="sending"
|
<p v-if="errorMsg"
|
||||||
@click="resendEmail"
|
class="text-red"
|
||||||
:disabled="resent"
|
>{{ errorMsg }}</p>
|
||||||
>
|
<v-btn
|
||||||
{{ resent ? 'Resent' : 'Resend email'}}
|
variant="text"
|
||||||
</v-btn>
|
class="mt-5"
|
||||||
|
color="primary"
|
||||||
|
:loading="sending"
|
||||||
|
@click="resendEmail"
|
||||||
|
:disabled="resent"
|
||||||
|
>
|
||||||
|
{{ resent ? 'Resent' : 'Resend email'}}
|
||||||
|
</v-btn>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ const submit = async () => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$auth.setUser(data.value.user)
|
$auth.setUser(data.value.user)
|
||||||
navigateTo('/account/onboarding')
|
navigateTo('/account/onboarding?email_verification_required='+data.value.email_verification_required)
|
||||||
}
|
}
|
||||||
|
|
||||||
submitting.value = false
|
submitting.value = false
|
||||||
|
|||||||
109
pages/index.vue
109
pages/index.vue
@@ -5,8 +5,6 @@ definePageMeta({
|
|||||||
middleware: ["auth"]
|
middleware: ["auth"]
|
||||||
})
|
})
|
||||||
import {EventStreamContentType, fetchEventSource} from '@microsoft/fetch-event-source'
|
import {EventStreamContentType, fetchEventSource} from '@microsoft/fetch-event-source'
|
||||||
import { nextTick } from 'vue'
|
|
||||||
import MessageActions from "~/components/MessageActions.vue";
|
|
||||||
|
|
||||||
const { $i18n, $auth } = useNuxtApp()
|
const { $i18n, $auth } = useNuxtApp()
|
||||||
const runtimeConfig = useRuntimeConfig()
|
const runtimeConfig = useRuntimeConfig()
|
||||||
@@ -50,15 +48,22 @@ const abortFetch = () => {
|
|||||||
}
|
}
|
||||||
fetchingResponse.value = false
|
fetchingResponse.value = false
|
||||||
}
|
}
|
||||||
const fetchReply = async (message, parentMessageId) => {
|
const fetchReply = async (message) => {
|
||||||
ctrl = new AbortController()
|
ctrl = new AbortController()
|
||||||
|
|
||||||
|
let webSearchParams = {}
|
||||||
|
if (enableWebSearch.value) {
|
||||||
|
webSearchParams['web_search'] = {
|
||||||
|
ua: navigator.userAgent,
|
||||||
|
default_prompt: $i18n.t('webSearchDefaultPrompt')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const data = Object.assign({}, currentModel.value, {
|
const data = Object.assign({}, currentModel.value, {
|
||||||
openaiApiKey: openaiApiKey.value,
|
openaiApiKey: enableCustomApiKey.value ? openaiApiKey.value : null,
|
||||||
message: message,
|
message: message,
|
||||||
parentMessageId: parentMessageId,
|
|
||||||
conversationId: currentConversation.value.id
|
conversationId: currentConversation.value.id
|
||||||
})
|
}, webSearchParams)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await fetchEventSource('/api/conversation/', {
|
await fetchEventSource('/api/conversation/', {
|
||||||
@@ -85,12 +90,18 @@ const fetchReply = async (message, parentMessageId) => {
|
|||||||
throw err;
|
throw err;
|
||||||
},
|
},
|
||||||
async onmessage(message) {
|
async onmessage(message) {
|
||||||
// console.log(message)
|
|
||||||
const event = message.event
|
const event = message.event
|
||||||
const data = JSON.parse(message.data)
|
const data = JSON.parse(message.data)
|
||||||
|
|
||||||
if (event === 'error') {
|
if (event === 'error') {
|
||||||
throw new Error(data.error);
|
abortFetch()
|
||||||
|
showSnackbar(data.error)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event === 'userMessageId') {
|
||||||
|
currentConversation.value.messages[currentConversation.value.messages.length - 1].id = data.userMessageId
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event === 'done') {
|
if (event === 'done') {
|
||||||
@@ -129,15 +140,8 @@ const scrollChatWindow = () => {
|
|||||||
|
|
||||||
const send = (message) => {
|
const send = (message) => {
|
||||||
fetchingResponse.value = true
|
fetchingResponse.value = true
|
||||||
let parentMessageId = null
|
currentConversation.value.messages.push({message: message})
|
||||||
if (currentConversation.value.messages.length > 0) {
|
fetchReply(message)
|
||||||
const lastMessage = currentConversation.value.messages[currentConversation.value.messages.length - 1]
|
|
||||||
if (lastMessage.is_bot && lastMessage.id !== null) {
|
|
||||||
parentMessageId = lastMessage.id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentConversation.value.messages.push({parentMessageId: parentMessageId, message: message})
|
|
||||||
fetchReply(message, parentMessageId)
|
|
||||||
scrollChatWindow()
|
scrollChatWindow()
|
||||||
}
|
}
|
||||||
const stop = () => {
|
const stop = () => {
|
||||||
@@ -160,6 +164,20 @@ const deleteMessage = (index) => {
|
|||||||
currentConversation.value.messages.splice(index, 1)
|
currentConversation.value.messages.splice(index, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const showWebSearchToggle = ref(false)
|
||||||
|
const enableWebSearch = ref(false)
|
||||||
|
const enableCustomApiKey = ref(false)
|
||||||
|
|
||||||
|
const settings = useSettings()
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
if (settings.value) {
|
||||||
|
const settingsValue = toRaw(settings.value)
|
||||||
|
showWebSearchToggle.value = settingsValue.open_web_search && settingsValue.open_web_search === 'True'
|
||||||
|
enableCustomApiKey.value = settingsValue.open_api_key_setting && settingsValue.open_api_key_setting === 'True'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -181,20 +199,16 @@ const deleteMessage = (index) => {
|
|||||||
v-if="!message.is_bot"
|
v-if="!message.is_bot"
|
||||||
:message="message"
|
:message="message"
|
||||||
:message-index="index"
|
:message-index="index"
|
||||||
|
:use-prompt="usePrompt"
|
||||||
|
:delete-message="deleteMessage"
|
||||||
/>
|
/>
|
||||||
<v-card
|
<MsgContent :message="message" />
|
||||||
:color="message.is_bot ? '' : 'primary'"
|
|
||||||
rounded="lg"
|
|
||||||
elevation="2"
|
|
||||||
>
|
|
||||||
<v-card-text>
|
|
||||||
<MsgContent :content="message.message" />
|
|
||||||
</v-card-text>
|
|
||||||
</v-card>
|
|
||||||
<MessageActions
|
<MessageActions
|
||||||
v-if="message.is_bot"
|
v-if="message.is_bot"
|
||||||
:message="message"
|
:message="message"
|
||||||
:message-index="index"
|
:message-index="index"
|
||||||
|
:use-prompt="usePrompt"
|
||||||
|
:delete-message="deleteMessage"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</v-col>
|
</v-col>
|
||||||
@@ -204,21 +218,36 @@ const deleteMessage = (index) => {
|
|||||||
<div ref="grab" class="w-100" style="height: 200px;"></div>
|
<div ref="grab" class="w-100" style="height: 200px;"></div>
|
||||||
</div>
|
</div>
|
||||||
<Welcome v-else />
|
<Welcome v-else />
|
||||||
<v-footer app class="d-flex flex-column">
|
<v-footer app>
|
||||||
<div class="px-md-16 w-100 d-flex align-center">
|
<div class="px-md-16 w-100 d-flex flex-column">
|
||||||
<Prompt v-show="!fetchingResponse" :use-prompt="usePrompt" />
|
<div class="d-flex align-center">
|
||||||
<v-btn
|
<v-btn
|
||||||
v-show="fetchingResponse"
|
v-show="fetchingResponse"
|
||||||
icon="close"
|
icon="close"
|
||||||
title="stop"
|
title="stop"
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
@click="stop"
|
@click="stop"
|
||||||
></v-btn>
|
></v-btn>
|
||||||
<MsgEditor ref="editor" :send-message="send" :disabled="fetchingResponse" :loading="fetchingResponse" />
|
<MsgEditor ref="editor" :send-message="send" :disabled="fetchingResponse" :loading="fetchingResponse" />
|
||||||
</div>
|
</div>
|
||||||
|
<v-toolbar
|
||||||
|
density="comfortable"
|
||||||
|
color="transparent"
|
||||||
|
>
|
||||||
|
<Prompt v-show="!fetchingResponse" :use-prompt="usePrompt" />
|
||||||
|
<v-switch
|
||||||
|
v-if="showWebSearchToggle"
|
||||||
|
v-model="enableWebSearch"
|
||||||
|
hide-details
|
||||||
|
color="primary"
|
||||||
|
:label="$t('webSearch')"
|
||||||
|
></v-switch>
|
||||||
|
<v-spacer></v-spacer>
|
||||||
|
</v-toolbar>
|
||||||
|
|
||||||
<div class="px-4 py-2 text-disabled text-caption font-weight-light text-center w-100">
|
<!-- <div class="py-2 text-disabled text-caption font-weight-light text-center">-->
|
||||||
© {{ new Date().getFullYear() }} {{ runtimeConfig.public.appName }}
|
<!-- © {{ new Date().getFullYear() }} {{ runtimeConfig.public.appName }}-->
|
||||||
|
<!-- </div>-->
|
||||||
</div>
|
</div>
|
||||||
</v-footer>
|
</v-footer>
|
||||||
<v-snackbar
|
<v-snackbar
|
||||||
|
|||||||
BIN
public/icon.png
Normal file
BIN
public/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
@@ -5,11 +5,25 @@ export const STORAGE_KEY = {
|
|||||||
OPENAI_API_KEY: 'openai_api_key',
|
OPENAI_API_KEY: 'openai_api_key',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DEFAULT_MODEL = {
|
export const MODELS = {
|
||||||
name: 'gpt-3.5-turbo',
|
'gpt-3.5-turbo': {
|
||||||
frequency_penalty: 0.0,
|
name: 'gpt-3.5-turbo',
|
||||||
presence_penalty: 0.0,
|
frequency_penalty: 0.0,
|
||||||
max_tokens: 1000,
|
presence_penalty: 0.0,
|
||||||
temperature: 0.7,
|
total_tokens: 4096,
|
||||||
top_p: 1.0
|
max_tokens: 1000,
|
||||||
|
temperature: 0.7,
|
||||||
|
top_p: 1.0
|
||||||
|
},
|
||||||
|
'gpt-4': {
|
||||||
|
name: 'gpt-4',
|
||||||
|
frequency_penalty: 0.0,
|
||||||
|
presence_penalty: 0.0,
|
||||||
|
total_tokens: 8192,
|
||||||
|
max_tokens: 2000,
|
||||||
|
temperature: 0.7,
|
||||||
|
top_p: 1.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const DEFAULT_MODEL_NAME = 'gpt-3.5-turbo'
|
||||||
@@ -51,3 +51,22 @@ export const genTitle = async (conversationId) => {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const transformData = (list) => {
|
||||||
|
const result = {};
|
||||||
|
for (let i = 0; i < list.length; i++) {
|
||||||
|
const item = list[i];
|
||||||
|
result[item.name] = item.value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const loadSettings = async () => {
|
||||||
|
const settings = useSettings()
|
||||||
|
const { data, error } = await useAuthFetch('/api/chat/settings/', {
|
||||||
|
method: 'GET'
|
||||||
|
})
|
||||||
|
if (!error.value) {
|
||||||
|
settings.value = transformData(data.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import {MODELS} from "~/utils/enums";
|
||||||
|
|
||||||
const get = (key) => {
|
const get = (key) => {
|
||||||
let val = localStorage.getItem(key)
|
let val = localStorage.getItem(key)
|
||||||
@@ -17,13 +18,13 @@ export const setModels = (val) => {
|
|||||||
models.value = val
|
models.value = val
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getStoredModels = () => {
|
// export const getStoredModels = () => {
|
||||||
let models = get(STORAGE_KEY.MODELS)
|
// let models = get(STORAGE_KEY.MODELS)
|
||||||
if (!models) {
|
// if (!models) {
|
||||||
models = [DEFAULT_MODEL]
|
// models = [DEFAULT_MODEL]
|
||||||
}
|
// }
|
||||||
return models
|
// return models
|
||||||
}
|
// }
|
||||||
|
|
||||||
export const saveCurrentModel = (val) => {
|
export const saveCurrentModel = (val) => {
|
||||||
set(STORAGE_KEY.CURRENT_MODEL, val)
|
set(STORAGE_KEY.CURRENT_MODEL, val)
|
||||||
@@ -32,7 +33,7 @@ export const saveCurrentModel = (val) => {
|
|||||||
export const getCurrentModel = () => {
|
export const getCurrentModel = () => {
|
||||||
let model = get(STORAGE_KEY.CURRENT_MODEL)
|
let model = get(STORAGE_KEY.CURRENT_MODEL)
|
||||||
if (!model) {
|
if (!model) {
|
||||||
model = DEFAULT_MODEL
|
model = MODELS[DEFAULT_MODEL_NAME]
|
||||||
}
|
}
|
||||||
return model
|
return model
|
||||||
}
|
}
|
||||||
|
|||||||
221
yarn.lock
221
yarn.lock
@@ -1439,6 +1439,15 @@
|
|||||||
"@jridgewell/resolve-uri" "3.1.0"
|
"@jridgewell/resolve-uri" "3.1.0"
|
||||||
"@jridgewell/sourcemap-codec" "1.4.14"
|
"@jridgewell/sourcemap-codec" "1.4.14"
|
||||||
|
|
||||||
|
"@kevinmarrec/nuxt-pwa@^0.17.0":
|
||||||
|
version "0.17.0"
|
||||||
|
resolved "https://registry.npmmirror.com/@kevinmarrec/nuxt-pwa/-/nuxt-pwa-0.17.0.tgz#384a7d63062b5b71a2c14cc53d0b8c4b449d7399"
|
||||||
|
integrity sha512-TI/0Fe30g6/VL2Y2jDLF/q5sov8UBE5K4/+CRPUnJbQPCXhCzTBM8EjllDUwslZ3bPtCk2TqwDFZOHaKtY/eoA==
|
||||||
|
dependencies:
|
||||||
|
hasha "^5.2.2"
|
||||||
|
sharp "^0.31.3"
|
||||||
|
std-env "^3.3.2"
|
||||||
|
|
||||||
"@mapbox/node-pre-gyp@^1.0.5":
|
"@mapbox/node-pre-gyp@^1.0.5":
|
||||||
version "1.0.10"
|
version "1.0.10"
|
||||||
resolved "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c"
|
resolved "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c"
|
||||||
@@ -1879,9 +1888,9 @@
|
|||||||
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
|
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*":
|
||||||
version "18.15.3"
|
version "18.15.5"
|
||||||
resolved "https://registry.npmmirror.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014"
|
resolved "https://registry.npmmirror.com/@types/node/-/node-18.15.5.tgz#3af577099a99c61479149b716183e70b5239324a"
|
||||||
integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==
|
integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==
|
||||||
|
|
||||||
"@types/resolve@1.17.1":
|
"@types/resolve@1.17.1":
|
||||||
version "1.17.1"
|
version "1.17.1"
|
||||||
@@ -2514,6 +2523,11 @@ chokidar@^3.5.1, chokidar@^3.5.3:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
|
chownr@^1.1.1:
|
||||||
|
version "1.1.4"
|
||||||
|
resolved "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
|
||||||
|
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
|
||||||
|
|
||||||
chownr@^2.0.0:
|
chownr@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
|
resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
|
||||||
@@ -2588,16 +2602,32 @@ color-name@1.1.3:
|
|||||||
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
||||||
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
||||||
|
|
||||||
color-name@~1.1.4:
|
color-name@^1.0.0, color-name@~1.1.4:
|
||||||
version "1.1.4"
|
version "1.1.4"
|
||||||
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||||
|
|
||||||
|
color-string@^1.9.0:
|
||||||
|
version "1.9.1"
|
||||||
|
resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
|
||||||
|
integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
|
||||||
|
dependencies:
|
||||||
|
color-name "^1.0.0"
|
||||||
|
simple-swizzle "^0.2.2"
|
||||||
|
|
||||||
color-support@^1.1.2:
|
color-support@^1.1.2:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
|
resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
|
||||||
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
|
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
|
||||||
|
|
||||||
|
color@^4.2.3:
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.npmmirror.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
|
||||||
|
integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
|
||||||
|
dependencies:
|
||||||
|
color-convert "^2.0.1"
|
||||||
|
color-string "^1.9.0"
|
||||||
|
|
||||||
colord@^2.9.1:
|
colord@^2.9.1:
|
||||||
version "2.9.3"
|
version "2.9.3"
|
||||||
resolved "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
|
resolved "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
|
||||||
@@ -2838,6 +2868,18 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.1.2"
|
ms "2.1.2"
|
||||||
|
|
||||||
|
decompress-response@^6.0.0:
|
||||||
|
version "6.0.0"
|
||||||
|
resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||||
|
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
|
||||||
|
dependencies:
|
||||||
|
mimic-response "^3.1.0"
|
||||||
|
|
||||||
|
deep-extend@^0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
||||||
|
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
|
||||||
|
|
||||||
deepmerge@^4.2.2:
|
deepmerge@^4.2.2:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b"
|
resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b"
|
||||||
@@ -2893,7 +2935,7 @@ destroy@1.2.0:
|
|||||||
resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
|
resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
|
||||||
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
|
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
|
||||||
|
|
||||||
detect-libc@^2.0.0:
|
detect-libc@^2.0.0, detect-libc@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
|
resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
|
||||||
integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
|
integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
|
||||||
@@ -2989,7 +3031,7 @@ encodeurl@~1.0.2:
|
|||||||
resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
||||||
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
|
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
|
||||||
|
|
||||||
end-of-stream@^1.4.1:
|
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
||||||
version "1.4.4"
|
version "1.4.4"
|
||||||
resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||||
@@ -3232,6 +3274,11 @@ execa@^5.1.1:
|
|||||||
signal-exit "^3.0.3"
|
signal-exit "^3.0.3"
|
||||||
strip-final-newline "^2.0.0"
|
strip-final-newline "^2.0.0"
|
||||||
|
|
||||||
|
expand-template@^2.0.3:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
|
||||||
|
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
|
||||||
|
|
||||||
external-editor@^3.0.3:
|
external-editor@^3.0.3:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
|
resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
|
||||||
@@ -3521,6 +3568,11 @@ git-url-parse@^13.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
git-up "^7.0.0"
|
git-up "^7.0.0"
|
||||||
|
|
||||||
|
github-from-package@0.0.0:
|
||||||
|
version "0.0.0"
|
||||||
|
resolved "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
|
||||||
|
integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
|
||||||
|
|
||||||
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||||
@@ -3672,6 +3724,14 @@ hash-sum@^2.0.0:
|
|||||||
resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
|
resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
|
||||||
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
|
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
|
||||||
|
|
||||||
|
hasha@^5.2.2:
|
||||||
|
version "5.2.2"
|
||||||
|
resolved "https://registry.npmmirror.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1"
|
||||||
|
integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==
|
||||||
|
dependencies:
|
||||||
|
is-stream "^2.0.0"
|
||||||
|
type-fest "^0.8.0"
|
||||||
|
|
||||||
highlight.js@^11.7.0:
|
highlight.js@^11.7.0:
|
||||||
version "11.7.0"
|
version "11.7.0"
|
||||||
resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e"
|
resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e"
|
||||||
@@ -3765,7 +3825,7 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
|
|||||||
resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
||||||
ini@^1.3.5:
|
ini@^1.3.5, ini@~1.3.0:
|
||||||
version "1.3.8"
|
version "1.3.8"
|
||||||
resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
|
resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
|
||||||
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
|
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
|
||||||
@@ -3834,6 +3894,11 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
|
|||||||
get-intrinsic "^1.2.0"
|
get-intrinsic "^1.2.0"
|
||||||
is-typed-array "^1.1.10"
|
is-typed-array "^1.1.10"
|
||||||
|
|
||||||
|
is-arrayish@^0.3.1:
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
|
||||||
|
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
|
||||||
|
|
||||||
is-bigint@^1.0.1:
|
is-bigint@^1.0.1:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
|
resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
|
||||||
@@ -4427,6 +4492,11 @@ mimic-fn@^2.1.0:
|
|||||||
resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
||||||
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
|
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
|
||||||
|
|
||||||
|
mimic-response@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
||||||
|
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||||
|
|
||||||
minimatch@^3.0.4, minimatch@^3.1.1:
|
minimatch@^3.0.4, minimatch@^3.1.1:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||||
@@ -4448,6 +4518,11 @@ minimatch@~3.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
|
minimist@^1.2.0, minimist@^1.2.3:
|
||||||
|
version "1.2.8"
|
||||||
|
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
|
||||||
|
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
|
||||||
|
|
||||||
minipass@^3.0.0:
|
minipass@^3.0.0:
|
||||||
version "3.3.6"
|
version "3.3.6"
|
||||||
resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
|
resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
|
||||||
@@ -4473,6 +4548,11 @@ mkdir@^0.0.2:
|
|||||||
resolved "https://registry.npmmirror.com/mkdir/-/mkdir-0.0.2.tgz#3b9da7a4e5b13004ebc636581b160e1e04776851"
|
resolved "https://registry.npmmirror.com/mkdir/-/mkdir-0.0.2.tgz#3b9da7a4e5b13004ebc636581b160e1e04776851"
|
||||||
integrity sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==
|
integrity sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==
|
||||||
|
|
||||||
|
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
|
||||||
|
version "0.5.3"
|
||||||
|
resolved "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
|
||||||
|
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
|
||||||
|
|
||||||
mkdirp@^1.0.3:
|
mkdirp@^1.0.3:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||||
@@ -4533,6 +4613,11 @@ nanoid@^4.0.0, nanoid@^4.0.1:
|
|||||||
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-4.0.1.tgz#398d7ccfdbf9faf2231b2ca7e8fff5dbca6a509b"
|
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-4.0.1.tgz#398d7ccfdbf9faf2231b2ca7e8fff5dbca6a509b"
|
||||||
integrity sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==
|
integrity sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==
|
||||||
|
|
||||||
|
napi-build-utils@^1.0.1:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
|
||||||
|
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
|
||||||
|
|
||||||
nitropack@^2.2.1:
|
nitropack@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.npmmirror.com/nitropack/-/nitropack-2.2.1.tgz#8fec1dd5bd6732faea3b05b1ba63c9e26ea2b9fa"
|
resolved "https://registry.npmmirror.com/nitropack/-/nitropack-2.2.1.tgz#8fec1dd5bd6732faea3b05b1ba63c9e26ea2b9fa"
|
||||||
@@ -4597,6 +4682,18 @@ nitropack@^2.2.1:
|
|||||||
unimport "^2.2.4"
|
unimport "^2.2.4"
|
||||||
unstorage "^1.1.4"
|
unstorage "^1.1.4"
|
||||||
|
|
||||||
|
node-abi@^3.3.0:
|
||||||
|
version "3.33.0"
|
||||||
|
resolved "https://registry.npmmirror.com/node-abi/-/node-abi-3.33.0.tgz#8b23a0cec84e1c5f5411836de6a9b84bccf26e7f"
|
||||||
|
integrity sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==
|
||||||
|
dependencies:
|
||||||
|
semver "^7.3.5"
|
||||||
|
|
||||||
|
node-addon-api@^5.0.0:
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
|
||||||
|
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
|
||||||
|
|
||||||
node-domexception@^1.0.0:
|
node-domexception@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
|
resolved "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
|
||||||
@@ -4792,7 +4889,7 @@ on-finished@2.4.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ee-first "1.1.1"
|
ee-first "1.1.1"
|
||||||
|
|
||||||
once@^1.3.0, once@^1.4.0:
|
once@^1.3.0, once@^1.3.1, once@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
||||||
@@ -5170,6 +5267,24 @@ postcss@^8.1.10, postcss@^8.4.21:
|
|||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
source-map-js "^1.0.2"
|
source-map-js "^1.0.2"
|
||||||
|
|
||||||
|
prebuild-install@^7.1.1:
|
||||||
|
version "7.1.1"
|
||||||
|
resolved "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
|
||||||
|
integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
|
||||||
|
dependencies:
|
||||||
|
detect-libc "^2.0.0"
|
||||||
|
expand-template "^2.0.3"
|
||||||
|
github-from-package "0.0.0"
|
||||||
|
minimist "^1.2.3"
|
||||||
|
mkdirp-classic "^0.5.3"
|
||||||
|
napi-build-utils "^1.0.1"
|
||||||
|
node-abi "^3.3.0"
|
||||||
|
pump "^3.0.0"
|
||||||
|
rc "^1.2.7"
|
||||||
|
simple-get "^4.0.0"
|
||||||
|
tar-fs "^2.0.0"
|
||||||
|
tunnel-agent "^0.6.0"
|
||||||
|
|
||||||
pretty-bytes@^5.3.0:
|
pretty-bytes@^5.3.0:
|
||||||
version "5.6.0"
|
version "5.6.0"
|
||||||
resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
|
resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
|
||||||
@@ -5195,6 +5310,14 @@ prr@~1.0.1:
|
|||||||
resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
|
resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
|
||||||
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
|
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
|
||||||
|
|
||||||
|
pump@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
||||||
|
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
|
||||||
|
dependencies:
|
||||||
|
end-of-stream "^1.1.0"
|
||||||
|
once "^1.3.1"
|
||||||
|
|
||||||
punycode@^2.1.0:
|
punycode@^2.1.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
||||||
@@ -5231,6 +5354,16 @@ rc9@^2.0.0, rc9@^2.0.1:
|
|||||||
destr "^1.2.2"
|
destr "^1.2.2"
|
||||||
flat "^5.0.2"
|
flat "^5.0.2"
|
||||||
|
|
||||||
|
rc@^1.2.7:
|
||||||
|
version "1.2.8"
|
||||||
|
resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
||||||
|
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
|
||||||
|
dependencies:
|
||||||
|
deep-extend "^0.6.0"
|
||||||
|
ini "~1.3.0"
|
||||||
|
minimist "^1.2.0"
|
||||||
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
read-cache@^1.0.0:
|
read-cache@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
|
resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
|
||||||
@@ -5422,9 +5555,9 @@ rollup@^3.10.0, rollup@^3.14.0:
|
|||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
rollup@^3.7.2:
|
rollup@^3.7.2:
|
||||||
version "3.19.1"
|
version "3.20.0"
|
||||||
resolved "https://registry.npmmirror.com/rollup/-/rollup-3.19.1.tgz#2b3a31ac1ff9f3afab2e523fa687fef5b0ee20fc"
|
resolved "https://registry.npmmirror.com/rollup/-/rollup-3.20.0.tgz#ce7bd88449a776b9f75bf4e35959e25fbd3f51b1"
|
||||||
integrity sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==
|
integrity sha512-YsIfrk80NqUDrxrjWPXUa7PWvAfegZEXHuPsEZg58fGCdjL1I9C1i/NaG+L+27kxxwkrG/QEDEQc8s/ynXWWGQ==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
@@ -5447,7 +5580,7 @@ rxjs@^7.5.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.1.0"
|
tslib "^2.1.0"
|
||||||
|
|
||||||
safe-buffer@^5.1.0, safe-buffer@~5.2.0:
|
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
|
||||||
version "5.2.1"
|
version "5.2.1"
|
||||||
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||||
@@ -5548,6 +5681,20 @@ setprototypeof@1.2.0:
|
|||||||
resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
||||||
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
||||||
|
|
||||||
|
sharp@^0.31.3:
|
||||||
|
version "0.31.3"
|
||||||
|
resolved "https://registry.npmmirror.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688"
|
||||||
|
integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==
|
||||||
|
dependencies:
|
||||||
|
color "^4.2.3"
|
||||||
|
detect-libc "^2.0.1"
|
||||||
|
node-addon-api "^5.0.0"
|
||||||
|
prebuild-install "^7.1.1"
|
||||||
|
semver "^7.3.8"
|
||||||
|
simple-get "^4.0.1"
|
||||||
|
tar-fs "^2.1.1"
|
||||||
|
tunnel-agent "^0.6.0"
|
||||||
|
|
||||||
shebang-command@^2.0.0:
|
shebang-command@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||||
@@ -5574,6 +5721,27 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
|
|||||||
resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
||||||
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
||||||
|
|
||||||
|
simple-concat@^1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
|
||||||
|
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
|
||||||
|
|
||||||
|
simple-get@^4.0.0, simple-get@^4.0.1:
|
||||||
|
version "4.0.1"
|
||||||
|
resolved "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
|
||||||
|
integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
|
||||||
|
dependencies:
|
||||||
|
decompress-response "^6.0.0"
|
||||||
|
once "^1.3.1"
|
||||||
|
simple-concat "^1.0.0"
|
||||||
|
|
||||||
|
simple-swizzle@^0.2.2:
|
||||||
|
version "0.2.2"
|
||||||
|
resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
|
||||||
|
integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
|
||||||
|
dependencies:
|
||||||
|
is-arrayish "^0.3.1"
|
||||||
|
|
||||||
slash@^4.0.0:
|
slash@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
|
resolved "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
|
||||||
@@ -5745,6 +5913,11 @@ strip-final-newline@^2.0.0:
|
|||||||
resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
||||||
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
||||||
|
|
||||||
|
strip-json-comments@~2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
||||||
|
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
|
||||||
|
|
||||||
strip-literal@^1.0.0, strip-literal@^1.0.1:
|
strip-literal@^1.0.0, strip-literal@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2"
|
resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2"
|
||||||
@@ -5807,7 +5980,17 @@ tapable@^2.2.0:
|
|||||||
resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
||||||
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
|
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
|
||||||
|
|
||||||
tar-stream@^2.2.0:
|
tar-fs@^2.0.0, tar-fs@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
|
||||||
|
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
|
||||||
|
dependencies:
|
||||||
|
chownr "^1.1.1"
|
||||||
|
mkdirp-classic "^0.5.2"
|
||||||
|
pump "^3.0.0"
|
||||||
|
tar-stream "^2.1.4"
|
||||||
|
|
||||||
|
tar-stream@^2.1.4, tar-stream@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
|
resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
|
||||||
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
|
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
|
||||||
@@ -5921,6 +6104,13 @@ tslib@^2.1.0:
|
|||||||
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
|
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
|
||||||
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|
||||||
|
|
||||||
|
tunnel-agent@^0.6.0:
|
||||||
|
version "0.6.0"
|
||||||
|
resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
||||||
|
integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
|
||||||
|
dependencies:
|
||||||
|
safe-buffer "^5.0.1"
|
||||||
|
|
||||||
type-fest@^0.16.0:
|
type-fest@^0.16.0:
|
||||||
version "0.16.0"
|
version "0.16.0"
|
||||||
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
|
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
|
||||||
@@ -5931,6 +6121,11 @@ type-fest@^0.21.3:
|
|||||||
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
|
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
|
||||||
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
|
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
|
||||||
|
|
||||||
|
type-fest@^0.8.0:
|
||||||
|
version "0.8.1"
|
||||||
|
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
|
||||||
|
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
|
||||||
|
|
||||||
type-fest@^2.11.2:
|
type-fest@^2.11.2:
|
||||||
version "2.19.0"
|
version "2.19.0"
|
||||||
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
|
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
|
||||||
|
|||||||
Reference in New Issue
Block a user