o
    ,&]iY                     @  s  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red dl"m#Z# ej$ej%ej&ej'ej(fZ)de*d< G dd de+e Z,G dd dZ-dS )    )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                   @  s   e Zd ZdS )StreamingOutputN)__name__
__module____qualname__ r   r   V/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/streamlit/elements/write.pyr   ;   s    r   c                   @  sJ   e Zd Zeddddd
dZeddddddZedddZdS )
WriteMixinwrite_streamN)cursorstreamXCallable[..., Any] | Generator[Any, Any, Any] | Iterable[Any] | AsyncGenerator[Any, Any]r"   
str | Nonereturnlist[Any] | strc          	        s  t |ts
t|rtdt| d|pd}d dt d fdd}t|s2t	|r5| }t
|r?t|}zt| W n ty\ } ztd	t| d
|d}~ww |D ]}t|rzt|jdksv|jd jdu ryd}n	|jd jjpd}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|sq_d} s| j  d}|7  |rdn|  q_t|r|  |  q_|  | | | q_|  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. 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. Nr&   Nonec                     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   r&   r)   )
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+   )	selfr#   r"   
cursor_strr0   excchunkerr
first_textr   r,   r   r!   @   s   g


	
	

zWriteMixin.write_streamrH   Funsafe_allow_htmlargsr   rP   boolr)   c                  sf  t |dkrt|d tr jj|d d dS g  jjs)t |dkr)tdd fdd	}|D ]}t|trB| q4t|trb|  |D ]}t	|rY|  |  qL j
|d qLq4t|trq|   j| q4t|r|   j| q4t|r|   j| q4t|r|   j| q4t|d
r|   j| q4t|r|   j| q4t|dr|   j| q4t|r|   j| q4t|r|   j| q4t|r|   j| q4t |rddl!m"} |  |#|} j|$  q4t|t%t&t't(t)j*t+t,t-t.t/t0fs;t1|s;t2|s;t3|rE|   j4| q4t5|rU|   j6| q4t|t7rg|   j|8  q4t9:|st9;|st9<|st9=|st|dr|   >| q4t|t?st@A|r|   j| q4t9B|r|   jtCd| q4rtD|drˈ jE|F  q4tD|dstD|dr|   j| q4t|}tG|r|   j| q4d|v rtHdtI|dd }	d|	 }
|
 d| d|
  q4tI|dd }	d|	 }
|
 | |
  q4|  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.


        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

        r1   r   rO   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()`.r&   r)   c                    s:   rd }  j }|j| d g d d < d S d S )N rO   )joinrE   rF   r*   )text_contenttext_containerrI   string_bufferrP   r   r   flush_buffer  s   

z&WriteMixin.write.<locals>.flush_bufferzmatplotlib.figure.Figurezbokeh.plotting.figure.Figure)	vis_utilszopenai.Streamr6   _repr_html_	to_pandas__dataframe__
   `r2   )Jr?   r3   r4   rE   r*   _is_top_levelr   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.utilsrZ   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   getvaluer7   isgeneratorr8   r9   r:   r!   r   dataclassesis_dataclassisclassr   has_callable_attrhtmlr[   r   maxr   )rI   rP   rQ   rY   argitemrZ   dotstringified_argbacktick_countbacktick_wrapperr   rW   r   rH     s   
















zWriteMixin.writer   c                 C  s
   t d| S )zGet our DeltaGenerator.r   )r   )rI   r   r   r   rE   G  s   
zWriteMixin.dg)r#   r$   r"   r%   r&   r'   )rQ   r   rP   rR   r&   r)   )r&   r   )r   r   r   r   r!   rH   propertyrE   r   r   r   r   r    ?   s     S  5r    ).
__future__r   r   r7   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__rx   r   r    r   r   r   r   <module>   s,   $		