o
    pi*                     @  s  d 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mZ ddlmZ ddlmZmZmZmZ dd	lmZmZmZmZmZ ed
dG dd dZed
dG dd dZed
dG dd dZed
dG dd dZed
dG dd dZG dd de eZ!G dd de
Z"G dd de
Z#G dd de
Z$G dd de
Z%G d d! d!e
Z&G d"d# d#Z'G d$d% d%Z(G d&d' d'Z)G d(d) d)Z*G d*d+ d+Z+G d,d- d-Z,d.S )/u  Conversation Engine：状态机 + 调度器 + 决策中心。

职责：
- 接收一次用户输入（turn request）
- 编排上下文读取、决策、prompt 构建、LLM 调用、工具执行、副作用写入
- 返回一次系统响应（turn result）及完整副作用事件列表
    )annotations)	dataclassfield)Enum)AnyProtocol)CompletionContextcomplete)LLMTransport)ChatResponseMessageToolCallToolSpec)MemoryPersonaPromptBuilderPromptRequestSummaryT)slotsc                   @  s6   e Zd ZU dZded< ded< ded< dZded< dS )	TurnRequestu#   Conversation Engine 单轮输入。str
session_iduser_idmessageNdict[str, Any] | Nonemetadata)__name__
__module____qualname____doc____annotations__r    r!   r!   9/home/dore/onebot/Bot_Ero/core/llm/conversation_engine.pyr      s   
 r   c                   @  s,   e Zd ZU dZded< eedZded< dS )EngineEventu   引擎副作用事件。r   
event_typedefault_factorydict[str, Any]payloadN)r   r   r   r   r    r   dictr(   r!   r!   r!   r"   r#      s   
 r#   c                   @  s*   e Zd ZU dZded< ded< ded< dS )	
TurnResultu#   Conversation Engine 单轮输出。r   replyzlist[ToolCall] | None
tool_callszlist[EngineEvent]eventsN)r   r   r   r   r    r!   r!   r!   r"   r*   '   s
   
 r*   c                   @  sr   e Zd ZU dZeedZded< eedZded< dZ	ded	< eedZ
d
ed< dZded< eedZded< dS )ConversationContextu3   本轮决策与提示词构建依赖的上下文。r%   zlist[Message]recent_messageszlist[Summary]	summariesNzPersona | Nonepersonazlist[Memory]relevant_memorieszlist[ToolSpec] | Nonetoolsr'   r   )r   r   r   r   r   listr/   r    r0   r1   r2   r3   r)   r   r!   r!   r!   r"   r.   0   s   
 r.   c                   @  s6   e Zd ZU dZdZded< dZded< dZded< dS )	PolicyDecisionu   决策中心输出。Fbooluse_summaryupdate_personaTallow_tool_callN)r   r   r   r   r7   r    r8   r9   r!   r!   r!   r"   r5   <   s
   
 r5   c                   @  s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )	TurnStateu   单轮处理状态机。receivedcontext_readydecidedprompt_readyllm_respondedtools_executedmemory_updatedsummary_updatedpersona_updatedfinishedN)r   r   r   r   RECEIVEDCONTEXT_READYDECIDEDPROMPT_READYLLM_RESPONDEDTOOLS_EXECUTEDMEMORY_UPDATEDSUMMARY_UPDATEDPERSONA_UPDATEDFINISHEDr!   r!   r!   r"   r:   E   s    r:   c                   @  s   e Zd Zddd	d
