
    Si2                       d dl mZ d dlmZmZ d dlZd dlmZmZm	Z	m
Z
 d dlZd dlZddlmZmZmZ ddlmZmZ ddlmZmZ e G d	 d
             Ze G d d             Ze G d d             Ze G d d             Z G d d      Zy)    )annotations)	dataclassfieldN)AnyDictListOptional   )	DAGParser
ParseError	PlanGraph)	LLMClientLLMClientError)SymbolicVerifierVerificationResultc                  V    e Zd ZU dZded<   dZded<   dZded<    ed	 
      Zded<   y)RetryConfig   intmax_attemptsd   
backoff_msTbooltemperature_escalationc                 
    g dS )N)333333?g      ?gffffff? r       =/home/nelsen/Projects/HRI/orchestrator/src/planner/planner.py<lambda>zRetryConfig.<lambda>   s    o r   default_factoryzList[float]temperaturesN)	__name__
__module____qualname__r   __annotations__r   r   r   r#   r   r   r   r   r      s1    L#J#'D' %6M NL+Nr   r   c                  n    e Zd ZU ded<   ded<   ded<   ded<   dZd	ed
<   dZd	ed<    ee      Zded<   y)PlanContextstrrobot_idcurrent_locationr   battery_levelz	List[str]available_actionsNOptional[str]venue_idmission_typer!   Dict[str, Any]additional_constraints)	r$   r%   r&   r'   r0   r1   r   dictr3   r   r   r   r)   r)      s=    M  "Hm""&L-&-24-HNHr   r)   c                  :    e Zd ZU ded<   ded<   ded<   dZded<   y	)
PlanRequestr*   intentr)   context
request_idi0u  r   
timeout_msN)r$   r%   r&   r'   r:   r   r   r   r6   r6   !   s    KOJr   r6   c                  f    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   dZded<   dZded<   y)
PlanResultr   successzOptional[Dict[str, Any]]planis_safe_noopr   attemptstotal_latency_msr*   trace_idNr/   failure_reasonzOptional[VerificationResult]last_violation)r$   r%   r&   r'   rC   rD   r   r   r   r<   r<   )   s8    M
""MM$(NM(37N07r   r<   c                  r    e Zd Z	 	 	 	 d
	 	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZ	e
dd	       Zy)PlannerServiceNc                    |xs
 t               | _        |xs
 t               | _        |xs
 t	               | _        |xs
 t               | _        y )N)r   
llm_clientr   
dag_parserr   verifierr   retry_config)selfrH   rI   rJ   rK   s        r   __init__zPlannerService.__init__6   s?     %3	$3	 6$4$6(9KMr   c                   t        j                         }|j                  xs t        j                         j
                  }d }d }t        | j                  j                        D ]K  }| j                  |      }	 | j                  j                  |j                  |j                  ||      }| j"                  j%                  ||j                        }
|
j&                  s,| j)                  |
j*                        }| j-                          | j.                  j1                  |
j2                  |j                        }|}|j4                  r;t        d|
j2                  j6                  d|dz   | j!                  |      |d d       c S | j.                  j9                  |      }| j-                          N | j;                  |j                  || j                  j                        }t        d|d| j                  j                  | j!                  |      |d	|      S # t        $ r4}	t        dd d|dz   | j!                  |      |d|	 d       cY d }	~	c S d }	~	ww xY w)
Nr7   r8   feedbacktemperatureFr
   zllm_unavailable: )r=   r>   r?   r@   rA   rB   rC   rD   expected_intentT)r@   max_retries_exceeded)time	monotonicr9   uuiduuid4hexrangerK   r   _temperature_for_attemptrH   generater7   r8   r   r<   _elapsed_msrI   parseok_format_parse_errorerror_sleep_backoffrJ   verify
