+
    oi9*                    2   R t ^ RIHt ^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIHtHtHtHtHtHtHtHtHtHt ^ RIHtHtHt ]! R	R
.R7      t ! R R]4      t ! R R]4      t ! R R]4      tR R lt ]PC                  R]R7      R R l4       t"R# )u  Prior-art search + benzerlik analizi tek endpoint'te.

POST /api/v1/prior-art/search:
- Input: query (doğal dil) + invention_summary + kaynak seçimi
- Çoklu dil: TR sorgu varsa EN'e çevir, hem TR hem EN ile paralel ara
- EPO ve/veya Google Patents paralel arama
- Birleştir, dedup (patent_no bazlı), limit'le
- Claude Haiku 4.5 ile her hit için similarity_score + rationale
- Hit'lerin title+abstract'i Türkçeye çevrilir (orijinal de korunur)
- similarity_score'a göre DESC rank'lenmiş sonuç
)annotationsN)	APIRouter)	BaseModelField)get_settings)LLMNotConfiguredError)
AnalysisErrorAnalysisItemEspacenetAuthErrorEspacenetClientEspacenetErrorEspacenetNotConfiguredGooglePatentsClientGooglePatentsErrorPriorArtHitanalyze_prior_art)detect_languagetranslate_hits_to_trtranslate_queryz
/prior-artz	prior-art)prefixtagsc                      ] tR t^+t$ ]! R^RR7      tR]R&   ]! R^RRR7      tR]R	&   ]! R
R7      tR]R&   ]! R
R7      t	R]R&   ]! ^
^^R7      t
R]R&   RtR# )PriorArtSearchRequest.i  )
min_length
max_lengthstrqueryi  u,   Buluşun kısa özeti — AI skorlama için.)r   r   descriptioninvention_summaryT)defaultboolinclude_epoinclude_google)r   geleintlimit_per_source N)__name__
__module____qualname____firstlineno__r   r   __annotations__r   r!   r"   r&   __static_attributes__r'       S/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/api/prior_art.pyr   r   +   sg    sqS9E39"B	s  d+K+ .ND.!"r:c:r.   r   c                     ] tR t^8t$ RtR]R&   R]R&   RtR]R&   RtR]R&   RtR]R	&   Rt	R
]R&   Rt
R]R&   RtR]R&   RtR
]R&   RtR]R&   RtR]R&   RtR]R&   ]! RRR7      tR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )PriorArtSearchHitu.   Hit + analiz birleşimi (frontend'e tek obje).r   source	patent_noN
str | Nonetitleabstract	applicantzlist[str] | None	inventorsfiling_datepublication_datecpc_classesurltitle_trabstract_tru5   Orijinal hit'in tahmin edilen dili — 'en', 'tr' vs.r   r   original_langz
int | Nonesimilarity_score
risk_level	rationaler'   )r(   r)   r*   r+   __doc__r,   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r   r@   rA   rB   rC   r-   r'   r.   r/   r1   r1   8   s    8 KNE:Hj Iz "&I&"K"#'j'$(K!(C  Hj"K" %K!M: 
 $(j'!J
! Iz r.   r1   c                      ] tR t^Tt$ R]R&   ]! RRR7      tR]R&   R]R	&   R
]R&   R]R&   ]! RRR7      tR]R&   R]R&   RtR# )PriorArtSearchResponser   r   NuV   Orijinal sorgu TR ise EN çevirisi (paralel arama yapıldı). Sorgu zaten EN ise None.r?   r4   query_translatedzdict[str, int]source_countsr%   
total_hitsr    analyzedFu/   Hit'lerin Türkçe çevirisi yapıldıysa True.translated_to_trzlist[PriorArtSearchHit]hitsr'   )	r(   r)   r*   r+   r,   r   rG   rK   r-   r'   r.   r/   rF   rF   T   sS    J#('$j  "!ON"Ed  "!r.   rF   c                    V ^8  d   QhRRRR/# )   	hit_listslist[PriorArtHit]returnr'   )formats   "r/   __annotate__rS   g   s      !r.   c                    / pV  Fb  pV FY  pVP                   P                  4       pWA9  d   W1V&   K)  W,          P                  R8X  g   KB  VP                  R8X  g   KU  W1V&   K[  	  Kd  	  \        VP	                  4       4      # )u   Birden fazla kaynağın hit'lerini patent_no bazlı dedup eder.

Aynı patent hem EPO hem Google'dan gelirse EPO kaydı tutulur (daha güvenilir).
googleepo)r3   upperr2   listvalues)rO   seenrL   hitkeys   *    r/   _merge_and_dedupr]   g   sp     $&DC--%%'CS	!!X-#**2ES	   r.   z/search)response_modelc                    V ^8  d   QhRRRR/# )rN   requestr   rQ   rF   r'   )rR   s   "r/   rS   rS   {   s      c c$9 c>T cr.   c           
       a a,"   \        4       o,\        S P                  4      pRpS P                  .pVR8X  dh   \        S P                  RR7      G Rj  xL
 pV'       dA   VP	                  4       S P                  P	                  4       8w  d   TpVP                  V4       . p. p/ p. p. p	\        S,P                  ;'       d    S,P                  4      p
