// src/swagger/api-docs.js // Swagger API 문서 정의 /** * @swagger * /auth/register: * post: * tags: [Auth] * summary: 회원가입 * description: 새 계정을 생성합니다. * requestBody: * required: true * content: * application/json: * schema: * type: object * required: [email, password, name] * properties: * email: * type: string * format: email * example: user@example.com * password: * type: string * minLength: 8 * example: Password123! * description: 8자 이상, 영문/숫자/특수문자 포함 * name: * type: string * example: 홍길동 * responses: * 201: * description: 회원가입 성공 * 400: * description: 유효성 검사 실패 * 409: * description: 이미 존재하는 이메일 */ /** * @swagger * /auth/login: * post: * tags: [Auth] * summary: 로그인 * description: 이메일과 비밀번호로 로그인합니다. * requestBody: * required: true * content: * application/json: * schema: * type: object * required: [email, password] * properties: * email: * type: string * format: email * example: admin@admin.com * password: * type: string * example: Admin123! * responses: * 200: * description: 로그인 성공 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * user: * type: object * accessToken: * type: string * description: JWT 액세스 토큰 * refreshToken: * type: string * description: JWT 리프레시 토큰 * 401: * description: 인증 실패 */ /** * @swagger * /chat/completions: * post: * tags: [Chat] * summary: 채팅 완성 (OpenAI 호환) * description: | * AI 모델에 메시지를 보내고 응답을 받습니다. * OpenAI API와 호환되는 형식입니다. * * **인증**: JWT 토큰 또는 API 키 (sk-xxx) * security: * - BearerAuth: [] * requestBody: * required: true * content: * application/json: * schema: * $ref: '#/components/schemas/ChatCompletionRequest' * examples: * simple: * summary: 간단한 질문 * value: * model: gemini-2.0-flash * messages: * - role: user * content: 안녕하세요! * with_system: * summary: 시스템 프롬프트 포함 * value: * model: gemini-2.0-flash * messages: * - role: system * content: 당신은 친절한 AI 어시스턴트입니다. * - role: user * content: 파이썬으로 Hello World 출력하는 코드 알려줘 * temperature: 0.7 * max_tokens: 1000 * responses: * 200: * description: 성공 * content: * application/json: * schema: * $ref: '#/components/schemas/ChatCompletionResponse' * 401: * description: 인증 실패 * 429: * description: 요청 한도 초과 */ /** * @swagger * /models: * get: * tags: [Models] * summary: 모델 목록 조회 * description: 사용 가능한 AI 모델 목록을 조회합니다. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * content: * application/json: * schema: * type: object * properties: * object: * type: string * example: list * data: * type: array * items: * type: object * properties: * id: * type: string * example: gemini-2.0-flash * object: * type: string * example: model * owned_by: * type: string * example: google */ /** * @swagger * /api-keys: * get: * tags: [API Keys] * summary: API 키 목록 조회 * description: 발급받은 API 키 목록을 조회합니다. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * post: * tags: [API Keys] * summary: API 키 발급 * description: 새 API 키를 발급받습니다. 키는 한 번만 표시됩니다. * security: * - BearerAuth: [] * requestBody: * required: true * content: * application/json: * schema: * type: object * required: [name] * properties: * name: * type: string * example: My API Key * description: API 키 이름 * responses: * 201: * description: 발급 성공 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * data: * type: object * properties: * key: * type: string * description: 발급된 API 키 (한 번만 표시) * example: sk-abc123def456... */ /** * @swagger * /api-keys/{id}: * delete: * tags: [API Keys] * summary: API 키 폐기 * description: API 키를 폐기합니다. * security: * - BearerAuth: [] * parameters: * - in: path * name: id * required: true * schema: * type: string * description: API 키 ID * responses: * 200: * description: 폐기 성공 * 404: * description: API 키를 찾을 수 없음 */ /** * @swagger * /usage: * get: * tags: [Usage] * summary: 사용량 요약 조회 * description: 오늘/이번 달 사용량 요약을 조회합니다. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * data: * type: object * properties: * plan: * type: string * example: free * limit: * type: object * properties: * monthly: * type: integer * remaining: * type: integer * usage: * type: object * properties: * today: * type: object * monthly: * type: object */ /** * @swagger * /usage/logs: * get: * tags: [Usage] * summary: 사용 로그 조회 * description: API 호출 로그를 조회합니다. * security: * - BearerAuth: [] * parameters: * - in: query * name: page * schema: * type: integer * default: 1 * - in: query * name: limit * schema: * type: integer * default: 20 * responses: * 200: * description: 성공 */ /** * @swagger * /admin/users: * get: * tags: [Admin] * summary: 사용자 목록 조회 (관리자) * description: 모든 사용자 목록을 조회합니다. 관리자 권한 필요. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * 403: * description: 권한 없음 */ /** * @swagger * /admin/providers: * get: * tags: [Admin] * summary: LLM 프로바이더 목록 (관리자) * description: LLM 프로바이더 설정을 조회합니다. 관리자 권한 필요. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * 403: * description: 권한 없음 */ /** * @swagger * /admin/stats: * get: * tags: [Admin] * summary: 시스템 통계 (관리자) * description: 시스템 전체 통계를 조회합니다. 관리자 권한 필요. * security: * - BearerAuth: [] * responses: * 200: * description: 성공 * 403: * description: 권한 없음 */