o
    3i6C                     @   s  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ddl
mZ zddlmZ W n ey8   ed  w zddlZW n eyN   ed dZY nw ddlmZ ed	d
ZeddZdZdZeG dd dZG dd dZdd Zedkre  dS dS )u   
Vision Analyzer - PDF Sayfa Analiz Modülü
=========================================
PDF sayfasını görsel olarak analiz eder ve ustanın sorusuna cevap verir.

Akış:
1. PDF sayfası PNG'ye çevrilir
2. Ustanın sorusu sözlükten İngilizceye çevrilir
3. GPT-4o Vision'a gönderilir
4. Cevap sözlükten Türkçeye çevrilir
5. Ustaya sunulur

Güvenlik Kuralları:
- AI asla değer uydurmaz
- Görselde yoksa "göremiyorum" der
- Tehlikeli işlemlerde uyarı verir
- Kaynak sayfayı belirtir

Kullanım:
    from vision_analyzer import VisionAnalyzer
    
    analyzer = VisionAnalyzer()
    result = analyzer.analyze_page(
        pdf_path="/mnt/pdfs/JCB/330/330_SERVICE.pdf",
        page_number=412,
        question="bu şemadaki relief valf nerde"
    )
    N)DictListOptionalTuple)	dataclass)OpenAIu-   ❌ openai yüklü değil: pip install openaiu/   ❌ pymupdf yüklü değil: pip install pymupdf)SmartTranslatorPDF_MOUNT_PATHz	/mnt/pdfsVISION_MODELzgpt-4o-minii  u3  Sen bir iş makinası uzmanısın. Usta sana bir servis manueli sayfası gösteriyor ve soru soruyor.

KRİTİK KURALLAR - İHLAL ETME:

1. **ASLA DEĞER UYDURMA**
   - Görselde yazılı olan değerleri ver
   - Değer göremiyorsan "Bu değeri görselde göremiyorum" de
   - Tahmini değer verme - YANLIŞ DEĞİŞ ÖLÜME YOL AÇABİLİR

2. **KAYNAK BELİRT**
   - Hangi şekil/tablo/bölümden aldığını söyle
   - Örnek: "Şekil 3-2'de gösterilen relief valve..."

3. **GÜVENLİK UYARILARI**
   - Tehlikeli işlemlerde (basınç, elektrik) uyar
   - "DİKKAT: Bu işlem önce makine kapatılmalı"
   - Koruyucu ekipman hatırlat

4. **BİRİMLERİ KORU**
   - Bar/psi, Nm/ft-lb farkına dikkat
   - Orijinal birimle birlikte ver

5. **NET VE KISA CEVAP**
   - Uzun paragraflar yazma
   - Adım adım açıkla
   - Madde işaretleri kullan

6. **TÜRKÇE CEVAP**
   - Teknik terimlerin Türkçe karşılığını parantez içinde ver
   - Örnek: "Relief valve (emniyet valfi)"

BİLMİYORSAN "BİLMİYORUM" DE - Bu da bir cevaptır ve yanlış cevaptan iyidir.c                   @   s   e Zd ZU dZeed< eed< eed< eed< eed< eed< ee ed< ee ed	< eed
< dZe	e ed< de
fddZdS )AnalysisResultzAnaliz sonucupdf_pathpage_numberoriginal_questiontranslated_questionansweranswer_turkishsafety_warningsreferenced_items
confidenceNerrorreturnc              
   C   s*   | j | j| j| j| j| j| j| j| jd	S )N)	r   r   questionr   answer_englishr   r   r   r   )	r   r   r   r   r   r   r   r   r   self r   1/var/www/html/PEPCVSON/scripts/vision_analyzer.pyto_dicto   s   zAnalysisResult.to_dict)__name__
__module____qualname____doc__str__annotations__intr   r   r   r   r   r   r   r   r   r   a   s   
 r   c                   @   s   e Zd ZdZddefdededefddZded	ed
ee fddZ	ded
e
e fddZded
e
e fddZded
efddZ	dded	ededed
ef
ddZ	d ded	ededed
ef
ddZdd ZdS )!VisionAnalyzerux   
    PDF Sayfa Analiz Servisi
    
    PDF sayfasını görsel olarak analiz eder ve ustanın sorusuna cevap verir.
    Nopenai_api_keydictionary_pathpdf_mount_pathc                 C   sL   |pt d}|stdt|d| _t|d| _|| _tdt	 d d S )NOPENAI_API_KEYzOPENAI_API_KEY gerekli!)api_keyu#   ✓ Vision Analyzer hazır (Model: ))
