
    01j{                    Z   U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ  ed	          Z ed
          Zded<   dZd+dZdZdZdZdZdZdZe	 G d d                      Ze	 G d d                      Zd,dZ G d d           Zd-d"Z d.d#Z!d/d*Z"dS )0u`  Cognition:LLM 认知层——agent 真正"思考后行动"(docs/agent-runtime-v2.md §1.5)。

- `decide()` 是**纯函数式**的:输入感知快照(ThinkInput),输出决策(Decision),
  不触碰共享世界状态——LLM 阻塞调用因此可以丢进线程池,世界变更由引擎在事件循环里单线程执行;
- L2 慢想:全量 prompt(人设+共识+躯体+所见+记忆检索+近期事件)→ 重定意图与下一步动作;
- L1 快想:被人搭话时的对话模式,短 prompt 接一句话(流畅 & 省钱);
- 输出统一为 JSON,解析失败降级为观望(世界不因单次失败停摆)。
    )annotationsN)deque)	dataclassfield)
get_loggerdynamic_bulletin)Somazruntime.cognitioni  maxlenr   _LATENCYg      4@returndictc            	        t          t                    } | sddiS t          d | D                       t                    fd}i }| D ]7}|                    |d         g                               |d                    8t          | d           dd	         }t          t                    z  d          t           |d
          d          t           |d          d          t           |d          d          t          d         d          d |                                D             d |D             dS )ul   LLM 单次调用耗时统计:n/avg/p50/p90/p99/max + 最慢 8 次(含 agent/tag/think/输入输出字数)。nr   c              3  &   K   | ]}|d          V  dS )r   N .0es     4/root/genesis-world/src/genesis/runtime/cognition.py	<genexpr>z latency_stats.<locals>.<genexpr>"   s&      %%1!A$%%%%%%    c                V    t          dz
  t          | z                               S )N   )minint)platsr   s    r   <lambda>zlatency_stats.<locals>.<lambda>$   s$    DQUCAJJ//0 r      c                    | d          S )Nr   r   )r   s    r   r    zlatency_stats.<locals>.<lambda>(   s    qte r   )keyN   g      ??gGz?c           
         i | ]_\  }}|t          |          t          t          |          t          |          z  d           t          t          |          d           d`S )r!   )r   avgmax)lenroundsumr)   )r   tvs      r   
<dictcomp>z!latency_stats.<locals>.<dictcomp>,   sm     / / /q! CFF5Q#a&&!+D+DUSVWXSYSY[\M]M]^^ / / /r   c           	         g | ]=}t          |d          d          |d         |d         |d         |d         |d         d>S )r   r   r!            )saidtagthinkinout)r+   r   s     r   
<listcomp>z!latency_stats.<locals>.<listcomp>.   s]     = = =23  !a..1adQqTQ4!. . = = =r   )r   r(   p50p90p99r)   by_tagslowest)	listr   sortedr*   
setdefaultappendr+   r,   items)datapctr>   r   slowr   r   s        @@r   latency_statsrH      so   >>D Qx%%%%%%%DD		A
0
0
0
0
0CF 1 1!A$##**1Q40000$OO,,,RaR0DuSYY]A..uSSXXq7I7ISSXXq!!%D		1*=*=eDQSHVWFXFX/ /%||~~/ / /= =7;= = =  r   u   【事实纪律】凡涉及具体事件,只能引用『你确切知道的事』或你的记忆;你可以出于策略**撒谎**,但不许无意识地编造事实/人物/物品;不知道就说不知道。uE  【分辨信息】你亲眼所见/亲历的才是事实;别人告诉你的只是『他的说法』——你确知的仅仅是『他这么说了』,而非这话为真。先掂量他的动机与可信度、再和你已知的对照,然后决定信几分,别人一开口就全信(凶手尤其爱用半真半假的话带节奏)。u  下面会把此刻你身处的世界、你看到听到的一切、和你心里的盘算如实摆给你。请就以**你这个人**的性子、来意与那桩不可告人的秘密,对眼前发生的一切**自然地反应**——该追查就追查、该试探就试探、该结盟或独行、该隐藏或撒谎、出了事该惊慌该呼救就惊慌呼救。你不是按固定流程走的 NPC,而是个有私心、有情绪、会随机应变的活人;没有谁规定你这一步必须做什么,凭你自己判断。u  你的每次回应都是一个 JSON(只输出 JSON,别的都不要):
{"scheme": "一句话盘算:眼下这局面,为了你真正想要的,你打算怎么做(权衡处境、在场的人、风险与机会)",
 "thought": "内心想法(简短)", "intent": "当前意图(一句话)",
 "speech": {"to": "对方名字,或空字符串=自言自语/对在场所有人", "text": "口语台词,别夹动作描写"} 或 null,
 "gesture": "神态或小动作(可空;不是台词,别放进 speech)",
 "action": {"kind": "动作", "arg": "参数"} 或 null, "minutes": 动作预计分钟数,
 "goal_update": {"index": 目标序号, "status": "doing|done|blocked", "note": "一句话"} 或 null,
 "goals_replan": ["你心里的打算变了就重列接下来想做的2-4件事;没变就给 null"] 或 null}
