
    i                         d Z ddlZddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ  ej                   e      Z G d d      Zy)	uA   T2I 생성 결과 추적 모듈 — Opik 스타일 생성 로그.    N)datetimetimezone)AnyDictListOptional)Session)GenerationTracec                   H   e Zd ZdZddededdfdZddddddddddee   d	ee   d
ee   dedededee   dedee   dee	e      dee   dee   de
fdZ	 	 	 ddee   d	ee   d
ee   de	eeef      fdZdeeef   fdZdede	eeef      fdZede
deeef   fd       Zy)GenerationTrackeru8   T2I 생성 결과를 추적하는 Opik 스타일 모듈.
db_session
project_idreturnNc                      || _         || _        y )N)_db_project_id)selfr   r   s      T/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/generation_tracker.py__init__zGenerationTracker.__init__   s    %    )still_id	entity_idimage_asset_id
model_nameblock_reasonblock_categoriesresponse_time_mssanitizer_feedbackr   r   r   attempt_numberprompt_usedprompt_versionr   statusr   r   r   r   c                   t        t        t        j                               | j                  |||||||||	t        j                  |
xs g d      ||t        j                  t        j                        j                               }| j                  j                  |       | j                  j                          t        j!                  d|||       |S )z Record a T2I generation attempt.F)ensure_ascii)idr   r   r   r   r   r    r!   r   r"   r   r   r   r   
created_atz<Generation trace recorded: status=%s, attempt=%d, version=%s)r
   struuiduuid4r   jsondumpsr   nowr   utc	isoformatr   addflushloggerinfo)r   r   r   r   r   r    r!   r   r"   r   r   r   r   traces                 r   recordzGenerationTracker.record   s    "  4::< ''))#)!%!ZZ(8(>BUS-1||HLL1;;=
" 	UJ		
 r   c                    | j                   j                  t              }|r"|j                  t        j                  |k(        }|r"|j                  t        j
                  |k(        }|r"|j                  t        j                  |k(        }|j                  t        j                        }|j                         }|D cg c]  }| j                  |       c}S c c}w )z3Get all traces for a still, entity, or image asset.)r   queryr
   filterr   r   r   order_byr&   all_trace_to_dict)r   r   r   r   r6   tracests          r   
get_traceszGenerationTracker.get_tracesE   s     /LL!9!9X!EFELL!:!:i!GHELL!?!?>!QRE99:0671##A&777s   ?Cc                    | j                   j                  t              }| j                  r,|j	                  t        j
                  | j                  k(        }|j                         }t        |      }t        d |D              }t        d |D              }t        d |D              }i }|D ]K  }|j                  dk(  s|j                  s |j                  |j                  d      dz   ||j                  <   M |||||dS )z$Get aggregated rejection statistics.c              3   @   K   | ]  }|j                   d k(  sd  yw)success   Nr"   .0r<   s     r   	<genexpr>z8GenerationTracker.get_rejection_stats.<locals>.<genexpr>_   s     EAqxx9/Da   c              3   @   K   | ]  }|j                   d k(  sd  yw)moderation_blockedrA   NrB   rC   s     r   rE   z8GenerationTracker.get_rejection_stats.<locals>.<genexpr>`   s     PAqxx;O/OarF   c              3   >   K   | ]  }|j                   d v sd  yw))errortimeoutrA   NrB   rC   s     r   rE   z8GenerationTracker.get_rejection_stats.<locals>.<genexpr>a   s     Nz!QXX9M-MAzs   rH   r   rA   )totalr@   blockedrJ   block_reasons)r   r6   r
   r   r7   r   r9   lensumr"   r   get)	r   r6   
all_tracesrL   r@   rM   rJ   rN   r<   s	            r   get_rejection_statsz%GenerationTracker.get_rejection_statsW   s    /LL!;!;t?O?O!OPEYY[
JEEEPPPNzNN(*Axx//ANN0=0A0A!..RS0TWX0Xann- 
 *
 	
r   c                    | j                   j                  t              j                  t        j                  |k(        j                  t        j                        j                         }|D cg c]  }| j                  |       c}S c c}w )zDGet the prompt evolution for a still (original -> sanitized -> ...).)	r   r6   r
   r7   r   r8   r   r9   r:   )r   r   r;   r<   s       r   get_prompt_evolutionz&GenerationTracker.get_prompt_evolutionp   sj     HHNN?+VO,,89Xo445SU	 	 1771##A&777s   /B
r3   c                 <   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  dS )Nr%   r   r   r   r   r    r!   r   r"   r   r   r   r   r&   rW   )r3   s    r   r:   z GenerationTracker._trace_to_dictz   s     ((#22#22 ,,#22**ll!.. % 6 6 % 6 6"'":":**
 	
r   ) )NNN)__name__
__module____qualname____doc__
OrmSessionr'   r   r   intr   r
   r4   r   r   r=   rS   rU   staticmethodr:    r   r   r   r      s   B&: &3 & & #'#'(, %)&*04*.,0, 3-, C=	,
 !, , , , SM, , sm, #49-, #3-, %SM, 
,` #'#'(,	83-8 C=8 !	8
 
d38n	8$
T#s(^ 
28S 8T$sCx.5I 8 
o 
$sCx. 
 
r   r   )r\   r*   loggingr(   r   r   typingr   r   r   r   sqlalchemy.ormr	   r]   app.models.projectr
   	getLoggerrY   r1   r   r`   r   r   <module>rf      s>    G    ' , , 0 .			8	${
 {
r   