
    tĀiY#                        d Z ddl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	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ  ej,                  e      Zg dZdZdZ G d dee	      Ze G d d             Zdej>                  fdZ dedefdZ!	 	 d dedede"de#e$ee%f   fdZ&dedefdZ'dedede(e%   defdZ)dedefdZ*y)!zj
Fact-checking module using Gemini Pro with strict verification.
Maximum 2 retry attempts before failing.
    N)	dataclassfield)Enum)Path)Optional)genai)types)get_settings)Topic)zgemini-3-pro-previewzgemini-3-flash-previewzgemini-2.5-pro      c                        e Zd ZdZdZdZdZdZy)FactVerdictverifiedminor_variation	incorrectunverifiableoutdatedN)__name__
__module____qualname__VERIFIEDMINOR_VARIATION	INCORRECTUNVERIFIABLEOUTDATED     6/var/www/html/content-pipeline/modules/fact_checker.pyr   r   "   s    H'OI!LHr   r   c                   `    e Zd ZU eed<   eed<    ee      Zee	   ed<   dZ
eed<   dZeed<   y	)
FactCheckResultpassedverdict)default_factoryissues summary        
confidenceN)r   r   r   bool__annotations__strr   listr%   dictr'   r)   floatr   r   r   r!   r!   *   s3    LLt4FDJ4GSJr   r!   returnc                  V    t               } t        j                  | j                        S )z+Initialize Gemini client for fact-checking.)api_key)r
   r   Clientgemini_api_key)settingss    r   get_gemini_clientr6   3   s    ~H<< 7 788r   article_contentc                 f   t        d      j                  | dd       }	 t               }t        j                  t        j
                               }d}d}t        D ]v  }t        t              D ]]  }	 t        j                  d| d|dz    d	t         d
       |j                  j                  ||t        j                  |g            } n s|v n |t        d|       t)        |j*                        }	t        j-                  d|	j.                   dt1        |	j2                         d|	j4                  dd
       |	S # t        $ r}|}dt        |      v sdt        |      v rX|t        dz
  k  rLt        j!                  d| dt"         d|dz    d	t         d
	       t%        j&                  t"               Y d}~Rt        j!                  d| d|        Y d}~ d}~ww xY w# t        $ r=}t        j7                  d|        t9        dddt        |       d      cY d}~S d}~ww xY w)z
    Perform strict fact-check on article using Gemini Pro with web search.

    Identifies factual claims and verifies each one.
    zfact_check.txtNi:  )r7   )google_searchzTrying model z
 (attempt    /))tools)modelcontentsconfig429RESOURCE_EXHAUSTEDzRate limited on z
, waiting zs (attempt zModel z	 failed: zAll models failed. Last error: zFact-check completed: z (z issues, confidence: z.0%zFact-check failed: FFAILzFact-check error: r(   r"   r#   r'   r)   )_load_promptformatr6   r	   ToolGoogleSearchTEXT_MODELSrangeMAX_RETRIESloggerdebugmodelsgenerate_contentGenerateContentConfig	Exceptionr,   warningRETRY_DELAYtimesleep_parse_fact_check_responsetextinfor#   lenr%   r)   errorr!   )
r7   promptclientgoogle_search_toolresponse
last_errorr>   attempteresults
             r   
fact_checkrc   9   sX    *+22'/ 3 F6
"$"ZZe6H6H6JK 
  	E - LL=z'A+aP[}\]!^_%}}==#!'$::#5"6   >  H . #5	8 =j\JKK+HMM:$V^^$4 5FMM"##89J9J38OqR	
 3 ! 	!"JA*>#a&*H"[1_4"NN-=eWJ{m[fgnqrgrfsst  vA  uB  BC  ,D  E JJ{3$NNVE7)A3#?@	6  
*1#./(Q1	
 	

s]   AG* 2AEG* A0G* 	G'A.G":G*  G"G* "G''G* *	H032H+%H0+H0topicmax_attemptsc                 "   | }g dd}t        |      D ]  }t        j                  d|dz    d|        t        |      }|d   j	                  |dz   |j
                  |j                  |j                  d       |j
                  dk(  rd|d	<   d
||fc S |j
                  dk(  r|j                  dk\  r|j                  D cg c]&  }|j                  dd      j                         dv r|( }	}t        |	      dk  r8d|d	<   t        j                  dt        |j                         d       d
||fc S |j
                  dk(  r.d|d	<   t        j                  d|j                          d||fc S |j
                  dk(  so|ss||dz
  k  r8t        j                  d       t        |||j                        }
	  |||
      }d|d	<   d||fc S  d|d	<   d||fS c c}w # t        $ r#}t        j                  d|        Y d}~d}~ww xY w)aX  
    Fact-check with retry logic.

    Args:
        article_content: The article markdown to check
        topic: The topic for regeneration context
        max_attempts: Maximum fact-check attempts (default 2)
        regenerate_func: Function to regenerate article if needed

    Returns:
        (passed, final_content, fact_check_log)
    N)attemptsfinal_verdictzFact-check attempt r:   r;   rg   )r`   r#   r%   r)   PASSrh   TNEEDS_REVISIONg      ?categoryr&   )r   r      PASS_WITH_WARNINGSz!Fact-check passed with warnings: z minor issuesrC   zFact-check FAIL: Fz8Attempting article revision based on fact-check feedbackzRevision failed: MAX_ATTEMPTS_REACHED)rJ   rL   rX   rc   appendr#   r%   r)   getupperrY   rZ   r'   _build_revision_promptrQ   )r7   rd   re   regenerate_funccurrent_contentlogr`   rb   icritical_issuesrevision_promptra   s               r   fact_check_with_retryry   |   s:   $ &OD
