+
    zjNi                       R t ^ RIHt ^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
 ^ RIHt ^ RIHtHtHt ^ RIHt ^ R	IHtHtHtHtHtHt ^ R
IHt R R lt]	! RR.R7      t ! R R]4      t ! R R]4      tR R lt R R lt!R R lt"]PG                  R4      R R l4       t$ ! R R]4      t% ! R R ]4      t& ! R! R"]4      t'R# R$ lt(]PG                  R%4      R& R' l4       t)R( R) lt*R*R+R,R-R.R//t+ ! R0 R1]4      t, ! R2 R3]4      t-]PG                  R44      R5 R6 l4       t.R7t/ ! R8 R9]4      t0 ! R: R;]4      t1 ! R< R=]4      t2 ! R> R?]4      t3]PG                  R@]1RA7      RB RC l4       t4R# )DuE  Drafting endpoints — tarifname, istemler, özet.

Sprint 3:
- POST /api/v1/llm/draft-description: intake JSON → tarifname taslağı (SSE)
- POST /api/v1/llm/draft-claims: tarifname + intake → istemler JSON
- POST /api/v1/llm/draft-abstract: tarifname → özet (max 150 kelime)

**Model seçimi bu dosyada DEĞİL** — `app/services/llm/router.py` içindeki görev
kaydı tek doğruluk kaynağıdır (`drafting.stream`, `drafting.claims`,
`drafting.abstract`, `drafting.title_suggestions`). İstek gövdesindeki
opsiyonel `model` alanı hâlâ override edebilir.

Sistem prompt'u `system_block()` ile gönderilir: `cache_control` yalnızca
prompt ilgili modelin minimum cache eşiğini geçiyorsa eklenir. Eşik altında
marker koymak hata vermez ama sessizce hiçbir şey yapmaz — bu yüzden karar
otomatiktir, elle yazılmaz.
)annotationsN)AsyncIterator)APIError)	APIRouterHTTPException)StreamingResponse)	BaseModelFieldValidationError)get_settings)LLMNotConfiguredErrorget_anthropic_clientload_system_promptload_task_promptresolvesystem_block)record_usagec                    V ^8  d   QhRRRR/# )   jurisdictionstrreturn )formats   "R/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/api/drafting.py__annotate__r   )   s     H Hs Hs H    c                    V R9   d   V # R# )u   Drafting jurisdiction'ını prompt seçimi için normalize eder.

PCT için ayrı drafting prompt'u yoktur — TR'ye düşürülür.
TR)r   EPUSr   )r   s   &r   _prompt_jurisdictionr!   )   s    
 (+==<G4Gr   z/llmllm)prefixtagsc                  4   ] tR t^4t$ Rt]! RR7      tR]R&   ]! RR7      tR]R&   ]! RR7      t	R]R&   ]! RR7      t
R]R&   ]! RR7      tR]R	&   ]! RR7      tR]R
&   ]! RR7      tR]R&   ]! RR7      tR]R&   ]! RR7      tR]R&   ]! RR7      tR]R&   RtR# )InventionIntakeu   Buluş anlatımı 10-soru formu — frontend'deki questions.ts ile aynı anahtarlar.

Laravel tarafı null değerler gönderebilir (DB'de cast edilmeyen JSON alanları)
ya da alan tamamen eksik olabilir; her iki durumda da boş string olarak kabul ederiz.
 )default