S P                  '       d]   V
'       dU   V FM  pV3R V V,3R lllpVP                  \        P                  ! V! 4       4      4       V	P                  RV34       KO  	  MS P                  '       d   V
'       g   ^ VR&   S P                  '       dS   V FL  pV3R	 V 3R
 lllpVP                  \        P                  ! V! 4       4      4       V	P                  RV34       KN  	  V'       d   \        P                  ! VRR/ G Rj  xL
 p\        WRR7       F  w  w  ppp\        V\         4      '       d.   VR8X  d   VP#                  V4       K9  VP#                  V4       KL  VR8X  dA   \        V\$        \&        ,          \(        ,          4      '       d   VP+                  R^ 4       K  VR8X  g   K  \        V\,        4      '       g   K  VP+                  R^ 4       K  	  \/        V4      VR&   \/        V4      VR&   \1        WV4      p/ pRpV'       dP   S,P2                  '       d>    \5        S P6                  V4      G Rj  xL
 pV Uu/ uF  pVP8                  VbK  	  ppRp/ pRpVR8X  Ed   V'       Ed   S,P2                  '       d   . p\?        V4       F}  w  pp\        VP@                  ;'       g    R4      p\        VPB                  ;'       g    R4      pVR8X  g
   VR8X  g   KT  VP                  VVP@                  VPB                  334       K  	  V'       dg   V UUu. uF  w  ppVNK
  	  pppV UU u. uF  w  pp V NK
  	  p!pp \E        V!4      G Rj  xL
 p"V"'       d    \        VV"RR7       F  w  p#p$V$VV#&   K  	  Rp. p%\?        V4       EFd  w  ppVPG                  VP8                  4      p&VPG                  VR&4      w  p'p(VP@                  ;'       g    Rp)VPB                  ;'       g    Rp*\        V)R,           V*,           4      p+T%P                  \I        R'/ RVPJ                  bRVP8                  bRVP@                  bRVPB                  bRVPL                  bRVPN                  bRVPP                  bRVPR                  bRVPT                  bRVPV                  bRV'bRV(bRV+bR V&'       d   V&PX                  MRbR!V&'       d   V&PZ                  MRbR"V&'       d   V&P\                  MRb 4       EKg  	  V%P_                  R# R$7       \a        S P                  VV\/        V%4      VVV%R%7      #  EL EL2 ELu upi   \:        \<        3 d    Rp ELi ; iu uppi u up pi  EL5i)(u  Prior-art arama + AI similarity skorlama + çoklu dil desteği.

Akış:
1. Sorgunun dili tespit edilir (TR/EN heuristik)
2. TR ise EN'e çevrilir (Claude Haiku); sorgu artık iki dilde
3. EPO + Google Patents'e iki sorgu paralel gider (TR ve EN)
4. Sonuçlar birleştirilir, dedup'lanır
5. Hit title+abstract EN ise toplu olarak TR'ye çevrilir
6. AI benzerlik analizi (orijinal EN üzerinden, daha doğru)
Ntren)target_langc                   V ^8  d   QhRR/# rN   rQ   rP   r'   )rR   s   "r/   rS   &prior_art_search.<locals>.__annotate__   s     ) )'8 )r.   c                  <"   \        SP                  SP                  4      p VP                  V SP                  R 7      G Rj  xL
 VP                  4       G Rj  xL
  #  L L  TP                  4       G Rj  xL 
  i ; i5i)limitN)r   epo_ops_keyepo_ops_secretsearchr&   close)r   clientr`   settingss   & r/   _epoprior_art_search.<locals>._epo   sf     ((((*A*A)!'uG<T<T!UU ,,.(( V(&,,.((sL   !B A& A"A& 	BA$B"A& $B&B:A=;BBrV   	epo_errorc                   V ^8  d   QhRR/# rf   r'   )rR   s   "r/   rS   rg      s     ) )*; )r.   c                   <"   \        4       p VP                  V SP                  R 7      G Rj  xL
 VP                  4       G Rj  xL
  #  L L  TP                  4       G Rj  xL 
  i ; i5iri   )r   rm   r&   rn   )r   ro   r`   s   & r/   _google!prior_art_search.<locals>._google   sS     ,.)!'uG<T<T!UU ,,.(( V(&,,.((sI   A. A AA A.AA.A A.A+$A'%A++A.rU   return_exceptionsT)strictgoogle_errorF  r2   r3   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r@   rA   rB   rC   c                L    V P                   R J V P                   ;'       g    ^ ) 3# )N)rA   )hs   &r/   <lambda>"prior_art_search.<locals>.<lambda>  s&    !3!3t!;q?Q?Q?V?VUV=W Xr.   )r\   )r   rG   rH   rI   rJ   rK   rL   )NNr'   )1r   r   r   r   lowerappendr    rk   rl   r!   asynciocreate_taskr"   gatherzip
