
    ȯeiY                    z   U d dl mZ d dl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mZmZmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lm Z m!Z! erd dl"m#Z# ejH                  ejJ                  ejL                  ejN                  ejP                  fZ)de*d<    G d de+e         Z, G d d      Z-y)    )annotationsN)ChainMapUserDictUserList)AsyncGeneratorCallable	Generator	ItemsViewIterableKeysView
ValuesView)StringIO)TYPE_CHECKINGAnyFinalcast)dataframe_util	type_util)StreamlitAPIException)gather_metrics)is_mem_address_strmax_char_sequence)DeltaGeneratorzFinal[tuple[type[Any], ...]]
HELP_TYPESc                      e Zd Zy)StreamingOutputN)__name__
__module____qualname__     Z/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/streamlit/elements/write.pyr   r   ;   s    r!   r   c                  p    e Zd Z ed      dd	 	 	 	 	 d
d       Z ed      dddd       Zedd	       Zy)
WriteMixinwrite_streamN)cursorc                  	
 t        |t              st        j                  |      rt	        dt        |       d      |xs d}d	d
t               d	
fd}t        j                  |      st        j                  |      r |       }t        j                  |      rt        j                  |      }	 t        |       |D ]0  }t        j                  |      r\	 t!        |j"                        dk(  s|j"                  d   j$                  d}n'|j"                  d   j$                  j&                  xs d}t        j*                  |d
      r	 |j&                  xs d}t        |t              rA|sd}	s| j,                  j/                         	d}
|z  
	j1                  
|rdn|z          t3        |      r |         |         |        | j5                  |       j7                  |       3  |        syt!              dk(  rt        d   t              rd   S S # t        $ r}t	        dt        |       d      |d}~ww xY w# t(        $ r}t	        d	      |d}~ww xY w# t(        $ r}t	        d      |d}~ww xY w)a  Stream a generator, iterable, or stream-like sequence to the app.

        ``st.write_stream`` iterates through the given sequences and writes all
        chunks to the app. String chunks will be written using a typewriter effect.
        Other data types will be written using ``st.write``.

        Parameters
        ----------
        stream : Callable, Generator, Iterable, OpenAI Stream, or LangChain Stream
            The generator or iterable to stream.

            If you pass an async generator, Streamlit will internally convert
            it to a sync generator. If the generator depends on a cached object
            with async references, this can raise an error.

            .. note::
                To use additional LLM libraries, you can create a wrapper to
                manually define a generator function and include custom output
                parsing.

        cursor : str or None
            A string to append to text as it's being written. If this is
            ``None`` (default), no cursor is shown. Otherwise, the string is
            rendered as Markdown and appears as a cursor at the end of the
            streamed text. For example, you can use an emoji, emoji shortcode,
            or Material icon.

            The first line of the cursor string can contain GitHub-flavored
            Markdown of the following types: Bold, Italics, Strikethroughs,
            Inline Code, Links, and Images. Images display like icons, with a
            max height equal to the font height. If you pass a multiline
            string, additional lines display after the text with the full
            Markdown rendering capabilities of ``st.markdown``.

            See the ``body`` parameter of |st.markdown|_ for additional,
            supported Markdown directives.

            .. |st.markdown| replace:: ``st.markdown``
            .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown


        Returns
        -------
        str or list
            The full response. If the streamed output only contains text, this
            is a string. Otherwise, this is a list of all the streamed objects.
            The return value is fully compatible as input for ``st.write``.

        Example
        -------
        You can pass an OpenAI stream as shown in our tutorial, `Build a \
        basic LLM chat app <https://docs.streamlit.io/develop/tutorials/llms\
        /build-conversational-apps#build-a-chatgpt-like-app>`_. Alternatively,
        you can pass a generic generator function as input:

        >>> import time
        >>> import numpy as np
        >>> import pandas as pd
        >>> import streamlit as st
        >>>
        >>> _LOREM_IPSUM = \"\"\"
        >>> Lorem ipsum dolor sit amet, **consectetur adipiscing** elit, sed do eiusmod tempor
        >>> incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
        >>> nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        >>> \"\"\"
        >>>
        >>>
        >>> def stream_data():
        >>>     for word in _LOREM_IPSUM.split(" "):
        >>>         yield word + " "
        >>>         time.sleep(0.02)
        >>>
        >>>     yield pd.DataFrame(
        >>>         np.random.randn(5, 10),
        >>>         columns=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
        >>>     )
        >>>
        >>>     for word in _LOREM_IPSUM.split(" "):
        >>>         yield word + " "
        >>>         time.sleep(0.02)
        >>>
        >>>
        >>> if st.button("Stream data"):
        >>>     st.write_stream(stream_data)

        ..  output::
            https://doc-write-stream-data.streamlit.app/
            height: 550px

        zI`st.write_stream` expects a generator or stream-like object as input not z3. Please use `st.write` instead for this data type. Nc                 ^    r* r' j                         j                         d dyyy)z#Write the full response to the app.Nr(   )markdownappend)stream_containerstreamed_responsewritten_contents   r"   flush_stream_responsez6WriteMixin.write_stream.<locals>.flush_stream_response   s=    
 !%5 ))*;<&&'89#' $&! &6 r!   zThe provided input (type: z^) cannot be iterated. Please make sure that it is a generator, generator function or iterable.r   a8  Failed to parse the OpenAI ChatCompletionChunk. The most likely cause is a change of the chunk object structure due to a recent OpenAI update. You might be able to fix this by downgrading the OpenAI library or upgrading Streamlit. Also, please report this issue to: https://github.com/streamlit/streamlit/issues.z)langchain_core.messages.ai.AIMessageChunka9  Failed to parse the LangChain AIMessageChunk. The most likely cause is a change of the chunk object structure due to a recent LangChain update. You might be able to fix this by downgrading the OpenAI library or upgrading Streamlit. Also, please report this issue to: https://github.com/streamlit/streamlit/issues.FT   returnNone)
