Skip to content

Commit

Permalink
feat: response to last quesition
Browse files Browse the repository at this point in the history
  • Loading branch information
orangelckc committed Mar 16, 2023
1 parent 9a4a455 commit 12133e4
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 27 deletions.
10 changes: 6 additions & 4 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ export const request = async (url: string, options?: FetchOptions) => {
usage,
message: choices[0].message
}
} catch ({ message }: any) {
dialogErrorMessage('请求出错:' + message)
} catch (error: any) {
console.log('error', error)
dialogErrorMessage('请求出错:' + error.message)
}
}

Expand All @@ -49,8 +50,9 @@ export const getOpenAIResultApi = async (messages: RecordData[]) => {
return await request(import.meta.env.VITE_OPEN_AI_URL, {
method: 'POST',
body: Body.json({
model: 'gpt-3.5-turbo',
messages
model: 'gpt-3.5-turbo-0301',
messages,
stream: false
}),
headers: {
Authorization: `Bearer ${apiKey || import.meta.env.VITE_OPEN_AI_API_KEY}`
Expand Down
5 changes: 3 additions & 2 deletions src/components/Function/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
IconSettings
} from '@arco-design/web-vue/es/icon'
import { useSessionStore } from '@/stores'
import { getAiMessage } from '@/utils'
const { currentSession, isThinking, sessionDataList } = storeToRefs(
useSessionStore()
Expand All @@ -28,8 +29,8 @@ const functions = computed(() => [
{
content: '重新回答',
icon: IconRefresh,
disabled: isThinking.value || !(sessionDataList.value.length > 2)
// handleClick: () => getAiMessage()
disabled: isThinking.value || !sessionDataList.value.length,
handleClick: () => getAiMessage()
},
{
content: '清空对话',
Expand Down
7 changes: 5 additions & 2 deletions src/components/Session/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ const { currentRole } = storeToRefs(useRoleStore())
<h3>当前session{{ currentSession?.id }}{{ currentSession?.title }}</h3>
<div
class="flex items-start p-2"
v-for="(item, index) in sessionDataList"
v-for="item in sessionDataList"
:key="item.time"
>
<Avatar class="w-14!" :value="index % 2 ? uuid : currentRole?.name" />
<Avatar
class="w-14!"
:value="item.type === 'answer' ? uuid : currentRole?.name"
/>
<div>
{{ item.messages }}
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/sqls/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export const initSQL = async () => {
await executeSQL(
`
CREATE TABLE IF NOT EXISTS session (id TEXT, title TEXT, role_id INTEGER);
CREATE TABLE IF NOT EXISTS session_data (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, messages TEXT, time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS session_data (id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT,type TEXT, messages TEXT, time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS role (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, description TEXT, is_default INTEGER DEFAULT false);
CREATE TABLE IF NOT EXISTS credit (id INTEGER PRIMARY KEY AUTOINCREMENT, history_id INTEGER, token_cost INTEGER, api_key TEXT);
`
Expand Down
9 changes: 6 additions & 3 deletions src/stores/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ export const useSessionStore = defineStore(

const { changeCurrentRole, currentRole } = useRoleStore()

const addSessionData = async (data: RecordData[]) => {
const addSessionData = async (
type: 'ask' | 'answer',
data: RecordData[]
) => {
if (!currentSession.value) return
// 检查会话是否已经存在
const isExist = await checkSessionExist()
Expand All @@ -50,8 +53,8 @@ export const useSessionStore = defineStore(
executeSQL(sql)
}

const sql = `INSERT INTO session_data (session_id, messages) VALUES (
'${currentSession.value.id}', '${JSON.stringify(data)}');`
const sql = `INSERT INTO session_data (session_id,type, messages) VALUES (
'${currentSession.value.id}','${type}', '${JSON.stringify(data)}');`

executeSQL(sql)
getSessionData()
Expand Down
3 changes: 2 additions & 1 deletion src/types/sql.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ export interface RolePayload {
export interface SessionData {
id?: number
session_id: string
messages: RecordData
type: 'ask' | 'answer'
messages: RecordData[]
time?: string
}

Expand Down
49 changes: 35 additions & 14 deletions src/utils/openai.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,55 @@
import { getOpenAIResultApi } from '@/api'
import { executeSQL } from '@/sqls'
import { useSessionStore, useRoleStore } from '@/stores'
import { RecordData } from '@/types'

export const getAiMessage = async (value?: string) => {
const { currentRole } = useRoleStore()
if (!currentRole) return
if (!value) return

let messages: RecordData[]

// 再次生成上一次问题
if (!value) {
const { sessionDataList } = useSessionStore()
const lastQuestion = sessionDataList
.filter((item) => item.type === 'ask')
.at(-1)

if (!lastQuestion) return

// 为了保证统一,这之后的内容全部删掉
const deleteSql = `DELETE FROM session_data WHERE session_id = '${lastQuestion?.session_id}' AND id >= ${lastQuestion?.id};`

await executeSQL(deleteSql)

messages = JSON.parse(lastQuestion?.messages as any) || []
} else {
// TODO 这里可以优化,如何携带上一次的对话内容
messages = [
{
role: 'system',
content: currentRole.description
},
{
role: 'user',
content: value
}
]
}

const { isThinking } = storeToRefs(useSessionStore())
const { addSessionData } = useSessionStore()

isThinking.value = true

const messages: RecordData[] = [
{
role: 'system',
content: currentRole.description
},
{
role: 'user',
content: value
}
]

addSessionData(messages)
addSessionData('ask', messages)
const result = await getOpenAIResultApi(messages)

isThinking.value = false

if (!result) return

addSessionData(result.message)
// TODO 处理流式输出的结果
addSessionData('answer', result.message)
}

0 comments on commit 12133e4

Please sign in to comment.