+
    4yj(              !        a  0 t $ R t^ RIHt ^ RIt^ RIHtHt ^ RIH	t	  ! R R]	4      t
 ! R R]	4      tR	R
RRRRRRRRRRRRRR/tR]R&   Rt ]! RR7       ! R R4      4       tRLR R lltR	tRtRtRtR]! R]P*                  ]]
P,                  RR 4      R!]! R!]P*                  ]]
P,                  R"R#4      R$]! R$]P*                  ]]
P,                  R%R&4      R']! R']P*                  ]]
P,                  R(R)4      R*]! R*]P*                  ]]
P,                  RR+4      R,]! R,]P*                  ]]
P,                  R(R-4      R.]! R.]P*                  ]]
P,                  R/R04      R1]! R1]P*                  ]]
P,                  R%R24      R3]! R3]P*                  ]]
P,                  RR44      R5]! R5]P*                  ]]
P,                  R/R64      R7]! R7]P*                  ]]
P,                  ^R84      R9]! R9]P.                  ]]
P0                  R:R;4      R<]! R<]P*                  ]]
P,                  RR=4      /tR>]R?&    ! R@ RA]4      tRB RC ltRD RE ltRF RG ltRH RI ltRJ RK lt R# )Mu  Görev bazlı LLM yönlendirme — model, sağlayıcı ve veri sınırı tek yerde.

Neden bu dosya var:

1. **Model seçimi dağınıktı.** Model kimlikleri 8 ayrı dosyada string literal
   olarak gömülüydü (`model="claude-haiku-4-5"`). Maliyet ayarı yapmak için
   sekiz dosyayı taramak gerekiyordu; artık tek kayıt (`_TASKS`) var.

2. **Veri sınırı koda gömülü olmalı, yoruma değil.** Patent taslakları
   YAYINLANMAMIŞ buluş açıklamasıdır: başvuru öncesi ifşa yenilik (novelty)
   kaybına yol açabilir ve KVKK/VERBIS yükümlülüğü doğurur. Bu yüzden
   `CONFIDENTIAL` işaretli hiçbir görev Anthropic dışına çıkamaz — kural
   `TaskSpec.__post_init__` içinde import anında doğrulanır, yani hatalı bir
   yönlendirme kod review'a kalmadan uygulama açılışında patlar.

   Yalnızca `PUBLIC` görevler (zaten yayımlanmış patent dokümanları) başka
   sağlayıcıya gidebilir.

3. **cache_control sessizce ölebiliyordu.** Her modelin minimum cache'lenebilir
   prefix uzunluğu farklı; eşiğin altındaki bir system prompt'a `cache_control`
   koymak hata vermez, sadece hiçbir şey yapmaz. `cache_control_for()` bunu
   açık bir karara çevirir.
)annotationsN)	dataclassreplace)StrEnumc                  $    ] tR t^ tRtRt RtRtR# )Sensitivityu/   Görevin işlediği verinin gizlilik sınıfı.confidentialpublic N)__name__
__module____qualname____firstlineno____doc__CONFIDENTIALPUBLIC__static_attributes__r
       Y/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/services/llm/router.pyr   r       s    9!LQFRr   r   c                  "    ] tR t^*tRtRtRtRtR# )Provideru   LLM sağlayıcısı.	anthropicgoogler
   N)r   r   r   r   r   	ANTHROPICGOOGLEr   r
   r   r   r   r   *   s    IFr   r   zclaude-opus-5i   zclaude-opus-4-8i   zclaude-sonnet-5zclaude-sonnet-4-6zclaude-sonnet-4-5zclaude-opus-4-7i   zclaude-opus-4-6i   zclaude-haiku-4-5zdict[str, int]_CACHE_FLOORT)frozenc                  j    ] tR t^Ft$ RtR]R&    R]R&   R]R&   R]R&   R	]R
