o
    hS)                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlZd dlmZ d dlmZmZ ejejd eeZG d	d
 d
e
ZG dd de
ZG dd de
ZG dd de
Z G dd de
Z!G dd de
Z"G dd de
Z#G dd de
Z$G dd de
Z%G dd de
Z&edddd Z'e'j(ed!gd"d!gd!gd# e')d$d%d& Z*e'j+d'e$d(d)e!d*efd+d,Z,e'j+d-ed(d)ed*efd.d/Z-d dl.Z.e'j+d0e&d(d)e%d*efd1d2Z/d3d4 Z0d5e1fd6d7Z2dS )8    N)FastAPIHTTPExceptionBackgroundTasksstatus)	BaseModel)DictListAnyOptional)CORSMiddleware)StreamingResponse)ManagerCareerGuidanceRequestManagerCareerGuidanceResponse)levelc                   @   s&   e Zd ZU eed< eed< eed< dS )Skillskill_id
skill_type
skill_nameN__name__
__module____qualname__str__annotations__ r   r   E/var/www/eduai.edurigo.com/my_career/production/my_career_fast_api.pyr      s   
 r   c                   @   s2   e Zd ZU dZee ed< dZeee	  ed< dS )
JobProfileNjob_profile_namejob_profile_skills)
r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r      s   
 r   c                   @   sf   e Zd ZU eed< eed< eed< dZee ed< g Ze	e ed< g Z
e	e ed< g Ze	e ed< dS )	UserInfo	user_name	managerIddesignationN
jobProfileassignedCoursescompletedCoursesskills)r   r   r   r   r   r#   r
   r   r$   r   r%   r&   r   r   r   r   r   r       s   
 r   c                   @   s>   e Zd ZU eed< eed< eed< eed< g Zee ed< dS )CoursecourseIdnameshort_descriptiondescriptionr&   N)r   r   r   r   r   r&   r   r   r   r   r   r   r'   )   s   
 r'   c                   @   sB   e Zd ZU eed< eed< eeef ed< eeee	 f ed< dS )CareerGuidanceRequest	client_id
user_query	user_dataclient_all_courses_dataN)
r   r   r   intr   r   r   r   r   r'   r   r   r   r   r,   0   s
   
 r,   c                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )RecommendedCourser(   
courseName
matchScorereasonscenario_relevanceNr   r   r   r   r   r2   6   s   
 r2   c                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< d	Zeed
< eed< eed< eed< dZ	e
e ed< dS )OnlineCourser(   r3   platform
instructordurationr4   r5   scoreTisOnlineCourseurltypelastUpdatedN	thumbnail)r   r   r   r   r   r1   floatr<   boolr@   r
   r   r   r   r   r7   =   s   
 r7   c                   @   s   e Zd ZU eed< ee ed< g Zeee	  ed< dZ
eeeef  ed< dZeeeef  ed< dZeeeef  ed< eed< dS )	CareerGuidanceResponseanswerrecommended_coursesonline_course_recommendationsNskill_gap_chartjob_profile_analysiscareer_contexttoken_count)r   r   r   r   r   r   r2   rF   r
   r7   rG   r   r	   rH   rI   r1   r   r   r   r   rC   M   s   
 rC   c                   @   s6   e Zd ZU eed< eed< eeef ed< eed< dS )PlatformCourseRequestr-   r.   r/   platform_nameN)r   r   r   r1   r   r   r   r   r   r   r   r   rK   V   s
   
 rK   c                   @   s   e Zd ZU ee ed< dS )PlatformCourseResponserF   N)r   r   r   r   r7   r   r   r   r   r   rM   \   s   
 rM   zCareer Guidance APIzCAPI for career guidance recommendations using Ollama with Gemma 12Bz1.0.0)titler+   version*T)allow_originsallow_credentialsallow_methodsallow_headers/c                      s   dddS )NzAPI is runningz)Welcome to Career Guidance production API)r   messager   r   r   r   r   rootn   s   
rW   z/career-guidance)response_modelrequestbackground_tasksc              
      s  z|   }tjdddd}|j}t|| |  t|	  W d    n1 s-w   Y  zt