str | Nonetechnical_fieldproblem	prior_artsolutionnovelty
advantagesindustrial_applicability
variationsterminologyexample_user   N)__name__
__module____qualname____firstlineno____doc__r	   r*   __annotations__r+   r,   r-   r.   r/   r0   r1   r2   r3   __static_attributes__r   r   r   r&   r&   4   s     #("3OZ3+GZ+!"-Iz- ,Hj,+GZ+"2.J
.+0+<j<"2.J
.#B/K/#B/K/r   r&   c                      ] tR t^Gt$ ]! R^^R7      tR]R&   R]R&   ]! R^2R7      tR	]R
&   ]! RRR7      tR]R&   Rt	R	]R&   ]! RRRR7      t
R]R&   RtR# )DraftDescriptionRequest.
min_length
max_lengthr   titler&   intakeN)r(   r?   r)   reference_coder   ^(TR|EP|US|PCT)$r(   patternr   model@    >  r(   geleint
max_tokensr   )r4   r5   r6   r7   r	   r@   r9   rB   r   rF   rN   r:   r   r   r   r<   r<   G   s[    sqS9E39!&t!CNJCd4GHL#HE:DTe<J<r   r<   c               $    V ^8  d   QhRRRRRR/# )r   eventr   datadictr   r   )r   s   "r   r   r   P   s&     O O O4 OC Or   c                @    R V  R\         P                  ! VRR7       R2# )zevent: z
data: F)ensure_ascii

)jsondumps)rP   rQ   s   &&r   _sserX   P   s#    UG8DJJt%$H#INNr   c                    V ^8  d   QhRRRR/# )r   reqr<   r   r   r   )r   s   "r   r   r   T   s     ( (4 ( (r   c                   RV P                    2RV P                   2.pV P                  '       d   VP                  RV P                   24       VP                  R4       VP                  R4       VP                  R4       RRRR	R
RRRRRRRRRRRRRRR/
pV P                  P                  4       pVP                  4        Fn  w  rEVP                  V4      ;'       g    RP                  4       pVP                  RV 24       TP                  V'       d   TMR4       VP                  R4       Kp  	  VP                  R4       VP                  R4       VP                  R4       RP                  V4      # )uV   Intake JSON'u Claude'a okunabilir yapılandırılmış kullanıcı mesajı olarak ver.   Patent başlığı: Hedef ofis: u   İç referans: r'   u0   ## Buluş Anlatımı (10-soru formu yanıtları)r*   z1. Teknik alanr+   u   2. Çözülen problemr,   u   3. Bilinen önceki çözümlerr-   u   4. Önerilen çözümr.   u   5. Yenilik noktasır/   z6. Teknik avantajlarr0   u   7. Endüstriyel uygulama alanır1   u!   8. Alternatif uygulama biçimlerir2   u    9. Özel terimler / kısaltmalarr3   u   10. Somut örnek kullanımz### u,   _[kullanıcı tarafından tamamlanacaktır]_z---uw  Yukarıdaki buluş anlatımından, TürkPatent formatına uygun 8-bölümlü bir tarifname **taslağı** üret. Markdown olarak yaz; bölüm başlıklarını `##` ile ver. Her bölümü 2-5 paragraf olacak şekilde doldur. Referans numaralarını parantez içinde tutarlı kullan. Eksik bilgi varsa `[kullanıcı tarafından tamamlanacaktır]` placeholder'ı koy — uydurma.
)
r@   r   rB   appendrA   
model_dumpitemsgetstripjoin)rZ   partslabelsrA   keylabelvalues   &      r   _build_user_messagerj   T   sl    syyk*
s''()E s'9'9&:;<	LL	LLCD	LL 	+*5+(,"$E993F ZZ""$Flln
C&&B--/tE7^$eU)WXR	 % 
LL	LL	LL	i 99Ur   c                    V ^8  d   QhRRRR/# )r   rZ   r<   r   zAsyncIterator[str]r   )r   s   "r   r   r      s      G
 G
#: G
?Q G
r   c                 "    \        4       p\	        R4      pT P
                  ;'       g    TP
                  p\        \        T P                  4      4      p\        T 4      p TP                  P                  TT P                  \        YE4      RRRT/.RR/R	7      ;_uu_4       GRj  xL
 p\        R
