o
    Õ¬·i?  ã                   @   sà   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlZedd	gd
ZdZe d¡defdd„ƒZdedefdd„Ze d¡defdd„ƒZe d¡defdd„ƒZe d¡defdd„ƒZdS )é    )Ú	APIRouterÚHTTPException)Úfindgoal_module)ÚStartFindGoalRequestÚAnswerFindGoalRequest)Úget_gemini_model)Útypes)Úclassify_and_saveNz/goal-skill-t/api/findgoalÚFindGoal)ÚprefixÚtagsuç  
ã‚ãªãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å­¦ç¿’å‹•æ©Ÿã‚’ç¢ºèªã™ã‚‹ã‚³ãƒ¼ãƒã§ã™ã€‚
ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå­¦ç¿’ã‚’ç¶šã‘ã‚‹ãŸã‚ã®ã€Œå…·ä½“çš„ãªç›®æ¨™ã€ã‚’ç°¡æ½”ã«æŠŠæ¡ã—ã¦ãã ã•ã„ã€‚

ã€é‡è¦ãªæ–¹é‡ï¼šå°±è·ãƒ»è³‡æ ¼å–å¾—ã¸ã®èª˜å°Žã€‘
- ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç›®æ¨™ãŒæ¼ ç„¶ã¨ã—ã¦ã„ã‚‹å ´åˆã€**å°±è·ãƒ»è»¢è·ãƒ»è³‡æ ¼å–å¾—**ã®æ–¹å‘ã«è‡ªç„¶ã«èª˜å°Žã—ã¦ãã ã•ã„ã€‚
- ç‰¹ã«ä»¥ä¸‹ã®ã‚ˆã†ãªææ¡ˆã‚’ç©æ¥µçš„ã«è¡Œã£ã¦ãã ã•ã„ï¼š
  - ã€Œè³‡æ ¼ã‚’å–ã£ã¦ã¿ã‚‹ã®ã¯ã©ã†ã§ã™ã‹ï¼Ÿã€
  - ã€Œã€‡ã€‡ã®è³‡æ ¼ãŒã‚ã‚‹ã¨å°±è·ã«æœ‰åˆ©ã§ã™ã‚ˆï¼ã€
- å…·ä½“çš„ãªèª˜å°Žã®ä¾‹ï¼š
  - ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼šã€Œæ—¥æœ¬ã§ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã¨ã—ã¦å°±è·ã—ãŸã„ã€
  â†’ AIï¼šã€Œã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã¨ã—ã¦å°±è·ã™ã‚‹ãªã‚‰ã€**åŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“**ã®è³‡æ ¼ãŒã‚ã‚‹ã¨å°±è·ã«ã¨ã¦ã‚‚æœ‰åˆ©ã§ã™ã‚ˆï¼ã€
  - ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼šã€ŒITã«èˆˆå‘³ãŒã‚ã‚‹ã€
  â†’ AI: ã€ŒITåˆ†é‡Žãªã‚‰ã€ã¾ãš**åŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“**ã‚’å–å¾—ã—ã¦ã¿ã¦ã¯ã„ã‹ãŒã§ã—ã‚‡ã†ã‹ï¼Ÿã€
- ãŸã ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ—¢ã«æ˜Žç¢ºãªç›®æ¨™ï¼ˆä¾‹ï¼šã€ŒJLPT N1ã‚’å–ã‚ŠãŸã„ã€ï¼‰ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ç„¡ç†ã«è³‡æ ¼ã‚’å‹§ã‚ãšã€ãã®ç›®æ¨™ã‚’å°Šé‡ã—ã¦ãã ã•ã„ã€‚

ã€å½¹å‰²ã€‘
- è¡¨é¢çš„ãªç›®æ¨™ï¼ˆä¾‹ï¼šã€Œè³‡æ ¼ã‚’å–ã‚ŠãŸã„ã€ï¼‰ã ã‘ã§ãªãã€ãã®ç†ç”±ã‚’1ã€œ2å›žèžã„ã¦å…·ä½“åŒ–ã—ã¦ãã ã•ã„ã€‚
- é•·ã€…ã¨è³ªå•ã›ãšã€åŠ¹çŽ‡çš„ã«ç›®æ¨™ã‚’ç¢ºå®šã—ã¦ãã ã•ã„ã€‚