jdd|gdddd}|j }td	|  z1|d
}|dd }|dkru||kru||| }	t|	}
d|
vrtd|
d< nttjddW n tjy } zttjddd }~ww |t| |
dd|
dg |
dg |
di |
di |
di |
ddd}|W W S  t
jy } zttjd|j dd }~ww  ty } zttjdt| dd }~ww )Nw+.jsonFmodesuffixdeletepython3zmy_career.pyTcapture_outputtextcheckzScript output: {}   r   rJ   $No valid JSON found in script outputstatus_codedetailFailed to parse script outputrD    rE   rF   rG   rH   rI   )rD   rE   rF   rG   rH   rI   rJ   Error executing Python script: Unexpected error: )dicttempfileNamedTemporaryFiler)   jsondumpflushosfsyncfileno
subprocessrunstdoutstriploggerinfofindrfindloadsr   r   HTTP_500_INTERNAL_SERVER_ERRORJSONDecodeErroradd_taskcleanup_temp_filegetCalledProcessErrorstderr	Exceptionr   )rY   rZ   payloadtmp_filetemp_file_pathresultoutput
json_startjson_endjson_strresponse_dataefinal_response_datar   r   r   get_career_guidancer   s~   











r   z/career-guidance-managerc              
      s  z|   }tjdddd}|j}t|| |  t|	  W d   n1 s-w   Y  zbt
jdd|gdddd	d
}|j }z)|d}|dd }|dkrf||krf||| }	t|	}
nttjddW n tjy } zttjddd}~ww |t| d|
vrd|
d< |
W W S  t
jy } zttjd|j dd}~w t
jy   ttjddw  ty } zttjdt| dd}~ww )z
    Advanced career guidance endpoint specifically designed for managers.
    Provides comprehensive team analysis, management insights, and strategic recommendations.
    Now includes total token count in the response.
    r[   r\   Fr]   Nra   z$manager_career_guidance_processor.pyTx   )rc   rd   re   timeoutrf   rg   rh   r   ri   rj   rm   total_tokensz)Error executing manager guidance script: z/Request processing timed out. Please try again.rp   )rq   rr   rs   r)   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r   r   r   r   r   r   r   r   r   r   r   TimeoutExpiredHTTP_408_REQUEST_TIMEOUTr   r   )rY   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   get_manager_career_guidance   sv   


r   z/fetch-platform-coursesc              
      st  z|   }tjdddd}|j}t|| W d    n1 s"w   Y  t }|d t	d|I d H }|j
 }z)|d}|dd }	|d	kr\|	|kr\|||	 }
t|
}ntd
|d	W n tjyr   tdddw d|dg i}|t| |W S  tjy } ztddt|dr|jnt| dd }~w ty } ztddt| dd }~ww )Nr[   r\   Fr]   z5my_career_fetch_particular_platform_online_courses.pyrf   rg   rh   r   zNo valid JSON foundi  zError parsing JSON outputrj   rF   ro   r   rp   )rq   rr   rs   r)   rt   ru   asyncioget_event_looprun_in_executorexecute_subprocessr|   r}   r   r   r   r   r   r   r   r   rz   r   hasattrr   r   r   )rY   rZ   r   r   r   loopr   r   r   r   r   r   r   r   r   r   fetch_platform_courses   s@   

&r   c                 C   s   t jd| |gdddd}|S )Nra   Trb   )rz   r{   )script_pathr   r   r   r   r   r   #  s   r   	file_pathc                 C   s8   zt j| rt |  W d S W d S  ty   Y d S w )N)rw   pathexistsunlinkr   )r   r   r   r   r   ,  s   r   )3rz   rt   rr   rw   fastapir   r   r   r   pydanticr   typingr   r   r	   r
   fastapi.middleware.corsr   loggingfastapi.responsesr   manager_career_guidance_modelsr   r   basicConfigINFO	getLoggerr   r~   r   r   r   r'   r,   r2   r7   rC   rK   rM   appadd_middlewarer   rW   postr   r   r   r   r   r   r   r   r   r   r   <module>   s\    
		
FC#	