Start
Точка входа для выполнения воркфлоу.
Узлы — это строительные блоки воркфлоу Moira. Каждый узел представляет шаг в процессе со специфическим поведением, определяемым его типом.
Moira поддерживает 7 типов узлов:
Start
Точка входа для выполнения воркфлоу.
End
Терминальный узел, отмечающий завершение воркфлоу.
Agent Directive
Задача агента с директивой и условием завершения.
Condition
Ветвление выполнения на основе структурированных условий.
Expression
Вычисление значений с помощью арифметических выражений.
Subgraph
Делегирование другому воркфлоу.
Telegram Notification
Отправка уведомлений через Telegram.
Точка входа для выполнения воркфлоу. Каждый воркфлоу должен иметь ровно один start node.
{ "id": "start", "type": "start", "initialData": { "projectName": "my-project" }, "connections": { "default": "first-task" }}| Свойство | Обязательно | Описание |
|---|---|---|
id | Да | Соглашение: должен быть “start” |
type | Да | Должен быть "start" |
initialData | Нет | Начальные переменные контекста |
connections.default | Да | ID следующего узла |
Терминальный узел, отмечающий завершение воркфлоу. Нет исходящих соединений.
{ "id": "end", "type": "end", "finalOutput": ["result", "summary"]}| Свойство | Обязательно | Описание |
|---|---|---|
id | Да | Соглашение: должен быть “end” |
type | Да | Должен быть "end" |
finalOutput | Нет | Ключи контекста для включения в финальный результат |
Основной тип узла для задач агента. Содержит директиву (что делать) и условие завершения (когда готово).
{ "id": "analyze-requirements", "type": "agent-directive", "directive": "Проанализируй документ требований и определи ключевые фичи", "completionCondition": "Фичи перечислены с приоритетами", "inputSchema": { "type": "object", "properties": { "features": { "type": "array", "items": { "type": "string" } } }, "required": ["features"] }, "connections": { "success": "next-step" }}| Свойство | Обязательно | Описание |
|---|---|---|
directive | Да | Что агент должен сделать |
completionCondition | Да | Когда шаг завершен |
inputSchema | Нет | JSON Schema для валидации ответа |
connections.success | Да | Следующий узел при успехе |
Ветвление выполнения на основе структурированных условий:
{ "id": "check-result", "type": "condition", "condition": { "operator": "eq", "left": { "contextPath": "status" }, "right": "success" }, "connections": { "true": "success-path", "false": "retry-step" }}| Свойство | Обязательно | Описание |
|---|---|---|
condition | Да | Объект структурированного условия |
connections.true | Да | Следующий узел когда условие true |
connections.false | Да | Следующий узел когда условие false |
Условия используют структурированный формат (не строковую оценку):
{ "operator": "and", "conditions": [ { "operator": "gt", "left": { "contextPath": "score" }, "right": 80 }, { "operator": "eq", "left": { "contextPath": "validated" }, "right": true } ]}Поддерживаемые операторы:
eq, neq — равно, не равноgt, lt, gte, lte — операторы сравненияand, or, not — логические операторыexists, isEmpty — проверки существованияВычисление значений с помощью арифметических выражений. Полезно для счётчиков, расчётов и трансформации переменных:
{ "id": "increment-counter", "type": "expression", "expressions": ["counter = counter + 1", "result = counter * multiplier"], "connections": { "default": "next-step", "error": "error-handler" }}| Свойство | Обязательно | Описание |
|---|---|---|
expressions | Да | Массив выражений присваивания |
connections.default | Да | Следующий узел после успешного вычисления |
connections.error | Нет | Следующий узел при ошибке вычисления |
Выражения поддерживают базовые арифметические операции:
+, -, *, /(a + b) * cresult = a + bstep.index, plan.items[0].value{ "expressions": ["total = price * quantity", "tax = total * 0.1", "final_price = total + tax"]}Expression node может завершиться с ошибкой в двух случаях:
При ошибке выполнение переходит к connection error если он определён, иначе воркфлоу завершается с ошибкой.
Делегирование выполнения другому воркфлоу:
{ "id": "run-tests", "type": "subgraph", "graphId": "test-workflow", "inputMapping": { "codeDir": "projectPath" }, "outputMapping": { "testResults": "results" }, "connections": { "success": "next-step" }}| Свойство | Обязательно | Описание |
|---|---|---|
graphId | Да | ID ссылаемого воркфлоу |
inputMapping | Да | Родительский контекст -> контекст подграфа |
outputMapping | Да | Контекст подграфа -> родительский контекст |
connections.success | Да | Следующий узел при успехе |
Отправка автоматических уведомлений через Telegram:
{ "id": "notify-complete", "type": "telegram-notification", "message": "Воркфлоу {{workflowName}} успешно завершен", "parseMode": "Markdown", "connections": { "default": "next-step", "error": "notification-failed" }}| Свойство | Обязательно | Описание |
|---|---|---|
message | Да | Текст уведомления (поддерживает шаблоны) |
parseMode | Нет | Формат сообщения: “Markdown” или “HTML” |
connections.default | Да | Следующий узел после отправки |
connections.error | Нет | Следующий узел при ошибке API |
Определение ожидаемой структуры ответа с использованием JSON Schema:
{ "inputSchema": { "type": "object", "properties": { "summary": { "type": "string", "description": "Краткое резюме находок" }, "items": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "priority": { "type": "number" } } } } }, "required": ["summary"] }}inputSchema для структурированных ответов