
    >*j                    p    d Z ddlmZ ddlZddlmZmZ dZdZddZ	ddZ
e G d d                      ZdS )uW  Soma v2:躯体模型——饭点驱动的饥饿、昼夜节律的精力、恐惧标量(纯函数,可单测锁形)。

设计要点(docs/agent-runtime-v2.md §1.6):
- 饥饿不线性累积:由"距上一餐时长"决定基线,饭点窗口(08/13/19±1h)抬升;吃一顿管 5–6 小时;
- 精力 = 昼夜节律 + 睡眠债,深夜困、白天缓回,不是匀速流失;
- 恐惧:事件冲击瞬间抬升,~40 模拟分钟半衰;恐惧 >0.5 抑制饥饿与困意(肾上腺素);
- 需求只有过阈值才进 prompt(`prompt_lines`),且以"候选动作"方式参与决策(`candidates`),不再每拍喊饿。
    )annotationsN)	dataclassfield))g      @g      "@)g      (@g      ,@)g      2@g      4@gQ?hours_since_mealfloathour_of_dayreturnc                    ddt          j        | dz
   dz            z   z  }t          fdt          D                       }t	          d||r| dk    rdndz             S )uM   饥饿基线:餐后 3h 内≈0,3–7h 缓升,9h+ 饱和;饭点窗口 +0.18。      ?g      @g?c              3  >   K   | ]\  }}|cxk    o|k    nc V  d S N ).0lohir   s      //root/genesis-world/src/genesis/runtime/soma.py	<genexpr>zhunger_curve.<locals>.<genexpr>   sC      GGBB+++++++++GGGGGG    g      @g
ףp=
?        )mathexpanyMEAL_WINDOWSmin)r   r   base	in_windows    `  r   hunger_curver      su    ##3c#9!:S!@AAABDGGGG,GGGGGIsDIQ2BS2H2HDDcRSSSr   hours_awakec                    | }d|dk    s|dk     rdn"d|cxk    rdk     sn d|cxk    rdk     rn ndndz  }t          d|d	z
            d
z  }t          d||z             S )uN   困意 = 昼夜节律(23–06 高)+ 清醒时长债(16h 起每小时 +0.05)。皙?g      7@g      @r   g      6@g      @      ?r   g      0@g?)maxr   )r   r   h	circadiandebts        r   fatigue_curver&      s    AT		QWW41CSCSCSCStCSCSCSCSWZ^_WeWeWeWebeWeWeWeWeWe33lopIsK$&''$.DsI$%%%r   c                      e Zd ZU dZdZded<   dZded<   dZded<    edd	
          Z	ded<   ddZ
ddZddZddZddZd dZd dZdS )!Somau=   某个 agent 的躯体状态。所有时间为模拟小时。g     3@r   last_meal_hg       @	woke_at_hr   fearF)defaultrepr
_fear_at_hnow_hr	   Nonec                    || _         d S r   )r)   )selfr/   s     r   atezSoma.ate,   s     r   woke_hc                    || _         d S r   )r*   )r2   r4   s     r   sleptz
Soma.slept/   s    r   amountc                j    t          d|                     |          |z             | _        || _        dS )uW   恐惧冲击(目击尸体 1.0 / 惨叫 0.7 / 停电 0.4…),先衰减旧值再叠加。r   N)r   _decayed_fearr+   r.   )r2   r/   r7   s      r   shockz
Soma.shock2   s1    T//66?@@	r   c                \    t          d|| j        z
            }| j        d|t          z  z  z  S )Nr   r!   )r"   r.   r+   FEAR_HALF_LIFE_H)r2   r/   dts      r   r9   zSoma._decayed_fear8   s0    edo-..yCB)9$9:;;r   dictc                $   |                      |          }|dk    rdd|z  z
  nd}t          || j        z
  |dz            |z  }t          |dz  || j        z
            |z  }t          |d          t          |d          t          |d          dS )Nr!   r   ffffff?g      8@   )hungerfatiguer+   )r9   r   r)   r&   r*   round)r2   r/   r+   suppressrB   rC   s         r   snapshotzSoma.snapshot<   s    !!%(('+czz3t##sed&66EEPedn.DEEP**uWa7H7HRWX\^_R`R`aaar   	list[str]c                >   |                      |          }g }|d         dk    r|                    d           n!|d         dk    r|                    d           |d         dk    r|                    d           |d	         d
k    r|                    d           |S )uF   只把越过阈值的躯体感受写进 prompt(克制,绝不刷屏)。r+   r    u=   你心跳得厉害,手心全是汗——恐惧攫住了你。g333333?u4   你心里发毛,警觉地留意着四周的动静。rB   ?u1   你已经很久没吃东西,胃里空得发慌。rC   r@   u+   你困得眼皮发沉,撑不了多久了。rF   append)r2   r/   sliness       r   prompt_lineszSoma.prompt_linesC   s    MM%  V9LLXYYYYvY#LLOPPPX;$LLLMMMY<3LLFGGGr   c                    |                      |          }g }|d         dk    r|                    d           |d         dk    r!|d         dk     r|                    d           |S )	uO   L0 候选注入:需求过阈值时,把对应动作放进候选(而非命令)。rB   rI   u   去厨房弄点吃的rC   r@   r+   r!   u   回自己房间睡觉rJ   )r2   r/   rL   outs       r   
candidateszSoma.candidatesQ   sm    MM%  X;$JJ.///Y<31V9s??JJ.///
r   N)r/   r   r	   r0   )r4   r   r	   r0   )r/   r   r7   r   r	   r0   )r/   r   r	   r   )r/   r   r	   r>   )r/   r   r	   rG   )__name__
__module____qualname____doc__r)   __annotations__r*   r+   r   r.   r3   r6   r:   r9   rF   rN   rQ   r   r   r   r(   r(   "   s         GGKIDc666J6666! ! ! !              < < < <b b b b        r   r(   )r   r   r   r   r	   r   )r   r   r   r   r	   r   )rU   
__future__r   r   dataclassesr   r   r   r<   r   r&   r(   r   r   r   <module>rY      s     # " " " " "  ( ( ( ( ( ( ( (7 T T T T& & & & 6 6 6 6 6 6 6 6 6 6r   