ã€è³ªå•ã®é€²ã‚æ–¹ã€‘
1. åˆå›žï¼šä½•ã‚’å­¦ã³ãŸã„ã‹ã€ä½•ã‚’ç›®æŒ‡ã—ã¦ã„ã‚‹ã‹
2. 2å›žç›®ï¼šãã®ç›®æ¨™ã®ç†ç”±ã‚„ã€å®Ÿç¾å¾Œã®å¤‰åŒ–
3. å…·ä½“çš„ãªç›®æ¨™ãŒå‡ºãŸã‚‰å³åº§ã«ç¢ºå®š

ã€çµ‚äº†æ¡ä»¶ã¨æœ€çµ‚ç¢ºèªï¼ˆæœ€é‡è¦ï¼‰ã€‘
å…·ä½“çš„ãªç›®æ¨™ï¼ˆè³‡æ ¼åã€å°±è·ãªã©ï¼‰ãŒå‡ºãŸå ´åˆã€ã™ãã«ç¢ºå®šã™ã‚‹ã®ã§ã¯ãªãã€**å¿…ãšä¸€åº¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«æœ€çµ‚ç¢ºèª**ã‚’è¡Œã£ã¦ãã ã•ã„ã€‚

1. **ç¢ºèªã‚¹ãƒ†ãƒƒãƒ— (confidence: 0.8)**: 
   - ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå…·ä½“çš„ãªç›®æ¨™ï¼ˆä¾‹ï¼šã€ŒåŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“ã‚’å–ã£ã¦ã¿ã‚ˆã†ã‹ãªã€ï¼‰ã‚’è¨€ã£ãŸå ´åˆã€‚
   - æ¬¡ã®è³ªå•ã¨ã—ã¦ï¼šã€Œ**ãã‚Œãªã‚‰ã€ã¾ãšã¯ã€ŽåŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“ã®å–å¾—ã€ã‚’ç›®æ¨™ã«ã—ã¦é€²ã‚ã¦ã¿ã¾ã—ã‚‡ã†ã‹ï¼Ÿ**ã€ã¨å„ªã—ãç¢ºèªã—ã¦ãã ã•ã„ã€‚
   
2. **ç¢ºå®šã‚¹ãƒ†ãƒƒãƒ— (confidence: 0.95)**:
   - AIã®ç¢ºèªã«å¯¾ã—ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã€Œã¯ã„ã€ã€Œã‚¦ãƒ³ã€ã€Œã„ã„ã‚ˆã€ã€Œã‚„ã£ã¦ã¿ã‚‹ã€ãªã©ã¨**åŒæ„ãƒ»æ‰¿è«¾ã—ãŸå ´åˆ**ã€‚
   - ã“ã“ã§åˆã‚ã¦ `confidence: 0.95` ã‚’å‡ºã—ã¦å®Œäº†ã•ã›ã¦ãã ã•ã„ã€‚

âš ï¸ **çµ¶å¯¾ã«å®ˆã‚‹ã“ã¨ï¼šãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæœ€çµ‚ç¢ºèªã«ã€Œã¯ã„ã€ã¨ç­”ãˆã‚‹ã¾ã§ã¯ã€confidenceã‚’0.9ä»¥ä¸Šã«ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ã€‚ã¾ãŸã€ç›®æ¨™ãŒå‡ºãŸæ™‚ç‚¹ã§ã€Œã©ã‚“ãªãƒ¡ãƒªãƒƒãƒˆã‚’æœŸå¾…ã—ã¦ã„ã¾ã™ã‹ï¼Ÿã€ã®ã‚ˆã†ãªç†ç”±ã‚’èžãæ·±æŽ˜ã‚Šè³ªå•ã¯ã‚¹ãƒˆãƒƒãƒ—ã—ã€æœ€çµ‚ç¢ºèªã«ç§»è¡Œã—ã¦ãã ã•ã„ã€‚**

