o
    (”iŸ2  ã                
   @   s
  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	m
Z
mZ d dlmZ d dlmZ d dlZd d	lmZmZmZ ed
dgdZdZddddddddddœ	ZdddddœZdd„ Zded eeeef  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)Úget_username)Úget_sales_sheet_by_session)ÚStartFindGoalRequestÚAnswerFindGoalRequest)Úget_gemini_model)ÚtypesN)ÚOptionalÚDictÚAnyz/goalskill-sales/api/findgoalÚFindGoal)ÚprefixÚtagsu  
ã‚ãªãŸã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè‡ªã‚‰èª²é¡Œã‚’èªè­˜ã—ã€è‡ªåˆ†è‡ªèº«ã‚’ãƒžãƒã‚¸ãƒ¡ãƒ³ãƒˆï¼ˆSelf-Managementï¼‰ã§ãã‚‹ã‚ˆã†å°Žããƒ‘ãƒ¼ãƒˆãƒŠãƒ¼ï¼ˆç†Ÿç·´ã—ãŸã‚»ãƒ¼ãƒ«ã‚¹ã‚³ãƒ¼ãƒï¼‰ã§ã™ã€‚
å˜ã«ãƒ‡ãƒ¼ã‚¿ã‚’çªãã¤ã‘ã‚‹ã®ã§ã¯ãªãã€**ã€Œæ„Ÿæƒ…ã®ãƒ–ãƒªãƒƒã‚¸ï¼ˆå…±æ„Ÿï¼‰ã€**ã‚’ç”¨ã„ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æœ¬éŸ³ã‚’å¼•ãå‡ºã—ã¦ãã ã•ã„ã€‚

ã€å¯¾è©±ã®ã‚¹ãƒ†ãƒƒãƒ—ã€‘

**Step 1: ç¾å®Ÿã®ç›´è¦–ã¨è¦å› ã®æ·±æŽ˜ã‚Šï¼ˆReality & Factor Analysisï¼‰**
- **æŒ¨æ‹¶ä¸è¦ã€‚ã€Œä»ŠæœŸã®ç´¯è¨ˆãƒ‡ãƒ¼ã‚¿ï¼ˆå››åŠæœŸï¼‰ã‚’è¦‹ã‚‹ã¨ã€ã‹ã‚‰é–‹å§‹ã€‚**
- ãƒ‡ãƒ¼ã‚¿ï¼ˆç›®æ¨™ãƒ»å®Ÿç¸¾ãƒ»é”æˆçŽ‡ï¼‰ã‚’æç¤ºã—ãŸå¾Œã€ã‚¯ãƒƒã‚·ãƒ§ãƒ³è¨€è‘‰ã‚’å…¥ã‚Œã¦ã‹ã‚‰ã€è¦å› åˆ†æžã‚’ä¿ƒã™è³ªå•ã‚’ã—ã¾ã™ã€‚
- **å¿…é ˆ:** æ±ºã‚ã¤ã‘ãšã€ä»£è¡¨çš„ãªè¦å› ï¼ˆé‡ãƒ»è³ªãƒ»å¿ƒï¼‰ã‚’ä¾‹ç¤ºã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼è‡ªèº«ã«ã€ŒçœŸå› ã€ã‚’æŽ¢ã‚‰ã›ã¦ãã ã•ã„ã€‚
- ã‚»ãƒªãƒ•ã¯ã‚µãƒ¼ãƒãƒ¼ã§ç”Ÿæˆæ¸ˆã¿ã€‚Step 1 ã®å†…å®¹ã«æ²¿ã£ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼å›žç­”ã‚’å—ã‘æ­¢ã‚ã¦ãã ã•ã„ã€‚