RTRT P                  RT P                  /4      5x  T  Rj  xL
  pTP                  R8X  dE   TP                   P                  R8X  d(   \        RRTP                   P"                  /4      5x  K]  K_  TP                  R8X  g   Kr  \%        TP&                  RR4      p	T	R8X  d   \        R/ 4      5x  K  T	R8X  g   K  \        R/ 4      5x  K    \         d&   p\        R R\        T4      /4      5x   Rp?R# Rp?ii ; i EL LDTP)                  4       G Rj  xL 
 p
\+        YJP,                  RR7       \        RRT
P.                  RRT
P,                  P0                  RT
P,                  P2                  R\%        T
P,                  R^ 4      ;'       g    ^ R\%        T
P,                  R^ 4      ;'       g    ^ //4      5x  RRR4      GRj  xL 
  R#   + GRj  xL 
 '       g   i     R# ; i  \4         d6   p\        R RRTP6                   2RTP8                  /4      5x   Rp?R# Rp?ii ; i5i) errormessageNzdrafting.streamroleusercontenttypeadaptive)rF   rN   systemmessagesthinkingstartrF   r   r@   content_block_delta
text_deltadeltatextcontent_block_startrv   thinking_start
text_startrF   usageendpointendstop_reasonr   input_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokens   Anthropic API hatası: status)r   r   rX   r   r   rF   r   r!   r   rj   ru   streamrN   r   r@   rr   rz   r{   getattrcontent_blockget_final_messager   r   r   r   r   r   rn   status_code)rZ   clientexc_specrF   system_promptuser_messager   rP   
block_typefinals   &          r   _stream_descriptionr      s    %' %&EII$$E&';C<L<L'MNM&s+L:
??))~~5vy,?@ j) * 
 
 
 U"C$4$4SYY   & 
5 
5e::!66{{''<7"7VU[[5E5E,FGG 8 ZZ#88!()<)<fd!KJ!Z/"#3R88#v-"<44O ! 7YC122
$
5v !22444EuKKBST!5#4#4&(@(@')B)B5w!KK)F8 8 8 17!KK)BA4 4 4  A
 
 
 
 
 
d  
4S[[MB#//
 	
 	

s   K;
F K;6K;#AJ8 )G*J8 -,JGG

G!A%J3JJGF?9K;?GK;J8 
GJ G#!BJ<JJ8 JJ8 K;J5	!J$"
J5	-J5	/J8 3K;5J8 8K8*K3-K;3K88K;z/draft-descriptionc                    V ^8  d   QhRRRR/# )r   requestr<   r   r   r   )r   s   "r   r   r      s      %< AR r   c                   "   \        4       pVP                  '       g   \        RRR7      h\        \	        V 4      RRRRR/R	7      # 5i)
u   Buluş anlatımı JSON'undan TürkPatent tarifname taslağı üretir.

Output: Markdown, 8 TürkPatent bölümü içerir. Her AI çıktısı "taslak"tır —
son inceleme vekile aittir.
  :   LLM servisi konfigüre edilmemiş (ANTHROPIC_API_KEY yok).r   detailztext/event-streamzCache-Controlzno-cachezX-Accel-Bufferingno)
media_typeheaders)r   anthropic_api_keyr   r   r   )r   settingss   & r   draft_descriptionr      sV      ~H%%%O
 	

 G$&Z
 s   AAc                      ] tR t^t$ Rt]! R^^R7      tR]R&   ]! RRR7      tR]R	&   ]! R
