
    }+j                    b    d Z ddlmZ ddlmZmZ ddlmZ  ed          Z G d d          Z	dS )	u-  LongTerm:mem0 长期语义记忆层(G6)。

接入原则(实测 add≈0.6s/search≈0.55s):**只挂反思节拍**,绝不进每次思考的热路径——
- 反思产出的判断/印象 → deposit 沉淀进 mem0(慢就慢在本来就慢的深思时刻);
- 反思开始前 → recall 召回相关长期判断,喂进反思 prompt(跨数小时的线索关联在这里发生);
- user_id 用 game_id:agent 隔离:同一局(含存档恢复)记忆延续,新开一局不串台。
无 key / SDK 缺失 / 网络故障一律优雅降级为关闭,绝不拖垮世界。
    )annotations)
MemoryKindMemoryRecord)
get_loggerzruntime.longtermc                  >    e Zd ZdZdddZdd	ZddZddZdddZdS )LongTerm   Ngame_idstrreturnNonec                L   || _         || _        d| _        | j        y	 ddlm} |j        r8ddlm}  ||j        d          | _        t          	                    d|           n2# t          $ r%}t                              d|           Y d }~nd }~ww xY w| j        d u| _        d S )Nr   )config)	Mem0StoreF)inferu#   mem0 长期记忆已启用(game=%s)u$   mem0 不可用,长期记忆关闭:%s)r
   store_failsgenesisr   MEM0_API_KEYgenesis.memory.mem0_storer   loggerinfo	Exceptionwarningenabled)selfr
   r   r   r   es         3/root/genesis-world/src/genesis/runtime/longterm.py__init__zLongTerm.__init__   s    
:J******& PCCCCCC!*6+>e!L!L!LDJKK EwOOO J J JEqIIIIIIIIJz-s   AA$ $
B.BBaidc                    | j          d| S )N:)r
   )r   r    s     r   _uidzLongTerm._uid%   s    ,&&&&&    opr   r   c                    | xj         dz  c_         t                              d||           | j         | j        k    r)d| _        t                              d| j                   dS dS )ut   单次失败优雅忽略;连续失败到阈值则熔断(限额耗尽常见,避免持续无效重试+日志噪音)。   u   mem0 %s失败(忽略):%sFu   mem0 连续失败 %d 次(疑似限额耗尽/网络故障)→ 本局停用长期记忆,改用本地短期记忆继续,不影响世界运行。N)r   r   r   _FAIL_LIMITr   )r   r%   r   s      r   
_note_failzLongTerm._note_fail(   sy    q12q999;$*** DLNN UVZVfh h h h h +*r$   text
created_atfloatc           	        | j         sd S 	 | j                            t          |                     |          ||t
          j        d                     d| _        d S # t          $ r!}| 	                    d|           Y d }~d S d }~ww xY w)Ng?)agent_idcontentr+   kind
importancer   u   沉淀)
r   r   addr   r#   r   
REFLECTIONr   r   r)   )r   r    r*   r+   r   s        r   depositzLongTerm.deposit1   s    | 	F	)JNN<33=JDY368 8 8 9 9 9 DKKK 	) 	) 	)OOHa(((((((((	)s   AA 
B'BBquerykint	list[str]c                    | j         sg S 	 | j                            ||                     |          |          }d| _        d |D             S # t
          $ r"}|                     d|           g cY d }~S d }~ww xY w)N)limitr   c                &    g | ]}|j         j        S  )recordr/   ).0hs     r   
<listcomp>z#LongTerm.recall.<locals>.<listcomp>B   s    333AH$333r$   u   召回)r   r   searchr#   r   r   r)   )r   r    r5   r6   hitsr   s         r   recallzLongTerm.recall<   s    | 	I	:$$UDIIcNN!$DDDDK33d3333 	 	 	OOHa(((IIIIII	s   AA 
A:A5/A:5A:)N)r
   r   r   r   )r    r   r   r   )r%   r   r   r   r   r   )r    r   r*   r   r+   r,   r   r   )r	   )r    r   r5   r   r6   r7   r   r8   )	__name__
__module____qualname__r(   r   r#   r)   r4   rC   r<   r$   r   r   r      s        K. . . . .' ' ' 'h h h h	) 	) 	) 	)	 	 	 	 	 	 	r$   r   N)
__doc__
__future__r   genesis.memory.recordr   r   genesis.obs.logging_setupr   r   r   r<   r$   r   <module>rK      s     # " " " " " : : : : : : : : 0 0 0 0 0 0	&	'	'3 3 3 3 3 3 3 3 3 3r$   