
    ^jQ#                        d Z ddlmZ ddlZddlmZ ddlZddZddZ	ddZ
ddZd	\  ZZdd
ZddZddZddZee	e
eeeedZ eh d      ZddZ ej,                  d      ZddZddZd dZg dZy)!zThis file contains the parsers used by chat response parsing. Each parser takes a chunk of captured text
and parses it into a single key in the output message dictionary. Functions are generally boilerplate.    )annotationsN)Anyc                J    |j                  dd      r| j                         S | S )NstripT)getr   textargss     z/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/utils/chat_parsing/content_parsers.py_textr      s     88GT24::<<<    c                ,    t        t        | |            S N)intr   r   s     r   _intr      s    uT4 !!r   c                ,    t        t        | |            S r   )floatr   r   s     r   _floatr   !   s    tT"##r   c                :    t        | |      j                         dv S )N)true1)r   lowerr   s     r   _boolr   %   s    t""$55r   )c           	        |j                  dg       }|j                  dd      }|rt        | v st        | v rt        d      | }g |D ]`  \  }}t	        j
                  |      dz   t	        j
                  |      z   }dfd}t	        j                  |||t        j                        }b |rt	        j                  dd	|      }t              D ]8  \  }	}
|j                  t         |	 t         t        j                  |
            }: 	 t        j                  |      S # t        j                  $ rS}|j                  d
      rt        | |      cY d}~S || k(  rt        d| d|       |t        d| d|d|       |d}~ww xY w)a  JSON parser with optional dialect knobs for LLM-emitted quirks.

    `args`:
      - `unquoted_keys` (bool): quote bare-identifier keys before parsing.
      - `string_delims` ([[open, close], ...]): strings delimited by these
        custom markers are pre-extracted, then restored as standard JSON strings.
      - `allow_non_json` (bool): return stripped text if parsing fails.
    string_delimsunquoted_keysFzSjson: input contains reserved sentinel characters (\x01/\x02); cannot parse safely.z(.*?)c                |    j                  | j                  d             t         t              dz
   t         S )N   )appendgroup	_LAX_OPENlen
_LAX_CLOSE)mcaptureds    r   _capturez_json.<locals>._captureB   s4    OOAGGAJ'[X!2 3J<@@r   flagsz(?<=[{,])(\w+):z"\1":allow_non_jsonNz5json parser could not parse region as JSON.
Content: z
Error: z:json: could not parse after dialect transforms.
Original: z
Transformed: )r&   r   returnstr)r   r#   r%   
ValueErrorreescapesubDOTALL	enumeratereplacejsondumpsloadsJSONDecodeErrorr   )r	   r
   r   r   workingopen_dclose_dpatternr(   iser'   s               @r   _jsonr@   .   s    HH_b1MHH_e4M)t+zT/ApqqGH( F))F#h.71CC	A &&(G299EF &&+Xw?(# P1//YKs:,"?AOP
zz'"" 88$%t$$d?UVZU]]fghfijkqrr{)A3H
 	s$   D! !F4FF,FFc                d    || S t        | |j                  dd      |j                  di             S )Nnamer	   r
   )parse_contentr   )rawvalue_parsers     r   
_sub_parserF   [   s8    
l..vv>@P@PQWY[@\]]r   c                   |j                  d      }|t        d      |j                  d      }|j                  dd      }i }t        j                  || t        j                        D ]  }|j                         }|j                  d      }|t        d|       t        |j                  d	d
      |      }	||v r3|r1t        ||   t              s	||   g||<   ||   j                  |	       |	||<    |S )zParse shallow XML-ish tags into a dict. `tag_pattern` regex must have named
    groups `key` and `value`. Optional `value_parser` recurses; `merge_duplicates`
    collects duplicate keys into a list.tag_patternz1xml-inline: 'tag_pattern' content_arg is requiredrE   merge_duplicatesFr)   keyz@xml-inline: tag_pattern must have a named group 'key'. Pattern: value )
r   r.   r/   finditerr2   	groupdictrF   
isinstancelistr!   )
r	   r
   rH   rE   mergeoutr&   groupsrJ   rK   s
             r   _xml_inlinerT   a   s     ((=)KLMM88N+LHH'/EC[[d"))< jj;_`k_lmnn6::gr2LA#:%c#h-H:CHOOE"CH Jr   c                >   |j                  dd      }|j                  dd      }|j                  d      }i }| j                  |      D ]Q  }t        ||      }|r||vr|j                  |d      \  }}t        ||      t        ||      }}t        ||      ||<   S |S )z7Parse line-delimited `key<sep>value` pairs into a dict.line_sep
kv_sep:rE   r    )r   splitr   rF   )	r	   r
   rV   rX   rE   rR   linekvs	            r   	_kv_linesr^   {   s    xx
D)HXXh$F88N+LC