^R7      t	R]R&   ]! R^
RR7      t
R]R&   RtR
# )	ClaimItemu   Tek bir istem kalemı..)rK   rL   rM   numberz^(independent|dependent)$)rE   r   rr   N)r(   rK   z
int | Noneparenti  r=   r{   r   )r4   r5   r6   r7   r8   r	   r   r9   rr   r   r{   r:   r   r   r   r   r      sN     c*FC*c#?@D#@t2FJ2cbT:D#:r   r   c                  <    ] tR t^t$ Rt]! R^^2R7      tR]R&   RtR# )
ClaimsListu?   Claude'dan yapılandırılmış çıktı olarak alınacak kök..r=   list[ClaimItem]claimsr   N)	r4   r5   r6   r7   r8   r	   r   r9   r:   r   r   r   r   r      s    I#CA"EFOEr   r   c                      ] tR t^t$ ]! R^^R7      tR]R&   ]! R^RR7      tR]R&   R]R&   ]! R	R
R7      tR]R&   ]! RRRR7      t	R]R&   Rt
R]R&   RtR# )DraftClaimsRequest.r=   r   r@   8 description_markdownr&   rA   r   rC   rD   r   rG   i   rI   rJ   rM   rN   Nr)   rF   r   )r4   r5   r6   r7   r	   r@   r9   r   r   rN   rF   r:   r   r   r   r   r      s`    sqS9E39 %cce L#Ld4GHL#H DSU;J;E:r   r   c                    V ^8  d   QhRRRR/# )r   rZ   r   r   r   r   )r   s   "r   r   r      s      $6 3 r   c                P   V P                   P                  4       pR V P                   RV P                   RVP	                  R4      ;'       g    R RVP	                  R4      ;'       g    R RVP	                  R4      ;'       g    R R	VP	                  R
4      ;'       g    R R2# )r\   u   

## Tarifname taslağı

u.   

## Buluş anlatımı (özet)
- Teknik alan: r*   u   —u   
- Çözüm: r-   z
- Yenilik: r.   z
- Varyasyonlar: r1   u  

---

Yukarıdaki tarifname ve anlatımdan TürkPatent formatına uygun istem taslağı üret.
Kurallar:
1. İstem 1 BAĞIMSIZ ve TEK CÜMLE olmalı.
2. Numaralar 1'den başlar, atlanmaz, sürekli artar.
3. Bağımlı istemler yalnızca daha düşük numaralı isteme referans verir.
4. 'Tercihen', 'opsiyonel', 'genellikle' yumuşatıcıları yasak.
5. Referans numaraları tarifname ile tutarlı olmalı.
6. Bağımsız istem buluşun ÖZÜNÜ kapsamalı — dar da geniş de tutmayın.

Çıktı: yalnızca `claims` alanı içeren JSON obje, her kalemde `number`, `type` (independent|dependent), `parent` (bağımlılar için), `text`.)rA   r`   r@   r   rb   )rZ   rA   s   & r   _build_claims_user_messager      s    ZZ""$F
syyk *%##
$ % **%67@@5A Bzz*-667 8jj+44u5 6!::l3<<u= >\	\r   z/draft-claimsc                    V ^8  d   QhRRRR/# )r   r   r   r   rR   r   )r   s   "r   r   r     s     S S 2 St Sr   c                R  "   \        4       pVP                  '       g   \        RRR7      h \        4       pT P                  ;'       g    \        R4      P                  p\        \        T P                  4      4      p TP                  P                  TT P                  \        YE4      RRR\        T 4      /.\         R	R
/R7      G Rj  xL
 p\3        YFP4                  RR7       TP6                  pTf   \        RRR7      hTP8                  R8X  d   \        RRR7      h\;        TP<                  4       RTP<                   U	u. uF  qP?                  4       NK  	  up	RRTP4                  P@                  RTP4                  PB                  R\E        TP4                  R^ 4      ;'       g    ^ R\E        TP4                  R^ 4      ;'       g    ^ /RTRR/#   \         d   p\        R\        T4      R7      ThRp?ii ; i EL5  \"         d!   p\        RRTP$                   2R7      ThRp?i\&         dj   p^ RIpTP+                  \,        4      P/                  RTP1                  4       R,          4       \        RRTP1                  4       R,           2R7      ThRp?ii ; iu up	i 5i)u   Tarifname + intake → yapılandırılmış istemler JSON array.

Sonnet 4.6 + output_config ile şema-doğrulanmış JSON döner.
Stream kullanılmaz — istemler kısa, full response bekletmek UI için daha temiz.
r   r   r   Nzdrafting.claimsro   rp   rq   rr   disabled)rF   rN   rt   ru   output_formatrv     r   z#Claims schema validation failed: %s:N   NuR   Claude JSON çıktısı şemaya uymadı (muhtemelen max_tokens aşıldı). Detay: :Nr   Nr   uD   Claude yapılandırılmış çıktı üretemedi (parse_output None).rN   ul   Claude max_tokens limitine ulaştı; istem üretimi eksik kalmış olabilir. max_tokens değerini artırın.r   r   r   r   r   r   rF   is_draftT)#r   r   r   r   r   r   rF   r   r   r!   r   ru   parserN   r   r   r   r   rn   r
   logging	getLoggerr4   warningerrorsr   r   parsed_outputr   _validate_claims_structurer   r`   r   r   r   )
