o
    ´Ú…i5  ã                   @   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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dS )é    )Ú	APIRouterÚHTTPException)Úfindgoal_module)ÚStartFindGoalRequestÚAnswerFindGoalRequest)Úget_gemini_model)ÚtypesNz/goal-skill-t/api/findgoalÚFindGoal)ÚprefixÚtagsu¥  
ã‚ãªãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å­¦ç¿’å‹•æ©Ÿã‚’ç¢ºèªã™ã‚‹ã‚³ãƒ¼ãƒã§ã™ã€‚
ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå­¦ç¿’ã‚’ç¶šã‘ã‚‹ãŸã‚ã®ã€Œå…·ä½“çš„ãªç›®æ¨™ã€ã‚’ç°¡æ½”ã«æŠŠæ¡ã—ã¦ãã ã•ã„ã€‚

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

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

ã€çµ‚äº†æ¡ä»¶ï¼ˆé‡è¦ï¼‰ã€‘
ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã«è©²å½“ã—ãŸã‚‰ã€**ç›´ã¡ã«** confidence 0.95 ã§çµ‚äº†ã—ã¦ãã ã•ã„ï¼š
- å°±è·ã€è»¢è·ã€æ˜‡é€²ãªã©ã®å…·ä½“çš„ãªã‚­ãƒ£ãƒªã‚¢ç›®æ¨™ãŒå‡ºãŸ
- è³‡æ ¼å–å¾—ã®ç†ç”±ãŒæ˜Žç¢ºã«ãªã£ãŸ
- çµ¦æ–™ã‚¢ãƒƒãƒ—ã‚„è»¢è·ãªã©ã€å®Ÿç¾ã—ãŸã„ã“ã¨ãŒæ˜Žç¢ºã«ãªã£ãŸ
- 2ã€œ3å›žã®è³ªå•ã§ååˆ†ãªæƒ…å ±ãŒé›†ã¾ã£ãŸ

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

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

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

ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼šã€Œè³‡æ ¼ã‚’å–ã£ã¦æ˜‡é€²ã—ã¦çµ¦æ–™ã‚’ä¸Šã’ãŸã„ã€
â†’ final_goal: "è³‡æ ¼å–å¾—ã«ã‚ˆã‚‹æ˜‡é€²ã¨çµ¦æ–™ã‚¢ãƒƒãƒ—"ï¼ˆè¨€ã£ãŸé€šã‚Šã«ï¼‰
z/startÚrequestc              
   Ã   s  zlt ƒ }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 |rh||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   ú=/home/air/goalskill_sales/back/app/routers/findgoal_router.pyÚ
<listcomp>]   s    z"start_findgoal.<locals>.<listcomp>Ú
é   r   é   ©Ú
session_idÚ
step_orderÚquestion_text)Ú	questionsÚstep)Úquestionr$   éô  ©Ústatus_codeÚdetail)r   ÚmodelsÚgenerate_contentr   ÚContentÚPartr   r   ÚsplitÚlenr   Úsave_questionr    Ú	Exceptionr   Ústr)r   ÚclientÚbase_questionÚrephrase_promptÚresponseÚai_responser#   Úfirst_questionÚsecond_questionÚfull_questionÚer   r   r   Ústart_findgoal7   sL   €üþ
ýþþ€ÿr<   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_historyr*   r+   r   r,   r-   ÚSYSTEM_PROMPT_FINDGOALÚjsonÚloadsr   r1   Úprint)	r    r=   r3   Úhistory_listÚhistory_textÚhÚuser_promptr6   r;   r   r   r   Úanalyze_with_geminiƒ   s@   €
€þü	þý
ý€ýrP   z/answerc              
   Ã   s:  z‡t  | j¡}|stddd‚|d }|d }t j| j|| jd}t| j| jdI dH }| d	d
¡}| dd¡}| dd¡}| dd¡}	t j| j||d |dkrkt j	| j|	d t j
| j|	d d||	|ddœW S |d }
t j| j|
|d 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_idr?   )r    r=   NrD   rC   rF   r>   rE   Ú
final_goal)r    Úconfidence_scorerF   gÍÌÌÌÌÌì?)r    rS   Ú	completedu   ç›®æ¨™ãŒç¢ºå®šã—ã¾ã—ãŸï¼)ÚstatusrD   rS   rF   Úmessager   r   Úcontinue)rV   rD   r%   r$   rF   r&   )r   Úget_last_questionr    r   Úsave_answerr=   rP   ÚgetÚsave_processingÚsave_or_update_outputÚsync_to_user_profile_summaryr0   r1   r2   )r   Úlast_questionÚcurrent_steprR   Ú	answer_idÚ	ai_resultrD   rF   Únext_question_textrS   Ú	next_stepr;   r   r   r   Úanswer_findgoal³   sx   €
	ýþ
ýþþûýþû€ÿre   )Úfastapir   r   Ú
app.modelsr   Úapp.schemas.findgoal_schemar   r   Úapp.core.configr   Úgoogle.genair   rI   ÚrouterrH   Úpostr<   r2   rP   re   r   r   r   r   Ú<module>   s     þ*K0