// 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;