r   r   r   r   rF   r   responser   parsedcs
   &         r   draft_claimsr     s     ~H%%%O
 	

G%' MM==W%67==E&';G<P<P'QRM..))5vy2LW2UVW$ j) / 	
 	
8 uNN=NO ( 6 6F~Y
 	

 |+2
 	
 v}}- 	6==9=a<<>=9HNN77X^^99)78>>C`bc+d , ,%wx~~?XZ['\'a'a`a
 	D s ! GCH=3FG	
  ,S[[M:
 	  (#++,QSVS]S]S_`bScd**,r*+-
 	F :s   *J'
G J'
4J'?AH 
G?H A6J'J"AJ'+ J'	J'G< G77G<<J'?H JH((J5J6A$JJJ'c                    V ^8  d   QhRRRR/# )r   r   r   r   Noner   )r   s   "r   r   r   p  s     % % %4 %r   c           	        V '       g   \        RRR7      hV ^ ,          P                  R8w  d   \        RRR7      h\        V ^R7       F4  w  rVP                  V8w  g   K  \        RRV RVP                   R	2R7      h	  V  F  pVP                  R
8X  g   K  VP                  f   \        RRVP                   R2R7      hVP                  VP                  8  g   K\  \        RRVP                   RVP                   R2R7      h	  R# )uP   TürkPatent kuralları: ilk istem bağımsız + sürekli numara + geri-referans.r   u   Claude hiç istem üretmedi.r   independentuL   İstem 1 bağımsız olmalı; üretilen yapı TürkPatent kuralına uymuyor.)rw   uH   İstem numaralandırması bozuk — sırayla 1,2,3... olmalı (beklenen z, gelen z).	dependentNu   Bağımlı istem u    parent alanı taşımıyor.z% kendine veya ileri numaraya (parent=z) referans veriyor.)r   rr   	enumerater   r   )r   expected_numclaims   &  r   r   r   p  s   4RSSay~~&a
 	
  )q9<<<'!!-hu||nBH   : ::$||## #.u||n<XY  ||u||+# #+ELL> :##(<<.0CE  r   r   u   TÜRKPATENT (TPMK)r   z the European Patent Office (EPO)r    z	the USPTOc                  F    ] tR tRt$ RtR]R&   ]! R^
RR7      tR]R	&   R
tR# )DraftAbstractClaimi  uD   Özet üretimi için istem (sadece bağımsız olanlar gönderilir).rM   r   .  r=   r   r{   r   N)	r4   r5   r6   r7   r8   r9   r	   r{   r:   r   r   r   r   r     s    NKcbT:D#:r   r   c                      ] tR tRt$ ]! R^^R7      tR]R&   ]! R^RR7      tR]R&   ]! ]RR	7      t	R
]R&   ]! RRR7      t
R]R&   ]! R^dRR7      tR]R&   RtR]R&   RtR# )DraftAbstractRequesti  .r=   r   r@   r   r   u~   Bağımsız istemler — özetin teknik kapsamını belirler. Boş geçilirse sadece tarifnameden üretilir (eski davranış).)default_factorydescriptionzlist[DraftAbstractClaim]independent_claimsr   rC   rD   r     rH   rJ   rM   rN   Nr)   rF   r   )r4   r5   r6   r7   r	   r@   r9   r   listr   r   rN   rF   r:   r   r   r   r   r     sv    sqS9E39 %cce L#L38J40  d4GHL#HCCD9J9E:r   r   z/draft-abstractc                    V ^8  d   QhRRRR/# )r   r   r   r   rR   r   )r   s   "r   r   r     s     X X"6 X4 Xr   c                  "   \        4       pVP                  '       g   \        RRR7      h \        4       pT P                  ;'       g    \        R4      P                  p\        R4      pRpT P                  '       dU   T P                   Uu. uF  pRTP                   R	TP                   2NK!  	  ppR
RP                  T4      ,           R,           p\        P                  \        T P                   4      R4      p	RT	 RT P"                   RT P$                   RT R2	T P                  '       d   RMR,           RT	 R2,           T P                  '       d   RMR,           p
 TP&                  P)                  TT P*                  \-        YE4      RRRT