&   RtR]R&   R R ltRtR# )TaskSpecu'   Bir LLM görevinin yönlendirme kaydı.strtaskr   providermodelr   sensitivityint
max_tokens notec                   V ^8  d   QhRR/# )   returnNoner
   )formats   "r   __annotate__TaskSpec.__annotate__T   s     
X 
Xt 
Xr   c                	"   V P                   \        P                  J dF   V P                  \        P
                  Jd(   \        R V P                  : RV P                   R24      hV P                  ^ 8:  d   \        R V P                  : R24      hR# )u   Görev u    CONFIDENTIAL işaretli ama u    sağlayıcısına yönlendirilmiş. Yayınlanmamış buluş verisi Anthropic dışına çıkamaz (bkz. .claude/CLAUDE.md § Hukuki Kurallar). Sağlayıcı değişikliği veri sınırı değişikliğidir — kod review gerektirir.u"    için max_tokens pozitif olmalı.N)	r#   r   r   r!   r   r   
ValueErrorr    r%   )selfs   &r   __post_init__TaskSpec.__post_init__T   s    {777DMMQYQcQc<c$))&B4==/ Rj j  ??awtyym3UVWW  r   r
   N)	r   r   r   r   r   __annotations__r'   r2   r   r
   r   r   r   r   F   s=    1
IY JOD#N
X 
Xr   r   c               4    V ^8  d   QhRRRRRRRRRR	R
RRR/# )r)   r    r   r!   r   r"   r#   r   r%   r$   r'   r*   r   r
   )r,   s   "r   r-   r-   a   sN      
  	
   r   c           	     $    \        V VVVVVR 7      # )r    r!   r"   r#   r%   r'   )r   r7   s   &&&&&&r   _specr8   a   s#      r   zgemini-2.5-flashzdrafting.streami>  uO   Tarifname taslağı. En yüksek kalite gereken iş; buluşun tamamı prompt'ta.zdrafting.claimsi@  u?   İstem üretimi. Yapılandırılmış çıktı; Sonnet yeterli.zdrafting.abstracti  uD   Özet (max 150 kelime). Tarifname zaten hazır, sıkıştırma işi.zdrafting.title_suggestionsi  u   Buluş başlığı önerileri.zintake.suggestionsu   Form chip önerileri.zintake.draft_answeru   Form alanı AI taslak yanıtı.figure_extractioni  u)   Tarifnameden şekil referansı ayıklama.zformality.foreign_termsuQ   Yabancı terim tespiti. Deterministik kurallar LLM'siz çalışır, bu ek katman.zobjection.extractuM   İtiraz/Office Action PDF ayıklama. Başvuru numarası + eksiklik maddeleri.zprior_art.analyzeuS   Buluşu prior-art ile karşılaştırır — buluş açıklaması prompt'ta, gizli.ztranslation.queryu   Arama sorgusu çevirisi. Sorgu buluş anahtar kelimelerini içerir — hangi konuda çalışıldığını ifşa eder, bu yüzden PUBLIC DEĞİL.ztranslation.hitsi  u   Espacenet/Google Patents başlık+özet çevirisi. Girdi zaten YAYIMLANMIŞ patent dokümanı; müvekkil verisi içermez. Toplu, mekanik, yüksek hacim — Gemini Flash'a yönlendirilen tek görev.zllm.echozEcho/health endpoint.dict[str, TaskSpec]_TASKSc                      ] tR t^tRtRtR# )UnknownTaskErroru"   Kayıtlı olmayan görev kimliği.r
   N)r   r   r   r   r   r   r
   r   r   r=   r=      s    ,r   r=   c                    V ^8  d   QhRRRR/# )r)   r    r   r*   z
str | Noner
   )r,   s   "r   r-   r-      s     > >c >j >r   c                    RV P                  4       P                  RR4      ,           p\        P                  P	                  V4      pV'       d'   VP                  4       '       d   VP                  4       # R# )u=  `PY_MODEL_<GOREV>` ortam değişkeni ile model override.

Örn: `PY_MODEL_DRAFTING_STREAM=claude-opus-4-8`

