o
    پi                     @   s   d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ G dd deZd	d
 Zdd ZG dd de
ZG dd dZdS )zTracing a program.    N)AnyDictListOptional)BaseBackend)ProgramStateProgramStateGroup)SglArgumentSglConstantTextSglExprSglExprListSglForkSglGenSglGetForkItemSglRoleBegin
SglRoleEnd	SglSelectSglVariableSglVarScopeBeginSglVarScopeEndc                   @   s   e Zd ZdS )StopTracingN)__name__
__module____qualname__ r   r   F/home/ubuntu/.local/lib/python3.10/site-packages/sglang/lang/tracer.pyr      s    r   c              
   C   s   dd | j D }|}|| j t||dd}z t| | j|fi ||_W d    n1 s1w   Y  W n ttt	fyC   Y nw d}|
 D ]}t|trW||j7 }qJ |S |S )Nc                 S   s   i | ]}|t |d qS Nr	   .0namer   r   r   
<dictcomp>   s    z-extract_prefix_by_tracing.<locals>.<dictcomp>Tonly_trace_prefix )	arg_namesupdatebind_argumentsTracerProgramStateTracingScopefunc	ret_valuer   	TypeErrorAttributeErrorflatten_nodes
isinstancer
   value)programbackenddummy_arguments	argumentstracerprefixexprr   r   r   extract_prefix_by_tracing   s$   

r8   c                    s   |d u rt  } fdd| jD } |  | j t| dd}t| | j|fi  |_W d    |S 1 s=w   Y  |S )Nc                    s    i | ]}| vr|t |d qS r   r   r   r4   r   r   r!   <   s
    
z!trace_program.<locals>.<dictcomp>Fr"   )r   r%   r&   r'   r(   r)   r*   r+   )r1   r4   r2   r3   r5   r   r9   r   trace_program6   s   



r:   c                   @   s   e Zd Zdd Zd#dedeee  fddZd	efd
dZ	d	efddZ
dd ZdefddZdefddZdefddZdefddZdefddZdefddZdd Zdd  Zd!d" ZdS )$r(   c                 C   s   t  j| _|| _|| _|| _t|dr|j| _g | _	d | _
i | _d | _g | _d | _| j | _g | _t }|d urB||  d S d S )Nendpoint)uuiduuid4hexpidr2   r4   r#   hasattrr;   nodes	last_node	variablesr+   	messages_cur_roleget_chat_templatechat_templatechild_statesr)   get_current_scopeadd_child_state)selfr2   r4   r#   	cur_scoper   r   r   __init__L   s$   
zTracerProgramState.__init__   Nsizeposition_ids_offsetc                    s   |dksJ  j rt t|} j|_ fddt|D }t|D ]*}t|}||_||| _t j|| _t	 j
|| _
 j|| _ j|| _q#t| }|S )NrN   c                    s   g | ]}t  j j jqS r   )r(   r2   r4   r#   )r   _rK   r   r   
<listcomp>u   s    z+TracerProgramState.fork.<locals>.<listcomp>)r#   r   r   rB   	prev_noderanger   dictrC   listrD   rE   rG   r   )rK   rO   rP   	fork_nodestatesinodestate_groupr   rR   r   forkl   s$   


zTracerProgramState.forkotherc                 C   s   | j | | j|_|| _d S r   )rA   appendrB   rT   rK   r^   r   r   r   _append_node   s   
zTracerProgramState._append_nodec                 C   s   t |tr	t|}| j|_t |tr| | | S t |tr%| | | S t |tr1| | | S t |t	rC|j
D ]}| | q9| S t |trO| | | S t |tr[| | | S t |trg| | | S t |trs| | | S | jryt | | | S r   )r/   strr
   r?   _execute_fillr   _execute_genr   _execute_selectr   	expr_list_executer   _execute_role_beginr   _execute_role_endr   _execute_var_scope_beginr   _execute_var_scope_endr#   r   ra   )rK   r^   xr   r   r   rg      s@   














	


