
    {i                        d 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
mZ  eddg      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Zej#                  de      defd       Zej#                  de      defd       Zej)                  d      d        Zej#                  d      defd       Zy)u   LLM 测试和演示路由    )	APIRouterHTTPException)	BaseModel)ListOptional)get_llm_clientLLMResponsez/api/v1/llmLLM)prefixtagsc                   >    e Zd ZU dZeed<   dZee   ed<   dZe	ed<   y)ChatRequestu   聊天请求messageNsystem_promptgffffff?temperature)
__name__
__module____qualname____doc__str__annotations__r   r   r   float     </home/jang/Projects/ai-researcher/src/api/routes/llm_demo.pyr   r      s"    L#'M8C='Kr   r   c                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)ChatResponseu   聊天响应contentmodelusagecostN)r   r   r   r   r   r   dictr   r   r   r   r   r      s    LJK
Kr   r   c                   0    e Zd ZU dZeed<   i Zee   ed<   y)AnalysisRequestu   查询分析请求querycontextN)	r   r   r   r   r   r   r&   r   r"   r   r   r   r$   r$      s    J GXd^ r   r$   c                   P    e Zd ZU dZeed<   ee   ed<   ee   ed<   eed<   eed<   y)AnalysisResponseu   查询分析响应intententitiesrequired_skillsneeds_reasoning
confidenceN)	r   r   r   r   r   r   r   boolr   r   r   r   r(   r(       s*    K3i#Yr   r(   z/chat)response_modelrequestc                   K   t               }|j                  st        dd      g }| j                  r|j	                  d| j                  d       |j	                  d| j
                  d       	 |j                  || j                         d{   }t        |j                  |j                  |j                  |j                  	      S 7 ;# t        $ r}t        d
dt        |             d}~ww xY ww)u   
    测试 DeepSeek LLM 聊天功能

    示例请求:
    ```json
    {
        "message": "你好，请介绍一下自己",
        "temperature": 0.7
    }
    ```
      LLM not configuredstatus_codedetailsystemroler   usermessagesr   N)r   r   r    r!     zLLM error: )r   enabledr   r   appendr   chat_completionr   r   r   r   r    r!   	Exceptionr   )r0   clientr<   responsees        r   llm_chatrE   )   s      F>>4HIIHg6K6KLMOOV@AL&,&<&<++ '= '
 !
 $$....	
 	
	!
  Lk#a&4JKKLs<   A.C91 C C:C C9C 	C6C11C66C9z/analyzec           
        K   t               }|j                  st        dd      	 |j                  | j                  | j
                         d{   }t        |j                  dd      |j                  dg       |j                  dg       |j                  d	d
      |j                  dd            S 7 d# t        $ r}t        ddt        |             d}~ww xY ww)u   
    使用 LLM 分析用户查询意图

    示例请求:
    ```json
    {
        "query": "技术部有多少员工？",
        "context": {"user_id": "user_123"}
    }
    ```
    r2   r3   r4   Nr)   otherr*   r+   r,   Fr-   g      ?)r)   r*   r+   r,   r-   r=   zAnalysis error: )
r   r>   r   analyze_queryr%   r&   r(   getrA   r   )r0   rB   resultrD   s       r   rH   rH   O   s      F>>4HII
Q++GMM7??KK::h0ZZ
B/"JJ'8"="JJ'8%@zz,4
 	
 L  Q6Fs1vh4OPPQs;   $C!)B7 B5A#B7 4C!5B7 7	C CCC!z/statusc                     K   t               } | j                  | j                  r| j                  nd| j                  r| j                  dS ddS w)u   检查 LLM 配置状态N)r>   r   base_url)r   r>   r   rL   )rB   s    r   
llm_statusrM   n   sM      F>>!'T'-~~FOO  <@ s   AAz/streamc                 *   K   ddl m} t               j                  st	        dd      g  j
                  rj                  d j
                  d       j                  d j                  d        fd	} | |       d
ddd      S w)uX   
    流式 LLM 响应（SSE）

    返回 text/event-stream 格式的流式响应
    r   )StreamingResponser2   r3   r4   r7   r8   r:   c                 ~   K   j                  j                        2 3 d {   } d|  d 7 6 d y w)Nr;   zdata: z

zdata: [DONE]

)chat_completion_streamr   )chunkrB   r<   r0   s    r   generatezllm_stream.<locals>.generate   sV     !88++ 9 
 	' 	'% 5'&&		' 

 ! s   =646=6=ztext/event-streamzno-cachez
keep-alive)zCache-Control
Connection)
media_typeheaders)fastapi.responsesrO   r   r>   r   r   r?   r   )r0   rO   rS   rB   r<   s   `  @@r   
llm_streamrX   y   s      4F>>4HIIHg6K6KLMOOV@A! 
&'&
 s   BBN)r   fastapir   r   pydanticr   typingr   r   src.integrations.llm_clientr   r	   routerr   r   r$   r(   postrE   rH   rI   rM   rX   r   r   r   <module>r_      s     ,  ! C	-ug	6) 9 !i !y  W\2"LK "L 3"LJ Z(89Q Q :Q< I  Y!k ! !r   