Перейти к содержимому

Паттерн персистентности Notes

Сохранение структурированных данных, которые переживают перезапуски workflow или должны передаваться между шагами. Notes обеспечивают key-value хранилище с версионированием и тегами.

СценарийПример
Восстановление сессииСохранение промежуточных результатов для продолжения после прерывания
Передача данных между шагамиПередача сложных данных между agent-directive нодами
Пользовательские настройкиЗапоминание выборов, настроек, конфигурации
Результаты анализаСохранение исследований, сравнений, рекомендаций
История выполненияОтслеживание решений во время выполнения workflow
[collect-data] → [write-note] → [other-steps] → [read-note] → [use-data]

Сохранение результата agent-directive ноды:

{
"id": "save-analysis",
"type": "write-note",
"key": "purchase-{{executionId}}-01-analysis",
"source": "{{analyze-step-output}}",
"tags": ["purchase-{{executionId}}", "analysis"],
"connections": {
"default": "next-step",
"error": "handle-error"
}
}

Паттерн ключа: {domain}-{{executionId}}-{sequence}-{description}

ЧастьНазначениеПример
domainОбласть workflowpurchase, research
scopeИзоляция выполнения{{executionId}}
sequenceПорядок01, 02, 03
descriptionПодсказка содержимогоuser-needs, analysis

Запись нескольких notes из массива:

{
"id": "save-batch",
"type": "write-note",
"source": "{{items-to-save}}",
"batchMode": true,
"connections": { "default": "next" }
}

Формат массива source:

[
{ "key": "item-001", "value": "content 1", "tags": ["batch"] },
{ "key": "item-002", "value": "content 2", "tags": ["batch"] }
]

Загрузка notes в context variable:

{
"id": "load-data",
"type": "read-note",
"outputVariable": "previousData",
"filter": {
"keyPattern": "purchase-{{executionId}}"
},
"connections": { "default": "use-data" }
}

Режим single для единственной note:

{
"id": "load-preferences",
"type": "read-note",
"outputVariable": "userPrefs",
"filter": { "tag": "preferences" },
"singleMode": true,
"connections": { "default": "apply-prefs" }
}

Обновление существующей или создание новой:

{
"id": "update-preferences",
"type": "upsert-note",
"search": {
"tag": "user-prefs",
"keyPattern": "prefs-{{userId}}"
},
"keyTemplate": "prefs-{{userId}}-new",
"value": "{{collected-preferences}}",
"tags": ["user-prefs"],
"outputVariable": "saveResult",
"connections": { "default": "confirm" }
}

Прямой доступ к notes в директивах:

{
"id": "research-step",
"type": "agent-directive",
"directive": "Исследуй на основе потребностей пользователя.\n\n**Потребности:**\n{{note:purchase-{{executionId}}-01-user-needs}}\n\nОпредели основные категории.",
"completionCondition": "Исследование завершено"
}

Синтаксис: {{note:key-name}}

Содержимое note инжектируется в директиву до получения агентом.

Внутри agent-directive нод используйте MCP tool notes:

// Сохранить note
notes({
action: "save",
key: "user-preferences",
value: JSON.stringify({ theme: "dark", lang: "ru" }),
tags: ["preferences"]
})
// Получить note
notes({
action: "get",
key: "user-preferences"
})
// Список notes по тегу
notes({
action: "list",
tag: "preferences"
})
// Проверить квоту
notes({
action: "stats"
})

Из smart-purchase-assistant.json:

{
"id": "write-note-step-1",
"type": "write-note",
"key": "purchase-{{executionId}}-01-user-needs",
"source": "{{step-1-identify}}",
"tags": ["purchase-{{executionId}}", "smart-purchase"],
"connections": { "default": "step-2-research" }
}

Далее в workflow:

{
"directive": "Создай финальный отчёт о покупке.\n\n**Потребности:**\n{{note:purchase-{{executionId}}-01-user-needs}}\n\n**Результаты исследования:**\n{{note:purchase-{{executionId}}-02-research}}"
}
  • Используйте тег выполнения: purchase-{{executionId}}
  • Используйте тег категории: smart-purchase, research-flow
  • Позволяет эффективную фильтрацию и очистку
{
"id": "write-critical",
"type": "write-note",
"key": "critical-data-{{executionId}}",
"source": "{{results}}",
"connections": {
"default": "continue",
"error": "handle-write-error"
}
}
  • Объекты и массивы автоматически сериализуются в JSON
  • Примитивные значения сохраняются как строки
  • Для больших объектов рассмотрите разбиение или artifacts
// Неправильно - общий между выполнениями
{ "key": "user-analysis" }
// Правильно - изолирован по выполнению
{ "key": "user-analysis-{{executionId}}" }

Избыточное использование notes для простых данных

Заголовок раздела «Избыточное использование notes для простых данных»

Не храните счётчики циклов или временные значения в notes. Используйте expression ноды или context variables.

Notes предназначены для структурированных текстовых данных. Используйте Artifacts для HTML контента или больших файлов.