+
    yjR                        R t ^ RIHt ^ RIHt ^ RIHtHt ^ RIH	t	H
t
HtHt ^ RIHt ^ RIHt  ! R R]4      t ! R	 R
]4      t ! R R]4      tR R ltRR/R R lltR# )u  Prior-art benzerlik analizi — Claude Haiku 4.5 ile.

Her hit için:
- similarity_score (0-100): buluşun özüyle çakışma miktarı
- rationale: 2-3 cümlelik vekil-odaklı gerekçe (TR)
- risk_level: 'düşük' | 'orta' | 'yüksek'

Kullanım:
- Haiku çünkü görev "özet + başlık karşılaştırma" — basit, ucuz.
- Structured output (messages.parse) ile JSON şemasına zorlanır.
)annotations)APIError)	BaseModelField)get_anthropic_clientload_turkpatent_system_promptresolvesystem_block)record_usage)PriorArtHitc                      ] tR t^t$ RtR]R&   ]! R^ ^dR7      tR]R&   ]! RRR	7      tR]R
&   ]! R^RR7      t	R]R&   Rt
R# )AnalysisItemu%   Tek bir hit için analiz çıktısı.str	patent_no.)geleintsimilarity_scoreu   ^(düşük|orta|yüksek)$)pattern
risk_leveli  
min_length
max_length	rationale N)__name__
__module____qualname____firstlineno____doc____annotations__r   r   r   r   __static_attributes__r       a/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/services/prior_art/analyzer.pyr   r      sC    /N!#!4c4C)EFJF32$?Is?r"   r   c                  8    ] tR t^%t$ ]! R^ ^2R7      tR]R&   RtR# )AnalysisList.r   list[AnalysisItem]analysesr   N)r   r   r   r   r   r'   r    r!   r   r"   r#   r%   r%   %   s    #(r#JH Jr"   r%   c                      ] tR t^)tRtRtR# )AnalysisErroru5   Claude analizi başarısız (API veya şema hatası).r   N)r   r   r   r   r   r!   r   r"   r#   r)   r)   )   s    ?r"   r)   c               $    V ^8  d   QhRRRRRR/# )   invention_summaryr   hitslist[PriorArtHit]returnr   )formats   "r#   __annotate__r1   -   s&     - --
- 	-r"   c                   RRV P                  4       RRRRR.p\        V^R7       EF\  w  r4VP                  RV RVP                   24       VP                  RVP                   24       VP
                  '       d   VP                  R	VP
                   24       VP                  '       d   VP                  R
VP                   24       VP                  '       d   VP                  RVP                   24       VP                  '       d.   VP                  RRP                  VP                  4       24       VP                  '       d&   VP                  RVP                  R,           24       VP                  R4       EK_  	  VP                  R4       VP                  R4       VP                  R4       RP                  V4      # )u2   Her hit için rank yapılacak kullanıcı mesajı.u   ## Analiz edilecek buluş z---z ## Aday prior-art patent listesi)startz### z. z- **Kaynak:** u   - **Başlık:** u   - **Başvuru sahibi:** u   - **Başvuru tarihi:** z- **CPC:** z, u   - **Özet:** :NiX  Nu  Her patent için aşağıdaki JSON şemasına uygun analiz üret:
- `similarity_score`: 0-100 arası tam sayı
  - 0-30: konu yakın ama teknik çözüm farklı (düşük risk)
  - 31-60: benzer yaklaşım, önemli farklar var (orta risk)
  - 61-85: çok yakın çözüm, bağımsız istem daraltılmalı (yüksek risk)
  - 86-100: muhtemel tam çakışma, patentlenebilirlik tartışılmalı
- `risk_level`: 'düşük' / 'orta' / 'yüksek' (score'a göre)
- `rationale`: 2-3 cümlelik Türkçe gerekçe (vekile hitap eder; teknik farkları ve nerede çakışma/boşluk olduğunu belirtir)

Yalnızca listedeki patentleri analiz et. Uydurma veri ekleme. Sırayı koruyarak `analyses` array'i döndür.
)strip	enumerateappendr   sourcetitle	applicantfiling_datecpc_classesjoinabstract)r,   r-   linesihits   &&   r#   _build_analysis_promptrC   -   st    	$
!

*
	E D**tA3b01~cjj\23999LL+CII;78===LL23==/BC???LL23??2CDE???LL;tyy'A&BCD<<<LL=d);(<=>R + 
LL	LL	LL
	: 99Ur"   modelNc               (    V ^8  d   QhRRRRRRRR/# )	r+   r,   r   r-   r.   rD   z
str | Noner/   r&   r   )r0   s   "r#   r1   r1   ]   s0     & &&
& 	&
 &r"   c          	        "   V'       g   . # \        R4      pT;'       g    VP                  p\        4       p\        4       p\	        W4      p VP
                  P                  VVP                  \        W%4      RRRV/.\        R7      G Rj  xL
 p\        Y'P                  RR7       TP                  p	T	f   \        R	4      hT	P                   #  LB  \         d   p\        RTP                   24      ThRp?ii ; i5i)
u_   Hit listesini Claude Haiku ile analiz et.

Empty hits → empty list (API çağrısı yapmaz).
zprior_art.analyzeroleusercontent)rD   
max_tokenssystemmessagesoutput_formatNzAnthropic API: )rD   usageendpointu0   Claude yapılandırılmış çıktı üretemedi.)r   rD   r   r   rC   rL   parserJ   r	   r%   r   r)   messager
   rN   parsed_outputr'   )
r,   r-   rD   specclientsystem_promptuser_messageresponseexcparseds
   &&$       r#   analyze_prior_artrZ   ]   s      	 &'DTZZE!#F13M)*;BL	F..5vy,?@& / 
 
 uNN=PQ"*"8"8F~NOO??!
  Fockk];<#EFs@   C>,C>?C CC >C>C C;C66C;;C>)r   
__future__r   	anthropicr   pydanticr   r   app.services.llmr   r   r   r	   app.services.llm.usage_logr
   app.services.prior_art.modelsr   r   r%   RuntimeErrorr)   rC   rZ   r   r"   r#   <module>rb      sk   
 #  %  4 5@9 @K9 K@L @-`& 	& &r"   