
    ij                     @   U d dl Z 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 d dl	m
Z
  e
         ej                  d      r8ej                  j                  dd       ej                  j                  dd	       d d
lmZmZ d dlmZ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mZ d dl m!Z! d dl"m#Z#  ej                  d      xs djI                         Z% e&ee%ejN                        Z( ee(        ejR                  e*      Z+dD ]-  Z, ejR                  e,      j[                  ej\                         / d7dZ/ e/        de0e1e2   e3f   fdZ4da5edz  e6d<   edefd       Z7defdZ8 edde7d d!ig"      Z9 e4       \  Z:Z;e9jy                  ee:e;g d#d$g%       e9j{                  d&      d'        Z>e9j{                  d(d!g)      d*e?fd+       Z@ G d, d-e      ZAe9j                  d.d!g)      d/eAfd0       ZCe*d1k(  rd dlDZD eDj                  e9d2d3d4d56       yy)8    N)asynccontextmanager)partial)load_dotenvLANGSMITH_API_KEYLANGCHAIN_TRACING_V2trueLANGCHAIN_PROJECTzuser-profiling)FastAPIHTTPException)	BaseModelField)run_in_threadpool)CORSMiddleware)
db_sessionverify_database_connectivity)setup_logging)ProfilingOrchestratorsanitize_profile_for_api)get_profiling_repository)ensure_profiling_storage_tables	LOG_LEVELERROR)level)httpxhttpcoreopenaireturnc                     t        j                  d      } t        d | j                  D              ry t        j                  t
        j                        }|j                  t         j                         |j                  t        j                  d             d|_        | j                  |       | j                  t         j                         d| _        y )Nuvicornc              3   6   K   | ]  }t        |d d        yw)_profiling_uvicornFN)getattr).0hs     3/var/www/html/userprofiledev.eatanceapp.com/main.py	<genexpr>z6_configure_uvicorn_terminal_logging.<locals>.<genexpr>,   s     
LOq71*E2Os   z%(levelname)s:	%(message)sTF)logging	getLoggeranyhandlersStreamHandlersysstderrsetLevelINFOsetFormatter	Formatterr!   
addHandler	propagate)uvilogr$   s     r%   #_configure_uvicorn_terminal_loggingr5   )   s    y)F

LFOO
LLcjj)AJJw||NN7$$%BCDA
a
OOGLL!F    c                     t        j                  d      xs dj                         } | r| dk(  rdgdfS | j                  d      D cg c]#  }|j                         s|j                         % }}|sdgdfS |dfS c c}w )NCORS_ORIGINS *F,T)osgetenvstripsplit)rawooriginss      r%   _cors_allow_originsrC   :   s{    99^$*
1
1
3C#*u~"%))C.>.QAGGIqwwy.G>u~T? ?s   A<A<orchestrator_appc                   K   t        t               d {    t        d        d {    t        t              ad  y 7 -7 w)Nc                       t        t              S N)r   r    r6   r%   <lambda>zlifespan.<locals>.<lambda>L   s
    $CJ$Or6   )r   r   r   r   rD   )rE   s    r%   lifespanrK   H   s<      8
999
O
PPP(4L	 :Ps   AAAAAAc                  0    t         } | t        dd      | S )Ni  z1Service not ready (orchestrator not initialized).status_codedetail)rD   r   )rA   s    r%   _require_orchestratorrP   Q   s&    AyF
 	
 Hr6   zUser profiling APIz1.2.0nameprofile)titleversionrK   openapi_tags)GETPOSTPUTPATCHDELETEOPTIONSr:   )allow_originsallow_credentialsallow_methodsallow_headers/c                      dddS )NzUser profiling API is online.z/docs)messagedocsrI   rI   r6   r%   	read_rootrd   l   s    6HHr6   z/profile/{user_id})tagsuser_idc                 ~   K   	 t         fd       d {   }|r|j                  xs dj                         st        dd  d      	 t	        j
                  |j                        }|j                  d
      st        dd  d      t        |       |j                  xs dj                         }|r|nd |d<   |S 7 # t        j                  $ r% t        j                  d        t        dd	      d w xY w# t        $ r  t        $ r)}t        j                  d        t        dd      |d }~ww xY ww)Nc                  6    t               j                         S rH   )r   get_snapshot)rf   s   r%   rJ   z"get_user_profile.<locals>.<lambda>u   s    ,.;;GDr6   r9     zNo stored profile for user_id=.rM   z+GET /profile/%s: invalid profile_json in DB  z0Stored profile data is corrupted (invalid JSON).metadatazNo usable profile for user_id=deep_analysiszGET /profile/%s failedInternal server error)r   profile_jsonr>   r   jsonloadsJSONDecodeErrorlogger	exceptiongetr   deep_analysis_markdown	Exception)rf   snaprR   mdes   `    r%   get_user_profiler|   q   sS    T&D
 
 D--3::<7yB 	jj!2!23G {{:&7yB  	!)))/R668)+2 1
 ## 	JGTI 	   T17;4KLRSSTsQ   D=C? C5C? C ,AC? D=C? 8C<<C? ?D:$D55D::D=c                   8    e Zd ZU eed<    eddd      Zeed<   y)CreateProfilingRequestrf   <         )defaultgeledaysN)__name__
__module____qualname__int__annotations__r   r   rI   r6   r%   r~   r~      s    LbQ3/D#/r6   r~   z/profile/create_profilingbodyc                 H  K   | j                   }| j                  }	 t               }t        j                         }t        t        |j                  ||             d {   }|r|j                  d      st        dd| d      t        t        |j                  ||             d {   }t        j                  d|t        j                         |z
         d|iS 7 7 6# t        $ r  t        $ r*}t        j                  d	||       t        d
d      |d }~ww xY ww)N)rf   window_daysrm   rj   zUser z7 profile could not be generated (missing data or user).rM   zEPOST /profile/create_profiling user_id=%s deep_analysis done in %.2fsrn   z;POST /profile/create_profiling failed (user_id=%s, days=%s)rl   ro   )rf   r   rP   timeperf_counterr   r   generate_user_profile_datarv   r   run_deep_analysisrt   debugrx   ru   )r   rf   r   orcht0rR   markdown_reportr{   s           r%   create_user_profilingr      s.    llG99DT$& )// 
 
 gkk*5wi'^_  !2D**GW=!
 
 	S"$	

  11)

   TI7TX	
 4KLRSS	TsN   D"AC# CAC# *C!+3C# D"C# !C# #D5%DDD"__main__z0.0.0.0i  infoT)hostport	log_level
access_log)r   N)Frq   r'   r<   r,   r   
contextlibr   	functoolsr   dotenvr   r=   environ
setdefaultfastapir
   r   pydanticr   r   starlette.concurrencyr   starlette.middleware.corsr   core.db_connectionr   r   core.logger_configr   profiling_orchestratorr   r   storage.db_repor   storage.user_profilingr   upper_log_level_namer"   r   
_log_levelr(   r   rt   _noisyr.   WARNINGr5   tupleliststrboolrC   rD   r   rK   rP   app_cors_origins_cors_credentialsadd_middlewarerv   rd   r   r|   r~   postr   r   runrI   r6   r%   <module>r      s\     	 
  *    299 !JJ0&9JJ-/?@ * % 3 4 G , R 4 B 299[)4W;;=Wow}}=
 J 			8	$ .FGf&&w7 . $ %U49d?3  .2#d* 1 
 
 
4  
9%&	 $7#8      'F%   I I 	YK0TC T 1TD0Y 0
 
%YK8!T&< !T 9!TH zGKK	 r6   