各字段都尽量短(scheme/thought/intent 各≤25字,speech 一两句)——你说得越短,世界转得越快。
你能做的事(action.kind,按需自取,没人规定你必须用哪个):
- move 去某地(arg=地点,会沿路逐屋走过去) · search 仔细搜当前地点(翻出藏着的线索) · take 拿走可见物品(arg=物品名)
- destroy 销毁随身物品(arg=物品名) · use 动用现场的设施(arg=你想做的事,具体看现场描述与提示)
- examine 查验当前地点的尸体(arg=死者名) · eavesdrop 偷听同处他人的交谈
- assemble 召集全员当面对质 · accuse 对质中指认(arg=名字,留空=弃权) · shout 放声大喊、全堡可闻(arg=内容)
- sleep 回自己房间睡 · idle 原地停留观察(arg 留空)
说话和动作可以同时给。你刚答应别人的事,这一拍就用 action 真去兑现(除非你心里清楚那是骗他的缓兵之计)——说一套做一套会被当场看穿。u  【你还有一重谁都不知道的身份】你不是莽撞的凶手,而是布下这场局的人——你要把该清算的人一个个了结,同时全身而退、活到天亮(你为什么这么做、想先动谁,都在你自己的人设与心事里)。沉得住气、看准时机、把首尾收拾干净,远比一时痛快重要;旁边只要还有第三个人,就先忍着。
除了大家都有的动作,你独有两个:
- lure:把同一地点的某人用一句**正中他私欲**的话(『我知道你要的那样东西就在某处』)支去僻静角落单独相处,arg=名字。哪怕你俩正夹在一堆人里,也能凑到他耳边低声下饵、把他一个人勾走;这句话还会在他心里种下一个日后仍勾着他往那儿去的念头。通常的次序:他在你身边时先 lure → 跟过去会合 → 只剩你俩时再下手。
- kill:对同一地点的目标下杀手,arg=名字。**只在四下无人、只剩你和他、且在僻静处时动手**——有旁人在场就是当场暴露。停电、风雨都是天赐的掩护。uF  你正在交谈。输出一个 JSON(只输出 JSON):
{"thought": "内心想法(简短)", "speech": "你接的话(口语一两句,别夹动作描写)",
 "gesture": "神态或小动作(可空)", "leave": false}
