
    r{i[                       d Z ddlmZ ddlZddl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  ej                  e      Z ej$                  d      Zdd	Z G d
 de      ZdZddZ G d de      Z G d de      ZdZ	 	 	 	 ddZy)u  Hızlı 2-yönlü çeviri yardımcıları — TR ↔ EN, prior-art akışı için.

Tasarım:
- Dil tespiti heuristik (TR karakterler) — LLM çağırmadan ucuz/hızlı
- Çeviri Claude Haiku 4.5; structured output zorla, kısa kalıp
- Hit çevirisi BATCH — tek istek, paralel hit'ler. 10x ucuz.

Hatalar yutulmaz değil ama None döner — çağıran kodun fallback davranışı
prior-art aramasını engellemeden devam etmek (orijinal dilde göster).
    )annotationsN)APIError)	BaseModelField)LLMNotConfiguredErrorget_anthropic_client)record_usageu   [ıİşŞğĞçÇüÜöÖ]c                6    | syt         j                  |       ryy)u   Çok kaba dil tespiti: 'tr' veya 'en'.

    - Türkçe karakter varsa → 'tr'
    - Aksi halde → 'en' (varsayılan; Almanca/Fransızca gibi diller de
      EN'e fall back; pratikte vekiller TR veya EN yazar)
    entr)	_TR_CHARSsearch)texts    7/var/www/ai.patentyazar.com/app/services/translation.pydetect_languager      s         c                  0    e Zd ZU dZ edd      Zded<   y)_QueryTranslationu.   Bir patent arama sorgusunun TR↔EN çevirisi..u]   Hedef dile çevrilmiş sorgu — kısa, anahtar kelime ağırlıklı, patent terminolojisindedescriptionstr
translatedN)__name__
__module____qualname____doc__r   r   __annotations__ r   r   r   r   0   s    8"J r   r   u   Sen bir patent arama sorgusunu Türkçe ↔ İngilizce arasında çeviren bir
asistansın. Çeviride:

1. Patent terminolojisini koru (örn. "buluş" → "invention", "tertibat" →
   "apparatus", "yöntem" → "method").
2. Anlam değiştirme; kelime kelime değil ama anlam birebir.
3. Kısa tut — orijinalin uzunluğu kadar veya biraz daha az.
4. Marka/kısaltmaları olduğu gibi bırak (TLS, AI, IoT vs).
5. Hedef dilde yaygın patent araması terimlerini kullan.
6. Sadece çevrilmiş sorguyu döndür.
c                *  K   | j                         sy	 t               }|dk(  rdnd}d| d|  d}	 |j                  j	                  dd	d
t
        ddidgd|dgt               d{   }t        d|j                  d       |j                  }|r|j                  j                         S dS # t        $ r Y yw xY w7 U# t        $ r }t        j                  d|       Y d}~yd}~wt        $ r }t        j                  d|       Y d}~yd}~ww xY ww)u   Bir patent arama sorgusunu hedef dile çevir.

    target_lang: 'tr' veya 'en'

    Returns:
        Çevrilmiş metin veya None (LLM yapılandırılmamışsa / hata)
    Nr   u   İngilizceyeu
   Türkçeyeu$   Aşağıdaki patent arama sorgusunu u    çevir:

```
z
```claude-haiku-4-5   r   type	ephemeralr"   r   cache_controluserrolecontentmodel
max_tokenssystemmessagesoutput_formatztranslation.queryr+   usageendpointzQuery translation failed: %sz&Query translation unexpected error: %s)stripr   r   r.   parse_QUERY_SYSTEMr   r	   r1   parsed_outputr   r   loggerwarning	Exception)r   target_langclient	directionuser_msgrespparsedexcs           r   translate_queryrA   H   s8     ::<%' #."5<I
.yk :vU	 __**$ #)&,k%:  &(;<+ + 
 
 	$**(	

 ,0+=+=,2v  &&(<<9 ! 
(  5s; ?Es   D
B/ D6C  (B>)AC  ,D-C  .D/	B;8D:B;;D>C   	D	C$D$D0DDDDc                  h    e Zd ZU dZ edd      Zded<    ed      Zd	ed
<    ed      Zd	ed<   y)_TranslatedHitu    Bir hit'in çevirilen alanları..u+   0-based sıra; hangi hit olduğunu belirlerr   intindex )defaultr   titleabstractN)	r   r   r   r   r   rE   r   rH   rI   r   r   r   rC   rC   ~   s5    *s(UVE3Vr"E3""%Hc%r   rC   c                  .    e Zd ZU dZ ee      Zded<   y)_BatchHitTranslationu$   Birden fazla hit'in toplu çevirisi.)default_factoryzlist[_TranslatedHit]itemsN)r   r   r   r   r   listrM   r   r   r   r   rK   rK      s    ."'"=E=r   rK   uO  Sen patent başlıkları ve özetlerini Türkçeye çeviren bir asistansın.