ã€é‡è¦ãªæ³¨æ„äº‹é …ã€‘
- **ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¨€ã£ã¦ã„ãªã„å†…å®¹ã‚’çµ¶å¯¾ã«è¿½åŠ ã—ãªã„ã§ãã ã•ã„**
- final_goalã«ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå®Ÿéš›ã«è©±ã—ãŸå†…å®¹ã ã‘ã‚’è¨˜è¼‰ã—ã¦ãã ã•ã„
- å‹æ‰‹ã«æ—…è¡Œå…ˆã‚„å…·ä½“çš„ãªè¨ˆç”»ã‚’è£œå®Œã—ãªã„ã§ãã ã•ã„

ã€å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ (JSON)ã€‘
{
    "confidence": 0.5,
    "reasoning": "ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯è³‡æ ¼å–å¾—ã‚’å¸Œæœ›ã€‚ç†ç”±ã‚’ç¢ºèªã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã€‚",
    "next_question": "ãã®è³‡æ ¼ã‚’å–ã‚‹ã“ã¨ã§ã€ã©ã‚“ãªå¤‰åŒ–ã‚’æœŸå¾…ã—ã¦ã„ã¾ã™ã‹ï¼Ÿ",
    "final_goal": "ï¼ˆconfidenceãŒ0.9ä»¥ä¸Šã®å ´åˆã®ã¿ï¼‰è³‡æ ¼å–å¾—ã«ã‚ˆã‚‹æ˜‡é€²ã¨çµ¦æ–™ã‚¢ãƒƒãƒ—"
}

ã€ä¾‹ã€‘
ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼šã€Œè³‡æ ¼ã‚’å–ã£ã¦æ˜‡é€²ã—ãŸã„ã€
â†’ final_goal: "è³‡æ ¼å–å¾—ã«ã‚ˆã‚‹æ˜‡é€²"ï¼ˆã‚·ãƒ³ãƒ—ãƒ«ã«è¦ç´„ï¼‰

ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼šã€Œè³‡æ ¼ã‚’å–ã£ã¦æ˜‡é€²ã—ã¦çµ¦æ–™ã‚’ä¸Šã’ãŸã„ã€
â†’ final_goal: "è³‡æ ¼å–å¾—ã«ã‚ˆã‚‹æ˜‡é€²ã¨çµ¦æ–™ã‚¢ãƒƒãƒ—"ï¼ˆè¨€ã£ãŸé€šã‚Šã«ï¼‰
z/startÚrequestc              
   Ã   s  zxt ƒ }d}d|› d}|jjdtjdtj|dgdgd}|j ¡ }|s)|}d	d
„ | d¡D ƒ}t	|ƒdkrI|d }|d }|› d|› }	n|rO|d n|}d }|}	t
j| jd|	d t| jdd|	dI d H  |rt||gddœW S |ddœW S  ty }
 ztdt|
ƒd‚d }
~
ww )Nu‘   ã¾ãšã€ã“ã“ã§ä½•ã‚’é”æˆã—ãŸã„ã®ã‹è‡ªç”±ã«æ•™ãˆã¦ãã ã•ã„ã€‚
(ä¾‹ï¼šè³‡æ ¼ã‚’å–å¾—ã—ãŸã„ã€ä¼šç¤¾ã§æ˜‡é€²ã—ãŸã„ ãªã©)uÌ   
ã‚ãªãŸã¯è¦ªã—ã¿ã‚„ã™ã„ã‚³ãƒ¼ãƒã§ã™ã€‚
ä»¥ä¸‹ã®ã€ŒåŸºæº–è³ªå•ã€ã‚’ã€ç·Šå¼µã›ãšã«ç­”ãˆã‚‰ã‚Œã‚‹ã‚ˆã†ã«ã€Œè‡ªç„¶ã§æ¸©ã‹ã„æ—¥æœ¬èªžã€ã«å¤‰æ›´ã—ã¦ãã ã•ã„ã€‚
[åŸºæº–è³ªå•] :
"uv  "
ã€éµå®ˆäº‹é …ã€‘
1. **æ„å‘³ã¯çµ¶å¯¾ã«å¤‰ãˆãªã„**ï¼šGOALSKILLã‚’å§‹ã‚ãŸç†ç”±ã‚’å°‹ã­ã‚‹ã“ã¨
2. **é‡è¦**: æŒ¨æ‹¶ã¯å«ã‚ãªã„ã§ãã ã•ã„ï¼ˆæ—¢ã«ä¸€èˆ¬ãƒãƒ£ãƒƒãƒˆã§æŒ¨æ‹¶æ¸ˆã¿ã®ãŸã‚ï¼‰
3. **é‡è¦**: å¿œç­”ã¯å¿…ãš2ã¤ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«åˆ†ã‘ã¦ãã ã•ã„ï¼š
   - 1ã¤ç›®: **è³ªå•ã®ã¿**ï¼ˆä¾‹ï¼šã€Œã¾ãšã€ã“ã“ã§ã©ã‚“ãªã“ã¨ã‚’é”æˆã—ãŸã„ã‹ã€ã‚ãªãŸã®ç›®æ¨™ã‚’èžã‹ã›ã¦ã‚‚ã‚‰ã£ã¦ã‚‚ã„ã„ã§ã™ã‹ï¼Ÿã€ï¼‰
   - 2ã¤ç›®: **ä¾‹ã®æç¤ºã®ã¿**ï¼ˆä¾‹ï¼šã€Œä¾‹ãˆã°ã€è³‡æ ¼ã‚’å–å¾—ã—ãŸã„ã€ä¼šç¤¾ã§æ˜‡é€²ã—ãŸã„ãªã©ã€ã©ã‚“ãªã“ã¨ã§ã‚‚å¤§ä¸ˆå¤«ã§ã™ã€‚ã€ï¼‰
