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

Система валидации

Moira выполняет всестороннюю валидацию на нескольких уровнях для обеспечения целостности workflow и корректности ответов агентов.

Workflow валидируются против определения JSON Schema:

  • Валидация структуры против схемы workflow
  • Проверка обязательных полей (id, metadata, nodes)
  • Валидация типов для всех свойств
  • Валидация enum для типов нод

Структура графа анализируется на корректность:

  • Связность нод - Все connections указывают на валидные ноды
  • Обязательные ноды - Нода start должна существовать
  • Циклические зависимости - Циклы обнаруживаются и помечаются
  • Недостижимые ноды - Ноды не связанные от start

Ответы агентов валидируются против inputSchema:

  • Валидация JSON Schema на основе AJV
  • Проверка типов для полей ответа
  • Валидация обязательных полей
  • Валидация pattern и format

Валидация возвращает структурированные результаты:

{
valid: boolean;
errors: ValidationError[];
warnings: ValidationWarning[];
}
ТипОписаниеПример
schemaНевалидная JSON структураОтсутствует обязательное поле
structureНевалидная структура графаOrphan нода
connectionНевалидное соединениеУказывает на несуществующую ноду
referenceНевалидная ссылкаНевалидный subgraph ID
ТипОписаниеПорог
performanceБольшой workflow>20 agent-directive нод
complexityСложные условияГлубоко вложенные условия
contextБольшой контекст>100KB размер контекста
{
"id": "valid-workflow",
"metadata": {
"name": "Valid Workflow",
"version": "1.0.0",
"description": "A valid workflow"
},
"nodes": [
{ "id": "start", "type": "start", "connections": { "default": "task" } },
{
"id": "task",
"type": "agent-directive",
"directive": "...",
"completionCondition": "...",
"connections": { "success": "end" }
},
{ "id": "end", "type": "end" }
]
}

Результат:

{ "valid": true, "errors": [], "warnings": [] }
{
"nodes": [
{ "id": "start", "type": "start", "connections": { "default": "missing" } },
{ "id": "end", "type": "end" }
]
}

Результат:

{
"valid": false,
"errors": [
{
"type": "connection",
"message": "Node 'start' references non-existent node 'missing'",
"nodeId": "start"
}
]
}

Большой workflow вызывает предупреждение о производительности:

{
"valid": true,
"errors": [],
"warnings": [
{
"type": "performance",
"message": "Workflow has 25 agent-directive nodes. Consider breaking into subgraphs.",
"count": 25
}
]
}

Ответы агентов валидируются против inputSchema определенной на agent-directive нодах.

Ноды без inputSchema требуют пустой ввод от агента. Непустые ответы отклоняются:

// Нода без inputSchema
{ "id": "task", "type": "agent-directive", "directive": "..." }
// Валидно: пустой ответ
{}
// Невалидно: непустой ответ
{ "result": "done" } // Отклоняется с ошибкой валидации
{
"type": "agent-directive",
"inputSchema": {
"type": "object",
"properties": {
"result": { "type": "string" },
"confidence": { "type": "number", "minimum": 0, "maximum": 10 }
},
"required": ["result"]
}
}
{ "result": "completed", "confidence": 8 }
{ "confidence": "high" }

Ошибка:

{
"valid": false,
"errors": [
{ "field": "result", "message": "Required field missing" },
{ "field": "confidence", "message": "Expected number, got string" }
]
}
  1. Всегда включайте inputSchema - Валидируйте ответы агентов для консистентных данных
  2. Держите workflow сфокусированными - Разбивайте большие workflow на subgraphs
  3. Тестируйте валидацию - Используйте manage_workflow с includeValidation: true
  4. Обрабатывайте ошибки gracefully - Определяйте error connections для ошибок валидации