
    ̯yj                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ  ej                  e      Z G d d	e      Zedd
       ZddZddZ d        Zy)uu  Google Gemini sağlayıcısı — YALNIZCA kamuya açık veri görevleri için.

Bu modül `router.Sensitivity.PUBLIC` işaretli görevlerde kullanılır. Gizlilik
sınırı `router.TaskSpec` içinde zorlanır: `CONFIDENTIAL` bir görev buraya
yönlendirilemez (import anında ValueError).

Tasarım kararı — **yumuşak bağımlılık**: Gemini yapılandırılmamışsa veya
çağrı başarısız olursa çağıran taraf Claude'a düşer. PUBLIC görevlerde her
iki sağlayıcı da hukuken uygun olduğu için fallback güvenlidir; bu sayede
`GEMINI_API_KEY` olmayan bir ortamda (CI, yerel geliştirme) hiçbir şey
bozulmaz.
    )annotationsN)	lru_cache)Any	BaseModel)get_settingsc                      e Zd ZdZy)GeminiNotConfiguredErroruH   GEMINI_API_KEY tanımlı değil — çağıran taraf Claude'a düşmeli.N)__name__
__module____qualname____doc__     (/tmp/py-stage/app/services/llm/gemini.pyr
   r
      s    Rr   r
   c                     t               } | j                  st        d      	 ddlm} |j                  | j                        S # t
        $ r}t        d      |d}~ww xY w)u   Global async-capable Gemini client.

    `google-genai` import'u fonksiyon içindedir: paket kurulu değilse modül
    import'u patlamasın, yalnızca fiilen Gemini çağrılırsa hata versin.
    u    GEMINI_API_KEY tanımlı değil.r   )genaiu;   google-genai paketi kurulu değil: pip install google-genaiN)api_key)r   gemini_api_keyr
   googler   ImportErrorClient)settingsr   excs      r   _clientr      sf     ~H""&'IJJ 
 << 7 7<88	  &I
	s   A 	AAAc                 L    	 t                y# t        $ r Y yt        $ r Y yw xY w)uM   Gemini kullanılabilir mi? Çağıran taraf fallback kararı için kullanır.FT)r   r
   	Exceptionr   r   r   is_configuredr   2   s0    	
 	 $  s   
 	###c                l      i S d fd} |d      } |d      }t        ||z
  d       |d      d|dS )u  Gemini `usage_metadata`'yı `record_usage()`'ın beklediği şekle çevirir.

    Gemini alan adları Anthropic'ten farklı; ortak maliyet borusunu tek
    formatta tutmak için burada eşliyoruz.

    Not: Gemini'de `prompt_token_count`, cache kullanıldığında cache'lenmiş
    token'ları DA içerir. Anthropic'te `input_tokens` cache'lenmemiş kısımdır.
    Çift sayımı önlemek için cache'li kısmı düşüyoruz.
    c                8    t        t        | d      xs d      S )Nr   )intgetattr)nameusage_metadatas    r   _getzusage_as_record.<locals>._getJ   s    7>438q99r   prompt_token_countcached_content_token_countr   candidates_token_count)input_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokens)r#   strreturnr!   )max)r$   r%   promptcacheds   `   r   usage_as_recordr2   =   sT     	: &'F./FFVOQ/67'(#)	 r   c                 2    d d x}f	 	 	 	 	 	 	 	 	 	 	 ddcS )Tc                     t         S )Nr   r   r   r   r4   r4   W   s    lr   c           
       K   ddl m} t               }|j                  j                  j                  | ||j                  |d||             d{   }t        t        |dd            }t        |dd      }	|	"t        |	|      s	 |j                  |	      }	|	|fS |	|fS 7 O# t        $ r%}
t        j                  d	|
       d}	Y d}
~
|	|fS d}
~
ww xY ww)
u   Şema-doğrulanmış JSON üret.

    Returns:
        (parsed, usage_record). Parse edilemezse (None, usage).

    Raises:
        GeminiNotConfiguredError: yapılandırma yoksa — çağıran Claude'a düşer.
    r   )typeszapplication/json)system_instructionresponse_mime_typeresponse_schemamax_output_tokens)modelcontentsconfigNr$   parsedu#   Gemini yanıtı şemaya uymadı: %s)google.genair7   r   aiomodelsgenerate_contentGenerateContentConfigr2   r"   
isinstancemodel_validater   loggerwarning)r<   systemuserschema
max_tokensr7   clientresponseusager?   r   s              r   generate_structuredrP   W   s       #YFZZ&&77**%1"(	 + 
 8 	 	H GH.>EFE Xx.F*VV"<	**62F
 5=65=1	(  	NN@#FF5=		s<   ACB!5CB# 	C#	C,CCCC)r<   r-   rI   r-   rJ   r-   rK   ztype[T]rL   r!   r.   ztuple[T | None, dict[str, int]]r   )	.defaultsr4   s     r   +<generic parameters of generate_structured>rR   W   s>    l+ + 	+
 + + %+r   )r.   r   )r.   bool)r$   r   r.   zdict[str, int])r   
__future__r   logging	functoolsr   typingr   pydanticr   
app.configr   	getLoggerr   rG   RuntimeErrorr
   r   r   r2   rP   r   r   r   <module>r\      sf    #     #			8	$S| S 9 9$4+ +r   