
    0i                        d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZ  G d de      Z G d	 d
e      Z G d de      Z	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 ddZy)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)PriorArtHitc                  z    e Zd ZU dZded<    eddd      Zded	<    edd
      Zded<    eddd      Zded<   y)AnalysisItemu%   Tek bir hit için analiz çıktısı.str	patent_no.r   d   )geleintsimilarity_scoreu   ^(düşük|orta|yüksek)$)pattern
risk_level   i  
min_length
max_length	rationaleN)	__name__
__module____qualname____doc____annotations__r   r   r   r        >/var/www/ai.patentyazar.com/app/services/prior_art/analyzer.pyr   r      sC    /N!#!4c4C)EFJF32$?Is?r    r   c                  .    e Zd ZU  eddd      Zded<   y)AnalysisList.r   2   r   list[AnalysisItem]analysesN)r   r   r   r   r&   r   r   r    r!   r#   r#      s    #(r#JH Jr    r#   c                      e Zd ZdZy)AnalysisErroru5   Claude analizi başarısız (API veya şema hatası).N)r   r   r   r   r   r    r!   r(   r(   #   s    ?r    r(   c                P   dd| j                         dddddg}t        |d      D ]:  \  }}|j                  d| d|j                          |j                  d	|j                          |j
                  r|j                  d
|j
                          |j                  r|j                  d|j                          |j                  r|j                  d|j                          |j                  r-|j                  ddj                  |j                                |j                  r!|j                  d|j                  dd         |j                  d       = |j                  d       |j                  d       |j                  d       dj                  |      S )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  u  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)invention_summaryhitslinesihits        r!   _build_analysis_promptr=   '   sp    	$
!

*
	E D* 3tA3b01~cjj\2399LL+CII;78==LL23==/BC??LL23??2CDE??LL;tyy'A&BCD<<LL=ds);(<=>R 
LL	LL	LL
	: 99Ur    zclaude-haiku-4-5)modelc               d  K   |sg S t               }t               }t        | |      }	 |j                  j	                  |dd|ddidgd|dgt
               d	{   }|j                  }|t        d      |j                  S 7 )# t        $ r}t        d
|j                         |d	}~ww xY ww)ug   Hit listesini Claude Haiku ile analiz et.

    Empty hits → empty list (API çağrısı yapmaz).
    i  texttype	ephemeral)rA   r@   cache_controluser)rolecontent)r>   
max_tokenssystemmessagesoutput_formatNzAnthropic API: u0   Claude yapılandırılmış çıktı üretemedi.)r   r   r=   rI   parser#   r   r(   messageparsed_outputr&   )	r8   r9   r>   clientsystem_promptuser_messageresponseexcparseds	            r!   analyze_prior_artrT   W   s      	!#F13M)*;TBLF.. #)&,k%:  &,?@& / 
 
  #+"8"8F~NOO??)
  Fockk];<#EFs:   %B02B BB %B0B 	B-B((B--B0N)r8   r   r9   list[PriorArtHit]returnr   )r8   r   r9   rU   r>   r   rV   r%   )r   
__future__r   	anthropicr   pydanticr   r   app.services.llmr   r   app.services.prior_art.modelsr	   r   r#   RuntimeErrorr(   r=   rT   r   r    r!   <module>r]      s   
 #  % P 5@9 @K9 K@L @--
- 	-h $	&&
& 	&
 &r    