solara-ui 1.45.0__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 (464) hide show
  1. prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  2. prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  3. solara/__init__.py +124 -0
  4. solara/__main__.py +765 -0
  5. solara/_stores.py +297 -0
  6. solara/alias.py +6 -0
  7. solara/autorouting.py +555 -0
  8. solara/cache.py +305 -0
  9. solara/checks.html +71 -0
  10. solara/checks.py +227 -0
  11. solara/comm.py +28 -0
  12. solara/components/__init__.py +77 -0
  13. solara/components/alert.py +155 -0
  14. solara/components/applayout.py +397 -0
  15. solara/components/button.py +85 -0
  16. solara/components/card.py +87 -0
  17. solara/components/checkbox.py +50 -0
  18. solara/components/code_highlight_css.py +11 -0
  19. solara/components/code_highlight_css.vue +63 -0
  20. solara/components/columns.py +159 -0
  21. solara/components/component_vue.py +134 -0
  22. solara/components/cross_filter.py +335 -0
  23. solara/components/dataframe.py +546 -0
  24. solara/components/datatable.py +214 -0
  25. solara/components/datatable.vue +175 -0
  26. solara/components/details.py +56 -0
  27. solara/components/download.vue +35 -0
  28. solara/components/echarts.py +86 -0
  29. solara/components/echarts.vue +139 -0
  30. solara/components/figure_altair.py +39 -0
  31. solara/components/file_browser.py +181 -0
  32. solara/components/file_download.py +199 -0
  33. solara/components/file_drop.py +159 -0
  34. solara/components/file_drop.vue +83 -0
  35. solara/components/file_list_widget.vue +78 -0
  36. solara/components/head.py +27 -0
  37. solara/components/head_tag.py +49 -0
  38. solara/components/head_tag.vue +60 -0
  39. solara/components/image.py +173 -0
  40. solara/components/input.py +456 -0
  41. solara/components/input_text_area.py +86 -0
  42. solara/components/link.py +55 -0
  43. solara/components/markdown.py +441 -0
  44. solara/components/markdown_editor.py +33 -0
  45. solara/components/markdown_editor.vue +359 -0
  46. solara/components/matplotlib.py +74 -0
  47. solara/components/meta.py +47 -0
  48. solara/components/misc.py +333 -0
  49. solara/components/pivot_table.py +258 -0
  50. solara/components/pivot_table.vue +158 -0
  51. solara/components/progress.py +47 -0
  52. solara/components/select.py +182 -0
  53. solara/components/select.vue +27 -0
  54. solara/components/slider.py +442 -0
  55. solara/components/slider_date.vue +56 -0
  56. solara/components/spinner-solara.vue +105 -0
  57. solara/components/spinner.py +45 -0
  58. solara/components/sql_code.py +41 -0
  59. solara/components/sql_code.vue +125 -0
  60. solara/components/style.py +105 -0
  61. solara/components/switch.py +71 -0
  62. solara/components/tab_navigation.py +37 -0
  63. solara/components/title.py +90 -0
  64. solara/components/title.vue +38 -0
  65. solara/components/togglebuttons.py +200 -0
  66. solara/components/tooltip.py +61 -0
  67. solara/core.py +42 -0
  68. solara/datatypes.py +143 -0
  69. solara/express.py +241 -0
  70. solara/hooks/__init__.py +4 -0
  71. solara/hooks/dataframe.py +99 -0
  72. solara/hooks/misc.py +263 -0
  73. solara/hooks/use_reactive.py +151 -0
  74. solara/hooks/use_thread.py +129 -0
  75. solara/kitchensink.py +8 -0
  76. solara/lab/__init__.py +34 -0
  77. solara/lab/components/__init__.py +7 -0
  78. solara/lab/components/chat.py +215 -0
  79. solara/lab/components/confirmation_dialog.py +163 -0
  80. solara/lab/components/cross_filter.py +7 -0
  81. solara/lab/components/input_date.py +339 -0
  82. solara/lab/components/input_time.py +133 -0
  83. solara/lab/components/menu.py +181 -0
  84. solara/lab/components/menu.vue +38 -0
  85. solara/lab/components/tabs.py +274 -0
  86. solara/lab/components/theming.py +98 -0
  87. solara/lab/components/theming.vue +72 -0
  88. solara/lab/hooks/__init__.py +0 -0
  89. solara/lab/hooks/dataframe.py +2 -0
  90. solara/lab/toestand.py +3 -0
  91. solara/lab/utils/__init__.py +2 -0
  92. solara/lab/utils/cookies.py +5 -0
  93. solara/lab/utils/dataframe.py +165 -0
  94. solara/lab/utils/headers.py +5 -0
  95. solara/layout.py +44 -0
  96. solara/lifecycle.py +46 -0
  97. solara/minisettings.py +141 -0
  98. solara/py.typed +0 -0
  99. solara/reactive.py +99 -0
  100. solara/routing.py +268 -0
  101. solara/scope/__init__.py +88 -0
  102. solara/scope/types.py +55 -0
  103. solara/server/__init__.py +0 -0
  104. solara/server/app.py +527 -0
  105. solara/server/assets/custom.css +1 -0
  106. solara/server/assets/custom.js +1 -0
  107. solara/server/assets/favicon.png +0 -0
  108. solara/server/assets/favicon.svg +5 -0
  109. solara/server/assets/style.css +1681 -0
  110. solara/server/assets/theme-dark.css +437 -0
  111. solara/server/assets/theme-light.css +420 -0
  112. solara/server/assets/theme.js +3 -0
  113. solara/server/cdn_helper.py +91 -0
  114. solara/server/esm.py +71 -0
  115. solara/server/fastapi.py +5 -0
  116. solara/server/flask.py +297 -0
  117. solara/server/jupyter/__init__.py +2 -0
  118. solara/server/jupyter/cdn_handler.py +28 -0
  119. solara/server/jupyter/server_extension.py +40 -0
  120. solara/server/jupyter/solara.py +91 -0
  121. solara/server/jupytertools.py +46 -0
  122. solara/server/kernel.py +388 -0
  123. solara/server/kernel_context.py +467 -0
  124. solara/server/patch.py +564 -0
  125. solara/server/pyinstaller/__init__.py +9 -0
  126. solara/server/pyinstaller/hook-ipyreact.py +5 -0
  127. solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
  128. solara/server/pyinstaller/hook-solara.py +9 -0
  129. solara/server/qt.py +113 -0
  130. solara/server/reload.py +251 -0
  131. solara/server/server.py +484 -0
  132. solara/server/settings.py +249 -0
  133. solara/server/shell.py +269 -0
  134. solara/server/starlette.py +770 -0
  135. solara/server/static/ansi.js +270 -0
  136. solara/server/static/highlight-dark.css +82 -0
  137. solara/server/static/highlight.css +43 -0
  138. solara/server/static/main-vuetify.js +272 -0
  139. solara/server/static/main.js +163 -0
  140. solara/server/static/solara_bootstrap.py +129 -0
  141. solara/server/static/sun.svg +23 -0
  142. solara/server/static/webworker.js +42 -0
  143. solara/server/telemetry.py +212 -0
  144. solara/server/templates/index.html.j2 +1 -0
  145. solara/server/templates/loader-plain.css +11 -0
  146. solara/server/templates/loader-plain.html +20 -0
  147. solara/server/templates/loader-solara.css +111 -0
  148. solara/server/templates/loader-solara.html +40 -0
  149. solara/server/templates/plain.html +82 -0
  150. solara/server/templates/solara.html.j2 +486 -0
  151. solara/server/threaded.py +84 -0
  152. solara/server/utils.py +44 -0
  153. solara/server/websocket.py +45 -0
  154. solara/settings.py +86 -0
  155. solara/tasks.py +893 -0
  156. solara/template/button.py +16 -0
  157. solara/template/markdown.py +42 -0
  158. solara/template/portal/.flake8 +6 -0
  159. solara/template/portal/.pre-commit-config.yaml +28 -0
  160. solara/template/portal/LICENSE +21 -0
  161. solara/template/portal/Procfile +7 -0
  162. solara/template/portal/mypy.ini +3 -0
  163. solara/template/portal/pyproject.toml +26 -0
  164. solara/template/portal/solara_portal/__init__.py +4 -0
  165. solara/template/portal/solara_portal/components/__init__.py +2 -0
  166. solara/template/portal/solara_portal/components/article.py +28 -0
  167. solara/template/portal/solara_portal/components/data.py +28 -0
  168. solara/template/portal/solara_portal/components/header.py +6 -0
  169. solara/template/portal/solara_portal/components/layout.py +6 -0
  170. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  171. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  172. solara/template/portal/solara_portal/data.py +60 -0
  173. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  174. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  175. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  176. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  177. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  178. solara/test/__init__.py +0 -0
  179. solara/test/pytest_plugin.py +783 -0
  180. solara/toestand.py +998 -0
  181. solara/util.py +348 -0
  182. solara/validate_hooks.py +258 -0
  183. solara/website/__init__.py +0 -0
  184. solara/website/assets/custom.css +444 -0
  185. solara/website/assets/images/logo-small.png +0 -0
  186. solara/website/assets/images/logo.svg +17 -0
  187. solara/website/assets/images/logo_white.svg +50 -0
  188. solara/website/assets/theme.js +8 -0
  189. solara/website/components/__init__.py +5 -0
  190. solara/website/components/algolia.py +6 -0
  191. solara/website/components/algolia.vue +24 -0
  192. solara/website/components/algolia_api.vue +202 -0
  193. solara/website/components/breadcrumbs.py +28 -0
  194. solara/website/components/contact.py +144 -0
  195. solara/website/components/docs.py +143 -0
  196. solara/website/components/header.py +75 -0
  197. solara/website/components/mailchimp.py +12 -0
  198. solara/website/components/mailchimp.vue +47 -0
  199. solara/website/components/markdown.py +99 -0
  200. solara/website/components/markdown_nav.vue +34 -0
  201. solara/website/components/notebook.py +171 -0
  202. solara/website/components/sidebar.py +105 -0
  203. solara/website/pages/__init__.py +370 -0
  204. solara/website/pages/about/__init__.py +9 -0
  205. solara/website/pages/about/about.md +3 -0
  206. solara/website/pages/apps/__init__.py +16 -0
  207. solara/website/pages/apps/authorization/__init__.py +119 -0
  208. solara/website/pages/apps/authorization/admin.py +12 -0
  209. solara/website/pages/apps/authorization/users.py +12 -0
  210. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  211. solara/website/pages/apps/layout-demo.py +40 -0
  212. solara/website/pages/apps/multipage/__init__.py +38 -0
  213. solara/website/pages/apps/multipage/page1.py +26 -0
  214. solara/website/pages/apps/multipage/page2.py +34 -0
  215. solara/website/pages/apps/scatter.py +136 -0
  216. solara/website/pages/apps/scrolling.py +63 -0
  217. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  218. solara/website/pages/careers/__init__.py +27 -0
  219. solara/website/pages/changelog/__init__.py +10 -0
  220. solara/website/pages/changelog/changelog.md +372 -0
  221. solara/website/pages/contact/__init__.py +34 -0
  222. solara/website/pages/doc_use_download.py +85 -0
  223. solara/website/pages/documentation/__init__.py +90 -0
  224. solara/website/pages/documentation/advanced/__init__.py +9 -0
  225. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  226. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  227. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  228. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  229. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +417 -0
  230. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  231. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +50 -0
  232. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  233. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  234. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  235. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +72 -0
  236. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  237. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  238. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  239. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  240. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  241. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  242. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  243. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  244. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  245. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  246. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  247. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +192 -0
  248. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  249. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  250. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +256 -0
  251. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +108 -0
  252. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  253. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +7 -0
  254. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +187 -0
  255. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  256. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  257. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  258. solara/website/pages/documentation/api/__init__.py +19 -0
  259. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  260. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +22 -0
  261. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +20 -0
  262. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +20 -0
  263. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +20 -0
  264. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  265. solara/website/pages/documentation/api/hooks/use_cross_filter.py +23 -0
  266. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  267. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  268. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  269. solara/website/pages/documentation/api/hooks/use_exception.py +31 -0
  270. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  271. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  272. solara/website/pages/documentation/api/hooks/use_previous.py +30 -0
  273. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  274. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  275. solara/website/pages/documentation/api/hooks/use_state_or_update.py +66 -0
  276. solara/website/pages/documentation/api/hooks/use_thread.md +64 -0
  277. solara/website/pages/documentation/api/hooks/use_thread.py +42 -0
  278. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  279. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  280. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  281. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  282. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  283. solara/website/pages/documentation/api/routing/route.py +29 -0
  284. solara/website/pages/documentation/api/routing/use_route.py +76 -0
  285. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  286. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  287. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  288. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  289. solara/website/pages/documentation/api/utilities/display.py +16 -0
  290. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  291. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  292. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  293. solara/website/pages/documentation/api/utilities/on_kernel_start.py +44 -0
  294. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  295. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  296. solara/website/pages/documentation/components/__init__.py +12 -0
  297. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  298. solara/website/pages/documentation/components/advanced/link.py +25 -0
  299. solara/website/pages/documentation/components/advanced/meta.py +17 -0
  300. solara/website/pages/documentation/components/advanced/style.py +43 -0
  301. solara/website/pages/documentation/components/common.py +9 -0
  302. solara/website/pages/documentation/components/data/__init__.py +9 -0
  303. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  304. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  305. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  306. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  307. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  308. solara/website/pages/documentation/components/input/__init__.py +9 -0
  309. solara/website/pages/documentation/components/input/button.py +23 -0
  310. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  311. solara/website/pages/documentation/components/input/file_browser.py +30 -0
  312. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  313. solara/website/pages/documentation/components/input/input.py +43 -0
  314. solara/website/pages/documentation/components/input/select.py +22 -0
  315. solara/website/pages/documentation/components/input/slider.py +29 -0
  316. solara/website/pages/documentation/components/input/switch.py +10 -0
  317. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  318. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  319. solara/website/pages/documentation/components/lab/chat.py +109 -0
  320. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  321. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  322. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  323. solara/website/pages/documentation/components/lab/input_time.py +15 -0
  324. solara/website/pages/documentation/components/lab/menu.py +22 -0
  325. solara/website/pages/documentation/components/lab/tab.py +25 -0
  326. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  327. solara/website/pages/documentation/components/lab/task.py +11 -0
  328. solara/website/pages/documentation/components/lab/theming.py +74 -0
  329. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  330. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  331. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  332. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  333. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  334. solara/website/pages/documentation/components/layout/card.py +15 -0
  335. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  336. solara/website/pages/documentation/components/layout/column.py +30 -0
  337. solara/website/pages/documentation/components/layout/columns.py +27 -0
  338. solara/website/pages/documentation/components/layout/columns_responsive.py +66 -0
  339. solara/website/pages/documentation/components/layout/details.py +13 -0
  340. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  341. solara/website/pages/documentation/components/layout/gridfixed.py +19 -0
  342. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  343. solara/website/pages/documentation/components/layout/row.py +30 -0
  344. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  345. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  346. solara/website/pages/documentation/components/output/__init__.py +9 -0
  347. solara/website/pages/documentation/components/output/file_download.py +11 -0
  348. solara/website/pages/documentation/components/output/html.py +19 -0
  349. solara/website/pages/documentation/components/output/image.py +11 -0
  350. solara/website/pages/documentation/components/output/markdown.py +57 -0
  351. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  352. solara/website/pages/documentation/components/output/sql_code.py +83 -0
  353. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  354. solara/website/pages/documentation/components/page/__init__.py +9 -0
  355. solara/website/pages/documentation/components/page/head.py +15 -0
  356. solara/website/pages/documentation/components/page/title.py +25 -0
  357. solara/website/pages/documentation/components/status/__init__.py +9 -0
  358. solara/website/pages/documentation/components/status/error.py +39 -0
  359. solara/website/pages/documentation/components/status/info.py +39 -0
  360. solara/website/pages/documentation/components/status/progress.py +10 -0
  361. solara/website/pages/documentation/components/status/spinner.py +11 -0
  362. solara/website/pages/documentation/components/status/success.py +40 -0
  363. solara/website/pages/documentation/components/status/warning.py +47 -0
  364. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  365. solara/website/pages/documentation/components/viz/altair.py +42 -0
  366. solara/website/pages/documentation/components/viz/echarts.py +77 -0
  367. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  368. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  369. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  370. solara/website/pages/documentation/examples/__init__.py +54 -0
  371. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  372. solara/website/pages/documentation/examples/ai/chatbot.py +113 -0
  373. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  374. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  375. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  376. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  377. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  378. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  379. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  380. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  381. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  382. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  383. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  384. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  385. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  386. solara/website/pages/documentation/examples/general/live_update.py +32 -0
  387. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  388. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  389. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  390. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  391. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  392. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  393. solara/website/pages/documentation/examples/libraries/altair.py +65 -0
  394. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  395. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  396. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  397. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  398. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  399. solara/website/pages/documentation/examples/utilities/countdown_timer.py +62 -0
  400. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  401. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  402. solara/website/pages/documentation/examples/visualization/annotator.py +67 -0
  403. solara/website/pages/documentation/examples/visualization/linked_views.py +81 -0
  404. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  405. solara/website/pages/documentation/faq/__init__.py +12 -0
  406. solara/website/pages/documentation/faq/content/99-faq.md +112 -0
  407. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  408. solara/website/pages/documentation/getting_started/content/00-quickstart.md +107 -0
  409. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  410. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  411. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  412. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  413. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  414. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  415. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  416. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  417. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +65 -0
  418. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  419. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  420. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1021 -0
  421. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  422. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +228 -0
  423. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
  424. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  425. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +305 -0
  426. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  427. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  428. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  429. solara/website/pages/docutils.py +38 -0
  430. solara/website/pages/home.vue +1199 -0
  431. solara/website/pages/our_team/__init__.py +83 -0
  432. solara/website/pages/pricing/__init__.py +31 -0
  433. solara/website/pages/roadmap/__init__.py +11 -0
  434. solara/website/pages/roadmap/roadmap.md +47 -0
  435. solara/website/pages/scale_ipywidgets.py +45 -0
  436. solara/website/pages/showcase/__init__.py +105 -0
  437. solara/website/pages/showcase/domino_code_assist.py +60 -0
  438. solara/website/pages/showcase/planeto_tessa.py +19 -0
  439. solara/website/pages/showcase/solara_dev.py +54 -0
  440. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  441. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  442. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  443. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  444. solara/website/pages/showcase/wanderlust.py +27 -0
  445. solara/website/public/beach.jpeg +0 -0
  446. solara/website/public/logo.svg +6 -0
  447. solara/website/public/social/discord.svg +1 -0
  448. solara/website/public/social/github.svg +1 -0
  449. solara/website/public/social/twitter.svg +3 -0
  450. solara/website/public/success.html +25 -0
  451. solara/website/templates/index.html.j2 +117 -0
  452. solara/website/utils.py +51 -0
  453. solara/widgets/__init__.py +1 -0
  454. solara/widgets/vue/gridlayout.vue +107 -0
  455. solara/widgets/vue/html.vue +4 -0
  456. solara/widgets/vue/navigator.vue +134 -0
  457. solara/widgets/vue/vegalite.vue +130 -0
  458. solara/widgets/widgets.py +74 -0
  459. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  460. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  461. solara_ui-1.45.0.dist-info/METADATA +162 -0
  462. solara_ui-1.45.0.dist-info/RECORD +464 -0
  463. solara_ui-1.45.0.dist-info/WHEEL +4 -0
  464. solara_ui-1.45.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,39 @@