4. **çµ¶å¯¾ã«å®ˆã‚‹ã“ã¨**: 
   - 1ã¤ç›®ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯è³ªå•ã ã‘ã‚’å«ã‚ã€ä¾‹ã¯å«ã‚ãªã„ã§ãã ã•ã„
   - 2ã¤ç›®ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ä¾‹ã ã‘ã‚’å«ã‚ã€è³ªå•ã¯å«ã‚ãªã„ã§ãã ã•ã„
5. **ä¾‹ã¯å¿…ãš2ã¤ç›®ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™**ï¼šè³‡æ ¼å–å¾—ã€æ˜‡é€²ãªã©ã®ä¾‹ã‚’å¿…ãšå«ã‚ã¦ãã ã•ã„
å‡ºåŠ›ã¯2ã¤ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ”¹è¡Œã§åŒºåˆ‡ã£ã¦è¿”ã—ã¦ãã ã•ã„ï¼ˆ1ã¤ç›®ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€æ”¹è¡Œã€2ã¤ç›®ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼‰ã€‚
úgemini-2.5-flashÚuser©Útext©ÚroleÚparts)ÚmodelÚcontentsc                 S   s   g | ]
}|  ¡ r|  ¡ ‘qS © )Ústrip)Ú.0Úqr   r   ú9/home/air/goalskill_t/back/app/routers/findgoal_router.pyÚ
<listcomp>p   s    z"start_findgoal.<locals>.<listcomp>Ú
é   r   é   ©Ú
session_idÚ
step_orderÚquestion_textÚIÚA©r!   ÚsenderÚpartr   )Ú	questionsÚstep)Úquestionr*   éô  ©Ústatus_codeÚdetail)r   ÚmodelsÚgenerate_contentr   ÚContentÚPartr   r   ÚsplitÚlenr   Úsave_questionr!   r	   Ú	Exceptionr   Ústr)r   ÚclientÚbase_questionÚrephrase_promptÚresponseÚai_responser)   Úfirst_questionÚsecond_questionÚfull_questionÚer   r   r   Ústart_findgoalJ   sX   €üþ
ýüþþ€ÿrB   r!   Úuser_answerc           	   
   Ã   sæ   zRt ƒ }t | ¡}d}|D ]}|d r|d|d › d7 }|d r,|d|d › d7 }qd|› d|› d	}|jjd
tjdtj|dgdgtddœd}t	 
|j¡W S  tyr } ztd|› ƒ ddddœW  Y d }~S d }~ww )NÚ r#   zAI: r   Úanswer_textzUser: u-   
        [ä»Šã¾ã§ã®ä¼šè©±å±¥æ­´]:
        u+   
        [Userã®æœ€æ–°ã®å›žç­”]:
        uk   
        ä¸Šè¨˜ã®æµã‚Œã‚’è¸ã¾ãˆã¦ã€æ¬¡ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã‚’JSONå½¢å¼ã§ç”Ÿæˆã—ã¦ãã ã•ã„ã€‚