/.R7      G Rj  xL
 p\3        YKP4                  RR7       RpTP6                   F#  p\9        TRR4      R8X  g   K  TP                  p M	  TP;                  4       p\=        TP?                  4       4      pRTRTR T^8*  R!R"TP4                  P@                  R#TP4                  PB                  R$\9        TP4                  R$^ 4      ;'       g    ^ R%\9        TP4                  R%^ 4      ;'       g    ^ /R&TR'R(/#   \         d   p\        R\        T4      R7      ThRp?ii ; iu upi  EL(  \.         d!   p\        RRTP0                   2R7      ThRp?ii ; i5i))uO  Tarifname + bağımsız istemlerden TürkPatent özeti (max 150 kelime).

Haiku 4.5 — format kontrolü + sıkıştırma görevi, en ucuz model yeter.

İstemler verilirse özet **istemlerle uyumlu** üretilir; tarifnamedeki
teknik detayların özeti değil, korunan kapsamın anlatımı olur. Bu
TürkPatent kılavuzuna daha yakın.
r   r   r   Nzdrafting.abstractabstractr'      İstem : u5   
## Bağımsız İstemler (özetin teknik kapsamı)

rU   u   TÜRKPATENTr]   u   
Patent başlığı: 

## Tarifname

u   ---

Yukarıdaki tarifnameu    ve bağımsız istemlerdenden u$    kurallarına uygun **özet** üret.u3   
Bağımsız istemlerin teknik kapsamını yansıt.ro   rp   rq   )rF   rN   rt   ru   r   r   r   rr   r{   
word_countwithin_limitr   r   r   r   r   rF   r   T)"r   r   r   r   r   r   rF   r   r   r   r   r{   rd   _ABSTRACT_OFFICE_LABELSrb   r!   r   r@   r   ru   createrN   r   r   rn   r   r   rq   r   rc   lensplitr   r   )r   r   r   r   rF   r   claims_sectionr   claim_linesofficer   r   abstract_textblockr   s   &              r   draft_abstractr     s     ~H%%%O
 	