8$ -T4 vT)zz&!$1Q~uQ~1A|,A- Jr   )r	   r   r   boolr5   z
xml-inlinezkv-lines>   r   r_   r	   r   c                     t        |   | |      S r   )CONTENT_PARSERS)r	   rB   r
   s      r   rC   rC      s    4 t,,r   z	\{(\w+)\}c           	        t        | t              r.| j                         D ci c]  \  }}|t        ||       c}}S t        | t              r| D cg c]  }t        ||       c}S t        | t
              s| S t        j                  |       }|s| S |j                  d      }||vrt        d| dt        |             ||   S c c}}w c c}w )ztRecursively walk a transform template, which is used to restructure
    parsed output into the actual shape we want.r    ztransform placeholder '{z}' is not defined. Available: )rO   dictitems_apply_transformrP   r-   _PLACEHOLDER	fullmatchr"   KeyErrorsorted)	transformscoper\   r]   wholerJ   s         r   re   re      s     )T":C//:KL$!Q#Au--LL)T"4=>q E*>>i%""9-E
++a.C
%23%7VW]^cWdVefgg: M>s   CCc                J   t        |t              r"|j                         D ]  }t        | |        yt        |t              r|D ]  }t        | |        yt        |t
              syt        j                  |      r't        j                  |      st        |  d|d      yy)a$  Walk a transform template and reject any string that mixes a `{name}`
    placeholder with literal text. Only whole-string placeholders (e.g.
    `"{content}"`) and plain literals are supported. Called from the template
    loader so authors get a clear error at load time, not at parse time.Nz: transform string z mixes a {placeholder} with literal text. Use either a whole-string placeholder (e.g. "{content}") or a plain literal; string interpolation is not supported.)
rO   rc   valuesvalidate_transform_stringsrP   r-   rf   searchrg   r.   )rk   rj   r]   s      r   ro   ro      s    
 )T"!!# 	1A&ua0	1)T" 	1A&ua0	1i%9%l.D.DY.Og( 65 5
 	
 /P%r   c           	        t        | |j                  |j                        }|j                  |S |j                  rt        |t              s/t        d|j                   dt        |      j                   d      g }|D ]j  }t        |t              s/t        d|j                   dt        |      j                   d      |j                  t        |j                  i ||             l |S t        |j                  i |d|i      S )a~  Run `body` through the field's content parser, then optionally apply the
    transform template. When `transform_each` is set, the parsed content must
    be a list and the template is applied to each element (with the element's
    keys unpacked into the template scope, alongside any regex captures).

    `field` is a `spec.Field`; typed via duck-typing to avoid a cyclic import.zField 'z@': transform_each requires the parsed content to be a list, got .z?': transform_each requires each list element to be a dict, got content)rC   rs   content_argsrj   transform_eachrO   rP   r.   rB   type__name__rc   r!   re   )bodyfieldcapturesrK   rR   items         r   process_fieldr|      s    $u/A/ABE%&%** &E{++,A/   	PDdD) ejj\ *:../q2  JJ'9MH9M9MNO	P 
EOO-K-K)U-KLLr   )ra   STREAMABLE_PARSERSrC   r|   ro   )r	   r-   r
   rc   r,   r-   )r	   r-   r
   rc   r,   r   )r	   r-   r
   rc   r,   r   )r	   r-   r
   rc   r,   r_   )r	   r-   r
   rc   r,   r   )rD   r-   rE   zdict | Noner,   r   )r	   r-   r
   rc   r,   rc   )r	   r-   rB   r-   r
   rc   r,   r   )rj   r   rk   rc   r,   r   )rk   r-   rj   r   r,   None)rx   r-   rz   rc   r,   r   )__doc__
__future__r   r5   typingr   regexr/   r   r   r   r   r#   r%   r@   rF   rT   r^   ra   	frozensetr}   rC   compilerf   re   ro   r|   __all__ r   r   <module>r      s   j #   ="$6 ' 	:*Z^4$  ?@ - rzz,'$
.M8r   