
    ^j              "          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  ej                  e	      Z
	 	 	 	 	 	 	 	 	 	 	 	 ddedededee   d	ee   d
edee   dee   dee   dee   deee      dee   dee   dee   dee   dee   f dZy)uM   LLM 호출 DB 로거 — 모든 LLM 호출의 입력/출력을 자동 기록.    N)datetimetimezone)Optional
model_nameuser_promptstatussystem_promptoutput_textduration_ms
project_id
episode_idoperation_type	step_namereference_image_idsinput_tokensoutput_tokenserror_messagemetadatareturnc           
         t        t        j                               }t        j                  t
        j                        j                         }d}|rt        |      |kD  r|d| dz   }t        |      |kD  r|d| dz   }|rt        |      |kD  r|d| dz   }	 ddl	m
} ddlm}  |       }	  |di d|d|d	|d
|d|	d| d|d|d|dt        j                  |
xs g       d|d|d|d|d|d|rt        j                  |dt               ndd|}|j                  |       |j!                          |j#                          |S # |j#                          w xY w# t$        $ r }t&        j)                  d|       Y d}~yd}~ww xY w)u  LLM 호출 기록을 DB에 저장. 저장에 성공하면 log ID, **실패하면 None**.

    ★2026-08-24: 전에는 저장이 실패해도 미리 만든 log_id 를 그대로 돌려줬다.
    그 값이 호출자에서 `generation_call_id` 로 자산에 붙어(grok/gemini image
    client · record_provider_call) **존재하지 않는 DB 행을 가리키는 계보**가
    생겼다. 조인하면 아무것도 안 나오는데 링크는 있는 모양이다 —
    거짓 계보보다 빈 칸이 낫다(이 저장소의 fail-closed 관례).
    실패해도 메인 흐름은 중단하지 않는다(non-fatal 은 그대로).

    Args:
        metadata (Phase 4 iter 7 I1): free-form trace context — scene_index /
            shot_index / still_id / entity_id 등. column 추가 비용을 줄이기 위해
            JSON serialize 후 단일 TEXT column (`metadata_json`) 에 저장.
    i'  Nz...[truncated]r   )SessionLocal)
LLMCallLogidr   r   r   r   r   r	   r   r
   r   r   r   r   r   r   metadata_jsonF)ensure_asciidefault
created_atz#LLM call log failed (non-fatal): %s )struuiduuid4r   nowr   utc	isoformatlenapp.core.databaser   app.models.projectr   jsondumpsaddcommitclose	Exceptionloggerwarning)r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   log_idr"   MAX_PROMPT_CHARSr   r   dbrecordexcs                          P/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/llm/llm_logger.pylog_llm_callr6      s   > F
,,x||
$
.
.
0C]+.>>%&7'78;KK
;**!"3#347GGs;'*::!"3#347GG$21^	 % &  .	
 $ & , ( ( %)JJ/B/Hb$I ( * ,  ,$   JJxeSI%)%( )F, FF6NIIKHHJ M HHJ <cB 	s1   E" ,BE ;E" EE" "	F+FF)NNr   NNNNNNNNN)__doc__r(   loggingr    r   r   typingr   	getLogger__name__r.   r   intlistdictr6   r       r5   <module>r@      s6   S    ' 			8	$ $(!% $ $$(#/3"&#'#'#PPP P C=	P
 #P P P P SMP }P "$s),P 3-P C=P C=P tnP  c]!Pr?   