isinstancestrr   is_dataframe_liker   typer   inspectisgeneratorfunctionisasyncgenfunction
isasyncgenr   async_generator_to_synciter	TypeErroris_openai_chunklenchoicesdeltacontentAttributeErroris_typedgemptyr*   callablewriter+   )selfstreamr&   
cursor_strr/   excchunkerr
first_textr,   r-   r.   s            @@@r"   r%   zWriteMixin.write_stream@   s   N fc"n&F&Fv&N'F|n %""  \r
26!#%4%6
	' &&v.'2L2LV2TXF f%66v>F	L  4	.E((/5==)Q.%--2B2H2H2P !# %a 0 6 6 > > D"   (ST	!MM/RE %%"
''+ww}}$!%J!U*! ))%zzJ %%'%'

5!&&u-i4	.l 	1$OA4F)L"1%% Q  	',T&\N ;[ [ 	$ & /f  & /f sI   9H,  AII3,	I5II	I0I++I03	J<JJrI   Funsafe_allow_htmlc                   t        |      dk(  r4t        |d   t              r! j                  j	                  |d          yg  j                  j
                  st        |      dkD  rt        d      d fd}|D ]t  }t        |t              rj                  |       &t        |t              r< |        |D ]/  }t        |      r |         |         j                  |       1 rt        |t              r# |         j                  j                  |       t        j                  |      r# |         j                  j                  |       t!        j"                  |      r$ |         j                  j%                  |       t        j&                  |      r$ |         j                  j)                  |       Ot        j*                  |d      r$ |         j                  j-                  |       t        j.                  |      r$ |         j                  j1                  |       t        j*                  |d      r$ |         j                  j3                  |       t        j4                  |      r$ |         j                  j7                  |       5t        j8                  |      r$ |         j                  j;                  |       nt        j<                  |      r$ |         j                  j?                  |       t        j@                  |      rIdd	l!m"}  |        |jG                  |      } j                  j7                  |jI                                t        |tJ        tL        tN        tP        tR        jT                  tV        tX        tZ        t\        t^        t`        f      s?t        jb                  |      s*t        jd                  |      st        jf                  |      r$ |         j                  ji                  |       t        jj                  |      r$ |         j                  jm                  |       t        |tn              r2 |         j                  j	                  |jq                                0ts        jt                  |      sUts        jv                  |      s@ts        jx                  |      s+ts        jz                  |      st        j*                  |d
      r |         j}                  |       t        |t~              st        j                  |      r$ |         j                  j                  |       ts        j                  |      r. |         j                  j                  t        d|             @rAt        j                  |d      r+ j                  j                  |j                                t        j                  |d      st        j                  |d      r$ |         j                  j%                  |       t        |      }t        |      r$ |         j                  j                  |       d|v r9t        dt        |d      dz         }	d|	z  }