isinstancerX   extendr   r
   r   
setdefaultr   lenr]   anthropic_api_keyr   r   r3   r   r   	enumerater5   r6   r   getr1   r2   r7   r8   r9   r:   r;   r<   rA   rB   rC   sortrF   )-r`   
query_langrG   queries_to_search
translatedepo_hitsgoogle_hitsrH   tasks	task_metaepo_configuredqrq   rv   resultsr2   _qresmergedanalyses_by_patentrJ   analysesatranslations_by_idxrK   items_to_translateir[   
title_langabstract_lang_indicesitempayloadtranslationsorig_idxtcombinedanalysisr=   r>   
title_textabstract_textr@   rp   s-   f                                           @r/   prior_art_searchr   z   s     ~H !/J#'$+MM?T*7==dKK
***,0C0C0EE)$$Z0 #%H%'K$&M "E')I (..JJ83J3JKN~"A!" ) ) LL,,TV45eQZ( # 
			^%&k" "A$% ) ) LL,,WY78h]+ # FFF!$Y!ELVR##t$$U?OOC(&&s+5Z+.@@>Q& & ((a88#
38J(K(K((; "F x=M%!+.M( h4F 35H(,,,	.w/H/H&QQH:B!C(Q!++q.(!CH EGTff)C)C)CNP'FAs(b9J+CLL,>,>B?MT!]d%:"))1syy#,,.G*HI	 (
 %78%7TQq%7G8+=>+=4t+=G>!5g!>>L#&wT#JKHa45'1 $K#'  )+HF#3%))#--8 3 7 7< H+YY__"
**'
S(8=(HI zz-- ii 	
 -- --  OO "%!5!5  OO GG " ( , ?G!:!:D 3;8..  19(,,d!	
 $: MMXMY!mm)#x=) Q L` G4 R!C%}5 	H	$ 9>>s  AYXY!A!Y"Y&Y.A%YYY3AYY&X'B(YY,AYX# !X"X# *X X# YY+*YY5Y4YYX=YY*Y;Y	<YBYCY-YAYYX# X# #X:6Y9X::Y)#rD   
__future__r   r   fastapir   pydanticr   r   
app.configr   app.services.llmr   app.services.prior_artr   r	   r
   r   r   r   r   r   r   r   app.services.translationr   r   r   routerr   r1   rF   r]   postr   r'   r.   r/   <module>r      s   
 #   % # 2    
,k]	;
;I 
;!	 !8"Y "&& Y'=>c ?cr.   