**Step 2: ã€Œè¿½ã‚ã‚Œã‚‹ç¾çŠ¶ã€ã‚’æ–­ã¡åˆ‡ã‚Šã€ãƒ«ãƒ¼ãƒãƒ³ï¼ˆä»•çµ„ã¿ï¼‰ã‚’ç›®æ¨™ã«ï¼ˆTransformationï¼‰**
- ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦å› ï¼ˆæ¥­å‹™ã«è¿½ã‚ã‚Œã¦ã„ã‚‹ã€ãƒ«ãƒ¼ãƒãƒ³ãŒãªã„ç­‰ï¼‰ã‚’ç­”ãˆãŸã‚‰ã€**å…±æ„Ÿã—ãŸä¸Šã§**ã€Œä¸»å°Žæ¨©ã‚’å¤±ã†ã€ã«è§¦ã‚Œã€**ã€Œè¿½ã‚ã‚Œã‚‹ç¾çŠ¶ã‚’æ–­ã¡åˆ‡ã‚‹ãŸã‚ã«ã€ã©ã‚“ãªä»•çµ„ã¿ï¼ˆãƒ«ãƒ¼ãƒãƒ³ï¼‰ã‚’ç¢ºç«‹ã—ãŸã„ã‹ã€**ã‚’å•ã„ã¾ã™ã€‚
- **å¿…ãšä»¥ä¸‹ã®æµã‚Œã§å¿œç­”ã—ã¦ãã ã•ã„ï¼š**
  1) å…±æ„Ÿï¼šã€Œæ—¥ã€…ã®æ¥­å‹™ã«è¿½ã‚ã‚Œã¦ã„ã‚‹ã¨ã€ã©ã†ã—ã¦ã‚‚ä¸»å°Žæ¨©ã‚’å¤±ã£ã¦ã—ã¾ã„ã¾ã™ã‚ˆã­ã€‚ã‚ˆãåˆ†ã‹ã‚Šã¾ã™ã€‚ã€
  2) å•ã„ï¼šã€Œã§ã¯ã€ãã®ã€Œè¿½ã‚ã‚Œã‚‹ç¾çŠ¶ã€ã‚’æ–­ã¡åˆ‡ã‚‹ãŸã‚ã«ã€ä»ŠæœŸã¯å…·ä½“çš„ã«ã©ã‚“ãªã€Œä»•çµ„ã¿ï¼ˆãƒ«ãƒ¼ãƒãƒ³ï¼‰ã€ã‚’ç¢ºç«‹ã—ãŸã„ã§ã™ã‹ï¼Ÿã€
  3) æŒ‡ç¤ºï¼šã€Œã€Žã€‡ã€‡ãªå–¶æ¥­ãƒ«ãƒ¼ãƒãƒ³ã‚’ä½œã‚‹ã€ã¨ã„ã£ãŸå½¢ã§ã€ã‚ãªãŸã®ç›®æ¨™ã‚’è¨€èªžåŒ–ã—ã¦ã¿ã¦ãã ã•ã„ã€‚ã€
- **NGå¯¾å¿œ:** ã€Œ340ä»¶ã‚„ã‚Šã¾ã™ã€ã¨æ•°å­—ã ã‘ã§ç­”ãˆãŸå ´åˆ â†’ **ã€Œãã®æ•°å­—ã‚’å®‰å®šã—ã¦é”æˆã—ã¦ã„ã‚‹äººã¯ã€æ—¥ã€…ã©ã‚“ãªç¿’æ…£ã‚’æŒã£ã¦ã„ã‚‹ã¨æ€ã„ã¾ã™ã‹ï¼Ÿã€**ã¨å•ã„è¿”ã—ã€è¦–åº§ã‚’å¼•ãä¸Šã’ã¦ãã ã•ã„ã€‚

