feat: 统一服务端返回参数

This commit is contained in:
ChenZhaoYu 2023-02-13 15:08:55 +08:00
parent 73c9ac4d8f
commit dd522eb404
3 changed files with 87 additions and 22 deletions

View File

@ -1,7 +1,9 @@
import * as dotenv from 'dotenv' import * as dotenv from 'dotenv'
import type { SendMessageOptions } from 'chatgpt'
import { ChatGPTAPI } from 'chatgpt' import { ChatGPTAPI } from 'chatgpt'
import { sendResponse } from './utils'
interface ChatContext { export interface ChatContext {
conversationId?: string conversationId?: string
parentMessageId?: string parentMessageId?: string
} }
@ -22,18 +24,17 @@ const api = new ChatGPTAPI({ apiKey })
async function chatReply(message: string) { async function chatReply(message: string) {
if (!message) if (!message)
return return sendResponse({ type: 'fail', message: 'Message is empty' })
try {
// Get the last context from the chat context // Get the last context from the chat context
// If there is a last context, add it to the options let options: SendMessageOptions = {}
let options = {}
const lastContext = Array.from(chatContext).pop() const lastContext = Array.from(chatContext).pop()
if (lastContext) {
const { conversationId, parentMessageId } = lastContext if (lastContext)
options = { conversationId, parentMessageId } options = { ...lastContext }
}
// Send the message to the API
const response = await api.sendMessage(message, { ...options }) const response = await api.sendMessage(message, { ...options })
const { conversationId, id } = response const { conversationId, id } = response
@ -42,13 +43,38 @@ async function chatReply(message: string) {
if (conversationId && id) if (conversationId && id)
chatContext.add({ conversationId, parentMessageId: id }) chatContext.add({ conversationId, parentMessageId: id })
return response return sendResponse({ type: 'success', data: response })
}
catch (error: any) {
return sendResponse({ type: 'fail', message: error.message })
}
}
async function chatReplayOne(message: string, options?: ChatContext) {
if (!message)
return sendResponse({ type: 'fail', message: 'Message is empty' })
try {
let messageOptions: SendMessageOptions = {}
if (options) {
const { conversationId, parentMessageId } = options
messageOptions = { conversationId, parentMessageId }
const response = await api.sendMessage(message, { ...messageOptions })
return sendResponse({ type: 'success', data: response })
}
}
catch (error: any) {
return sendResponse({ type: 'fail', message: error.message })
}
} }
async function clearChatContext() { async function clearChatContext() {
// Clear the chat context // Clear the chat context
chatContext.clear() chatContext.clear()
return Promise.resolve({ message: 'Chat context cleared' }) return sendResponse({ type: 'success', message: 'Chat context cleared' })
} }
export { chatReply, clearChatContext } export { chatReply, chatReplayOne, clearChatContext }

View File

@ -1,5 +1,6 @@
import express from 'express' import express from 'express'
import { chatReply, clearChatContext } from './chatgpt' import type { ChatContext } from './chatgpt'
import { chatReplayOne, chatReply, clearChatContext } from './chatgpt'
const app = express() const app = express()
@ -15,9 +16,25 @@ app.all('*', (req, res, next) => {
app.listen(3002, () => globalThis.console.log('Server is running on port 3002')) app.listen(3002, () => globalThis.console.log('Server is running on port 3002'))
app.post('/chat', async (req, res) => { app.post('/chat', async (req, res) => {
const { message } = req.body try {
const response = await chatReply(message) const { prompt } = req.body as { prompt: string }
const response = await chatReply(prompt)
res.send(response) res.send(response)
}
catch (error) {
res.send(error)
}
})
app.post('./chatOne', async (req, res) => {
try {
const { prompt, options = {} } = req.body as { prompt: string; options?: ChatContext }
const response = await chatReplayOne(prompt, options)
res.send(response)
}
catch (error) {
res.send(error)
}
}) })
app.post('/clear', async (req, res) => { app.post('/clear', async (req, res) => {

View File

@ -0,0 +1,22 @@
interface SendResponseOptions {
type: 'success' | 'fail'
message?: string
data?: any
}
export function sendResponse(options: SendResponseOptions) {
if (options.type === 'success') {
return Promise.resolve({
message: options.message ?? 'Success',
data: options.data ?? null,
status: options.type,
})
}
// eslint-disable-next-line prefer-promise-reject-errors
return Promise.reject({
message: options.message ?? 'Failed',
data: options.data ?? null,
status: options.type,
})
}