G%' MM??W%89??E %Z0MN!!!?F?Y?YZ?Y!
"QVVH5?YZFU`Iaadjj 	 %(()=g>R>R)SUbcF
vh &}}o .''
(
	 	  -4,F,F,F(E	S fX9
:	; FME_E_E_Aeg		i //))5vy,?@	 0 
 
 uNN=PQ M!!5&$'61!JJM " "'')M]((*+JMj
c)HNN77X^^99)78>>C`bc+d , ,%wx~~?XZ['\'a'a`a
 	D u ! GCH=3FG [,
  ,S[[M:
 	s   *K4
J K4
AK4%J>2B#K4
K4!:K KK  7K4BK4* K4	K4J;J66J;;K4K K1K,,K11K4u  Sen Türkiye'de patent başvurusu hazırlayan bir vekil için başlık önericisin.
Görevin: bir patent başvurusunun tarifname, istemler ve özet bilgilerine
dayanarak BEŞ farklı patent başlığı önermek ve her biri için tek cümlelik
gerekçe yazmak.

TürkPatent başlık kuralları (sıkı):
1. Başlık kısa (3-12 kelime), buluşun konusunu açık ifade etmeli.
2. "Buluş", "Yöntem", "Sistem", "Cihaz", "Tertibat" gibi tip belirten
   sözcükler kullanılabilir ama abartılı olmasın.
3. Marka, ticari isim, kısaltma (tanımsız) yasak.
4. "Yeni", "İyileştirilmiş", "Geliştirilmiş", "Süper", "İleri" gibi
   öznel sıfatlar yasak — yenilik kapsamı istemlerle belirlenir, başlıkta
   reklam dili olmaz.
5. Bağımsız istemin teknik kapsamını yansıtmalı.
6. Türkçe; ana terim Türkçe, gerekirse parantez içinde EN karşılığı.
7. Cümle değil, isim tamlaması (tek satır, sonunda nokta yok).

Beş öneriyi farklı yaklaşımlarla üret:
- Bir öneri en kapsamlı (genel terim — "Sistem ve Yöntem")
- Bir öneri teknik özelliğe odaklı (ana ayırt edici unsur)
- Bir öneri uygulama alanına odaklı (kullanım sektörü)
- Bir öneri yöntem/süreç odaklı (process-style)
- Bir öneri cihaz/aparatif odaklı (device-style)

Her öneri için **1 cümlelik** Türkçe gerekçe yaz: "Bu başlık X yaklaşımıyla,
Y'yi vurguluyor; vekil ... durumda tercih edebilir."

Çıktı: structured JSON. Açıklama veya markdown ekleme.
c                  ~    ] tR tRt$ Rt]! R^^RR7      tR]R&   ]! R^RR	R7      tR]R
&   ]! RRR7      t	R]R&   Rt
R# )TitleSuggestioni=  u4   Bir başlık önerisi + neden tercih edilebileceği..u   Önerilen patent başlığı)r>   r?   r   r   r@   r   uJ   Tek cümlelik gerekçe — neden bu başlık iyi ve ne zaman tercih edilir	rationalegeneraluN   Öneri yaklaşımı: 'general', 'technical', 'application', 'method', 'device')r(   r   styler   N)r4   r5   r6   r7   r8   r	   r@   r9   r   r   r:   r   r   r   r   r   =  sQ    >sqSFdeE3e`	Is  dE3 r   r   c                  <    ] tR tRt$ Rt]! R^^R7      tR]R&   RtR# )	TitleSuggestionsResponseiM  u   5 başlık önerisi..r=   zlist[TitleSuggestion]suggestionsr   N)	r4   r5   r6   r7   r8   r	   r   r9   r:   r   r   r   r   r   M  s    ).sqQ)OK&Or   r   c                  B    ] tR tRt$ R]R&   ]! R^
RR7      tR]R&   R	tR
# )SuggestTitlesClaimiS  rM   r   .r   r=   r   r{   r   N)r4   r5   r6   r7   r9   r	   r{   r:   r   r   r   r   r   S  s    KcbT:D#:r   r   c                      ] tR tRt$ ]! R^^R7      tR]R&   ]! R^RR7      tR]R&   ]! R^RR7      tR]R	&   ]! ]	^
R
7      t
R]R&   ]! RRR7      tR]R&   RtR]R&   RtR# )SuggestTitlesRequestiX  .r=   r   current_titler   r   i  r   )r   r?   zlist[SuggestTitlesClaim]r   r   rC   rD   r   Nr)   rF   r   )r4   r5   r6   r7   r	   r   r9   r   r   r   r   r   rF   r:   r   r   r   r   r   X  sl    sqSAM3A %cce L#L#">Hc>38Z\3]0]d4GHL#HE:r   r   z/suggest-titles)response_modelc                    V ^8  d   QhRRRR/# )r   r   r   r   r   r   )r   s   "r   r   r   b  s      G G!GGr   c                  "   \        4       pVP                  '       g   \        RRR7      h \        4       pT P                  ;'       g    \        R4      P                  pRpT P                  '       dU   T P                   Uu. uF  pRTP                   RTP                   2NK!  	  ppR	R
P                  T4      ,           R
,           pRT P                   RT P                   R
T RT P                   RT P                   R2p TP                   P#                  TR\%        T\&        4      RRRT/.\(        R7      G Rj  xL
 p	\1        YIP2                  RR7       T	P4                  p