zTracerProgramState._executec                 C   s   |  | | S r   )rg   r`   r   r   r   __iadd__   s   
zTracerProgramState.__iadd__r7   c                 C   s    t |tr	t|}| | d S r   )r/   rb   r
   ra   )rK   r7   r   r   r   rc      s   
z TracerProgramState._execute_fillc                 C   F   |j d ur|j ndtt| j }t||d}|| j|< | | d S )Ngen_sourcer    rb   lenrC   r   ra   rK   r7   r    new_noder   r   r   rd      s   "
zTracerProgramState._execute_genc                 C   rn   )Nselect_rp   rr   rt   r   r   r   re      s
    
z"TracerProgramState._execute_selectc                 C   s   | j d u s	J dt| jdkr.|jdkr.| jj}|r.| td | | | 	t
d |j| _ | j|j| j\}}| | d S )NzNested roles are not allowed.r   system)rE   rs   rD   rolerG   default_system_promptrh   r   rc   ri   r   get_prefix_and_suffix)rK   r7   default_systemr6   suffixr   r   r   rh      s   
z&TracerProgramState._execute_role_beginc                 C   s>   | j |j| j\}}| | | j|jdd d | _d S )Nr$   )rx   content)rG   rz   rx   rD   rc   r_   rE   )rK   r7   r6   r|   r   r   r   ri      s   

z$TracerProgramState._execute_role_endc                 C   s    t |j| jd}|| j|j< d S )Nrp   )r   r    rB   rC   )rK   r7   ru   r   r   r   rk      s   z)TracerProgramState._execute_var_scope_endc                 C   s2   | j |d }|d ur|S | j| }t|j|jS r   )r4   getrC   r   r    rq   )rK   r    retvr   r   r   get_var   s
   
zTracerProgramState.get_varc                    s*    fddg  | j D ]}| q S )Nc                    s0   t | tr| jD ]}| qd S  |  d S r   )r/   r   rf   r_   )curchildr   traverser   r   r      s
   


z2TracerProgramState.flatten_nodes.<locals>.traverse)rA   )rK   rl   r   r   r   r.      s
   

z TracerProgramState.flatten_nodesc                 C   s   d S r   r   rR   r   r   r   __del__   s   zTracerProgramState.__del__)rN   N)r   r   r   rM   intr   r   r]   r   ra   rg   rm   r
   rc   r   rd   r   re   r   rh   r   ri   r   rk   r   r.   r   r   r   r   r   r(   K   s     r(   c                   @   sH   e Zd ZdZdefddZdd Zdd Zed	d
 Z	defddZ
dS )r)   Ntracer_statec                 C   s   || _ tj| _d S r   )r   r)   rL   
last_scope)rK   r   r   r   r   rM     s   zTracingScope.__init__c                 C   s
   | t _| S r   r)   rL   rR   r   r   r   	__enter__  s   zTracingScope.__enter__c                 C   s   | j t_d S r   )r   r)   rL   )rK   exc_type	exc_value	tracebackr   r   r   __exit__  s   zTracingScope.__exit__c                   C   s   t jS r   r   r   r   r   r   rI     s   zTracingScope.get_current_scopestatec                 C   s0   | }|d ur|j j| |j}|d usd S d S r   )r   rH   r_   r   )rK   r   rL   r   r   r   rJ     s
   zTracingScope.add_child_state)r   r   r   rL   r(   rM   r   r   staticmethodrI   rJ   r   r   r   r   r)     s    
r)   ) __doc__r<   typingr   r   r   r    sglang.lang.backend.base_backendr   sglang.lang.interpreterr   r   sglang.lang.irr	   r
   r   r   r   r   r   r   r   r   r   r   r   	Exceptionr   r8   r:   r(   r)   r   r   r   r   <module>   s    < 7