Yalnızca MODEL override edilebilir; sağlayıcı edilemez. Sağlayıcı
değiştirmek veri sınırını değiştirmektir ve ortam değişkeniyle
yapılamamalıdır — kod değişikliği + review gerektirir.
	PY_MODEL_._N)upperr   osenvirongetstrip)r    keyvalues   &  r   _env_model_overriderJ      sP     

,,S#6
6CJJNN3E!ekkmm5;;===r   c                    V ^8  d   QhRRRR/# )r)   r    r   r*   r   r
   )r,   s   "r   r-   r-     s      # ( r   c                    \         V ,          p\        T 4      pT'       d   Y1P                  8w  d   \        YR7      pT#   \         d5   p\        RT : RRP                  \	        \         4      4       24      ThRp?ii ; i)uo   Görev kimliğinden yönlendirme kaydını döndür.

Raises:
    UnknownTaskError: görev kayıtlı değilse.
u   Bilinmeyen LLM görevi: u   . Kayıtlı görevler: z, N)r"   )r;   KeyErrorr=   joinsortedrJ   r"   r   )r    specexcoverrides   &   r   resolverS     s{    d| #4(HH

*t,K  &th.EdiiPVW]P^F_E`a
	s   A   A?/A::A?c                   V ^8  d   QhRR/# )r)   r*   r:   r
   )r,   s   "r   r-   r-     s      & r   c                      \        \        4      # )u-   Tüm kayıt — admin/teşhis amaçlı kopya.)dictr;   r
   r   r   	all_tasksrW     s    <r   c               $    V ^8  d   QhRRRRRR/# )r)   r"   r   promptr*   zdict[str, str] | Noner
   )r,   s   "r   r-   r-     s"     ! !S !# !2G !r   c                r    \         P                  V \        4      p\        V4      R,          pW28  d   R# RR/# )u2  System prompt cache eşiğini geçiyorsa `cache_control` bloğu döndür.

Eşiğin altındaki prompt'a marker koymak zararsızdır ama YANILTICIDIR:
kod caching yapıldığını ima eder, API sessizce yapmaz. Bu fonksiyon
kararı açık hale getirir.

Token sayısı yerel olarak ölçülemediği için karakter tabanlı bir tahmin
kullanılır. Tahmin bilerek YÜKSEK tarafa sapar (len/2.0; Türkçe pratikte
~3 karakter/token): yanlışlıkla marker DÜŞÜRMEK gerçek para kaybettirir
(cache okuma %90 ucuz), yanlışlıkla marker BIRAKMAK ise bedelsizdir.
g       @Ntype	ephemeral)r   rF   _DEFAULT_CACHE_FLOORlen)r"   rY   floorestimated_tokenss   &&  r   cache_control_forra     s:     U$89E6{S(K  r   c               $    V ^8  d   QhRRRRRR/# )r)   r"   r   rY   r*   zlist[dict[str, object]]r
   )r,   s   "r   r-   r-   .  s"     	 	 	S 	-D 	r   c                :    RRRV/p\        W4      pVe   W2R&   V.# )u~   Anthropic `system=` parametresi için tek bloklu liste üretir.

cache_control yalnızca gerçekten işe yarayacaksa eklenir.
r[   textcache_control)ra   )r"   rY   blockccs   &&  r   system_blockrh   .  s0    
 !'?E	5	)B	~!#o7Nr   )r&   )!__conditional_annotations__r   
__future__r   rD   dataclassesr   r   enumr   r   r   r   r4   r]   r   r8   _OPUS_SONNET_HAIKU_GEMINI_FLASHr   r   r   r   r;   rM   r=   rJ   rS   rW   ra   rh   )ri   s   @r   <module>rq      s  0 # 	 * S' Sw  Stttt	 n 	   > $X X X4$ 	
	" u  Y u  I   N !%$  (# %   5  )   3 u!  [    W   ]   	T 	4	   Ur rj-x ->(
!&	r   