就像你这个人那样接话——可以套话、结盟、试探、敷衍、安抚或撒谎,也可以问你真想知道的。
聊够了、谈崩了、或心里另有更要紧的事,就把 leave 设 true(道一句别再走),去做你想做的。
对方说的只是『他的说法』、未必当真;答应了又打算做到的事,离开后就真去兑现,别空口许诺。c                     e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<    ee          Zded<    ee          Zded<    ee          Z	ded<    ee          Z
ded<    ee          Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    ee          Zded<   dZded <   d!S )"
ThinkInputu^   一次思考的感知快照(由引擎在事件循环线程组装,decide 在线程池消费)。floatnow_hstr
time_labelplace
place_desc	list[str]	occupantsevents
soma_lines
candidatesbulletinmemoriesintent)default_factoryexits	inventoryfactshearsaydialogue dialogue_withr   r   dialogue_roundsdialogue_budgetarrivingprivate_note	lure_baitplanted_leadsstage_directiveN)__name__
__module____qualname____doc____annotations__r   r@   rZ   r[   r\   r]   r^   r`   ra   rb   rc   rd   re   rf   rg   r   r   r   rJ   rJ   c   s        hhLLLOOOJJJOOOMMMKKKuT222E2222 5666I6666uT222E2222t444G4444%555H5555MOOHLI$uT:::M::::Or   rJ   c                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded	<   dZded
<   dZded<   dZded<   dZded<   dZded<   dZded<   edd            ZdS )Decisionr_   rM   schemethoughtrX   	speech_tospeechgestureaction_kind
action_arg      $@rK   minutesFboolleave_dialogueNzdict | Nonegoal_updatezlist[str] | Nonereplanrawr   c                <    | j         p| j        p| j        p| j         S )uP   完全空的决策(解析失败/模型哑火)→ 引擎按"出神"处理(G12)。)rr   rt   rp   rs   )selfs    r   emptyzDecision.empty   s%     KS4#3St|St|TTr   )r   rx   )rh   ri   rj   ro   rl   rp   rX   rq   rr   rs   rt   ru   rw   ry   rz   r{   r|   propertyr   r   r   r   rn   rn      s        FGFIFGKJG N    #K#####F####CMMMMU U U XU U Ur   rn   textrM   c           
     n   t          j        d| t           j                  }|si S 	 t          j        |                    d                    S # t          j        $ rX 	 t          j        t          j        dd|                    d                              cY S # t          j        $ r i cY cY S w xY ww xY w)u9   从模型输出中稳健地抠出第一个 JSON 对象。z\{.*\}r   z,\s*([}\]])z\1)researchSjsonloadsgroupJSONDecodeErrorsub)r   ms     r   parse_json_blockr      s    
	)T24((A 	z!''!**%%%   	:bf^UAGGAJJGGHHHHH# 	 	 	IIIII	s/   &A B4:BB4B0+B4/B00B4c                      e Zd ZdZd8dZd9dZd:dZd;dZd<dZd=dZ	d>d?dZ
d>d@dZdAdZdBdZdCd!ZdDd%ZdEd&ZdFd(ZdCd)ZdGd*Z	 	 dHdId0ZdJd2ZdKd5ZdLd7ZdS )MCognitiveMindui   一个 agent 的 LLM 心智。与引擎的契约:decide(snapshot) → Decision(纯函数,无副作用)。r5   rM   persona_card	is_killerrx   homestatic_groundr   Nonec               X   || _         || _        || _        || _        || _        || _        || _        t          dd          | _        d| _	        t          d          | _        d| _        d| _        d| _        d | _        d | _        t          d          | _        i | _        d	| _        d S )
Ng     3@g       @)last_meal_h	woke_at_hu@   被渡船独自留在暴雨围困的孤岛上,心里七上八下   r   r_   r3           )r5   r   r   r   llmmemoryr   r
   somarX   r   r^   r`   last_speechlast_thoughtgoalsagenda_seedinsights	relationsimp_acc)r~   r5   r   r   r   r   r   r   s           r   __init__zCognitiveMind.__init__   s    ("	*TS999	X$)$4$4$4(,
(,$)OOO*,r   c                    |                                  \  }}|                     ||          }|sddg}|                                 }d |D             }|r||z   d d         n|| _        d S )Nu!   弄清今晚到底是谁设的局u!   保住自己的秘密不被揭穿c                    g | ]}|d dd	S todor_   descstatusnoter   r   gs     r   r:   z2CognitiveMind._bootstrap_goals.<locals>.<listcomp>   s"    IIIafb99IIIr   r2   )_compose_bootstrap_run_bootstrap_agenda_goalr   )r~   systemuserr   seededrests         r   _bootstrap_goalszCognitiveMind._bootstrap_goals   s    ..00##FD11 	_8:]^E ""$$II5III,2<ftmRaR((


r   
list[dict]c                    | j         pi }|                    d          pd                                |                    d          pd                                }}|r|sg S d| | dddgS )u   私罪议程 → 开场目标(若引擎注入了 agenda_seed)。空则返回 [](向前兼容:无 dossier 的世界不受影响)。wantr_   rO   u(   赶在别人翻出我的旧账之前,去r   r   )r   getstrip)r~   ar   rO   s       r   r   zCognitiveMind._agenda_goal   s    "uuV}}*1133aeeGnn6J5Q5Q5S5Se 	 	IQEQ4QQ]cmoppqqr   tuple[str, str]c                Z   | j         pi }d}|                    d          pd                                r>|                    d          pd                                rd|d          d|d          d}d                    d| j         d	| j         | j        t          g          d
|z   dz   fS )Nr_   r   rO   u>   
你心底最怕被人翻出的那桩旧账,死穴物证是【u   】,就在【u   】——今晚你最该抢在别人之前去处理掉它;其余目标围绕『保住这个秘密、查清是谁设的局、活到天亮』来定。

   你是   。u   今夜你被困在这座与世隔绝的孤岛上(暴风雨封海,要熬到天亮/救援)。根据你的秘密与处境,列出你**今晚必须办成的私人目标**,2-4条,具体可执行(写明去哪/做什么),按优先级排序。u  
