molab позволяет собрать в браузере записную книжку с кодом, расчётами и графиками. Ниже — первый отчёт по рекламным каналам: вы загрузите учебные данные, посчитаете цену заявки и добавите фильтры, которые пересчитывают результат.

Проверено по официальным источникам 10 октября 2026 года. Локально в marimo 0.25.1 проверены расчёты на Python и SQL, построение графика и экспорт HTML. Облачную сессию, выдачу графического ускорителя (GPU) и подключение агента к molab не тестировали.

Сначала проверьте доступ и видимость данных

⚠️
В списке географических ограничений molab от 24 июня 2026 года указаны Россия и Беларусь. Аккаунты из этих стран запрещены; это условие сервиса, независимо от языка интерфейса. Если оно относится к вам, выполните пример в локальном marimo.

Записные книжки molab публичны по ссылке, хотя по умолчанию не обнаруживаются в каталоге. Получатель ссылки может увидеть статический просмотр и создать свою копию. Отсутствие в каталоге не даёт приватности.

Используйте вымышленные или открытые данные, разрешённые к распространению. Не помещайте в код ключи доступа, клиентские списки и закрытые выгрузки. Отдельная гарантия приватности прикреплённых файлов в изученной документации не найдена: не рассчитывайте на неё.

Условия использования запрещают загружать чувствительные данные, включая медицинские сведения, номера банковских счетов и документов. Условия использования ссылаются на политику приватности CoreWeave. Эти документы описывают обработку данных; они не делают публичную записную книжку закрытой.

Что такое marimo, molab и записная книжка

💡
Записная книжка, или notebook, — документ из ячеек. В одних находится поясняющий текст, в других — код; рядом появляются результаты: таблицы, числа, графики. Так видно, из каких данных и по какой формуле получен вывод.

marimo — открытая система записных книжек для Python. Её можно запускать на своём компьютере. molab — облачный сервис команды marimo: редактор открывается в браузере, а Python работает на удалённом сервере. Это разные уровни одной системы.

ВариантГде выполняется кодФормат и порядок расчётов
marimo локальноВаш компьютер или выбранный вами серверФайл Python; зависимости между ячейками определяют порядок
molabОблачная среда marimoТа же модель записной книжки marimo
JupyterЗависит от установленной среды и сервераОбычно файл .ipynb; состояние зависит от выполненных ячеек
Google ColabОблачная среда GoogleФормат Jupyter .ipynb; порядок расчётов как в Jupyter. Записные книжки хранятся в Google Drive

Реактивный пересчёт: почему меняется весь отчёт

В marimo одна ячейка определяет переменную, например data, другая читает её и создаёт сводку, третья строит график по сводке. Редактор видит эту цепочку. Когда вы запускаете изменённую ячейку с данными, зависимые ячейки пересчитываются автоматически в обычном режиме.

Порядок определяют зависимости, поэтому расположение ячеек на странице не заменяет логику расчётов. Изменение выпадающего списка или ползунка тоже передаёт новое значение в Python.

У этой модели есть правила. Глобальное имя определяется в одной ячейке; повторное определение data в другой вызовет ошибку. Изменения внутри объекта, например data["x"] = ... в соседней ячейке, не отслеживаются как новая зависимость. Создавайте новый результат в новой переменной. Для дорогих расчётов есть отложенный режим: он отмечает устаревшие результаты, пока вы сами не запустите пересчёт.

Основные возможности

ЗадачаСредствоНаблюдаемый результат
Прочитать CSV и проверить колонкиPython и библиотека pandasТаблица и проверки исходных значений
Сгруппировать строкиPython или SQLСводка, которую можно сверить с исходником
Показать различияMatplotlib, Altair и другие библиотекиГрафик рядом с расчётом
Изменить параметры отчётаВыпадающий список, ползунок, формаПересчёт зависимых таблиц и графиков
Передать результатИсходный файл, HTML, PDF, ссылкаКод для повторения либо готовый снимок отчёта
Доработать с агентомОфициальный навык marimo pairАгент читает и меняет работающую записную книжку

SQL-ячейки работают с таблицами Python через DuckDB. Запрос возвращает таблицу, доступную следующим ячейкам; подключать внешнюю базу для первого примера не требуется. Для графиков подходят привычные библиотеки Python; реакцию графика на фильтр обеспечивает связь ячеек.

Тарифы, GPU и ограничения

На дату проверки официальный справочник называет molab бесплатным. Анонс от 1 июня 2026 года описывает бесплатный публичный предварительный доступ при разумном использовании. Это условия на дату источников; обещания бесплатного доступа навсегда нет. Публичную платную тарифную сетку для обычного molab в проверенных источниках не нашли.

