Skip to main content

Error code catalog

Neat surfaces typed failures through NeatError and PullError. Each failure provides a stable error code, a human-readable message, and—when available—a GraphReport with structured context.

Use the error code for programmatic triage. Show the message to the developer. The complete set of public constants lives in pipeline/ErrorCodes.h.

Behavioral breaking change and migration

The diagnostic taxonomy now preserves specific GStreamer root causes. Public method signatures are unchanged, but code that compares exact error strings may need to migrate:

Previous matchMore specific code now returnedMigration
misconfig.caps for a runtime GStreamer negotiation errormisconfig.media_caps, or misconfig.media_format when only the format is incompatibleHandle the media code. Keep misconfig.caps only for framework validation of caps overrides and adjacent Node contracts.
build.parse_launch for every gst_parse_launch failurebuild.plugin_missing, build.property_invalid, or build.pipeline_syntaxHandle the specific build codes. Keep build.parse_launch as the fallback for an unclassified parser failure.
runtime.pull for a propagated bus failureThe root-cause code, such as misconfig.media_caps, io.rtsp_connection_failed, or resource.output_pool_exhaustedHandle the root-cause codes and keep a default branch. runtime.pull remains the fallback for a local pull failure with no specific cause.

Use the C++ or Python constants rather than repeating string literals. Always keep a default path for codes introduced by a newer Neat Library build.

Public constants

The same values are available in both language APIs:

Error codeC++Python
misconfig.pipeline_shapeerror_codes::kPipelineShapepyneat.ERROR_PIPELINE_SHAPE
misconfig.capserror_codes::kCapspyneat.ERROR_CAPS
misconfig.input_shapeerror_codes::kInputShapepyneat.ERROR_INPUT_SHAPE
misconfig.runtime_abi_mismatcherror_codes::kRuntimeAbiMismatchpyneat.ERROR_RUNTIME_ABI_MISMATCH
misconfig.graph_element_nameerror_codes::kGraphElementNamepyneat.ERROR_GRAPH_ELEMENT_NAME
misconfig.media_capserror_codes::kMediaCapspyneat.ERROR_MEDIA_CAPS
misconfig.media_formaterror_codes::kMediaFormatpyneat.ERROR_MEDIA_FORMAT
misconfig.input_capacityerror_codes::kInputCapacitypyneat.ERROR_INPUT_CAPACITY
misconfig.tensor_dtype_missingerror_codes::kTensorDtypeMissingpyneat.ERROR_TENSOR_DTYPE_MISSING
misconfig.option_out_of_rangeerror_codes::kOptionOutOfRangepyneat.ERROR_OPTION_OUT_OF_RANGE
build.parse_launcherror_codes::kParseLaunchpyneat.ERROR_PARSE_LAUNCH
build.pipeline_syntaxerror_codes::kPipelineSyntaxpyneat.ERROR_PIPELINE_SYNTAX
build.plugin_missingerror_codes::kPluginMissingpyneat.ERROR_PLUGIN_MISSING
build.property_invaliderror_codes::kPropertyInvalidpyneat.ERROR_PROPERTY_INVALID
runtime.pullerror_codes::kRuntimePullpyneat.ERROR_RUNTIME_PULL
runtime.element_failederror_codes::kRuntimeElementFailedpyneat.ERROR_RUNTIME_ELEMENT_FAILED
runtime.output_timeouterror_codes::kOutputTimeoutpyneat.ERROR_OUTPUT_TIMEOUT
runtime.unexpected_eoserror_codes::kUnexpectedEospyneat.ERROR_UNEXPECTED_EOS
io.parseerror_codes::kIoParsepyneat.ERROR_IO_PARSE
io.openerror_codes::kIoOpenpyneat.ERROR_IO_OPEN
io.file_not_founderror_codes::kFileNotFoundpyneat.ERROR_FILE_NOT_FOUND
io.permission_deniederror_codes::kPermissionDeniedpyneat.ERROR_PERMISSION_DENIED
io.rtsp_connection_failederror_codes::kRtspConnectionFailedpyneat.ERROR_RTSP_CONNECTION_FAILED
io.camera_not_founderror_codes::kCameraNotFoundpyneat.ERROR_CAMERA_NOT_FOUND
io.model_not_founderror_codes::kModelNotFoundpyneat.ERROR_MODEL_NOT_FOUND
io.source_endederror_codes::kSourceEndedpyneat.ERROR_SOURCE_ENDED
codec.invalid_h264_streamerror_codes::kInvalidH264Streampyneat.ERROR_INVALID_H264_STREAM
codec.decode_failederror_codes::kDecodeFailedpyneat.ERROR_DECODE_FAILED
codec.encode_failederror_codes::kEncodeFailedpyneat.ERROR_ENCODE_FAILED
resource.memory_allocation_failederror_codes::kMemoryAllocationFailedpyneat.ERROR_MEMORY_ALLOCATION_FAILED
resource.device_memory_exhaustederror_codes::kDeviceMemoryExhaustedpyneat.ERROR_DEVICE_MEMORY_EXHAUSTED
resource.output_pool_exhaustederror_codes::kOutputPoolExhaustedpyneat.ERROR_OUTPUT_POOL_EXHAUSTED
resource.buffer_too_smallerror_codes::kBufferTooSmallpyneat.ERROR_BUFFER_TOO_SMALL
resource.disk_fullerror_codes::kDiskFullpyneat.ERROR_DISK_FULL
infra.dispatcher_unavailableerror_codes::kDispatcherUnavailablepyneat.ERROR_DISPATCHER_UNAVAILABLE
infra.accelerator_execution_failederror_codes::kAcceleratorExecutionFailedpyneat.ERROR_ACCELERATOR_EXECUTION_FAILED
DispatcherUnavailable (legacy)error_codes::kDispatcherUnavailableLegacypyneat.ERROR_DISPATCHER_UNAVAILABLE_LEGACY
internal.plugin_failureerror_codes::kInternalPluginFailurepyneat.ERROR_INTERNAL_PLUGIN_FAILURE