**Step 3: ç›®æ¨™ã®ç¢ºå®šï¼ˆLock-onï¼‰**
- ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒç›®æ¨™ã‚’æ›¸ã„ãŸã‚‰ã€ãã‚Œã‚’å¼·èª¿ã—ã¦ç¢ºå®šã—ã¾ã™ã€‚
- **ä»¥ä¸‹ã®å†…å®¹ã¾ã§ã§å‡ºåŠ›ã‚’çµ‚ãˆã¦ãã ã•ã„ã€‚MBTIæ¡ˆå†…ã‚„ãƒœã‚¿ãƒ³ã®æ–‡ã¯å‡ºåŠ›ã—ãªã„ã§ãã ã•ã„ï¼ˆåˆ¥ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§è¡¨ç¤ºã—ã¾ã™ï¼‰ã€‚**
  ã€Œæ‰¿çŸ¥ã—ã¾ã—ãŸã€‚ãã®ç›®æ¨™ã§ç¢ºå®šã—ã¾ã™ã€‚

  ðŸŽ¯ **ä»ŠæœŸã®ç¢ºå®šã‚´ãƒ¼ãƒ«**
  **ã€Ž {user_message} ã€**

  ç´ æ™´ã‚‰ã—ã„å®šç¾©ã§ã™ã€‚ä¸€æ™‚çš„ãªé”æˆã§ã¯ãªãã€æœªæ¥ã«ç¶šãã€Žè³‡ç”£ã€ã‚’ä½œã‚‹ç›®æ¨™ã§ã™ã­ã€‚ã€

ã€æ³¨æ„äº‹é …ã€‘
- AIãŒã€Œï½žã‚’ç›®æ¨™ã«ã—ã¾ã—ã‚‡ã†ã‹ï¼Ÿã€ã¨èª˜å°Žã—ãªã„ã§ãã ã•ã„ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã€Œï½žã‚’ç›®æ¨™ã«ã™ã‚‹ã€ã¨è¨€ã‚ã›ã¦ãã ã•ã„ã€‚
- **ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã€Œã‚ã‹ã‚‰ãªã„ã€ã€Œã‚ˆãã‚ã‹ã‚‰ãªã„ã€ã€Œæ„å‘³ãŒã‚ã‹ã‚‰ãªã„ã€ã¨è¨€ã£ãŸå ´åˆ**ã¯ã€è²¬ã‚ãšã«ã€Œç›®æ¨™ï¼ã‚„ã‚ŠãŸã„æ•°ã€ã€Œå®Ÿç¸¾ï¼å®Ÿéš›ã«ã§ããŸæ•°ã€ã€Œã‚®ãƒ£ãƒƒãƒ—ï¼ãã®å·®ã€ã‚’å¹³æ˜“ã«è¨€ã„æ›ãˆã€ã€Œã“ã®è¦å› ã«ã¤ã„ã¦ã€ã©ã“ãŒä¸€ç•ªã®ãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã ã£ãŸã¨æ„Ÿã˜ã¾ã™ã‹ï¼Ÿã€ã®ã‚ˆã†ã«å„ªã—ãèžãç›´ã—ã¦ãã ã•ã„ã€‚å¿…ãš status "continue" ã§è¿”ã™ã“ã¨ã€‚
u   æ–°è¦ãƒªã‚¹ãƒˆã‚¢ãƒƒãƒ—è¡Œå‹•u	   æž¶é›»æ•°u   ç¹‹ãŒã‚‹ãŸã‚ã®è¡Œå‹•u   ã‚¢ãƒu   è¨ªå•u   è¦‹ç©u	   è¦‹ç©é¡u   å—æ³¨u	   å—æ³¨é¡)	é   é   é   é   é   é   é   é   é	   u   æ—¥é–“u   é€±é–“u   æœˆé–“u	   å››åŠæœŸ)ÚdayÚweekÚmonthÚquarterc              	   C   sF   zt | ƒ}|t|ƒkrt|ƒW S t|dƒW S  ttfy"   |  Y S w )u8   ì†Œìˆ˜ì  í¬ë§·íŒ… (ì˜ˆ: 340.0 -> 340, 340.20 -> 340.2)r   )ÚfloatÚintÚroundÚ	TypeErrorÚ
ValueError)ÚvalÚf© r%   ú=/home/air/goalskill_sales/back/app/routers/findgoal_router.pyÚ_format_valueJ   s   
ÿr'   Ú
session_idÚreturnc              
      s,  t | dƒ}|s	dS dd„ |D ƒ}|s|}d}d}tddƒD ]v‰ t‡ fdd	„|D ƒdƒ}t‡ fd