1C& 23)'A+a~FGO,J"Q;!>> --$//		
 >>V##)C #-- >>--&2C2Ct2K "==55R(..04MM O  ?#q(';O$?FMM@R?SS`ab_c11>>V##)C LL,V^^,<=>/3..>>--/))VW"8?FMM#&5e_&MO (8O$os22e23h 2C/3&&C0 ! LL#4QC!89s   +G;	G""	H+H		Hfilenamec                     t        t              j                  j                  dz  | z  }|j                         st	        d|       |j                         S )z,Load prompt template from prompts directory.promptszPrompt file not found: )r   __file__parentexistsFileNotFoundError	read_text)rz   prompt_paths     r   rE   rE      sO    x.''..:XEK"9+ GHH  ""r   contentr%   c                     dj                  |D cg c]*  }d|j                  dd       d|j                  dd       , c}      }d| d	| d
S c c}w )z3Build a revision prompt based on fact-check issues.
z- claimzUnknown claimz: issuezNeeds verificationug   Überarbeite den folgenden Artikel und korrigiere die identifizierten Probleme.

# PROBLEME ZU BEHEBEN
z

# ORIGINAL-ARTIKEL
u  

# ANWEISUNGEN
1. Korrigiere ALLE genannten Probleme mit aktuellen, verifizierbaren Fakten
2. Behalte die Struktur und den Stil bei
3. Stelle sicher, dass alle Zahlen und Behauptungen korrekt sind
4. Füge Quellenangaben hinzu wo möglich

Liefere den korrigierten Artikel:
)joinrp   )rd   r   r%   r   issues_texts        r   rr   rr      sz    ))  	
 7O45R		'K_8`7ab	
K   		 	
 	
s   /Aresponse_textc           	         	 | j                         }d|v r'|j                  d      d   j                  d      d   }n-d|v r'|j                  d      d   j                  d      d   }n|}t        j                  |      }|j	                  dd      j                         }|dvrd}|j	                  d	g       }t        |j	                  d
d            }|dk(  }t        ||||j	                  dd      |      S # t        j                  t        t        f$ r=}t        j                  d|        t        dddt        |       d      cY d}~S d}~ww xY w)z6Parse Gemini fact-check response into FactCheckResult.z```jsonr:   z```r   r#   rC   )ri   rj   rC   rj   r%   r)   g      ?ri   r'   r&   )r"   r#   r%   r'   r)   z%Failed to parse fact-check response: FzParse error: r(   rD   N)stripsplitjsonloadsrp   rq   r/   r!   JSONDecodeErrorKeyError
ValueErrorrL   rR   r,   )	r   rW   	json_textdatar#   r%   r)   r"   ra   s	            r   rV   rV      sU   '
""$ 

9-a066u=a@Id]

5)!,2259!<IIzz)$((9f-335<<&G(B'488L#67
 F"HHY+!
 	
   (J7 
>qcBC$#CF8,	
 	

s   C4C7 7E2EEE)rl   N)+__doc__r   loggingrerT   dataclassesr   r   enumr   pathlibr   typingr   googler   google.genair	   config.settingsr
   database.modelsr   	getLoggerr   rL   rI   rK   rS   r,   r   r!   r3   r6   rc   inttupler*   r.   ry   rE   r-   rr   rV   r   r   r   <module>r      s0  
   	  (      ( !			8	$ #t    95<< 9@
 @
 @
L 	J'J'J' J'
 4d?J'Z#3 #3 #% # tDz c 6)
c )
o )
r   