Misconfiguration

CodeWhen raisedWhat to do
misconfig.pipeline_shapeThe graph has an invalid topology or missing input/output boundary.Correct the graph connections and required Input or Output Nodes.
misconfig.capsA caps override or adjacent Node contract is incompatible during framework validation.Align the declared format, dimensions, rate, and adjacent Node contract.
misconfig.input_shapeAn input tensor does not match the expected shape or data type.Provide the expected input, or configure model preprocessing through model options.
misconfig.runtime_abi_mismatchNeat and an installed runtime plugin use incompatible ABIs.Install matching Neat Library and runtime-plugin builds.
misconfig.graph_element_nameA custom fragment contains an element that cannot be assigned a stable Node name.Give custom elements stable, unique names.
misconfig.media_capsConnected GStreamer stages require incompatible media caps.Align the stages or insert the required conversion, scaling, or rate-conversion Node.
misconfig.media_formatConnected stages require incompatible media formats.Configure a common format or add an explicit format conversion.
misconfig.input_capacityA source image exceeds the configured preprocessing input capacity.Increase input_max_width and input_max_height, or scale the source before the model stage.
misconfig.tensor_dtype_missingA tensor contract omits its data type or format.Declare a supported data type in the upstream tensor contract.
misconfig.option_out_of_rangeAn option is invalid for the current input contract.Set the option to a value in the range shown by the diagnostic.

Build failures

CodeWhen raisedWhat to do
build.parse_launchGStreamer cannot build the generated pipeline.Check the custom fragment, element properties, and plugin availability.
build.pipeline_syntaxA custom GStreamer fragment has invalid syntax.Correct the fragment and validate it with gst-launch-1.0.
build.plugin_missingA required GStreamer element or codec plugin is unavailable.Install or replace the component, then verify it with gst-inspect-1.0.
build.property_invalidAn element property name or value is invalid.Check the property with gst-inspect-1.0 <element>.

Runtime failures