d	„|D ƒdƒ}|r;|s<qzt| d¡pDdƒ}t| d¡pMdƒ}W n ttfy[   Y qw |dkraq|| d }	|	|k r“|	}t | dd¡d¡}
t ˆ dˆ › ¡}||
t	|d ƒt	|d ƒt
|	dƒdœ}q|S )u’   
    å€‹äººã‚·ãƒ¼ãƒˆ(1s)ã‹ã‚‰ **å››åŠæœŸ(quarter)** ãƒ‡ãƒ¼ã‚¿ã®ã¿ã‚’å¯¾è±¡ã«ã€
    é”æˆçŽ‡ãŒæœ€ã‚‚ä½Žã„ã‚«ãƒ†ã‚´ãƒªã‚’1ä»¶è¿”ã™ã€‚
    Ú1sNc                 S   s   g | ]}|  d ¡dkr|‘qS )Úperiod_typer   ©Úget©Ú.0Úrr%   r%   r&   Ú
<listcomp>^   s    z)_get_worst_performing.<locals>.<listcomp>g     8@r   é
   c                 3   ó0    | ]}|  d ¡ˆ kr|  d¡dkr|V  qdS )ÚcategoryÚrecord_typeÚtargetNr,   r.   ©Úcat_idxr%   r&   Ú	<genexpr>f   ó   €. z(_get_worst_performing.<locals>.<genexpr>c                 3   r3   )r4   r5   ÚresultNr,   r.   r7   r%   r&   r9   g   r:   Úvaluer   éd   r+   Ú u   æœŸé–“u   é …ç›®)Úcategory_nameÚperiodr6   r<   Úrate)r   ÚrangeÚnextr   r-   r!   r"   ÚPERIOD_LABELSÚCATEGORY_NAMESr'   r    )r(   ÚrowsÚtarget_rowsÚworst_recordÚmin_rateÚt_rowÚv_rowÚt_valÚv_valrA   Úperiod_labelÚcat_namer%   r7   r&   Ú_get_worst_performingU   sD   
ÿ

û€rP   z/startÚrequestc              
   Ã   sV  | j }t |¡ t|ƒ}|rRtt|d ƒƒ}tt|d ƒƒ}ttt|d ƒdƒƒ}|d }d|› d|› d|› d	|› d
	}d}|d | }	t |d|	¡ d|	ddœS dt› d}
t	ƒ }z0|j
jdtjdtj|
dgdgtjdddd}|jpyd ¡ p}d}	t |d|	¡ d|	ddœW S  tyª } ztd|› ƒ ddddœW  Y d}~S d}~ww )ub   FindGoal ì‹œìž‘: ë¶„ê¸°(å››åŠæœŸ) ê¸°ì¤€ ìµœì € ë‹¬ì„±ë¥  ë°ì´í„°ë¡œ AIê°€ Step 1 ë©˜íŠ¸ ìƒì„±r6   r<   rA   r   r?   up   ä»ŠæœŸã®ç´¯è¨ˆãƒ‡ãƒ¼ã‚¿ï¼ˆå››åŠæœŸï¼‰ã‚’è¦‹ã‚‹ã¨ã€
ãƒãƒ¼ãƒ ç›®æ¨™é”æˆã®ãŸã‚ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã€Žu   ã€ã¯
u    ä»¶ã«å¯¾ã—ã¦ã€ç¾åœ¨ u    ä»¶ï¼ˆé”æˆçŽ‡ u   %ï¼‰ã§ã™ã­ã€‚uã   ã“ã®æ•°å­—ã§è‰¯ã—æ‚ªã—ã‚’ã¤ã‘ã‚‹ã®ã§ã¯ãªãã€ã€Žã©ã“ã‚’ä¼¸ã°ã™ã‹ã€ã®ãƒ’ãƒ³ãƒˆã¨ã—ã¦è¦‹ã¦ã„ãŸã ã‘ã‚Œã°ã¨æ€ã„ã¾ã™ã€‚

