@@ -21,7 +21,12 @@ const router = express.Router();
2121 * /api/ai/predictions:
2222 * post:
2323 * summary: 문장 추천 (기본 3가지)
24- * description: 낱말 카드를 조합하여 자연스러운 문장 3개를 추천합니다. 캐시가 있으면 즉시 반환하고, 없으면 AI 호출 후 캐시에 저장합니다.
24+ * description: |
25+ * 낱말 카드를 조합하여 자연스러운 문장 3개를 추천합니다. 캐시가 있으면 즉시 반환하고, 없으면 AI 호출 후 캐시에 저장합니다.
26+ *
27+ * **`tone`** — 반말/존댓말 토글 (기기 내 설정값 반영)
28+ *
29+ * > 토글 OFF → `HONORIFIC` (존댓말, 기본값) / 토글 ON → `INFORMAL` (반말)
2530 * tags: [AI]
2631 * security:
2732 * - bearerAuth: []
@@ -56,6 +61,10 @@ const router = express.Router();
5661 * type: string
5762 * description: 최근 대화 기록 (최대 10분 이내)
5863 * example: ["약 먹어야 해", "오늘 기분 좋아"]
64+ * tone:
65+ * type: string
66+ * enum: [HONORIFIC, INFORMAL]
67+ * description: "tone — 반말/존댓말 토글 (기기 내 설정값 반영)\n\n토글 OFF → HONORIFIC (존댓말, 기본값) / 토글 ON → INFORMAL (반말)"
5968 * refresh:
6069 * type: boolean
6170 * default: false
@@ -81,6 +90,12 @@ const router = express.Router();
8190 * items:
8291 * type: string
8392 * example: ["물 좀 주세요", "물 주실래요?", "물 한 잔 주시겠어요?"]
93+ * tone:
94+ * type: string
95+ * nullable: true
96+ * enum: [HONORIFIC, INFORMAL]
97+ * description: 요청한 tone 값 (미전달 시 null)
98+ * example: "HONORIFIC"
8499 * fromCache:
85100 * type: boolean
86101 * description: 캐시에서 반환되었는지 여부
@@ -111,6 +126,14 @@ const router = express.Router();
111126 * code: "VALIDATION001"
112127 * message: "낱말 카드는 최소 1개, 최대 10개까지 선택 가능합니다"
113128 * detail: null
129+ * invalidTone:
130+ * summary: tone 값 오류
131+ * value:
132+ * success: false
133+ * error:
134+ * code: "VALIDATION001"
135+ * message: "tone은 HONORIFIC 또는 INFORMAL만 가능합니다"
136+ * detail: null
114137 * 401:
115138 * $ref: '#/components/responses/Unauthorized'
116139 * 500:
@@ -301,11 +324,13 @@ router.get('/contexts', authenticate, contextController);
301324 * 낱말 카드 + 어미 카드를 조합하여 특정 스타일의 문장을 생성합니다. predictions와 동일한 Cache-First 전략을 사용합니다.
302325 *
303326 * **`tone`** — 반말/존댓말 토글 (기기 내 설정값 반영)
304- * 토글 OFF → `HONORIFIC` (존댓말, 기본값) / 토글 ON → `INFORMAL` (반말)
327+ *
328+ * > 토글 OFF → `HONORIFIC` (존댓말, 기본값) / 토글 ON → `INFORMAL` (반말)
305329 *
306330 * **`endingCards`** — 어미 선택 카드 (문장 스타일 지정)
307- * `하고 싶어요` / `하기 싫어요` / `질문` / `해주세요` / `합시다` 및 사용자 커스텀 어미 가능.
308- * LLM이 어미의 의미를 해석하여 자연스러운 문장으로 변환합니다.
331+ *
332+ * > `하고 싶어요` / `하기 싫어요` / `질문` / `해주세요` / `합시다` 및 사용자 커스텀 어미 가능.
333+ * > LLM이 어미의 의미를 해석하여 자연스러운 문장으로 변환합니다.
309334 *
310335 * 두 파라미터는 **독립적이며 동시에 사용 가능**합니다. `tone`은 반말/존댓말만 제어하고, `endingCards`는 문장의 의도/어미를 제어합니다.
311336 * tags: [AI]
@@ -339,11 +364,11 @@ router.get('/contexts', authenticate, contextController);
339364 * type: string
340365 * minItems: 1
341366 * maxItems: 5
342- * description: "선택한 어미 카드 배열 (1~ 5개). tone 없이 사용 시 필수. 기본 카드: 하고 싶어요, 하기 싫어요, 질문, 해주세요, 합시다"
367+ * description: "선택한 어미 카드 배열 (최대 5개). tone 없이 사용 시 필수. 기본 카드: 하고 싶어요, 하기 싫어요, 질문, 해주세요, 합시다. tone과 독립적으로 동시 사용 가능. "
343368 * tone:
344369 * type: string
345370 * enum: [HONORIFIC, INFORMAL]
346- * description: "반말/존댓말 모드. HONORIFIC(존댓말) 또는 INFORMAL(반말). endingCards 없이 단독 사용 가능. 있을 경우 endingCards 앞에 반말/존댓말 카드로 변환되어 우선 적용됨. "
371+ * description: "tone — 반말/존댓말 토글 (기기 내 설정값 반영)\n\n토글 OFF → HONORIFIC (존댓말, 기본값) / 토글 ON → INFORMAL (반말) "
347372 * refresh:
348373 * type: boolean
349374 * default: false
@@ -372,11 +397,17 @@ router.get('/contexts', authenticate, contextController);
372397 * type: array
373398 * items:
374399 * type: string
375- * description: "실제 적용된 어미 카드 배열. tone 사용 시 맨 앞에 반말/존댓말 카드가 추가됨. 예: tone=INFORMAL → [\"반말\", \"질문\"]"
376- * example: ["반말", "질문"]
400+ * description: "입력한 어미 카드 배열 (tone 카드 미포함)"
401+ * example: ["질문"]
402+ * tone:
403+ * type: string
404+ * nullable: true
405+ * enum: [HONORIFIC, INFORMAL]
406+ * description: 요청한 tone 값 (미전달 시 null)
407+ * example: "INFORMAL"
377408 * sentences:
378409 * type: array
379- * description: 스타일 변환된 문장 3개 (사용자별 가중치 적용 후 정렬, 문자열 배열)
410+ * description: " 스타일 변환된 문장 3개 (tone + endingCards 동시 적용, 사용자별 가중치 정렬)"
380411 * items:
381412 * type: string
382413 * example: ["밥 먹을래?", "밥 먹어?", "밥 먹을 거야?"]
@@ -426,6 +457,22 @@ router.get('/contexts', authenticate, contextController);
426457 * code: "VALIDATION001"
427458 * message: "어미 선택 카드는 최대 5개까지 선택 가능합니다"
428459 * detail: null
460+ * noToneOrEndings:
461+ * summary: tone과 어미 카드 모두 없음
462+ * value:
463+ * success: false
464+ * error:
465+ * code: "VALIDATION001"
466+ * message: "어미 선택 카드 또는 tone 중 하나는 반드시 제공해야 합니다"
467+ * detail: null
468+ * invalidTone:
469+ * summary: tone 값 오류
470+ * value:
471+ * success: false
472+ * error:
473+ * code: "VALIDATION001"
474+ * message: "tone은 HONORIFIC 또는 INFORMAL만 가능합니다"
475+ * detail: null
429476 * 401:
430477 * $ref: '#/components/responses/Unauthorized'
431478 * 500:
0 commit comments