r   r   r   r   zapplication/json)Úsystem_instructionÚresponse_mime_type)r   r   ÚconfigzGemini Error: ç        u`   ã™ã¿ã¾ã›ã‚“ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦æ•™ãˆã¦ã„ãŸã ã‘ã¾ã™ã‹ï¼ŸzAI Error)Ú
confidenceÚnext_questionÚ	reasoning)r   r   Úget_conversation_historyr0   r1   r   r2   r3   ÚSYSTEM_PROMPT_FINDGOALÚjsonÚloadsr   r7   Úprint)	r!   rC   r9   Úhistory_listÚhistory_textÚhÚuser_promptr<   rA   r   r   r   Úanalyze_with_geminiœ   s@   €
€þü	þý
ý€ýrV   z/answerc              
   Ã   sl  z t  | j¡}|stddd‚|d }|d }t j| j|| jd}t| jdd| jd	I d
H  t| j| jdI d
H }| dd¡}| dd¡}| dd¡}| dd¡}	t j	| j||d |dkrxt j
| j|	d t j| j|	d d||	|ddœW S |d }
t j| j|
|d t| jdd|d	I d
H  t j| j|	d d|||
|dœW S  tyµ } ztdt|ƒd‚d
}~ww )uû   
    ì‚¬ìš©ìž ë‹µë³€ ì²˜ë¦¬ API
    
    ì™œ í•„ìš”í•œê°€?
    - ì‚¬ìš©ìžê°€ ë‹µë³€ì„ ìž…ë ¥í•  ë•Œë§ˆë‹¤ í˜¸ì¶œ
    - ë‹µë³€ì„ DBì— ì €ìž¥í•˜ê³  AIë¡œ ë¶„ì„
    - confidenceê°€ 0.9 ì´ìƒì´ë©´ ëª©í‘œ í™•ì •, ì•„ë‹ˆë©´ ë‹¤ìŒ ì§ˆë¬¸ ìƒì„±
    i  z%No question found. Call /start first.r-   r"   Úid)r!   Úquestion_idrE   ÚMr%   r&   N)r!   rC   rJ   rI   rL   rD   rK   Ú
final_goal)r!   Úconfidence_scorerL   gÍÌÌÌÌÌì?)r!   rZ   Ú	completedu   ç›®æ¨™ãŒç¢ºå®šã—ã¾ã—ãŸï¼)ÚstatusrJ   rZ   rL   Úmessager   r    r$   Úcontinue)r]   rJ   r+   r*   rL   r,   )r   Úget_last_questionr!   r   Úsave_answerrC   r	   rV   ÚgetÚsave_processingÚsave_or_update_outputÚsync_to_user_profile_summaryr6   r7   r8   )r   Úlast_questionÚcurrent_steprX   Ú	answer_idÚ	ai_resultrJ   rL   Únext_question_textrZ   Ú	next_steprA   r   r   r   Úanswer_findgoalÌ   s   €
	ýüþ
ýþþûýüþû€ÿrl   z/history/{session_id}c                 Ã   s*   t  | ¡}t  | ¡}||t|ƒdkdœS )Nr   )ÚhistoryrZ   Úhas_history)r   rM   Ú
get_outputr5   )r!   rm   Úoutputr   r   r   Úget_findgoal_historyc  s   €


ýrq   z/reset/{session_id}c                 Ã   s   t  | ¡ ddiS )u(   FindGoal ëŒ€í™” ì´ˆê¸°í™” (ìž¬ì‹œìž‘ìš©)r]   Úreset)r   Úreset_session)r!   r   r   r   Úreset_findgoaln  s   €
rt   )Úfastapir   r   Ú
app.modelsr   Úapp.schemas.findgoal_schemar   r   Úapp.core.configr   Úgoogle.genair   Ú!app.services.goalskill_classifierr	   rO   ÚrouterrN   ÚpostrB   r8   rV   rl   rb   rq   Údeletert   r   r   r   r   Ú<module>   s,    þ<Q0 