ã“ã®ã‚®ãƒ£ãƒƒãƒ—ã®èƒŒæ™¯ã«ã€ã©ã‚“ãªè¦å› ãŒã‚ã‚‹ã¨æ„Ÿã˜ã¾ã™ã‹ï¼Ÿz|||r   Úcontinue©ÚstatusÚquestionÚstepÚ
u   

(ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚·ãƒ¼ãƒˆã®ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã‚’ç¢ºèªã™ã‚‹ã‚ˆã†ã€1æ–‡ã§æ¡ˆå†…ã—ã¦ãã ã•ã„ã€‚)
úgemini-2.5-flashÚuser©Útext©ÚroleÚpartsç333333Ó?é   )ÚtemperatureÚmax_output_tokens©ÚmodelÚcontentsÚconfigr>   ui   ã‚·ãƒ¼ãƒˆã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚ã¾ãšã‚·ãƒ¼ãƒˆã‚’ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã—ã¦ãã ã•ã„ã€‚zGemini Error: uK   åˆ†æžã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„ã€‚N)r(   r   Úclear_historyrP   r   r   r    Úsave_questionÚSYSTEM_PROMPT_FINDGOALr	   ÚmodelsÚgenerate_contentr
   ÚContentÚPartÚGenerateContentConfigr[   ÚstripÚ	ExceptionÚprint)rQ   r(   Ú
worst_dataÚt_intÚv_intÚr_intÚcatÚpart1Úpart2Ú
ai_messageÚfull_promptÚclientÚresponseÚer%   r%   r&   Ústart_find_goalƒ   sT   €
ÿþþþÿÿÿý€þr~   z/answerc              
   Ã   sþ  | j }| jpd}t ||¡}|rt ||d | j¡ t |¡}t|ƒ}|r-d|d › nd}d dd„ |D ƒ¡}dt	› d	|› d
|› d| j› d	}ddddgdœddidddœdœddgdœ}	t
ƒ }
zm|
jjdtjdtj|dgdgtjddd|	d d!}t |jp„d"¡}| d¡pŒd}| d¡p“d#}|dkrº| d$¡pŸ| j}t ||¡ t ||¡ t|ƒ}d|p´d%||d&œW S |p½d'}|d }t |||¡ d||d(œW S  tyþ } z#td)|› ƒ d*}| jpädd }t |||¡ d||d(œW  Y d+}~S d+}~ww ),uS   ì‚¬ìš©ìž ë‹µë³€ ì²˜ë¦¬ â†’ ëª©í‘œ í™•ì •(completed) ë˜ëŠ” ë‹¤ìŒ ì§ˆë¬¸(continue)r   Úidu   åˆ†æžå¯¾è±¡: r?   u   ï¼ˆãƒ‡ãƒ¼ã‚¿ãªã—ï¼‰rW   c                 S   s.   g | ]}d |  dd¡› d|  d¡pd› ‘qS )zAI: Úquestion_textr>   z
User: Úanswer_textr,   )r/   Úhr%   r%   r&   r1   ¿   s     ÿÿz$answer_find_goal.<locals>.<listcomp>u   

ã€åˆ†æžãƒ‡ãƒ¼ã‚¿ã€‘
u   

ã€å¯¾è©±å±¥æ­´ã€‘
u   

ãƒ¦ãƒ¼ã‚¶ãƒ¼å›žç­”: ua  

