
    gU                       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 d dlmZ d dlmZ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  d dl!m"Z"m#Z# erd dl$m%Z% ejL                  ejN                  ejP                  ejR                  ejT                  fZ+de,d<    ee-      Z.de,d<   dZ/de,d<    G d de0e         Z1 G d d      Z2y)    )annotationsN)ChainMapUserDictUserList)AsyncGenerator	Generator	ItemsViewIterableKeysView
ValuesView)StringIO)TYPE_CHECKINGAnyCallableFinalcast)dataframe_util	type_util)StreamlitAPIException)
get_logger)gather_metrics)is_mem_address_strmax_char_sequence)DeltaGeneratorzFinal[tuple[type[Any], ...]]
HELP_TYPESr   _LOGGERu    ▏_TEXT_CURSORc                      e Zd Zy)StreamingOutputN)__name__
__module____qualname__     M/var/www/openai/venv/lib/python3.12/site-packages/streamlit/elements/write.pyr   r   @   s    r$   r   c                  h    e Zd Z ed      	 	 	 	 d	d       Z ed      ddd
d       Zedd       Zy)
WriteMixinwrite_streamc                  	 t        |t              st        j                  |      rt	        dt        |       d      ddt               		fd}t        j                  |      st        j                  |      r |       }t        j                  |      rt        j                  |      }	 t        |       |D ]4  }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              rE|sd}s| j,                  j/                         d}|z  j1                  |rdnt2        z          t5        |      r |         |         |        | j7                  |       	j9                  |       7  |        	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.

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

        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.N c                 ^    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   )
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,   r   callablewriter-   )
selfstreamr1   excchunkerr
first_textr.   r/   r0   s
          @@@r%   r(   zWriteMixin.write_streamE   s   ^ fc"n&F&Fv&N'F|n %""  37!#%4%6
	' &&v.'2L2LV2TXF f%66v>F	L E((/5==)Q.%--2B2H2H2P !# %a 0 6 6 > > D"   (ST	!MM/RE %%"
''+ww}}$!%J!U*! ))%z|L %%'%'

5!&&u-i l 	!Q&:oa6H#+N"1%% Q  	',T&\N ;[ [ 	$ & /f  & /f sI   2H) AII0)	I2II	I-I((I-0	J
9JJ
rH   Funsafe_allow_htmlc                   |rt         j                  d|       g  j                  j                  st	        |      dkD  rt        d       fd}|D ]  }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        j0                  |      r$ |         j                  j3                  |       t        j,                  |d      r$ |         j                  j5                  |       t        j6                  |      r$ |         j                  j9                  |       5t        j:                  |      r$ |         j                  j=                  |       nt        j>                  |      r$ |         j                  jA                  |       t        jB                  |      rIdd	l"m#}  |        |jI                  |      } j                  j9                  |jK                                t        |tL        tN        tP        tR        tT        jV                  tX        tZ        t\        t^        t`        tb        f      s?t        jd                  |      s*t        jf                  |      st        jh                  |      r$ |         j                  jk                  |       t        jl                  |      r$ |         j                  jo                  |       t        |tp              r2 |         j                  js                  |ju                                0tw        jx                  |      sUtw        jz                  |      s@tw        j|                  |      s+tw        j~                  |      st        j,                  |d
      r |         j                  |       t        |t              r$ |         j                  j!                  |       t        j                  |      r$ |         j                  j!                  |       !tw        j                  |      r2 |         j                  j!                  t        t        |             hrAt        j                  |d      r+ j                  j                  |j                                t        j                  |d      st        j                  |d      r$ |         j                  j'                  |       t        |      }	t        |	      r$ |         j                  j!                  |       5d|	v r9t        dt        |	d      dz         }
d|
z  }j                  | d|	 d|        rt        |	d      dz   }
d|
z  }j                  | |	 |          |        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.

        **kwargs : any
            Keyword arguments. Not used.

        .. deprecated::
            ``**kwargs`` is deprecated and will be removed in a later version.
            Use other, more specific Streamlit commands to pass additional
            keyword arguments.

        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 streamlit as st
        >>> import pandas as pd
        >>> import numpy as np
        >>> import altair as alt
        >>>
        >>> df = pd.DataFrame(np.random.randn(200, 3), columns=["a", "b", "c"])
        >>> c = (
        ...     alt.Chart(df)
        ...     .mark_circle()
        ...     .encode(x="a", y="b", size="c", color="c", tooltip=["a", "b", "c"])
        ... )
        >>>
        >>> st.write(c)

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

        zInvalid arguments were passed to "st.write" function. Support for passing such unknown keywords arguments will be dropped in future. Invalid arguments were: %sr2   zCannot 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 rO   )joinrE   rF   r,   )text_contenttext_containerrI   string_bufferrP   s     r%   flush_bufferz&WriteMixin.write.<locals>.flush_buffer  sO    "xx6 "&'' &7 (  $&a  r$   rO   zmatplotlib.figure.Figurezbokeh.plotting.figure.Figurer   )	vis_utilszopenai.Stream_repr_html_	to_pandas__dataframe__
   `N)Mr   warningrE   _is_top_levelr?   r   r3   r4   r-   r   rG   rH   	Exception	exceptionr   is_delta_generatorhelpr   r5   	dataframeis_altair_chartaltair_chartrD   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.utilsrY   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   r,   getvaluer7   isgeneratorr8   r9   r:   r(   r   dataclassesis_dataclassisclassr   r6   has_callable_attrhtmlrZ   r   maxr   )rI   rP   argskwargsrX   argitemrY   dotstringified_argbacktick_countbacktick_wrapperrW   s   ``          @r%   rH   zWriteMixin.write   s   h OO- 	 $&
 ww$$TQ'G 
	& C#s#$$S)C1D~$

4;L
M   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"))#.C,,S1&&s}}7!..   ! "  ++C0**3/..s3S!$$S)$$S)C*  0##C(..s3--c2%%c*$$S/:!!#&C,S!))#.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C J 	r$   c                    t        d|       S )zGet our DeltaGenerator.r   )r   )rI   s    r%   rE   zWriteMixin.dg;  s     $d++r$   N)rJ   zXCallable[..., Any] | Generator[Any, Any, Any] | Iterable[Any] | AsyncGenerator[Any, Any]returnzlist[Any] | str)r   r   rP   boolr   None)r   r   )r    r!   r"   r   r(   rH   propertyrE   r#   r$   r%   r'   r'   D   se    N#w#w 
w $wr G:? y yv	 , ,r$   r'   )3
__future__r   r   r7   r{   collectionsr   r   r   collections.abcr   r   r	   r
   r   r   ior   typingr   r   r   r   r   	streamlitr   r   streamlit.errorsr   streamlit.loggerr   streamlit.runtime.metrics_utilr   streamlit.string_utilr   r   streamlit.delta_generatorr   BuiltinFunctionTypeBuiltinMethodTypeFunctionType
MethodType
ModuleTyper   __annotations__r    r   r   rx   r   r'   r#   r$   r%   <module>r      s    #    4 4    0 2 ' 9
 8 
				,
(  H% %e 	d3i 	z, z,r$   