Dashboard: - Add Studio page with drag-drop model upload and Claude chat - Add intake system for study creation workflow - Improve session manager and context builder - Add intake API routes and frontend components Optimization Engine: - Add CLI module for command-line operations - Add intake module for study preprocessing - Add validation module with gate checks - Improve Zernike extractor documentation - Update spec models with better validation - Enhance solve_simulation robustness Documentation: - Add ATOMIZER_STUDIO.md planning doc - Add ATOMIZER_UX_SYSTEM.md for UX patterns - Update extractor library docs - Add study-readme-generator skill Tools: - Add test scripts for extraction validation - Add Zernike recentering test Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
930 lines
25 KiB
JSON
930 lines
25 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"$id": "https://atomizer.io/schemas/atomizer_spec_v2.json",
|
|
"title": "AtomizerSpec v2.0",
|
|
"description": "Unified configuration schema for Atomizer optimization studies. This is the single source of truth used by Canvas, Backend, Claude, and the Optimization Engine.",
|
|
"type": "object",
|
|
"required": ["meta", "model", "design_variables", "extractors", "objectives", "optimization"],
|
|
|
|
"properties": {
|
|
"meta": {
|
|
"$ref": "#/definitions/meta"
|
|
},
|
|
"model": {
|
|
"$ref": "#/definitions/model"
|
|
},
|
|
"design_variables": {
|
|
"type": "array",
|
|
"description": "Design variables (NX expressions) to optimize",
|
|
"minItems": 1,
|
|
"maxItems": 50,
|
|
"items": {
|
|
"$ref": "#/definitions/design_variable"
|
|
}
|
|
},
|
|
"extractors": {
|
|
"type": "array",
|
|
"description": "Physics extractors that compute outputs from FEA results",
|
|
"minItems": 1,
|
|
"items": {
|
|
"$ref": "#/definitions/extractor"
|
|
}
|
|
},
|
|
"objectives": {
|
|
"type": "array",
|
|
"description": "Optimization objectives (minimize/maximize)",
|
|
"minItems": 1,
|
|
"maxItems": 5,
|
|
"items": {
|
|
"$ref": "#/definitions/objective"
|
|
}
|
|
},
|
|
"constraints": {
|
|
"type": "array",
|
|
"description": "Hard and soft constraints",
|
|
"items": {
|
|
"$ref": "#/definitions/constraint"
|
|
}
|
|
},
|
|
"optimization": {
|
|
"$ref": "#/definitions/optimization"
|
|
},
|
|
"workflow": {
|
|
"$ref": "#/definitions/workflow"
|
|
},
|
|
"reporting": {
|
|
"$ref": "#/definitions/reporting"
|
|
},
|
|
"canvas": {
|
|
"$ref": "#/definitions/canvas"
|
|
}
|
|
},
|
|
|
|
"definitions": {
|
|
"meta": {
|
|
"type": "object",
|
|
"description": "Metadata about the spec",
|
|
"required": ["version", "study_name"],
|
|
"properties": {
|
|
"version": {
|
|
"type": "string",
|
|
"description": "Schema version",
|
|
"pattern": "^2\\.\\d+$",
|
|
"examples": ["2.0", "2.1"]
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When the spec was created"
|
|
},
|
|
"modified": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When the spec was last modified"
|
|
},
|
|
"created_by": {
|
|
"type": "string",
|
|
"description": "Who/what created the spec",
|
|
"enum": ["canvas", "claude", "api", "migration", "manual", "dashboard_intake"]
|
|
},
|
|
"modified_by": {
|
|
"type": "string",
|
|
"description": "Who/what last modified the spec"
|
|
},
|
|
"study_name": {
|
|
"type": "string",
|
|
"description": "Unique study identifier (snake_case)",
|
|
"pattern": "^[a-z0-9_]+$",
|
|
"minLength": 3,
|
|
"maxLength": 100
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Human-readable description of the study",
|
|
"maxLength": 1000
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"description": "Tags for categorization",
|
|
"items": {
|
|
"type": "string",
|
|
"maxLength": 50
|
|
}
|
|
},
|
|
"engineering_context": {
|
|
"type": "string",
|
|
"description": "Real-world engineering scenario"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"description": "Study lifecycle status",
|
|
"enum": ["draft", "introspected", "configured", "validated", "ready", "running", "completed", "failed"],
|
|
"default": "draft"
|
|
},
|
|
"topic": {
|
|
"type": "string",
|
|
"description": "Topic folder for grouping related studies",
|
|
"pattern": "^[A-Za-z0-9_]+$"
|
|
}
|
|
}
|
|
},
|
|
|
|
"model": {
|
|
"type": "object",
|
|
"description": "NX model files and configuration",
|
|
"required": ["sim"],
|
|
"properties": {
|
|
"nx_part": {
|
|
"type": "object",
|
|
"description": "NX geometry part file",
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Path to .prt file"
|
|
},
|
|
"hash": {
|
|
"type": "string",
|
|
"description": "File hash for change detection"
|
|
},
|
|
"idealized_part": {
|
|
"type": "string",
|
|
"description": "Idealized part filename (_i.prt)"
|
|
}
|
|
}
|
|
},
|
|
"fem": {
|
|
"type": "object",
|
|
"description": "FEM mesh file",
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Path to .fem file"
|
|
},
|
|
"element_count": {
|
|
"type": "integer",
|
|
"description": "Number of elements"
|
|
},
|
|
"node_count": {
|
|
"type": "integer",
|
|
"description": "Number of nodes"
|
|
}
|
|
}
|
|
},
|
|
"sim": {
|
|
"type": "object",
|
|
"description": "Simulation file",
|
|
"required": ["path", "solver"],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Path to .sim file"
|
|
},
|
|
"solver": {
|
|
"type": "string",
|
|
"description": "Solver type",
|
|
"enum": ["nastran", "NX_Nastran", "abaqus"]
|
|
},
|
|
"solution_type": {
|
|
"type": "string",
|
|
"description": "Solution type (e.g., SOL101)",
|
|
"pattern": "^SOL\\d+$"
|
|
},
|
|
"subcases": {
|
|
"type": "array",
|
|
"description": "Defined subcases",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["static", "modal", "thermal", "buckling"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"nx_settings": {
|
|
"type": "object",
|
|
"description": "NX runtime settings",
|
|
"properties": {
|
|
"nx_install_path": {
|
|
"type": "string"
|
|
},
|
|
"simulation_timeout_s": {
|
|
"type": "integer",
|
|
"minimum": 60,
|
|
"maximum": 7200
|
|
},
|
|
"auto_start_nx": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"introspection": {
|
|
"$ref": "#/definitions/introspection_data",
|
|
"description": "Model introspection results from intake workflow"
|
|
}
|
|
}
|
|
},
|
|
|
|
"introspection_data": {
|
|
"type": "object",
|
|
"description": "Model introspection results stored in the spec",
|
|
"properties": {
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When introspection was run"
|
|
},
|
|
"solver_type": {
|
|
"type": "string",
|
|
"description": "Detected solver type"
|
|
},
|
|
"mass_kg": {
|
|
"type": "number",
|
|
"description": "Mass from expressions or mass properties"
|
|
},
|
|
"volume_mm3": {
|
|
"type": "number",
|
|
"description": "Volume from mass properties"
|
|
},
|
|
"expressions": {
|
|
"type": "array",
|
|
"description": "Discovered NX expressions",
|
|
"items": {
|
|
"$ref": "#/definitions/expression_info"
|
|
}
|
|
},
|
|
"baseline": {
|
|
"$ref": "#/definitions/baseline_data",
|
|
"description": "Baseline FEA solve results"
|
|
},
|
|
"warnings": {
|
|
"type": "array",
|
|
"description": "Warnings from introspection",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"expression_info": {
|
|
"type": "object",
|
|
"description": "Information about an NX expression from introspection",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Expression name in NX"
|
|
},
|
|
"value": {
|
|
"type": "number",
|
|
"description": "Current value"
|
|
},
|
|
"units": {
|
|
"type": "string",
|
|
"description": "Physical units"
|
|
},
|
|
"formula": {
|
|
"type": "string",
|
|
"description": "Expression formula if any"
|
|
},
|
|
"is_candidate": {
|
|
"type": "boolean",
|
|
"description": "Whether this is a design variable candidate",
|
|
"default": false
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"description": "Confidence that this is a design variable (0.0 to 1.0)",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
|
|
"baseline_data": {
|
|
"type": "object",
|
|
"description": "Results from baseline FEA solve",
|
|
"properties": {
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When baseline was run"
|
|
},
|
|
"solve_time_seconds": {
|
|
"type": "number",
|
|
"description": "How long the solve took"
|
|
},
|
|
"mass_kg": {
|
|
"type": "number",
|
|
"description": "Computed mass from BDF/FEM"
|
|
},
|
|
"max_displacement_mm": {
|
|
"type": "number",
|
|
"description": "Max displacement result"
|
|
},
|
|
"max_stress_mpa": {
|
|
"type": "number",
|
|
"description": "Max von Mises stress"
|
|
},
|
|
"success": {
|
|
"type": "boolean",
|
|
"description": "Whether baseline solve succeeded",
|
|
"default": true
|
|
},
|
|
"error": {
|
|
"type": "string",
|
|
"description": "Error message if failed"
|
|
}
|
|
}
|
|
},
|
|
|
|
"design_variable": {
|
|
"type": "object",
|
|
"description": "A design variable to optimize",
|
|
"required": ["id", "name", "expression_name", "type", "bounds"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Unique identifier",
|
|
"pattern": "^dv_\\d{3}$"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Human-readable name"
|
|
},
|
|
"expression_name": {
|
|
"type": "string",
|
|
"description": "NX expression name (must match model)",
|
|
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Variable type",
|
|
"enum": ["continuous", "integer", "categorical"]
|
|
},
|
|
"bounds": {
|
|
"type": "object",
|
|
"description": "Value bounds",
|
|
"required": ["min", "max"],
|
|
"properties": {
|
|
"min": {
|
|
"type": "number"
|
|
},
|
|
"max": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"baseline": {
|
|
"type": "number",
|
|
"description": "Current/initial value"
|
|
},
|
|
"units": {
|
|
"type": "string",
|
|
"description": "Physical units (mm, deg, etc.)"
|
|
},
|
|
"step": {
|
|
"type": "number",
|
|
"description": "Step size for integer/discrete"
|
|
},
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"description": "Whether to include in optimization",
|
|
"default": true
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"canvas_position": {
|
|
"$ref": "#/definitions/position"
|
|
}
|
|
}
|
|
},
|
|
|
|
"extractor": {
|
|
"type": "object",
|
|
"description": "Physics extractor that computes outputs from FEA",
|
|
"required": ["id", "name", "type", "outputs"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Unique identifier",
|
|
"pattern": "^ext_\\d{3}$"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Human-readable name"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Extractor type",
|
|
"enum": [
|
|
"displacement",
|
|
"frequency",
|
|
"stress",
|
|
"mass",
|
|
"mass_expression",
|
|
"zernike_opd",
|
|
"zernike_csv",
|
|
"temperature",
|
|
"custom_function"
|
|
]
|
|
},
|
|
"builtin": {
|
|
"type": "boolean",
|
|
"description": "Whether this is a built-in extractor",
|
|
"default": true
|
|
},
|
|
"config": {
|
|
"type": "object",
|
|
"description": "Type-specific configuration",
|
|
"properties": {
|
|
"inner_radius_mm": {
|
|
"type": "number"
|
|
},
|
|
"outer_radius_mm": {
|
|
"type": "number"
|
|
},
|
|
"n_modes": {
|
|
"type": "integer"
|
|
},
|
|
"filter_low_orders": {
|
|
"type": "integer"
|
|
},
|
|
"displacement_unit": {
|
|
"type": "string"
|
|
},
|
|
"reference_subcase": {
|
|
"type": "integer"
|
|
},
|
|
"expression_name": {
|
|
"type": "string"
|
|
},
|
|
"mode_number": {
|
|
"type": "integer"
|
|
},
|
|
"element_type": {
|
|
"type": "string"
|
|
},
|
|
"result_type": {
|
|
"type": "string"
|
|
},
|
|
"metric": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"function": {
|
|
"type": "object",
|
|
"description": "Custom function definition (for custom_function type)",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Function name"
|
|
},
|
|
"module": {
|
|
"type": "string",
|
|
"description": "Python module path"
|
|
},
|
|
"signature": {
|
|
"type": "string",
|
|
"description": "Function signature"
|
|
},
|
|
"source_code": {
|
|
"type": "string",
|
|
"description": "Python source code"
|
|
}
|
|
}
|
|
},
|
|
"outputs": {
|
|
"type": "array",
|
|
"description": "Output values this extractor produces",
|
|
"minItems": 1,
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Output name (used by objectives/constraints)"
|
|
},
|
|
"metric": {
|
|
"type": "string",
|
|
"description": "Specific metric (max, total, rms, etc.)"
|
|
},
|
|
"subcase": {
|
|
"type": "integer",
|
|
"description": "Subcase ID for this output"
|
|
},
|
|
"units": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"canvas_position": {
|
|
"$ref": "#/definitions/position"
|
|
}
|
|
}
|
|
},
|
|
|
|
"objective": {
|
|
"type": "object",
|
|
"description": "Optimization objective",
|
|
"required": ["id", "name", "direction", "source"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Unique identifier",
|
|
"pattern": "^obj_\\d{3}$"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Human-readable name"
|
|
},
|
|
"direction": {
|
|
"type": "string",
|
|
"description": "Optimization direction",
|
|
"enum": ["minimize", "maximize"]
|
|
},
|
|
"weight": {
|
|
"type": "number",
|
|
"description": "Weight for weighted sum (multi-objective)",
|
|
"minimum": 0,
|
|
"default": 1.0
|
|
},
|
|
"source": {
|
|
"type": "object",
|
|
"description": "Where the value comes from",
|
|
"required": ["extractor_id", "output_name"],
|
|
"properties": {
|
|
"extractor_id": {
|
|
"type": "string",
|
|
"description": "Reference to extractor"
|
|
},
|
|
"output_name": {
|
|
"type": "string",
|
|
"description": "Which output from the extractor"
|
|
}
|
|
}
|
|
},
|
|
"target": {
|
|
"type": "number",
|
|
"description": "Target value (for goal programming)"
|
|
},
|
|
"units": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"canvas_position": {
|
|
"$ref": "#/definitions/position"
|
|
}
|
|
}
|
|
},
|
|
|
|
"constraint": {
|
|
"type": "object",
|
|
"description": "Hard or soft constraint",
|
|
"required": ["id", "name", "type", "operator", "threshold", "source"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Unique identifier",
|
|
"pattern": "^con_\\d{3}$"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Constraint type",
|
|
"enum": ["hard", "soft"]
|
|
},
|
|
"operator": {
|
|
"type": "string",
|
|
"description": "Comparison operator",
|
|
"enum": ["<=", ">=", "<", ">", "=="]
|
|
},
|
|
"threshold": {
|
|
"type": "number",
|
|
"description": "Constraint threshold value"
|
|
},
|
|
"source": {
|
|
"type": "object",
|
|
"description": "Where the value comes from",
|
|
"required": ["extractor_id", "output_name"],
|
|
"properties": {
|
|
"extractor_id": {
|
|
"type": "string"
|
|
},
|
|
"output_name": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"penalty_config": {
|
|
"type": "object",
|
|
"description": "Penalty method configuration",
|
|
"properties": {
|
|
"method": {
|
|
"type": "string",
|
|
"enum": ["linear", "quadratic", "exponential"]
|
|
},
|
|
"weight": {
|
|
"type": "number"
|
|
},
|
|
"margin": {
|
|
"type": "number",
|
|
"description": "Soft margin before penalty kicks in"
|
|
}
|
|
}
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"canvas_position": {
|
|
"$ref": "#/definitions/position"
|
|
}
|
|
}
|
|
},
|
|
|
|
"optimization": {
|
|
"type": "object",
|
|
"description": "Optimization algorithm configuration",
|
|
"required": ["algorithm", "budget"],
|
|
"properties": {
|
|
"algorithm": {
|
|
"type": "object",
|
|
"required": ["type"],
|
|
"properties": {
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Algorithm type",
|
|
"enum": ["TPE", "CMA-ES", "NSGA-II", "RandomSearch", "SAT_v3", "GP-BO"]
|
|
},
|
|
"config": {
|
|
"type": "object",
|
|
"description": "Algorithm-specific settings",
|
|
"properties": {
|
|
"population_size": {
|
|
"type": "integer"
|
|
},
|
|
"n_generations": {
|
|
"type": "integer"
|
|
},
|
|
"mutation_prob": {
|
|
"type": ["number", "null"]
|
|
},
|
|
"crossover_prob": {
|
|
"type": "number"
|
|
},
|
|
"seed": {
|
|
"type": "integer"
|
|
},
|
|
"n_startup_trials": {
|
|
"type": "integer"
|
|
},
|
|
"sigma0": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"budget": {
|
|
"type": "object",
|
|
"description": "Computational budget",
|
|
"properties": {
|
|
"max_trials": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 10000
|
|
},
|
|
"max_time_hours": {
|
|
"type": "number"
|
|
},
|
|
"convergence_patience": {
|
|
"type": "integer",
|
|
"description": "Stop if no improvement for N trials"
|
|
}
|
|
}
|
|
},
|
|
"surrogate": {
|
|
"type": "object",
|
|
"description": "Neural surrogate configuration",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["MLP", "GNN", "ensemble"]
|
|
},
|
|
"config": {
|
|
"type": "object",
|
|
"properties": {
|
|
"n_models": {
|
|
"type": "integer"
|
|
},
|
|
"architecture": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"train_every_n_trials": {
|
|
"type": "integer"
|
|
},
|
|
"min_training_samples": {
|
|
"type": "integer"
|
|
},
|
|
"acquisition_candidates": {
|
|
"type": "integer"
|
|
},
|
|
"fea_validations_per_round": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"canvas_position": {
|
|
"$ref": "#/definitions/position"
|
|
}
|
|
}
|
|
},
|
|
|
|
"workflow": {
|
|
"type": "object",
|
|
"description": "Multi-stage optimization workflow",
|
|
"properties": {
|
|
"stages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"algorithm": {
|
|
"type": "string"
|
|
},
|
|
"trials": {
|
|
"type": "integer"
|
|
},
|
|
"purpose": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"transitions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"from": {
|
|
"type": "string"
|
|
},
|
|
"to": {
|
|
"type": "string"
|
|
},
|
|
"condition": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"reporting": {
|
|
"type": "object",
|
|
"description": "Reporting configuration",
|
|
"properties": {
|
|
"auto_report": {
|
|
"type": "boolean"
|
|
},
|
|
"report_triggers": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"insights": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"type": {
|
|
"type": "string"
|
|
},
|
|
"for_trials": {
|
|
"type": "string"
|
|
},
|
|
"config": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"canvas": {
|
|
"type": "object",
|
|
"description": "Canvas UI state (persisted for reconstruction)",
|
|
"properties": {
|
|
"layout_version": {
|
|
"type": "string"
|
|
},
|
|
"viewport": {
|
|
"type": "object",
|
|
"properties": {
|
|
"x": {
|
|
"type": "number"
|
|
},
|
|
"y": {
|
|
"type": "number"
|
|
},
|
|
"zoom": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"edges": {
|
|
"type": "array",
|
|
"description": "Connections between nodes",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["source", "target"],
|
|
"properties": {
|
|
"source": {
|
|
"type": "string"
|
|
},
|
|
"target": {
|
|
"type": "string"
|
|
},
|
|
"sourceHandle": {
|
|
"type": "string"
|
|
},
|
|
"targetHandle": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"groups": {
|
|
"type": "array",
|
|
"description": "Node groupings for organization",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"node_ids": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"position": {
|
|
"type": "object",
|
|
"description": "Canvas position",
|
|
"properties": {
|
|
"x": {
|
|
"type": "number"
|
|
},
|
|
"y": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|