РесурсЧто заявлено официальноЧто учитывать
Процессор и память4 CPU, 32 ГБ оперативной памяти на записную книжкуПараметры сервиса могут меняться
GPUNVIDIA RTX Pro 6000 Blackwell, 96 ГБ видеопамятиВключается через кнопку характеристик в заголовке; фактическая выдача здесь не проверялась
СессияДо 12 часов; остановка после более 90 минут простояСохраняйте результат до завершения
ХранениеОграниченный объём постоянного хранилищаПубличных точных квот и срока хранения в изученном справочнике нет

Общие условия использования Marimo (редакция от 22 сентября 2022 года, то есть до запуска molab с GPU) предоставляют сервис «как есть» и по доступности, без соглашения об уровне обслуживания. Цены могут меняться; действующих клиентов обещают уведомить минимум за 30 дней. Заявленную возможность включить GPU нельзя считать гарантией свободного устройства или непрерывной сессии.

molab рассчитан на интерактивные вычисления в редакторе. За фоновые задания, управление через SSH или замену редактора другим интерфейсом сервис может остановить записную книжку без предупреждения. Майнинг, открытие вычислений для внешнего трафика через прокси и перепродажа ресурсов считаются злоупотреблением: за них аккаунт могут заблокировать без уведомления. Поэтому постоянно работающего бота или сервер для клиентов планируйте в другой среде.

Для отчёта ниже GPU не нужен.

Первый отчёт: цена заявки по каналам

Данные вымышлены. Учебный CSV — текстовый файл: первая строка называет колонки, остальные содержат данные; поля разделены запятыми. Расход указан в рублях; leads — число заявок. Задача: сравнить каналы за два месяца и отобрать те, у которых цена заявки укладывается в выбранный порог.

1. Откройте среду

Если условия molab позволяют вам пользоваться сервисом, откройте molab, выберите Create a notebook и выполните предложенный вход. Процедура входа здесь не проверялась: изучали публичный интерфейс без аккаунта.

Локальный вариант: установите Python 3.10 или новее, создайте отдельную папку и окружение. Команды ниже — для macOS/Linux:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install "marimo==0.25.1" pandas matplotlib duckdb sqlglot
marimo edit molab_demo.py

В открывшемся редакторе создавайте по одной Python-ячейке для каждого блока ниже.

В molab используйте встроенный менеджер пакетов, если импорт или SQL сообщает о недостающей зависимости. Для этого примера нужны pandas, matplotlib, duckdb и sqlglot.

2. Подключите библиотеки

Первая ячейка:

import marimo as mo
import pandas as pd
import matplotlib.pyplot as plt
from io import StringIO

Запустите её, затем добавьте следующую. Имя mo даёт доступ к тексту и интерактивным элементам marimo; pd — к обработке таблиц.

3. Прочитайте CSV

Чтобы первый запуск не зависел от загрузки файлов, поместите небольшой CSV прямо в ячейку:

csv_text = """month,channel,spend,leads
2026-08,Поиск,30000,60
2026-08,Соцсети,20000,80
2026-08,Рассылка,5000,50
2026-09,Поиск,36000,72
2026-09,Соцсети,24000,96
2026-09,Рассылка,6000,60"""
data = pd.read_csv(StringIO(csv_text))
assert set(data.columns) == {"month", "channel", "spend", "leads"}
assert not data.isna().any().any()
assert (data["spend"] >= 0).all() and (data["leads"] > 0).all()
data

Должны появиться шесть строк. Проверки остановят этот пример при пропусках, отрицательном расходе или нуле заявок. Для настоящих данных заранее решите, как учитывать канал без заявок; его цену нельзя вычислить обычным делением.

Для работы со своим CSV загрузите разрешённый к распространению файл через значок файлов в боковой панели molab. В существующей ячейке замените строку чтения на data = pd.read_csv("имя_файла.csv"), подставив фактический путь из дерева файлов. Для этого примера нужны колонки month, channel, spend и leads. Вторую ячейку с новым определением data создавать не нужно.

4. Добавьте фильтры

period = mo.ui.dropdown(
    options=["Все", "2026-08", "2026-09"], value="Все", label="Месяц"
)
max_cpl = mo.ui.slider(
    start=100, stop=1000, step=50, value=1000,
    label="Предельная цена заявки, ₽"
)
mo.hstack([period, max_cpl])

Эта ячейка создаёт элементы управления. Их значения читайте в другой ячейке через .value; так формируется зависимость между управлением и расчётом.

5. Соберите сводку и показатели

filtered = data if period.value == "Все" else data[
    data["month"] == period.value
]
summary = filtered.groupby("channel", as_index=False).agg(
    spend=("spend", "sum"), leads=("leads", "sum")
)
summary = summary.assign(cpl=summary["spend"] / summary["leads"])
selected = summary[summary["cpl"] <= max_cpl.value].sort_values("cpl")
selected

