Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
878fda0054 |
191
components/ModelParameters.vue
Normal file
191
components/ModelParameters.vue
Normal file
@@ -0,0 +1,191 @@
|
||||
<script setup>
|
||||
const dialog = ref(false)
|
||||
const currentModel = useCurrentModel()
|
||||
const availableModels = [
|
||||
DEFAULT_MODEL.name
|
||||
]
|
||||
|
||||
watch(currentModel, (newVal, oldVal) => {
|
||||
saveCurrentModel(newVal)
|
||||
}, { deep: true })
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<v-dialog
|
||||
v-model="dialog"
|
||||
persistent
|
||||
>
|
||||
<template v-slot:activator="{ props }">
|
||||
<v-list-item
|
||||
v-bind="props"
|
||||
rounded="xl"
|
||||
prepend-icon="tune"
|
||||
:title="$t('modelParameters')"
|
||||
></v-list-item>
|
||||
</template>
|
||||
<v-card>
|
||||
<v-toolbar
|
||||
density="compact"
|
||||
>
|
||||
<v-toolbar-title>{{ $t('modelParameters') }}</v-toolbar-title>
|
||||
|
||||
<v-spacer></v-spacer>
|
||||
|
||||
<v-btn icon="close" @click="dialog = false"></v-btn>
|
||||
</v-toolbar>
|
||||
<v-card-text>
|
||||
<v-select
|
||||
v-model="currentModel.name"
|
||||
:label="$t('model')"
|
||||
:items="availableModels"
|
||||
variant="underlined"
|
||||
></v-select>
|
||||
|
||||
<v-row
|
||||
no-gutters
|
||||
>
|
||||
<v-col cols="12">
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<v-list-subheader>{{ $t('temperature') }}</v-list-subheader>
|
||||
<v-text-field
|
||||
v-model="currentModel.temperature"
|
||||
hide-details
|
||||
single-line
|
||||
density="compact"
|
||||
type="number"
|
||||
max="1"
|
||||
step="0.01"
|
||||
style="width: 100px"
|
||||
class="flex-grow-0"
|
||||
></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="currentModel.temperature"
|
||||
:max="1"
|
||||
:step="0.01"
|
||||
hide-details
|
||||
>
|
||||
</v-slider>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row
|
||||
no-gutters
|
||||
>
|
||||
<v-col cols="12">
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<v-list-subheader>{{ $t('maxTokens') }}</v-list-subheader>
|
||||
<v-text-field
|
||||
v-model="currentModel.max_tokens"
|
||||
hide-details
|
||||
single-line
|
||||
density="compact"
|
||||
type="number"
|
||||
max="2048"
|
||||
step="1"
|
||||
style="width: 100px"
|
||||
class="flex-grow-0"
|
||||
></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="currentModel.max_tokens"
|
||||
:max="2048"
|
||||
:step="1"
|
||||
hide-details
|
||||
>
|
||||
</v-slider>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row
|
||||
no-gutters
|
||||
>
|
||||
<v-col cols="12">
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<v-list-subheader>{{ $t('topP') }}</v-list-subheader>
|
||||
<v-text-field
|
||||
v-model="currentModel.top_p"
|
||||
hide-details
|
||||
single-line
|
||||
density="compact"
|
||||
type="number"
|
||||
max="1"
|
||||
step="0.01"
|
||||
style="width: 100px"
|
||||
class="flex-grow-0"
|
||||
></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="currentModel.top_p"
|
||||
:max="1"
|
||||
:step="0.01"
|
||||
hide-details
|
||||
>
|
||||
</v-slider>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row no-gutters>
|
||||
<v-col cols="12">
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<v-list-subheader>{{ $t('frequencyPenalty') }}</v-list-subheader>
|
||||
<v-text-field
|
||||
v-model="currentModel.frequency_penalty"
|
||||
hide-details
|
||||
single-line
|
||||
density="compact"
|
||||
type="number"
|
||||
max="2"
|
||||
step="0.01"
|
||||
style="width: 100px"
|
||||
class="flex-grow-0"
|
||||
></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="currentModel.frequency_penalty"
|
||||
:max="2"
|
||||
:step="0.01"
|
||||
hide-details
|
||||
></v-slider>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row no-gutters>
|
||||
<v-col cols="12">
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<v-list-subheader>{{ $t('presencePenalty') }}</v-list-subheader>
|
||||
<v-text-field
|
||||
v-model="currentModel.presence_penalty"
|
||||
hide-details
|
||||
single-line
|
||||
density="compact"
|
||||
type="number"
|
||||
max="2"
|
||||
step="0.01"
|
||||
style="width: 100px"
|
||||
class="flex-grow-0"
|
||||
></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="currentModel.presence_penalty"
|
||||
:max="2"
|
||||
:step="0.01"
|
||||
hide-details
|
||||
></v-slider>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -18,6 +18,13 @@
|
||||
"feedback": "Feedback",
|
||||
"newConversation": "New conversation",
|
||||
"clearConversations": "Clear conversations",
|
||||
"modelParameters": "Model Parameters",
|
||||
"model": "Model",
|
||||
"temperature": "Temperature",
|
||||
"topP": "Top P",
|
||||
"frequencyPenalty": "Frequency Penalty",
|
||||
"presencePenalty": "Presence Penalty",
|
||||
"maxTokens": "Max Tokens",
|
||||
"roles": {
|
||||
"me": "Me",
|
||||
"ai": "AI"
|
||||
|
||||
@@ -18,6 +18,13 @@
|
||||
"feedback": "反馈",
|
||||
"newConversation": "新的对话",
|
||||
"clearConversations": "清除对话",
|
||||
"modelParameters": "模型参数",
|
||||
"model": "模型",
|
||||
"temperature": "Temperature",
|
||||
"topP": "Top P",
|
||||
"frequencyPenalty": "Frequency Penalty",
|
||||
"presencePenalty": "Presence Penalty",
|
||||
"maxTokens": "Max Tokens",
|
||||
"roles": {
|
||||
"me": "我",
|
||||
"ai": "AI"
|
||||
|
||||
@@ -228,6 +228,8 @@ onNuxtReady(async () => {
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<ModelParameters/>
|
||||
|
||||
<v-menu
|
||||
>
|
||||
<template v-slot:activator="{ props }">
|
||||
|
||||
@@ -51,6 +51,14 @@ const abortFetch = () => {
|
||||
}
|
||||
const fetchReply = async (message, parentMessageId) => {
|
||||
ctrl = new AbortController()
|
||||
|
||||
const data = Object.assign({}, currentModel.value, {
|
||||
openaiApiKey: openaiApiKey.value,
|
||||
message: message,
|
||||
parentMessageId: parentMessageId,
|
||||
conversationId: currentConversation.value.id
|
||||
})
|
||||
|
||||
try {
|
||||
await fetchEventSource('/api/conversation/', {
|
||||
signal: ctrl.signal,
|
||||
@@ -59,13 +67,7 @@ const fetchReply = async (message, parentMessageId) => {
|
||||
'accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: currentModel.value,
|
||||
openaiApiKey: openaiApiKey.value,
|
||||
message: message,
|
||||
parentMessageId: parentMessageId,
|
||||
conversationId: currentConversation.value.id
|
||||
}),
|
||||
body: JSON.stringify(data),
|
||||
onopen(response) {
|
||||
if (response.ok && response.headers.get('content-type') === EventStreamContentType) {
|
||||
return;
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
|
||||
export const STORAGE_KEY = {
|
||||
OPENAI_MODELS: 'openai_models',
|
||||
CURRENT_OPENAI_MODEL: 'current_openai_model',
|
||||
MODELS: 'models',
|
||||
CURRENT_MODEL: 'current_model',
|
||||
OPENAI_API_KEY: 'openai_api_key',
|
||||
}
|
||||
|
||||
export const DEFAULT_MODEL = {
|
||||
name: 'gpt-3.5-turbo',
|
||||
frequency_penalty: 0.0,
|
||||
presence_penalty: 0.0,
|
||||
max_tokens: 1000,
|
||||
temperature: 0.7,
|
||||
top_p: 1.0
|
||||
}
|
||||
@@ -11,32 +11,28 @@ const set = (key, val) => {
|
||||
localStorage.setItem(key, JSON.stringify(val))
|
||||
}
|
||||
|
||||
const DEFAULT_OPENAI_MODEL = 'text-davinci-003'
|
||||
|
||||
export const setModels = (val) => {
|
||||
const models = useModels()
|
||||
set(STORAGE_KEY.OPENAI_MODELS, val)
|
||||
set(STORAGE_KEY.MODELS, val)
|
||||
models.value = val
|
||||
}
|
||||
|
||||
export const getStoredModels = () => {
|
||||
let models = get(STORAGE_KEY.OPENAI_MODELS)
|
||||
let models = get(STORAGE_KEY.MODELS)
|
||||
if (!models) {
|
||||
models = [DEFAULT_OPENAI_MODEL]
|
||||
models = [DEFAULT_MODEL]
|
||||
}
|
||||
return models
|
||||
}
|
||||
|
||||
export const setCurrentModel = (val) => {
|
||||
const model = useCurrentModel()
|
||||
set(STORAGE_KEY.CURRENT_OPENAI_MODEL, val)
|
||||
model.value = val
|
||||
export const saveCurrentModel = (val) => {
|
||||
set(STORAGE_KEY.CURRENT_MODEL, val)
|
||||
}
|
||||
|
||||
export const getCurrentModel = () => {
|
||||
let model = get(STORAGE_KEY.CURRENT_OPENAI_MODEL)
|
||||
let model = get(STORAGE_KEY.CURRENT_MODEL)
|
||||
if (!model) {
|
||||
model = DEFAULT_OPENAI_MODEL
|
||||
model = DEFAULT_MODEL
|
||||
}
|
||||
return model
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user