
    {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	m
Z
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mZ dd
lmZ  eddg      Z ej4                  dej6                  ej8                  z        Z G d de      Z G d de      Z G d de      Z  G d de      Z!d dZ"dZ#ejI                  d      d!d       Z%dZ&dZ'ejI                  d       e	d      fd"d       Z(y)#u  Tarifname/istemler metinlerinden bahsedilen şekilleri çıkarma.

Akış:
  1. Regex ile "Şekil N" + "(NNN)" referansları yakala (unique liste)
  2. Tespit edilen her şekil için Claude Haiku'ya bağlamı gönder, şu yanıtları iste:
     - title: kısa başlık ("Sistem mimarisi")
     - description: 1-2 cümle açıklama
     - mermaid_suggestion: başlangıç noktası Mermaid kaynağı (boş olabilir)

Tek LLM çağrısı, structured output, ~$0.005/patent.
    )annotationsN)APIError)	APIRouterFileHTTPException
UploadFile)Response)ImageImageOps)	BaseModelField)LLMNotConfiguredErrorget_anthropic_client)record_usagez/figuresfigures)prefixtagsu  
    \b
    (?: Ş[eE][kK][iİ][lL] | ŞEKİL | FIG\.? | Figure )   # "Şekil" / "FIG" varyasyonları
    \s*
    (\d{1,2})                                           # numara 1-99
    (?: [-–][A-Za-z] )?                                 # opsiyonel "-A", "-B"
    \b
    c                  l    e Zd ZU  eddd      Zded<    eddd      Zded	<    ed
d      Zded<   y
)ExtractFiguresRequest i u   Tarifname taslağı (markdown))default
max_lengthdescriptionstrr   iP  u%   İstemler tam metin (numaralı liste)claimsN   r   r   
str | Nonetitle)__name__
__module____qualname__r   r   __annotations__r   r        8/var/www/ai.patentyazar.com/app/api/figure_extraction.pyr   r   .   sK    4K 
 ;FC 
 ds;E:;r%   r   c                      e Zd ZU  eddd      Zded<    eddd	      Zd
ed<    eddd	      Zd
ed<    edd      Zd
ed<   y)FigureSuggestion.   c   )geleintnumber   d   
min_lengthr   r   r   
     r   r     r   mermaid_suggestionN)	r    r!   r"   r   r.   r#   r   r   r6   r$   r%   r&   r(   r(   <   sM    b)FC)sqS9E39SRC@K@#B4@@r%   r(   c                  .    e Zd ZU  eddd      Zded<   y)FiguresSuggestionSet.r      r1   list[FigureSuggestion]r   N)r    r!   r"   r   r   r#   r$   r%   r&   r8   r8   C   s    &+CA"&MG#Mr%   r8   c                  L    e Zd ZU ded<   ded<    ed      Zded<   d	Zd
ed<   y	)ExtractFiguresResponser:   r   	list[int]detected_numbersz&'ai' veya 'regex-only' veya 'fallback')r   r   sourceNr   model)r    r!   r"   r#   r   r?   r@   r$   r%   r&   r<   r<   G   s(    ##$LMFCME:r%   r<   c                    t               }| D ]Y  }|st        j                  |      D ]<  }	 t        |j	                  d            }d|cxk  rdk  rn n|j                  |       > [ t        |      S # t        t        f$ r Y ]w xY w)uB   Tüm metinlerden benzersiz şekil numaralarını sıralı çıkar.r)   r*   )	set_FIG_PATTERNfinditerr-   groupadd
ValueError
IndexErrorsorted)textsseentextmns        r&   _extract_figure_numbersrO   N   s    UD 	&&t, 	A
O<R<HHQK			 $< 
+ s   9A44BBu  Sen bir patent vekili asistanısın. Görevin: bir Türk patent başvurusunun tarifname ve istem metinlerinden, bahsedilen her şekil için kısa bir başlık, 1-2 cümle açıklama ve Mermaid diyagram önerisi üretmek.

KURAL­LAR:
1. Tarifnamede hangi numaralı şekiller bahsediliyorsa yalnızca onları ver. Uydurma.
2. Her şekil için:
   - title: 3-8 kelimelik Türkçe başlık (örn. "Sistem mimarisi", "İşlem akışı")
   - description: şeklin NE GÖSTERDİĞİNİ 1-2 cümleyle anlatan Türkçe özet
   - mermaid_suggestion: başlangıç noktası Mermaid kaynağı (flowchart TD, sequenceDiagram, classDiagram, vb.) — boş da bırakabilirsin, ama olabilirse koy (4-10 node yeter)
3. Mermaid blok'u içinde emoji, renk, stil YOK. Default mermaid siyah-beyaz render edilecek.
4. Referans numaraları (Şekil 1'deki (210) gibi) Mermaid'de "Kapı (210)" formatında parentheses ile verilir.

Çıktı: yalnızca structured JSON.
z/extractc                P  K   t        | j                  | j                        }|st        g g d      S 	 t	               }dj                  d	 |D              }d
| d| j                  r| j                  dd nd d| j                  r| j                  dd nd d| d	}	 |j                  j                  dddt        ddidgd|dgt        ddi       d{   }t        d|j                  d       |j                  }t        |      }|j                   D 	cg c]  }	|	j"                  |v s|	 }
}	|
D 	ch c]  }	|	j"                   }}	|D ](  }||vs|
j%                  t        |d| dd             * |
j'                  d  !       t        |
|d"d#      S # t
        $ r5 t        |D cg c]  }t        |d| dd       nc c}w c}|d      cY S w xY w7 c c}	w c c}	w # t(        $ r}t+        d$d%| &      |d}~wt,        $ r}t+        d'd(| &      |d}~ww xY ww))u3   Metinlerden bahsedilen şekillerin listesini üret.z