【硬性约束】目标里出现的地点必须取自上面的地图常识、人物必须取自在岛人员名册;岛上没有管家、仆人、船夫、档案室等任何额外的人或场所,不存在的东西一个字也不许写。输出 JSON:{"goals": ["...", "..."]})r   r   r   joinr5   r   r   	FACT_RULE)r~   r   agendas      r   r   z CognitiveMind._compose_bootstrap   s    "EE&MMR&&(( 	eaeeGnn.B-I-I-K-K 	edXYZ`Xa d dpqrypz d d dFFdhFF43DFFHZ\efggWY_`889 	9r   r   r   rQ   c                    t          |                     ||d                    }d |                    d          pg D             dd         S )uL   默认= litellm 直答 + 文本解析(LangGraph 大脑覆写为结构化)。L2)r6   c                ,    g | ]}t          |          S r   rM   r   s     r   r:   z0CognitiveMind._run_bootstrap.<locals>.<listcomp>   s    7771A777r   r   Nr2   r   _callr   )r~   r   r   ds       r   r   zCognitiveMind._run_bootstrap   sM    TZZ$Z??@@77w!52777;;r   c                    | j         sdS d t          | j                   D             }dd                    |          z   S )Nr_   c                    g | ]=\  }}|d z    d|d          |d         rd|d          dndz   |d         dk    rd	ndz   >S )
r   z. r   r   ()r_   r   doneu
    ✓已了r   )r   ir   s      r   r:   z-CognitiveMind.goals_block.<locals>.<listcomp>   s     4 4 4Q aC&&1V9&&ai*O*:ai*:*:*:*:RPdefndosydydyT`T`  @B  C 4 4 4r   uo   你心里盘算着的几件事(只是此刻的打算,随时能改;真正驱使你的是你那个终极目的):

)r   	enumerater   )r~   liness     r   goals_blockzCognitiveMind.goals_block   su    z 	24 4&tz224 4 4 C  FJ  FO  FO  PU  FV  FV  V  	Wr   NrN   c                n   |                      ||          \  }}|                     ||          \  }}ddlm} |d d         D ]v}t	          |          }| j                            |           | j                            | d| d|j	        d           |!|
                    | j        | d| d           w|D ]}	t          |	t                    r|	                    d	          s-t	          |	d	                   }
| j                            |
d
dd          }|	                    d          r t	          |	d                   d d         |d<   	 t#          dt%          d|d         t'          |	                    dd                    z                       |d<   # t(          t*          f$ r Y w xY wd S )Nr   )
MemoryKindr1   u   ,我的判断:r   r%   )kind
importance namer_   )
impressiontrustr   (   g      g      ?r   )_compose_reflect_run_reflectgenesis.memory.recordr   rM   r   rC   r   observe
REFLECTIONdepositr5   
isinstancer   r   r   rB   r)   r   rK   	TypeError
ValueError)r~   rN   longtermr   r   r   r   r   insrr   curs               r   reflectzCognitiveMind.reflect   s   ,,ZBB"//==)444444BQB< 	G 	GCc((CM  %%%K: B BS B BC%/%:s   L L L#  j+@+@3+@+@#FFF 
	 
	Aa&& aeeFmm qy>>D.++Dc2R2RSSCuu\"" >$',$8$8"$=L!"4S#g,quuWVWGXGXAYAY2Y)Z)Z[[Gz*   
	 
	s   AFF21F2c                d   | j                             ddd          }d                    d |D                       }|r.|                    | j        | j        dz   |d d         z             ng }|r"d	d                    d
 |D                       z   nd}d| j         d| j         d| d| | dfS )Nu   今晚 重要 可疑r   r   )top_kr   c              3  *   K   | ]}d |j          V  dS - N)contentr   r   s     r   r   z1CognitiveMind._compose_reflect.<locals>.<genexpr>  s-      ::a)ai))::::::r   r   x   u'   