plan_graphpassedr>   format_feedback_build_safe_noop_plan)rL   request
start_timerB   last_feedbackrD   attemptrQ   raw_jsonexcparse_resultverification	safe_noops                r   r>   zPlannerService.planB   s'   ^^%
%%9)9)9'+7;T..;;< *	"G77@K??33">>#OO* +	 4 $  ??007>>0ZL?? $ 8 89K9K L##%==//0G0GYL)N""! %0055!&$q[%)%5%5j%A%#'#'	 	 !MM99,GM!U*	"X ..w~~}W[WhWhWuWu.v	&&33!--j91)	
 		
I " 
!!!&$q[%)%5%5j%A%%6se#<#'	 	
s   :3H	I$'IIIc                   | j                   j                  ||t        j                  |      | j                  j
                  d         }| j                  j                  ||      }|j                  s$t        | j                  |j                              | j                  j                  |j                  |      }|j                  s$t        | j                  j!                  |            |j                  S )NrO   rR   )rH   r\   jsondumpsrK   r#   rI   r^   r_   
ValueErrorr`   ra   rJ   rc   rd   re   rf   )rL   r7   r8   rP   rl   rn   ro   s          r   refine_planzPlannerService.refine_plan   s    ??++ZZ)))66r:	 , 
 ,,Xv,NT55l6H6HIJJ}}++L,C,CWM""T]]::<HII&&&r   c                    |sy|j                   g}|j                  r|j                  d|j                          |j                  r|j                  d|j                          dj	                  |      S )Nz"Parsing failed with unknown error.z	DETAILS: zFIX: 
)messagedetailsappendhintjoin)rL   ra   partss      r   r`   z"PlannerService._format_parse_error   s^    7==LL9U]]O45::LL5-.yyr   c                    dt        j                         j                  d d  }d}||d|ddddd	|id
dddddgd||xs d|ddgdS )Nplan_safe_noop_   zaI could not generate a safe plan for your request. Please try rephrasing or contact the operator.
SEQUENTIALs1	EXECUTIONrobotSPEAKry   )step_idtype
agent_roleactionparamss2ALERT_OPERATORplan_generation_failed )reasonoriginal_intentrD   r@   )r   r   r   r   dependenciesr   )r7   response_textworkflow_topologyplan_idsteps)rW   rX   rY   )rL   r7   rj   r@   r   ry   s         r   rg   z$PlannerService._build_safe_noop_plan   s    #DJJL$4$4Ra$8#9:= 	
 $!-  $'")%('2  $'").%)F":+1*7*=2$,	
 	
r   c                    | j                   j                  }|sy| j                   j                  s|d   S |t        |t	        |      dz
           S )Nr   r   r
   )rK   r#   r   minlen)rL   rk   tempss      r   r[   z'PlannerService._temperature_for_attempt   sK    !!..  778OS#e*q.122r   c                    | j                   j                  dk  ry t        j                  | j                   j                  dz         y )Nr   g     @@)rK   r   rU   sleep)rL   s    r   rb   zPlannerService._sleep_backoff   s6    ''1,

4$$//&89r   c                H    t        t        j                         | z
  dz        S )Ni  )r   rU   rV   )ri   s    r   r]   zPlannerService._elapsed_ms   s    DNN$z1T9::r   )NNNN)
rH   zOptional[LLMClient]rI   zOptional[DAGParser]rJ   zOptional[SymbolicVerifier]rK   zOptional[RetryConfig]returnNone)rh   r6   r   r<   )r7   r*   r8   r)   rP   r2   r   r   )ra   zOptional[ParseError]r   r*   )r7   r*   rj   r/   r@   r   r   r2   )rk   r   r   float)r   r   )ri   r   r   r   )r$   r%   r&   rM   r>   rv   r`   rg   r[   rb   staticmethodr]   r   r   r   rF   rF   5   sy     +/*./3.2
:'
: (
: -	
:
 ,
: 

:<
|' !
F3:
 ; ;r   rF   )
__future__r   dataclassesr   r   rs   typingr   r   r   r	   rU   rW   rI   r   r   r   rH   r   r   symbolic_verifierr   r   r   r)   r6   r<   rF   r   r   r   <module>r      s    " (  , ,   8 8 1 C O O O I I I    8 8 8V; V;r   