osgetenv
ValueErrorr   openair   
translatorr(   printr
   )r   r&   r'   r(   r*   r   r   r   __init__   s   zVisionAnalyzer.__init__r   r   r   c              
   C   s   t du r
td dS zGt |}|d }|dk s|t|kr.td| dt| d W dS || }t dd}|j|d	}|d
}t|	d}	|
  |	W S  tyk }
 ztd|
  W Y d}
~
dS d}
~
ww )u  
        PDF sayfasını PNG'ye render et ve base64 döndür.
        
        Args:
            pdf_path: PDF dosya yolu
            page_number: Sayfa numarası (1-based)
            
        Returns:
            Base64 encoded PNG string veya None
        N   ❌ PyMuPDF yüklü değil!   r   u   ❌ Geçersiz sayfa numarası: z
 (Toplam: r+   g       @)matrixpngzutf-8u   ❌ PDF render hatası: )fitzr1   openlenMatrix
get_pixmaptobytesbase64	b64encodedecodeclose	Exception)r   r   r   docpage_idxpagematpix	png_bytesbase64_imageer   r   r   _render_page_to_image   s*   

z$VisionAnalyzer._render_page_to_imagetextc                    sl   g }g d}| d}|D ]"}|  t fdd|D r/| }|r/t|dkr/|| q|dd S )u)   Metinden güvenlik uyarılarını çıkar)dikkatu   uyarıtehlikeu	   güvenlikcautionwarningdangersafetyzmakineyi kapatu   basınçelektriku   sıcak
c                 3       | ]}| v V  qd S Nr   ).0kw
line_lowerr   r   	<genexpr>       z:VisionAnalyzer._extract_safety_warnings.<locals>.<genexpr>
   N   )splitloweranystripr9   append)r   rK   warningswarning_keywordslinesline
clean_liner   rX   r   _extract_safety_warnings   s   

z'VisionAnalyzer._extract_safety_warningsc                 C   sL   ddl }g }g d}|D ]}||||j}|| qtt|dd S )u9   Metinden referansları çıkar (Şekil 3-2, Tablo 4 gibi)r   N)u   [Şş]ekil\s*\d+[-.]?\d*z[Ff]igure\s*\d+[-.]?\d*z[Tt]ablo\s*\d+[-.]?\d*z[Tt]able\s*\d+[-.]?\d*z[Ss]tep\s*\d+u   [Aa]dım\s*\d+z[Ii]tem\s*#?\d+r\   )refindall
IGNORECASEextendlistset)r   rK   ri   
referencespatternspatternmatchesr   r   r   _extract_references   s   
z"VisionAnalyzer._extract_referencesr   c                    sP   g d}g d}|   t fdd|D rdS t fdd|D r&dS dS )	u"   Cevabın güven seviyesini belirle)	u   göremiyorumu   emin değilimu
   net değilz