T
e   T
P6                  '       g   \        RRR7      hT
#   \         d   p\        R\        T4      R7      ThRp?ii ; iu upi  L{  \*         d!   p\        RRTP,                   2R7      ThRp?i\.         d   p\        RRT 2R7      ThRp?ii ; i5i)ub  5 patent başlığı önerisi + her birine 1 cümlelik gerekçe.

Mevcut başlık (current_title) sadece bağlam için verilir; AI kullanıcının
fikrini değerlendirir ama 5 alternatif öneri sunar. Kullanıcı isterse
"mevcut başlığı koru" der, AI önerilerini reddedebilir.

Model: Haiku 4.5 — başlık seçimi düşük-belirsizlik bir görev.
r   r   r   Nzdrafting.title_suggestionsr'   r   r   u   
## Bağımsız İstemler

rU   u9   ## Vekilin yazdığı mevcut başlık (sadece referans)

r   u   ## Özet (kaydedilmiş)

u   

---

Yukarıdaki bilgilerle TÜRKPATENT formatına uygun BEŞ farklı patent başlığı önerisi üret. Her öneri için kısa Türkçe gerekçe yaz. Yargı bölgesi: **u_   **.

Hatırlatma: vekil mevcut başlığını da koruyabilir; sen sadece alternatif sunuyorsun.i  ro   rp   rq   )rF   rN   rt   ru   r   r   r   i  zSuggest-titles failed: r   z,Anthropic structured output parse edilemedi.)r   r   r   r   r   r   rF   r   r   r   r{   rd   r   r   r   r   ru   r   r    _TITLE_SUGGESTIONS_SYSTEM_PROMPTr   r   rn   	Exceptionr   r   r   r   )r   r   r   r   rF   r   r   r   r   respr   s   &          r   suggest_titlesr   a  s,     ~H%%%O
 	
G%' MMHHW%ABHHEN!!!?F?Y?YZ?Y!
"QVVH5?YZ9FKK<TTW]] F  
! ""778

%g&6&6%7 8 &223 4!
	" __**'GHvy,?@2 + 
 
$ uJJ9UV.2.@.@F~V///A
 	

 Mi ! GCH=3FG [$
  ,S[[M:
 	  ,SE2
 	s   *H
F
 H
)H4H%F4'AH:F; =F9>F; 8H;H
F1F,,F11H9F; ;HG!!H.H/H  HH)5r8   
__future__r   rV   collections.abcr   	anthropicr   fastapir   r   fastapi.responsesr   pydanticr   r	   r
   
app.configr   app.services.llmr   r   r   r   r   r   app.services.llm.usage_logr   r!   routerr&   r<   rX   rj   r   postr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r
     s  $ #  )  , / 6 6 #  4H 
&w	/0i 0&=i =O(VG
T !" #8;	 ;F F 2 _S Sl%` 	

,+ ; ;9  X  X@$  @i  Py P; ;
9  /GHG IGr   