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,406 @@
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
+ """
16
+ LangChain CallbackHandler that prints to streamlit.
17
+
18
+ This is a special API that's imported and used by LangChain itself. Any updates
19
+ to the public API (the StreamlitCallbackHandler constructor, and the entirety
20
+ of LLMThoughtLabeler) *must* remain backwards-compatible to avoid breaking
21
+ LangChain.
22
+
23
+ This means that it's acceptable to add new optional kwargs to StreamlitCallbackHandler,
24
+ but no new positional args or required kwargs should be added, and no existing
25
+ args should be removed. If we need to overhaul the API, we must ensure that a
26
+ compatible API continues to exist.
27
+
28
+ Any major change to the StreamlitCallbackHandler should be tested by importing
29
+ the API *from LangChain itself*.
30
+
31
+ This module is lazy-loaded.
32
+ """
33
+
34
+ # NOTE: We ignore all mypy import-not-found errors as top-level since
35
+ # this module is optional and the langchain dependency is not installed
36
+ # by default.
37
+ # mypy: disable-error-code="import-not-found, unused-ignore, misc"
38
+
39
+ from __future__ import annotations
40
+
41
+ import time
42
+ from enum import Enum
43
+ from typing import TYPE_CHECKING, Any, NamedTuple
44
+
45
+ from langchain.callbacks.base import (
46
+ BaseCallbackHandler,
47
+ )
48
+
49
+ from streamlit.runtime.metrics_util import gather_metrics
50
+
51
+ if TYPE_CHECKING:
52
+ from langchain.schema import (
53
+ AgentAction,
54
+ AgentFinish,
55
+ LLMResult,
56
+ )
57
+
58
+ from streamlit.delta_generator import DeltaGenerator
59
+ from streamlit.elements.lib.mutable_status_container import StatusContainer
60
+
61
+
62
+ def _convert_newlines(text: str) -> str:
63
+ """Convert newline characters to markdown newline sequences
64
+ (space, space, newline).
65
+ """
66
+ return text.replace("\n", " \n")
67
+
68
+
69
+ # The maximum length of the "input_str" portion of a tool label.
70
+ # Strings that are longer than this will be truncated with "..."
71
+ MAX_TOOL_INPUT_STR_LENGTH = 60
72
+
73
+
74
+ class LLMThoughtState(Enum):
75
+ # The LLM is thinking about what to do next. We don't know which tool we'll run.
76
+ THINKING = "THINKING"
77
+ # The LLM has decided to run a tool. We don't have results from the tool yet.
78
+ RUNNING_TOOL = "RUNNING_TOOL"
79
+ # We have results from the tool.
80
+ COMPLETE = "COMPLETE"
81
+ # The LLM completed with an error.
82
+ ERROR = "ERROR"
83
+
84
+
85
+ class ToolRecord(NamedTuple):
86
+ name: str
87
+ input_str: str
88
+
89
+
90
+ class LLMThoughtLabeler:
91
+ """
92
+ Generates markdown labels for LLMThought containers. Pass a custom
93
+ subclass of this to StreamlitCallbackHandler to override its default
94
+ labeling logic.
95
+ """
96
+
97
+ def get_initial_label(self) -> str:
98
+ """Return the markdown label for a new LLMThought that doesn't have
99
+ an associated tool yet.
100
+ """
101
+ return "Thinking..."
102
+
103
+ def get_tool_label(self, tool: ToolRecord, is_complete: bool) -> str:
104
+ """Return the label for an LLMThought that has an associated
105
+ tool.
106
+
107
+ Parameters
108
+ ----------
109
+ tool
110
+ The tool's ToolRecord
111
+
112
+ is_complete
113
+ True if the thought is complete; False if the thought
114
+ is still receiving input.
115
+
116
+ Returns
117
+ -------
118
+ The markdown label for the thought's container.
119
+
120
+ """
121
+ input_str = tool.input_str
122
+ name = tool.name
123
+ if name == "_Exception":
124
+ name = "Parsing error"
125
+ input_str_len = min(MAX_TOOL_INPUT_STR_LENGTH, len(input_str))
126
+ input_str = input_str[:input_str_len]
127
+ if len(tool.input_str) > input_str_len:
128
+ input_str = input_str + "..."
129
+ input_str = input_str.replace("\n", " ")
130
+ return f"**{name}:** {input_str}"
131
+
132
+ def get_final_agent_thought_label(self) -> str:
133
+ """Return the markdown label for the agent's final thought -
134
+ the "Now I have the answer" thought, that doesn't involve
135
+ a tool.
136
+ """
137
+ return "**Complete!**"
138
+
139
+
140
+ class LLMThought:
141
+ """Encapsulates the Streamlit UI for a single LLM 'thought' during a LangChain Agent
142
+ run. Each tool usage gets its own thought; and runs also generally having a
143
+ concluding thought where the Agent determines that it has an answer to the prompt.
144
+
145
+ Each thought gets its own expander UI.
146
+ """
147
+
148
+ def __init__(
149
+ self,
150
+ parent_container: DeltaGenerator,
151
+ labeler: LLMThoughtLabeler,
152
+ expanded: bool,
153
+ collapse_on_complete: bool,
154
+ ):
155
+ self._container = parent_container.status(
156
+ labeler.get_initial_label(), expanded=expanded
157
+ )
158
+
159
+ self._state = LLMThoughtState.THINKING
160
+ self._llm_token_stream = ""
161
+ self._llm_token_stream_placeholder: DeltaGenerator | None = None
162
+ self._last_tool: ToolRecord | None = None
163
+ self._collapse_on_complete = collapse_on_complete
164
+ self._labeler = labeler
165
+
166
+ @property
167
+ def container(self) -> StatusContainer:
168
+ """The container we're writing into."""
169
+ return self._container
170
+
171
+ @property
172
+ def last_tool(self) -> ToolRecord | None:
173
+ """The last tool executed by this thought"""
174
+ return self._last_tool
175
+
176
+ def _reset_llm_token_stream(self) -> None:
177
+ if self._llm_token_stream_placeholder is not None:
178
+ self._llm_token_stream_placeholder.markdown(self._llm_token_stream)
179
+
180
+ self._llm_token_stream = ""
181
+ self._llm_token_stream_placeholder = None
182
+
183
+ def on_llm_start(self, serialized: dict[str, Any], prompts: list[str]) -> None:
184
+ self._reset_llm_token_stream()
185
+
186
+ def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
187
+ # This is only called when the LLM is initialized with `streaming=True`
188
+ self._llm_token_stream += _convert_newlines(token)
189
+ if self._llm_token_stream_placeholder is None:
190
+ self._llm_token_stream_placeholder = self._container.empty()
191
+ self._llm_token_stream_placeholder.markdown(self._llm_token_stream + "▕")
192
+
193
+ def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
194
+ # `response` is the concatenation of all the tokens received by the LLM.
195
+ # If we're receiving streaming tokens from `on_llm_new_token`, this response
196
+ # data is redundant
197
+ self._reset_llm_token_stream()
198
+ # set the container status to complete
199
+ self.complete(self._labeler.get_final_agent_thought_label())
200
+
201
+ def on_llm_error(self, error: BaseException, *args: Any, **kwargs: Any) -> None:
202
+ self._container.exception(error)
203
+ self._state = LLMThoughtState.ERROR
204
+ self.complete("LLM encountered an error...")
205
+
206
+ def on_tool_start(
207
+ self, serialized: dict[str, Any], input_str: str, **kwargs: Any
208
+ ) -> None:
209
+ # Called with the name of the tool we're about to run (in `serialized[name]`),
210
+ # and its input. We change our container's label to be the tool name.
211
+ self._state = LLMThoughtState.RUNNING_TOOL
212
+ tool_name = serialized["name"]
213
+ self._last_tool = ToolRecord(name=tool_name, input_str=input_str)
214
+ self._container.update(
215
+ label=self._labeler.get_tool_label(self._last_tool, is_complete=False),
216
+ state="running",
217
+ )
218
+ if len(input_str) > MAX_TOOL_INPUT_STR_LENGTH:
219
+ # output is printed later in on_tool_end
220
+ self._container.markdown(f"**Input:**\n\n{input_str}\n\n**Output:**")
221
+
222
+ def on_tool_end(
223
+ self,
224
+ output: str,
225
+ color: str | None = None,
226
+ observation_prefix: str | None = None,
227
+ llm_prefix: str | None = None,
228
+ **kwargs: Any,
229
+ ) -> None:
230
+ self._container.markdown(output)
231
+
232
+ def on_tool_error(self, error: BaseException, *args: Any, **kwargs: Any) -> None:
233
+ self._container.markdown("**Tool encountered an error...**")
234
+ self._container.exception(error)
235
+ self._container.update(state="error")
236
+
237
+ def on_agent_action(
238
+ self, action: AgentAction, color: str | None = None, **kwargs: Any
239
+ ) -> Any:
240
+ # Called when we're about to kick off a new tool. The `action` data
241
+ # tells us the tool we're about to use, and the input we'll give it.
242
+ # We don't output anything here, because we'll receive this same data
243
+ # when `on_tool_start` is called immediately after.
244
+ pass
245
+
246
+ def complete(self, final_label: str | None = None) -> None:
247
+ """Finish the thought."""
248
+ if final_label is None and self._state == LLMThoughtState.RUNNING_TOOL:
249
+ assert self._last_tool is not None, (
250
+ "_last_tool should never be null when _state == RUNNING_TOOL"
251
+ )
252
+ final_label = self._labeler.get_tool_label(
253
+ self._last_tool, is_complete=True
254
+ )
255
+
256
+ if self._last_tool and self._last_tool.name == "_Exception":
257
+ self._state = LLMThoughtState.ERROR
258
+ elif self._state != LLMThoughtState.ERROR:
259
+ self._state = LLMThoughtState.COMPLETE
260
+
261
+ if self._collapse_on_complete:
262
+ # Add a quick delay to show the user the final output before we collapse
263
+ time.sleep(0.25)
264
+
265
+ self._container.update(
266
+ label=final_label,
267
+ expanded=False if self._collapse_on_complete else None,
268
+ state="error" if self._state == LLMThoughtState.ERROR else "complete",
269
+ )
270
+
271
+
272
+ class StreamlitCallbackHandler(BaseCallbackHandler):
273
+ @gather_metrics("external.langchain.StreamlitCallbackHandler")
274
+ def __init__(
275
+ self,
276
+ parent_container: DeltaGenerator,
277
+ *,
278
+ max_thought_containers: int = 4,
279
+ expand_new_thoughts: bool = False,
280
+ collapse_completed_thoughts: bool = False,
281
+ thought_labeler: LLMThoughtLabeler | None = None,
282
+ ):
283
+ """Construct a new StreamlitCallbackHandler. This CallbackHandler is geared
284
+ towards use with a LangChain Agent; it displays the Agent's LLM and tool-usage
285
+ "thoughts" inside a series of Streamlit expanders.
286
+
287
+ Parameters
288
+ ----------
289
+
290
+ parent_container
291
+ The `st.container` that will contain all the Streamlit elements that the
292
+ Handler creates.
293
+
294
+ max_thought_containers
295
+
296
+ .. note::
297
+ This parameter is deprecated and is ignored in the latest version of
298
+ the callback handler.
299
+
300
+ The max number of completed LLM thought containers to show at once. When
301
+ this threshold is reached, a new thought will cause the oldest thoughts to
302
+ be collapsed into a "History" expander. Defaults to 4.
303
+
304
+ expand_new_thoughts
305
+ Each LLM "thought" gets its own `st.expander`. This param controls whether
306
+ that expander is expanded by default. Defaults to False.
307
+
308
+ collapse_completed_thoughts
309
+ If True, LLM thought expanders will be collapsed when completed.
310
+ Defaults to False.
311
+
312
+ thought_labeler
313
+ An optional custom LLMThoughtLabeler instance. If unspecified, the handler
314
+ will use the default thought labeling logic. Defaults to None.
315
+ """
316
+ self._parent_container = parent_container
317
+ self._history_parent = parent_container.container()
318
+ self._current_thought: LLMThought | None = None
319
+ self._completed_thoughts: list[LLMThought] = []
320
+ self._max_thought_containers = max(max_thought_containers, 1)
321
+ self._expand_new_thoughts = expand_new_thoughts
322
+ self._collapse_completed_thoughts = collapse_completed_thoughts
323
+ self._thought_labeler = thought_labeler or LLMThoughtLabeler()
324
+
325
+ def _require_current_thought(self) -> LLMThought:
326
+ """Return our current LLMThought. Raise an error if we have no current
327
+ thought.
328
+ """
329
+ if self._current_thought is None:
330
+ raise RuntimeError("Current LLMThought is unexpectedly None!")
331
+ return self._current_thought
332
+
333
+ def _get_last_completed_thought(self) -> LLMThought | None:
334
+ """Return our most recent completed LLMThought, or None if we don't have one."""
335
+ if len(self._completed_thoughts) > 0:
336
+ return self._completed_thoughts[len(self._completed_thoughts) - 1]
337
+ return None
338
+
339
+ def _complete_current_thought(self, final_label: str | None = None) -> None:
340
+ """Complete the current thought, optionally assigning it a new label.
341
+ Add it to our _completed_thoughts list.
342
+ """
343
+ thought = self._require_current_thought()
344
+ thought.complete(final_label)
345
+ self._completed_thoughts.append(thought)
346
+ self._current_thought = None
347
+
348
+ def on_llm_start(
349
+ self, serialized: dict[str, Any], prompts: list[str], **kwargs: Any
350
+ ) -> None:
351
+ if self._current_thought is None:
352
+ self._current_thought = LLMThought(
353
+ parent_container=self._parent_container,
354
+ expanded=self._expand_new_thoughts,
355
+ collapse_on_complete=self._collapse_completed_thoughts,
356
+ labeler=self._thought_labeler,
357
+ )
358
+
359
+ self._current_thought.on_llm_start(serialized, prompts)
360
+
361
+ # We don't prune_old_thought_containers here, because our container won't
362
+ # be visible until it has a child.
363
+
364
+ def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
365
+ self._require_current_thought().on_llm_new_token(token, **kwargs)
366
+
367
+ def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
368
+ self._require_current_thought().on_llm_end(response, **kwargs)
369
+
370
+ def on_llm_error(self, error: BaseException, *args: Any, **kwargs: Any) -> None:
371
+ self._require_current_thought().on_llm_error(error, **kwargs)
372
+
373
+ def on_tool_start(
374
+ self, serialized: dict[str, Any], input_str: str, **kwargs: Any
375
+ ) -> None:
376
+ self._require_current_thought().on_tool_start(serialized, input_str, **kwargs)
377
+
378
+ def on_tool_end(
379
+ self,
380
+ output: str,
381
+ color: str | None = None,
382
+ observation_prefix: str | None = None,
383
+ llm_prefix: str | None = None,
384
+ **kwargs: Any,
385
+ ) -> None:
386
+ self._require_current_thought().on_tool_end(
387
+ output, color, observation_prefix, llm_prefix, **kwargs
388
+ )
389
+ self._complete_current_thought()
390
+
391
+ def on_tool_error(self, error: BaseException, *args: Any, **kwargs: Any) -> None:
392
+ self._require_current_thought().on_tool_error(error, **kwargs)
393
+
394
+ def on_agent_action(
395
+ self, action: AgentAction, color: str | None = None, **kwargs: Any
396
+ ) -> Any:
397
+ self._require_current_thought().on_agent_action(action, color, **kwargs)
398
+
399
+ def on_agent_finish(
400
+ self, finish: AgentFinish, color: str | None = None, **kwargs: Any
401
+ ) -> None:
402
+ if self._current_thought is not None:
403
+ self._current_thought.complete(
404
+ self._thought_labeler.get_final_agent_thought_label()
405
+ )
406
+ self._current_thought = None
streamlit/file_util.py ADDED
@@ -0,0 +1,247 @@
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
+ import contextlib
18
+ import errno
19
+ import io
20
+ import os
21
+ from pathlib import Path
22
+
23
+ from streamlit import env_util, errors
24
+ from streamlit.string_util import is_binary_string
25
+
26
+ # Configuration and credentials are stored inside the ~/.streamlit folder
27
+ CONFIG_FOLDER_NAME = ".streamlit"
28
+
29
+ # If enableStaticServing is enabled, static file served from the ./static folder
30
+ APP_STATIC_FOLDER_NAME = "static"
31
+
32
+
33
+ def get_encoded_file_data(
34
+ data: bytes, encoding: str = "auto"
35
+ ) -> io.StringIO | io.BytesIO:
36
+ """Coerce bytes to a BytesIO or a StringIO.
37
+
38
+ Parameters
39
+ ----------
40
+ data : bytes
41
+ encoding : str
42
+
43
+ Returns
44
+ -------
45
+ BytesIO or StringIO
46
+ If the file's data is in a well-known textual format (or if the encoding
47
+ parameter is set), return a StringIO. Otherwise, return BytesIO.
48
+
49
+ """
50
+ if encoding == "auto":
51
+ # If the file does not look like a pure binary file, assume
52
+ # it's utf-8. It would be great if we could guess it a little
53
+ # more smartly here, but it is what it is!
54
+ data_encoding = None if is_binary_string(data) else "utf-8"
55
+ else:
56
+ data_encoding = encoding
57
+
58
+ if data_encoding:
59
+ return io.StringIO(data.decode(data_encoding))
60
+
61
+ return io.BytesIO(data)
62
+
63
+
64
+ @contextlib.contextmanager
65
+ def streamlit_read(path, binary=False):
66
+ """Opens a context to read this file relative to the streamlit path.
67
+
68
+ For example:
69
+
70
+ with streamlit_read('foo.txt') as foo:
71
+ ...
72
+
73
+ opens the file `.streamlit/foo.txt`
74
+
75
+ path - the path to write to (within the streamlit directory)
76
+ binary - set to True for binary IO
77
+ """
78
+ filename = get_streamlit_file_path(path)
79
+ if os.stat(filename).st_size == 0:
80
+ raise errors.Error(f'Read zero byte file: "{filename}"')
81
+
82
+ mode = "r"
83
+ if binary:
84
+ mode += "b"
85
+ with open(os.path.join(CONFIG_FOLDER_NAME, path), mode) as handle:
86
+ yield handle
87
+
88
+
89
+ @contextlib.contextmanager
90
+ def streamlit_write(path, binary=False):
91
+ """Opens a file for writing within the streamlit path, and
92
+ ensuring that the path exists. For example:
93
+
94
+ with streamlit_write('foo/bar.txt') as bar:
95
+ ...
96
+
97
+ opens the file .streamlit/foo/bar.txt for writing,
98
+ creating any necessary directories along the way.
99
+
100
+ path - the path to write to (within the streamlit directory)
101
+ binary - set to True for binary IO
102
+ """
103
+ mode = "w"
104
+ if binary:
105
+ mode += "b"
106
+ path = get_streamlit_file_path(path)
107
+ os.makedirs(os.path.dirname(path), exist_ok=True)
108
+ try:
109
+ with open(path, mode) as handle:
110
+ yield handle
111
+ except OSError as e:
112
+ msg = [f"Unable to write file: {os.path.abspath(path)}"]
113
+ if e.errno == errno.EINVAL and env_util.IS_DARWIN:
114
+ msg.append(
115
+ "Python is limited to files below 2GB on OSX. "
116
+ "See https://bugs.python.org/issue24658"
117
+ )
118
+ raise errors.Error("\n".join(msg))
119
+
120
+
121
+ def get_static_dir() -> str:
122
+ """Get the folder where static HTML/JS/CSS files live."""
123
+ dirname = os.path.dirname(os.path.normpath(__file__))
124
+ return os.path.normpath(os.path.join(dirname, "static"))
125
+
126
+
127
+ def get_app_static_dir(main_script_path: str) -> str:
128
+ """Get the folder where app static files live"""
129
+ main_script_path = Path(main_script_path)
130
+ static_dir = main_script_path.parent / APP_STATIC_FOLDER_NAME
131
+ return os.path.abspath(static_dir)
132
+
133
+
134
+ def get_streamlit_file_path(*filepath) -> str:
135
+ """Return the full path to a file in ~/.streamlit.
136
+
137
+ This doesn't guarantee that the file (or its directory) exists.
138
+ """
139
+ home = Path.home()
140
+ if home is None:
141
+ raise RuntimeError("No home directory.")
142
+
143
+ return str(home / CONFIG_FOLDER_NAME / Path(*filepath))
144
+
145
+
146
+ def get_project_streamlit_file_path(*filepath):
147
+ """Return the full path to a filepath in ${CWD}/.streamlit.
148
+
149
+ This doesn't guarantee that the file (or its directory) exists.
150
+ """
151
+ return str(Path.cwd() / CONFIG_FOLDER_NAME / Path(*filepath))
152
+
153
+
154
+ def file_is_in_folder_glob(filepath: str, folderpath_glob: str) -> bool:
155
+ """Test whether a file is in some folder with globbing support.
156
+
157
+ Parameters
158
+ ----------
159
+ filepath : str
160
+ A file path.
161
+ folderpath_glob: str
162
+ A path to a folder that may include globbing.
163
+
164
+ """
165
+ # Make the glob always end with "/*" so we match files inside subfolders of
166
+ # folderpath_glob.
167
+ if not folderpath_glob.endswith("*"):
168
+ if folderpath_glob.endswith("/"):
169
+ folderpath_glob += "*"
170
+ else:
171
+ folderpath_glob += "/*"
172
+
173
+ import fnmatch
174
+
175
+ file_dir = os.path.dirname(filepath) + "/"
176
+ return fnmatch.fnmatch(file_dir, folderpath_glob)
177
+
178
+
179
+ def get_directory_size(directory: str) -> int:
180
+ """Return the size of a directory in bytes."""
181
+ total_size = 0
182
+ for dirpath, _, filenames in os.walk(directory):
183
+ for f in filenames:
184
+ fp = os.path.join(dirpath, f)
185
+ total_size += os.path.getsize(fp)
186
+ return total_size
187
+
188
+
189
+ def file_in_pythonpath(filepath: str) -> bool:
190
+ """Test whether a filepath is in the same folder of a path specified in the PYTHONPATH env variable.
191
+
192
+
193
+ Parameters
194
+ ----------
195
+ filepath : str
196
+ An absolute file path.
197
+
198
+ Returns
199
+ -------
200
+ boolean
201
+ True if contained in PYTHONPATH, False otherwise. False if PYTHONPATH is not defined or empty.
202
+
203
+ """
204
+ pythonpath = os.environ.get("PYTHONPATH", "")
205
+ if len(pythonpath) == 0:
206
+ return False
207
+
208
+ absolute_paths = [os.path.abspath(path) for path in pythonpath.split(os.pathsep)]
209
+ return any(
210
+ file_is_in_folder_glob(os.path.normpath(filepath), path)
211
+ for path in absolute_paths
212
+ )
213
+
214
+
215
+ def normalize_path_join(*args):
216
+ """Return the normalized path of the joined path.
217
+
218
+ Parameters
219
+ ----------
220
+ *args : str
221
+ The path components to join.
222
+
223
+ Returns
224
+ -------
225
+ str
226
+ The normalized path of the joined path.
227
+ """
228
+ return os.path.normpath(os.path.join(*args))
229
+
230
+
231
+ def get_main_script_directory(main_script):
232
+ """Return the full path to the main script directory.
233
+
234
+ Parameters
235
+ ----------
236
+ main_script : str
237
+ The main script path. The path can be an absolute path or a relative
238
+ path.
239
+
240
+ Returns
241
+ -------
242
+ str
243
+ The full path to the main script directory.
244
+ """
245
+ main_script_path = normalize_path_join(os.getcwd(), main_script)
246
+
247
+ return os.path.dirname(main_script_path)