CodeWhen raisedWhat to do
runtime.pullA pull operation fails without a more specific code.Inspect the attached report and the first upstream error.
runtime.element_failedA pipeline stage stops without a more specific classification.Correct the reported stage configuration and its upstream input.
runtime.output_timeoutNo output arrives before the configured wait expires.Verify source flow and back-pressure, or adjust the timeout when the wait is expected.
runtime.unexpected_eosThe pipeline reaches EOS before producing a required output.Check the input for premature EOS and confirm that enough input was supplied.

I/O failures

CodeWhen raisedWhat to do
io.parseNeat cannot parse JSON, a model contract, or stage configuration.Validate the configuration syntax, schema, and required fields.
io.openNeat cannot open a file, device, or remote resource.Verify the path or address, permissions, and resource availability.
io.file_not_foundAn input file does not exist.Correct the path and confirm that the file exists on the DevKit.
io.permission_deniedA file or device cannot be opened with the required access.Correct ownership or permissions for the reported resource.
io.rtsp_connection_failedNeat cannot connect to an RTSP source.Verify the URL, server, network reachability, and credentials.
io.camera_not_foundThe requested camera is unavailable.Select an available camera or use the default camera.
io.model_not_foundThe requested model archive does not exist.Correct the model path and confirm that the archive is installed.
io.source_endedAn input source reaches its normal end.Stop consuming that source or provide additional input if the application expects more data.

Pipeline materialization failures

CodeWhen raisedWhat to do
misconfig.pipeline_shapePipeline topology is invalid, or final element names are duplicate, ambiguous, or missing after GStreamer construction.Give every explicit element a unique short name within its materialized segment. Keep name= declarations and named-pad references synchronized.
build.parse_launchGStreamer cannot parse or construct the final launch string because syntax, a plugin, or a property is invalid.Inspect GraphReport::pipeline_string; verify the fragment with gst-launch-1.0 and the plugin with gst-inspect-1.0.

These checks are automatic during Graph::build(). For input-dependent connected segments, the same code and GraphReport can surface when the first input materializes the segment.

Codec failures

CodeWhen raisedWhat to do
codec.invalid_h264_streamThe input contains no valid H.264 frames.Supply a complete H.264 stream and confirm the configured codec.
codec.decode_failedA decoder cannot decode the accepted stream.Confirm the codec and check that the encoded input is complete and uncorrupted.
codec.encode_failedAn encoder cannot encode the supplied frames.Verify the input format, resolution, and encoder settings.

Resource failures

CodeWhen raisedWhat to do
resource.memory_allocation_failedA required memory allocation fails without a device-specific cause.Reduce stream count, resolution, or buffering, and free memory used by other workloads.
resource.device_memory_exhaustedContiguous device DMA/CMA memory is exhausted.Reduce concurrent streams, input resolution, or buffer depth.
resource.output_pool_exhaustedAll output buffers remain in use.Release zero-copy outputs promptly or use owned copies.
resource.buffer_too_smallA buffer is smaller than its declared frame or tensor payload.Correct upstream dimensions and stride, or allocate the required number of bytes.
resource.disk_fullA write fails because the destination has insufficient free space.Free space or choose another destination.

Infrastructure failures

CodeWhen raisedWhat to do
infra.dispatcher_unavailableNeat cannot acquire the accelerator runtime.Confirm DevKit compatibility and stop workloads that exclusively own the accelerator.
infra.accelerator_execution_failedThe accelerator cannot execute a model stage.Restart the pipeline and reduce concurrent accelerator workloads.

Internal failures

CodeWhen raisedWhat to do
internal.plugin_failureA Neat plugin fails without a user-actionable classification.Capture the attached GraphReport and report the failure to support.

DispatcherUnavailable is a legacy spelling accepted for compatibility. New applications should use infra.dispatcher_unavailable and the error_codes::kDispatcherUnavailable constant.

Handle errors programmatically

#include "pipeline/ErrorCodes.h"
#include "pipeline/NeatError.h"

try {
auto run = graph.build();
// Push and pull application data.
} catch (const simaai::neat::NeatError& error) {
if (error.report().error_code == simaai::neat::error_codes::kInputShape) {
handle_input_contract_error(error.report());
} else {
throw;
}
}

PullError.code uses the same constants. Do not parse what() or match human-readable text.

Further reading