用途:把现有 Streamlit 应用改写为 marimo 笔记本,不覆盖原文件。通用 marimo 约定(单元格结构、PEP 723 元数据、输出渲染、marimo check、变量命名等)参考 marimo-notebook 技能,本技能专注 Streamlit 概念到 marimo 的映射。
主要能力:提供输入控件映射(如 st.slider→mo.ui.slider、st.selectbox→mo.ui.dropdown、st.file_uploader→mo.ui.file、st.button→mo.ui.button 或 mo.ui.run_button、st.form→mo.ui.form)、显示元素映射(st.write→mo.md 或末表达式、st.dataframe→直接输出 df、st.metric→mo.stat、st.json→mo.json 或 mo.tree)、图表映射(plotly/altair/matplotlib 图直接作为末表达式,需选择时用 mo.ui.plotly 等)、布局映射(st.sidebar→mo.sidebar、st.columns→mo.hstack、st.tabs→mo.ui.tabs、st.expander→mo.accordion、st.container→mo.vstack、st.empty→mo.output.replace、st.progress→mo.status.progress_bar、st.spinner→mo.status.spinner)。
使用方式:先阅读 Streamlit 应用理解控件、布局与状态;按 marimo-notebook 约定新建笔记本,依赖中把 streamlit 换成 marimo;按对照表映射组件;处理执行模型、状态、缓存差异;最后运行 uvx marimo check 并修复问题。
关键差异:Streamlit 每次交互重跑整个脚本,marimo 用响应式单元格 DAG,仅重跑依赖变化的单元格,无需 st.rerun() 与 st.stop();状态用跨单元格普通 Python 变量替代 st.session_state,引用 widget.value 的单元格自动重跑,无需回调;缓存用 @mo.cache 替代 @st.cache_data,@mo.persistent_cache 替代 @st.cache_resource;多页应用可用 mo.routes 单笔记本路由,或用 marimo run folder/ 以画廊方式服务多个笔记本;部署可用 molab。
限制:Streamlit 自定义组件与 marimo 不兼容,可能需改用 anywidget 且应先与用户讨论;st.time_input 与 st.color_picker 无专用控件,需用 mo.ui.text 替代。