56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
// src/routes/chat.routes.js
|
|
// 채팅 API 라우트 (OpenAI 호환)
|
|
|
|
const express = require('express');
|
|
const { body } = require('express-validator');
|
|
const chatController = require('../controllers/chat.controller');
|
|
const { authenticateAny } = require('../middlewares/auth.middleware');
|
|
const { validateRequest } = require('../middlewares/validation.middleware');
|
|
const { usageLogger } = require('../middlewares/usage-logger.middleware');
|
|
|
|
const router = express.Router();
|
|
|
|
/**
|
|
* POST /api/v1/chat/completions
|
|
* 채팅 완성 API (OpenAI 호환)
|
|
*
|
|
* 인증: Bearer API_KEY 또는 JWT 토큰
|
|
*/
|
|
router.post(
|
|
'/completions',
|
|
authenticateAny,
|
|
[
|
|
body('model')
|
|
.optional()
|
|
.isString()
|
|
.withMessage('모델은 문자열이어야 합니다'),
|
|
body('messages')
|
|
.isArray({ min: 1 })
|
|
.withMessage('메시지 배열이 필요합니다'),
|
|
body('messages.*.role')
|
|
.isIn(['system', 'user', 'assistant'])
|
|
.withMessage('메시지 역할은 system, user, assistant 중 하나여야 합니다'),
|
|
body('messages.*.content')
|
|
.isString()
|
|
.notEmpty()
|
|
.withMessage('메시지 내용이 필요합니다'),
|
|
body('temperature')
|
|
.optional()
|
|
.isFloat({ min: 0, max: 2 })
|
|
.withMessage('온도는 0-2 사이여야 합니다'),
|
|
body('max_tokens')
|
|
.optional()
|
|
.isInt({ min: 1, max: 128000 })
|
|
.withMessage('최대 토큰은 1-128000 사이여야 합니다'),
|
|
body('stream')
|
|
.optional()
|
|
.isBoolean()
|
|
.withMessage('스트림은 불리언이어야 합니다'),
|
|
validateRequest,
|
|
],
|
|
usageLogger,
|
|
chatController.completions
|
|
);
|
|
|
|
module.exports = router;
|