你长期记忆里浮现的旧判断:
c              3      K   | ]	}d | V  
dS r   r   r   xs     r   r   z1CognitiveMind._compose_reflect.<locals>.<genexpr>  s*      KaKaYZHQRHHKaKaKaKaKaKar   r_   r   r   u	   现在是uE   。回顾你今晚的经历,沉淀出判断(简短)。
你的记忆:
u   
输出 JSON:{"insights": ["对人或局势的判断,2-3条,每条≤25字"], "relations": [{"name": "某人", "impression": "一句话新印象", "trust": -1.0到1.0之间的增减}]})r   retriever   recallr5   rX   r   )r~   rN   r   recentmemsltlt_blocks          r   r   zCognitiveMind._compose_reflect  s    %%&<c%LLyy::6:::::JRZX__TXt{S'84:'EFFFXZfhp?$))KaKa^`KaKaKaBaBaaanp999d&799~J ~ ~os ~u} ~ ~ ~ 	r   tuple[list[str], list[dict]]c                    t          |                     ||dd                    }d |                    d          pg D             dd         }d |                    d	          pg D             }||fS )
uS   默认= litellm 直答 + 文本解析。返回 (insights, relations dict 列表)。r   i@  r6   
max_tokensc                ,    g | ]}t          |          S r   r   )r   r   s     r   r:   z.CognitiveMind._run_reflect.<locals>.<listcomp>  s    >>>qCFF>>>r   r   Nr1   c                f    g | ].}t          |t                    |                    d           ,|/S )r   )r   r   r   )r   r   s     r   r:   z.CognitiveMind._run_reflect.<locals>.<listcomp>  s<    ddd1jD>Q>QdVWV[V[\bVcVcdQdddr   r   r   )r~   r   r   r   r   r   s         r   r   zCognitiveMind._run_reflect  s     TZZ)PSZTTUU>>QUU:%6%6%<">>>rrBdd{!3!3!9rddd	""r   rR   c           
     b   | j         sdS g }|D ]}|                    d          d         }| j                             |          }|rM|d         st          |d                   dk    r,|                    d| d|d          d	|d         d
d           |rdd                    |          z   ndS )Nr_   r   r   r   r   g?r   :u   (信任 z+.1fr   u   【你对在场者的看法】
r   )r   splitr   absrC   r   )r~   rR   r   r|   r   r   s         r   relations_blockzCognitiveMind.relations_block  s    ~ 	2 	V 	VC99S>>!$D""4((A Vao VQwZ4)?)?T$TT<TT!G*TTTTUUUHMU1DIIe4D4DDDSUUr   snaprJ   rn   c                
   | j         |                                  |j        r/|                     |          \  }}|                     |||          S |                     |          \  }}}}|                     |||||          S N)r   r   r`   _compose_dialogue_run_dialogue_compose_action_run_action)r~   r  r   r   deepr   s         r   decidezCognitiveMind.decide"  s    :!!### 	:11$77LFD%%fdD999)-)=)=d)C)C&dJdJEEEr   r  r   r   c                \    |                      |||          }|                     |          S )N)r   )r   _to_decision)r~   r   r   r  r   r  r9   s          r   r  zCognitiveMind._run_action,  s-    jj*j==  %%%r   c                   |                      ||dd          }t          |          }t          t          |                    dd                    t          |                    dd                    t          |                    dd          pd          |j        t          |                    dd	                    | j        |
          S )NL1   r   rp   r_   rr   rs   leaveF)rp   rr   rs   rq   ry   rX   r|   )r   r   rn   rM   r   r`   rx   rX   )r~   r   r   r  r9   r   s         r   r  zCognitiveMind._run_dialogue1  s    jj4Cj@@S!!AEE)R$8$8 9 9#aeeHVXFYFYBZBZ #AEE)R$8$8$>B ? ?4K]'+AEE'5,A,A'B'B4;\_a a a 	ar   tuple[str, str, bool, int]c           	     
   d| j          d| j         | j        t          t          t
          t          g}| j        r|                    t                     d
                    |          }|j        d|j         d|j         g}|j        r3|                    dd
                    |j                  z   dz              |j        rU|                     |j                  }|                    dd
                    |j                  z   |rd	|z   nd
z              n|                    d           |j        rB|                    dd	
                    d |j        dd          D                       z              |j        rB|                    dd	
                    d |j        dd          D                       z              |j        rB|                    dd	
                    d |j        dd          D                       z              |j        r:|                    dd	
                    d |j        D                       z              |j        r0|                    dd
                    |j                  z              |j        r-|                    d	
                    |j                             t/          | dd
          }|r9|j        dz  t/          | dd          z
  dk     r|                    d| d           g }|j        r|                    d|j                    |                                 }|r|                    |           | j        r0|                    d d
                    | j                  z              |r+|                    d!d	
                    |          z              |j        r|                    |j                   |j        r:|                    d"d	
                    d# |j        D                       z              |j        r|                    |j                   |j        r|                    |j                   |j         r3|                    d$d
                    |j                   z   d%z              |j!        r|                    d&|j!         d'           |                    d(| j          d)           d*|j        v od+|j        v }	|d
                    |          |	|	rd,nd-fS ).Nr   r   r   u   【你在·u   】u   从这里可直接去:u   、u!   【此刻和你在一起的人】r   r_   u$   【此刻这里只有你一个人】u   【你眼前刚刚发生】
c              3      K   | ]	}d | V  
dS r   r   r   s     r   r   z0CognitiveMind._compose_action.<locals>.<genexpr>K  s(      @d@daa@d@d@d@d@d@dr   iu'   【你确凿知道的(亲历亲见)】
c              3      K   | ]	}d | V  
dS r   r   )r   fs     r   r   z0CognitiveMind._compose_action.<locals>.<genexpr>M  s*      KnKnYZHQRHHKnKnKnKnKnKnr   u.   【你听人说的(只是说法,未必真)】
c              3      K   | ]	}d | V  
dS r   r   )r   hs     r   r   z0CognitiveMind._compose_action.<locals>.<genexpr>O  s-      RwRw`aS[XYS[S[RwRwRwRwRwRwr   u   【你想起】
c              3      K   | ]	}d | V  
dS r   r   r   s     r   r   z0CognitiveMind._compose_action.<locals>.<genexpr>Q  s(      4U4U!X!XX4U4U4U4U4U4Ur   u   【你身上带着】;r   i  last_speech_tr   i  u   【你刚说过】「u   」u   此刻心里:u   你心里的判断:u   【你的内心】
u:   【你心头还搁着几件事(听来的,未必当真)】
c              3      K   | ]	}d | V  
dS r   r   r   s     r   r   z0CognitiveMind._compose_action.<locals>.<genexpr>f  sM        _E  _Elm_gde_g_g  _E  _E  _E  _E  _E  _Er   u   (身体的小提醒:r   u   (你正赶往u2   ,快到了——顺带想好到了先做什么。)u   现在,就以u:   的身份,对眼前这一切自然地反应。输出 JSON:u   对质u   投票iX  i  )"r5   r   r   
SELF_GUIDEr   INFERENCE_RULE
ACTION_DOCr   rC   
KILLER_DOCr   rV   rO   rP   rZ   rR   r  rS   r\   r]   rW   r[   rT   getattrrL   rX   r   r   rd   rf   re   rg   rU   rc   )
r~   r  	sys_partssysr   rblast_spinnergbr  s
             r   r  zCognitiveMind._compose_action9  sJ   >dh>>4+<>>@RT^
