Skip to content

Commit

Permalink
feat: 支持上下文联想
Browse files Browse the repository at this point in the history
  • Loading branch information
Chanzhaoyu committed Feb 11, 2023
1 parent 52bfd15 commit 4b16560
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 14 deletions.
43 changes: 39 additions & 4 deletions service/chatgpt.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,54 @@
import dotenv from 'dotenv'
import { ChatGPTAPI } from 'chatgpt'

interface ChatContext {
conversationId?: string
parentMessageId?: string
}

dotenv.config()

const apiKey = ''
const apiKey = process.env.OPENAI_API_KEY

if (apiKey === undefined)
throw new Error('OPENAI_API_KEY is not defined')

const chatContext = new Set<ChatContext>()

/**
* More Info: https://github.com/transitive-bullshit/chatgpt-api
*/
const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY || apiKey })
const api = new ChatGPTAPI({ apiKey })

async function chatReply(message: string) {
if (!message)
return
return await api.sendMessage(message)

// Get the last context from the chat context
// If there is a last context, add it to the options
let options = {}
const lastContext = Array.from(chatContext).pop()
if (lastContext) {
const { conversationId, parentMessageId } = lastContext
options = { conversationId, parentMessageId }
}

// Send the message to the API
const response = await api.sendMessage(message, { ...options })

const { conversationId, id } = response

// Add the new context to the chat context
if (conversationId && id)
chatContext.add({ conversationId, parentMessageId: id })

return response
}

async function clearChatContext() {
// Clear the chat context
chatContext.clear()
return Promise.resolve({ message: 'Chat context cleared' })
}

export { chatReply }
export { chatReply, clearChatContext }
7 changes: 6 additions & 1 deletion service/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import express from 'express'
import { chatReply } from './chatgpt'
import { chatReply, clearChatContext } from './chatgpt'

const app = express()

Expand All @@ -19,3 +19,8 @@ app.post('/chat', async (req, res) => {
const response = await chatReply(message)
res.send(response)
})

app.post('/clear', async (req, res) => {
const response = await clearChatContext()
res.send(response)
})
17 changes: 12 additions & 5 deletions src/views/Chat/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { nextTick, onMounted, ref } from 'vue'
import { NButton, NInput, NPopover, useMessage } from 'naive-ui'
import { Message } from './components'
import { fetchChatAPI } from './request'
import { clearChatContext, fetchChatAPI } from './request'
import { Icon } from '@/components'
interface ListProps {
Expand All @@ -27,9 +27,16 @@ function initChat() {
addMessage('Hi, I am ChatGPT, a chatbot based on GPT-3.', false)
}
function handleClear() {
list.value = []
setTimeout(initChat, 100)
async function handleClear() {
try {
const { message } = await clearChatContext()
ms.success(message)
list.value = []
setTimeout(initChat, 100)
}
catch (error) {
ms.error('Clear failed, please try again later.')
}
}
function handleEnter(event: KeyboardEvent) {
Expand Down Expand Up @@ -81,7 +88,7 @@ function addMessage(message: string, reversal = false) {
<Icon icon="ri:delete-bin-6-line" />
</button>
</template>
<span>Clear</span>
<span>Clear Context</span>
</NPopover>
</div>
</header>
Expand Down
22 changes: 18 additions & 4 deletions src/views/Chat/request.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import axios from 'axios'

async function fetchChatAPI(message: string) {
const url = `${import.meta.env.VITE_GLOB_API_URL}/chat`
const BASE_URL = import.meta.env.VITE_GLOB_API_URL

async function fetchChatAPI(message: string) {
if (!message || message.trim() === '')
return

try {
const { status, data } = await axios.post(url, { message })
const { status, data } = await axios.post(`${BASE_URL}/chat`, { message })

if (status === 200) {
if (data.text)
Expand All @@ -24,4 +24,18 @@ async function fetchChatAPI(message: string) {
}
}

export { fetchChatAPI }
async function clearChatContext() {
try {
const { status, data } = await axios.post(`${BASE_URL}/clear`)

if (status === 200)
return Promise.resolve(data)

return Promise.reject(new Error('Request failed'))
}
catch (error) {
return Promise.reject(error)
}
}

export { fetchChatAPI, clearChatContext }

0 comments on commit 4b16560

Please sign in to comment.