Spaces:
Sleeping
Sleeping
ngoctuanai
commited on
Commit
•
eba489e
1
Parent(s):
2b9e507
Upload 135 files
Browse files- package-lock.json +2 -2
- service/src/chatgpt/index.ts +9 -13
- src/hooks/useLanguage.ts +5 -7
- src/locales/vi-VN.ts +2 -0
- src/store/modules/app/helper.ts +9 -1
- src/store/modules/chat/helper.ts +2 -1
- src/store/modules/chat/index.ts +3 -2
- src/views/chat/components/Message/Text.vue +2 -2
- src/views/chat/components/Message/index.vue +2 -2
- src/views/chat/index.vue +1 -1
- src/views/chat/layout/sider/index.vue +1 -1
package-lock.json
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
{
|
2 |
"name": "chatgpt-web",
|
3 |
-
"version": "2.
|
4 |
"lockfileVersion": 2,
|
5 |
"requires": true,
|
6 |
"packages": {
|
7 |
"": {
|
8 |
"name": "chatgpt-web",
|
9 |
-
"version": "2.
|
10 |
"dependencies": {
|
11 |
"@traptitech/markdown-it-katex": "^3.6.0",
|
12 |
"@vueuse/core": "^9.13.0",
|
|
|
1 |
{
|
2 |
"name": "chatgpt-web",
|
3 |
+
"version": "2.11.1",
|
4 |
"lockfileVersion": 2,
|
5 |
"requires": true,
|
6 |
"packages": {
|
7 |
"": {
|
8 |
"name": "chatgpt-web",
|
9 |
+
"version": "2.11.1",
|
10 |
"dependencies": {
|
11 |
"@traptitech/markdown-it-katex": "^3.6.0",
|
12 |
"@vueuse/core": "^9.13.0",
|
service/src/chatgpt/index.ts
CHANGED
@@ -62,22 +62,11 @@ let api: ChatGPTAPI | ChatGPTUnofficialProxyAPI
|
|
62 |
options.maxModelTokens = 32768
|
63 |
options.maxResponseTokens = 8192
|
64 |
}
|
65 |
-
// if use GPT-4 Turbo
|
66 |
-
else if (model.toLowerCase().includes('1106-preview')) {
|
67 |
-
options.maxModelTokens = 128000
|
68 |
-
options.maxResponseTokens = 4096
|
69 |
-
}
|
70 |
else {
|
71 |
options.maxModelTokens = 8192
|
72 |
options.maxResponseTokens = 2048
|
73 |
}
|
74 |
}
|
75 |
-
else if (model.toLowerCase().includes('gpt-3.5')) {
|
76 |
-
if (model.toLowerCase().includes('16k')) {
|
77 |
-
options.maxModelTokens = 16384
|
78 |
-
options.maxResponseTokens = 4096
|
79 |
-
}
|
80 |
-
}
|
81 |
|
82 |
if (isNotEmptyString(OPENAI_API_BASE_URL))
|
83 |
options.apiBaseUrl = `${OPENAI_API_BASE_URL}/v1`
|
@@ -88,6 +77,7 @@ let api: ChatGPTAPI | ChatGPTUnofficialProxyAPI
|
|
88 |
apiModel = 'ChatGPTAPI'
|
89 |
}
|
90 |
else {
|
|
|
91 |
const options: ChatGPTUnofficialProxyAPIOptions = {
|
92 |
accessToken: process.env.OPENAI_ACCESS_TOKEN,
|
93 |
apiReverseProxyUrl: isNotEmptyString(process.env.API_REVERSE_PROXY) ? process.env.API_REVERSE_PROXY : 'https://ai.fakeopen.com/api/conversation',
|
@@ -139,9 +129,15 @@ async function chatReplyProcess(options: RequestOptions) {
|
|
139 |
}
|
140 |
|
141 |
async function fetchUsage() {
|
142 |
-
|
143 |
const OPENAI_API_BASE_URL = process.env.OPENAI_API_BASE_URL
|
144 |
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
if (!isNotEmptyString(OPENAI_API_KEY))
|
146 |
return Promise.resolve('-')
|
147 |
|
@@ -235,4 +231,4 @@ function currentModel(): ApiModel {
|
|
235 |
|
236 |
export type { ChatContext, ChatMessage }
|
237 |
|
238 |
-
export { chatReplyProcess, chatConfig, currentModel }
|
|
|
62 |
options.maxModelTokens = 32768
|
63 |
options.maxResponseTokens = 8192
|
64 |
}
|
|
|
|
|
|
|
|
|
|
|
65 |
else {
|
66 |
options.maxModelTokens = 8192
|
67 |
options.maxResponseTokens = 2048
|
68 |
}
|
69 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
71 |
if (isNotEmptyString(OPENAI_API_BASE_URL))
|
72 |
options.apiBaseUrl = `${OPENAI_API_BASE_URL}/v1`
|
|
|
77 |
apiModel = 'ChatGPTAPI'
|
78 |
}
|
79 |
else {
|
80 |
+
console.log('OPENAI_ACCESS_TOKEN',OPENAI_ACCESS_TOKEN);
|
81 |
const options: ChatGPTUnofficialProxyAPIOptions = {
|
82 |
accessToken: process.env.OPENAI_ACCESS_TOKEN,
|
83 |
apiReverseProxyUrl: isNotEmptyString(process.env.API_REVERSE_PROXY) ? process.env.API_REVERSE_PROXY : 'https://ai.fakeopen.com/api/conversation',
|
|
|
129 |
}
|
130 |
|
131 |
async function fetchUsage() {
|
132 |
+
let OPENAI_API_KEY = process.env.OPENAI_API_KEY
|
133 |
const OPENAI_API_BASE_URL = process.env.OPENAI_API_BASE_URL
|
134 |
|
135 |
+
if (isNotEmptyString(process.env.OPENAI_API_KEY_ARR)){
|
136 |
+
const OPENAI_API_KEY_ARR = JSON.parse(process.env.OPENAI_API_KEY_ARR);
|
137 |
+
const randomIndex = Math.floor(Math.random() * OPENAI_API_KEY_ARR.length);
|
138 |
+
OPENAI_API_KEY = OPENAI_API_KEY_ARR[randomIndex];
|
139 |
+
}
|
140 |
+
|
141 |
if (!isNotEmptyString(OPENAI_API_KEY))
|
142 |
return Promise.resolve('-')
|
143 |
|
|
|
231 |
|
232 |
export type { ChatContext, ChatMessage }
|
233 |
|
234 |
+
export { chatReplyProcess, chatConfig, currentModel }
|
src/hooks/useLanguage.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import { computed } from 'vue'
|
2 |
-
import {
|
3 |
import { useAppStore } from '@/store'
|
4 |
import { setLocale } from '@/locales'
|
5 |
|
@@ -7,18 +7,16 @@ export function useLanguage() {
|
|
7 |
const appStore = useAppStore()
|
8 |
|
9 |
const language = computed(() => {
|
|
|
10 |
switch (appStore.language) {
|
11 |
-
case 'vi-VN':
|
12 |
-
setLocale('vi-VN')
|
13 |
-
return viVN
|
14 |
case 'en-US':
|
15 |
-
setLocale('en-US')
|
16 |
return enUS
|
|
|
|
|
17 |
default:
|
18 |
-
setLocale('en-US')
|
19 |
return enUS
|
20 |
}
|
21 |
})
|
22 |
|
23 |
return { language }
|
24 |
-
}
|
|
|
1 |
import { computed } from 'vue'
|
2 |
+
import { enUS, viVN } from 'naive-ui'
|
3 |
import { useAppStore } from '@/store'
|
4 |
import { setLocale } from '@/locales'
|
5 |
|
|
|
7 |
const appStore = useAppStore()
|
8 |
|
9 |
const language = computed(() => {
|
10 |
+
setLocale(appStore.language)
|
11 |
switch (appStore.language) {
|
|
|
|
|
|
|
12 |
case 'en-US':
|
|
|
13 |
return enUS
|
14 |
+
case 'vi-VN':
|
15 |
+
return viVN
|
16 |
default:
|
|
|
17 |
return enUS
|
18 |
}
|
19 |
})
|
20 |
|
21 |
return { language }
|
22 |
+
}
|
src/locales/vi-VN.ts
CHANGED
@@ -30,11 +30,13 @@ export default {
|
|
30 |
},
|
31 |
chat: {
|
32 |
newChatButton: 'Cuộc trò truyện mới',
|
|
|
33 |
placeholder: 'Hỏi tôi bất cứ điều gì...(Shift + Enter = ngắt dòng, "/" để kích hoạt lời nhắc)',
|
34 |
placeholderMobile: 'Hỏi tôi điều gì đó...',
|
35 |
copy: 'Sao chép',
|
36 |
copied: 'Đã sao chép',
|
37 |
copyCode: 'Sao chép mã',
|
|
|
38 |
clearChat: 'Xóa Chat',
|
39 |
clearChatConfirm: 'Bạn có chắc chắn muốn xóa chat này?',
|
40 |
exportImage: 'Xuất Ảnh',
|
|
|
30 |
},
|
31 |
chat: {
|
32 |
newChatButton: 'Cuộc trò truyện mới',
|
33 |
+
newChatTitle: 'Hội thoại mới',
|
34 |
placeholder: 'Hỏi tôi bất cứ điều gì...(Shift + Enter = ngắt dòng, "/" để kích hoạt lời nhắc)',
|
35 |
placeholderMobile: 'Hỏi tôi điều gì đó...',
|
36 |
copy: 'Sao chép',
|
37 |
copied: 'Đã sao chép',
|
38 |
copyCode: 'Sao chép mã',
|
39 |
+
copyFailed: 'Sao chép thất bại',
|
40 |
clearChat: 'Xóa Chat',
|
41 |
clearChatConfirm: 'Bạn có chắc chắn muốn xóa chat này?',
|
42 |
exportImage: 'Xuất Ảnh',
|
src/store/modules/app/helper.ts
CHANGED
@@ -6,6 +6,13 @@ export type Theme = 'light' | 'dark' | 'auto'
|
|
6 |
|
7 |
export type Language = 'en-US' | 'vi-VN'
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
export interface AppState {
|
10 |
siderCollapsed: boolean
|
11 |
theme: Theme
|
@@ -13,7 +20,8 @@ export interface AppState {
|
|
13 |
}
|
14 |
|
15 |
export function defaultSetting(): AppState {
|
16 |
-
|
|
|
17 |
}
|
18 |
|
19 |
export function getLocalSetting(): AppState {
|
|
|
6 |
|
7 |
export type Language = 'en-US' | 'vi-VN'
|
8 |
|
9 |
+
const languageMap: { [key: string]: Language } = {
|
10 |
+
'en': 'en-US',
|
11 |
+
'en-US': 'en-US',
|
12 |
+
'vi': 'vi-VN',
|
13 |
+
'vi-VN': 'vi-VN',
|
14 |
+
}
|
15 |
+
|
16 |
export interface AppState {
|
17 |
siderCollapsed: boolean
|
18 |
theme: Theme
|
|
|
20 |
}
|
21 |
|
22 |
export function defaultSetting(): AppState {
|
23 |
+
const language = languageMap[navigator.language]
|
24 |
+
return { siderCollapsed: false, theme: 'light', language }
|
25 |
}
|
26 |
|
27 |
export function getLocalSetting(): AppState {
|
src/store/modules/chat/helper.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import { ss } from '@/utils/storage'
|
|
|
2 |
|
3 |
const LOCAL_NAME = 'chatStorage'
|
4 |
|
@@ -7,7 +8,7 @@ export function defaultState(): Chat.ChatState {
|
|
7 |
return {
|
8 |
active: uuid,
|
9 |
usingContext: true,
|
10 |
-
history: [{ uuid, title: '
|
11 |
chat: [{ uuid, data: [] }],
|
12 |
}
|
13 |
}
|
|
|
1 |
import { ss } from '@/utils/storage'
|
2 |
+
import { t } from '@/locales'
|
3 |
|
4 |
const LOCAL_NAME = 'chatStorage'
|
5 |
|
|
|
8 |
return {
|
9 |
active: uuid,
|
10 |
usingContext: true,
|
11 |
+
history: [{ uuid, title: t('chat.newChatTitle'), isEdit: false }],
|
12 |
chat: [{ uuid, data: [] }],
|
13 |
}
|
14 |
}
|
src/store/modules/chat/index.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
import { defineStore } from 'pinia'
|
2 |
import { defaultState, getLocalState, setLocalState } from './helper'
|
3 |
import { router } from '@/router'
|
|
|
4 |
|
5 |
export const useChatStore = defineStore('chat-store', {
|
6 |
state: (): Chat.ChatState => getLocalState(),
|
@@ -103,7 +104,7 @@ export const useChatStore = defineStore('chat-store', {
|
|
103 |
}
|
104 |
else {
|
105 |
this.chat[0].data.push(chat)
|
106 |
-
if (this.history[0].title === '
|
107 |
this.history[0].title = chat.text
|
108 |
this.recordState()
|
109 |
}
|
@@ -112,7 +113,7 @@ export const useChatStore = defineStore('chat-store', {
|
|
112 |
const index = this.chat.findIndex(item => item.uuid === uuid)
|
113 |
if (index !== -1) {
|
114 |
this.chat[index].data.push(chat)
|
115 |
-
if (this.history[index].title === '
|
116 |
this.history[index].title = chat.text
|
117 |
this.recordState()
|
118 |
}
|
|
|
1 |
import { defineStore } from 'pinia'
|
2 |
import { defaultState, getLocalState, setLocalState } from './helper'
|
3 |
import { router } from '@/router'
|
4 |
+
import { t } from '@/locales'
|
5 |
|
6 |
export const useChatStore = defineStore('chat-store', {
|
7 |
state: (): Chat.ChatState => getLocalState(),
|
|
|
104 |
}
|
105 |
else {
|
106 |
this.chat[0].data.push(chat)
|
107 |
+
if (this.history[0].title === t('chat.newChatTitle'))
|
108 |
this.history[0].title = chat.text
|
109 |
this.recordState()
|
110 |
}
|
|
|
113 |
const index = this.chat.findIndex(item => item.uuid === uuid)
|
114 |
if (index !== -1) {
|
115 |
this.chat[index].data.push(chat)
|
116 |
+
if (this.history[index].title === t('chat.newChatTitle'))
|
117 |
this.history[index].title = chat.text
|
118 |
this.recordState()
|
119 |
}
|
src/views/chat/components/Message/Text.vue
CHANGED
@@ -70,9 +70,9 @@ function addCopyEvents() {
|
|
70 |
const code = btn.parentElement?.nextElementSibling?.textContent
|
71 |
if (code) {
|
72 |
copyToClip(code).then(() => {
|
73 |
-
btn.textContent = '
|
74 |
setTimeout(() => {
|
75 |
-
btn.textContent = '
|
76 |
}, 1000)
|
77 |
})
|
78 |
}
|
|
|
70 |
const code = btn.parentElement?.nextElementSibling?.textContent
|
71 |
if (code) {
|
72 |
copyToClip(code).then(() => {
|
73 |
+
btn.textContent = t('chat.copied')
|
74 |
setTimeout(() => {
|
75 |
+
btn.textContent = t('chat.copyCode')
|
76 |
}, 1000)
|
77 |
})
|
78 |
}
|
src/views/chat/components/Message/index.vue
CHANGED
@@ -84,10 +84,10 @@ function handleRegenerate() {
|
|
84 |
async function handleCopy() {
|
85 |
try {
|
86 |
await copyToClip(props.text || '')
|
87 |
-
message.success('
|
88 |
}
|
89 |
catch {
|
90 |
-
message.error('
|
91 |
}
|
92 |
}
|
93 |
</script>
|
|
|
84 |
async function handleCopy() {
|
85 |
try {
|
86 |
await copyToClip(props.text || '')
|
87 |
+
message.success(t('chat.copied'))
|
88 |
}
|
89 |
catch {
|
90 |
+
message.error(t('chat.copyFailed'))
|
91 |
}
|
92 |
}
|
93 |
</script>
|
src/views/chat/index.vue
CHANGED
@@ -481,7 +481,7 @@ onUnmounted(() => {
|
|
481 |
<template v-if="!dataSources.length">
|
482 |
<div class="flex items-center justify-center mt-4 text-center text-neutral-300">
|
483 |
<SvgIcon icon="ri:bubble-chart-fill" class="mr-2 text-3xl" />
|
484 |
-
<span>
|
485 |
</div>
|
486 |
</template>
|
487 |
<template v-else>
|
|
|
481 |
<template v-if="!dataSources.length">
|
482 |
<div class="flex items-center justify-center mt-4 text-center text-neutral-300">
|
483 |
<SvgIcon icon="ri:bubble-chart-fill" class="mr-2 text-3xl" />
|
484 |
+
<span>{{ t('chat.newChatTitle') }}</span>
|
485 |
</div>
|
486 |
</template>
|
487 |
<template v-else>
|
src/views/chat/layout/sider/index.vue
CHANGED
@@ -20,7 +20,7 @@ const show = ref(false)
|
|
20 |
const collapsed = computed(() => appStore.siderCollapsed)
|
21 |
|
22 |
function handleAdd() {
|
23 |
-
chatStore.addHistory({ title: '
|
24 |
if (isMobile.value)
|
25 |
appStore.setSiderCollapsed(true)
|
26 |
}
|
|
|
20 |
const collapsed = computed(() => appStore.siderCollapsed)
|
21 |
|
22 |
function handleAdd() {
|
23 |
+
chatStore.addHistory({ title: t('chat.newChatTitle'), uuid: Date.now(), isEdit: false })
|
24 |
if (isMobile.value)
|
25 |
appStore.setSiderCollapsed(true)
|
26 |
}
|