feat: 统一服务端返回参数
This commit is contained in:
parent
73c9ac4d8f
commit
dd522eb404
|
@ -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 }
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue