o
    ô�gj/  ã                   @   sl  d dl Z d dlZd dlZd dl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 edd� ed	d
�Zeje
dgddgdgd� dZe d¡Ze d¡Zee d¡d�ZdZG dd„ deƒZdededefdd„Zdededefdd„Zded edefd!d"„Zd#ed$edefd%d&„Ze  d'¡d(efd)d*„ƒZ!d+d,„ Z"e#d-kr´d dl$Z$e$j%d.d/d0dd1� dS dS )2é    N)Úload_dotenv)ÚFastAPIÚHTTPException)ÚCORSMiddleware)Ú	BaseModel)ÚOpenAIz/var/www/.env)Údotenv_pathzBChoboyeo AI Fixed-Start 3-Way Scan Engine with Road Risk Analytics)ÚtitleÚ*T)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headersÚ
a5ipux8gmzÚNAVER_CLIENT_SECRETÚKOROAD_AUTH_KEYr   )Úapi_keyz&http://34.22.87.81/choboyeo/PHP/AI.phpc                   @   s   e Zd ZU eed< eed< dS )ÚZoneRequestÚ	zone_nameÚ	city_nameN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__© r   r   ú#/var/www/html/choboyeo/PHP/main3.pyr   "   s   
 r   r   r   Úreturnc              
   C   s€   z*t jt| |dœdd�}| ¡ }| d¡st| dd¡ƒ‚|d d |d	 d d
œW S  ty? } z	tdd|› �d�‚d}~ww )uO   AI.phpì—�ì„œ zone_name, city_nameì—� í•´ë‹¹í•˜ëŠ” ì¢Œí‘œê°’ì�„ ë°›ì•„ì˜µë‹ˆë‹¤.)r   r   é   )ÚjsonÚtimeoutÚsuccessÚmessageu   AI.php ì�‘ë‹µ ì˜¤ë¥˜ÚzoneÚcoordsÚcity)Úzone_coordsÚcity_coordséô  u   AI.php ì¢Œí‘œ ì¡°íšŒ ì‹¤íŒ¨: ©Ústatus_codeÚdetailN)ÚrequestsÚpostÚ
AI_PHP_URLr   ÚgetÚ
ValueErrorÚ	Exceptionr   )r   r   ÚresÚdataÚer   r   r   Úfetch_coords_from_php'   s    ý


þ€ÿr5   ÚlatÚlngc              
   C   sþ   d}|| }|| }d|› d| › d|› d| › d�	}|  dd¡  dd¡}dt› d	|› d
�}z8tj|dd�}|jdkr\| ¡ }	|	 d¡dkr_|	 di ¡ d¡rbt|	d d d  dd¡ƒW S W dS W dS W dS  ty~ }
 ztd|
› �ƒ W Y d}
~
dS d}
~
ww )u€    ë�„ë¡œêµ�í†µê³µë‹¨ ì˜¤í”ˆ APIë¥¼ í™œìš©í•˜ì—¬ ì§€ì •ë�œ ì¢Œí‘œ ë°˜ê²½ 500mì�˜ ì‹¤ì‹œê°„ ë�„ë¡œìœ„í—˜ì§€ìˆ˜ë¥¼ ì¸¡ì •í•©ë‹ˆë‹¤. g{®Gázd?zLineString(Ú Ú,ú)z%20z%2Cz@https://opendata.koroad.or.kr/data/rest/road/dgdgr/link?authKey=z&searchLineString=z&vhctyCd=01&type=jsoné   )r    éÈ   Ú
resultCodeÚ00ÚitemsÚitemr   Úanals_valueg        uB   âš ï¸� ë�„ë¡œìœ„í—˜ì§€ìˆ˜ Open API í˜¸ì¶œ ì‹¤íŒ¨ (ì„œí–‰ íŒ¨ìŠ¤): N)	Úreplacer   r,   r/   r*   r   Úfloatr1   Úprint)r6   r7   Ú
lng_offsetÚ	start_lngÚend_lngÚline_stringÚencoded_lineÚapi_urlr2   r3   r4   r   r   r   Úget_road_risk_score:   s8   ÿþÿ
 ýüüþ€þrK   Ú
risk_scoreÚcontext_guidec              
   C   sz   d| › d|› d�}zt jjjdd|dœgddd	�}|jd
 jj ¡ W S  ty< } zt	d|› �ƒ W Y d}~dS d}~ww )uq    ê³µë‹¨ ìœ„í—˜ ì �ìˆ˜ì™€ ë„¤ì�´ë²„ ë‚´ë¹„ ì•ˆë‚´ ë¬¸êµ¬ë¥¼ ìœµí•©í•˜ì—¬ ì´ˆë³´ìž�ìš© ì•ˆì‹¬ í–‰ë�™ ì§€ì¹¨ ìƒ�ì„± uR  
    ë‹¹ì‹ ì�€ ì¹œì ˆí•˜ê³  ì‹ ë¢°ê°� ìžˆëŠ” ì´ˆë³´ ìš´ì „ ì „ë¬¸ ë�„ë¡œì—°ìˆ˜ ê°•ì‚¬ìž…ë‹ˆë‹¤. 
    ì´ˆë³´ ìš´ì „ìž�ê°€ ë‚´ë¹„ê²Œì�´ì…˜ ì§€ë�„ì—�ì„œ 'ìœ„í—˜ ìŠ¤íŒŸ' ë§ˆì»¤ë¥¼ í„°ì¹˜í–ˆì�„ ë•Œ ë³´ì—¬ì¤„ í•µì‹¬ ë¸Œë¦¬í•‘ì�„ ë”± 1ë¬¸ìž¥(50ìž� ë‚´ì™¸)ìœ¼ë¡œ ëª…í™•í•˜ê²Œ ìž‘ì„±í•´ì£¼ì„¸ìš”.

    [ë�„ë¡œ ë�°ì�´í„°]
    - ë�„ë¡œìœ„í—˜ì§€ìˆ˜: ub   ì � (ë†’ì�„ìˆ˜ë¡� ë³µìž¡í•˜ê³  ì‚¬ê³ ìœ¨ì�´ ë†’ì�€ êµ¬ê°„)
    - í•´ë‹¹ ì§€ì � ì£¼ë³€ ì•ˆë‚´ë¬¸: "u  "

    [ìž‘ì„± ê·œì¹™]
    1. ë°˜ë“œì‹œ "~êµ¬ê°„ì�´ë¯€ë¡œ ~ì—� ì£¼ì�˜í•˜ì„¸ìš”" ë˜�ëŠ” "~êµ¬ì—­ì�´ë�¼ ìœ„í—˜ë�„ê°€ ë†’ìœ¼ë‹ˆ ~í•˜ì„¸ìš”" ë“±ì�˜ ë¶€ë“œëŸ¬ìš´ í–‰ë�™ ì§€ì¹¨ í�¬ë§·ìœ¼ë¡œ ì™„ì„±í•  ê²ƒ.
    2. "í•©ë¥˜ ì°¨ì„ ", "ë¹„ë³´í˜¸ ìš°íšŒì „", "ì‚¬ê°�ì§€ëŒ€", "ê¸‰ê°�ì†�", "ê¼¬ë¦¬ë¬¼ê¸°" ë“± ì´ˆë³´ìž�ê°€ ì¦‰ê°� ì�´í•´í•  ìˆ˜ ìžˆëŠ” ì§�ê´€ì �ì�¸ ìš´ì „ ì–´íœ˜ë¥¼ ì„ íƒ�í•  ê²ƒ.
    3. ì£¼ë³€ ì•ˆë‚´ë¬¸ ë‚´ìš©ê³¼ ìœ„í—˜ ì �ìˆ˜ë¥¼ ì�¸ê³¼ê´€ê³„ë¡œ ë§¤ë�„ëŸ½ê²Œ ì—®ì–´ì„œ ê·¸ëŸ´ë“¯í•œ ì‚¬ìœ ë¥¼ ì¶”ë¡ í•˜ì—¬ ì¡°ì–¸í•  ê²ƒ.
    zgpt-4o-miniÚuser)ÚroleÚcontenté–   g333333ã?)ÚmodelÚmessagesÚ