<	> 	)Z(((kk)$$ ]J$*JJJJK: 	PHH-

4:0F0FFNOOO> 	=%%dn55BHH85::dn;U;UUfhYpY]`bYbYbnpqrrrrHH;<<<; 	fHH4tyy@d@dSWS^_a_b_bSc@d@d@d7d7ddeee: 	pHH?$))KnKn^b^hikilil^mKnKnKnBnBnnooo< 	yHHFRwRweieqrtruruevRwRwRwIwIwwxxx= 	WHH(4994U4Ut}4U4U4U+U+UUVVV> 	IHH,sxx/G/GGHHH? 	1HHTYYt//000$r22 	;
T)GD/1,M,MMQXXXHH9W999:::; 	8LL666777 	LL= 	JLL.$-1H1HHIII 	@HH+dii.>.>>??? 	(HHT&''' 	FHHRUYU^U^  _E  _Equ  rD  _E  _E  _E  VE  VE  E  F  F  F> 	%HHT^$$$ 	+HHT)***? 	OHH+chht.G.GG#MNNN= 	hHHfT]fffggg	eeeefff4=(FX-FFKKNND$+?33C@@r   c                `    |                      |          \  }}|                     |||          S r
  )r  r  )r~   r  r   r   s       r   _decide_dialoguezCognitiveMind._decide_dialoguet  s1    --d33!!&$555r   c                   d                     d| j         d| j         | j        d|j         d|j         d|j         dt          t          g          }g |j	        pg }d | j
        pg D             d d	         }|r.|                    d