Цена заявки — сумма расходов канала, делённая на сумму его заявок. Среднее арифметическое цен отдельных строк даст другой показатель и может исказить сравнение.

В следующей ячейке покажите итог только по каналам, прошедшим фильтр:

total_spend = selected["spend"].sum()
total_leads = selected["leads"].sum()
total_cpl = total_spend / total_leads if total_leads else None
_cpl_text = f"{total_cpl:.2f} ₽" if total_cpl is not None else "нет заявок"
mo.vstack([
    mo.md(f"Расход: **{total_spend:,.0f} ₽** · Заявки: **{total_leads}**"
          f" · Цена заявки: **{_cpl_text}**"),
    mo.ui.table(selected.round({"cpl": 2}), selection=None),
])

Если выборка пуста, показатель покажет «нет заявок» вместо нулевой цены.

6. Постройте график

_fig, _ax = plt.subplots(figsize=(7, 3))
_ax.bar(selected["channel"], selected["cpl"], color="#64a9dc")
_ax.set_ylabel("Цена заявки, ₽")
_ax.set_title("Каналы в выбранном месяце и пороге")
_fig.tight_layout()
_fig

Уменьшите порог до 300 ₽. В таблице и на графике должны остаться «Соцсети» и «Рассылка». При обычном автоматическом режиме вручную запускать каждую следующую ячейку не требуется.

Проверка результата

ВыборРасходЗаявкиЦена заявки
Все месяцы, порог 1000 ₽121 000 ₽418289,47 ₽
Все месяцы, порог 300 ₽55 000 ₽286192,31 ₽
Сентябрь, порог 1000 ₽66 000 ₽228289,47 ₽

Для всех месяцев цены по каналам: «Поиск» — 500 ₽, «Соцсети» — 250 ₽, «Рассылка» — 100 ₽. Сверьте хотя бы один канал вручную: для поиска (30000 + 36000) / (60 + 72) = 500.

Тот же расчёт через SQL

Добавьте Python-ячейку с вызовом mo.sql или используйте SQL-ячейку редактора:

sql_summary = mo.sql(
    """
    SELECT channel, SUM(spend) AS spend, SUM(leads) AS leads,
           SUM(spend) * 1.0 / SUM(leads) AS cpl
    FROM filtered
    GROUP BY channel
    ORDER BY cpl
    """,
    output=False
)
sql_summary

Запрос читает filtered, поэтому реагирует на месяц. Он показывает все каналы выбранного месяца: порог ползунка в этом запросе не применяется. Сверяйте SQL со сводкой summary, а не с отфильтрованной таблицей selected. Суммы в результате SQL могут показываться с дробной частью, например 11000.0: так DuckDB передаёт тип суммы в таблицу pandas, значения совпадают.

Сохранение, экспорт и совместная работа

Скачайте каталог записной книжки кнопкой загрузки в верхней части molab. Храните исходный файл Python и используемые данные вместе. Команда marimo edit <URL> скачивает только файл записной книжки, без прикреплённого хранилища; для полного переноса это существенно.

Между сессиями сохраняются только файлы, загруженные через боковую панель, и постоянный кэш mo.persistent_cache. Файл, который код создал во время сессии, после её остановки не сохранится. Ограничения размера и срока хранения кэша сервис может менять; держите свою копию исходников и данных. Для внешнего хранения molab поддерживает Google Drive, Hugging Face и S3-совместимые хранилища.

Для передачи снимка отчёта экспортируйте его из меню в HTML или PDF. Статический HTML и PDF фиксируют результат; фильтры, которым нужен Python, в них не пересчитываются. Локальный экспорт HTML:

marimo export html molab_demo.py -o molab_demo.html

Эта команда запускает код заново. Перед экспортом проверьте, что ячейки не вызывают платные API и не меняют внешние системы. Экспорт в PDF входит в заявленные возможности molab. Для экспорта в PDF на своём компьютере могут понадобиться дополнительные зависимости: их перечисляет руководство по экспорту.

Для интерактивного просмотра предусмотрены ссылки на приложение (Run as app) и слайды. Совместная работа по обычной ссылке означает просмотр и создание копии; одновременное редактирование одной книжки несколькими людьми в изученных источниках не подтверждено.

При синхронизации с GitHub источником служит файл в репозитории: изменения в GitHub отражаются в molab. Не считайте эту возможность двусторонней синхронизацией. Встроить интерактивную книжку в свою страницу можно через WebAssembly: код вставки (iframe) берётся из WebAssembly-превью книжки, синхронизированной с GitHub, либо собирается из исходного кода. Python при этом выполняется в браузере посетителя, поэтому подходят только совместимые пакеты.