max_tokensÚtemperaturer   u!   âš ï¸� OpenAI API í˜¸ì¶œ ì‹¤íŒ¨: Nur   ì°¨ëŸ‰ êµ�ì°¨ ë°� ìœ ë�™ì � ë³€ìˆ˜ê°€ ì¡´ìž¬í•˜ëŠ” êµ¬ì—­ìž…ë‹ˆë‹¤. ì „ë°©ì�„ ì£¼ì‹œí•˜ë©° ì†�ë�„ë¥¼ ì¤„ì�´ì„¸ìš”.)
Úopenai_clientÚchatÚcompletionsÚcreateÚchoicesr"   rP   Ústripr1   rD   )rL   rM   ÚpromptÚresponser4   r   r   r   Úgenerate_risk_descriptionT   s$   ûú
ü€þr^   Úpath_coordsÚguide_textsc              	   C   sÂ   t | ƒ}|dk r
g S t |ƒ}g }tdƒD ]J}t||d  d ƒ}| | \}}|dkr4t||d  d ƒnd}	|dkr>||	 nd}
t||ƒ}|dkrOt||
ƒ}nd}| |d ||||dœ¡ q|S )	uÇ    
    ì „ì²´ ê²½ë¡œ ì¢Œí‘œ ë�°ì�´í„° ë¦¬ìŠ¤íŠ¸ì—�ì„œ ë“±ê°„ê²©ìœ¼ë¡œ 10ê°œì�˜ ì§€ì �ì�„ ìƒ˜í”Œë§�í•©ë‹ˆë‹¤.
    ìœ„í—˜ì§€ìˆ˜ê°€ 10ì � ì�´ìƒ�ì�¸ ì§€ì �ë§Œ OpenAI ë¶„ì„� ì—”ì§„ì�„ ê°€ë�™í•©ë‹ˆë‹¤.
    é
   é   é	   r   u   ì§�ì§„ êµ¬ê°„ ì£¼í–‰g      $@N)Úindexr6   r7   rL   Údesc)ÚlenÚrangeÚintrK   r^   Úappend)r_   r`   Útotal_pointsÚtotal_guidesÚsampled_pointsÚiÚidxr7   r6   Ú	guide_idxÚcurrent_guiderL   Úai_descr   r   r   Úsample_route_risk_pointsq   s,    

ûrr   z/api/analyze-zoneÚreqc           '      C   sH  | j }| j}td|› d|› d�ƒ t||ƒ}|d }|d }g }d}ttdœ}g d¢d	d
œg d¢dd
œddgdd
œdœ}	tdƒD ]ô}
t |d |d ¡}t |d |d ¡}t |d |d ¡}t |d |d ¡}|› d|› �|› d|› �ddœ}z°t	j
|||d�}| ¡ }| 
d¡dks’d|vr”W q@|d d d }| 
di ¡}| 
dd¡d }| 
dd¡d  }|d!k sº|d"kr¼W q@| 
d#g ¡}| 
d$g ¡}d%d&„ |D ƒ}d' |¡}d(}g }|	 ¡ D ]\}}|d) D ]}||v rõ||d* 8 }| |¡ qäqÜd+}|dk�r||d,  }|d-k �r|d.8 }n	|d/k�r|d7 }| ||t|ƒ||tt|ƒƒd0œ¡ W q@ t�y4   Y q@w |jd1d2„ d3d4� i } d(}!t|ƒdk�rž|d }"td5ƒ t|"d# |"d$ ƒ}#|"d6 �sad7n
d8d9 |"d6 ¡› d:�}$d;|"d d<›d=�|"d# |"d$ t|"d> |!ƒ|#d?t|ƒ› d@|› dA|"d d<›dB|"dC d<›dD|$› �
dEœ| dF< t|ƒdGk�rØ|dG }%tdHƒ t|%d# |%d$ ƒ}#dI|%d d<›d=�|%d# |%d$ t|%d> |!ƒ|#dJ|%d d<›dK�dEœ| dL< t|ƒdMk�r|dM }&tdNƒ t|&d# |&d$ ƒ}#dO|&d d<›d=�|&d# |&d$ t|&d> |!ƒ|#dP|&d d<›dQ�dEœ| d< | �stdRdSdT�‚tdUƒ d3| dVœS )WNu1   
ðŸŽ² [AI ìœ„í—˜ë¶„ì„� ìœµí•© ì—”ì§„] ì¶œë°œì§€: u    âž¡ï¸� ëª©ì �ì§€: u-    ì „ì—­ (ìž¥ê±°ë¦¬ & ìœ„í—˜ë�„ ì—°ì‚° ì‹œìž‘)r&   r'   z9https://maps.apigw.ntruss.com/map-direction-15/v1/driving)zX-NCP-APIGW-API-KEY-IDzX-NCP-APIGW-API-KEY)u	   ë¹„ë³´í˜¸u   ìœ í„´u   í•©ë¥˜u   ì—°ì†�é2   )ÚwordsÚpenalty)u	   ë¡œí„°ë¦¬u   íšŒì „êµ�ì°¨ë¡œu   ê³ ê°€ë�„ë¡œu   ì§€í•˜ì°¨ë�„é   u   ì�´ë¦„ ì—†ëŠ” ë�„ë¡œu	   ê¸‰ì»¤ë¸Œé   )ÚHIGHÚMEDIUMÚLOWÚmin_latÚmax_latÚmin_lngÚmax_lngr9   Útrafast)ÚstartÚgoalÚoption)ÚheadersÚparamsÚcoder   ÚrouteÚsummaryÚdistanceg     @�@Údurationg     Lí@g      @g      .@ÚpathÚguidec                 S   s   g | ]}|  d d¡‘qS )ÚinstructionsÚ )r/   )Ú.0Úgr   r   r   Ú
<listcomp>Ç   s    z%analyze_zone_loop.<locals>.<listcomp>r8   i,  ru   rv   g     €A@g      N@g      9@é(   g     €F@)r‹   rŒ   Úscorer‰   ÚspeedÚ	penaltiesc                 S   s   | d | d  fS )Nr“   r‰   r   )Úxr   r   r   Ú<lambda>ç   s    z#analyze_zone_loop.<locals>.<lambda>T)ÚkeyÚreverseua    -> [ë¶„ì„� ì¤‘] 1ìœ„ ì½”ìŠ¤ ì‹¤ì‹œê°„ 10ê°œ ì§€ì � ë�„ë¡œìœ„í—˜ì§€ìˆ˜ ë°� AI ê°€ì�´ë“œ ì—°ì‚°...r•   u    (ì£¼ì�˜ ìš”ì†Œ ì—†ì�Œ)u    (ê¸°í”¼ ìš”ì†Œ: z, u    ìš°íšŒ íŒ�ë‹¨)u   ðŸ�† ì•ˆì‹¬ 1ìœ„ íŠ¸ëž™ (z.1fzkm)r“   u   âœ¨ u!   ì—�ì„œ ì•ˆì „í•˜ê²Œ ì¶œë°œí•˜ì—¬ u    ì™¸ê³½ìœ¼ë¡œ ë»—ì–´ ë‚˜ê°€ëŠ” u)   km ì•ˆì‹¬ ì—°ìˆ˜ ì½”ìŠ¤ìž…ë‹ˆë‹¤. ì‹œì†� r”   u>   km/hë¡œ ì¾Œì �í•˜ê²Œ ë¡±-ëŸ° ì§�ì§„ ì—°ìŠµì�´ ê°€ëŠ¥í•©ë‹ˆë‹¤.)Únamer‹   rŒ   r“   Úrisk_pointsÚreasonÚ
traoptimalrb   ua    -> [ë¶„ì„� ì¤‘] 2ìœ„ ì½”ìŠ¤ ì‹¤ì‹œê°„ 10ê°œ ì§€ì � ë�„ë¡œìœ„í—˜ì§€ìˆ˜ ë°� AI ê°€ì�´ë“œ ì—°ì‚°...u   ðŸ¥ˆ ì•ˆì‹¬ 2ìœ„ íŠ¸ëž™ (uI   ðŸš— ì¶œë°œì§€ ì£¼ë³€ ë³µìž¡í•œ ìƒ�ìŠµ ì •ì²´ ì°¨ì„ ì�„ í”¼í•´ ì„¤ê³„ë�œ uW   km ëŒ€ì•ˆ ë£¨íŠ¸ìž…ë‹ˆë‹¤. ê´‘ì—­ ë�„ë¡œ ì �ì�‘ í›ˆë ¨ì—� ìµœì �í™”ë�˜ì–´ ìžˆìŠµë‹ˆë‹¤.Ú
tracomforté   ua    -> [ë¶„ì„� ì¤‘] 3ìœ„ ì½”ìŠ¤ ì‹¤ì‹œê°„ 10ê°œ ì§€ì � ë�„ë¡œìœ„í—˜ì§€ìˆ˜ ë°� AI ê°€ì�´ë“œ ì—°ì‚°...u   ðŸ¥‰ ì•ˆì‹¬ ë�„ì „ íŠ¸ëž™ (u   â�±ï¸� ê±°ë¦¬ê°€ uš   kmë¡œ ê¸¸ê²Œ ë»—ì–´ ìžˆìœ¼ë©°, ì—°ì†� ì§�ì§„ ì°¨ì„  ìœ ì§€ì™€ íƒ€ì�´ë°�ì—� ë§žì¶˜ ë¶€ë“œëŸ¬ìš´ ì°¨ì„  ë³€ê²½ì�„ ë³¸ê²©ì �ìœ¼ë¡œ ì—°ìŠµí•˜ê¸° ì¢‹ìŠµë‹ˆë‹¤.r(   u%   ì¡°ê±´ì—� ë§žëŠ” ê²½ë¡œ ì—°ì‚° ì‹¤íŒ¨r)   uj   [AI ìœµí•© ë¶„ì„� ìµœì¢… ì™„ë£Œ] 3ëŒ€ ì½”ìŠ¤ ë°� ê°� 10êµ¬ì—­ ìœ„í—˜ ìŠ¤ì½”ì–´ë§� ê²°í•© ë�°ì�´í„° ë°˜í™˜.)r!   Úroutes)r   r   rD   r5   ÚNAVER_CLIENT_IDr   rg   ÚrandomÚuniformr,   r/   r   Újoinr?   ri   rh   ÚlistÚsetr1   Úsortrf   rr   ÚminÚ_current_zone_name_cleanr   )'rs   r#   r%   r$   Ústart_boundsÚgoal_boundsÚscored_routesÚ	naver_urlr„   ÚDANGER_KEYWORDSrm   Ú	start_latrF   Úgoal_latÚgoal_lngr…   r2   Úres_dataÚ
route_datarˆ   Údistance_kmÚduration_minutesr‹   Úguidesr`   Úfull_guide_stringr“   Údetected_penaltiesÚlevelr3   Úwordr”   Úresult_routesÚ	MAX_SCOREÚtopr›   Úp_msgÚsubÚthirdr   r   r   Úanalyze_zone_loop•   sÐ   
þý 

€ý




úÿ$0
ú	
ú	
ú	
rÁ   c                 C   s   | S )Nr   )r#   r   r   r   r©     s   r©   Ú__main__z	main3:appz0.0.0.0i@  )ÚhostÚportÚreload)&r¢   r,   r   ÚosÚdotenvr   Úfastapir   r   Úfastapi.middleware.corsr   Úpydanticr   Úopenair   ÚappÚadd_middlewarer¡   Úgetenvr   r   rV   r.   r   r   Údictr5   rC   rK   r^   r¥   rr   r-   rÁ   r©   r   ÚuvicornÚrunr   r   r   r   Ú<module>   sH    

û	

$ þ