d                     |          z   dz              |j        r|                    |j        dz              |j        r|                    |j        dz              |j        r|                    |j        dz              |j        dz  }|dk    s|dk     r|                    d           |j        r8|                    dd                     |j        dd                    z              |j        r>|j        t'          |j        dz            k    r|                    d|j         d           |dg|j        dz  }|d                     |          fS )Nr   r   r   u   现在u   ,你在u   和u3   交谈。口语、简短、符合身份与心机。c                P    g | ]#}|                     d           dk    |d         $S )r   r   r   )r   r   s     r   r:   z3CognitiveMind._compose_dialogue.<locals>.<listcomp>  s0    VVVAEE(OOv<U<U1V9<U<U<Ur   r1   u   (你心里还惦记着:r   u1   ——聊到想聊的,想抽身就 leave=true。)u]   (若这由头值得一试,别耗在这场闲聊里——leave=true 抽身去赴约/查看。)uD   (若这场谈话无助于眼下这一幕,礼貌收场,leave=true。)u>   (若这场谈话无助于你的幕,礼貌收场,leave=true。)   g     7@g      @u'   (夜已极深,人人都撑着倦意。)u   你确切知道的事:r  g?u   (这场已经聊了 u    句了。)u   对话至今:u   你接话(JSON):r   )r   r5   r   r   rN   rO   r`   r   DIALOGUE_DOCrT   r   rC   re   rg   rd   rL   r\   rb   ra   r   r^   )r~   r  r)  r   pendingr  s         r   r  zCognitiveMind._compose_dialoguey  sG   kk5TX55$"3559T_ 9 9TZ 9 9D<N 9 9 9
   +4?(b*VVtz'7RVVVWYXYWYZ 	~LL2SXXg5F5FFI||}}}> 	KLL  +J  J  K  K  K 	xLL-0vvwww 	o LL*-mmnnnJO99CLLBCCC: 	OLL1CHHTZ_4M4MMNNN 	SD$8C@TW[@[<\<\$\$\LLQ0DQQQRRR/FDMF3EFFDIIe$$$$r   r   Fr6   r7   
int | Nonec                >   t          j                    }d}	 |rd|ini } | j        j        d|dd|dgfddd||d	|}n8# t          $ r+}	t
                              d
| j        |	           Y d }	~	nd }	~	ww xY wt          j                    |z
  }
t          |          t          |          z   }t          
                    |
| j        |||t          |          f           |
t          k    r2t
                              d|
| j        |||t          |                     |S )Nz{}r   r   )roler   r   g333333?   r   )temperaturetimeoutnum_retries_tag	_thinkingu   [%s] LLM 调用失败:%su.   [慢LLM %.1fs] %s tag=%s think=%s in=%d out=%d)time	monotonicr   complete	Exceptionloggerwarningr5   r*   r   rC   SLOW_CALL_S)r~   r   r   r6   r7   r   t0r9   kwr   dtin_charss               r   r   zCognitiveMind._call  s`   ^	D/9A,
++rB $$(#"v66TX8Y8YZ^ "!#QV^ ^Z\^ ^CC  	D 	D 	DNN5txCCCCCCCC	D^"v;;T*TXsE8SXXFGGGNNKRQUQY[^`egoqtuxqyqyzzz
s   )A 
A6!A11A6r9   c                8   t          |          }|                    d          pi }|                    d          pi }	 t          |                    dd          pd          }n# t          t          f$ r d}Y nw xY w|                    d          }t          t          |                    dd          pd          t          |                    d	d                    t          |                    d
d                    p| j        t          t          |t                    r|                    dd          nd          t          t          |t                    r|                    dd          n|pd          t          |                    dd          pd          t          t          |t                    r|                    dd          nd          t          t          |t                    r|                    dd          nd          t          dt          d|                    t          |t                    r|nd t          |                    d          t                    r"|d         rd |d         D             d d         nd |          S )Nrr   actionrw   
   rv   rz   ro   r_   rp   rX   tor   rs   r   argg       @goals_replanc                ,    g | ]}t          |          S r   r   r   r4   s     r   r:   z.CognitiveMind._to_decision.<locals>.<listcomp>  s    666qCFF666r   r2   )ro   rp   rX   rq   rr   rs   rt   ru   rw   rz   r{   r|   )r   r   rK   r   r   rn   rM   rX   r   r   r)   r   r@   )r~   r9   r   spactrw   gus          r   r  zCognitiveMind._to_decision  s_   S!!UU8__"eeHoo#	AEE)R006B77GG:& 	 	 	GGG	UU=!!quuXr**0b11i,,--c!%%":M:M6N6N6]RVR]jT.B.BJ"&&r***KKZD-A-AOrvvfb)))rxRPPi,,233:c43H3HPCGGFB///bQQC1F1FN3775"---BOOSw//00(T22<!%%//66W;<^;LW66An$5666rr::RV   	s   %A% %A;:A;rS  r   c                   | j         sdS 	 t          |                    dd                    dz
  }n# t          t          f$ r Y dS w xY wd|cxk    rt          | j                   k     rn dS t          |                    dd                                                    }|dv r|| j         |         d<   |                    d          r/t          |d                   dd	         | j         |         d<   dS dS dS )
