
    `i2                       U d Z ddl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  eddg	      Zd
dddddddddddddddZded<    G d de	      Z G d de	      Z G d de	      ZdZ G d d e	      Z G d! d"e	      Zd#Zej1                  d$      d+d%       Z G d& d'e	      Zej1                  d(      	 	 	 	 d,d)       Zy*)-u  Intake form'u için AI destekli chip önerileri.

Kullanıcı buluş anlatımı formunun herhangi bir sorusunu açtığında, daha önce
doldurduğu cevapları + sorunun bağlamını Claude Haiku 4.5'a gönderiyoruz ve
o soruya özel 10-12 chip önerisi alıyoruz.

Özellikler:
- Claude Haiku 4.5 (ucuz, hızlı; tek çağrı ~400-800ms, ~$0.001)
- Prompt caching: system prompt (soru kataloğu + format) cache_control ile
  ephemeral → tekrar çağrılarda token maliyeti ~0.1x
- Structured output: messages.parse() + Pydantic IntakeSuggestionSet
- Fallback: Claude yanıt vermezse veya API key yoksa boş liste döneriz,
  frontend statik default chip'lere düşer
    )annotations)APIError)	APIRouterHTTPException)	BaseModelField)LLMNotConfiguredErrorget_anthropic_clientz/intakeintake)prefixtagszTeknik alanu~   Buluşun hangi teknik sınıfa girdiğini belirten kategoriler (IPC-benzeri). Örn: 'Kriptografi', 'Robotik', 'Biyoteknoloji'.)titlepurposeu   Çözülen problemu   Mevcut sistemlerin eksiklerini gösteren problem kategorileri. Örn: 'Düşük performans', 'Yetersiz güvenlik', 'Yüksek enerji tüketimi'.u   Önceki çözümleru   Önceki tekniğin durumunu gösteren yaklaşım tipleri. Örn: 'Standartlaşmış çözüm var', 'Akademik makaleler mevcut', 'Ticari ürün rakip'.zTeknik avantajlaru   Ölçülebilir, patent istemini destekleyen avantaj tipleri. Örn: 'Daha düşük gecikme', 'Daha yüksek güvenlik', 'Donanımdan bağımsız'.u   Endüstriyel uygulama alanıu_   Buluşun kullanılabileceği sektörler. Örn: 'Bankacılık', 'Sağlık', 'Savunma', 'Enerji'.)technical_fieldproblem	prior_art
advantagesindustrial_applicabilityzdict[str, dict[str, str]]QUESTION_METAc                      e Zd ZU dZ edd      Zded<    eed      Zd	ed
<    edd      Z	ded<    edd      Z
ded<   y)IntakeSuggestionRequestu   Frontend → backend isteği..u   Hangi soru için öneri?descriptionstrquestion_idu-   Şimdiye kadar doldurulmuş intake cevaplarıdefault_factoryr   dict[str, str]contextN   default
max_length
str | Noner   TR^(TR|EP|US|PCT)$r"   patternjurisdiction)__name__
__module____qualname____doc__r   r   __annotations__dictr   r   r)        9/var/www/ai.patentyazar.com/app/api/intake_suggestions.pyr   r   7   sS    'S.HIKI#CG^ 
 ds;E:;d4GHL#Hr1   r   c                  4    e Zd ZU dZ edddd      Zded<   y	)
IntakeSuggestionSetu$   Claude'dan dönen structured output..      u?   6-14 arası kısa chip label'ı (her biri 2-6 kelime, Türkçe))
min_lengthr#   r   	list[str]suggestionsN)r*   r+   r,   r-   r   r9   r.   r0   r1   r2   r4   r4   E   s"    ."U	K r1   r4   c                  P    e Zd ZU dZded<   ded<    ed      Zded<   d	Zd
ed<   y	)IntakeSuggestionResponseu&   Frontend'e döndürdüğümüz yanıt.r   r   r8   r9   z''ai' veya 'fallback' veya 'unsupported'r   sourceNr$   model)r*   r+   r,   r-   r.   r   r<   r=   r0   r1   r2   r;   r;   P   s+    0$MNFCNE:r1   r;   u;  Sen Türk patent vekillerinin buluş anlatımı formunu doldurmalarına yardım eden bir asistansın. Görevin: verilen projeye özel, kısa, seçilebilir öneri chip'leri üretmek.

KURAL­LAR:
1. Tek Türkçe chip başına 2-6 kelime. Daha uzun yazma.
2. Chip'ler projenin teknik alanına UYGUN olmalı — örneğin biyoteknoloji projesinde "Kriptografi" önerme.
3. Chip'ler BİRBİRİNİ TEKRARLA­MAMALI — farklı açılardan bak.
4. Soru'ya özel odak: eğer soru "problem" hakkındaysa sadece problem kategorileri ver; "avantajlar" ise avantaj sloganları ver.
5. 8-12 arası chip ver (min 6, max 14).
6. Emoji KULLANMA. Numara da ekleme. Her chip tek satır, plain text.
7. Türk patent vekili jargoniyle uyumlu dil kullan (resmi, teknik, kısa).

Çıktı sadece structured JSON olarak döner; ek açıklama yapma.
c                     e Zd ZU dZ edd      Zded<    edd      Zded<    ed	d
      Zded<    ed	dd      Z	ded<    ee
d      Zded<    edd      Zded<    edd      Zded<    eddd !      Zd"ed#<   y)$IntakeDraftAnswerRequestu/   Bir sorunun cevabını AI ile doldur/geliştir..u   Hangi soru için cevap üret?r   r   r   u#   Sorunun başlığı (context için)question_title u,   Sorunun rehber açıklaması (context için))r"   r   question_hinti@  uP   Kullanıcının şu ana kadar yazdığı metin (varsa geliştir, yoksa yeni yaz))r"   r#   r   current_textu.   Diğer soruların cevapları — bağlam içinr   r   r   Nr    r!   r$   r   r%   r&   r'   r)   (   
   i  )r"   geleintr7   )r*   r+   r,   r-   r   r   r.   r@   rB   rC   r/   r   r   r)   r7   r0   r1   r2   r?   r?   l   s    9S.MNKN1VWNCW NM3  fL# 
 $DG^  ds;E:;d4GHL#HB2$7J7r1   r?   c                  P    e Zd ZU dZded<   ded<    ed      Zded<   dZd	ed
<   y)IntakeDraftAnswerResponseu   Üretilen cevap.r   r   answerz+'generated' veya 'improved' veya 'fallback'r   modeNr$   r=   )r*   r+   r,   r-   r.   r   rL   r=   r0   r1   r2   rJ   rJ      s*    K"OPD#PE:r1   rJ   u  Sen Türk patent vekillerinin buluş anlatımı formunu doldurmalarına yardım eden bir asistansın. Görevin: bir sorunun cevabını, vekilin DAHA ÖNCE doldurduğu diğer cevaplara uyumlu şekilde, taslak olarak yazmak.

KURAL­LAR:
1. Türkçe yaz. Resmi, teknik, patent-vekil jargonu.
2. Yanıt min_length karakterden uzun ama gereksiz uzatma; 3-6 cümle veya 5-10 madde yeterli.
3. Diğer sorulardaki bilgilerle ÇELİŞME. Tutarlı ol.
4. Vekilin zaten yazdığı text varsa (current_text boş değilse), onu TAMAMEN YENİDEN YAZMA — sadece daha iyi ifade et, eksikleri tamamla, teknik dil yükselt. Kısaltma.
5. Vekilin seçtiği chip'ler (•, ▸ işaretli satırlar) varsa onları koru ve genişlet.
6. Emoji, markdown başlık, code block KULLANMA. Sadece düz Türkçe metin (gerekiyorsa bullet listesi olarak).
7. "Taslak", "lütfen doldurun" gibi meta ifadeler YAZMA — direkt cevabı ver.
8. Spesifik rakamlar (~%40 daha hızlı, <10ms gecikme) uydurma — onları vekilin doldurması gerekir; generic "yüksek hız sağlar" ifadesi kullan.
9. İstem (claim) yazma — bu bir intake formu, istem daha sonra ayrı üretilir.

Çıktı sadece structured JSON olarak döner; ek açıklama yapma.
z/suggestionsc                  K   t         j                  | j                        }|st        | j                  g d      S 	 t	               }g }| j                  r|j                  d| j                          |j                  d| j                          |j                  d       |j                  d       d}| j                  xs i j                         D ]E  \  }}|s	|j                         sd	}|j                         d
d }|j                  d| d|        G |s|j                  d       |j                  d       |j                  d|d    d|d           |r|j                  d       dj                  |      }	 |j                  j                  dddt        ddidgd|dgt                d
{   }	|	j"                  }
t        | j                  |
j$                  dd      S # t
        $ r t        | j                  g d      cY S w xY w7 Z# t&        $ r}t)        d d!| "      |d
}~wt*        $ r}t)        d#d$| "      |d
}~ww xY ww)%u%   Bağlama göre chip önerileri üret.unsupported)r   r9   r<   fallback   Proje başlığı: Hedef patent ofisi: rA   u,   Şimdiye kadar vekilin doldurduğu cevaplar:FTNi       • : u%     (henüz hiçbir soru doldurulmadı)u   Şimdi "r   u;   " sorusu için chip önerileri üret. Bu soru şu amaçla: r   ue   
CHIPS'LER YUKARIDAKİ CEVAPLARLA UYUMLU VE TAMAMLAYICI OLMALI — aynı projenin devamıymış gibi.
claude-haiku-4-5i   texttype	ephemeralrW   rV   cache_controluserrolecontentr=   
max_tokenssystemmessagesresponse_formatai)r   r9   r<   r=     Anthropic API error: status_codedetail  zSuggestion generation failed: )r   getr   r;   r
   r	   r   appendr)   r   itemsstripjoinrb   parseSYSTEM_PROMPTr4   output_parsedr9   r   r   	Exception)reqmetaclient	ctx_lines
filled_anykvexcerptuser_messagerespparsedes               r2   intake_suggestionsr      s     S__-D ( 
 	

%' I
yy.syyk:;+C,<,<+=>?RCDJ"))+ 61JggioGvaS7)456 @AR
4=/ "  $Y0	2 1	
 99Y'L__**$ #)&,k%:  &,?@/ + 
 
 '+&8&8'**$	
 	
e ! 
'
 	

H
(  X6KA34OPVWW &DQC$H
	sx   :I
G+ BII-BI6H 7H82H *I+!HIHIH 	IH..I:IIIc                  2    e Zd ZU dZ eddd      Zded<   y)	_DraftAnswerPayloadu%   Haiku'nun structured output şeması..rE   i  )r7   r#   r   rK   N)r*   r+   r,   r-   r   rK   r.   r0   r1   r2   r   r      s    /t<FC<r1   r   z/draft-answerc                <  K   	 t               }| j                  j                         rdnd}g }| j                  r|j                  d| j                          |j                  d| j                          |j                  d       |j                  d       d	}| j                  xs i j                         D ]U  \  }}|| j                  k(  r|s|j                         s*d
}|j                         dd }|j                  d| d|        W |s|j                  d       |j                  d       |j                  d| j                   d       | j                  r|j                  d| j                          |j                  d| j                   d       |j                  d       | j                  j                         rR|j                  d       |j                  d       |j                  | j                  dd        |j                  d       n|j                  d       dj                  |      }	 |j                  j!                  dddt"        ddidgd |d!gt$        "       d{   }	|	j&                  }
t        | j                  |
j(                  j                         |d#      S # t        $ r t        | j                  dd      cY S w xY w7 h# t*        $ r}t-        d$d%| &      |d}~wt.        $ r}t-        dd'| &      |d}~ww xY ww)(u;   Bir soru için taslak cevap üret / mevcut metni geliştir.rA   rO   )r   rK   rL   improved	generatedrP   rQ   u$   Vekilin doldurduğu diğer cevaplar:FTNrj   rR   rS   u'     (diğer sorular henüz doldurulmadı)u   Şu anki soru: ""u   Açıklama: zHedef minimum uzunluk: ~z	 karakteru   Vekil şu metni başlamış (chip seçimleri dahil). Bunu GELİŞTİR, tamamla, teknik dili yükselt. Chip satırlarını (• veya ▸ ile başlayan) koru:z```ip  uy   Vekil bu soruya henüz bir şey yazmadı. Diğer cevaplardan yola çıkarak proje bağlamına uygun bir TASLAK cevap yaz.rT   rU   i  rV   rW   rX   rY   r[   r\   r_   )r   rK   rL   r=   re   rf   rg   zDraft answer failed: )r
   r	   rJ   r   rC   rn   r   rl   r)   r   rm   r@   rB   r7   ro   rb   rp   DRAFT_ANSWER_SYSTEM_PROMPTr   rr   rK   r   r   rs   )rt   rv   rL   rw   rx   ry   rz   r{   r|   r}   r~   r   s               r2   intake_draft_answerr      s!    

%' ))//1:{DI
yy.syyk:;+C,<,<+=>?R;<J"))+ 61JggioGvaS7)456 BCR'(:(:';1=>
<(9(9':;<//?yIJR
	

 	))%401F	

 99Y'L__**$ #6&,k%:  &,?@/ + 
 
 '+&8&8(==&&($	
 	
A ! 
(
 	

d
(  X6KA34OPVWW &;A3$?
	sx   L
J4 CLL"EL<6K 2K3A K 3L4!KLKLK 	L&K77LLLLN)rt   r   returnr;   )rt   r?   r   rJ   )r-   
__future__r   	anthropicr   fastapir   r   pydanticr   r   app.services.llmr	   r
   routerr   r.   r   r4   r;   rq   r?   rJ   r   postr   r   r   r0   r1   r2   <module>r      s3   #  , %
 
)8*	5  T
 & c
 ' j
 % f
 0t!#,( 0Ii I) y &8y 8,	  4 ^M M`=) = _Q	!QQ Qr1   