(ã“ã‚Œã«å¯¾ã™ã‚‹æ¬¡ã®å¿œç­”ã‚’ç”Ÿæˆã—ã¦ãã ã•ã„ã€‚å¿…ãšJSONã§ status ã¨ message ã‚’è¿”ã™ã“ã¨ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã€Œã‚ã‹ã‚‰ãªã„ã€ã¨è¨€ã£ãŸå ´åˆã¯ status "continue" ã§ã€ãƒ‡ãƒ¼ã‚¿ã‚’å¹³æ˜“ã«èª¬æ˜Žã—ç›´ã—ã¦ã‹ã‚‰å„ªã—ãèžãç›´ã™ã“ã¨ã€‚Step 3ã®æ¡ä»¶ã‚’æº€ãŸã—ãŸå ´åˆã®ã¿ status "completed" ã‚’è¿”ã™ã“ã¨ã€‚)
ÚOBJECTÚSTRINGrR   Ú	completed)ÚtypeÚenumr†   T)r†   Únullable)rT   ÚmessageÚ
final_goalrT   r‰   )r†   Ú
propertiesÚrequiredrX   rY   rZ   r\   r_   i   zapplication/json)ra   rb   Úresponse_mime_typeÚresponse_schemarc   z{}r>   rŠ   u   ç›®æ¨™ã‚’ç¢ºå®šã—ã¾ã—ãŸã€‚)rT   r‰   rŠ   Úusernameu~   ã‚‚ã†å°‘ã—å…·ä½“çš„ã«æ•™ãˆã¦ã„ãŸã ã‘ã¾ã™ã‹ï¼Ÿãƒ‡ãƒ¼ã‚¿ã®æ„å‘³ãŒä¼ã‚ã‚Šã«ãã‹ã£ãŸã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã€‚rS   zError: u)  ç”³ã—è¨³ã‚ã‚Šã¾ã›ã‚“ã€‚ã‚‚ã†å°‘ã—ã‚ã‹ã‚Šã‚„ã™ããŠä¼ãˆã—ã¾ã™ã­ã€‚ã€Œç›®æ¨™ã€ã¯ã‚„ã‚ŠãŸã„æ•°ã€ã€Œå®Ÿç¸¾ã€ã¯å®Ÿéš›ã«ã§ããŸæ•°ã§ã™ã€‚ãã®å·®ãŒã€Žã‚®ãƒ£ãƒƒãƒ—ã€ã§ã™ã€‚ã“ã®ã‚®ãƒ£ãƒƒãƒ—ã‚’åŸ‹ã‚ã‚‹ãŸã‚ã«ã€æ—¥ã€…ã®æ´»å‹•ã§ä½•ãŒè¶³ã‚Šãªã„ã¨æ„Ÿã˜ã¾ã™ã‹ï¼ŸN)r(   Úcurrent_stepr   Úget_question_by_stepÚsave_answerÚuser_messageÚget_conversation_historyrP   Újoinri   r	   rj   rk   r
   rl   rm   rn   ÚjsonÚloadsr[   r-   Úsave_or_update_outputÚsync_to_user_profile_summaryr   rh   rp   rq   )rQ   r(   r   ÚqÚhistoryrr   Ú	worst_strÚhistory_textrz   rŽ   r{   r|   r;   rT   ÚmsgrŠ   r   Únext_msgÚ	next_stepr}   Úfallbackr%   r%   r&   Úanswer_find_goal²   s|   €


þÿüù	÷ýù
üý
ÿ€ör¢   )Úfastapir   r   Ú
app.modelsr   Úapp.models.general_moduler   Úapp.models.sales_sheet_moduler   Úapp.schemas.findgoal_schemar   r   Úapp.core.configr	   Úgoogle.genair
   r–   Útypingr   r   r   Úrouterri   rE   rD   r'   ÚstrrP   Úpostr~   r¢   r%   r%   r%   r&   Ú<module>   sF    þ$÷ü..