ZdS )ContextProviderNr   r   r   r   r   returnr.   c                 C     d S Nr!   selfr   r   r   r!   r!   r"   getU      zContextProvider.getrR   r   r   r   r   r   r   rP   r.   )r   r   r   rU   r!   r!   r!   r"   rO   T   s    rO   c                   @  s   e Zd Zd
ddZd	S )Policycontextr.   r   r   rP   r5   c                 C  rQ   rR   r!   )rT   rY   r   r!   r!   r"   decideZ   rV   zPolicy.decideNrY   r.   r   r   rP   r5   )r   r   r   rZ   r!   r!   r!   r"   rX   Y       rX   c                   @  s   e Zd Zdd	d
ZdS )ToolExecutorr,   list[ToolCall]rY   r.   requestr   rP   r'   c                C  rQ   rR   r!   rT   r,   rY   r_   r!   r!   r"   execute_   rV   zToolExecutor.executeNr,   r^   rY   r.   r_   r   rP   r'   )r   r   r   ra   r!   r!   r!   r"   r]   ^   r\   r]   c                   @  s    e Zd Zdd	d
ZdddZdS )MemoryStorer_   r   responser   rY   r.   rP   Nonec                C  rQ   rR   r!   rT   r_   rd   rY   r!   r!   r"   appendd   rV   zMemoryStore.appendr   r   r   c                C  rQ   rR   r!   rT   r   r   rY   rd   r!   r!   r"   update_summaryg   rV   zMemoryStore.update_summaryNr_   r   rd   r   rY   r.   rP   re   
r   r   r   r   rY   r.   rd   r   rP   re   )r   r   r   rg   ri   r!   r!   r!   r"   rc   c   s    
rc   c                   @  s   e Zd Zdd
dZdS )PersonaStorer   r   r   rY   r.   rd   r   rP   re   c                C  rQ   rR   r!   rh   r!   r!   r"   updatel   rV   zPersonaStore.updateNrk   )r   r   r   rm   r!   r!   r!   r"   rl   k   r\   rl   c                   @  s   e Zd ZdZddd
dZdS )DefaultContextProvideru0   默认上下文提供器：返回空上下文。Nr   r   r   r   r   rP   r.   c                 C  s   t t|pi dS )Nr   )r.   r)   rS   r!   r!   r"   rU   s   s   zDefaultContextProvider.getrR   rW   )r   r   r   r   rU   r!   r!   r!   r"   rn   p   s    rn   c                   @  s   e Zd ZdZddd	Zd
S )DefaultPolicyuU   默认策略：短消息不开 summary，检测自我描述时允许更新 persona。rY   r.   r   r   rP   r5   c                 C  s.   |pd  }tt|dkd|v pd|v ddS )N (   u   我是u   我叫Tr7   r8   r9   )stripr5   len)rT   rY   r   textr!   r!   r"   rZ   z   s   
zDefaultPolicy.decideNr[   )r   r   r   r   rZ   r!   r!   r!   r"   rp   w       rp   c                   @  s   e Zd ZdZdd
dZdS )NoopToolExecutoruB   默认工具执行器：不做真实执行，仅返回空结果。r,   r^   rY   r.   r_   r   rP   r'   c                C  s   dt |iS )Nexecuted_count)ru   r`   r!   r!   r"   ra      s   zNoopToolExecutor.executeNrb   )r   r   r   r   ra   r!   r!   r!   r"   rx      rw   rx   c                   @  s$   e Zd ZdZdd
dZdddZdS )NoopMemoryStoreu'   默认记忆存储器：无副作用。r_   r   rd   r   rY   r.   rP   re   c                C  rQ   rR   r!   rf   r!   r!   r"   rg      rV   zNoopMemoryStore.appendr   r   r   c                C  rQ   rR   r!   rh   r!   r!   r"   ri      rV   zNoopMemoryStore.update_summaryNrj   rk   )r   r   r   r   rg   ri   r!   r!   r!   r"   rz      s    
rz   c                   @  s   e Zd ZdZdddZdS )NoopPersonaStoreu'   默认人设存储器：无副作用。r   r   r   rY   r.   rd   r   rP   re   c                C  rQ   rR   r!   rh   r!   r!   r"   rm      rV   zNoopPersonaStore.updateNrk   )r   r   r   r   rm   r!   r!   r!   r"   r{      rw   r{   c                   @  s4   e Zd ZdZddddddddddZdddZdS )ConversationEngineu    Conversation Engine 主实现。N)prompt_buildercontext_providerpolicytool_executormemory_storepersona_storellmr
   r}   PromptBuilder | Noner~   ContextProvider | Noner   Policy | Noner   ToolExecutor | Noner   MemoryStore | Noner   PersonaStore | Nonec                C  sR   || _ |pt | _|pt | _|pt | _|pt | _|pt	 | _
|p%t | _d S rR   )r   r   r}   rn   r~   rp   r   rx   r   rz   r   r{   r   )rT   r   r}   r~   r   r   r   r   r!   r!   r"   __init__   s   zConversationEngine.__init__r_   r   rP   r*   c           
      C  s  |j pd }|stdttjjd|jidg}| jj	|j|j
|jd}|ttjjt|jt|jt|jt|jp<g dd | j||}|ttjj|j|j|jdd | jt||j|j|j|j|jro|jnd|j|j
d	t|jp{i t|jpi d
|j|j|jdid}|ttjjt|j|j dd t!t"t#|j|jr|jnd|j|j
d	d| j$d}|j%}|ttj&j|j't|j(|j)j*|j)j+|j)j,ddd |j(r| j-j.|j(||d}	|ttj/j|	d | j0j|||d |ttj1jd |jr$| j0j2|j|j
||d |ttj3jd |jr>| j4j5|j|j
||d |ttj6jd |ttj7jd t8|j |j(pPd|dS )uH   主入口：接收一次输入，产出一次响应及副作用记录。rq   zTurnRequest.message is requiredr   )r$   r(   ro   )r/   r0   r2   r3   rs   N)r   r   r   )queryr/   r0   r1   r2   r3   meta)message_countused_tokens_estimate)messagesr3   r   )client)prompt_tokenscompletion_tokenstotal_tokens)finish_reasontool_call_countusage)rY   r_   )rY   )r$   )r   r   rY   rd   )r+   r,   r-   )9r   rt   
ValueErrorr#   r:   rE   valuer   r~   rU   r   r   rg   rF   ru   r/   r0   r2   r3   r   rZ   rG   r7   r8   r9   r}   buildr   r1   r)   rH   r   r   r	   r   r4   r   rawrI   r   r,   r   r   r   r   r   ra   rJ   r   rK   ri   rL   r   rm   rM   rN   r*   )
rT   r_   r   r-   rY   decisionprompt_resultoutcomerd   tool_resultr!   r!   r"   handle_turn   s   
zConversationEngine.handle_turn)r   r
   r}   r   r~   r   r   r   r   r   r   r   r   r   )r_   r   rP   r*   )r   r   r   r   r   r   r!   r!   r!   r"   r|      s    r|   N)-r   
__future__r   dataclassesr   r   enumr   typingr   r   core.llm.chat_facader   r	   core.llm.client_protocolr
   core.llm.llmr   r   r   r   core.llm.prompt_builderr   r   r   r   r   r   r#   r*   r.   r5   r   r:   rO   rX   r]   rc   rl   rn   rp   rx   rz   r{   r|   r!   r!   r!   r"   <module>   s>    	
