|
import express from 'express' |
|
import type { RequestProps } from './types' |
|
import type { ChatMessage } from './chatgpt' |
|
import { chatConfig, chatReplyProcess, currentModel } from './chatgpt' |
|
import { auth } from './middleware/auth' |
|
import { limiter } from './middleware/limiter' |
|
import { isNotEmptyString } from './utils/is' |
|
|
|
const app = express() |
|
const router = express.Router() |
|
|
|
app.use(express.static('public')) |
|
app.use(express.json()) |
|
|
|
app.all('*', (_, res, next) => { |
|
res.header('Access-Control-Allow-Origin', '*') |
|
res.header('Access-Control-Allow-Headers', 'authorization, Content-Type') |
|
res.header('Access-Control-Allow-Methods', '*') |
|
next() |
|
}) |
|
|
|
router.post('/chat-process', [auth, limiter], async (req, res) => { |
|
res.setHeader('Content-type', 'application/octet-stream') |
|
|
|
try { |
|
const { prompt, options = {}, systemMessage, temperature, top_p } = req.body as RequestProps |
|
let firstChunk = true |
|
await chatReplyProcess({ |
|
message: prompt, |
|
lastContext: options, |
|
process: (chat: ChatMessage) => { |
|
res.write(firstChunk ? JSON.stringify(chat) : `\n${JSON.stringify(chat)}`) |
|
firstChunk = false |
|
}, |
|
systemMessage, |
|
temperature, |
|
top_p, |
|
}) |
|
} |
|
catch (error) { |
|
res.write(JSON.stringify(error)) |
|
} |
|
finally { |
|
res.end() |
|
} |
|
}) |
|
|
|
router.post('/config', auth, async (req, res) => { |
|
try { |
|
const response = await chatConfig() |
|
res.send(response) |
|
} |
|
catch (error) { |
|
res.send(error) |
|
} |
|
}) |
|
|
|
router.post('/session', async (req, res) => { |
|
try { |
|
const AUTH_SECRET_KEY = process.env.AUTH_SECRET_KEY |
|
const hasAuth = isNotEmptyString(AUTH_SECRET_KEY) |
|
res.send({ status: 'Success', message: '', data: { auth: hasAuth, model: currentModel() } }) |
|
} |
|
catch (error) { |
|
res.send({ status: 'Fail', message: error.message, data: null }) |
|
} |
|
}) |
|
|
|
router.post('/verify', async (req, res) => { |
|
try { |
|
const { token } = req.body as { token: string } |
|
if (!token) |
|
throw new Error('Secret key is empty') |
|
|
|
if (process.env.AUTH_SECRET_KEY !== token) |
|
throw new Error('密钥无效 | Secret key is invalid') |
|
|
|
res.send({ status: 'Success', message: 'Verify successfully', data: null }) |
|
} |
|
catch (error) { |
|
res.send({ status: 'Fail', message: error.message, data: null }) |
|
} |
|
}) |
|
|
|
app.use('', router) |
|
app.use('/api', router) |
|
app.set('trust proxy', 1) |
|
|
|
app.listen(3002, () => globalThis.console.log('Server is running on port 3002')) |