regex-only)r   r>   r?      Şekil u#   Açıklama AI olmadan üretilemedi.r   )r.   r   r   r6   fallbackz, c              3  &   K   | ]	  }d |   yw)rQ   Nr$   ).0rN   s     r&   	<genexpr>z"extract_figures.<locals>.<genexpr>   s     9171#9s   u"   Tespit edilen şekil numaraları: z

## Tarifname metni
Ni@  u   (boş)u   

## İstemler
i N  uL   

Yukarıdaki metinlerde yalnızca şu numaralı şekiller bahsedilmiştir: u?   .
Her biri için title, description, mermaid_suggestion üret.
zclaude-haiku-4-5r5   rL   type	ephemeral)rV   rL   cache_controluser)rolecontentdisabled)r@   
max_tokenssystemmessagesoutput_formatthinkingfigure_extraction)r@   usageendpointu:   Bu şekil tarifnamede bahsedilmiş ama AI detay üretmedi.c                    | j                   S )N)r.   )fs    r&   <lambda>z!extract_figures.<locals>.<lambda>   s
    AHH r%   )keyai)r   r>   r?   r@   i  zAnthropic API error: status_codedetailr4   zFigure extraction failed: )rO   r   r   r<   r   r   r(   joinr_   parseSYSTEM_PROMPTr8   r   rc   parsed_outputrB   r   r.   appendsortr   r   	Exception)reqdetectedclientrN   nums_strctxrespparseddetected_setrf   filteredpresent_numberses                r&   extract_figuresr   u   s     's

CH%
 	

%'$ yy999H0
 ;  OO% : ; zzFUx 0 1KKS* U
C/]__**$ #)&,k%:  &#67.j) + 
 
 	$**(	

 (,'9'98}%~~J!\1IAJJ-5618866 		A'$  'sm$`+-			 	,-%%$	
 	
I ! 
% "  !#A3- E')	  &
 	

>
, K6&  X6KA34OPVWW ]6PQRPS4TU[\\]s   1H&
F AH&9G' GAG' G+G/G' 5G"G' AG' H&G+G
GH&GH&G' 
G' '	H#0HH#HH##H&i     z/convert-bw.c                :  K   | j                   r| j                   j                  d      st        dd      | j                          d{   }t	        |      dkD  rt        dd      	 t        j                  t        j                  |            }t        j                  |      }|j                  d
v rHt        j                  d|j                  d      }|j                  ||j!                         d          |}n |j                  dk7  r|j#                  d      }|j#                  d      }|j                  \  }}t%        ||      t&        kD  rMt&        t%        ||      z  }|j)                  t+        ||z        t+        ||z        ft
        j,                        }|j/                  d d      }	t        j                         }
|	j1                  |
dd       |
j3                         }t5        |d      S 7 # t        $ r}t        dd	|       |d}~ww xY ww)u  Yüklenen PNG/JPG'yi TürkPatent uyumlu siyah-beyaza çevir ve PNG olarak dön.

    İşlem:
      1. Görseli yükle, EXIF rotasyonunu normalize et
      2. Grayscale'a çevir
      3. Threshold ile pure B/W (1-bit değil — 8-bit gray, ama sadece 0 ve 255)
         Not: Pure 1-bit render sonucu TürkPatent için kabul edilir ama metin
         kenarlarında aliasing olur. Grayscale threshold daha temiz.
      4. Boyut sınırı — çok büyükse oransal küçült
      5. PNG olarak byte stream döndür
    zimage/i  u   Geçersiz dosya tipirj   Ni  P i  u   Dosya 5 MB üzerindeu   Görsel açılamadı: )RGBALARGB)   r   r   )maskLc                    | t         kD  rdS dS )Nr   r   )_BW_THRESHOLD)ps    r&   rg   zconvert_to_bw.<locals>.<lambda>  s    Q%6c A r%   PNGT)formatoptimizez	image/png)r[   
media_type)content_type
startswithr   readlenr
   openioBytesIOr   exif_transposers   modenewsizepastesplitconvertmax_MAX_DIMENSIONresizer-   LANCZOSpointsavegetvaluer	   )filerawimgr~   bggraywhscalebwout	png_bytess               r&   convert_to_bwr      s     D$5$5$@$@$J4JKK		
C
3x/!4JKKYjjC)%%c*
 xx>!YYuchh8
399;r?+	U	kk%  ;;sD 99DAq
1ay>!Q*{{CE	NCE	N;U]]K 
=s	CB
**,CGGCG-II+>>E   Y6LQC4PQWXXYs7   AH
G6H+=G9 (EH9	HHHH)rJ   r   returnr=   )rt   r   r   r<   )r   r   r   r	   ))__doc__
__future__r   r   re	anthropicr   fastapir   r   r   r   fastapi.responsesr	   PILr
   r   pydanticr   r   app.services.llmr   r   app.services.llm.usage_logr   routercompileVERBOSEUNICODErC   r   r(   r8   r<   rO   ro   postr   r   r   r   r$   r%   r&   <module>r      s   
 # 	 	  > > &  % 4	*I;	7 rzz JJ
<I <Ay AN9 NY  . ZZ] Z]|  ]+/9 1? 1?r%   