u3   把决策里的目标进度自评落到清单上。Nindexr   r   r   r_   )r   doingr   blockedr      )r   r   r   r   r   r*   rM   r   )r~   rS  idxr   s       r   apply_goal_updatezCognitiveMind.apply_goal_update  s   z 	F	bffWa(())A-CC:& 	 	 	FF	%%%%c$*oo%%%%%%"--..4466F===,2
3)vvf~~ ?*-bj//#2#*>
3''' &%? ?s   &2 AAstepsc                    d | j         pg D             dd         }d |D             dd         }|r||z   | _         dS dS )uu   局势剧变时重排分目标:终极动机(persona)不变,保留近期已达成的成就,换上新的行动计划。c                *    g | ]}|d          dk    |S )r   r   r   r   s     r   r:   z.CognitiveMind.apply_replan.<locals>.<listcomp>  s&    GGGa81F1F1F1F1Fr   Nc                v    g | ]6}t          |                                          #t          |          d dd7S r   )rM   r   rP  s     r   r:   z.CognitiveMind.apply_replan.<locals>.<listcomp>  sC    aaaARUVWRXRXR^R^R`R`a#a&&FB??aaar   r2   )r   )r~   r[  r   freshs       r   apply_replanzCognitiveMind.apply_replan  se    GGDJ,"GGGLaaaaabdcdbde 	&DJJJ	& 	&r   )r5   rM   r   rM   r   rx   r   rM   r   rM   r   r   )r   r   )r   r   )r   r   )r   rM   r   rM   r   rQ   r   rM   r
  )rN   rM   r   r   )rN   rM   r   r   )r   rM   r   rM   r   r   )rR   rQ   r   rM   )r  rJ   r   rn   )r   rM   r   rM   r  rx   r   r   r  rJ   r   rn   )r   rM   r   rM   r  rJ   r   rn   )r  rJ   r   r  )r  rJ   r   r   )r   FN)r   rM   r   rM   r6   rM   r7   rx   r   r5  r   rM   )r9   rM   r   rn   )rS  r   r   r   )r[  rQ   r   r   )rh   ri   rj   rk   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r/  r  r   r  rZ  ra  r   r   r   r   r      s       ss   ,	= 	= 	= 	=r r r r9 9 9 9< < < <
W W W W    .    # # # #	V 	V 	V 	VF F F F& & & &
a a a a8A 8A 8A 8Av6 6 6 6
 %  %  %  %D LQ'+    (   .? ? ? ?& & & & & &r   r   mbtic                    | pd                                 }|dd         dk    rdnd|dd         dk    rd	nd
|dd         dk    rdnd|dd         dk    rdndg}dd                    |          z   dz   S )uR   MBTI → 确定性行为倾向(G19):同型号稳定同倾向,不靠每次采样。XXXXr   r   Eu7   有人作伴更安心,倾向结伴行动、当众表达u4   独处不慌,惯于单独行动、观察多于表达r!   r   u$   只信亲眼所见的细节与实证u.   善于从蛛丝马迹联想全局,直觉先行r1   Tu+   就事论事,决断冷静甚至显得无情u.   顾及人情,决断易被情感与关系牵动r2   Ju(   凡事要有计划与掌控,讨厌变数u   随机应变,走一步看一步u   【性格倾向】r   r   )upperr   )rc  r   r-   s      r   mbti_traitsrj    s    	  AEFqsVs]]AA  YO23AaC&C--..Eu9:1Q3355L|67!fmm22Ij		A  #((1++-55r   c                v   g }t          | dd          pd}|r|                    d|z              |                    | j         d| j         d| j         dt          | dd                      |                    t          t          | dd                               t          | d	d          pd}|r|                    d
|            t          | dd          pd}|r|                    d|            t          | dd          pd}|r|                    d|            d                    |          S )ug   把 character manifest 压成人设卡(drive 置顶,secret/role 是私有知识,只进本人 prompt)。driver_   uk   【你的终极目的(贯穿今夜、永不改变;下面一切计划/任务都只是达成它的手段)】
u   岁,z,MBTI r   	backstoryrc  secretu&   【你的秘密(绝不轻易示人)】r7  u'   【你的真实身份与行动准则】knowsuB   【你知道的关键内情(可立刻行动,别人未必知情)】r   )r'  rC   age
occupationrc  rj  r   )cmr   rl  rn  r7  ro  s         r   persona_card_from_manifestrs    s|   EB$$*E M  D  GL  L  	M  	M  	M	LLBF____RW__[Z\A]A]__```	LLWR4455666R2&&,"F HFfFFGGG2vr""(bD GEtEEFFFB$$*E caZ_aabbb99Ur   snapshot_timeweatherpower_onrx   deathsrQ   c                &    t          | |||          S r
  r   )rt  ru  rv  rw  s       r   build_dynamicry    s    M7HfEEEr   )r   r   )r   rM   r   r   )rc  rM   r   rM   rb  )
rt  rM   ru  rM   rv  rx   rw  rQ   r   rM   )#rk   
__future__r   r   r   r>  collectionsr   dataclassesr   r   genesis.obs.logging_setupr   genesis.runtime.bulletinr	   genesis.runtime.somar
   rB  r   rl   rD  rH   r   r$  r#  r%  r&  r3  rJ   rn   r   r   rj  rs  ry  r   r   r   <module>r     s"     # " " " " "  				        ( ( ( ( ( ( ( ( 0 0 0 0 0 0 5 5 5 5 5 5 % % % % % %	'	(	( %t$$$ $ $ $ $   *{	d d @
"8
B        : U U U U U U U U*   u& u& u& u& u& u& u& u&p		6 	6 	6 	6   (F F F F F Fr   