j                  |
 d| d|
        Jt        |d      dz   }	d|	z  }
j                  |
 | |
        w  |        y)a  Displays arguments in the app.

        This is the Swiss Army knife of Streamlit commands: it does different
        things depending on what you throw at it. Unlike other Streamlit
        commands, ``st.write()`` has some unique properties:

        - You can pass in multiple arguments, all of which will be displayed.
        - Its behavior depends on the input type(s).

        Parameters
        ----------
        *args : any
            One or many objects to display in the app.

            .. list-table:: Each type of argument is handled as follows:
                :header-rows: 1

                * - Type
                  - Handling
                * - ``str``
                  - Uses ``st.markdown()``.
                * - dataframe-like, ``dict``, or ``list``
                  - Uses ``st.dataframe()``.
                * - ``Exception``
                  - Uses ``st.exception()``.
                * - function, module, or class
                  - Uses ``st.help()``.
                * - ``DeltaGenerator``
                  - Uses ``st.help()``.
                * - Altair chart
                  - Uses ``st.altair_chart()``.
                * - Bokeh figure
                  - Uses ``st.bokeh_chart()``.
                * - Graphviz graph
                  - Uses ``st.graphviz_chart()``.
                * - Keras model
                  - Converts model and uses ``st.graphviz_chart()``.
                * - Matplotlib figure
                  - Uses ``st.pyplot()``.
                * - Plotly figure
                  - Uses ``st.plotly_chart()``.
                * - ``PIL.Image``
                  - Uses ``st.image()``.
                * - generator or stream (like ``openai.Stream``)
                  - Uses ``st.write_stream()``.
                * - SymPy expression
                  - Uses ``st.latex()``.
                * - An object with ``._repr_html()``
                  - Uses ``st.html()``.
                * - Database cursor
                  - Displays DB API 2.0 cursor results in a table.
                * - Any
                  - Displays ``str(arg)`` as inline code.

        unsafe_allow_html : bool
            Whether to render HTML within ``*args``. This only applies to
            strings or objects falling back on ``_repr_html_()``. If this is
            ``False`` (default), any HTML tags found in ``body`` will be
            escaped and therefore treated as raw text. If this is ``True``, any
            HTML expressions within ``body`` will be rendered.

            Adding custom HTML to your app impacts safety, styling, and
            maintainability.

            .. note::
                If you only want to insert HTML or CSS without Markdown text,
                we recommend using ``st.html`` instead.


        Returns
        -------
        None

        Examples
        --------
        Its basic use case is to draw Markdown-formatted text, whenever the
        input is a string:

        >>> import streamlit as st
        >>>
        >>> st.write("Hello, *World!* :sunglasses:")

        ..  output::
            https://doc-write1.streamlit.app/
            height: 150px

        As mentioned earlier, ``st.write()`` also accepts other data formats, such as
        numbers, data frames, styled data frames, and assorted objects:

        >>> import streamlit as st
        >>> import pandas as pd
        >>>
        >>> st.write(1234)
        >>> st.write(
        ...     pd.DataFrame(
        ...         {
        ...             "first column": [1, 2, 3, 4],
        ...             "second column": [10, 20, 30, 40],
        ...         }
        ...     )
        ... )

        ..  output::
            https://doc-write2.streamlit.app/
            height: 350px

        Finally, you can pass in multiple arguments to do things like:

        >>> import streamlit as st
        >>>
        >>> st.write("1 + 1 = ", 2)
        >>> st.write("Below is a DataFrame:", data_frame, "Above is a dataframe.")

        ..  output::
            https://doc-write3.streamlit.app/
            height: 410px

        Oh, one more thing: ``st.write`` accepts chart objects too! For example:

        >>> import altair as alt
        >>> import pandas as pd
        >>> import streamlit as st
        >>> from numpy.random import default_rng as rng
        >>>
        >>> df = pd.DataFrame(rng(0).standard_normal((200, 3)), columns=["a", "b", "c"])
        >>> chart = (
        ...     alt.Chart(df)
        ...     .mark_circle()
        ...     .encode(x="a", y="b", size="c", color="c", tooltip=["a", "b", "c"])
        ... )
        >>>
        >>> st.write(chart)

        ..  output::
            https://doc-vega-lite-chart.streamlit.app/
            height: 300px

        r0   r   rQ   NzCannot replace a single element with multiple elements.