1
+ """# Info
2
+
3
+ Solara has 4 types of alerts:
4
+
5
+ * [Success](/documentation/components/status/success)
6
+ * Info (this page)
7
+ * [Warning](/documentation/components/status/warning)
8
+ * [Error](/documentation/components/status/error)
9
+
10
+
11
+
12
+ """
13
+
14
+ import solara
15
+ from solara.website.utils import apidoc
16
+
17
+
18
+ @solara.component
19
+ def Page():
20
+ icon = solara.use_reactive(True)
21
+ dense = solara.use_reactive(False)
22
+ outlined = solara.use_reactive(True)
23
+ text = solara.use_reactive(True)
24
+
25
+ with solara.GridFixed(4):
26
+ solara.Checkbox(label="Use icon", value=icon)
27
+ solara.Checkbox(label="Show dense", value=dense)
28
+ solara.Checkbox(label="Show as text", value=text)
29
+ solara.Checkbox(label="Show outlined", value=outlined)
30
+ solara.Info(
31
+ f"This is solara.Info(label='...', text={text.value}, dense={dense.value}, outlined={outlined.value}, icon={icon.value})",
32
+ text=text.value,
33
+ dense=dense.value,
34
+ outlined=outlined.value,
35
+ icon=icon.value,
36
+ )
37
+
38
+
39
+ __doc__ += apidoc(solara.Info.f) # type: ignore
@@ -0,0 +1,10 @@
1
+ """# ProgressLinear"""
2
+
3
+ import solara
4
+ from solara.website.components import NoPage
5
+ from solara.website.utils import apidoc
6
+
7
+ Page = NoPage
8
+
9
+
10
+ __doc__ += apidoc(solara.ProgressLinear.f) # type: ignore
@@ -0,0 +1,11 @@
1
+ """
2
+ # SpinnerSolara
3
+ """
4
+
5
+ import solara
6
+ from solara.website.components import NoPage
7
+ from solara.website.utils import apidoc
8
+
9
+ Page = NoPage
10
+
11
+ __doc__ += apidoc(solara.SpinnerSolara.f) # type: ignore
@@ -0,0 +1,40 @@
1
+ """# Success
2
+
3
+ Solara has 4 types of alerts:
4
+
5
+ * Success (this page)
6
+ * [Info](/documentation/components/status/info)
7
+ * [Warning](/documentation/components/status/warning)
8
+ * [Error](/documentation/components/status/error)
9
+
10
+
11
+
12
+ """
13
+
14
+ import solara
15
+ from solara.website.utils import apidoc
16
+
17
+
18
+ @solara.component
19
+ def Page():
20
+ icon, set_icon = solara.use_state(True)
21
+ dense, set_dense = solara.use_state(False)
22
+ outlined, set_outlined = solara.use_state(True)
23
+ text, set_text = solara.use_state(True)
24
+ with solara.VBox() as main:
25
+ with solara.GridFixed(4):
26
+ solara.Checkbox(label="Use icon", value=icon, on_value=set_icon)
27
+ solara.Checkbox(label="Show dense", value=dense, on_value=set_dense)
28
+ solara.Checkbox(label="Show as text", value=text, on_value=set_text)
29
+ solara.Checkbox(label="Show outlined", value=outlined, on_value=set_outlined)
30
+ solara.Success(
31
+ f"This is solara.Success(label='...', text={text}, dense={dense}, outlined={outlined}, icon={icon})",
32
+ text=text,
33
+ dense=dense,
34
+ outlined=outlined,
35
+ icon=icon,
36
+ )
37
+ return main
38
+
39
+
40
+ __doc__ += apidoc(solara.Success.f) # type: ignore
@@ -0,0 +1,47 @@
1
+ """# Warning
2
+
3
+ Solara has 4 types of alerts:
4
+
5
+ * [Success](/documentation/components/status/success)
6
+ * [Info](/documentation/components/status/info)
7
+ * Warning (this page)
8
+ * [Error](/documentation/components/status/error)
9
+
10
+
11
+
12
+ """
13
+
14
+ import solara
15
+ from solara.website.utils import apidoc
16
+
17
+
18
+ @solara.component
19
+ def Page():
20
+ icon, set_icon = solara.use_state(True)
21
+ dense, set_dense = solara.use_state(False)
22
+ outlined, set_outlined = solara.use_state(True)
23
+ text, set_text = solara.use_state(True)
24
+ with solara.VBox() as main:
25
+ with solara.GridFixed(4):
26
+ solara.Checkbox(label="Use icon", value=icon, on_value=set_icon)
27
+ solara.Checkbox(label="Show dense", value=dense, on_value=set_dense)
28
+ solara.Checkbox(label="Show as text", value=text, on_value=set_text)
29
+ solara.Checkbox(label="Show outlined", value=outlined, on_value=set_outlined)
30
+ solara.Warning(
31
+ f"This is solara.Warning(label='...', text={text}, dense={dense}, outlined={outlined}, icon={icon})",
32
+ text=text,
33
+ dense=dense,
34
+ outlined=outlined,
35
+ icon=icon,
36
+ )
37
+ solara.Warning(
38
+ f"This is solara.Warning(label='...', text={text}, dense={dense}, outlined={outlined}, icon={icon})",
39
+ text=text,
40
+ dense=dense,
41
+ outlined=outlined,
42
+ icon=icon,
43
+ )
44
+ return main
45
+
46
+
47
+ __doc__ += apidoc(solara.Warning.f) # type: ignore
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.website.components import NoPage, SubCategoryLayout
3
+
4
+ Page = NoPage
5
+
6
+
7
+ @solara.component
8
+ def Layout(children=[]):
9
+ SubCategoryLayout(children=children)
@@ -0,0 +1,42 @@
1
+ """# FigureAltair"""
2
+
3
+ import altair as alt
4
+ import pandas as pd
5
+
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+ title = "FigureAltair"
10
+
11
+ df = pd.DataFrame({"a": ["A", "B", "C", "D", "E", "F", "G", "H", "I"], "b": [28, 55, 43, 91, 81, 53, 19, 87, 52]})
12
+
13
+
14
+ @solara.component
15
+ def Page():
16
+ click_data, set_click_data = solara.use_state(None)
17
+ hover_data, set_hover_data = solara.use_state(None)
18
+
19
+ chart = alt.Chart(df).mark_bar().encode(x="a", y="b")
20
+
21
+ with solara.Div() as main:
22
+ solara.AltairChart(chart, on_click=set_click_data, on_hover=set_hover_data)
23
+
24
+ solara.Markdown(
25
+ f"""
26
+ Click data:
27
+
28
+ ```
29
+ {click_data}
30
+ ```
31
+
32
+ Hover data:
33
+ ```
34
+ {hover_data}
35
+ ```
36
+ """
37
+ )
38
+
39
+ return main
40
+
41
+
42
+ __doc__ += apidoc(solara.FigureAltair.f) # type: ignore
@@ -0,0 +1,77 @@
1
+ """# Echarts"""
2
+
3
+ import solara
4
+ from solara.website.utils import apidoc
5
+
6
+ options = {
7
+ "bars": {
8
+ "title": {"text": "ECharts Getting Started Example"},
9
+ "tooltip": {},
10
+ "legend": {"data": ["sales"]},
11
+ "xAxis": {"type": "category"},
12
+ "yAxis": {},
13
+ "emphasis": {"itemStyle": {"shadowBlur": 10, "shadowOffsetX": 0, "shadowColor": "rgba(0, 0, 0, 0.5)"}},
14
+ "series": [
15
+ {
16
+ "name": "sales",
17
+ "type": "bar",
18
+ "data": [
19
+ {"name": "Shirts", "value": 5},
20
+ {"name": "Cardigans", "value": 20},
21
+ {"name": "Chiffons", "value": 36},
22
+ {"name": "Pants", "value": 10},
23
+ {"name": "Heels", "value": 10},
24
+ {"name": "Socks", "value": 20},
25
+ ],
26
+ "universalTransition": True,
27
+ }
28
+ ],
29
+ },
30
+ "pie": {
31
+ "title": {"text": "ECharts Getting Started Example"},
32
+ "tooltip": {},
33
+ "legend": {"data": ["sales"]},
34
+ "series": [
35
+ {
36
+ "name": "sales",
37
+ "type": "pie",
38
+ "radius": [0, "50%"],
39
+ "data": [
40
+ {"name": "Shirts", "value": 5},
41
+ {"name": "Cardigans", "value": 20},
42
+ {"name": "Chiffons", "value": 36},
43
+ {"name": "Pants", "value": 10},
44
+ {"name": "Heels", "value": 10},
45
+ {"name": "Socks", "value": 20},
46
+ ],
47
+ "universalTransition": True,
48
+ }
49
+ ],
50
+ },
51
+ }
52
+
53
+
54
+ @solara.component
55
+ def Page():
56
+ option, set_option = solara.use_state("bars")
57
+ click_data, set_click_data = solara.use_state(None)
58
+ mouseover_data, set_mouseover_data = solara.use_state(None)
59
+ mouseout_data, set_mouseout_data = solara.use_state(None)
60
+
61
+ with solara.VBox() as main:
62
+ with solara.Card("Echarts"):
63
+ with solara.ToggleButtonsSingle("bars", on_value=set_option):
64
+ solara.Button("bars")
65
+ solara.Button("pie")
66
+ solara.FigureEcharts(
67
+ option=options[option], on_click=set_click_data, on_mouseover=set_mouseover_data, on_mouseout=set_mouseout_data, responsive=True
68
+ )
69
+ with solara.Card("Event data"):
70
+ solara.Markdown(f"**Click data**: {click_data}")
71
+ solara.Markdown(f"**Mouseover data**: {mouseover_data}")
72
+ solara.Markdown(f"**Mouseout data**: {mouseout_data}")
73
+
74
+ return main
75
+
76
+
77
+ __doc__ += apidoc(solara.FigureEcharts.f) # type: ignore
@@ -0,0 +1,30 @@
1
+ """# Matplotlib"""
2
+
3
+ import numpy as np
4
+ from matplotlib.figure import Figure
5
+
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+ x = np.linspace(0, 2, 100)
10
+
11
+
12
+ @solara.component
13
+ def Page():
14
+ freq, set_freq = solara.use_state(2.0)
15
+ phase, set_phase = solara.use_state(0.1)
16
+ y = np.sin(x * freq + phase)
17
+
18
+ fig = Figure()
19
+ ax = fig.subplots()
20
+ ax.plot(x, y)
21
+ ax.set_ylim(-1.2, 1.2)
22
+
23
+ with solara.VBox() as main:
24
+ solara.FloatSlider("Frequency", value=freq, on_value=set_freq, min=0, max=10)
25
+ solara.FloatSlider("Phase", value=phase, on_value=set_phase, min=0, max=np.pi, step=0.1)
26
+ solara.FigureMatplotlib(fig, dependencies=[freq, phase])
27
+ return main
28
+
29
+
30
+ __doc__ += apidoc(solara.FigureMatplotlib.f) # type: ignore
@@ -0,0 +1,63 @@
1
+ """Renders a plotly figure object and support for events.
2
+
3
+ You can use a regular plotly figure, for instance using plotly.express.
4
+
5
+ Supported events are include in the example below.
6
+
7
+ For performance, a dependency list can be provided. Any change to the dependency list will cause the Figure data to be updated.
8
+ This can be significantly faster than comparing he figure data directly.
9
+
10
+ """
11
+
12
+ import plotly.express as px
13
+
14
+ import solara
15
+
16
+ df = px.data.iris()
17
+
18
+
19
+ @solara.component
20
+ def Page():
21
+ with solara.VBox() as main:
22
+ selection_data, set_selection_data = solara.use_state(None)
23
+ click_data, set_click_data = solara.use_state(None)
24
+ hover_data, set_hover_data = solara.use_state(None)
25
+ unhover_data, set_unhover_data = solara.use_state(None)
26
+ deselect_data, set_deselect_data = solara.use_state(None)
27
+ fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
28
+ solara.FigurePlotly(
29
+ fig, on_selection=set_selection_data, on_click=set_click_data, on_hover=set_hover_data, on_unhover=set_unhover_data, on_deselect=set_deselect_data
30
+ )
31
+
32
+ solara.Markdown(
33
+ f"""
34
+ # Events data
35
+ ## selection
36
+ ```
37
+ {selection_data}
38
+ ```
39
+
40
+ ## click
41
+ ```
42
+ {click_data}
43
+ ```
44
+
45
+ ## hover
46
+ ```
47
+ {hover_data}
48
+ ```
49
+
50
+ ## unhover
51
+ ```
52
+ {unhover_data}
53
+ ```
54
+
55
+ ## deselect
56
+ ```
57
+ {deselect_data}
58
+ ```
59
+
60
+
61
+ """
62
+ )
63
+ return main
@@ -0,0 +1,41 @@
1
+ """
2
+
3
+ Wraps plotly express function and adds cross filtering support.
4
+
5
+ Instead of `plotly.express' you can use `solara.express` instead.
6
+
7
+ ```python
8
+ # import plotly.express as px
9
+ import solara.express as px
10
+
11
+ df = px.data.iris()
12
+ px.histogram(df, "species")
13
+ px.scatter(df, x="sepal_width", y="sepal_length", color="species")
14
+ ```
15
+
16
+
17
+ Click the lasso icon in the top scatter plot to select points, which should then be filtered out in the other
18
+ plots.
19
+
20
+
21
+ """
22
+
23
+ import plotly.express as px
24
+
25
+ import solara
26
+ import solara.express as spx
27
+
28
+ df = px.data.iris()
29
+
30
+
31
+ @solara.component
32
+ def Page():
33
+ solara.provide_cross_filter()
34
+ fig = px.histogram(df, "species")
35
+ fig.update_layout(dragmode="select", selectdirection="h")
36
+
37
+ with solara.VBox() as main:
38
+ spx.scatter(df, x="sepal_width", y="sepal_length", color="species")
39
+ spx.scatter_3d(df, x="sepal_width", y="sepal_length", z="petal_width")
40
+ spx.CrossFilteredFigurePlotly(fig)
41
+ return main
@@ -0,0 +1,54 @@
1
+ import solara
2
+ from solara.website.components import Gallery, MarkdownWithMetadata
3
+
4
+ title = "Examples"
5
+
6
+ pycafe_projects = [
7
+ "chatbot",
8
+ "tokenizer",
9
+ ]
10
+
11
+
12
+ @solara.component
13
+ def Page(route_external=None):
14
+ Gallery(route_external)
15
+
16
+
17
+ @solara.component
18
+ def Layout(children):
19
+ # TODO: this is using a private API, what is the best way to do this?
20
+ # we want to 'eat' the whole route for the current level, and the level below
21
+ # for example the utilities directory. But if an example does routing, we don't want
22
+ # to take on that route.
23
+ router = solara.use_router()
24
+ route_current = router.path_routes[-1]
25
+ # route_current, all_routes = solara.use_route()
26
+
27
+ if route_current is None:
28
+ return solara.Error("Page not found")
29
+ module = route_current.module
30
+ assert module is not None
31
+ github_url = solara.util.github_url(module.__file__)
32
+
33
+ if route_current.path == "fullscreen":
34
+ with solara.Padding(4, children=children):
35
+ pass
36
+ else:
37
+ with solara.Column(align="center", style={"max-width": "100%"}):
38
+ doc = module.__doc__
39
+ if doc:
40
+ with solara.Column():
41
+ MarkdownWithMetadata(doc)
42
+ with solara.Column(style={"max-width": "min(100%, 1024px)", "width": "100%"}):
43
+ if route_current.path != "/":
44
+ solara.Button("View source code on GitHub", icon_name="mdi-github-circle", href=github_url, class_="ma-2", target="_blank", text=True)
45
+ if route_current.path in pycafe_projects:
46
+ pycafe_url = f"https://py.cafe/solara/{route_current.path}"
47
+ solara.Button(
48
+ "Run this example on PyCafe", icon_name="mdi-coffee-to-go-outline", href=pycafe_url, class_="ma-2", target="_blank", text=True
49
+ )
50
+ if not hasattr(module, "Page"):
51
+ solara.Error(f"No Page component found in {module}")
52
+ else:
53
+ with solara.Div(children=children):
54
+ pass
@@ -0,0 +1,11 @@
1
+ """Large Language Models and Generative AI examples."""
2
+
3
+ import solara
4
+
5
+ title = "AI"
6
+ redirect = None
7
+
8
+
9
+ @solara.component
10
+ def Page():
11
+ return solara.Markdown("Click an example on the left")
@@ -0,0 +1,113 @@
1
+ """
2
+ # Chatbot
3
+
4
+ A way to create a chatbot using OpenAI's GPT-4 API, utilizing their new API, and the streaming feature.
5
+ """
6
+
7
+ import os
8
+ from typing import List, cast
9
+
10
+ from openai import AsyncOpenAI
11
+ from openai.types.chat import ChatCompletionMessageParam
12
+ from typing_extensions import TypedDict
13
+
14
+ import solara
15
+ import solara.lab
16
+
17
+
18
+ class MessageDict(TypedDict):
19
+ role: str # "user" or "assistant"
20
+ content: str
21
+
22
+
23
+ messages: solara.Reactive[List[MessageDict]] = solara.reactive([])
24
+
25
+ try:
26
+ import pycafe
27
+
28
+ OPENAI_API_KEY = pycafe.get_secret(
29
+ "OPENAI_API_KEY",
30
+ """We need an OpenAI API key to generate text.
31
+
32
+ Go to [OpenAI](https://platform.openai.com/account/api-keys) to get one.
33
+
34
+ Or read [this](https://www.rebelmouse.com/openai-account-set-up) article for
35
+ more information.
36
+
37
+ Or read more [about secrets on PyCafe](/docs/secrets)
38
+
39
+ """,
40
+ )
41
+ except ModuleNotFoundError:
42
+ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
43
+
44
+ openai = AsyncOpenAI(api_key=OPENAI_API_KEY) if OPENAI_API_KEY else None
45
+
46
+
47
+ def no_api_key_message():
48
+ messages.value = [
49
+ {
50
+ "role": "assistant",
51
+ "content": "No OpenAI API key found. Please set your OpenAI API key in the environment variable `OPENAI_API_KEY`.",
52
+ },
53
+ ]
54
+
55
+
56
+ @solara.lab.task
57
+ async def promt_ai(message: str):
58
+ if openai is None:
59
+ no_api_key_message()
60
+ return
61
+
62
+ messages.value = [
63
+ *messages.value,
64
+ {"role": "user", "content": message},
65
+ ]
66
+ # The part below can be replaced with a call to your own
67
+ response = await openai.chat.completions.create(
68
+ model="gpt-4-1106-preview",
69
+ # our MessageDict is compatible with the OpenAI types
70
+ messages=cast(List[ChatCompletionMessageParam], messages.value),
71
+ stream=True,
72
+ )
73
+ # start with an empty reply message, so we render and empty message in the chat
74
+ # while the AI is thinking
75
+ messages.value = [*messages.value, {"role": "assistant", "content": ""}]
76
+ # and update it with the response
77
+ async for chunk in response:
78
+ if chunk.choices[0].finish_reason == "stop": # type: ignore
79
+ return
80
+ # replace the last message element with the appended content
81
+ delta = chunk.choices[0].delta.content
82
+ assert delta is not None
83
+ updated_message: MessageDict = {
84
+ "role": "assistant",
85
+ "content": messages.value[-1]["content"] + delta,
86
+ }
87
+ # replace the last message element with the appended content
88
+ # which will update the UI
89
+ messages.value = [*messages.value[:-1], updated_message]
90
+
91
+
92
+ @solara.component
93
+ def Page():
94
+ with solara.Column(
95
+ style={"width": "100%", "height": "50vh"},
96
+ ):
97
+ with solara.lab.ChatBox():
98
+ for item in messages.value:
99
+ with solara.lab.ChatMessage(
100
+ user=item["role"] == "user",
101
+ avatar=False,
102
+ name="ChatGPT" if item["role"] == "assistant" else "User",
103
+ color="rgba(0,0,0, 0.06)" if item["role"] == "assistant" else "#ff991f",
104
+ avatar_background_color="primary" if item["role"] == "assistant" else None,
105
+ border_radius="20px",
106
+ ):
107
+ solara.Markdown(item["content"])
108
+ if promt_ai.pending:
109
+ solara.Text("I'm thinking...", style={"font-size": "1rem", "padding-left": "20px"})
110
+ solara.ProgressLinear()
111
+ # if we don't call .key(..) with a unique key, the ChatInput component will be re-created
112
+ # and we'll lose what we typed.
113
+ solara.lab.ChatInput(send_callback=promt_ai, disabled_send=promt_ai.pending, autofocus=True).key("input")