Подключение Codex или Claude Code через marimo pair

Этот сценарий актуален: официальный marimo pair позволяет агенту читать переменные, выполнять и изменять ячейки, проверять логику и управлять элементами интерфейса. Это доступ к работающей среде и её данным. Начните с учебной копии и ограничьте задачу агента.

Подготовьте установленный Codex CLI или Claude Code с вашим разрешённым способом доступа. Установите официальный навык локально командой из документации:

npx skills add marimo-team/marimo-pair

Для npx нужен Node.js. Без него документация предлагает вариант через uv: uvx deno -A npm:skills add marimo-team/marimo-pair.

  1. Запустите записную книжку molab. В меню действий справа сверху выберите Pair with an agent.
  2. Скопируйте инструкцию подключения, которую показывает ваша текущая сессия, в выбранный агент. Не публикуйте её в статье, репозитории или скриншоте.
  3. После подключения дайте ограниченную задачу ниже.
  4. Проверьте, что агент видит шесть строк и изменил ожидаемую ячейку; повторите контрольные суммы из примера.

Промпт:

Работай с учебной записной книжкой через marimo pair.
Сначала покажи имена колонок и число строк. Данные вымышлены.
В файле уже есть выбор месяца, порог цены и график.
Добавь отдельный фильтр по каналу и сохрани нынешние фильтры.
Не определяй data второй раз: используй существующую таблицу.
Считай цену как сумму расходов, делённую на сумму заявок.
При выборе всех месяцев и каналов с порогом 1000 проверь
расход 121000 и 418 заявок. Для канала «Соцсети» проверь
расход 44000, 176 заявок и цену заявки 250.
Объясни, какие ячейки изменил и как проверить их результат.
Не подключай внешние сервисы, не используй платные API,
не загружай другие файлы и не публикуй записную книжку.

Для локального файла документация показывает команду агенту /marimo-pair pair with me on my_notebook.py; подставьте molab_demo.py. Облачную инструкцию подключения берите из интерфейса molab, не составляйте адрес и параметры самостоятельно. Стоимость и лимиты вашего агента определяет его провайдер; бесплатность molab их не отменяет.

Встроенная помощь ИИ — отдельная возможность molab: в текущем справочнике заявлен доступ к открытым моделям без своего API-ключа. Она не равна подключению вашего Codex или Claude Code.

Полезные сценарии

Задача и входЧто сделатьПроверяемый результатОграничение
Разобрать разрешённый к публикации CSV с рекламными расходамиПроверить колонки, сгруппировать строки, добавить фильтр месяцаСуммы сходятся с CSV; видно цену заявки по каналамНеполные данные и качество заявок требуют отдельной проверки
Подготовить учебный отчёт или калькулятор бюджетаВзять агрегаты; добавить ползунок бюджета и формулу «бюджет / цена заявки»Для 10 000 ₽ и цены 250 ₽ получается 40 расчётных заявокЭто сценарная оценка; эффективность рекламы не обязана оставаться постоянной
Провести эксперимент с агентомПодключить marimo pair к синтетической копии; попросить один новый фильтрВидна правка ячеек и повторяемые контрольные результатыАгент может ошибаться; доступные ему данные и внешние вызовы нужно ограничивать

Для закрытого рабочего отчёта выбирайте локальный marimo или согласованную инфраструктуру. Для круглосуточной автоматизации нужен управляемый сервер: интерактивная сессия molab с ограниченным сроком не даёт такого режима.

Что делать при ошибках

СимптомЧто проверитьСледующее действие
ModuleNotFoundErrorНазвание недостающего пакетаУстановить его через менеджер molab либо в локальное окружение; для SQL проверить также sqlglot
FileNotFoundErrorИмя и путь в дереве файловИсправить путь в существующей ячейке чтения
Multiple definitionsПовторное глобальное имя в разных ячейкахОставить одно определение; дать новому результату другое имя
График не меняетсяЧитает ли он selected; включён ли автоматический режимИсправить зависимость или выполнить помеченные устаревшими ячейки
Неверная цена заявкиСумма расходов и сумма заявок; нули, пропуски, дублиСверить исходные строки; не усреднять цены строк без обоснования
Нет GPU или доступ остановленХарактеристики сессии и условия сервисаСохранить доступные результаты; использовать разрешённую альтернативную среду

Официальные ссылки

Следующий шаг

Чтобы повторить сценарий с агентом, разберитесь с установкой и вызовом навыков: Skills и Plugins в Codex App: установка, использование и создание своих.

Если вы готовите отчёты вместе с агентом, полезно заранее определить доступные ему данные, правила расчётов и способ проверки результата.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov