streamlit-nightly 1.43.2.dev20250307__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. streamlit/__init__.py +306 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +218 -0
  4. streamlit/cli_util.py +105 -0
  5. streamlit/column_config.py +56 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +126 -0
  8. streamlit/commands/execution_control.py +238 -0
  9. streamlit/commands/experimental_query_params.py +169 -0
  10. streamlit/commands/logo.py +189 -0
  11. streamlit/commands/navigation.py +385 -0
  12. streamlit/commands/page_config.py +311 -0
  13. streamlit/components/__init__.py +13 -0
  14. streamlit/components/lib/__init__.py +13 -0
  15. streamlit/components/lib/local_component_registry.py +84 -0
  16. streamlit/components/types/__init__.py +13 -0
  17. streamlit/components/types/base_component_registry.py +99 -0
  18. streamlit/components/types/base_custom_component.py +150 -0
  19. streamlit/components/v1/__init__.py +31 -0
  20. streamlit/components/v1/component_arrow.py +141 -0
  21. streamlit/components/v1/component_registry.py +130 -0
  22. streamlit/components/v1/components.py +38 -0
  23. streamlit/components/v1/custom_component.py +243 -0
  24. streamlit/config.py +1513 -0
  25. streamlit/config_option.py +311 -0
  26. streamlit/config_util.py +177 -0
  27. streamlit/connections/__init__.py +28 -0
  28. streamlit/connections/base_connection.py +174 -0
  29. streamlit/connections/snowflake_connection.py +562 -0
  30. streamlit/connections/snowpark_connection.py +213 -0
  31. streamlit/connections/sql_connection.py +425 -0
  32. streamlit/connections/util.py +97 -0
  33. streamlit/cursor.py +210 -0
  34. streamlit/dataframe_util.py +1416 -0
  35. streamlit/delta_generator.py +602 -0
  36. streamlit/delta_generator_singletons.py +204 -0
  37. streamlit/deprecation_util.py +209 -0
  38. streamlit/development.py +21 -0
  39. streamlit/elements/__init__.py +13 -0
  40. streamlit/elements/alert.py +234 -0
  41. streamlit/elements/arrow.py +962 -0
  42. streamlit/elements/balloons.py +47 -0
  43. streamlit/elements/bokeh_chart.py +133 -0
  44. streamlit/elements/code.py +114 -0
  45. streamlit/elements/deck_gl_json_chart.py +546 -0
  46. streamlit/elements/dialog_decorator.py +267 -0
  47. streamlit/elements/doc_string.py +558 -0
  48. streamlit/elements/empty.py +130 -0
  49. streamlit/elements/exception.py +331 -0
  50. streamlit/elements/form.py +354 -0
  51. streamlit/elements/graphviz_chart.py +150 -0
  52. streamlit/elements/heading.py +302 -0
  53. streamlit/elements/html.py +105 -0
  54. streamlit/elements/iframe.py +191 -0
  55. streamlit/elements/image.py +196 -0
  56. streamlit/elements/json.py +139 -0
  57. streamlit/elements/layouts.py +879 -0
  58. streamlit/elements/lib/__init__.py +13 -0
  59. streamlit/elements/lib/built_in_chart_utils.py +1157 -0
  60. streamlit/elements/lib/color_util.py +263 -0
  61. streamlit/elements/lib/column_config_utils.py +542 -0
  62. streamlit/elements/lib/column_types.py +2188 -0
  63. streamlit/elements/lib/dialog.py +147 -0
  64. streamlit/elements/lib/dicttools.py +154 -0
  65. streamlit/elements/lib/event_utils.py +37 -0
  66. streamlit/elements/lib/file_uploader_utils.py +66 -0
  67. streamlit/elements/lib/form_utils.py +77 -0
  68. streamlit/elements/lib/image_utils.py +441 -0
  69. streamlit/elements/lib/js_number.py +105 -0
  70. streamlit/elements/lib/mutable_status_container.py +183 -0
  71. streamlit/elements/lib/options_selector_utils.py +250 -0
  72. streamlit/elements/lib/pandas_styler_utils.py +274 -0
  73. streamlit/elements/lib/policies.py +194 -0
  74. streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
  75. streamlit/elements/lib/subtitle_utils.py +176 -0
  76. streamlit/elements/lib/utils.py +250 -0
  77. streamlit/elements/map.py +508 -0
  78. streamlit/elements/markdown.py +277 -0
  79. streamlit/elements/media.py +793 -0
  80. streamlit/elements/metric.py +301 -0
  81. streamlit/elements/plotly_chart.py +546 -0
  82. streamlit/elements/progress.py +156 -0
  83. streamlit/elements/pyplot.py +194 -0
  84. streamlit/elements/snow.py +47 -0
  85. streamlit/elements/spinner.py +113 -0
  86. streamlit/elements/text.py +76 -0
  87. streamlit/elements/toast.py +98 -0
  88. streamlit/elements/vega_charts.py +1984 -0
  89. streamlit/elements/widgets/__init__.py +13 -0
  90. streamlit/elements/widgets/audio_input.py +310 -0
  91. streamlit/elements/widgets/button.py +1123 -0
  92. streamlit/elements/widgets/button_group.py +1008 -0
  93. streamlit/elements/widgets/camera_input.py +263 -0
  94. streamlit/elements/widgets/chat.py +647 -0
  95. streamlit/elements/widgets/checkbox.py +352 -0
  96. streamlit/elements/widgets/color_picker.py +265 -0
  97. streamlit/elements/widgets/data_editor.py +983 -0
  98. streamlit/elements/widgets/file_uploader.py +486 -0
  99. streamlit/elements/widgets/multiselect.py +338 -0
  100. streamlit/elements/widgets/number_input.py +545 -0
  101. streamlit/elements/widgets/radio.py +407 -0
  102. streamlit/elements/widgets/select_slider.py +437 -0
  103. streamlit/elements/widgets/selectbox.py +366 -0
  104. streamlit/elements/widgets/slider.py +880 -0
  105. streamlit/elements/widgets/text_widgets.py +628 -0
  106. streamlit/elements/widgets/time_widgets.py +970 -0
  107. streamlit/elements/write.py +574 -0
  108. streamlit/emojis.py +34 -0
  109. streamlit/env_util.py +61 -0
  110. streamlit/error_util.py +105 -0
  111. streamlit/errors.py +452 -0
  112. streamlit/external/__init__.py +13 -0
  113. streamlit/external/langchain/__init__.py +23 -0
  114. streamlit/external/langchain/streamlit_callback_handler.py +406 -0
  115. streamlit/file_util.py +247 -0
  116. streamlit/git_util.py +173 -0
  117. streamlit/hello/__init__.py +13 -0
  118. streamlit/hello/animation_demo.py +82 -0
  119. streamlit/hello/dataframe_demo.py +71 -0
  120. streamlit/hello/hello.py +37 -0
  121. streamlit/hello/mapping_demo.py +114 -0
  122. streamlit/hello/plotting_demo.py +55 -0
  123. streamlit/hello/streamlit_app.py +55 -0
  124. streamlit/hello/utils.py +28 -0
  125. streamlit/logger.py +130 -0
  126. streamlit/material_icon_names.py +25 -0
  127. streamlit/navigation/__init__.py +13 -0
  128. streamlit/navigation/page.py +302 -0
  129. streamlit/net_util.py +125 -0
  130. streamlit/platform.py +33 -0
  131. streamlit/proto/Alert_pb2.py +29 -0
  132. streamlit/proto/Alert_pb2.pyi +90 -0
  133. streamlit/proto/AppPage_pb2.py +27 -0
  134. streamlit/proto/AppPage_pb2.pyi +64 -0
  135. streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
  136. streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
  137. streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
  138. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
  139. streamlit/proto/Arrow_pb2.py +33 -0
  140. streamlit/proto/Arrow_pb2.pyi +188 -0
  141. streamlit/proto/AudioInput_pb2.py +28 -0
  142. streamlit/proto/AudioInput_pb2.pyi +58 -0
  143. streamlit/proto/Audio_pb2.py +27 -0
  144. streamlit/proto/Audio_pb2.pyi +58 -0
  145. streamlit/proto/AuthRedirect_pb2.py +27 -0
  146. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  147. streamlit/proto/AutoRerun_pb2.py +27 -0
  148. streamlit/proto/AutoRerun_pb2.pyi +45 -0
  149. streamlit/proto/BackMsg_pb2.py +29 -0
  150. streamlit/proto/BackMsg_pb2.pyi +105 -0
  151. streamlit/proto/Balloons_pb2.py +27 -0
  152. streamlit/proto/Balloons_pb2.pyi +43 -0
  153. streamlit/proto/Block_pb2.py +53 -0
  154. streamlit/proto/Block_pb2.pyi +322 -0
  155. streamlit/proto/BokehChart_pb2.py +27 -0
  156. streamlit/proto/BokehChart_pb2.pyi +49 -0
  157. streamlit/proto/ButtonGroup_pb2.py +36 -0
  158. streamlit/proto/ButtonGroup_pb2.pyi +169 -0
  159. streamlit/proto/Button_pb2.py +27 -0
  160. streamlit/proto/Button_pb2.pyi +71 -0
  161. streamlit/proto/CameraInput_pb2.py +28 -0
  162. streamlit/proto/CameraInput_pb2.pyi +58 -0
  163. streamlit/proto/ChatInput_pb2.py +31 -0
  164. streamlit/proto/ChatInput_pb2.pyi +111 -0
  165. streamlit/proto/Checkbox_pb2.py +30 -0
  166. streamlit/proto/Checkbox_pb2.pyi +90 -0
  167. streamlit/proto/ClientState_pb2.py +30 -0
  168. streamlit/proto/ClientState_pb2.pyi +90 -0
  169. streamlit/proto/Code_pb2.py +27 -0
  170. streamlit/proto/Code_pb2.pyi +55 -0
  171. streamlit/proto/ColorPicker_pb2.py +28 -0
  172. streamlit/proto/ColorPicker_pb2.pyi +67 -0
  173. streamlit/proto/Common_pb2.py +51 -0
  174. streamlit/proto/Common_pb2.pyi +293 -0
  175. streamlit/proto/Components_pb2.py +35 -0
  176. streamlit/proto/Components_pb2.pyi +172 -0
  177. streamlit/proto/DataFrame_pb2.py +56 -0
  178. streamlit/proto/DataFrame_pb2.pyi +397 -0
  179. streamlit/proto/DateInput_pb2.py +28 -0
  180. streamlit/proto/DateInput_pb2.pyi +83 -0
  181. streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
  182. streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
  183. streamlit/proto/Delta_pb2.py +31 -0
  184. streamlit/proto/Delta_pb2.pyi +74 -0
  185. streamlit/proto/DocString_pb2.py +29 -0
  186. streamlit/proto/DocString_pb2.pyi +93 -0
  187. streamlit/proto/DownloadButton_pb2.py +27 -0
  188. streamlit/proto/DownloadButton_pb2.pyi +70 -0
  189. streamlit/proto/Element_pb2.py +78 -0
  190. streamlit/proto/Element_pb2.pyi +312 -0
  191. streamlit/proto/Empty_pb2.py +27 -0
  192. streamlit/proto/Empty_pb2.pyi +36 -0
  193. streamlit/proto/Exception_pb2.py +27 -0
  194. streamlit/proto/Exception_pb2.pyi +72 -0
  195. streamlit/proto/Favicon_pb2.py +27 -0
  196. streamlit/proto/Favicon_pb2.pyi +40 -0
  197. streamlit/proto/FileUploader_pb2.py +28 -0
  198. streamlit/proto/FileUploader_pb2.pyi +78 -0
  199. streamlit/proto/ForwardMsg_pb2.py +53 -0
  200. streamlit/proto/ForwardMsg_pb2.pyi +293 -0
  201. streamlit/proto/GitInfo_pb2.py +29 -0
  202. streamlit/proto/GitInfo_pb2.pyi +83 -0
  203. streamlit/proto/GraphVizChart_pb2.py +27 -0
  204. streamlit/proto/GraphVizChart_pb2.pyi +53 -0
  205. streamlit/proto/Heading_pb2.py +27 -0
  206. streamlit/proto/Heading_pb2.pyi +56 -0
  207. streamlit/proto/Html_pb2.py +27 -0
  208. streamlit/proto/Html_pb2.pyi +42 -0
  209. streamlit/proto/IFrame_pb2.py +27 -0
  210. streamlit/proto/IFrame_pb2.pyi +59 -0
  211. streamlit/proto/Image_pb2.py +29 -0
  212. streamlit/proto/Image_pb2.pyi +84 -0
  213. streamlit/proto/Json_pb2.py +27 -0
  214. streamlit/proto/Json_pb2.pyi +53 -0
  215. streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
  216. streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
  217. streamlit/proto/LinkButton_pb2.py +27 -0
  218. streamlit/proto/LinkButton_pb2.pyi +58 -0
  219. streamlit/proto/Logo_pb2.py +27 -0
  220. streamlit/proto/Logo_pb2.pyi +51 -0
  221. streamlit/proto/Markdown_pb2.py +29 -0
  222. streamlit/proto/Markdown_pb2.pyi +86 -0
  223. streamlit/proto/Metric_pb2.py +32 -0
  224. streamlit/proto/Metric_pb2.pyi +101 -0
  225. streamlit/proto/MetricsEvent_pb2.py +30 -0
  226. streamlit/proto/MetricsEvent_pb2.pyi +200 -0
  227. streamlit/proto/MultiSelect_pb2.py +28 -0
  228. streamlit/proto/MultiSelect_pb2.pyi +81 -0
  229. streamlit/proto/NamedDataSet_pb2.py +28 -0
  230. streamlit/proto/NamedDataSet_pb2.pyi +59 -0
  231. streamlit/proto/Navigation_pb2.py +30 -0
  232. streamlit/proto/Navigation_pb2.pyi +84 -0
  233. streamlit/proto/NewSession_pb2.py +51 -0
  234. streamlit/proto/NewSession_pb2.pyi +481 -0
  235. streamlit/proto/NumberInput_pb2.py +30 -0
  236. streamlit/proto/NumberInput_pb2.pyi +121 -0
  237. streamlit/proto/PageConfig_pb2.py +33 -0
  238. streamlit/proto/PageConfig_pb2.pyi +126 -0
  239. streamlit/proto/PageInfo_pb2.py +27 -0
  240. streamlit/proto/PageInfo_pb2.pyi +43 -0
  241. streamlit/proto/PageLink_pb2.py +27 -0
  242. streamlit/proto/PageLink_pb2.pyi +63 -0
  243. streamlit/proto/PageNotFound_pb2.py +27 -0
  244. streamlit/proto/PageNotFound_pb2.pyi +42 -0
  245. streamlit/proto/PageProfile_pb2.py +31 -0
  246. streamlit/proto/PageProfile_pb2.pyi +127 -0
  247. streamlit/proto/PagesChanged_pb2.py +28 -0
  248. streamlit/proto/PagesChanged_pb2.pyi +48 -0
  249. streamlit/proto/ParentMessage_pb2.py +27 -0
  250. streamlit/proto/ParentMessage_pb2.pyi +46 -0
  251. streamlit/proto/PlotlyChart_pb2.py +31 -0
  252. streamlit/proto/PlotlyChart_pb2.pyi +131 -0
  253. streamlit/proto/Progress_pb2.py +27 -0
  254. streamlit/proto/Progress_pb2.pyi +43 -0
  255. streamlit/proto/Radio_pb2.py +28 -0
  256. streamlit/proto/Radio_pb2.pyi +84 -0
  257. streamlit/proto/RootContainer_pb2.py +27 -0
  258. streamlit/proto/RootContainer_pb2.pyi +56 -0
  259. streamlit/proto/Selectbox_pb2.py +28 -0
  260. streamlit/proto/Selectbox_pb2.pyi +80 -0
  261. streamlit/proto/SessionEvent_pb2.py +28 -0
  262. streamlit/proto/SessionEvent_pb2.pyi +62 -0
  263. streamlit/proto/SessionStatus_pb2.py +27 -0
  264. streamlit/proto/SessionStatus_pb2.pyi +57 -0
  265. streamlit/proto/Skeleton_pb2.py +29 -0
  266. streamlit/proto/Skeleton_pb2.pyi +71 -0
  267. streamlit/proto/Slider_pb2.py +32 -0
  268. streamlit/proto/Slider_pb2.pyi +142 -0
  269. streamlit/proto/Snow_pb2.py +27 -0
  270. streamlit/proto/Snow_pb2.pyi +43 -0
  271. streamlit/proto/Spinner_pb2.py +27 -0
  272. streamlit/proto/Spinner_pb2.pyi +49 -0
  273. streamlit/proto/TextArea_pb2.py +28 -0
  274. streamlit/proto/TextArea_pb2.pyi +80 -0
  275. streamlit/proto/TextInput_pb2.py +30 -0
  276. streamlit/proto/TextInput_pb2.pyi +107 -0
  277. streamlit/proto/Text_pb2.py +27 -0
  278. streamlit/proto/Text_pb2.pyi +46 -0
  279. streamlit/proto/TimeInput_pb2.py +28 -0
  280. streamlit/proto/TimeInput_pb2.pyi +74 -0
  281. streamlit/proto/Toast_pb2.py +27 -0
  282. streamlit/proto/Toast_pb2.pyi +45 -0
  283. streamlit/proto/VegaLiteChart_pb2.py +29 -0
  284. streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
  285. streamlit/proto/Video_pb2.py +31 -0
  286. streamlit/proto/Video_pb2.pyi +117 -0
  287. streamlit/proto/WidgetStates_pb2.py +31 -0
  288. streamlit/proto/WidgetStates_pb2.pyi +126 -0
  289. streamlit/proto/__init__.py +15 -0
  290. streamlit/proto/openmetrics_data_model_pb2.py +60 -0
  291. streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
  292. streamlit/py.typed +0 -0
  293. streamlit/runtime/__init__.py +50 -0
  294. streamlit/runtime/app_session.py +982 -0
  295. streamlit/runtime/caching/__init__.py +98 -0
  296. streamlit/runtime/caching/cache_data_api.py +665 -0
  297. streamlit/runtime/caching/cache_errors.py +142 -0
  298. streamlit/runtime/caching/cache_resource_api.py +527 -0
  299. streamlit/runtime/caching/cache_type.py +33 -0
  300. streamlit/runtime/caching/cache_utils.py +523 -0
  301. streamlit/runtime/caching/cached_message_replay.py +290 -0
  302. streamlit/runtime/caching/hashing.py +637 -0
  303. streamlit/runtime/caching/legacy_cache_api.py +169 -0
  304. streamlit/runtime/caching/storage/__init__.py +29 -0
  305. streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
  306. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  307. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
  308. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  309. streamlit/runtime/connection_factory.py +436 -0
  310. streamlit/runtime/context.py +280 -0
  311. streamlit/runtime/credentials.py +364 -0
  312. streamlit/runtime/forward_msg_cache.py +296 -0
  313. streamlit/runtime/forward_msg_queue.py +240 -0
  314. streamlit/runtime/fragment.py +477 -0
  315. streamlit/runtime/media_file_manager.py +234 -0
  316. streamlit/runtime/media_file_storage.py +143 -0
  317. streamlit/runtime/memory_media_file_storage.py +181 -0
  318. streamlit/runtime/memory_session_storage.py +77 -0
  319. streamlit/runtime/memory_uploaded_file_manager.py +138 -0
  320. streamlit/runtime/metrics_util.py +486 -0
  321. streamlit/runtime/pages_manager.py +165 -0
  322. streamlit/runtime/runtime.py +792 -0
  323. streamlit/runtime/runtime_util.py +106 -0
  324. streamlit/runtime/script_data.py +46 -0
  325. streamlit/runtime/scriptrunner/__init__.py +38 -0
  326. streamlit/runtime/scriptrunner/exec_code.py +159 -0
  327. streamlit/runtime/scriptrunner/magic.py +273 -0
  328. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  329. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  330. streamlit/runtime/scriptrunner/script_runner.py +756 -0
  331. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  332. streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
  333. streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
  334. streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
  335. streamlit/runtime/secrets.py +534 -0
  336. streamlit/runtime/session_manager.py +394 -0
  337. streamlit/runtime/state/__init__.py +41 -0
  338. streamlit/runtime/state/common.py +191 -0
  339. streamlit/runtime/state/query_params.py +205 -0
  340. streamlit/runtime/state/query_params_proxy.py +218 -0
  341. streamlit/runtime/state/safe_session_state.py +138 -0
  342. streamlit/runtime/state/session_state.py +772 -0
  343. streamlit/runtime/state/session_state_proxy.py +153 -0
  344. streamlit/runtime/state/widgets.py +135 -0
  345. streamlit/runtime/stats.py +109 -0
  346. streamlit/runtime/uploaded_file_manager.py +148 -0
  347. streamlit/runtime/websocket_session_manager.py +167 -0
  348. streamlit/source_util.py +98 -0
  349. streamlit/static/favicon.png +0 -0
  350. streamlit/static/index.html +61 -0
  351. streamlit/static/static/css/index.Bmkmz40k.css +1 -0
  352. streamlit/static/static/css/index.DpJG_94W.css +1 -0
  353. streamlit/static/static/css/index.DzuxGC_t.css +1 -0
  354. streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
  355. streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
  356. streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
  357. streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
  358. streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
  359. streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
  360. streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
  361. streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
  362. streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
  363. streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
  364. streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
  365. streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
  366. streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
  367. streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
  368. streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
  369. streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
  370. streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
  371. streamlit/static/static/js/index.08vcOOvb.js +1 -0
  372. streamlit/static/static/js/index.0uqKfJUS.js +1 -0
  373. streamlit/static/static/js/index.B02M5u69.js +203 -0
  374. streamlit/static/static/js/index.B7mcZKMx.js +1 -0
  375. streamlit/static/static/js/index.BAQDHFA_.js +1 -0
  376. streamlit/static/static/js/index.BI60cMVr.js +2 -0
  377. streamlit/static/static/js/index.BLug2inK.js +1 -0
  378. streamlit/static/static/js/index.BM6TMY8g.js +2 -0
  379. streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
  380. streamlit/static/static/js/index.BZqa87a1.js +2 -0
  381. streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
  382. streamlit/static/static/js/index.BgVMiY_P.js +197 -0
  383. streamlit/static/static/js/index.BtuGy7By.js +6 -0
  384. streamlit/static/static/js/index.BuDuBmrs.js +1 -0
  385. streamlit/static/static/js/index.BvXU2oKV.js +1 -0
  386. streamlit/static/static/js/index.BxcwPacT.js +73 -0
  387. streamlit/static/static/js/index.CWX8KB81.js +1 -0
  388. streamlit/static/static/js/index.CXzZTo_q.js +1 -0
  389. streamlit/static/static/js/index.CcRWp_KL.js +1 -0
  390. streamlit/static/static/js/index.Cd-_xe55.js +3 -0
  391. streamlit/static/static/js/index.CdG2PXln.js +4537 -0
  392. streamlit/static/static/js/index.CjXvXmcP.js +1 -0
  393. streamlit/static/static/js/index.D1HZENZx.js +776 -0
  394. streamlit/static/static/js/index.D21Efo64.js +1617 -0
  395. streamlit/static/static/js/index.D9WgGVBx.js +7 -0
  396. streamlit/static/static/js/index.DEcsHtvb.js +12 -0
  397. streamlit/static/static/js/index.DFeMfr_K.js +1 -0
  398. streamlit/static/static/js/index.DHFBoItz.js +1 -0
  399. streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
  400. streamlit/static/static/js/index.DmuRkekN.js +3855 -0
  401. streamlit/static/static/js/index.Do6eY8sf.js +1 -0
  402. streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
  403. streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
  404. streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
  405. streamlit/static/static/js/index.H1U1IC_d.js +3 -0
  406. streamlit/static/static/js/index.g6p_4DPr.js +1 -0
  407. streamlit/static/static/js/index.g9x_GKss.js +1 -0
  408. streamlit/static/static/js/index.zo9jm08y.js +1 -0
  409. streamlit/static/static/js/input.DnaFglHq.js +2 -0
  410. streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
  411. streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
  412. streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
  413. streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
  414. streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
  415. streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
  416. streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
  417. streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
  418. streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
  419. streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
  420. streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
  421. streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
  422. streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
  423. streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
  424. streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
  425. streamlit/static/static/js/value.CgPGBV_l.js +1 -0
  426. streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
  427. streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
  428. streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
  429. streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
  430. streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
  431. streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
  432. streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
  433. streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
  434. streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
  435. streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
  436. streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
  437. streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
  438. streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
  439. streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
  440. streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
  441. streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
  442. streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
  443. streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
  444. streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
  445. streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
  446. streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
  447. streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
  448. streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
  449. streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
  450. streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
  451. streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
  452. streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
  453. streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
  454. streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
  455. streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
  456. streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
  457. streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
  458. streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
  459. streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
  460. streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
  461. streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
  462. streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
  463. streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
  464. streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
  465. streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
  466. streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
  467. streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
  468. streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
  469. streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
  470. streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
  471. streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
  472. streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
  473. streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
  474. streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
  475. streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
  476. streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
  477. streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
  478. streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
  479. streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
  480. streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
  481. streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
  482. streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
  483. streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
  484. streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
  485. streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
  486. streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
  487. streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
  488. streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
  489. streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
  490. streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
  491. streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
  492. streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
  493. streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
  494. streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
  495. streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
  496. streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
  497. streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
  498. streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
  499. streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
  500. streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
  501. streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
  502. streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
  503. streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
  504. streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
  505. streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
  506. streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
  507. streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
  508. streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
  509. streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
  510. streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
  511. streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
  512. streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
  513. streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
  514. streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
  515. streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
  516. streamlit/string_util.py +203 -0
  517. streamlit/temporary_directory.py +56 -0
  518. streamlit/testing/__init__.py +13 -0
  519. streamlit/testing/v1/__init__.py +17 -0
  520. streamlit/testing/v1/app_test.py +1050 -0
  521. streamlit/testing/v1/element_tree.py +2083 -0
  522. streamlit/testing/v1/local_script_runner.py +180 -0
  523. streamlit/testing/v1/util.py +53 -0
  524. streamlit/time_util.py +75 -0
  525. streamlit/type_util.py +460 -0
  526. streamlit/url_util.py +122 -0
  527. streamlit/user_info.py +519 -0
  528. streamlit/util.py +72 -0
  529. streamlit/vendor/__init__.py +0 -0
  530. streamlit/vendor/pympler/__init__.py +0 -0
  531. streamlit/vendor/pympler/asizeof.py +2869 -0
  532. streamlit/version.py +18 -0
  533. streamlit/watcher/__init__.py +28 -0
  534. streamlit/watcher/event_based_path_watcher.py +406 -0
  535. streamlit/watcher/folder_black_list.py +82 -0
  536. streamlit/watcher/local_sources_watcher.py +233 -0
  537. streamlit/watcher/path_watcher.py +185 -0
  538. streamlit/watcher/polling_path_watcher.py +124 -0
  539. streamlit/watcher/util.py +207 -0
  540. streamlit/web/__init__.py +13 -0
  541. streamlit/web/bootstrap.py +353 -0
  542. streamlit/web/cache_storage_manager_config.py +38 -0
  543. streamlit/web/cli.py +369 -0
  544. streamlit/web/server/__init__.py +26 -0
  545. streamlit/web/server/app_static_file_handler.py +93 -0
  546. streamlit/web/server/authlib_tornado_integration.py +60 -0
  547. streamlit/web/server/browser_websocket_handler.py +246 -0
  548. streamlit/web/server/component_request_handler.py +116 -0
  549. streamlit/web/server/media_file_handler.py +141 -0
  550. streamlit/web/server/oauth_authlib_routes.py +176 -0
  551. streamlit/web/server/oidc_mixin.py +108 -0
  552. streamlit/web/server/routes.py +295 -0
  553. streamlit/web/server/server.py +479 -0
  554. streamlit/web/server/server_util.py +161 -0
  555. streamlit/web/server/stats_request_handler.py +95 -0
  556. streamlit/web/server/upload_file_request_handler.py +137 -0
  557. streamlit/web/server/websocket_headers.py +56 -0
  558. streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
  559. streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
  560. streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
  561. streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
  562. streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
  563. streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,647 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from collections.abc import Iterator, MutableMapping, Sequence
18
+ from dataclasses import dataclass
19
+ from enum import Enum
20
+ from typing import (
21
+ TYPE_CHECKING,
22
+ Any,
23
+ Literal,
24
+ cast,
25
+ overload,
26
+ )
27
+
28
+ from streamlit import config, runtime
29
+ from streamlit.delta_generator_singletons import get_dg_singleton_instance
30
+ from streamlit.elements.lib.file_uploader_utils import (
31
+ enforce_filename_restriction,
32
+ normalize_upload_file_type,
33
+ )
34
+ from streamlit.elements.lib.form_utils import is_in_form
35
+ from streamlit.elements.lib.image_utils import AtomicImage, WidthBehavior, image_to_url
36
+ from streamlit.elements.lib.policies import check_widget_policies
37
+ from streamlit.elements.lib.utils import (
38
+ Key,
39
+ compute_and_register_element_id,
40
+ get_chat_input_accept_file_proto_value,
41
+ save_for_app_testing,
42
+ to_key,
43
+ )
44
+ from streamlit.errors import StreamlitAPIException
45
+ from streamlit.proto.Block_pb2 import Block as BlockProto
46
+ from streamlit.proto.ChatInput_pb2 import ChatInput as ChatInputProto
47
+ from streamlit.proto.Common_pb2 import ChatInputValue as ChatInputValueProto
48
+ from streamlit.proto.Common_pb2 import FileUploaderState as FileUploaderStateProto
49
+ from streamlit.proto.RootContainer_pb2 import RootContainer
50
+ from streamlit.runtime.metrics_util import gather_metrics
51
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
52
+ from streamlit.runtime.state import (
53
+ WidgetArgs,
54
+ WidgetCallback,
55
+ WidgetKwargs,
56
+ register_widget,
57
+ )
58
+ from streamlit.runtime.uploaded_file_manager import DeletedFile, UploadedFile
59
+ from streamlit.string_util import is_emoji, validate_material_icon
60
+
61
+ if TYPE_CHECKING:
62
+ from streamlit.delta_generator import DeltaGenerator
63
+
64
+
65
+ @dataclass
66
+ class ChatInputValue(MutableMapping[str, Any]):
67
+ text: str
68
+ files: list[UploadedFile]
69
+
70
+ def __len__(self) -> int:
71
+ return len(vars(self))
72
+
73
+ def __iter__(self) -> Iterator[str]:
74
+ return iter(vars(self))
75
+
76
+ def __getitem__(self, item: str) -> str | list[UploadedFile]:
77
+ try:
78
+ return getattr(self, item) # type: ignore[no-any-return]
79
+ except AttributeError:
80
+ raise KeyError(f"Invalid key: {item}") from None
81
+
82
+ def __setitem__(self, key: str, value: Any) -> None:
83
+ setattr(self, key, value)
84
+
85
+ def __delitem__(self, key: str) -> None:
86
+ try:
87
+ delattr(self, key)
88
+ except AttributeError:
89
+ raise KeyError(f"Invalid key: {key}") from None
90
+
91
+ def to_dict(self) -> dict[str, str | list[UploadedFile]]:
92
+ return vars(self)
93
+
94
+
95
+ class PresetNames(str, Enum):
96
+ USER = "user"
97
+ ASSISTANT = "assistant"
98
+ AI = "ai" # Equivalent to assistant
99
+ HUMAN = "human" # Equivalent to user
100
+
101
+
102
+ def _process_avatar_input(
103
+ avatar: str | AtomicImage | None, delta_path: str
104
+ ) -> tuple[BlockProto.ChatMessage.AvatarType.ValueType, str]:
105
+ """Detects the avatar type and prepares the avatar data for the frontend.
106
+
107
+ Parameters
108
+ ----------
109
+ avatar :
110
+ The avatar that was provided by the user.
111
+ delta_path : str
112
+ The delta path is used as media ID when a local image is served via the media
113
+ file manager.
114
+
115
+ Returns
116
+ -------
117
+ Tuple[AvatarType, str]
118
+ The detected avatar type and the prepared avatar data.
119
+ """
120
+ AvatarType = BlockProto.ChatMessage.AvatarType
121
+
122
+ if avatar is None:
123
+ return AvatarType.ICON, ""
124
+ elif isinstance(avatar, str) and avatar in {item.value for item in PresetNames}:
125
+ # On the frontend, we only support "assistant" and "user" for the avatar.
126
+ return (
127
+ AvatarType.ICON,
128
+ (
129
+ "assistant"
130
+ if avatar in [PresetNames.AI, PresetNames.ASSISTANT]
131
+ else "user"
132
+ ),
133
+ )
134
+ elif isinstance(avatar, str) and is_emoji(avatar):
135
+ return AvatarType.EMOJI, avatar
136
+
137
+ elif isinstance(avatar, str) and avatar.startswith(":material"):
138
+ return AvatarType.ICON, validate_material_icon(avatar)
139
+ else:
140
+ try:
141
+ return AvatarType.IMAGE, image_to_url(
142
+ avatar,
143
+ width=WidthBehavior.ORIGINAL,
144
+ clamp=False,
145
+ channels="RGB",
146
+ output_format="auto",
147
+ image_id=delta_path,
148
+ )
149
+ except Exception as ex:
150
+ raise StreamlitAPIException(
151
+ "Failed to load the provided avatar value as an image."
152
+ ) from ex
153
+
154
+
155
+ def _pop_upload_files(
156
+ files_value: FileUploaderStateProto | None,
157
+ ) -> list[UploadedFile]:
158
+ if files_value is None:
159
+ return []
160
+
161
+ ctx = get_script_run_ctx()
162
+ if ctx is None:
163
+ return []
164
+
165
+ uploaded_file_info = files_value.uploaded_file_info
166
+ if len(uploaded_file_info) == 0:
167
+ return []
168
+
169
+ file_recs_list = ctx.uploaded_file_mgr.get_files(
170
+ session_id=ctx.session_id,
171
+ file_ids=[f.file_id for f in uploaded_file_info],
172
+ )
173
+
174
+ file_recs = {f.file_id: f for f in file_recs_list}
175
+
176
+ collected_files: list[UploadedFile] = []
177
+
178
+ for f in uploaded_file_info:
179
+ maybe_file_rec = file_recs.get(f.file_id)
180
+ if maybe_file_rec is not None:
181
+ uploaded_file = UploadedFile(maybe_file_rec, f.file_urls)
182
+ collected_files.append(uploaded_file)
183
+
184
+ if hasattr(ctx.uploaded_file_mgr, "remove_file"):
185
+ ctx.uploaded_file_mgr.remove_file(
186
+ session_id=ctx.session_id,
187
+ file_id=f.file_id,
188
+ )
189
+
190
+ return collected_files
191
+
192
+
193
+ @dataclass
194
+ class ChatInputSerde:
195
+ accept_files: bool = False
196
+ allowed_types: Sequence[str] | None = None
197
+
198
+ def deserialize(
199
+ self,
200
+ ui_value: ChatInputValueProto | None,
201
+ widget_id: str = "",
202
+ ) -> str | ChatInputValue | None:
203
+ if ui_value is None or not ui_value.HasField("data"):
204
+ return None
205
+ if not self.accept_files:
206
+ return ui_value.data
207
+ else:
208
+ uploaded_files = _pop_upload_files(ui_value.file_uploader_state)
209
+ for file in uploaded_files:
210
+ if self.allowed_types and not isinstance(file, DeletedFile):
211
+ enforce_filename_restriction(file.name, self.allowed_types)
212
+
213
+ return ChatInputValue(
214
+ text=ui_value.data,
215
+ files=uploaded_files,
216
+ )
217
+
218
+ def serialize(self, v: str | None) -> ChatInputValueProto:
219
+ return ChatInputValueProto(data=v)
220
+
221
+
222
+ class ChatMixin:
223
+ @gather_metrics("chat_message")
224
+ def chat_message(
225
+ self,
226
+ name: Literal["user", "assistant", "ai", "human"] | str,
227
+ *,
228
+ avatar: Literal["user", "assistant"] | str | AtomicImage | None = None,
229
+ ) -> DeltaGenerator:
230
+ """Insert a chat message container.
231
+
232
+ To add elements to the returned container, you can use ``with`` notation
233
+ (preferred) or just call methods directly on the returned object. See the
234
+ examples below.
235
+
236
+ Parameters
237
+ ----------
238
+ name : "user", "assistant", "ai", "human", or str
239
+ The name of the message author. Can be "human"/"user" or
240
+ "ai"/"assistant" to enable preset styling and avatars.
241
+
242
+ Currently, the name is not shown in the UI but is only set as an
243
+ accessibility label. For accessibility reasons, you should not use
244
+ an empty string.
245
+
246
+ avatar : Anything supported by st.image (except list), str, or None
247
+ The avatar shown next to the message.
248
+
249
+ If ``avatar`` is ``None`` (default), the icon will be determined
250
+ from ``name`` as follows:
251
+
252
+ - If ``name`` is ``"user"`` or ``"human"``, the message will have a
253
+ default user icon.
254
+
255
+ - If ``name`` is ``"ai"`` or ``"assistant"``, the message will have
256
+ a default bot icon.
257
+
258
+ - For all other values of ``name``, the message will show the first
259
+ letter of the name.
260
+
261
+ In addition to the types supported by |st.image|_ (except list),
262
+ the following strings are valid:
263
+
264
+ - A single-character emoji. For example, you can set ``avatar="🧑‍💻"``
265
+ or ``avatar="🦖"``. Emoji short codes are not supported.
266
+
267
+ - An icon from the Material Symbols library (rounded style) in the
268
+ format ``":material/icon_name:"`` where "icon_name" is the name
269
+ of the icon in snake case.
270
+
271
+ For example, ``icon=":material/thumb_up:"`` will display the
272
+ Thumb Up icon. Find additional icons in the `Material Symbols \
273
+ <https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded>`_
274
+ font library.
275
+
276
+ .. |st.image| replace:: ``st.image``
277
+ .. _st.image: https://docs.streamlit.io/develop/api-reference/media/st.image
278
+
279
+ Returns
280
+ -------
281
+ Container
282
+ A single container that can hold multiple elements.
283
+
284
+ Examples
285
+ --------
286
+ You can use ``with`` notation to insert any element into an expander
287
+
288
+ >>> import streamlit as st
289
+ >>> import numpy as np
290
+ >>>
291
+ >>> with st.chat_message("user"):
292
+ ... st.write("Hello 👋")
293
+ ... st.line_chart(np.random.randn(30, 3))
294
+
295
+ .. output ::
296
+ https://doc-chat-message-user.streamlit.app/
297
+ height: 450px
298
+
299
+ Or you can just call methods directly in the returned objects:
300
+
301
+ >>> import streamlit as st
302
+ >>> import numpy as np
303
+ >>>
304
+ >>> message = st.chat_message("assistant")
305
+ >>> message.write("Hello human")
306
+ >>> message.bar_chart(np.random.randn(30, 3))
307
+
308
+ .. output ::
309
+ https://doc-chat-message-user1.streamlit.app/
310
+ height: 450px
311
+
312
+ """
313
+ if name is None:
314
+ raise StreamlitAPIException(
315
+ "The author name is required for a chat message, please set it via the parameter `name`."
316
+ )
317
+
318
+ if avatar is None and (
319
+ name.lower() in {item.value for item in PresetNames} or is_emoji(name)
320
+ ):
321
+ # For selected labels, we are mapping the label to an avatar
322
+ avatar = name.lower()
323
+ avatar_type, converted_avatar = _process_avatar_input(
324
+ avatar, self.dg._get_delta_path_str()
325
+ )
326
+
327
+ message_container_proto = BlockProto.ChatMessage()
328
+ message_container_proto.name = name
329
+ message_container_proto.avatar = converted_avatar
330
+ message_container_proto.avatar_type = avatar_type
331
+ block_proto = BlockProto()
332
+ block_proto.allow_empty = True
333
+ block_proto.chat_message.CopyFrom(message_container_proto)
334
+
335
+ return self.dg._block(block_proto=block_proto)
336
+
337
+ @overload
338
+ def chat_input(
339
+ self,
340
+ placeholder: str = "Your message",
341
+ *,
342
+ key: Key | None = None,
343
+ max_chars: int | None = None,
344
+ accept_file: Literal[False] = False,
345
+ file_type: str | Sequence[str] | None = None,
346
+ disabled: bool = False,
347
+ on_submit: WidgetCallback | None = None,
348
+ args: WidgetArgs | None = None,
349
+ kwargs: WidgetKwargs | None = None,
350
+ ) -> str | None: ...
351
+
352
+ @overload
353
+ def chat_input(
354
+ self,
355
+ placeholder: str = "Your message",
356
+ *,
357
+ key: Key | None = None,
358
+ max_chars: int | None = None,
359
+ accept_file: Literal[True, "multiple"],
360
+ file_type: str | Sequence[str] | None = None,
361
+ disabled: bool = False,
362
+ on_submit: WidgetCallback | None = None,
363
+ args: WidgetArgs | None = None,
364
+ kwargs: WidgetKwargs | None = None,
365
+ ) -> ChatInputValue | None: ...
366
+
367
+ @gather_metrics("chat_input")
368
+ def chat_input(
369
+ self,
370
+ placeholder: str = "Your message",
371
+ *,
372
+ key: Key | None = None,
373
+ max_chars: int | None = None,
374
+ accept_file: bool | Literal["multiple"] = False,
375
+ file_type: str | Sequence[str] | None = None,
376
+ disabled: bool = False,
377
+ on_submit: WidgetCallback | None = None,
378
+ args: WidgetArgs | None = None,
379
+ kwargs: WidgetKwargs | None = None,
380
+ ) -> str | ChatInputValue | None:
381
+ """Display a chat input widget.
382
+
383
+ Parameters
384
+ ----------
385
+ placeholder : str
386
+ A placeholder text shown when the chat input is empty. This
387
+ defaults to ``"Your message"``. For accessibility reasons, you
388
+ should not use an empty string.
389
+
390
+ key : str or int
391
+ An optional string or integer to use as the unique key for the widget.
392
+ If this is omitted, a key will be generated for the widget based on
393
+ its content. No two widgets may have the same key.
394
+
395
+ max_chars : int or None
396
+ The maximum number of characters that can be entered. If this is
397
+ ``None`` (default), there will be no maximum.
398
+
399
+ accept_file : bool or str
400
+ Whether the chat input should accept files. This can be one of the
401
+ following values:
402
+
403
+ - ``False`` (default): No files are accepted and the user can only
404
+ submit a message.
405
+ - ``True``: The user can add a single file to their submission.
406
+ - ``"multiple"``: The user can add multiple files to their
407
+ submission.
408
+
409
+ When the widget is configured to accept files, the accepted file
410
+ types can be configured with the ``file_type`` parameter.
411
+
412
+ By default, uploaded files are limited to 200 MB each. You can
413
+ configure this using the ``server.maxUploadSize`` config option.
414
+ For more information on how to set config options, see
415
+ |config.toml|_.
416
+
417
+ .. |config.toml| replace:: ``config.toml``
418
+ .. _config.toml: https://docs.streamlit.io/develop/api-reference/configuration/config.toml
419
+
420
+ file_type : str, Sequence[str], or None
421
+ The allowed file extension(s) for uploaded files. This can be one
422
+ of the following types:
423
+
424
+ - ``None`` (default): All file extensions are allowed.
425
+ - A string: A single file extension is allowed. For example, to
426
+ only accept CSV files, use ``"csv"``.
427
+ - A sequence of strings: Multiple file extensions are allowed. For
428
+ example, to only accept JPG/JPEG and PNG files, use
429
+ ``["jpg", "jpeg", "png"]``.
430
+
431
+ disabled : bool
432
+ Whether the chat input should be disabled. This defaults to
433
+ ``False``.
434
+
435
+ on_submit : callable
436
+ An optional callback invoked when the chat input's value is submitted.
437
+
438
+ args : tuple
439
+ An optional tuple of args to pass to the callback.
440
+
441
+ kwargs : dict
442
+ An optional dict of kwargs to pass to the callback.
443
+
444
+ Returns
445
+ -------
446
+ None, str, or dict-like
447
+ The user's submission. This is one of the following types:
448
+
449
+ - ``None``: If the user didn't submit a message or file in the last
450
+ rerun, the widget returns ``None``.
451
+ - A string: When the widget is not configured to accept files and
452
+ the user submitted a message in the last rerun, the widget
453
+ returns the user's message as a string.
454
+ - A dict-like object: When the widget is configured to accept files
455
+ and the user submitted a message and/or file(s) in the last
456
+ rerun, the widget returns a dict-like object with two attributes,
457
+ ``text`` and ``files``.
458
+
459
+ When the widget is configured to accept files and the user submits
460
+ something in the last rerun, you can access the user's submission
461
+ with key or attribute notation from the dict-like object. This is
462
+ shown in Example 3 below.
463
+
464
+ The ``text`` attribute holds a string, which is the user's message.
465
+ This is an empty string if the user only submitted one or more
466
+ files.
467
+
468
+ The ``files`` attribute holds a list of UploadedFile objects.
469
+ The list is empty if the user only submitted a message. Unlike
470
+ ``st.file_uploader``, this attribute always returns a list, even
471
+ when the widget is configured to accept only one file at a time.
472
+
473
+ The UploadedFile class is a subclass of BytesIO, and therefore is
474
+ "file-like". This means you can pass an instance of it anywhere a
475
+ file is expected.
476
+
477
+ Examples
478
+ --------
479
+ **Example 1: Pin the the chat input widget to the bottom of your app**
480
+
481
+ When ``st.chat_input`` is used in the main body of an app, it will be
482
+ pinned to the bottom of the page.
483
+
484
+ >>> import streamlit as st
485
+ >>>
486
+ >>> prompt = st.chat_input("Say something")
487
+ >>> if prompt:
488
+ ... st.write(f"User has sent the following prompt: {prompt}")
489
+
490
+ .. output ::
491
+ https://doc-chat-input.streamlit.app/
492
+ height: 350px
493
+
494
+ **Example 2: Use the chat input widget inline**
495
+
496
+ The chat input can also be used inline by nesting it inside any layout
497
+ container (container, columns, tabs, sidebar, etc) or fragment. Create
498
+ chat interfaces embedded next to other content, or have multiple
499
+ chatbots!
500
+
501
+ >>> import streamlit as st
502
+ >>>
503
+ >>> with st.sidebar:
504
+ >>> messages = st.container(height=300)
505
+ >>> if prompt := st.chat_input("Say something"):
506
+ >>> messages.chat_message("user").write(prompt)
507
+ >>> messages.chat_message("assistant").write(f"Echo: {prompt}")
508
+
509
+ .. output ::
510
+ https://doc-chat-input-inline.streamlit.app/
511
+ height: 350px
512
+
513
+ **Example 3: Let users upload files**
514
+
515
+ When you configure your chat input widget to allow file attachments, it
516
+ will return a dict-like object when the user sends a submission. You
517
+ can access the user's message through the ``text`` attribute of this
518
+ dictionary. You can access a list of the user's submitted file(s)
519
+ through the ``files`` attribute. Similar to ``st.session_state``, you
520
+ can use key or attribute notation.
521
+
522
+ >>> import streamlit as st
523
+ >>>
524
+ >>> prompt = st.chat_input(
525
+ >>> "Say something and/or attach an image",
526
+ >>> accept_file=True,
527
+ >>> file_type=["jpg", "jpeg", "png"],
528
+ >>> )
529
+ >>> if prompt and prompt.text:
530
+ >>> st.markdown(prompt.text)
531
+ >>> if prompt and prompt["files"]:
532
+ >>> st.image(prompt["files"][0])
533
+
534
+ .. output ::
535
+ https://doc-chat-input-file-uploader.streamlit.app/
536
+ height: 350px
537
+
538
+ """
539
+ # We default to an empty string here and disallow user choice intentionally
540
+ default = ""
541
+ key = to_key(key)
542
+
543
+ check_widget_policies(
544
+ self.dg,
545
+ key,
546
+ on_submit,
547
+ default_value=default,
548
+ writes_allowed=False,
549
+ )
550
+
551
+ if accept_file not in {True, False, "multiple"}:
552
+ raise StreamlitAPIException(
553
+ "The `accept_file` parameter must be a boolean or 'multiple'."
554
+ )
555
+
556
+ ctx = get_script_run_ctx()
557
+
558
+ element_id = compute_and_register_element_id(
559
+ "chat_input",
560
+ user_key=key,
561
+ # chat_input is not allowed to be used in a form.
562
+ form_id=None,
563
+ placeholder=placeholder,
564
+ max_chars=max_chars,
565
+ accept_file=accept_file,
566
+ file_type=file_type,
567
+ )
568
+
569
+ if file_type:
570
+ file_type = normalize_upload_file_type(file_type)
571
+
572
+ # It doesn't make sense to create a chat input inside a form.
573
+ # We throw an error to warn the user about this.
574
+ # We omit this check for scripts running outside streamlit, because
575
+ # they will have no script_run_ctx.
576
+ if runtime.exists():
577
+ if is_in_form(self.dg):
578
+ raise StreamlitAPIException(
579
+ "`st.chat_input()` can't be used in a `st.form()`."
580
+ )
581
+
582
+ # Determine the position of the chat input:
583
+ # Use bottom position if chat input is within the main container
584
+ # either directly or within a vertical container. If it has any
585
+ # other container types as parents, we use inline position.
586
+ ancestor_block_types = set(self.dg._active_dg._ancestor_block_types)
587
+ if (
588
+ self.dg._active_dg._root_container == RootContainer.MAIN
589
+ and not ancestor_block_types
590
+ ):
591
+ position = "bottom"
592
+ else:
593
+ position = "inline"
594
+
595
+ chat_input_proto = ChatInputProto()
596
+ chat_input_proto.id = element_id
597
+ chat_input_proto.placeholder = str(placeholder)
598
+
599
+ if max_chars is not None:
600
+ chat_input_proto.max_chars = max_chars
601
+
602
+ chat_input_proto.default = default
603
+
604
+ chat_input_proto.accept_file = get_chat_input_accept_file_proto_value(
605
+ accept_file
606
+ )
607
+
608
+ chat_input_proto.file_type[:] = file_type if file_type is not None else []
609
+ chat_input_proto.max_upload_size_mb = config.get_option("server.maxUploadSize")
610
+
611
+ serde = ChatInputSerde(
612
+ accept_files=bool(accept_file),
613
+ allowed_types=file_type,
614
+ )
615
+ widget_state = register_widget( # type: ignore[misc]
616
+ chat_input_proto.id,
617
+ on_change_handler=on_submit,
618
+ args=args,
619
+ kwargs=kwargs,
620
+ deserializer=serde.deserialize,
621
+ serializer=serde.serialize,
622
+ ctx=ctx,
623
+ value_type="chat_input_value",
624
+ )
625
+
626
+ chat_input_proto.disabled = disabled
627
+ if widget_state.value_changed and widget_state.value is not None:
628
+ chat_input_proto.value = widget_state.value
629
+ chat_input_proto.set_value = True
630
+
631
+ if ctx:
632
+ save_for_app_testing(ctx, element_id, widget_state.value)
633
+ if position == "bottom":
634
+ # We need to enqueue the chat input into the bottom container
635
+ # instead of the currently active dg.
636
+ get_dg_singleton_instance().bottom_dg._enqueue(
637
+ "chat_input", chat_input_proto
638
+ )
639
+ else:
640
+ self.dg._enqueue("chat_input", chat_input_proto)
641
+
642
+ return widget_state.value if not widget_state.value_changed else None
643
+
644
+ @property
645
+ def dg(self) -> DeltaGenerator:
646
+ """Get our DeltaGenerator."""
647
+ return cast("DeltaGenerator", self)