
    0i                        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	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZ  e	ddg      Z G d de      ZddZddZej5                  d      dd       Zy)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_promptz/llmllm)prefixtagsc                  l    e Zd ZU  eddd      Zded<    edd	      Zd
ed<    eddd      Zded<   y)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__r
   r   __annotations__r   r         */var/www/ai.patentyazar.com/app/api/llm.pyr   r      sA    t<GS<VE:  CB48J8r&   r   c                >    d|  dt        j                  |d       dS )z<SSE (text/event-stream) format: 'event: X\ndata: {...}\n\n'.zevent: z
data: F)ensure_asciiz

)jsondumps)eventdatas     r'   
_sse_eventr.       s#    UG8DJJt%$H#INNr&   c                 K   	 t               }t	               }| j
                  xs |j                  }t               }	 |j                  j                  || j                  d|ddidgd| j                  d	g
      4 d{   }t        dd|i       |j                  2 3 d{   }t        dd|i       # t        $ r$}t        ddt        |      i       Y d}~yd}~ww xY w7 l7 H6 |j                          d{  7  }t        d|j                  |j                  j                   |j                  j"                  t%        |j                  dd      xs dt%        |j                  dd      xs ddd       ddd      d{  7   y# 1 d{  7  sw Y   yxY w# t&        $ r3}t        dd|j                   |j(                  d       Y d}~yd}~ww xY ww)u=   Claude'a stream isteği at, gelen token'ları SSE olarak yay.errorr   Ntexttype	ephemeral)r2   r1   cache_controluser)rolecontent)r   r    systemmessagesstartr   deltaendcache_creation_input_tokensr   cache_read_input_tokens)input_tokensoutput_tokensr=   r>   )stop_reasonusageu   Anthropic API hatası: )r   status)r   r   r.   r   r   r   anthropic_default_modelr   r9   streamr    r   text_streamget_final_messagerA   rB   r?   r@   getattrr   status_code)	requestclientexcsettingsr   system_promptrE   r1   finals	            r'   _stream_clauderP   %   s    %'
 ~HMM=X==E13M+
??))))
 #)&,k%:  &'//BC * 
 %	 %	 Ww&677$00 : :d 64.995 ! 9c#h"788%	 :0 !22444E#(#4#4(-(@(@).)B)B7>!KK)F8 8 3:!KK)BA4 4  )%	 %	 %	 %	 %	L  
1#++?3??[
 	
 	

s   G+
B< .G+AF, ?C, F, F!C0%C.&C0)F<	C)C$G+$C))G+,F, .C00FDB FF, FF, G+F)F F)%F, (G+)F, ,	G(5)G#G+#G((G+z/echoc                   K   t               }|j                  st        dd      t        t	        |       dddd      S w)	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).)rI   detailztext/event-streamzno-cacheno)zCache-ControlzX-Accel-Buffering)
media_typeheaders)r   anthropic_api_keyr   r   rP   )rJ   rM   s     r'   llm_echorW   _   sP      ~H%%O
 	

 w&'!%
 s   >A )r,   r   r-   dictreturnr   )rJ   r   rY   zAsyncIterator[str])rJ   r   rY   r   )__doc__
__future__r   r*   collections.abcr   	anthropicr   fastapir   r   fastapi.responsesr   pydanticr	   r
   
app.configr   app.services.llmr   r   r   routerr   r.   rP   postrW   r%   r&   r'   <module>re      so    G "  )  , / % #  
&w	/9) 9O
7
t W r&   