o
    hU                     @  s8  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rkd dl$m%Z% ej&ej'ej(ej)ej*fZ+de,d< ee-Z.de,d< dZ/de,d< G dd de0e Z1G dd dZ2dS )    )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                   @  s   e Zd ZdS )StreamingOutputN)__name__
__module____qualname__ r!   r!   L/var/www/vscode/kcb/lib/python3.10/site-packages/streamlit/elements/write.pyr   @   s    r   c                   @  sD   e Zd ZeddddZedd	d
dddZedddZdS )
WriteMixinwrite_streamstreamXCallable[..., Any] | Generator[Any, Any, Any] | Iterable[Any] | AsyncGenerator[Any, Any]returnlist[Any] | strc                   s  t |ts
t|rtdt| dd dt  fdd}t|s-t	|r0| }t
|r:t|}zt| W n tyW } ztdt| d|d}~ww |D ]}t|rzt|jd	ksq|jd	 jdu rtd}n	|jd	 jjp|d}W n ty } ztd
|d}~ww t|drz|jpd}W n ty } ztd|d}~ww t |tr|sqZd} s| j  d}|7  |rdnt  qZt|r|  |  qZ|  | | | qZ|  sdS tdkrt d	 trd	 S S )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                     s0   r r    d ddS dS dS )z#Write the full response to the app.Nr)   )markdownappendr!   stream_containerstreamed_responsewritten_contentr!   r"   flush_stream_response   s   

z6WriteMixin.write_stream.<locals>.flush_stream_responsez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+   )selfr%   r0   excchunkerr
first_textr!   r,   r"   r$   E   s   O


	
	

zWriteMixin.write_streamrG   Funsafe_allow_htmlargsr   rN   boolNonec                  sV  |rt d| g  jjst|dkrtd fdd}|D ]}t|tr0| q"t|t	rP|  |D ]}t
|rG|  |  q: j|d q:q"t|tr_|   j| q"t|rn|   j| q"t|r}|   j| q"t|r|   j| q"t|dr|   j| q"t|r|   j| q"t|dr|   j| q"t|r|   j| q"t|r|   j| q"t|r|   j | q"t!|rd	d
l"m#} |  |$|} j|%  q"t|t&t't(t)t*j+t,t-t.t/t0t1fs)t2|s)t3|s)t4|r3|   j5| q"t6|rC|   j7| q"t|t8rU|   j9|:  q"t;<|stt;=|stt;>|stt;?|stt|dr}|   @| q"t|tAr|   j| q"tBC|r|   j| q"t;D|r|   jtEd| q"rtF|drÈ jG|H  q"tF|dstF|dr|   j| q"t|}	tI|	r|   j| q"d|	v rtJdtK|	dd }
d|
 }| d|	 d|  q"tK|	dd }
d|
 }| |	 |  q"|  dS )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: %sr1   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                    s:   rd }  j }|j| d g d d < d S d S )N rM   )joinrD   rE   r*   )text_contenttext_containerrH   string_bufferrN   r!   r"   flush_buffer  s   

z&WriteMixin.write.<locals>.flush_bufferrM   zmatplotlib.figure.Figurezbokeh.plotting.figure.Figurer   )	vis_utilszopenai.Streamr5   _repr_html_	to_pandas__dataframe__
   `N)Lr   warningrD   _is_top_levelr>   r   r2   r3   r+   r   rF   rG   	Exception	exceptionr   is_delta_generatorhelpr   r4   	dataframeis_altair_chartaltair_chartrC   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*   getvaluer6   isgeneratorr7   r8   r9   r$   r   dataclassesis_dataclassisclassr   has_callable_attrhtmlrZ   r   maxr   )rH   rN   rO   kwargsrX   argitemrY   dotstringified_argbacktick_countbacktick_wrapperr!   rV   r"   rG      s   
















zWriteMixin.writer   c                 C  s
   t d| S )zGet our DeltaGenerator.r   )r   )rH   r!   r!   r"   rD   :  s   
zWriteMixin.dgN)r%   r&   r'   r(   )rO   r   rN   rP   r'   rQ   )r'   r   )r   r   r    r   r$   rG   propertyrD   r!   r!   r!   r"   r#   D   s     :  <r#   )3
__future__r   r   r6   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!   r"   <module>   s2    