Kurallar:
1. Patent terminolojisini Türkçe karşılığıyla koru ("apparatus" → "tertibat",
   "method" → "yöntem", "system" → "sistem", "device" → "cihaz" vs).
2. Marka/kısaltmaları olduğu gibi bırak (örn. TLS, IoT, RFID).
3. Anlam birebir; gereksiz Türkçeleştirme yapma.
4. Resmi, teknik, vekil dilinde — günlük dil değil.
5. Boş/None gelirse boş string döndür.
6. Index numarasını koru; hit sırasını karıştırma.

Çıktı: structured JSON, açıklama veya markdown EKLEME.
c           	       K   | sg S 	 t               }g }t        |       D ]`  \  }\  }}|xs dj                         }|xs dj                         }t	        |      dkD  r|dd dz   }|j                  d| d| d|        b dd	j                  |      z   }	 |j                  j                  d
ddt        ddidgd|dgt               d{   }	t        d
|	j                  d       |	j                  }
|
sy|
j                  D ci c]-  }|j                  |j                   xs d|j"                  xs df/ }}t%        t	        |             D cg c]  }|j'                  |d       c}S # t        $ r Y yw xY w7 c c}w c c}w # t(        $ r }t*        j-                  d|       Y d}~yd}~wt.        $ r }t*        j-                  d|       Y d}~yd}~ww xY ww)u#  Birden fazla (title, abstract) çiftini Türkçeye çevir.

    Args:
        items: [(title, abstract), ...] — None'lar boş string olarak çevrilir

    Returns:
        Aynı uzunlukta liste, [(tr_title, tr_abstract), ...]
        None döner: LLM yapılandırılmamış veya hata.
    NrF   iX  u   …z### Hit z
**Title:** z
**Abstract:** ud   Aşağıdaki patent hit'lerini Türkçeye çevir. Her hit için index, title ve abstract döndür.

z

r    i  r   r"   r#   r$   r&   r'   r*   ztranslation.hitsr0   )NNzHit translation failed: %sz$Hit translation unexpected error: %s)r   r   	enumerater3   lenappendjoinr.   r4   _HIT_SYSTEMrK   r	   r1   r6   rM   rE   rH   rI   rangegetr   r7   r8   r9   )rM   r;   numberedirH   rI   tar=   r>   r?   xby_indexr@   s                 r   translate_hits_to_trr]      s     	%'
 H )% 0 KE8[b!^""$ q6C<$3%A(1#]1#5EaSIJK	*,2KK,A	B 
__**$ #'&,k%:  &(;<. + 
 
 	$**'	

 /3.@.@LRLLYqAGGaggoqzz/ATBBYY7<SZ7HI!Q-IIW ! &
, ZI 3S9 =sCs   G
E- BG6F E<*F 8G9F 2E>9F F*F ,G-	E96G8E99G<F >
F 	GF,'G,G8GGGG)r   r   returnr   )r   r   r:   r   r^   z
str | None)rM   z#list[tuple[str | None, str | None]]r^   z*list[tuple[str | None, str | None]] | None)r   
__future__r   loggingre	anthropicr   pydanticr   r   app.services.llmr   r   app.services.llm.usage_logr	   	getLoggerr   r7   compiler   r   r   r5   rA   rC   rK   rT   r]   r   r   r   <module>rh      s   	 #  	  % H 3			8	$ BJJ45	&	 .l&Y &>9 > A.A/Ar   