+
    zi                       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 ^ RIHt ^ R	IHtHtHt ^ R
IHt ]	! RR.R7      t ! R R]4      tR R ltR R lt]P9                  R4      R R l4       tR# )uA   LLM routes — Sprint 2b: /echo ile streaming Claude çağrısı.)annotationsN)AsyncIterator)APIError)	APIRouterHTTPException)StreamingResponse)	BaseModelField)get_settings)LLMNotConfiguredErrorget_anthropic_clientload_turkpatent_system_prompt)record_usagez/llmllm)prefixtagsc                  v    ] tR t^t$ ]! R^RR7      tR]R&   ]! RRR7      tR	]R
&   ]! R^RR7      tR]R&   Rt	R# )EchoRequest.i  )
min_length
max_lengthstrmessageNu@   Override model; varsayılan ANTHROPIC_DEFAULT_MODEL (Haiku 4.5).)defaultdescriptionz
str | Nonemodeli   i   )r   geleint
max_tokens )
__name__
__module____qualname____firstlineno__r	   r   __annotations__r   r   __static_attributes__r       M/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/api/llm.pyr   r      sA    t<GS<VE:  CB48J8r&   r   c               $    V ^8  d   QhRRRRRR/# )   eventr   datadictreturnr   )formats   "r'   __annotate__r/   !   s&     O Oc O O# Or&   c                @    RV  R\         P                  ! VRR7       R2# )z<SSE (text/event-stream) format: 'event: X\ndata: {...}\n\n'.zevent: z
data: F)ensure_asciiz

)jsondumps)r*   r+   s   &&r'   
_sse_eventr4   !   s#    UG8DJJt%$H#INNr&   c                    V ^8  d   QhRRRR/# )r)   requestr   r-   zAsyncIterator[str]r   )r.   s   "r'   r/   r/   &   s     8
 8
+ 8
2D 8
r&   c               n  "    \        4       p\	        4       pT P
                  ;'       g    TP                  p\        4       p TP                  P                  TT P                  RRRTRRR//.RR	R
T P                  /.R7      ;_uu_4       GRj  xL
 p\        RRT/4      5x  TP                    Rj  xL
  p\        RRT/4      5x  K    \         d&   p\        RR\        T4      /4      5x   Rp?R# Rp?ii ; i Lq LMDNTP                  4       G Rj  xL 
 p\        YHP                  RR7       \        RRTP                   RRTP                  P"                  RTP                  P$                  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  \(         d6   p\        RRRTP                   2RTP*                  /4      5x   Rp?R# Rp?ii ; i5i)u=   Claude'a stream isteği at, gelen token'ları SSE olarak yay.errorr   Ntypetextcache_control	ephemeralroleusercontent)r   r   systemmessagesstartr   deltazllm.echo)r   usageendpointendstop_reasonrD   input_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokensu   Anthropic API hatası: status)r   r   r4   r   r
   r   anthropic_default_modelr   rA   streamr   r   text_streamget_final_messager   rD   rG   rH   rI   getattrr   status_code)	r6   clientexcsettingsr   system_promptrN   r:   finals	   &        r'   _stream_clauderX   &   s+    %'
 ~HMM==X==E13M,
??))))
 FM#fk%: vy'//BC * 
 
 
 Ww&677$00 : :d 64.995 ! 9c#h"788
 :0 !22444EuKK*M!5#4#4&(@(@')B)B5w!KK)F8 8 8 17!KK)BA4 4 4  +
 
 
 
 
 
N  
1#++?3??[
 	
 	

s   H5
C H5H5AG2 DG2 G2D6D
7D:GC?C:4H5:C??H5G2 DGDBG6GG2 GG2 H5G/	G
G/	'G/	)G2 -H5/G2 2H2=*H-'H5-H22H5z/echoc                    V ^8  d   QhRRRR/# )r)   r6   r   r-   r   r   )r.   s   "r'   r/   r/   b   s      K ,= r&   c                   "   \        4       pVP                  '       g   \        RRR7      h\        \	        V 4      RRRRR/R	7      # 5i)
u   Claude'a mesajı gönderir, token-by-token SSE stream döner.

Frontend SSE client (eventsource-parser) bu endpoint'i dinleyebilir.
Event tipleri:
- start: {model}
- delta: {text}
- end:   {stop_reason, usage}
- error: {message, status?}
i  u:   LLM servisi konfigüre edilmemiş (ANTHROPIC_API_KEY yok).)rR   detailztext/event-streamzCache-Controlzno-cachezX-Accel-Bufferingno)
media_typeheaders)r
   anthropic_api_keyr   r   rX   )r6   rU   s   & r'   llm_echor`   a   sV      ~H%%%O
 	

 w&Z
 s   AA)__doc__
__future__r   r2   collections.abcr   	anthropicr   fastapir   r   fastapi.responsesr   pydanticr   r	   
app.configr
   app.services.llmr   r   r   app.services.llm.usage_logr   routerr   r4   rX   postr`   r   r&   r'   <module>rm      sr    G "  )  , / % # 
 4	&w	/9) 9O
8
v W r&   