{
	"$id": "https://raw.githubusercontent.com/breadboard-ai/breadboard/@google-labs/breadboard-schema@1.15.0/packages/schema/breadboard.schema.json",
	"$schema": "http://json-schema.org/draft-07/schema#",
	"$ref": "#/definitions/GraphDescriptor",
	"definitions": {
		"GraphDescriptor": {
			"type": "object",
			"additionalProperties": false,
			"properties": {
				"inputs": {
					"$ref": "#/definitions/InputValues",
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"outputs": {
					"anyOf": [
						{
							"$ref": "#/definitions/OutputValues"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/OutputValues"
							}
						}
					],
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"sequence": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/NodeIdentifier"
					},
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"throws": {
					"type": "boolean",
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"safe": {
					"type": "boolean",
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"expectedLabels": {
					"type": "array",
					"items": {
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"explanation": {
					"type": "string",
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"start": {
					"$ref": "#/definitions/NodeIdentifier",
					"description": "For internal testing only. Do not use.",
					"deprecated": "For internal testing only. Do not use."
				},
				"$schema": {
					"type": "string",
					"description": "The schema of the graph."
				},
				"url": {
					"type": "string",
					"description": "The URL pointing to the location of the graph. This URL is used to resolve relative paths in the graph. If not specified, the paths are assumed to be relative to the current working directory."
				},
				"title": {
					"type": "string",
					"description": "The title of the graph."
				},
				"description": {
					"type": "string",
					"description": "The description of the graph."
				},
				"version": {
					"type": "string",
					"description": "Version of the graph. [semver](https://semver.org/) format is encouraged."
				},
				"describer": {
					"type": "string",
					"description": "The URL of the graph that will act as the describer for this graph. Can be a relative URL and refer to a sub-graph within this graph.\n\nThe describers in the format of \"module:name\" will be interpreted as \"use the `describe` export of the module named `name` to describe this graph\"."
				},
				"metadata": {
					"$ref": "#/definitions/GraphMetadata",
					"description": "Metadata associated with the graph."
				},
				"args": {
					"$ref": "#/definitions/InputValues",
					"description": "Arguments that are passed to the graph, useful to bind values to graphs."
				},
				"modules": {
					"$ref": "#/definitions/Modules",
					"description": "Modules that are included as part of this graph."
				},
				"exports": {
					"type": "array",
					"items": {
						"anyOf": [
							{
								"$ref": "#/definitions/ModuleIdentifier"
							},
							{
								"type": "string"
							}
						]
					},
					"description": "The modules and sub-graphs that this graph declares as \"exports\": they themselves are usable declarative or imperative graphs. When the \"exports\" property exist, this graph is actually a Kit declaration: it can be used to distributed multiple graphs."
				},
				"virtual": {
					"type": "boolean",
					"const": true,
					"description": "An optional property that indicates that this graph is \"virtual\": it can not be represented by a static list of edges and nodes, and is instead more of a representation of something that's \"graph-like\". Modules, when they invoke capabilities, are \"virtual\" graphs: they don't have a defined topology and instead, this topology is discovered through imperative code execution"
				},
				"assets": {
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/Asset"
					},
					"description": "An optional collection of assets associated with the graph. Each asset is an array of LLM Content items."
				},
				"imports": {
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/Import"
					},
					"propertyNames": {
						"description": "An identifier to use for imports."
					},
					"description": "An optional collection of imports, or known GraphDescriptors that this GraphDescriptor uses. Imports are spiritually similar to `dependencies` in npm or import maps in Web Platform. In addition to specifying the depenency, they provide a short identifier that can be used to refer to the import."
				},
				"main": {
					"$ref": "#/definitions/ModuleIdentifier",
					"description": "The id of the Module that is used as an entry point for this graph. If this value is set, the graph is a \"module graph\": it is backed by code rather than by nodes and edges."
				},
				"edges": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/Edge"
					},
					"description": "The collection of all edges in the graph."
				},
				"nodes": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/NodeDescriptor"
					},
					"description": "The collection of all nodes in the graph."
				},
				"kits": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/KitDescriptor"
					},
					"description": "All the kits (collections of node handlers) that are used by the graph."
				},
				"graphs": {
					"$ref": "#/definitions/SubGraphs",
					"description": "Sub-graphs that are also described by this graph representation."
				}
			},
			"required": [
				"edges",
				"nodes"
			],
			"description": "A union type of both declarative and imperative graphs. Represents a graph that is either declarative (defined by nodes and edges) or imperative (backed by code)."
		},
		"InputValues": {
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/NodeValue"
			},
			"propertyNames": {
				"description": "Unique identifier of a node's input."
			},
			"description": "Values that are supplied as inputs to the `NodeHandler`."
		},
		"NodeValue": {
			"anyOf": [
				{
					"type": "string"
				},
				{
					"type": "number"
				},
				{
					"type": "boolean"
				},
				{
					"type": "null"
				},
				{
					"not": {}
				},
				{
					"type": "array",
					"items": {
						"$ref": "#/definitions/NodeValue"
					}
				},
				{
					"$ref": "#/definitions/Capability"
				},
				{
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/NodeValue"
					}
				}
			],
			"description": "A type representing a valid JSON value."
		},
		"Capability": {
			"type": "object",
			"properties": {
				"kind": {
					"type": "string"
				}
			},
			"required": [
				"kind"
			],
			"additionalProperties": false
		},
		"OutputValues": {
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/NodeValue"
			},
			"propertyNames": {
				"description": "Unique identifier of a node's output."
			},
			"description": "Values that the `NodeHandler` outputs."
		},
		"NodeIdentifier": {
			"type": "string",
			"description": "Unique identifier of a node in a graph."
		},
		"GraphMetadata": {
			"type": "object",
			"properties": {
				"icon": {
					"type": "string",
					"description": "The icon that identifies the graph. Can be a URL or a Material Design id."
				},
				"comments": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/CommentNode"
					}
				},
				"tags": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/GraphTag"
					},
					"description": "Tags associated with the graph."
				},
				"intent": {
					"type": "string",
					"description": "The overall intent or goal of the application."
				},
				"revision_intents": {
					"type": "array",
					"items": {
						"type": "string"
					},
					"description": "Followups to the original intent."
				},
				"help": {
					"type": "object",
					"properties": {
						"description": {
							"type": "string"
						},
						"url": {
							"type": "string"
						}
					},
					"required": [
						"url"
					],
					"additionalProperties": false,
					"description": "The documentation for the graph, expressed as a URL and optional description."
				},
				"describer": {
					"type": "string",
					"description": "The URL of the graph that will act as the describer for this graph. Can be a relative URL and refer to a sub-graph within this graph.\n\nThe describers in the format of \"module:name\" will be interpreted as \"use the `describe` export of the module named `name` to describe this graph\"."
				},
				"visual": {
					"type": "object",
					"properties": {
						"window": {
							"type": "object",
							"properties": {
								"x": {
									"type": "number"
								},
								"y": {
									"type": "number"
								},
								"width": {
									"type": "number"
								},
								"height": {
									"type": "number"
								}
							},
							"required": [
								"x",
								"y",
								"width",
								"height"
							],
							"additionalProperties": false,
							"description": "Last known position of the graph in the editor."
						},
						"minimized": {
							"type": "boolean",
							"description": "Whether or not the graph is minimized. Generally only applies to subgraphs as they carry that control in the Visual Editor."
						},
						"presentation": {
							"type": "object",
							"properties": {
								"title": {
									"type": "string"
								},
								"author": {
									"type": "string"
								},
								"themeColors": {
									"type": "object",
									"additionalProperties": {
										"type": "string"
									}
								},
								"template": {
									"type": "string"
								},
								"templateAdditionalOptions": {
									"type": "object",
									"additionalProperties": {
										"type": "string"
									}
								},
								"icon": {
									"type": "string"
								},
								"splashScreen": {
									"$ref": "#/definitions/InlineDataCapabilityPart"
								},
								"description": {
									"type": "string"
								},
								"linkToSource": {
									"type": "string"
								},
								"theme": {
									"type": "string",
									"description": "The collection of themes and the chosen theme for this graph."
								},
								"themes": {
									"type": "object",
									"additionalProperties": {
										"$ref": "#/definitions/GraphTheme"
									}
								}
							},
							"additionalProperties": false
						}
					},
					"additionalProperties": false,
					"description": "The metadata associated with the visual representation of the graph."
				},
				"order": {
					"type": "number",
					"description": "Allows specifying relative order of this graph when it is represented as a component in any menu. Currently used when populating the quick access menu."
				},
				"userModified": {
					"type": "boolean",
					"description": "If true, the title/description have been modified by the user."
				},
				"parameters": {
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/ParameterMetadata"
					},
					"description": "Provides a way to store metadata about parameters See https://github.com/breadboard-ai/breadboard/wiki/Parameters-Design"
				}
			},
			"additionalProperties": {
				"$ref": "#/definitions/NodeValue"
			},
			"description": "Represents graph metadata."
		},
		"CommentNode": {
			"type": "object",
			"properties": {
				"id": {
					"$ref": "#/definitions/NodeIdentifier",
					"description": "Unique id of the comment node in graph metadata."
				},
				"text": {
					"type": "string",
					"description": "The text content of the comment."
				},
				"metadata": {
					"$ref": "#/definitions/NodeMetadata",
					"description": "The metadata of the comment node. Use this to provide additional information about the comment node."
				}
			},
			"required": [
				"id",
				"text"
			],
			"additionalProperties": false
		},
		"NodeMetadata": {
			"type": "object",
			"properties": {
				"title": {
					"type": "string",
					"description": "The title of the node."
				},
				"description": {
					"type": "string",
					"description": "A more detailed description of the node."
				},
				"visual": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number"
						},
						{
							"type": "boolean"
						},
						{
							"type": "null"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/NodeValue"
							}
						},
						{
							"$ref": "#/definitions/Capability"
						},
						{
							"type": "object",
							"additionalProperties": {
								"$ref": "#/definitions/NodeValue"
							}
						}
					],
					"description": "Metadata that conveys visual information about the node. Can be used by visual editors to store information about the node's appearance, current position, etc."
				},
				"logLevel": {
					"type": "string",
					"enum": [
						"debug",
						"info"
					],
					"description": "Logging level."
				},
				"tags": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/NodeTag"
					},
					"description": "Tags associated with the node. Can be either a string or a structured tag, like a `StartTag`."
				},
				"icon": {
					"type": "string",
					"description": "The icon for the node."
				},
				"userModified": {
					"type": "boolean",
					"description": "If true, the title/description have been modified by the user."
				},
				"start": {
					"type": "boolean",
					"description": "If true, indicates that this node is marked as a starting node. This indicator is informative: it does not mean that the run starts with this node. Instead, when this node is both:  a) standalone (no ins/outs)  b) first among others with this flag Then, it will be chosen as a starting node."
				}
			},
			"additionalProperties": false,
			"description": "Represents metadata of a node. This is an optional part of the `NodeDescriptor` that can be used to provide additional information about the node."
		},
		"NodeTag": {
			"type": "string",
			"description": "Represents a tag that can be associated with a node."
		},
		"GraphTag": {
			"type": "string",
			"enum": [
				"published",
				"tool",
				"experimental",
				"featured",
				"component",
				"deprecated",
				"core",
				"generative",
				"quick-access",
				"private",
				"connector",
				"connector-singleton",
				"connector-configure",
				"connector-load",
				"connector-save",
				"connector-tools"
			],
			"description": "A tag that can be associated with a graph.\n- `published`: The graph is published (as opposed to a draft). It may be    used in production and shared with others.\n- `tool`: The graph is intended to be a tool.\n- `experimental`: The graph is experimental and may not be stable.\n- `component`: The graph is intended to be a component.\n- `core`: The graph represents a component that provides \"core\"    functionality, like control flow, input/output, etc.\n- `generative`: The graph represents a component that uses an LLM\n- `quick-access`: The graph represents a component that is featured in quick    access menu.\n- `private`: Accessing the graph requires authentication (like a server    API key)\n- `connector`: The graph represents a connector.\n- `connector-singleton`: This connector is a singleton: only one instance    can be created.\n- `connector-configure`: The graph provides configuration of a connector.\n- `connector-load`: The graph provides loading capability of a connector.\n- `connector-save`: The graph provides saving capability of a connector.\n- `connector-tools`: The graph provides tool discovery and calling    capability of a connector."
		},
		"InlineDataCapabilityPart": {
			"type": "object",
			"properties": {
				"inlineData": {
					"type": "object",
					"properties": {
						"mimeType": {
							"type": "string"
						},
						"data": {
							"type": "string"
						}
					},
					"required": [
						"mimeType",
						"data"
					],
					"additionalProperties": false
				}
			},
			"required": [
				"inlineData"
			],
			"additionalProperties": false,
			"description": "Represents inline data, encoded as a base64 string."
		},
		"GraphTheme": {
			"type": "object",
			"properties": {
				"themeColors": {
					"type": "object",
					"additionalProperties": {
						"type": "string"
					}
				},
				"palette": {
					"$ref": "#/definitions/AppPalette"
				},
				"template": {
					"type": "string"
				},
				"templateAdditionalOptions": {
					"type": "object",
					"additionalProperties": {
						"type": "string"
					}
				},
				"splashScreen": {
					"$ref": "#/definitions/StoredDataCapabilityPart"
				},
				"isDefaultTheme": {
					"type": "boolean"
				}
			},
			"additionalProperties": false
		},
		"AppPalette": {
			"type": "object",
			"properties": {
				"primary": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"secondary": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"tertiary": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"neutral": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"neutralVariant": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"error": {
					"type": "array",
					"items": {
						"type": "string"
					}
				}
			},
			"required": [
				"primary",
				"secondary",
				"tertiary",
				"neutral",
				"neutralVariant",
				"error"
			],
			"additionalProperties": false
		},
		"StoredDataCapabilityPart": {
			"type": "object",
			"properties": {
				"storedData": {
					"type": "object",
					"properties": {
						"handle": {
							"$ref": "#/definitions/DataStoreHandle"
						},
						"mimeType": {
							"type": "string"
						},
						"contentHash": {
							"type": "string"
						},
						"contentLength": {
							"type": "number"
						}
					},
					"required": [
						"handle",
						"mimeType"
					],
					"additionalProperties": false
				},
				"data": {
					"type": "string"
				}
			},
			"required": [
				"storedData"
			],
			"additionalProperties": false,
			"description": "Represents data that is stored by a DataStoreProvider."
		},
		"DataStoreHandle": {
			"type": "string"
		},
		"ParameterMetadata": {
			"type": "object",
			"properties": {
				"title": {
					"type": "string"
				},
				"description": {
					"type": "string"
				},
				"modality": {
					"type": "array",
					"items": {
						"type": "string"
					},
					"description": "A list of modality hints that define the kind of content the parameter may contain."
				},
				"sample": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number"
						},
						{
							"type": "boolean"
						},
						{
							"type": "null"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/NodeValue"
							}
						},
						{
							"$ref": "#/definitions/Capability"
						},
						{
							"type": "object",
							"additionalProperties": {
								"$ref": "#/definitions/NodeValue"
							}
						}
					],
					"description": "Sample value that will be provided as part of the user input Must be LLMContent[], but is typed as NodeValue because for some reason, GraphDescriptor doesn't like LLMContent[] here."
				},
				"usedIn": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/NodeIdentifier"
					},
					"description": "The list of nodes where the parameter is currently used. Can be empty, which indicates that this metadata is not attached to any existing parameter."
				}
			},
			"required": [
				"title",
				"usedIn"
			],
			"additionalProperties": false,
			"description": "Metadata about a parameter"
		},
		"Modules": {
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/Module"
			},
			"propertyNames": {
				"description": "Unique identifier of a module."
			}
		},
		"Module": {
			"type": "object",
			"properties": {
				"metadata": {
					"$ref": "#/definitions/ModuleMetadata",
					"description": "Metadata associated with the graph."
				},
				"code": {
					"$ref": "#/definitions/ModuleCode",
					"description": "The code for this module."
				}
			},
			"required": [
				"code"
			],
			"additionalProperties": false
		},
		"ModuleMetadata": {
			"type": "object",
			"properties": {
				"runnable": {
					"type": "boolean",
					"description": "Whether the module should be presented as a runnable item to runModule."
				},
				"icon": {
					"type": "string",
					"description": "The icon for the module."
				},
				"url": {
					"type": "string",
					"description": "The source file for the module, if relevant."
				},
				"description": {
					"type": "string",
					"description": "The description for the module."
				},
				"title": {
					"type": "string",
					"description": "The title for the module."
				},
				"tags": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/ModuleTag"
					},
					"description": "Tags associated with the module. At this moment, free-form strings."
				},
				"help": {
					"type": "object",
					"properties": {
						"description": {
							"type": "string"
						},
						"url": {
							"type": "string"
						}
					},
					"required": [
						"url"
					],
					"additionalProperties": false,
					"description": "The documentation for the module, expressed as a URL and optional description."
				},
				"source": {
					"type": "object",
					"properties": {
						"language": {
							"$ref": "#/definitions/ModuleLanguage"
						},
						"code": {
							"$ref": "#/definitions/ModuleCode"
						}
					},
					"required": [
						"language",
						"code"
					],
					"additionalProperties": false,
					"description": "The pre-compiled source for this module."
				}
			},
			"additionalProperties": false
		},
		"ModuleTag": {
			"type": "string",
			"enum": [
				"published",
				"experimental"
			],
			"description": "A tag that can be associated with a graph.\n- `published`: The module is published (as opposed to a draft). It may be    used in production and shared with others.\n- `experimental`: The graph is experimental and may not be stable."
		},
		"ModuleLanguage": {
			"type": "string"
		},
		"ModuleCode": {
			"type": "string",
			"description": "The code for this module, which should include a describer, an invoker, and any other relevant information to power the module."
		},
		"ModuleIdentifier": {
			"type": "string",
			"description": "Unique identifier of a module."
		},
		"Asset": {
			"type": "object",
			"properties": {
				"metadata": {
					"$ref": "#/definitions/AssetMetadata"
				},
				"data": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number"
						},
						{
							"type": "boolean"
						},
						{
							"type": "null"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/NodeValue"
							}
						},
						{
							"$ref": "#/definitions/Capability"
						},
						{
							"type": "object",
							"additionalProperties": {
								"$ref": "#/definitions/NodeValue"
							}
						}
					],
					"description": "Must be LLMContent[], but is typed as NodeValue because for some reason, GraphDescriptor doesn't like LLMContent[] here."
				}
			},
			"additionalProperties": false
		},
		"AssetMetadata": {
			"type": "object",
			"properties": {
				"title": {
					"type": "string"
				},
				"description": {
					"type": "string"
				},
				"type": {
					"$ref": "#/definitions/AssetType"
				},
				"subType": {
					"type": "string"
				},
				"visual": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number"
						},
						{
							"type": "boolean"
						},
						{
							"type": "null"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/NodeValue"
							}
						},
						{
							"$ref": "#/definitions/Capability"
						},
						{
							"type": "object",
							"additionalProperties": {
								"$ref": "#/definitions/NodeValue"
							}
						}
					]
				}
			},
			"required": [
				"title",
				"type"
			],
			"additionalProperties": false
		},
		"AssetType": {
			"type": "string",
			"enum": [
				"content",
				"file",
				"connector"
			],
			"description": "Provides information on the structure of the data stored in the asset. All data is stored as LLMContent[], but this field allows us to better identify what is stored.\n\n- \"content\" -- the typical LLMContent[], should be editable in asset   viewer as if the configuration port of a component.\n- \"file\" -- user-uploaded file. In this case, the data must be:   - a single inlineData part with the right mimeType   - of a single LLMContent item\n- \"connector\" -- a [connector](https://github.com/breadboard-ai/breadboard/wiki/Connectors)"
		},
		"Import": {
			"type": "object",
			"properties": {
				"url": {
					"type": "string",
					"description": "The URL of the import. Must point to a valid `GraphDescriptor`. Can be relative or absolute. When relative, the URL will be evaluated relative to the value of the `url` property of this `GraphDescriptor`."
				}
			},
			"required": [
				"url"
			],
			"additionalProperties": false,
			"description": "A declaration of an import."
		},
		"Edge": {
			"type": "object",
			"properties": {
				"from": {
					"$ref": "#/definitions/NodeIdentifier",
					"description": "The node that the edge is coming from."
				},
				"to": {
					"$ref": "#/definitions/NodeIdentifier",
					"description": "The node that the edge is going to."
				},
				"in": {
					"$ref": "#/definitions/InputIdentifier",
					"description": "The input of the `to` node. If this value is undefined, then the then no data is passed as output of the `from` node."
				},
				"out": {
					"$ref": "#/definitions/OutputIdentifier",
					"description": "The output of the `from` node. If this value is \"*\", then all outputs of the `from` node are passed to the `to` node. If this value is undefined, then no data is passed to any inputs of the `to` node."
				},
				"optional": {
					"type": "boolean",
					"description": "If true, this edge is optional: the data that passes through it is not considered a required input to the node."
				},
				"constant": {
					"type": "boolean",
					"description": "If true, this edge acts as a constant: the data that passes through it remains available even after the node has consumed it."
				},
				"metadata": {
					"$ref": "#/definitions/EdgeMetadata",
					"description": "The metadata of the edge. Use this provide additional information about the edge."
				}
			},
			"required": [
				"from",
				"to"
			],
			"additionalProperties": false,
			"description": "Represents an edge in a graph."
		},
		"InputIdentifier": {
			"type": "string",
			"description": "Unique identifier of a node's input."
		},
		"OutputIdentifier": {
			"type": "string",
			"description": "Unique identifier of a node's output."
		},
		"EdgeMetadata": {
			"type": "object",
			"properties": {
				"visual": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number"
						},
						{
							"type": "boolean"
						},
						{
							"type": "null"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/NodeValue"
							}
						},
						{
							"$ref": "#/definitions/Capability"
						},
						{
							"type": "object",
							"additionalProperties": {
								"$ref": "#/definitions/NodeValue"
							}
						}
					],
					"description": "Metadata that conveys visual information about the edge. Can be used by visual editors to store information about the edge's appearance, current position, etc."
				}
			},
			"additionalProperties": false,
			"description": "Represents metadata of an edge. This is an optional part of the `Edge` that can be used to provide additional information about the node."
		},
		"NodeDescriptor": {
			"type": "object",
			"properties": {
				"id": {
					"$ref": "#/definitions/NodeIdentifier",
					"description": "Unique id of the node in graph."
				},
				"type": {
					"$ref": "#/definitions/NodeTypeIdentifier",
					"description": "Type of the node. Used to look up the handler for the node."
				},
				"configuration": {
					"$ref": "#/definitions/NodeConfiguration",
					"description": "Configuration of the node."
				},
				"metadata": {
					"$ref": "#/definitions/NodeMetadata",
					"description": "The metadata of the node. Use this provide additional information about the node."
				}
			},
			"required": [
				"id",
				"type"
			],
			"additionalProperties": false,
			"description": "Represents a node in a graph."
		},
		"NodeTypeIdentifier": {
			"type": "string",
			"description": "Unique identifier of a node's type."
		},
		"NodeConfiguration": {
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/NodeValue"
			},
			"description": "Values that are supplied as part of the graph. These values are merged with the `InputValues` and supplied as inputs to the `NodeHandler`."
		},
		"KitDescriptor": {
			"type": "object",
			"additionalProperties": false,
			"properties": {
				"title": {
					"type": "string",
					"description": "The title of the kit."
				},
				"description": {
					"type": "string",
					"description": "The description of the kit."
				},
				"version": {
					"type": "string",
					"description": "Version of the kit. [semver](https://semver.org/) format is encouraged.",
					"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"
				},
				"tags": {
					"type": "array",
					"items": {
						"$ref": "#/definitions/KitTag"
					},
					"description": "Tags, associated with the kit."
				},
				"url": {
					"type": "string",
					"description": "The URL pointing to the location of the kit."
				}
			},
			"required": [
				"url"
			]
		},
		"KitTag": {
			"type": "string",
			"enum": [
				"deprecated",
				"experimental"
			],
			"description": "Represents various tags that can be associated with a kit.\n- `deprecated`: The kit is deprecated and should not be used.\n- `experimental`: The kit is experimental and may not be stable."
		},
		"SubGraphs": {
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/GraphDescriptor"
			},
			"propertyNames": {
				"description": "Unique identifier of a graph."
			},
			"description": "Represents a collection of sub-graphs. The key is the identifier of the sub-graph. The value is the descriptor of the sub-graph."
		}
	}
}