The `write()` method only supports multiple elements when inserting elements rather than replacing. That is, only when called as `st.write()` or `st.sidebar.write()`.c                     rDdj                        } j                  j                         }|j                  |        g d d  y y )N rQ   )joinrF   rG   r*   )text_contenttext_containerrJ   string_bufferrR   s     r"   flush_bufferz&WriteMixin.write.<locals>.flush_buffer  sO    "xx6 "&'' &7 (  $&a  r!   zmatplotlib.figure.Figurezbokeh.plotting.figure.Figure)	vis_utilszopenai.Streamr7   _repr_html_	to_pandas__dataframe__
   `r1   )Jr@   r4   r5   rF   r*   _is_top_levelr   r+   r   rH   rI   	Exception	exceptionr   is_delta_generatorhelpr   r6   	dataframeis_altair_chartaltair_chartrE   pyplotis_plotly_chartplotly_chartbokeh_chartis_graphviz_chartgraphviz_chartis_sympy_expressionlatexis_pillow_imageimageis_keras_modeltensorflow.python.keras.utilsr[   model_to_dot	to_stringdictlistmap	enumeratetypesMappingProxyTyper   r   r   r
   r   r   is_custom_dictis_namedtupleis_pydantic_modeljson	is_pydeckpydeck_chartr   getvaluer8   isgeneratorr9   r:   r;   r%   r   dataclassesis_dataclassisclassr   has_callable_attrhtmlr\   r   maxr   )rJ   rR   argsrZ   argitemr[   dotstringified_argbacktick_countbacktick_wrapperrY   s   ``         @r"   rI   zWriteMixin.write  s0   Z t9>ja#6
 GGT!W8IJ#%
 ww$$TQ'G 
	&  B	C#s#$$S)C1 ND~$

4;L
MN C+!!#&--c2S!11#6!!#&**3/$$S)""3(BCs#**3/$$S)""3(FG##C(,,S1&&s+..s3c"**3/c"))#. ,,S1&&s}}7!..   ! "  ++C0**3/..s3S!$$S)$$S)C*  0##C(..s3--c2%%c*$$S/:!!#&C,0H0H0MS!% T&#./"y'B'B3'VS__./,,[,,S/B !!#&"%c(%o6 NGGLL%_, &),=os,SVW,W%XN'*^';$!((+,B.?rBRAST &7%Lq%PN'*^';$!((+,_,=>N=OPAB	H 	r!   c                    t        d|       S )zGet our DeltaGenerator.r   )r   )rJ   s    r"   rF   zWriteMixin.dgG  s     $d++r!   )rK   zXCallable[..., Any] | Generator[Any, Any, Any] | Iterable[Any] | AsyncGenerator[Any, Any]r&   z
str | Noner2   zlist[Any] | str)r   r   rR   boolr2   r3   )r2   r   )r   r   r   r   r%   rI   propertyrF   r    r!   r"   r$   r$   ?   su    N# "P#P P 
P $Pd G:? q qf	 , ,r!   r$   ).
__future__r   r   r8   r|   collectionsr   r   r   collections.abcr   r   r	   r
   r   r   r   ior   typingr   r   r   r   	streamlitr   r   streamlit.errorsr   streamlit.runtime.metrics_utilr   streamlit.string_utilr   r   streamlit.delta_generatorr   BuiltinFunctionTypeBuiltinMethodTypeFunctionType
MethodType
ModuleTyper   __annotations__ry   r   r$   r    r!   r"   <module>r      s    #    4 4     0 2 9
 8 
				,
( 	d3i 	K, K,r!   