cannot seeznot sureunclear
muhtemelenbelkiu	   sanırım)u   görünüyorolabiliru   gibi görünüyorz
appears toz
seems likelikelyc                 3   rT   rU   r   rV   phraseanswer_lowerr   r   rZ      r[   z7VisionAnalyzer._determine_confidence.<locals>.<genexpr>lowc                 3   rT   rU   r   ry   r{   r   r   rZ     r[   mediumhigh)r_   r`   )r   r   low_confidence_phrasesmedium_confidence_phrasesr   r{   r   _determine_confidence   s   z$VisionAnalyzer._determine_confidencer   contextc                 C   s  | dr|d| jd }ntj|s(| dr |dd }tj| j|}tj|s?t|||dddg g dd| d	
S | j	
|}d}t| }| ||}|sft||||ddg g dd
| d	
S zNdtj| d| d| d| dtj|dd d}	|r|	d| 7 }	| jjjjtdtddd|	ddd| dddgdgtd}
|
jd jj}W n% ty } zt||||ddg g ddt| d	
W  Y d}~S d}~ww |}| |}| |}| |}t|||||||||d 	S )!ud  
        PDF sayfasını analiz et ve soruya cevap ver.
        
        Args:
            pdf_path: PDF dosya yolu (tam yol veya göreceli)
            page_number: Sayfa numarası
            question: Ustanın sorusu (Türkçe)
            context: Ek bağlam bilgisi (opsiyonel)
            
        Returns:
            AnalysisResult nesnesi
        z/home/poyraz/pdfs//zpdfs/r]   N r}   u   PDF bulunamadı: )
r   r   r   r   r   r   r   r   r   r   zSayfa render edilemedi: zSayfa bilgisi: z, Sayfa u   

Ustanın sorusu: z&
336: 
337: (Bulunan Teknik Terimler: F)ensure_asciir+   z

Ek bilgi: system)rolecontentuserrK   )typerK   	image_urlzdata:image/png;base64,r   )urldetail)r   r   )modelmessages
max_tokensr   u   Vision API hatası: )	r   r   r   r   r   r   r   r   r   ) 
startswithreplacer(   r,   pathisabsjoinexistsr   r0   get_relevant_termsrm   valuesrJ   basenamejsondumpsr/   chatcompletionscreater
   SYSTEM_PROMPT
MAX_TOKENSchoicesmessager   rA   r"   rh   rs   r   )r   r   r   r   r   relevant_termsr   english_termsrH   user_contentresponser   rI   r   r   r   r   r   r   r   analyze_page  s   





zVisionAnalyzer.analyze_pager4   context_pagesc                 C   s   |  |||S )u   
        PDF sayfasını çevresindeki sayfalarla birlikte analiz et.
        
        Bazı şemalar birden fazla sayfaya yayılabilir.
        )r   )r   r   r   r   r   r   r   r   analyze_with_context  s   z#VisionAnalyzer.analyze_with_contextc                 C   s   dS )u   Kaynakları temizleNr   r   r   r   r   r@     s   zVisionAnalyzer.closerU   )r4   )r   r   r    r!   r	   r"   r2   r$   r   rJ   r   rh   rs   r   r   r   r   r@   r   r   r   r   r%   }   sT    
-
 
r%   c               
   C   s  ddl } | jdd}|jdddd |jd	d
tddd |jdddd | }tds7td td dS tdu rEtd td dS |j	std td td td t
 }	 ztd }| dkrlW n|spW q\td }|r|t|nd}td }|sd }td! ||||}|jrtd"|j  n<td#d$  td%|j d& td$  t|j |jrtd' |jD ]	}	td(|	  q|jrtd)d*|j  W n. ty   Y n' ty   td+ Y n ty
 }
 ztd"|
  W Y d}
~
nd}
~
ww q]|  td, dS |js td- dS t
 }||j	|j|j}|jr:td"|j  nddl}t|j| d.d/d0 |  dS )1u   CLI arayüzür   NzVision Analyzer)descriptionpdf?zPDF dosya yolu)nargshelpz-pz--pager4   u   Sayfa numarası)r   defaultr   z-qz
--questionSoru)r   r)   u2   ❌ OPENAI_API_KEY ortam değişkeni ayarlanmalı!z!   export OPENAI_API_KEY='sk-...'r3   z   pip install pymupdfzG
======================================================================u      🔍 VISION ANALYZERu<      PDF sayfasını analiz eder ve sorularınıza cevap verirzF======================================================================Tu   
📁 PDF yolu (q=çıkış): qu   📄 Sayfa numarası: u   ❓ Sorunuz: zBu sayfada ne var?u   
🔄 Analiz ediliyor...u
   ❌ Hata: rS   z<============================================================u   📋 CEVAP (Güven: r+   u   
⚠️ GÜVENLİK UYARILARI:u      • u   
📎 REFERANSLAR: z, u   ❌ Geçersiz sayfa numarasıu   
👋 Güle güle!u&   ❌ Soru gerekli: --question 'sorunuz'F   )r   indent)argparseArgumentParseradd_argumentr$   
parse_argsr,   r-   r1   r7   r   r%   inputra   r_   r   r   r   r   r   r   r   KeyboardInterruptr.   rA   r@   r   rD   r   r   r   )r   parserargsanalyzerr   page_strr   r   resultwrI   r   r   r   r   main  s   



)r   __main__)r!   r,   r   r=   tempfiletypingr   r   r   r   dataclassesr   r/   r   ImportErrorr1   r7   smart_translatorr   r-   r	   r
   r   r   r   r%   r   r   r   r   r   r   <module>   sB   "  8\
