[object Object]

← back to Exo

Add node backends to model cards (#2071)

bc6661e6aab1ac6b64f7e9a7965c3da7a6950882 · 2026-05-15 13:52:12 +0100 · rltakashige

Co-authored-by: Evan <evanev7@gmail.com>

Files touched

Diff

commit bc6661e6aab1ac6b64f7e9a7965c3da7a6950882
Author: rltakashige <rl.takashige@gmail.com>
Date:   Fri May 15 13:52:12 2026 +0100

    Add node backends to model cards (#2071)
    
    Co-authored-by: Evan <evanev7@gmail.com>
---
 {.mlx_typings => .typings}/.gitkeep                |    0
 {.mlx_typings => .typings}/mflux/__init__.pyi      |    0
 .../mflux/callbacks/__init__.pyi                   |    0
 .../mflux/callbacks/callback.pyi                   |    0
 .../mflux/callbacks/callback_registry.pyi          |    0
 .../mflux/callbacks/generation_context.pyi         |    0
 {.mlx_typings => .typings}/mflux/cli/__init__.pyi  |    0
 .../mflux/cli/defaults/defaults.pyi                |    0
 .../mflux/models/__init__.pyi                      |    0
 .../mflux/models/common/__init__.pyi               |    0
 .../mflux/models/common/cli/__init__.pyi           |    0
 .../mflux/models/common/config/__init__.pyi        |    0
 .../mflux/models/common/config/config.pyi          |    0
 .../mflux/models/common/config/model_config.pyi    |    0
 .../models/common/latent_creator/__init__.pyi      |    0
 .../common/latent_creator/latent_creator.pyi       |    0
 .../mflux/models/common/lora/__init__.pyi          |    0
 .../common/lora/layer/fused_linear_lora_layer.pyi  |    0
 .../models/common/lora/layer/linear_lora_layer.pyi |    0
 .../models/common/lora/mapping/lora_loader.pyi     |    0
 .../models/common/lora/mapping/lora_mapping.pyi    |    0
 .../models/common/lora/mapping/lora_saver.pyi      |    0
 .../models/common/lora/mapping/lora_transforms.pyi |    0
 .../mflux/models/common/resolution/__init__.pyi    |    0
 .../mflux/models/common/resolution/actions.pyi     |    0
 .../models/common/resolution/config_resolution.pyi |    0
 .../models/common/resolution/lora_resolution.pyi   |    0
 .../models/common/resolution/path_resolution.pyi   |    0
 .../common/resolution/quantization_resolution.pyi  |    0
 .../mflux/models/common/schedulers/__init__.pyi    |    0
 .../models/common/schedulers/base_scheduler.pyi    |    0
 .../flow_match_euler_discrete_scheduler.pyi        |    0
 .../models/common/schedulers/linear_scheduler.pyi  |    0
 .../common/schedulers/seedvr2_euler_scheduler.pyi  |    0
 .../mflux/models/common/tokenizer/__init__.pyi     |    0
 .../mflux/models/common/tokenizer/tokenizer.pyi    |    0
 .../models/common/tokenizer/tokenizer_loader.pyi   |    0
 .../models/common/tokenizer/tokenizer_output.pyi   |    0
 .../mflux/models/common/vae/__init__.pyi           |    0
 .../mflux/models/common/vae/tiling_config.pyi      |    0
 .../mflux/models/common/vae/vae_tiler.pyi          |    0
 .../mflux/models/common/vae/vae_util.pyi           |    0
 .../mflux/models/common/weights/__init__.pyi       |    0
 .../common/weights/loading/loaded_weights.pyi      |    0
 .../common/weights/loading/weight_applier.pyi      |    0
 .../common/weights/loading/weight_definition.pyi   |    0
 .../common/weights/loading/weight_loader.pyi       |    0
 .../common/weights/mapping/weight_mapper.pyi       |    0
 .../common/weights/mapping/weight_mapping.pyi      |    0
 .../common/weights/mapping/weight_transforms.pyi   |    0
 .../models/common/weights/saving/model_saver.pyi   |    0
 .../models/depth_pro/depth_pro_initializer.pyi     |    0
 .../model/decoder/feature_fusion_block_2d.pyi      |    0
 .../model/decoder/multires_conv_decoder.pyi        |    0
 .../depth_pro/model/decoder/residual_block.pyi     |    0
 .../mflux/models/depth_pro/model/depth_pro.pyi     |    0
 .../models/depth_pro/model/depth_pro_model.pyi     |    0
 .../models/depth_pro/model/depth_pro_util.pyi      |    0
 .../models/depth_pro/model/dino_v2/attention.pyi   |    0
 .../model/dino_v2/dino_vision_transformer.pyi      |    0
 .../models/depth_pro/model/dino_v2/layer_scale.pyi |    0
 .../mflux/models/depth_pro/model/dino_v2/mlp.pyi   |    0
 .../models/depth_pro/model/dino_v2/patch_embed.pyi |    0
 .../depth_pro/model/dino_v2/transformer_block.pyi  |    0
 .../depth_pro/model/encoder/depth_pro_encoder.pyi  |    0
 .../depth_pro/model/encoder/upsample_block.pyi     |    0
 .../mflux/models/depth_pro/model/head/fov_head.pyi |    0
 .../weights/depth_pro_weight_definition.pyi        |    0
 .../depth_pro/weights/depth_pro_weight_mapping.pyi |    0
 .../fibo/latent_creator/fibo_latent_creator.pyi    |    0
 .../models/fibo/weights/fibo_weight_definition.pyi |    0
 .../models/fibo/weights/fibo_weight_mapping.pyi    |    0
 .../fibo_vlm/tokenizer/qwen2vl_image_processor.pyi |    0
 .../fibo_vlm/tokenizer/qwen2vl_processor.pyi       |    0
 .../weights/fibo_vlm_weight_definition.pyi         |    0
 .../fibo_vlm/weights/fibo_vlm_weight_mapping.pyi   |    0
 .../mflux/models/flux/__init__.pyi                 |    0
 .../mflux/models/flux/cli/__init__.pyi             |    0
 .../mflux/models/flux/flux_initializer.pyi         |    0
 .../mflux/models/flux/latent_creator/__init__.pyi  |    0
 .../flux/latent_creator/flux_latent_creator.pyi    |    0
 .../mflux/models/flux/model/__init__.pyi           |    0
 .../clip_encoder/clip_embeddings.pyi               |    0
 .../clip_encoder/clip_encoder.pyi                  |    0
 .../clip_encoder/clip_encoder_layer.pyi            |    0
 .../flux_text_encoder/clip_encoder/clip_mlp.pyi    |    0
 .../clip_encoder/clip_sdpa_attention.pyi           |    0
 .../clip_encoder/clip_text_model.pyi               |    0
 .../clip_encoder/encoder_clip.pyi                  |    0
 .../model/flux_text_encoder/prompt_encoder.pyi     |    0
 .../flux_text_encoder/t5_encoder/t5_attention.pyi  |    0
 .../flux_text_encoder/t5_encoder/t5_block.pyi      |    0
 .../t5_encoder/t5_dense_relu_dense.pyi             |    0
 .../flux_text_encoder/t5_encoder/t5_encoder.pyi    |    0
 .../t5_encoder/t5_feed_forward.pyi                 |    0
 .../flux_text_encoder/t5_encoder/t5_layer_norm.pyi |    0
 .../t5_encoder/t5_self_attention.pyi               |    0
 .../flux_transformer/ada_layer_norm_continuous.pyi |    0
 .../model/flux_transformer/ada_layer_norm_zero.pyi |    0
 .../ada_layer_norm_zero_single.pyi                 |    0
 .../flux_transformer/common/attention_utils.pyi    |    0
 .../flux/model/flux_transformer/embed_nd.pyi       |    0
 .../flux/model/flux_transformer/feed_forward.pyi   |    0
 .../model/flux_transformer/guidance_embedder.pyi   |    0
 .../model/flux_transformer/joint_attention.pyi     |    0
 .../flux_transformer/joint_transformer_block.pyi   |    0
 .../flux_transformer/single_block_attention.pyi    |    0
 .../flux_transformer/single_transformer_block.pyi  |    0
 .../flux/model/flux_transformer/text_embedder.pyi  |    0
 .../model/flux_transformer/time_text_embed.pyi     |    0
 .../model/flux_transformer/timestep_embedder.pyi   |    0
 .../flux/model/flux_transformer/transformer.pyi    |    0
 .../flux/model/flux_vae/common/attention.pyi       |    0
 .../flux/model/flux_vae/common/resnet_block_2d.pyi |    0
 .../flux/model/flux_vae/common/unet_mid_block.pyi  |    0
 .../models/flux/model/flux_vae/decoder/conv_in.pyi |    0
 .../flux/model/flux_vae/decoder/conv_norm_out.pyi  |    0
 .../flux/model/flux_vae/decoder/conv_out.pyi       |    0
 .../models/flux/model/flux_vae/decoder/decoder.pyi |    0
 .../model/flux_vae/decoder/up_block_1_or_2.pyi     |    0
 .../flux/model/flux_vae/decoder/up_block_3.pyi     |    0
 .../flux/model/flux_vae/decoder/up_block_4.pyi     |    0
 .../flux/model/flux_vae/decoder/up_sampler.pyi     |    0
 .../models/flux/model/flux_vae/encoder/conv_in.pyi |    0
 .../flux/model/flux_vae/encoder/conv_norm_out.pyi  |    0
 .../flux/model/flux_vae/encoder/conv_out.pyi       |    0
 .../flux/model/flux_vae/encoder/down_block_1.pyi   |    0
 .../flux/model/flux_vae/encoder/down_block_2.pyi   |    0
 .../flux/model/flux_vae/encoder/down_block_3.pyi   |    0
 .../flux/model/flux_vae/encoder/down_block_4.pyi   |    0
 .../flux/model/flux_vae/encoder/down_sampler.pyi   |    0
 .../models/flux/model/flux_vae/encoder/encoder.pyi |    0
 .../mflux/models/flux/model/flux_vae/vae.pyi       |    0
 .../flux/model/redux_encoder/redux_encoder.pyi     |    0
 .../siglip_vision_transformer/siglip_encoder.pyi   |    0
 .../siglip_encoder_layer.pyi                       |    0
 .../model/siglip_vision_transformer/siglip_mlp.pyi |    0
 .../siglip_multi_head_attention_pooling_head.pyi   |    0
 .../siglip_sdpa_attention.pyi                      |    0
 .../siglip_vision_embeddings.pyi                   |    0
 .../siglip_vision_transformer.pyi                  |    0
 .../mflux/models/flux/variants/__init__.pyi        |    0
 .../variants/concept_attention/attention_data.pyi  |    0
 .../concept_attention/joint_attention_concept.pyi  |    0
 .../joint_transformer_block_concept.pyi            |    0
 .../concept_attention/transformer_concept.pyi      |    0
 .../variants/controlnet/transformer_controlnet.pyi |    0
 .../models/flux/variants/kontext/__init__.pyi      |    0
 .../models/flux/variants/kontext/flux_kontext.pyi  |    0
 .../models/flux/variants/kontext/kontext_util.pyi  |    0
 .../mflux/models/flux/variants/txt2img/flux.pyi    |    0
 .../mflux/models/flux/weights/__init__.pyi         |    0
 .../models/flux/weights/flux_lora_mapping.pyi      |    0
 .../models/flux/weights/flux_weight_definition.pyi |    0
 .../models/flux/weights/flux_weight_mapping.pyi    |    0
 .../mflux/models/qwen/__init__.pyi                 |    0
 .../mflux/models/qwen/cli/__init__.pyi             |    0
 .../mflux/models/qwen/latent_creator/__init__.pyi  |    0
 .../qwen/latent_creator/qwen_latent_creator.pyi    |    0
 .../mflux/models/qwen/model/__init__.pyi           |    0
 .../model/qwen_text_encoder/qwen_attention.pyi     |    0
 .../qwen/model/qwen_text_encoder/qwen_encoder.pyi  |    0
 .../model/qwen_text_encoder/qwen_encoder_layer.pyi |    0
 .../qwen/model/qwen_text_encoder/qwen_mlp.pyi      |    0
 .../model/qwen_text_encoder/qwen_patch_merger.pyi  |    0
 .../qwen_text_encoder/qwen_prompt_encoder.pyi      |    0
 .../qwen/model/qwen_text_encoder/qwen_rms_norm.pyi |    0
 .../qwen/model/qwen_text_encoder/qwen_rope.pyi     |    0
 .../model/qwen_text_encoder/qwen_text_encoder.pyi  |    0
 .../qwen_text_encoder/qwen_vision_attention.pyi    |    0
 .../model/qwen_text_encoder/qwen_vision_block.pyi  |    0
 .../qwen_vision_language_encoder.pyi               |    0
 .../model/qwen_text_encoder/qwen_vision_mlp.pyi    |    0
 .../qwen_text_encoder/qwen_vision_patch_embed.pyi  |    0
 .../qwen_vision_rotary_embedding.pyi               |    0
 .../qwen_text_encoder/qwen_vision_transformer.pyi  |    0
 .../qwen/model/qwen_transformer/qwen_attention.pyi |    0
 .../model/qwen_transformer/qwen_feed_forward.pyi   |    0
 .../qwen/model/qwen_transformer/qwen_rope.pyi      |    0
 .../qwen_transformer/qwen_time_text_embed.pyi      |    0
 .../qwen_transformer/qwen_timestep_embedding.pyi   |    0
 .../qwen/model/qwen_transformer/qwen_timesteps.pyi |    0
 .../model/qwen_transformer/qwen_transformer.pyi    |    0
 .../qwen_transformer/qwen_transformer_block.pyi    |    0
 .../qwen_transformer/qwen_transformer_rms_norm.pyi |    0
 .../qwen_vae/qwen_image_attention_block_3d.pyi     |    0
 .../model/qwen_vae/qwen_image_causal_conv_3d.pyi   |    0
 .../qwen/model/qwen_vae/qwen_image_decoder_3d.pyi  |    0
 .../model/qwen_vae/qwen_image_down_block_3d.pyi    |    0
 .../qwen/model/qwen_vae/qwen_image_encoder_3d.pyi  |    0
 .../model/qwen_vae/qwen_image_mid_block_3d.pyi     |    0
 .../model/qwen_vae/qwen_image_res_block_3d.pyi     |    0
 .../qwen/model/qwen_vae/qwen_image_resample_3d.pyi |    0
 .../qwen/model/qwen_vae/qwen_image_rms_norm.pyi    |    0
 .../qwen/model/qwen_vae/qwen_image_up_block_3d.pyi |    0
 .../mflux/models/qwen/model/qwen_vae/qwen_vae.pyi  |    0
 .../mflux/models/qwen/qwen_initializer.pyi         |    0
 .../mflux/models/qwen/tokenizer/__init__.pyi       |    0
 .../models/qwen/tokenizer/qwen_image_processor.pyi |    0
 .../tokenizer/qwen_vision_language_processor.pyi   |    0
 .../tokenizer/qwen_vision_language_tokenizer.pyi   |    0
 .../mflux/models/qwen/variants/__init__.pyi        |    0
 .../models/qwen/variants/edit/qwen_edit_util.pyi   |    0
 .../models/qwen/variants/edit/qwen_image_edit.pyi  |    0
 .../models/qwen/variants/txt2img/qwen_image.pyi    |    0
 .../mflux/models/qwen/weights/__init__.pyi         |    0
 .../models/qwen/weights/qwen_lora_mapping.pyi      |    0
 .../models/qwen/weights/qwen_weight_definition.pyi |    0
 .../models/qwen/weights/qwen_weight_mapping.pyi    |    0
 .../seedvr2/weights/seedvr2_weight_definition.pyi  |    0
 .../seedvr2/weights/seedvr2_weight_mapping.pyi     |    0
 .../latent_creator/z_image_latent_creator.pyi      |    0
 .../z_image/weights/z_image_weight_definition.pyi  |    0
 .../z_image/weights/z_image_weight_mapping.pyi     |    0
 .../mflux/release/__init__.pyi                     |    0
 .../mflux/utils/__init__.pyi                       |    0
 .../mflux/utils/box_values.pyi                     |    0
 .../mflux/utils/exceptions.pyi                     |    0
 .../mflux/utils/generated_image.pyi                |    0
 .../mflux/utils/image_util.pyi                     |    0
 .../mflux/utils/metadata_builder.pyi               |    0
 .../mflux/utils/version_util.pyi                   |    0
 {.mlx_typings => .typings}/mlx/core/__init__.pyi   |    0
 .../mlx/core/cuda/__init__.pyi                     |    0
 .../mlx/core/distributed/__init__.pyi              |    0
 .../mlx/core/metal/__init__.pyi                    |    0
 .../mlx/core/random/__init__.pyi                   |    0
 {.mlx_typings => .typings}/mlx/nn/__init__.pyi     |    0
 {.mlx_typings => .typings}/mlx/nn/init.pyi         |    0
 .../mlx/nn/layers/__init__.pyi                     |    0
 .../mlx/nn/layers/activations.pyi                  |    0
 {.mlx_typings => .typings}/mlx/nn/layers/base.pyi  |    0
 .../mlx/nn/layers/containers.pyi                   |    0
 .../mlx/nn/layers/convolution.pyi                  |    0
 .../mlx/nn/layers/convolution_transpose.pyi        |    0
 .../mlx/nn/layers/distributed.pyi                  |    0
 .../mlx/nn/layers/dropout.pyi                      |    0
 .../mlx/nn/layers/embedding.pyi                    |    0
 .../mlx/nn/layers/linear.pyi                       |    0
 .../mlx/nn/layers/normalization.pyi                |    0
 .../mlx/nn/layers/pooling.pyi                      |    0
 .../mlx/nn/layers/positional_encoding.pyi          |    0
 .../mlx/nn/layers/quantized.pyi                    |    0
 .../mlx/nn/layers/recurrent.pyi                    |    0
 .../mlx/nn/layers/transformer.pyi                  |    0
 .../mlx/nn/layers/upsample.pyi                     |    0
 {.mlx_typings => .typings}/mlx/nn/losses.pyi       |    0
 {.mlx_typings => .typings}/mlx/nn/utils.pyi        |    0
 {.mlx_typings => .typings}/mlx/utils.pyi           |    0
 {.mlx_typings => .typings}/mlx_lm/__init__.pyi     |    0
 {.mlx_typings => .typings}/mlx_lm/_version.pyi     |    0
 {.mlx_typings => .typings}/mlx_lm/convert.pyi      |    0
 {.mlx_typings => .typings}/mlx_lm/generate.pyi     |    0
 .../mlx_lm/models/__init__.pyi                     |    0
 .../mlx_lm/models/activations.pyi                  |    0
 {.mlx_typings => .typings}/mlx_lm/models/base.pyi  |    0
 .../mlx_lm/models/bitlinear_layers.pyi             |    0
 {.mlx_typings => .typings}/mlx_lm/models/cache.pyi |    0
 .../mlx_lm/models/deepseek_v3.pyi                  |    0
 .../mlx_lm/models/deepseek_v4.pyi                  |    0
 .../mlx_lm/models/gated_delta.pyi                  |    0
 .../mlx_lm/models/gemma4.pyi                       |    0
 .../mlx_lm/models/gemma4_text.pyi                  |    0
 .../mlx_lm/models/glm4_moe.pyi                     |    0
 .../mlx_lm/models/glm_moe_dsa.pyi                  |    0
 .../mlx_lm/models/gpt_oss.pyi                      |    0
 .../mlx_lm/models/minimax.pyi                      |    0
 .../mlx_lm/models/nemotron_h.pyi                   |    0
 .../mlx_lm/models/qwen3_5.pyi                      |    0
 .../mlx_lm/models/qwen3_5_moe.pyi                  |    0
 .../mlx_lm/models/qwen3_next.pyi                   |    0
 .../mlx_lm/models/rope_utils.pyi                   |    0
 .../mlx_lm/models/step3p5.pyi                      |    0
 .../mlx_lm/models/switch_layers.pyi                |    0
 {.mlx_typings => .typings}/mlx_lm/sample_utils.pyi |    0
 .../mlx_lm/tokenizer_utils.pyi                     |    0
 {.mlx_typings => .typings}/mlx_lm/tuner/dora.pyi   |    0
 {.mlx_typings => .typings}/mlx_lm/tuner/lora.pyi   |    0
 {.mlx_typings => .typings}/mlx_lm/tuner/utils.pyi  |    0
 {.mlx_typings => .typings}/mlx_lm/utils.pyi        |    0
 {.mlx_typings => .typings}/mlx_vlm/__init__.pyi    |    0
 .../mlx_vlm/prompt_utils.pyi                       |    0
 {.mlx_typings => .typings}/mlx_vlm/utils.pyi       |    0
 .typings/pynvml/__init__.pyi                       | 3226 ++++++++++++++++++++
 .../safetensors/__init__.pyi                       |    0
 pyproject.toml                                     |    8 +-
 .../exolabs--FLUX.1-Kontext-dev-4bit.toml          |    1 +
 .../exolabs--FLUX.1-Kontext-dev-8bit.toml          |    1 +
 .../exolabs--FLUX.1-Kontext-dev.toml               |    1 +
 .../exolabs--FLUX.1-Krea-dev-4bit.toml             |    1 +
 .../exolabs--FLUX.1-Krea-dev-8bit.toml             |    1 +
 .../exolabs--FLUX.1-Krea-dev.toml                  |    1 +
 .../exolabs--FLUX.1-dev-4bit.toml                  |    1 +
 .../exolabs--FLUX.1-dev-8bit.toml                  |    1 +
 .../image_model_cards/exolabs--FLUX.1-dev.toml     |    1 +
 .../exolabs--FLUX.1-schnell-4bit.toml              |    1 +
 .../exolabs--FLUX.1-schnell-8bit.toml              |    1 +
 .../image_model_cards/exolabs--FLUX.1-schnell.toml |    1 +
 .../exolabs--Qwen-Image-4bit.toml                  |    1 +
 .../exolabs--Qwen-Image-8bit.toml                  |    1 +
 .../exolabs--Qwen-Image-Edit-2509-4bit.toml        |    1 +
 .../exolabs--Qwen-Image-Edit-2509-8bit.toml        |    1 +
 .../exolabs--Qwen-Image-Edit-2509.toml             |    1 +
 .../image_model_cards/exolabs--Qwen-Image.toml     |    1 +
 .../mlx-community--DeepSeek-V3.1-4bit.toml         |    2 +-
 .../mlx-community--DeepSeek-V3.1-8bit.toml         |    2 +-
 .../mlx-community--DeepSeek-V3.2-4bit.toml         |    2 +-
 .../mlx-community--DeepSeek-V3.2-8bit.toml         |    2 +-
 .../mlx-community--DeepSeek-V4-Flash.toml          |    2 +-
 .../mlx-community--DeepSeek-V4-Pro.toml            |    2 +-
 .../mlx-community--GLM-4.5-Air-8bit.toml           |    2 +-
 .../mlx-community--GLM-4.5-Air-bf16.toml           |    2 +-
 .../mlx-community--GLM-4.7-4bit.toml               |    2 +-
 .../mlx-community--GLM-4.7-6bit.toml               |    2 +-
 .../mlx-community--GLM-4.7-8bit-gs32.toml          |    2 +-
 .../mlx-community--GLM-4.7-Flash-4bit.toml         |    2 +-
 .../mlx-community--GLM-4.7-Flash-5bit.toml         |    2 +-
 .../mlx-community--GLM-4.7-Flash-6bit.toml         |    2 +-
 .../mlx-community--GLM-4.7-Flash-8bit.toml         |    2 +-
 .../mlx-community--GLM-5-8bit.toml                 |    2 +-
 .../mlx-community--GLM-5-MXFP4-Q8.toml             |    2 +-
 .../mlx-community--GLM-5-bf16.toml                 |    2 +-
 .../mlx-community--GLM-5.1-DQ4plus-q8.toml         |    2 +-
 .../mlx-community--GLM-5.1-MXFP4-Q8.toml           |    2 +-
 .../mlx-community--GLM-5.1.toml                    |    2 +-
 .../mlx-community--Kimi-K2-Instruct-4bit.toml      |    2 +-
 .../mlx-community--Kimi-K2-Thinking.toml           |    2 +-
 .../mlx-community--Kimi-K2.5.toml                  |    2 +-
 .../mlx-community--Kimi-K2.6-mlx-DQ3_K_M-q8.toml   |    2 +-
 ...y--Llama-3.1-Nemotron-70B-Instruct-HF-4bit.toml |    2 +-
 ...y--Llama-3.1-Nemotron-70B-Instruct-HF-8bit.toml |    2 +-
 ...y--Llama-3.1-Nemotron-70B-Instruct-HF-bf16.toml |    2 +-
 ...nity--Llama-3.1-Nemotron-Nano-4B-v1.1-4bit.toml |    2 +-
 ...nity--Llama-3.1-Nemotron-Nano-4B-v1.1-8bit.toml |    2 +-
 ...nity--Llama-3.1-Nemotron-Nano-4B-v1.1-bf16.toml |    2 +-
 .../mlx-community--Llama-3.2-1B-Instruct-4bit.toml |    2 +-
 .../mlx-community--Llama-3.2-3B-Instruct-4bit.toml |    2 +-
 .../mlx-community--Llama-3.2-3B-Instruct-8bit.toml |    2 +-
 ...mlx-community--Llama-3.3-70B-Instruct-4bit.toml |    2 +-
 ...mlx-community--Llama-3.3-70B-Instruct-8bit.toml |    2 +-
 ...ommunity--Meta-Llama-3.1-70B-Instruct-4bit.toml |    2 +-
 ...community--Meta-Llama-3.1-8B-Instruct-4bit.toml |    2 +-
 ...community--Meta-Llama-3.1-8B-Instruct-8bit.toml |    2 +-
 ...community--Meta-Llama-3.1-8B-Instruct-bf16.toml |    2 +-
 .../mlx-community--MiniMax-M2.1-3bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.1-8bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.5-4bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.5-6bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.5-8bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.7-4bit-mxfp4.toml    |    2 +-
 .../mlx-community--MiniMax-M2.7-4bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.7-5bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.7-6bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.7-8bit.toml          |    2 +-
 .../mlx-community--MiniMax-M2.7.toml               |    2 +-
 ...y--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4Bit.toml |    2 +-
 ...y--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-5Bit.toml |    2 +-
 ...y--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-6Bit.toml |    2 +-
 ...y--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8Bit.toml |    2 +-
 ...y--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-BF16.toml |    2 +-
 ...--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-MXFP4.toml |    2 +-
 ...nity--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4.toml |    2 +-
 ...ommunity--NVIDIA-Nemotron-Nano-9B-v2-4bits.toml |    2 +-
 ...community--NVIDIA-Nemotron-Nano-9B-v2-6bit.toml |    2 +-
 .../mlx-community--Qwen3-0.6B-4bit.toml            |    2 +-
 .../mlx-community--Qwen3-0.6B-8bit.toml            |    2 +-
 ...munity--Qwen3-235B-A22B-Instruct-2507-4bit.toml |    2 +-
 ...munity--Qwen3-235B-A22B-Instruct-2507-8bit.toml |    2 +-
 .../mlx-community--Qwen3-30B-A3B-4bit.toml         |    2 +-
 .../mlx-community--Qwen3-30B-A3B-8bit.toml         |    2 +-
 ...unity--Qwen3-Coder-480B-A35B-Instruct-4bit.toml |    2 +-
 ...unity--Qwen3-Coder-480B-A35B-Instruct-8bit.toml |    2 +-
 .../mlx-community--Qwen3-Coder-Next-4bit.toml      |    2 +-
 .../mlx-community--Qwen3-Coder-Next-5bit.toml      |    2 +-
 .../mlx-community--Qwen3-Coder-Next-6bit.toml      |    2 +-
 .../mlx-community--Qwen3-Coder-Next-8bit.toml      |    2 +-
 .../mlx-community--Qwen3-Coder-Next-bf16.toml      |    2 +-
 ...ommunity--Qwen3-Next-80B-A3B-Instruct-4bit.toml |    2 +-
 ...ommunity--Qwen3-Next-80B-A3B-Instruct-8bit.toml |    2 +-
 ...ommunity--Qwen3-Next-80B-A3B-Thinking-4bit.toml |    2 +-
 ...ommunity--Qwen3-Next-80B-A3B-Thinking-8bit.toml |    2 +-
 .../mlx-community--Qwen3-VL-4B-Instruct-4bit.toml  |    2 +-
 .../mlx-community--Qwen3.5-122B-A10B-4bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-122B-A10B-6bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-122B-A10B-8bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-122B-A10B-bf16.toml     |    2 +-
 .../mlx-community--Qwen3.5-27B-4bit.toml           |    2 +-
 .../mlx-community--Qwen3.5-27B-8bit.toml           |    2 +-
 .../mlx-community--Qwen3.5-2B-MLX-8bit.toml        |    2 +-
 .../mlx-community--Qwen3.5-35B-A3B-4bit.toml       |    2 +-
 .../mlx-community--Qwen3.5-35B-A3B-8bit.toml       |    2 +-
 .../mlx-community--Qwen3.5-397B-A17B-4bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-397B-A17B-6bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-397B-A17B-8bit.toml     |    2 +-
 .../mlx-community--Qwen3.5-9B-4bit.toml            |    2 +-
 .../mlx-community--Qwen3.5-9B-8bit.toml            |    2 +-
 .../mlx-community--Qwen3.6-27B-4bit.toml           |    2 +-
 .../mlx-community--Qwen3.6-27B-8bit.toml           |    2 +-
 .../mlx-community--Qwen3.6-27B-bf16.toml           |    2 +-
 .../mlx-community--Qwen3.6-35B-A3B-4bit.toml       |    2 +-
 .../mlx-community--Qwen3.6-35B-A3B-5bit.toml       |    2 +-
 .../mlx-community--Qwen3.6-35B-A3B-8bit.toml       |    2 +-
 .../mlx-community--Qwen3.6-35B-A3B-bf16.toml       |    2 +-
 .../mlx-community--Step-3.5-Flash-4bit.toml        |    2 +-
 .../mlx-community--Step-3.5-Flash-6bit.toml        |    2 +-
 .../mlx-community--Step-3.5-Flash-8Bit.toml        |    2 +-
 .../mlx-community--gemma-4-26b-a4b-it-4bit.toml    |    2 +-
 .../mlx-community--gemma-4-26b-a4b-it-6bit.toml    |    2 +-
 .../mlx-community--gemma-4-26b-a4b-it-8bit.toml    |    2 +-
 .../mlx-community--gemma-4-26b-a4b-it-bf16.toml    |    2 +-
 .../mlx-community--gemma-4-31b-it-4bit.toml        |    2 +-
 .../mlx-community--gemma-4-31b-it-6bit.toml        |    2 +-
 .../mlx-community--gemma-4-31b-it-8bit.toml        |    2 +-
 .../mlx-community--gemma-4-31b-it-bf16.toml        |    2 +-
 .../mlx-community--gemma-4-e2b-it-4bit.toml        |    2 +-
 .../mlx-community--gemma-4-e2b-it-6bit.toml        |    2 +-
 .../mlx-community--gemma-4-e2b-it-8bit.toml        |    2 +-
 .../mlx-community--gemma-4-e2b-it-bf16.toml        |    2 +-
 .../mlx-community--gemma-4-e4b-it-4bit.toml        |    2 +-
 .../mlx-community--gemma-4-e4b-it-6bit.toml        |    2 +-
 .../mlx-community--gemma-4-e4b-it-8bit.toml        |    2 +-
 .../mlx-community--gemma-4-e4b-it-bf16.toml        |    2 +-
 .../mlx-community--gpt-oss-120b-MXFP4-Q8.toml      |    2 +-
 .../mlx-community--gpt-oss-20b-MXFP4-Q8.toml       |    2 +-
 ...mlx-community--llama-3.3-70b-instruct-fp16.toml |    2 +-
 .../moonshotai--Kimi-K2.6.toml                     |    2 +-
 src/exo/api/main.py                                |    2 +
 src/exo/download/impl_shard_downloader.py          |    1 +
 src/exo/download/shard_downloader.py               |    2 +
 src/exo/download/tests/test_cancel_download.py     |    2 +
 .../tests/test_download_status_not_lost.py         |    2 +
 src/exo/download/tests/test_re_download.py         |    2 +
 src/exo/master/main.py                             |    1 +
 src/exo/master/placement.py                        |   30 +
 src/exo/master/tests/test_master.py                |   38 +-
 src/exo/master/tests/test_placement.py             |  156 +-
 src/exo/master/tests/test_placement_utils.py       |    7 +
 src/exo/shared/apply.py                            |    6 +
 src/exo/shared/models/model_cards.py               |    5 +
 src/exo/shared/tests/conftest.py                   |    2 +
 .../test_apply/test_apply_custom_model_cards.py    |    2 +
 src/exo/shared/types/backends.py                   |    8 +
 src/exo/shared/types/state.py                      |    2 +
 src/exo/utils/info_gatherer/info_gatherer.py       |   33 +
 src/exo/worker/tests/unittests/conftest.py         |    2 +
 .../worker/tests/unittests/test_mlx/conftest.py    |    3 +
 .../test_mlx/test_pipeline_prefill_callbacks.py    |    2 +
 447 files changed, 3660 insertions(+), 144 deletions(-)

diff --git a/.mlx_typings/.gitkeep b/.typings/.gitkeep
similarity index 100%
rename from .mlx_typings/.gitkeep
rename to .typings/.gitkeep
diff --git a/.mlx_typings/mflux/__init__.pyi b/.typings/mflux/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/__init__.pyi
rename to .typings/mflux/__init__.pyi
diff --git a/.mlx_typings/mflux/callbacks/__init__.pyi b/.typings/mflux/callbacks/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/callbacks/__init__.pyi
rename to .typings/mflux/callbacks/__init__.pyi
diff --git a/.mlx_typings/mflux/callbacks/callback.pyi b/.typings/mflux/callbacks/callback.pyi
similarity index 100%
rename from .mlx_typings/mflux/callbacks/callback.pyi
rename to .typings/mflux/callbacks/callback.pyi
diff --git a/.mlx_typings/mflux/callbacks/callback_registry.pyi b/.typings/mflux/callbacks/callback_registry.pyi
similarity index 100%
rename from .mlx_typings/mflux/callbacks/callback_registry.pyi
rename to .typings/mflux/callbacks/callback_registry.pyi
diff --git a/.mlx_typings/mflux/callbacks/generation_context.pyi b/.typings/mflux/callbacks/generation_context.pyi
similarity index 100%
rename from .mlx_typings/mflux/callbacks/generation_context.pyi
rename to .typings/mflux/callbacks/generation_context.pyi
diff --git a/.mlx_typings/mflux/cli/__init__.pyi b/.typings/mflux/cli/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/cli/__init__.pyi
rename to .typings/mflux/cli/__init__.pyi
diff --git a/.mlx_typings/mflux/cli/defaults/defaults.pyi b/.typings/mflux/cli/defaults/defaults.pyi
similarity index 100%
rename from .mlx_typings/mflux/cli/defaults/defaults.pyi
rename to .typings/mflux/cli/defaults/defaults.pyi
diff --git a/.mlx_typings/mflux/models/__init__.pyi b/.typings/mflux/models/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/__init__.pyi
rename to .typings/mflux/models/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/__init__.pyi b/.typings/mflux/models/common/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/__init__.pyi
rename to .typings/mflux/models/common/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/cli/__init__.pyi b/.typings/mflux/models/common/cli/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/cli/__init__.pyi
rename to .typings/mflux/models/common/cli/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/config/__init__.pyi b/.typings/mflux/models/common/config/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/config/__init__.pyi
rename to .typings/mflux/models/common/config/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/config/config.pyi b/.typings/mflux/models/common/config/config.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/config/config.pyi
rename to .typings/mflux/models/common/config/config.pyi
diff --git a/.mlx_typings/mflux/models/common/config/model_config.pyi b/.typings/mflux/models/common/config/model_config.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/config/model_config.pyi
rename to .typings/mflux/models/common/config/model_config.pyi
diff --git a/.mlx_typings/mflux/models/common/latent_creator/__init__.pyi b/.typings/mflux/models/common/latent_creator/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/latent_creator/__init__.pyi
rename to .typings/mflux/models/common/latent_creator/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/latent_creator/latent_creator.pyi b/.typings/mflux/models/common/latent_creator/latent_creator.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/latent_creator/latent_creator.pyi
rename to .typings/mflux/models/common/latent_creator/latent_creator.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/__init__.pyi b/.typings/mflux/models/common/lora/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/__init__.pyi
rename to .typings/mflux/models/common/lora/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/layer/fused_linear_lora_layer.pyi b/.typings/mflux/models/common/lora/layer/fused_linear_lora_layer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/layer/fused_linear_lora_layer.pyi
rename to .typings/mflux/models/common/lora/layer/fused_linear_lora_layer.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/layer/linear_lora_layer.pyi b/.typings/mflux/models/common/lora/layer/linear_lora_layer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/layer/linear_lora_layer.pyi
rename to .typings/mflux/models/common/lora/layer/linear_lora_layer.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/mapping/lora_loader.pyi b/.typings/mflux/models/common/lora/mapping/lora_loader.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/mapping/lora_loader.pyi
rename to .typings/mflux/models/common/lora/mapping/lora_loader.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/mapping/lora_mapping.pyi b/.typings/mflux/models/common/lora/mapping/lora_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/mapping/lora_mapping.pyi
rename to .typings/mflux/models/common/lora/mapping/lora_mapping.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/mapping/lora_saver.pyi b/.typings/mflux/models/common/lora/mapping/lora_saver.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/mapping/lora_saver.pyi
rename to .typings/mflux/models/common/lora/mapping/lora_saver.pyi
diff --git a/.mlx_typings/mflux/models/common/lora/mapping/lora_transforms.pyi b/.typings/mflux/models/common/lora/mapping/lora_transforms.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/lora/mapping/lora_transforms.pyi
rename to .typings/mflux/models/common/lora/mapping/lora_transforms.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/__init__.pyi b/.typings/mflux/models/common/resolution/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/__init__.pyi
rename to .typings/mflux/models/common/resolution/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/actions.pyi b/.typings/mflux/models/common/resolution/actions.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/actions.pyi
rename to .typings/mflux/models/common/resolution/actions.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/config_resolution.pyi b/.typings/mflux/models/common/resolution/config_resolution.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/config_resolution.pyi
rename to .typings/mflux/models/common/resolution/config_resolution.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/lora_resolution.pyi b/.typings/mflux/models/common/resolution/lora_resolution.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/lora_resolution.pyi
rename to .typings/mflux/models/common/resolution/lora_resolution.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/path_resolution.pyi b/.typings/mflux/models/common/resolution/path_resolution.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/path_resolution.pyi
rename to .typings/mflux/models/common/resolution/path_resolution.pyi
diff --git a/.mlx_typings/mflux/models/common/resolution/quantization_resolution.pyi b/.typings/mflux/models/common/resolution/quantization_resolution.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/resolution/quantization_resolution.pyi
rename to .typings/mflux/models/common/resolution/quantization_resolution.pyi
diff --git a/.mlx_typings/mflux/models/common/schedulers/__init__.pyi b/.typings/mflux/models/common/schedulers/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/schedulers/__init__.pyi
rename to .typings/mflux/models/common/schedulers/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/schedulers/base_scheduler.pyi b/.typings/mflux/models/common/schedulers/base_scheduler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/schedulers/base_scheduler.pyi
rename to .typings/mflux/models/common/schedulers/base_scheduler.pyi
diff --git a/.mlx_typings/mflux/models/common/schedulers/flow_match_euler_discrete_scheduler.pyi b/.typings/mflux/models/common/schedulers/flow_match_euler_discrete_scheduler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/schedulers/flow_match_euler_discrete_scheduler.pyi
rename to .typings/mflux/models/common/schedulers/flow_match_euler_discrete_scheduler.pyi
diff --git a/.mlx_typings/mflux/models/common/schedulers/linear_scheduler.pyi b/.typings/mflux/models/common/schedulers/linear_scheduler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/schedulers/linear_scheduler.pyi
rename to .typings/mflux/models/common/schedulers/linear_scheduler.pyi
diff --git a/.mlx_typings/mflux/models/common/schedulers/seedvr2_euler_scheduler.pyi b/.typings/mflux/models/common/schedulers/seedvr2_euler_scheduler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/schedulers/seedvr2_euler_scheduler.pyi
rename to .typings/mflux/models/common/schedulers/seedvr2_euler_scheduler.pyi
diff --git a/.mlx_typings/mflux/models/common/tokenizer/__init__.pyi b/.typings/mflux/models/common/tokenizer/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/tokenizer/__init__.pyi
rename to .typings/mflux/models/common/tokenizer/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/tokenizer/tokenizer.pyi b/.typings/mflux/models/common/tokenizer/tokenizer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/tokenizer/tokenizer.pyi
rename to .typings/mflux/models/common/tokenizer/tokenizer.pyi
diff --git a/.mlx_typings/mflux/models/common/tokenizer/tokenizer_loader.pyi b/.typings/mflux/models/common/tokenizer/tokenizer_loader.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/tokenizer/tokenizer_loader.pyi
rename to .typings/mflux/models/common/tokenizer/tokenizer_loader.pyi
diff --git a/.mlx_typings/mflux/models/common/tokenizer/tokenizer_output.pyi b/.typings/mflux/models/common/tokenizer/tokenizer_output.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/tokenizer/tokenizer_output.pyi
rename to .typings/mflux/models/common/tokenizer/tokenizer_output.pyi
diff --git a/.mlx_typings/mflux/models/common/vae/__init__.pyi b/.typings/mflux/models/common/vae/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/vae/__init__.pyi
rename to .typings/mflux/models/common/vae/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/vae/tiling_config.pyi b/.typings/mflux/models/common/vae/tiling_config.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/vae/tiling_config.pyi
rename to .typings/mflux/models/common/vae/tiling_config.pyi
diff --git a/.mlx_typings/mflux/models/common/vae/vae_tiler.pyi b/.typings/mflux/models/common/vae/vae_tiler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/vae/vae_tiler.pyi
rename to .typings/mflux/models/common/vae/vae_tiler.pyi
diff --git a/.mlx_typings/mflux/models/common/vae/vae_util.pyi b/.typings/mflux/models/common/vae/vae_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/vae/vae_util.pyi
rename to .typings/mflux/models/common/vae/vae_util.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/__init__.pyi b/.typings/mflux/models/common/weights/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/__init__.pyi
rename to .typings/mflux/models/common/weights/__init__.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/loading/loaded_weights.pyi b/.typings/mflux/models/common/weights/loading/loaded_weights.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/loading/loaded_weights.pyi
rename to .typings/mflux/models/common/weights/loading/loaded_weights.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/loading/weight_applier.pyi b/.typings/mflux/models/common/weights/loading/weight_applier.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/loading/weight_applier.pyi
rename to .typings/mflux/models/common/weights/loading/weight_applier.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/loading/weight_definition.pyi b/.typings/mflux/models/common/weights/loading/weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/loading/weight_definition.pyi
rename to .typings/mflux/models/common/weights/loading/weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/loading/weight_loader.pyi b/.typings/mflux/models/common/weights/loading/weight_loader.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/loading/weight_loader.pyi
rename to .typings/mflux/models/common/weights/loading/weight_loader.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/mapping/weight_mapper.pyi b/.typings/mflux/models/common/weights/mapping/weight_mapper.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/mapping/weight_mapper.pyi
rename to .typings/mflux/models/common/weights/mapping/weight_mapper.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/mapping/weight_mapping.pyi b/.typings/mflux/models/common/weights/mapping/weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/mapping/weight_mapping.pyi
rename to .typings/mflux/models/common/weights/mapping/weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/mapping/weight_transforms.pyi b/.typings/mflux/models/common/weights/mapping/weight_transforms.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/mapping/weight_transforms.pyi
rename to .typings/mflux/models/common/weights/mapping/weight_transforms.pyi
diff --git a/.mlx_typings/mflux/models/common/weights/saving/model_saver.pyi b/.typings/mflux/models/common/weights/saving/model_saver.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/common/weights/saving/model_saver.pyi
rename to .typings/mflux/models/common/weights/saving/model_saver.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/depth_pro_initializer.pyi b/.typings/mflux/models/depth_pro/depth_pro_initializer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/depth_pro_initializer.pyi
rename to .typings/mflux/models/depth_pro/depth_pro_initializer.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/decoder/feature_fusion_block_2d.pyi b/.typings/mflux/models/depth_pro/model/decoder/feature_fusion_block_2d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/decoder/feature_fusion_block_2d.pyi
rename to .typings/mflux/models/depth_pro/model/decoder/feature_fusion_block_2d.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/decoder/multires_conv_decoder.pyi b/.typings/mflux/models/depth_pro/model/decoder/multires_conv_decoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/decoder/multires_conv_decoder.pyi
rename to .typings/mflux/models/depth_pro/model/decoder/multires_conv_decoder.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/decoder/residual_block.pyi b/.typings/mflux/models/depth_pro/model/decoder/residual_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/decoder/residual_block.pyi
rename to .typings/mflux/models/depth_pro/model/decoder/residual_block.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/depth_pro.pyi b/.typings/mflux/models/depth_pro/model/depth_pro.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/depth_pro.pyi
rename to .typings/mflux/models/depth_pro/model/depth_pro.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/depth_pro_model.pyi b/.typings/mflux/models/depth_pro/model/depth_pro_model.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/depth_pro_model.pyi
rename to .typings/mflux/models/depth_pro/model/depth_pro_model.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/depth_pro_util.pyi b/.typings/mflux/models/depth_pro/model/depth_pro_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/depth_pro_util.pyi
rename to .typings/mflux/models/depth_pro/model/depth_pro_util.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/attention.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/attention.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/attention.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/dino_vision_transformer.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/dino_vision_transformer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/dino_vision_transformer.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/dino_vision_transformer.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/layer_scale.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/layer_scale.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/layer_scale.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/layer_scale.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/mlp.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/mlp.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/mlp.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/mlp.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/patch_embed.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/patch_embed.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/patch_embed.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/patch_embed.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/dino_v2/transformer_block.pyi b/.typings/mflux/models/depth_pro/model/dino_v2/transformer_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/dino_v2/transformer_block.pyi
rename to .typings/mflux/models/depth_pro/model/dino_v2/transformer_block.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/encoder/depth_pro_encoder.pyi b/.typings/mflux/models/depth_pro/model/encoder/depth_pro_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/encoder/depth_pro_encoder.pyi
rename to .typings/mflux/models/depth_pro/model/encoder/depth_pro_encoder.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/encoder/upsample_block.pyi b/.typings/mflux/models/depth_pro/model/encoder/upsample_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/encoder/upsample_block.pyi
rename to .typings/mflux/models/depth_pro/model/encoder/upsample_block.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/model/head/fov_head.pyi b/.typings/mflux/models/depth_pro/model/head/fov_head.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/model/head/fov_head.pyi
rename to .typings/mflux/models/depth_pro/model/head/fov_head.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/weights/depth_pro_weight_definition.pyi b/.typings/mflux/models/depth_pro/weights/depth_pro_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/weights/depth_pro_weight_definition.pyi
rename to .typings/mflux/models/depth_pro/weights/depth_pro_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/depth_pro/weights/depth_pro_weight_mapping.pyi b/.typings/mflux/models/depth_pro/weights/depth_pro_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/depth_pro/weights/depth_pro_weight_mapping.pyi
rename to .typings/mflux/models/depth_pro/weights/depth_pro_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/fibo/latent_creator/fibo_latent_creator.pyi b/.typings/mflux/models/fibo/latent_creator/fibo_latent_creator.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo/latent_creator/fibo_latent_creator.pyi
rename to .typings/mflux/models/fibo/latent_creator/fibo_latent_creator.pyi
diff --git a/.mlx_typings/mflux/models/fibo/weights/fibo_weight_definition.pyi b/.typings/mflux/models/fibo/weights/fibo_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo/weights/fibo_weight_definition.pyi
rename to .typings/mflux/models/fibo/weights/fibo_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/fibo/weights/fibo_weight_mapping.pyi b/.typings/mflux/models/fibo/weights/fibo_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo/weights/fibo_weight_mapping.pyi
rename to .typings/mflux/models/fibo/weights/fibo_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_image_processor.pyi b/.typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_image_processor.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_image_processor.pyi
rename to .typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_image_processor.pyi
diff --git a/.mlx_typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_processor.pyi b/.typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_processor.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_processor.pyi
rename to .typings/mflux/models/fibo_vlm/tokenizer/qwen2vl_processor.pyi
diff --git a/.mlx_typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_definition.pyi b/.typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_definition.pyi
rename to .typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_mapping.pyi b/.typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_mapping.pyi
rename to .typings/mflux/models/fibo_vlm/weights/fibo_vlm_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/flux/__init__.pyi b/.typings/mflux/models/flux/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/__init__.pyi
rename to .typings/mflux/models/flux/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/cli/__init__.pyi b/.typings/mflux/models/flux/cli/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/cli/__init__.pyi
rename to .typings/mflux/models/flux/cli/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/flux_initializer.pyi b/.typings/mflux/models/flux/flux_initializer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/flux_initializer.pyi
rename to .typings/mflux/models/flux/flux_initializer.pyi
diff --git a/.mlx_typings/mflux/models/flux/latent_creator/__init__.pyi b/.typings/mflux/models/flux/latent_creator/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/latent_creator/__init__.pyi
rename to .typings/mflux/models/flux/latent_creator/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/latent_creator/flux_latent_creator.pyi b/.typings/mflux/models/flux/latent_creator/flux_latent_creator.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/latent_creator/flux_latent_creator.pyi
rename to .typings/mflux/models/flux/latent_creator/flux_latent_creator.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/__init__.pyi b/.typings/mflux/models/flux/model/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/__init__.pyi
rename to .typings/mflux/models/flux/model/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_embeddings.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_embeddings.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_embeddings.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_embeddings.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder_layer.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder_layer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder_layer.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_encoder_layer.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_mlp.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_mlp.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_mlp.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_mlp.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_sdpa_attention.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_sdpa_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_sdpa_attention.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_sdpa_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_text_model.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_text_model.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_text_model.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/clip_text_model.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/encoder_clip.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/encoder_clip.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/encoder_clip.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/clip_encoder/encoder_clip.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/prompt_encoder.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/prompt_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/prompt_encoder.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/prompt_encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_attention.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_attention.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_block.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_block.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_block.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_dense_relu_dense.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_dense_relu_dense.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_dense_relu_dense.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_dense_relu_dense.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_encoder.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_encoder.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_feed_forward.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_feed_forward.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_feed_forward.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_feed_forward.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_layer_norm.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_layer_norm.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_layer_norm.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_layer_norm.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_self_attention.pyi b/.typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_self_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_self_attention.pyi
rename to .typings/mflux/models/flux/model/flux_text_encoder/t5_encoder/t5_self_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_continuous.pyi b/.typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_continuous.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_continuous.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_continuous.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero.pyi b/.typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero_single.pyi b/.typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero_single.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero_single.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/ada_layer_norm_zero_single.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/common/attention_utils.pyi b/.typings/mflux/models/flux/model/flux_transformer/common/attention_utils.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/common/attention_utils.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/common/attention_utils.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/embed_nd.pyi b/.typings/mflux/models/flux/model/flux_transformer/embed_nd.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/embed_nd.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/embed_nd.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/feed_forward.pyi b/.typings/mflux/models/flux/model/flux_transformer/feed_forward.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/feed_forward.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/feed_forward.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/guidance_embedder.pyi b/.typings/mflux/models/flux/model/flux_transformer/guidance_embedder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/guidance_embedder.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/guidance_embedder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/joint_attention.pyi b/.typings/mflux/models/flux/model/flux_transformer/joint_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/joint_attention.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/joint_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/joint_transformer_block.pyi b/.typings/mflux/models/flux/model/flux_transformer/joint_transformer_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/joint_transformer_block.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/joint_transformer_block.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/single_block_attention.pyi b/.typings/mflux/models/flux/model/flux_transformer/single_block_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/single_block_attention.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/single_block_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/single_transformer_block.pyi b/.typings/mflux/models/flux/model/flux_transformer/single_transformer_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/single_transformer_block.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/single_transformer_block.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/text_embedder.pyi b/.typings/mflux/models/flux/model/flux_transformer/text_embedder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/text_embedder.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/text_embedder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/time_text_embed.pyi b/.typings/mflux/models/flux/model/flux_transformer/time_text_embed.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/time_text_embed.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/time_text_embed.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/timestep_embedder.pyi b/.typings/mflux/models/flux/model/flux_transformer/timestep_embedder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/timestep_embedder.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/timestep_embedder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_transformer/transformer.pyi b/.typings/mflux/models/flux/model/flux_transformer/transformer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_transformer/transformer.pyi
rename to .typings/mflux/models/flux/model/flux_transformer/transformer.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/common/attention.pyi b/.typings/mflux/models/flux/model/flux_vae/common/attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/common/attention.pyi
rename to .typings/mflux/models/flux/model/flux_vae/common/attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/common/resnet_block_2d.pyi b/.typings/mflux/models/flux/model/flux_vae/common/resnet_block_2d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/common/resnet_block_2d.pyi
rename to .typings/mflux/models/flux/model/flux_vae/common/resnet_block_2d.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/common/unet_mid_block.pyi b/.typings/mflux/models/flux/model/flux_vae/common/unet_mid_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/common/unet_mid_block.pyi
rename to .typings/mflux/models/flux/model/flux_vae/common/unet_mid_block.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_in.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/conv_in.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_in.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/conv_in.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_norm_out.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/conv_norm_out.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_norm_out.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/conv_norm_out.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_out.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/conv_out.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/conv_out.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/conv_out.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/decoder.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/decoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/decoder.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/decoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_1_or_2.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/up_block_1_or_2.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_1_or_2.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/up_block_1_or_2.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_3.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/up_block_3.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_3.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/up_block_3.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_4.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/up_block_4.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_block_4.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/up_block_4.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_sampler.pyi b/.typings/mflux/models/flux/model/flux_vae/decoder/up_sampler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/decoder/up_sampler.pyi
rename to .typings/mflux/models/flux/model/flux_vae/decoder/up_sampler.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_in.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/conv_in.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_in.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/conv_in.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_norm_out.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/conv_norm_out.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_norm_out.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/conv_norm_out.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_out.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/conv_out.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/conv_out.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/conv_out.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_1.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/down_block_1.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_1.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/down_block_1.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_2.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/down_block_2.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_2.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/down_block_2.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_3.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/down_block_3.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_3.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/down_block_3.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_4.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/down_block_4.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_block_4.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/down_block_4.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_sampler.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/down_sampler.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/down_sampler.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/down_sampler.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/encoder/encoder.pyi b/.typings/mflux/models/flux/model/flux_vae/encoder/encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/encoder/encoder.pyi
rename to .typings/mflux/models/flux/model/flux_vae/encoder/encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/flux_vae/vae.pyi b/.typings/mflux/models/flux/model/flux_vae/vae.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/flux_vae/vae.pyi
rename to .typings/mflux/models/flux/model/flux_vae/vae.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/redux_encoder/redux_encoder.pyi b/.typings/mflux/models/flux/model/redux_encoder/redux_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/redux_encoder/redux_encoder.pyi
rename to .typings/mflux/models/flux/model/redux_encoder/redux_encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder_layer.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder_layer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder_layer.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_encoder_layer.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_mlp.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_mlp.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_mlp.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_mlp.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_multi_head_attention_pooling_head.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_multi_head_attention_pooling_head.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_multi_head_attention_pooling_head.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_multi_head_attention_pooling_head.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_sdpa_attention.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_sdpa_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_sdpa_attention.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_sdpa_attention.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_embeddings.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_embeddings.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_embeddings.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_embeddings.pyi
diff --git a/.mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_transformer.pyi b/.typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_transformer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_transformer.pyi
rename to .typings/mflux/models/flux/model/siglip_vision_transformer/siglip_vision_transformer.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/__init__.pyi b/.typings/mflux/models/flux/variants/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/__init__.pyi
rename to .typings/mflux/models/flux/variants/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/concept_attention/attention_data.pyi b/.typings/mflux/models/flux/variants/concept_attention/attention_data.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/concept_attention/attention_data.pyi
rename to .typings/mflux/models/flux/variants/concept_attention/attention_data.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/concept_attention/joint_attention_concept.pyi b/.typings/mflux/models/flux/variants/concept_attention/joint_attention_concept.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/concept_attention/joint_attention_concept.pyi
rename to .typings/mflux/models/flux/variants/concept_attention/joint_attention_concept.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/concept_attention/joint_transformer_block_concept.pyi b/.typings/mflux/models/flux/variants/concept_attention/joint_transformer_block_concept.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/concept_attention/joint_transformer_block_concept.pyi
rename to .typings/mflux/models/flux/variants/concept_attention/joint_transformer_block_concept.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/concept_attention/transformer_concept.pyi b/.typings/mflux/models/flux/variants/concept_attention/transformer_concept.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/concept_attention/transformer_concept.pyi
rename to .typings/mflux/models/flux/variants/concept_attention/transformer_concept.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/controlnet/transformer_controlnet.pyi b/.typings/mflux/models/flux/variants/controlnet/transformer_controlnet.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/controlnet/transformer_controlnet.pyi
rename to .typings/mflux/models/flux/variants/controlnet/transformer_controlnet.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/kontext/__init__.pyi b/.typings/mflux/models/flux/variants/kontext/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/kontext/__init__.pyi
rename to .typings/mflux/models/flux/variants/kontext/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/kontext/flux_kontext.pyi b/.typings/mflux/models/flux/variants/kontext/flux_kontext.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/kontext/flux_kontext.pyi
rename to .typings/mflux/models/flux/variants/kontext/flux_kontext.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/kontext/kontext_util.pyi b/.typings/mflux/models/flux/variants/kontext/kontext_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/kontext/kontext_util.pyi
rename to .typings/mflux/models/flux/variants/kontext/kontext_util.pyi
diff --git a/.mlx_typings/mflux/models/flux/variants/txt2img/flux.pyi b/.typings/mflux/models/flux/variants/txt2img/flux.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/variants/txt2img/flux.pyi
rename to .typings/mflux/models/flux/variants/txt2img/flux.pyi
diff --git a/.mlx_typings/mflux/models/flux/weights/__init__.pyi b/.typings/mflux/models/flux/weights/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/weights/__init__.pyi
rename to .typings/mflux/models/flux/weights/__init__.pyi
diff --git a/.mlx_typings/mflux/models/flux/weights/flux_lora_mapping.pyi b/.typings/mflux/models/flux/weights/flux_lora_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/weights/flux_lora_mapping.pyi
rename to .typings/mflux/models/flux/weights/flux_lora_mapping.pyi
diff --git a/.mlx_typings/mflux/models/flux/weights/flux_weight_definition.pyi b/.typings/mflux/models/flux/weights/flux_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/weights/flux_weight_definition.pyi
rename to .typings/mflux/models/flux/weights/flux_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/flux/weights/flux_weight_mapping.pyi b/.typings/mflux/models/flux/weights/flux_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/flux/weights/flux_weight_mapping.pyi
rename to .typings/mflux/models/flux/weights/flux_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/qwen/__init__.pyi b/.typings/mflux/models/qwen/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/__init__.pyi
rename to .typings/mflux/models/qwen/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/cli/__init__.pyi b/.typings/mflux/models/qwen/cli/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/cli/__init__.pyi
rename to .typings/mflux/models/qwen/cli/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/latent_creator/__init__.pyi b/.typings/mflux/models/qwen/latent_creator/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/latent_creator/__init__.pyi
rename to .typings/mflux/models/qwen/latent_creator/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/latent_creator/qwen_latent_creator.pyi b/.typings/mflux/models/qwen/latent_creator/qwen_latent_creator.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/latent_creator/qwen_latent_creator.pyi
rename to .typings/mflux/models/qwen/latent_creator/qwen_latent_creator.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/__init__.pyi b/.typings/mflux/models/qwen/model/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/__init__.pyi
rename to .typings/mflux/models/qwen/model/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_attention.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_attention.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_attention.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder_layer.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder_layer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder_layer.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_encoder_layer.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_mlp.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_mlp.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_mlp.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_mlp.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_patch_merger.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_patch_merger.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_patch_merger.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_patch_merger.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_prompt_encoder.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_prompt_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_prompt_encoder.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_prompt_encoder.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rms_norm.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rms_norm.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rms_norm.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rms_norm.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rope.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rope.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rope.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_rope.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_text_encoder.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_text_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_text_encoder.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_text_encoder.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_attention.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_attention.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_attention.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_block.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_block.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_block.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_language_encoder.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_language_encoder.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_language_encoder.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_language_encoder.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_mlp.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_mlp.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_mlp.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_mlp.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_patch_embed.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_patch_embed.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_patch_embed.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_patch_embed.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_rotary_embedding.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_rotary_embedding.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_rotary_embedding.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_rotary_embedding.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_transformer.pyi b/.typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_transformer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_transformer.pyi
rename to .typings/mflux/models/qwen/model/qwen_text_encoder/qwen_vision_transformer.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_attention.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_attention.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_attention.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_attention.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_feed_forward.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_feed_forward.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_feed_forward.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_feed_forward.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_rope.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_rope.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_rope.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_rope.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_time_text_embed.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_time_text_embed.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_time_text_embed.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_time_text_embed.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_timestep_embedding.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_timestep_embedding.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_timestep_embedding.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_timestep_embedding.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_timesteps.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_timesteps.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_timesteps.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_timesteps.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_block.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_block.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_block.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_block.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_rms_norm.pyi b/.typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_rms_norm.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_rms_norm.pyi
rename to .typings/mflux/models/qwen/model/qwen_transformer/qwen_transformer_rms_norm.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_attention_block_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_attention_block_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_attention_block_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_attention_block_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_causal_conv_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_causal_conv_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_causal_conv_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_causal_conv_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_decoder_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_decoder_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_decoder_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_decoder_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_down_block_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_down_block_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_down_block_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_down_block_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_encoder_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_encoder_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_encoder_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_encoder_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_mid_block_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_mid_block_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_mid_block_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_mid_block_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_res_block_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_res_block_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_res_block_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_res_block_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_resample_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_resample_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_resample_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_resample_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_rms_norm.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_rms_norm.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_rms_norm.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_rms_norm.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_up_block_3d.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_image_up_block_3d.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_image_up_block_3d.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_image_up_block_3d.pyi
diff --git a/.mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_vae.pyi b/.typings/mflux/models/qwen/model/qwen_vae/qwen_vae.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/model/qwen_vae/qwen_vae.pyi
rename to .typings/mflux/models/qwen/model/qwen_vae/qwen_vae.pyi
diff --git a/.mlx_typings/mflux/models/qwen/qwen_initializer.pyi b/.typings/mflux/models/qwen/qwen_initializer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/qwen_initializer.pyi
rename to .typings/mflux/models/qwen/qwen_initializer.pyi
diff --git a/.mlx_typings/mflux/models/qwen/tokenizer/__init__.pyi b/.typings/mflux/models/qwen/tokenizer/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/tokenizer/__init__.pyi
rename to .typings/mflux/models/qwen/tokenizer/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/tokenizer/qwen_image_processor.pyi b/.typings/mflux/models/qwen/tokenizer/qwen_image_processor.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/tokenizer/qwen_image_processor.pyi
rename to .typings/mflux/models/qwen/tokenizer/qwen_image_processor.pyi
diff --git a/.mlx_typings/mflux/models/qwen/tokenizer/qwen_vision_language_processor.pyi b/.typings/mflux/models/qwen/tokenizer/qwen_vision_language_processor.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/tokenizer/qwen_vision_language_processor.pyi
rename to .typings/mflux/models/qwen/tokenizer/qwen_vision_language_processor.pyi
diff --git a/.mlx_typings/mflux/models/qwen/tokenizer/qwen_vision_language_tokenizer.pyi b/.typings/mflux/models/qwen/tokenizer/qwen_vision_language_tokenizer.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/tokenizer/qwen_vision_language_tokenizer.pyi
rename to .typings/mflux/models/qwen/tokenizer/qwen_vision_language_tokenizer.pyi
diff --git a/.mlx_typings/mflux/models/qwen/variants/__init__.pyi b/.typings/mflux/models/qwen/variants/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/variants/__init__.pyi
rename to .typings/mflux/models/qwen/variants/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/variants/edit/qwen_edit_util.pyi b/.typings/mflux/models/qwen/variants/edit/qwen_edit_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/variants/edit/qwen_edit_util.pyi
rename to .typings/mflux/models/qwen/variants/edit/qwen_edit_util.pyi
diff --git a/.mlx_typings/mflux/models/qwen/variants/edit/qwen_image_edit.pyi b/.typings/mflux/models/qwen/variants/edit/qwen_image_edit.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/variants/edit/qwen_image_edit.pyi
rename to .typings/mflux/models/qwen/variants/edit/qwen_image_edit.pyi
diff --git a/.mlx_typings/mflux/models/qwen/variants/txt2img/qwen_image.pyi b/.typings/mflux/models/qwen/variants/txt2img/qwen_image.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/variants/txt2img/qwen_image.pyi
rename to .typings/mflux/models/qwen/variants/txt2img/qwen_image.pyi
diff --git a/.mlx_typings/mflux/models/qwen/weights/__init__.pyi b/.typings/mflux/models/qwen/weights/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/weights/__init__.pyi
rename to .typings/mflux/models/qwen/weights/__init__.pyi
diff --git a/.mlx_typings/mflux/models/qwen/weights/qwen_lora_mapping.pyi b/.typings/mflux/models/qwen/weights/qwen_lora_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/weights/qwen_lora_mapping.pyi
rename to .typings/mflux/models/qwen/weights/qwen_lora_mapping.pyi
diff --git a/.mlx_typings/mflux/models/qwen/weights/qwen_weight_definition.pyi b/.typings/mflux/models/qwen/weights/qwen_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/weights/qwen_weight_definition.pyi
rename to .typings/mflux/models/qwen/weights/qwen_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/qwen/weights/qwen_weight_mapping.pyi b/.typings/mflux/models/qwen/weights/qwen_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/qwen/weights/qwen_weight_mapping.pyi
rename to .typings/mflux/models/qwen/weights/qwen_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/seedvr2/weights/seedvr2_weight_definition.pyi b/.typings/mflux/models/seedvr2/weights/seedvr2_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/seedvr2/weights/seedvr2_weight_definition.pyi
rename to .typings/mflux/models/seedvr2/weights/seedvr2_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/seedvr2/weights/seedvr2_weight_mapping.pyi b/.typings/mflux/models/seedvr2/weights/seedvr2_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/seedvr2/weights/seedvr2_weight_mapping.pyi
rename to .typings/mflux/models/seedvr2/weights/seedvr2_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/models/z_image/latent_creator/z_image_latent_creator.pyi b/.typings/mflux/models/z_image/latent_creator/z_image_latent_creator.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/z_image/latent_creator/z_image_latent_creator.pyi
rename to .typings/mflux/models/z_image/latent_creator/z_image_latent_creator.pyi
diff --git a/.mlx_typings/mflux/models/z_image/weights/z_image_weight_definition.pyi b/.typings/mflux/models/z_image/weights/z_image_weight_definition.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/z_image/weights/z_image_weight_definition.pyi
rename to .typings/mflux/models/z_image/weights/z_image_weight_definition.pyi
diff --git a/.mlx_typings/mflux/models/z_image/weights/z_image_weight_mapping.pyi b/.typings/mflux/models/z_image/weights/z_image_weight_mapping.pyi
similarity index 100%
rename from .mlx_typings/mflux/models/z_image/weights/z_image_weight_mapping.pyi
rename to .typings/mflux/models/z_image/weights/z_image_weight_mapping.pyi
diff --git a/.mlx_typings/mflux/release/__init__.pyi b/.typings/mflux/release/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/release/__init__.pyi
rename to .typings/mflux/release/__init__.pyi
diff --git a/.mlx_typings/mflux/utils/__init__.pyi b/.typings/mflux/utils/__init__.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/__init__.pyi
rename to .typings/mflux/utils/__init__.pyi
diff --git a/.mlx_typings/mflux/utils/box_values.pyi b/.typings/mflux/utils/box_values.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/box_values.pyi
rename to .typings/mflux/utils/box_values.pyi
diff --git a/.mlx_typings/mflux/utils/exceptions.pyi b/.typings/mflux/utils/exceptions.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/exceptions.pyi
rename to .typings/mflux/utils/exceptions.pyi
diff --git a/.mlx_typings/mflux/utils/generated_image.pyi b/.typings/mflux/utils/generated_image.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/generated_image.pyi
rename to .typings/mflux/utils/generated_image.pyi
diff --git a/.mlx_typings/mflux/utils/image_util.pyi b/.typings/mflux/utils/image_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/image_util.pyi
rename to .typings/mflux/utils/image_util.pyi
diff --git a/.mlx_typings/mflux/utils/metadata_builder.pyi b/.typings/mflux/utils/metadata_builder.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/metadata_builder.pyi
rename to .typings/mflux/utils/metadata_builder.pyi
diff --git a/.mlx_typings/mflux/utils/version_util.pyi b/.typings/mflux/utils/version_util.pyi
similarity index 100%
rename from .mlx_typings/mflux/utils/version_util.pyi
rename to .typings/mflux/utils/version_util.pyi
diff --git a/.mlx_typings/mlx/core/__init__.pyi b/.typings/mlx/core/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/core/__init__.pyi
rename to .typings/mlx/core/__init__.pyi
diff --git a/.mlx_typings/mlx/core/cuda/__init__.pyi b/.typings/mlx/core/cuda/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/core/cuda/__init__.pyi
rename to .typings/mlx/core/cuda/__init__.pyi
diff --git a/.mlx_typings/mlx/core/distributed/__init__.pyi b/.typings/mlx/core/distributed/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/core/distributed/__init__.pyi
rename to .typings/mlx/core/distributed/__init__.pyi
diff --git a/.mlx_typings/mlx/core/metal/__init__.pyi b/.typings/mlx/core/metal/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/core/metal/__init__.pyi
rename to .typings/mlx/core/metal/__init__.pyi
diff --git a/.mlx_typings/mlx/core/random/__init__.pyi b/.typings/mlx/core/random/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/core/random/__init__.pyi
rename to .typings/mlx/core/random/__init__.pyi
diff --git a/.mlx_typings/mlx/nn/__init__.pyi b/.typings/mlx/nn/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/__init__.pyi
rename to .typings/mlx/nn/__init__.pyi
diff --git a/.mlx_typings/mlx/nn/init.pyi b/.typings/mlx/nn/init.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/init.pyi
rename to .typings/mlx/nn/init.pyi
diff --git a/.mlx_typings/mlx/nn/layers/__init__.pyi b/.typings/mlx/nn/layers/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/__init__.pyi
rename to .typings/mlx/nn/layers/__init__.pyi
diff --git a/.mlx_typings/mlx/nn/layers/activations.pyi b/.typings/mlx/nn/layers/activations.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/activations.pyi
rename to .typings/mlx/nn/layers/activations.pyi
diff --git a/.mlx_typings/mlx/nn/layers/base.pyi b/.typings/mlx/nn/layers/base.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/base.pyi
rename to .typings/mlx/nn/layers/base.pyi
diff --git a/.mlx_typings/mlx/nn/layers/containers.pyi b/.typings/mlx/nn/layers/containers.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/containers.pyi
rename to .typings/mlx/nn/layers/containers.pyi
diff --git a/.mlx_typings/mlx/nn/layers/convolution.pyi b/.typings/mlx/nn/layers/convolution.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/convolution.pyi
rename to .typings/mlx/nn/layers/convolution.pyi
diff --git a/.mlx_typings/mlx/nn/layers/convolution_transpose.pyi b/.typings/mlx/nn/layers/convolution_transpose.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/convolution_transpose.pyi
rename to .typings/mlx/nn/layers/convolution_transpose.pyi
diff --git a/.mlx_typings/mlx/nn/layers/distributed.pyi b/.typings/mlx/nn/layers/distributed.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/distributed.pyi
rename to .typings/mlx/nn/layers/distributed.pyi
diff --git a/.mlx_typings/mlx/nn/layers/dropout.pyi b/.typings/mlx/nn/layers/dropout.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/dropout.pyi
rename to .typings/mlx/nn/layers/dropout.pyi
diff --git a/.mlx_typings/mlx/nn/layers/embedding.pyi b/.typings/mlx/nn/layers/embedding.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/embedding.pyi
rename to .typings/mlx/nn/layers/embedding.pyi
diff --git a/.mlx_typings/mlx/nn/layers/linear.pyi b/.typings/mlx/nn/layers/linear.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/linear.pyi
rename to .typings/mlx/nn/layers/linear.pyi
diff --git a/.mlx_typings/mlx/nn/layers/normalization.pyi b/.typings/mlx/nn/layers/normalization.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/normalization.pyi
rename to .typings/mlx/nn/layers/normalization.pyi
diff --git a/.mlx_typings/mlx/nn/layers/pooling.pyi b/.typings/mlx/nn/layers/pooling.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/pooling.pyi
rename to .typings/mlx/nn/layers/pooling.pyi
diff --git a/.mlx_typings/mlx/nn/layers/positional_encoding.pyi b/.typings/mlx/nn/layers/positional_encoding.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/positional_encoding.pyi
rename to .typings/mlx/nn/layers/positional_encoding.pyi
diff --git a/.mlx_typings/mlx/nn/layers/quantized.pyi b/.typings/mlx/nn/layers/quantized.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/quantized.pyi
rename to .typings/mlx/nn/layers/quantized.pyi
diff --git a/.mlx_typings/mlx/nn/layers/recurrent.pyi b/.typings/mlx/nn/layers/recurrent.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/recurrent.pyi
rename to .typings/mlx/nn/layers/recurrent.pyi
diff --git a/.mlx_typings/mlx/nn/layers/transformer.pyi b/.typings/mlx/nn/layers/transformer.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/transformer.pyi
rename to .typings/mlx/nn/layers/transformer.pyi
diff --git a/.mlx_typings/mlx/nn/layers/upsample.pyi b/.typings/mlx/nn/layers/upsample.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/layers/upsample.pyi
rename to .typings/mlx/nn/layers/upsample.pyi
diff --git a/.mlx_typings/mlx/nn/losses.pyi b/.typings/mlx/nn/losses.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/losses.pyi
rename to .typings/mlx/nn/losses.pyi
diff --git a/.mlx_typings/mlx/nn/utils.pyi b/.typings/mlx/nn/utils.pyi
similarity index 100%
rename from .mlx_typings/mlx/nn/utils.pyi
rename to .typings/mlx/nn/utils.pyi
diff --git a/.mlx_typings/mlx/utils.pyi b/.typings/mlx/utils.pyi
similarity index 100%
rename from .mlx_typings/mlx/utils.pyi
rename to .typings/mlx/utils.pyi
diff --git a/.mlx_typings/mlx_lm/__init__.pyi b/.typings/mlx_lm/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/__init__.pyi
rename to .typings/mlx_lm/__init__.pyi
diff --git a/.mlx_typings/mlx_lm/_version.pyi b/.typings/mlx_lm/_version.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/_version.pyi
rename to .typings/mlx_lm/_version.pyi
diff --git a/.mlx_typings/mlx_lm/convert.pyi b/.typings/mlx_lm/convert.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/convert.pyi
rename to .typings/mlx_lm/convert.pyi
diff --git a/.mlx_typings/mlx_lm/generate.pyi b/.typings/mlx_lm/generate.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/generate.pyi
rename to .typings/mlx_lm/generate.pyi
diff --git a/.mlx_typings/mlx_lm/models/__init__.pyi b/.typings/mlx_lm/models/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/__init__.pyi
rename to .typings/mlx_lm/models/__init__.pyi
diff --git a/.mlx_typings/mlx_lm/models/activations.pyi b/.typings/mlx_lm/models/activations.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/activations.pyi
rename to .typings/mlx_lm/models/activations.pyi
diff --git a/.mlx_typings/mlx_lm/models/base.pyi b/.typings/mlx_lm/models/base.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/base.pyi
rename to .typings/mlx_lm/models/base.pyi
diff --git a/.mlx_typings/mlx_lm/models/bitlinear_layers.pyi b/.typings/mlx_lm/models/bitlinear_layers.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/bitlinear_layers.pyi
rename to .typings/mlx_lm/models/bitlinear_layers.pyi
diff --git a/.mlx_typings/mlx_lm/models/cache.pyi b/.typings/mlx_lm/models/cache.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/cache.pyi
rename to .typings/mlx_lm/models/cache.pyi
diff --git a/.mlx_typings/mlx_lm/models/deepseek_v3.pyi b/.typings/mlx_lm/models/deepseek_v3.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/deepseek_v3.pyi
rename to .typings/mlx_lm/models/deepseek_v3.pyi
diff --git a/.mlx_typings/mlx_lm/models/deepseek_v4.pyi b/.typings/mlx_lm/models/deepseek_v4.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/deepseek_v4.pyi
rename to .typings/mlx_lm/models/deepseek_v4.pyi
diff --git a/.mlx_typings/mlx_lm/models/gated_delta.pyi b/.typings/mlx_lm/models/gated_delta.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/gated_delta.pyi
rename to .typings/mlx_lm/models/gated_delta.pyi
diff --git a/.mlx_typings/mlx_lm/models/gemma4.pyi b/.typings/mlx_lm/models/gemma4.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/gemma4.pyi
rename to .typings/mlx_lm/models/gemma4.pyi
diff --git a/.mlx_typings/mlx_lm/models/gemma4_text.pyi b/.typings/mlx_lm/models/gemma4_text.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/gemma4_text.pyi
rename to .typings/mlx_lm/models/gemma4_text.pyi
diff --git a/.mlx_typings/mlx_lm/models/glm4_moe.pyi b/.typings/mlx_lm/models/glm4_moe.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/glm4_moe.pyi
rename to .typings/mlx_lm/models/glm4_moe.pyi
diff --git a/.mlx_typings/mlx_lm/models/glm_moe_dsa.pyi b/.typings/mlx_lm/models/glm_moe_dsa.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/glm_moe_dsa.pyi
rename to .typings/mlx_lm/models/glm_moe_dsa.pyi
diff --git a/.mlx_typings/mlx_lm/models/gpt_oss.pyi b/.typings/mlx_lm/models/gpt_oss.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/gpt_oss.pyi
rename to .typings/mlx_lm/models/gpt_oss.pyi
diff --git a/.mlx_typings/mlx_lm/models/minimax.pyi b/.typings/mlx_lm/models/minimax.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/minimax.pyi
rename to .typings/mlx_lm/models/minimax.pyi
diff --git a/.mlx_typings/mlx_lm/models/nemotron_h.pyi b/.typings/mlx_lm/models/nemotron_h.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/nemotron_h.pyi
rename to .typings/mlx_lm/models/nemotron_h.pyi
diff --git a/.mlx_typings/mlx_lm/models/qwen3_5.pyi b/.typings/mlx_lm/models/qwen3_5.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/qwen3_5.pyi
rename to .typings/mlx_lm/models/qwen3_5.pyi
diff --git a/.mlx_typings/mlx_lm/models/qwen3_5_moe.pyi b/.typings/mlx_lm/models/qwen3_5_moe.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/qwen3_5_moe.pyi
rename to .typings/mlx_lm/models/qwen3_5_moe.pyi
diff --git a/.mlx_typings/mlx_lm/models/qwen3_next.pyi b/.typings/mlx_lm/models/qwen3_next.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/qwen3_next.pyi
rename to .typings/mlx_lm/models/qwen3_next.pyi
diff --git a/.mlx_typings/mlx_lm/models/rope_utils.pyi b/.typings/mlx_lm/models/rope_utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/rope_utils.pyi
rename to .typings/mlx_lm/models/rope_utils.pyi
diff --git a/.mlx_typings/mlx_lm/models/step3p5.pyi b/.typings/mlx_lm/models/step3p5.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/step3p5.pyi
rename to .typings/mlx_lm/models/step3p5.pyi
diff --git a/.mlx_typings/mlx_lm/models/switch_layers.pyi b/.typings/mlx_lm/models/switch_layers.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/models/switch_layers.pyi
rename to .typings/mlx_lm/models/switch_layers.pyi
diff --git a/.mlx_typings/mlx_lm/sample_utils.pyi b/.typings/mlx_lm/sample_utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/sample_utils.pyi
rename to .typings/mlx_lm/sample_utils.pyi
diff --git a/.mlx_typings/mlx_lm/tokenizer_utils.pyi b/.typings/mlx_lm/tokenizer_utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/tokenizer_utils.pyi
rename to .typings/mlx_lm/tokenizer_utils.pyi
diff --git a/.mlx_typings/mlx_lm/tuner/dora.pyi b/.typings/mlx_lm/tuner/dora.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/tuner/dora.pyi
rename to .typings/mlx_lm/tuner/dora.pyi
diff --git a/.mlx_typings/mlx_lm/tuner/lora.pyi b/.typings/mlx_lm/tuner/lora.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/tuner/lora.pyi
rename to .typings/mlx_lm/tuner/lora.pyi
diff --git a/.mlx_typings/mlx_lm/tuner/utils.pyi b/.typings/mlx_lm/tuner/utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/tuner/utils.pyi
rename to .typings/mlx_lm/tuner/utils.pyi
diff --git a/.mlx_typings/mlx_lm/utils.pyi b/.typings/mlx_lm/utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_lm/utils.pyi
rename to .typings/mlx_lm/utils.pyi
diff --git a/.mlx_typings/mlx_vlm/__init__.pyi b/.typings/mlx_vlm/__init__.pyi
similarity index 100%
rename from .mlx_typings/mlx_vlm/__init__.pyi
rename to .typings/mlx_vlm/__init__.pyi
diff --git a/.mlx_typings/mlx_vlm/prompt_utils.pyi b/.typings/mlx_vlm/prompt_utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_vlm/prompt_utils.pyi
rename to .typings/mlx_vlm/prompt_utils.pyi
diff --git a/.mlx_typings/mlx_vlm/utils.pyi b/.typings/mlx_vlm/utils.pyi
similarity index 100%
rename from .mlx_typings/mlx_vlm/utils.pyi
rename to .typings/mlx_vlm/utils.pyi
diff --git a/.typings/pynvml/__init__.pyi b/.typings/pynvml/__init__.pyi
new file mode 100644
index 00000000..c0ded6f1
--- /dev/null
+++ b/.typings/pynvml/__init__.pyi
@@ -0,0 +1,3226 @@
+"""
+This type stub file was generated by pyright.
+"""
+
+import sys
+import os
+import threading
+import string
+from ctypes import *
+from ctypes import _Pointer
+from ctypes.util import find_library
+from functools import wraps
+
+_nvmlEnableState_t = c_uint
+NVML_FEATURE_DISABLED = ...
+NVML_FEATURE_ENABLED = ...
+_nvmlBrandType_t = c_uint
+NVML_BRAND_UNKNOWN = ...
+NVML_BRAND_QUADRO = ...
+NVML_BRAND_TESLA = ...
+NVML_BRAND_NVS = ...
+NVML_BRAND_GRID = ...
+NVML_BRAND_GEFORCE = ...
+NVML_BRAND_TITAN = ...
+NVML_BRAND_NVIDIA_VAPPS = ...
+NVML_BRAND_NVIDIA_VPC = ...
+NVML_BRAND_NVIDIA_VCS = ...
+NVML_BRAND_NVIDIA_VWS = ...
+NVML_BRAND_NVIDIA_CLOUD_GAMING = ...
+NVML_BRAND_NVIDIA_VGAMING = ...
+NVML_BRAND_QUADRO_RTX = ...
+NVML_BRAND_NVIDIA_RTX = ...
+NVML_BRAND_NVIDIA = ...
+NVML_BRAND_GEFORCE_RTX = ...
+NVML_BRAND_TITAN_RTX = ...
+NVML_BRAND_COUNT = ...
+_nvmlTemperatureThresholds_t = c_uint
+NVML_TEMPERATURE_THRESHOLD_SHUTDOWN = ...
+NVML_TEMPERATURE_THRESHOLD_SLOWDOWN = ...
+NVML_TEMPERATURE_THRESHOLD_MEM_MAX = ...
+NVML_TEMPERATURE_THRESHOLD_GPU_MAX = ...
+NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN = ...
+NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR = ...
+NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX = ...
+NVML_TEMPERATURE_THRESHOLD_GPS_CURR = ...
+NVML_TEMPERATURE_THRESHOLD_COUNT = ...
+_nvmlTemperatureSensors_t = c_uint
+NVML_TEMPERATURE_GPU: int = ...
+NVML_TEMPERATURE_COUNT = ...
+_nvmlComputeMode_t = c_uint
+NVML_COMPUTEMODE_DEFAULT = ...
+NVML_COMPUTEMODE_EXCLUSIVE_THREAD = ...
+NVML_COMPUTEMODE_PROHIBITED = ...
+NVML_COMPUTEMODE_EXCLUSIVE_PROCESS = ...
+NVML_COMPUTEMODE_COUNT = ...
+_nvmlMemoryLocation_t = c_uint
+NVML_MEMORY_LOCATION_L1_CACHE = ...
+NVML_MEMORY_LOCATION_L2_CACHE = ...
+NVML_MEMORY_LOCATION_DEVICE_MEMORY = ...
+NVML_MEMORY_LOCATION_DRAM = ...
+NVML_MEMORY_LOCATION_REGISTER_FILE = ...
+NVML_MEMORY_LOCATION_TEXTURE_MEMORY = ...
+NVML_MEMORY_LOCATION_TEXTURE_SHM = ...
+NVML_MEMORY_LOCATION_CBU = ...
+NVML_MEMORY_LOCATION_SRAM = ...
+NVML_MEMORY_LOCATION_COUNT = ...
+NVML_NVLINK_MAX_LINKS = ...
+NVML_NVLINK_MAX_LANES = ...
+_nvmlNvLinkErrorCounter_t = c_uint
+NVML_NVLINK_ERROR_DL_REPLAY = ...
+NVML_NVLINK_ERROR_DL_RECOVERY = ...
+NVML_NVLINK_ERROR_DL_CRC_FLIT = ...
+NVML_NVLINK_ERROR_DL_CRC_DATA = ...
+NVML_NVLINK_ERROR_DL_ECC_DATA = ...
+NVML_NVLINK_ERROR_COUNT = ...
+_nvmlNvLinkEccLaneErrorCounter_t = c_uint
+NVML_NVLINK_ERROR_DL_ECC_LANE0 = ...
+NVML_NVLINK_ERROR_DL_ECC_LANE1 = ...
+NVML_NVLINK_ERROR_DL_ECC_LANE2 = ...
+NVML_NVLINK_ERROR_DL_ECC_LANE3 = ...
+NVML_NVLINK_ERROR_DL_ECC_COUNT = ...
+_nvmlNvLinkCapability_t = c_uint
+NVML_NVLINK_CAP_P2P_SUPPORTED = ...
+NVML_NVLINK_CAP_SYSMEM_ACCESS = ...
+NVML_NVLINK_CAP_P2P_ATOMICS = ...
+NVML_NVLINK_CAP_SYSMEM_ATOMICS = ...
+NVML_NVLINK_CAP_SLI_BRIDGE = ...
+NVML_NVLINK_CAP_VALID = ...
+NVML_NVLINK_CAP_COUNT = ...
+_nvmlNvLinkUtilizationCountPktTypes_t = c_uint
+NVML_NVLINK_COUNTER_PKTFILTER_NOP = ...
+NVML_NVLINK_COUNTER_PKTFILTER_READ = ...
+NVML_NVLINK_COUNTER_PKTFILTER_WRITE = ...
+NVML_NVLINK_COUNTER_PKTFILTER_RATOM = ...
+NVML_NVLINK_COUNTER_PKTFILTER_NRATOM = ...
+NVML_NVLINK_COUNTER_PKTFILTER_FLUSH = ...
+NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA = ...
+NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA = ...
+NVML_NVLINK_COUNTER_PKTFILTER_ALL = ...
+_nvmlNvLinkUtilizationCountUnits_t = c_uint
+NVML_NVLINK_COUNTER_UNIT_CYCLES = ...
+NVML_NVLINK_COUNTER_UNIT_PACKETS = ...
+NVML_NVLINK_COUNTER_UNIT_BYTES = ...
+NVML_NVLINK_COUNTER_UNIT_RESERVED = ...
+NVML_NVLINK_COUNTER_UNIT_COUNT = ...
+_nvmlNvLinkDeviceType_t = c_uint
+NVML_NVLINK_DEVICE_TYPE_GPU = ...
+NVML_NVLINK_DEVICE_TYPE_IBMNPU = ...
+NVML_NVLINK_DEVICE_TYPE_SWITCH = ...
+NVML_NVLINK_DEVICE_TYPE_UNKNOWN = ...
+_nvmlEccBitType_t = c_uint
+NVML_SINGLE_BIT_ECC = ...
+NVML_DOUBLE_BIT_ECC = ...
+NVML_ECC_ERROR_TYPE_COUNT = ...
+_nvmlEccCounterType_t = c_uint
+NVML_VOLATILE_ECC = ...
+NVML_AGGREGATE_ECC = ...
+NVML_ECC_COUNTER_TYPE_COUNT = ...
+_nvmlMemoryErrorType_t = c_uint
+NVML_MEMORY_ERROR_TYPE_CORRECTED = ...
+NVML_MEMORY_ERROR_TYPE_UNCORRECTED = ...
+NVML_MEMORY_ERROR_TYPE_COUNT = ...
+_nvmlClockType_t = c_uint
+NVML_CLOCK_GRAPHICS = ...
+NVML_CLOCK_SM = ...
+NVML_CLOCK_MEM = ...
+NVML_CLOCK_VIDEO = ...
+NVML_CLOCK_COUNT = ...
+_nvmlClockId_t = c_uint
+NVML_CLOCK_ID_CURRENT = ...
+NVML_CLOCK_ID_APP_CLOCK_TARGET = ...
+NVML_CLOCK_ID_APP_CLOCK_DEFAULT = ...
+NVML_CLOCK_ID_CUSTOMER_BOOST_MAX = ...
+NVML_CLOCK_ID_COUNT = ...
+_nvmlDriverModel_t = c_uint
+NVML_DRIVER_WDDM = ...
+NVML_DRIVER_WDM = ...
+NVML_DRIVER_MCDM = ...
+NVML_MAX_GPU_PERF_PSTATES = ...
+_nvmlPstates_t = c_uint
+NVML_PSTATE_0 = ...
+NVML_PSTATE_1 = ...
+NVML_PSTATE_2 = ...
+NVML_PSTATE_3 = ...
+NVML_PSTATE_4 = ...
+NVML_PSTATE_5 = ...
+NVML_PSTATE_6 = ...
+NVML_PSTATE_7 = ...
+NVML_PSTATE_8 = ...
+NVML_PSTATE_9 = ...
+NVML_PSTATE_10 = ...
+NVML_PSTATE_11 = ...
+NVML_PSTATE_12 = ...
+NVML_PSTATE_13 = ...
+NVML_PSTATE_14 = ...
+NVML_PSTATE_15 = ...
+NVML_PSTATE_UNKNOWN = ...
+_nvmlInforomObject_t = c_uint
+NVML_INFOROM_OEM = ...
+NVML_INFOROM_ECC = ...
+NVML_INFOROM_POWER = ...
+NVML_INFOROM_DEN = ...
+NVML_INFOROM_COUNT = ...
+_nvmlReturn_t = c_uint
+NVML_SUCCESS = ...
+NVML_ERROR_UNINITIALIZED = ...
+NVML_ERROR_INVALID_ARGUMENT = ...
+NVML_ERROR_NOT_SUPPORTED = ...
+NVML_ERROR_NO_PERMISSION = ...
+NVML_ERROR_ALREADY_INITIALIZED = ...
+NVML_ERROR_NOT_FOUND = ...
+NVML_ERROR_INSUFFICIENT_SIZE = ...
+NVML_ERROR_INSUFFICIENT_POWER = ...
+NVML_ERROR_DRIVER_NOT_LOADED = ...
+NVML_ERROR_TIMEOUT = ...
+NVML_ERROR_IRQ_ISSUE = ...
+NVML_ERROR_LIBRARY_NOT_FOUND = ...
+NVML_ERROR_FUNCTION_NOT_FOUND = ...
+NVML_ERROR_CORRUPTED_INFOROM = ...
+NVML_ERROR_GPU_IS_LOST = ...
+NVML_ERROR_RESET_REQUIRED = ...
+NVML_ERROR_OPERATING_SYSTEM = ...
+NVML_ERROR_LIB_RM_VERSION_MISMATCH = ...
+NVML_ERROR_IN_USE = ...
+NVML_ERROR_MEMORY = ...
+NVML_ERROR_NO_DATA = ...
+NVML_ERROR_VGPU_ECC_NOT_SUPPORTED = ...
+NVML_ERROR_INSUFFICIENT_RESOURCES = ...
+NVML_ERROR_FREQ_NOT_SUPPORTED = ...
+NVML_ERROR_ARGUMENT_VERSION_MISMATCH = ...
+NVML_ERROR_DEPRECATED = ...
+NVML_ERROR_NOT_READY = ...
+NVML_ERROR_GPU_NOT_FOUND = ...
+NVML_ERROR_INVALID_STATE = ...
+NVML_ERROR_RESET_TYPE_NOT_SUPPORTED = ...
+NVML_ERROR_UNKNOWN = ...
+_nvmlFanState_t = c_uint
+NVML_FAN_NORMAL = ...
+NVML_FAN_FAILED = ...
+_nvmlFanControlPolicy_t = c_uint
+NVML_FAN_POLICY_TEMPERATURE_CONTINOUS_SW = ...
+NVML_FAN_POLICY_MANUAL = ...
+_nvmlLedColor_t = c_uint
+NVML_LED_COLOR_GREEN = ...
+NVML_LED_COLOR_AMBER = ...
+_nvmlGpuOperationMode_t = c_uint
+NVML_GOM_ALL_ON = ...
+NVML_GOM_COMPUTE = ...
+NVML_GOM_LOW_DP = ...
+_nvmlPageRetirementCause_t = c_uint
+NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS = ...
+NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR = ...
+NVML_PAGE_RETIREMENT_CAUSE_COUNT = ...
+_nvmlRestrictedAPI_t = c_uint
+NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS = ...
+NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS = ...
+NVML_RESTRICTED_API_COUNT = ...
+_nvmlBridgeChipType_t = c_uint
+NVML_BRIDGE_CHIP_PLX = ...
+NVML_BRIDGE_CHIP_BRO4 = ...
+NVML_MAX_PHYSICAL_BRIDGE = ...
+_nvmlValueType_t = c_uint
+NVML_VALUE_TYPE_DOUBLE = ...
+NVML_VALUE_TYPE_UNSIGNED_INT = ...
+NVML_VALUE_TYPE_UNSIGNED_LONG = ...
+NVML_VALUE_TYPE_UNSIGNED_LONG_LONG = ...
+NVML_VALUE_TYPE_SIGNED_LONG_LONG = ...
+NVML_VALUE_TYPE_SIGNED_INT = ...
+NVML_VALUE_TYPE_UNSIGNED_SHORT = ...
+NVML_VALUE_TYPE_COUNT = ...
+_nvmlNvlinkVersion_t = c_uint
+NVML_NVLINK_VERSION_INVALID = ...
+NVML_NVLINK_VERSION_1_0 = ...
+NVML_NVLINK_VERSION_2_0 = ...
+NVML_NVLINK_VERSION_2_2 = ...
+NVML_NVLINK_VERSION_3_0 = ...
+NVML_NVLINK_VERSION_3_1 = ...
+NVML_NVLINK_VERSION_4_0 = ...
+NVML_NVLINK_VERSION_5_0 = ...
+_nvmlPerfPolicyType_t = c_uint
+NVML_PERF_POLICY_POWER = ...
+NVML_PERF_POLICY_THERMAL = ...
+NVML_PERF_POLICY_SYNC_BOOST = ...
+NVML_PERF_POLICY_BOARD_LIMIT = ...
+NVML_PERF_POLICY_LOW_UTILIZATION = ...
+NVML_PERF_POLICY_RELIABILITY = ...
+NVML_PERF_POLICY_TOTAL_APP_CLOCKS = ...
+NVML_PERF_POLICY_TOTAL_BASE_CLOCKS = ...
+NVML_PERF_POLICY_COUNT = ...
+_nvmlEncoderQueryType_t = c_uint
+NVML_ENCODER_QUERY_H264 = ...
+NVML_ENCODER_QUERY_HEVC = ...
+NVML_ENCODER_QUERY_AV1 = ...
+NVML_ENCODER_QUERY_UNKNOWN = ...
+_nvmlFBCSessionType_t = c_uint
+NVML_FBC_SESSION_TYPE_UNKNOWN = ...
+NVML_FBC_SESSION_TYPE_TOSYS = ...
+NVML_FBC_SESSION_TYPE_CUDA = ...
+NVML_FBC_SESSION_TYPE_VID = ...
+NVML_FBC_SESSION_TYPE_HWENC = ...
+_nvmlDetachGpuState_t = c_uint
+NVML_DETACH_GPU_KEEP = ...
+NVML_DETACH_GPU_REMOVE = ...
+_nvmlPcieLinkState_t = c_uint
+NVML_PCIE_LINK_KEEP = ...
+NVML_PCIE_LINK_SHUT_DOWN = ...
+_nvmlSamplingType_t = c_uint
+NVML_TOTAL_POWER_SAMPLES = ...
+NVML_GPU_UTILIZATION_SAMPLES = ...
+NVML_MEMORY_UTILIZATION_SAMPLES = ...
+NVML_ENC_UTILIZATION_SAMPLES = ...
+NVML_DEC_UTILIZATION_SAMPLES = ...
+NVML_PROCESSOR_CLK_SAMPLES = ...
+NVML_MEMORY_CLK_SAMPLES = ...
+NVML_MODULE_POWER_SAMPLES = ...
+NVML_JPG_UTILIZATION_SAMPLES = ...
+NVML_OFA_UTILIZATION_SAMPLES = ...
+NVML_SAMPLINGTYPE_COUNT = ...
+_nvmlPcieUtilCounter_t = c_uint
+NVML_PCIE_UTIL_TX_BYTES = ...
+NVML_PCIE_UTIL_RX_BYTES = ...
+NVML_PCIE_UTIL_COUNT = ...
+_nvmlGpuTopologyLevel_t = c_uint
+NVML_TOPOLOGY_INTERNAL = ...
+NVML_TOPOLOGY_SINGLE = ...
+NVML_TOPOLOGY_MULTIPLE = ...
+NVML_TOPOLOGY_HOSTBRIDGE = ...
+NVML_TOPOLOGY_NODE = ...
+NVML_TOPOLOGY_CPU = ...
+NVML_TOPOLOGY_SYSTEM = ...
+_nvmlGpuP2PCapsIndex_t = c_uint
+NVML_P2P_CAPS_INDEX_READ = ...
+NVML_P2P_CAPS_INDEX_WRITE = ...
+NVML_P2P_CAPS_INDEX_NVLINK = ...
+NVML_P2P_CAPS_INDEX_ATOMICS = ...
+NVML_P2P_CAPS_INDEX_PROP = ...
+NVML_P2P_CAPS_INDEX_PCI = ...
+NVML_P2P_CAPS_INDEX_UNKNOWN = ...
+_nvmlGpuP2PStatus_t = c_uint
+NVML_P2P_STATUS_OK = ...
+NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED = ...
+NVML_P2P_STATUS_CHIPSET_NOT_SUPPORTED = ...
+NVML_P2P_STATUS_GPU_NOT_SUPPORTED = ...
+NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED = ...
+NVML_P2P_STATUS_DISABLED_BY_REGKEY = ...
+NVML_P2P_STATUS_NOT_SUPPORTED = ...
+NVML_P2P_STATUS_UNKNOWN = ...
+_nvmlDeviceArchitecture_t = c_uint
+NVML_DEVICE_ARCH_KEPLER = ...
+NVML_DEVICE_ARCH_MAXWELL = ...
+NVML_DEVICE_ARCH_PASCAL = ...
+NVML_DEVICE_ARCH_VOLTA = ...
+NVML_DEVICE_ARCH_TURING = ...
+NVML_DEVICE_ARCH_AMPERE = ...
+NVML_DEVICE_ARCH_ADA = ...
+NVML_DEVICE_ARCH_HOPPER = ...
+NVML_DEVICE_ARCH_BLACKWELL = ...
+NVML_DEVICE_ARCH_UNKNOWN = ...
+_nvmlBusType_t = c_uint
+NVML_BUS_TYPE_UNKNOWN = ...
+NVML_BUS_TYPE_PCI = ...
+NVML_BUS_TYPE_PCIE = ...
+NVML_BUS_TYPE_FPCI = ...
+NVML_BUS_TYPE_AGP = ...
+_nvmlPowerSource_t = c_uint
+NVML_POWER_SOURCE_AC = ...
+NVML_POWER_SOURCE_BATTERY = ...
+NVML_POWER_SOURCE_UNDERSIZED = ...
+_nvmlAdaptiveClockInfoStatus_t = c_uint
+NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED = ...
+NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED = ...
+_nvmlClockLimitId_t = c_uint
+NVML_CLOCK_LIMIT_ID_RANGE_START = ...
+NVML_CLOCK_LIMIT_ID_TDP = ...
+NVML_CLOCK_LIMIT_ID_UNLIMITED = ...
+_nvmlPcieLinkMaxSpeed_t = c_uint
+NVML_PCIE_LINK_MAX_SPEED_INVALID = ...
+NVML_PCIE_LINK_MAX_SPEED_2500MBPS = ...
+NVML_PCIE_LINK_MAX_SPEED_5000MBPS = ...
+NVML_PCIE_LINK_MAX_SPEED_8000MBPS = ...
+NVML_PCIE_LINK_MAX_SPEED_16000MBPS = ...
+NVML_PCIE_LINK_MAX_SPEED_32000MBPS = ...
+NVML_PCIE_LINK_MAX_SPEED_64000MBPS = ...
+_nvmlPcieAtomicsCapability_t = c_uint
+NVML_PCIE_ATOMICS_CAP_FETCHADD32 = ...
+NVML_PCIE_ATOMICS_CAP_FETCHADD64 = ...
+NVML_PCIE_ATOMICS_CAP_SWAP32 = ...
+NVML_PCIE_ATOMICS_CAP_SWAP64 = ...
+NVML_PCIE_ATOMICS_CAP_CAS32 = ...
+NVML_PCIE_ATOMICS_CAP_CAS64 = ...
+NVML_PCIE_ATOMICS_CAP_CAS128 = ...
+NVML_PCIE_ATOMICS_OPS_MAX = ...
+_nvmlAffinityScope_t = c_uint
+NVML_AFFINITY_SCOPE_NODE = ...
+NVML_AFFINITY_SCOPE_SOCKET = ...
+_nvmlDeviceGpuRecoveryAction_t = c_uint
+NVML_GPU_RECOVERY_ACTION_NONE = ...
+NVML_GPU_RECOVERY_ACTION_GPU_RESET = ...
+NVML_GPU_RECOVERY_ACTION_NODE_REBOOT = ...
+NVML_GPU_RECOVERY_ACTION_DRAIN_P2P = ...
+NVML_GPU_RECOVERY_ACTION_DRAIN_AND_RESET = ...
+nvmlFlagDefault = ...
+nvmlFlagForce = ...
+NVML_INIT_FLAG_NO_GPUS = ...
+NVML_INIT_FLAG_NO_ATTACH = ...
+NVML_INIT_FLAG_FORCE_INIT = ...
+NVML_MAX_GPC_COUNT = ...
+NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE = ...
+NVML_DEVICE_UUID_BUFFER_SIZE = ...
+NVML_DEVICE_UUID_V2_BUFFER_SIZE = ...
+NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE = ...
+NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE = ...
+NVML_DEVICE_NAME_BUFFER_SIZE = ...
+NVML_DEVICE_NAME_V2_BUFFER_SIZE = ...
+NVML_DEVICE_SERIAL_BUFFER_SIZE = ...
+NVML_DEVICE_PART_NUMBER_BUFFER_SIZE = ...
+NVML_DEVICE_GPU_PART_NUMBER_BUFFER_SIZE = ...
+NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE = ...
+NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE = ...
+NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE = ...
+NVML_GRID_LICENSE_BUFFER_SIZE = ...
+NVML_VGPU_NAME_BUFFER_SIZE = ...
+NVML_GRID_LICENSE_FEATURE_MAX_COUNT = ...
+NVML_VGPU_METADATA_OPAQUE_DATA_SIZE = ...
+NVML_VGPU_PGPU_METADATA_OPAQUE_DATA_SIZE = ...
+NVML_DEVICE_GPU_FRU_PART_NUMBER_BUFFER_SIZE = ...
+NVML_PERF_MODES_BUFFER_SIZE = ...
+NVML_DEVICE_PCI_BUS_ID_LEGACY_FMT = ...
+NVML_DEVICE_PCI_BUS_ID_FMT = ...
+NVML_VALUE_NOT_AVAILABLE_ulonglong = ...
+NVML_VALUE_NOT_AVAILABLE_uint = ...
+NVML_FI_DEV_ECC_CURRENT = ...
+NVML_FI_DEV_ECC_PENDING = ...
+NVML_FI_DEV_ECC_SBE_VOL_TOTAL = ...
+NVML_FI_DEV_ECC_DBE_VOL_TOTAL = ...
+NVML_FI_DEV_ECC_SBE_AGG_TOTAL = ...
+NVML_FI_DEV_ECC_DBE_AGG_TOTAL = ...
+NVML_FI_DEV_ECC_SBE_VOL_L1 = ...
+NVML_FI_DEV_ECC_DBE_VOL_L1 = ...
+NVML_FI_DEV_ECC_SBE_VOL_L2 = ...
+NVML_FI_DEV_ECC_DBE_VOL_L2 = ...
+NVML_FI_DEV_ECC_SBE_VOL_DEV = ...
+NVML_FI_DEV_ECC_DBE_VOL_DEV = ...
+NVML_FI_DEV_ECC_SBE_VOL_REG = ...
+NVML_FI_DEV_ECC_DBE_VOL_REG = ...
+NVML_FI_DEV_ECC_SBE_VOL_TEX = ...
+NVML_FI_DEV_ECC_DBE_VOL_TEX = ...
+NVML_FI_DEV_ECC_DBE_VOL_CBU = ...
+NVML_FI_DEV_ECC_SBE_AGG_L1 = ...
+NVML_FI_DEV_ECC_DBE_AGG_L1 = ...
+NVML_FI_DEV_ECC_SBE_AGG_L2 = ...
+NVML_FI_DEV_ECC_DBE_AGG_L2 = ...
+NVML_FI_DEV_ECC_SBE_AGG_DEV = ...
+NVML_FI_DEV_ECC_DBE_AGG_DEV = ...
+NVML_FI_DEV_ECC_SBE_AGG_REG = ...
+NVML_FI_DEV_ECC_DBE_AGG_REG = ...
+NVML_FI_DEV_ECC_SBE_AGG_TEX = ...
+NVML_FI_DEV_ECC_DBE_AGG_TEX = ...
+NVML_FI_DEV_ECC_DBE_AGG_CBU = ...
+NVML_FI_DEV_RETIRED_SBE = ...
+NVML_FI_DEV_RETIRED_DBE = ...
+NVML_FI_DEV_RETIRED_PENDING = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L0 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L1 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L2 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L3 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L4 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L5 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_TOTAL = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L0 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L1 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L2 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L3 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L4 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L5 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_TOTAL = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L0 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L1 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L2 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L3 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L4 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L5 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_TOTAL = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L0 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L1 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L2 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L3 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L4 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L5 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_TOTAL = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L0 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L1 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L2 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L3 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L4 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L5 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_TOTAL = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L0 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L1 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L2 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L3 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L4 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L5 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_TOTAL = ...
+NVML_FI_DEV_PERF_POLICY_POWER = ...
+NVML_FI_DEV_PERF_POLICY_THERMAL = ...
+NVML_FI_DEV_PERF_POLICY_SYNC_BOOST = ...
+NVML_FI_DEV_PERF_POLICY_BOARD_LIMIT = ...
+NVML_FI_DEV_PERF_POLICY_LOW_UTILIZATION = ...
+NVML_FI_DEV_PERF_POLICY_RELIABILITY = ...
+NVML_FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS = ...
+NVML_FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS = ...
+NVML_FI_DEV_MEMORY_TEMP = ...
+NVML_FI_DEV_TOTAL_ENERGY_CONSUMPTION = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L0 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L1 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L2 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L3 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L4 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L5 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_COMMON = ...
+NVML_FI_DEV_NVLINK_LINK_COUNT = ...
+NVML_FI_DEV_RETIRED_PENDING_SBE = ...
+NVML_FI_DEV_RETIRED_PENDING_DBE = ...
+NVML_FI_DEV_PCIE_REPLAY_COUNTER = ...
+NVML_FI_DEV_PCIE_REPLAY_ROLLOVER_COUNTER = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L6 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L7 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L8 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L9 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L10 = ...
+NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L11 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L6 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L7 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L8 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L9 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L10 = ...
+NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L11 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L6 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L7 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L8 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L9 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L10 = ...
+NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L11 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L6 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L7 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L8 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L9 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L10 = ...
+NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L11 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L6 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L7 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L8 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L9 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L10 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L11 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L6 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L7 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L8 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L9 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L10 = ...
+NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L11 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L6 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L7 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L8 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L9 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L10 = ...
+NVML_FI_DEV_NVLINK_SPEED_MBPS_L11 = ...
+NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX = ...
+NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX = ...
+NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX = ...
+NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX = ...
+NVML_FI_DEV_REMAPPED_COR = ...
+NVML_FI_DEV_REMAPPED_UNC = ...
+NVML_FI_DEV_REMAPPED_PENDING = ...
+NVML_FI_DEV_REMAPPED_FAILURE = ...
+NVML_FI_DEV_NVLINK_REMOTE_NVLINK_ID = ...
+NVML_FI_DEV_NVSWITCH_CONNECTED_LINK_COUNT = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L0 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L1 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L2 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L3 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L4 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L5 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L6 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L7 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L8 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L9 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L10 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L11 = ...
+NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_TOTAL = ...
+NVML_FI_DEV_NVLINK_ERROR_DL_REPLAY = ...
+NVML_FI_DEV_NVLINK_ERROR_DL_RECOVERY = ...
+NVML_FI_DEV_NVLINK_ERROR_DL_CRC = ...
+NVML_FI_DEV_NVLINK_GET_SPEED = ...
+NVML_FI_DEV_NVLINK_GET_STATE = ...
+NVML_FI_DEV_NVLINK_GET_VERSION = ...
+NVML_FI_DEV_NVLINK_GET_POWER_STATE = ...
+NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD = ...
+NVML_FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER = ...
+NVML_FI_DEV_C2C_LINK_COUNT = ...
+NVML_FI_DEV_C2C_LINK_GET_STATUS = ...
+NVML_FI_DEV_C2C_LINK_GET_MAX_BW = ...
+NVML_FI_DEV_PCIE_COUNT_CORRECTABLE_ERRORS = ...
+NVML_FI_DEV_PCIE_COUNT_NAKS_RECEIVED = ...
+NVML_FI_DEV_PCIE_COUNT_RECEIVER_ERROR = ...
+NVML_FI_DEV_PCIE_COUNT_BAD_TLP = ...
+NVML_FI_DEV_PCIE_COUNT_NAKS_SENT = ...
+NVML_FI_DEV_PCIE_COUNT_BAD_DLLP = ...
+NVML_FI_DEV_PCIE_COUNT_NON_FATAL_ERROR = ...
+NVML_FI_DEV_PCIE_COUNT_FATAL_ERROR = ...
+NVML_FI_DEV_PCIE_COUNT_UNSUPPORTED_REQ = ...
+NVML_FI_DEV_PCIE_COUNT_LCRC_ERROR = ...
+NVML_FI_DEV_PCIE_COUNT_LANE_ERROR = ...
+NVML_FI_DEV_IS_RESETLESS_MIG_SUPPORTED = ...
+NVML_FI_DEV_POWER_AVERAGE = ...
+NVML_FI_DEV_POWER_INSTANT = ...
+NVML_FI_DEV_POWER_MIN_LIMIT = ...
+NVML_FI_DEV_POWER_MAX_LIMIT = ...
+NVML_FI_DEV_POWER_DEFAULT_LIMIT = ...
+NVML_FI_DEV_POWER_CURRENT_LIMIT = ...
+NVML_FI_DEV_ENERGY = ...
+NVML_FI_DEV_POWER_REQUESTED_LIMIT = ...
+NVML_FI_DEV_TEMPERATURE_SHUTDOWN_TLIMIT = ...
+NVML_FI_DEV_TEMPERATURE_SLOWDOWN_TLIMIT = ...
+NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT = ...
+NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT = ...
+NVML_FI_DEV_PCIE_COUNT_TX_BYTES = ...
+NVML_FI_DEV_PCIE_COUNT_RX_BYTES = ...
+NVML_FI_DEV_IS_MIG_MODE_INDEPENDENT_MIG_QUERY_CAPABLE = ...
+NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_MAX = ...
+NVML_FI_DEV_NVLINK_COUNT_XMIT_PACKETS = ...
+NVML_FI_DEV_NVLINK_COUNT_XMIT_BYTES = ...
+NVML_FI_DEV_NVLINK_COUNT_RCV_PACKETS = ...
+NVML_FI_DEV_NVLINK_COUNT_RCV_BYTES = ...
+NVML_FI_DEV_NVLINK_COUNT_VL15_DROPPED = ...
+NVML_FI_DEV_NVLINK_COUNT_MALFORMED_PACKET_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_BUFFER_OVERRUN_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_RCV_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_RCV_REMOTE_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_RCV_GENERAL_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_LOCAL_LINK_INTEGRITY_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_XMIT_DISCARDS = ...
+NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_SUCCESSFUL_EVENTS = ...
+NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_FAILED_EVENTS = ...
+NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_EVENTS = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE0 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE1 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER = ...
+NVML_FI_DEV_NVLINK_COUNT_EFFECTIVE_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_EFFECTIVE_BER = ...
+NVML_FI_DEV_NVLINK_COUNT_SYMBOL_ERRORS = ...
+NVML_FI_DEV_NVLINK_COUNT_SYMBOL_BER = ...
+NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_MIN = ...
+NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_UNITS = ...
+NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_SUPPORTED = ...
+NVML_FI_DEV_RESET_STATUS = ...
+NVML_FI_DEV_DRAIN_AND_RESET_STATUS = ...
+NVML_FI_DEV_PCIE_OUTBOUND_ATOMICS_MASK = ...
+NVML_FI_DEV_PCIE_INBOUND_ATOMICS_MASK = ...
+NVML_FI_DEV_GET_GPU_RECOVERY_ACTION = ...
+NVML_FI_DEV_C2C_LINK_ERROR_INTR = ...
+NVML_FI_DEV_C2C_LINK_ERROR_REPLAY = ...
+NVML_FI_DEV_C2C_LINK_ERROR_REPLAY_B2B = ...
+NVML_FI_DEV_C2C_LINK_POWER_STATE = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_0 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_1 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_2 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_3 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_4 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_5 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_6 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_7 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_8 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_9 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_10 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_11 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_12 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_13 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_14 = ...
+NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_15 = ...
+NVML_FI_PWR_SMOOTHING_ENABLED = ...
+NVML_FI_PWR_SMOOTHING_PRIV_LVL = ...
+NVML_FI_PWR_SMOOTHING_IMM_RAMP_DOWN_ENABLED = ...
+NVML_FI_PWR_SMOOTHING_APPLIED_TMP_CEIL = ...
+NVML_FI_PWR_SMOOTHING_APPLIED_TMP_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_MAX_PERCENT_TMP_FLOOR_SETTING = ...
+NVML_FI_PWR_SMOOTHING_MIN_PERCENT_TMP_FLOOR_SETTING = ...
+NVML_FI_PWR_SMOOTHING_HW_CIRCUITRY_PERCENT_LIFETIME_REMAINING = ...
+NVML_FI_PWR_SMOOTHING_MAX_NUM_PRESET_PROFILES = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_PERCENT_TMP_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_UP_RATE = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_DOWN_RATE = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_DOWN_HYST_VAL = ...
+NVML_FI_PWR_SMOOTHING_ACTIVE_PRESET_PROFILE = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_PERCENT_TMP_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_UP_RATE = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_DOWN_RATE = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_DOWN_HYST_VAL = ...
+NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_POWER_CAP = ...
+NVML_FI_DEV_CLOCKS_EVENT_REASON_SYNC_BOOST = ...
+NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_THERM_SLOWDOWN = ...
+NVML_FI_DEV_CLOCKS_EVENT_REASON_HW_THERM_SLOWDOWN = ...
+NVML_FI_DEV_CLOCKS_EVENT_REASON_HW_POWER_BRAKE_SLOWDOWN = ...
+NVML_FI_DEV_POWER_SYNC_BALANCING_FREQ = ...
+NVML_FI_DEV_POWER_SYNC_BALANCING_AF = ...
+NVML_FI_DEV_EDPP_MULTIPLIER = ...
+NVML_FI_PWR_SMOOTHING_PRIMARY_POWER_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_SECONDARY_POWER_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_MIN_PRIMARY_FLOOR_ACT_OFFSET = ...
+NVML_FI_PWR_SMOOTHING_MIN_PRIMARY_FLOOR_ACT_POINT = ...
+NVML_FI_PWR_SMOOTHING_WINDOW_MULTIPLIER = ...
+NVML_FI_PWR_SMOOTHING_DELAYED_PWR_SMOOTHING_SUPPORTED = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_SECONDARY_POWER_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_PRIMARY_FLOOR_ACT_WIN_MULT = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_PRIMARY_FLOOR_TAR_WIN_MULT = ...
+NVML_FI_PWR_SMOOTHING_PROFILE_PRIMARY_FLOOR_ACT_OFFSET = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_SECONDARY_POWER_FLOOR = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_PRIMARY_FLOOR_ACT_WIN_MULT = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_PRIMARY_FLOOR_TAR_WIN_MULT = ...
+NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_PRIMARY_FLOOR_ACT_OFFSET = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_ERRORS_LANE0 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_ERRORS_LANE1 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE0_V2 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE1_V2 = ...
+NVML_FI_DEV_NVLINK_COUNT_RAW_BER_V2 = ...
+NVML_FI_DEV_NVLINK_PLR_XMIT_BLOCKS = ...
+NVML_FI_DEV_NVLINK_PLR_XMIT_RETRY_BLOCKS = ...
+NVML_FI_MAX = ...
+NVML_NVLINK_STATE_INACTIVE = ...
+NVML_NVLINK_STATE_ACTIVE = ...
+NVML_NVLINK_STATE_SLEEP = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_UNIT_100US = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_UNIT_50US = ...
+NVML_C2C_POWER_STATE_FULL_POWER = ...
+NVML_C2C_POWER_STATE_LOW_POWER = ...
+NVML_GPU_VIRTUALIZATION_MODE_NONE = ...
+NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH = ...
+NVML_GPU_VIRTUALIZATION_MODE_VGPU = ...
+NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU = ...
+NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA = ...
+nvmlLib = ...
+libLoadLock = ...
+_nvmlLib_refcount = ...
+_nvmlVgpuTypeId_t = c_uint
+_nvmlVgpuInstance_t = c_uint
+_nvmlVgpuVmIdType_t = c_uint
+NVML_VGPU_VM_ID_DOMAIN_ID = ...
+NVML_VGPU_VM_ID_UUID = ...
+_nvmlGridLicenseFeatureCode_t = c_uint
+NVML_GRID_LICENSE_FEATURE_CODE_UNKNOWN = ...
+NVML_GRID_LICENSE_FEATURE_CODE_VGPU = ...
+NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX = ...
+NVML_GRID_LICENSE_FEATURE_CODE_VWORKSTATION = ...
+NVML_GRID_LICENSE_FEATURE_CODE_GAMING = ...
+NVML_GRID_LICENSE_FEATURE_CODE_COMPUTE = ...
+_nvmlGridLicenseExpiryStatus_t = c_uint8
+NVML_GRID_LICENSE_EXPIRY_NOT_AVAILABLE = ...
+NVML_GRID_LICENSE_EXPIRY_INVALID = ...
+NVML_GRID_LICENSE_EXPIRY_VALID = ...
+NVML_GRID_LICENSE_EXPIRY_NOT_APPLICABLE = ...
+NVML_GRID_LICENSE_EXPIRY_PERMANENT = ...
+_nvmlVgpuCapability_t = c_uint
+NVML_VGPU_CAP_NVLINK_P2P = ...
+NVML_VGPU_CAP_GPUDIRECT = ...
+NVML_VGPU_CAP_MULTI_VGPU_EXCLUSIVE = ...
+NVML_VGPU_CAP_EXCLUSIVE_TYPE = ...
+NVML_VGPU_CAP_EXCLUSIVE_SIZE = ...
+NVML_VGPU_CAP_COUNT = ...
+_nvmlVgpuDriverCapability_t = c_uint
+NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU = ...
+NVML_VGPU_DRIVER_CAP_WARM_UPDATE = ...
+NVML_VGPU_DRIVER_CAP_COUNT = ...
+_nvmlDeviceVgpuCapability_t = c_uint
+NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU = ...
+NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES = ...
+NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES = ...
+NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW = ...
+NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW = ...
+NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING = ...
+NVML_DEVICE_VGPU_CAP_MINI_QUARTER_GPU = ...
+NVML_DEVICE_VGPU_CAP_COMPUTE_MEDIA_ENGINE_GPU = ...
+NVML_DEVICE_VGPU_CAP_WARM_UPDATE = ...
+NVML_DEVICE_VGPU_CAP_HOMOGENEOUS_PLACEMENTS = ...
+NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_SUPPORTED = ...
+NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_ENABLED = ...
+NVML_DEVICE_VGPU_CAP_COUNT = ...
+_nvmlVgpuGuestInfoState_t = c_uint
+NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED = ...
+NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED = ...
+_nvmlVgpuVmCompatibility_t = c_uint
+NVML_VGPU_VM_COMPATIBILITY_NONE = ...
+NVML_VGPU_VM_COMPATIBILITY_COLD = ...
+NVML_VGPU_VM_COMPATIBILITY_HIBERNATE = ...
+NVML_VGPU_VM_COMPATIBILITY_SLEEP = ...
+NVML_VGPU_VM_COMPATIBILITY_LIVE = ...
+_nvmlVgpuPgpuCompatibilityLimitCode_t = c_uint
+NVML_VGPU_COMPATIBILITY_LIMIT_NONE = ...
+NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER = ...
+NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER = ...
+NVML_VGPU_COMPATIBILITY_LIMIT_GPU = ...
+NVML_VGPU_COMPATIBILITY_LIMIT_OTHER = ...
+_nvmlHostVgpuMode_t = c_uint
+NVML_HOST_VGPU_MODE_NON_SRIOV = ...
+NVML_HOST_VGPU_MODE_SRIOV = ...
+_nvmlConfComputeGpusReadyState_t = c_uint
+NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE = ...
+NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE = ...
+_nvmlConfComputeGpuCaps_t = c_uint
+NVML_CC_SYSTEM_GPUS_CC_NOT_CAPABLE = ...
+NVML_CC_SYSTEM_GPUS_CC_CAPABLE = ...
+_nvmlConfComputeCpuCaps_t = c_uint
+NVML_CC_SYSTEM_CPU_CAPS_NONE = ...
+NVML_CC_SYSTEM_CPU_CAPS_AMD_SEV = ...
+NVML_CC_SYSTEM_CPU_CAPS_INTEL_TDX = ...
+NVML_CC_SYSTEM_CPU_CAPS_AMD_SEV_SNP = ...
+NVML_CC_SYSTEM_CPU_CAPS_AMD_SNP_VTOM = ...
+_nvmlConfComputeDevToolsMode_t = c_uint
+NVML_CC_SYSTEM_DEVTOOLS_MODE_OFF = ...
+NVML_CC_SYSTEM_DEVTOOLS_MODE_ON = ...
+NVML_CC_SYSTEM_MULTIGPU_NONE = ...
+NVML_CC_SYSTEM_MULTIGPU_PROTECTED_PCIE = ...
+NVML_CC_SYSTEM_MULTIGPU_NVLE = ...
+NVML_CC_SYSTEM_ENVIRONMENT_UNAVAILABLE = ...
+NVML_CC_SYSTEM_ENVIRONMENT_SIM = ...
+NVML_CC_SYSTEM_ENVIRONMENT_PROD = ...
+_nvmlConfComputeCcFeature_t = c_uint
+NVML_CC_SYSTEM_FEATURE_DISABLED = ...
+NVML_CC_SYSTEM_FEATURE_ENABLED = ...
+_nvmlConfComputeCcKeyRotationThreshAttackerAdv_t = c_uint
+NVML_CC_KEY_ROTATION_THRESH_ATTACKER_ADVANTAGE_MIN = ...
+NVML_CC_KEY_ROTATION_THRESH_ATTACKER_ADVANTAGE_MAX = ...
+NVML_GSP_FIRMWARE_VERSION_BUF_SIZE = ...
+
+class NVMLLibraryMismatchError(Exception): ...
+
+class NVMLError(Exception):
+    _valClassMapping = ...
+    _errcode_to_string = ...
+    def __new__(typ, value):  # -> Self:
+        """
+        Maps value to a proper subclass of NVMLError.
+        See _extractNVMLErrorsAsClasses function for more details
+        """
+        ...
+
+    def __str__(self) -> str: ...
+    def __eq__(self, other) -> bool: ...
+
+def nvmlExceptionClass(nvmlErrorCode): ...
+
+_nvmlGetFunctionPointer_cache = ...
+
+class nvmlFriendlyObject:
+    def __init__(self, dictionary) -> None: ...
+    def __str__(self) -> str: ...
+
+def nvmlStructToFriendlyObject(struct):  # -> nvmlFriendlyObject:
+    ...
+def nvmlFriendlyObjectToStruct(obj, model): ...
+
+class struct_c_nvmlUnit_t(Structure): ...
+
+c_nvmlUnit_t = ...
+
+class _PrintableStructure(Structure):
+    """
+    Abstract class that produces nicer __str__ output than ctypes.Structure.
+    e.g. instead of:
+      >>> print str(obj)
+      <class_name object at 0x7fdf82fef9e0>
+    this class will print
+      class_name(field_name: formatted_value, field_name: formatted_value)
+
+    _fmt_ dictionary of <str _field_ name> -> <str format>
+    e.g. class that has _field_ 'hex_value', c_uint could be formatted with
+      _fmt_ = {"hex_value" : "%08X"}
+    to produce nicer output.
+    Default fomratting string for all fields can be set with key "<default>" like:
+      _fmt_ = {"<default>" : "%d MHz"} # e.g all values are numbers in MHz.
+    If not set it's assumed to be just "%s"
+
+    Exact format of returned str from this class is subject to change in the future.
+    """
+
+    _fmt_ = ...
+    def __str__(self) -> str: ...
+    def __getattribute__(self, name):  # -> <subclass of bytes and str> | str | Any:
+        ...
+    def __setattr__(self, name, value) -> None: ...
+
+class c_nvmlUnitInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlC2cModeInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlC2cModeInfo_v1 = ...
+
+class c_nvmlLedState_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlPSUInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlUnitFanInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlUnitFanSpeeds_t(_PrintableStructure):
+    _fields_ = ...
+
+class struct_c_nvmlDevice_t(Structure): ...
+
+c_nvmlDevice_t = ...
+
+class nvmlPciInfoExt_v1_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+nvmlPciInfoExt_v1 = ...
+
+class nvmlPciInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+class nvmlPciInfo_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+class c_nvmlSystemDriverBranchInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+SystemDriverBranchInfo_v1 = ...
+
+class c_nvmlExcludedDeviceInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class nvmlNvLinkUtilizationControl_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlMemory_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+class c_nvmlMemory_v2_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+nvmlMemory_v2 = ...
+
+class c_nvmlBAR1Memory_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+class nvmlClkMonFaultInfo_t(Structure):
+    _fields_ = ...
+
+MAX_CLK_DOMAINS = ...
+
+class nvmlClkMonStatus_t(Structure):
+    _fields_ = ...
+
+class c_nvmlProcessInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+c_nvmlProcessInfo_v3_t = c_nvmlProcessInfo_v2_t
+c_nvmlProcessInfo_t = c_nvmlProcessInfo_v3_t
+_nvmlProcessMode_t = c_uint
+NVML_PROCESS_MODE_COMPUTE = ...
+NVML_PROCESS_MODE_GRAPHICS = ...
+NVML_PROCESS_MODE_MPS = ...
+
+class c_nvmlProcessDetail_v1_t(Structure):
+    _fields_ = ...
+
+class c_nvmlProcessDetailList_v1_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+c_nvmlProcessDetailList_t = c_nvmlProcessDetailList_v1_t
+nvmlProcessDetailList_v1 = ...
+
+class c_nvmlBridgeChipInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlBridgeChipHierarchy_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlEccErrorCounts_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlUtilization_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+    gpu: c_uint
+    memory: c_uint
+
+class c_nvmlHwbcEntry_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlValue_t(Union):
+    _fields_ = ...
+
+class c_nvmlSample_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlViolationTime_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlFieldValue_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_NVLINK_TOTAL_SUPPORTED_BW_MODES = ...
+nvmlNvlinkSupportedBwModes_v1 = ...
+
+class c_nvmlNvlinkSupportedBwModes_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlNvlinkGetBwMode_v1 = ...
+
+class c_nvmlNvlinkGetBwMode_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlNvlinkSetBwMode_v1 = ...
+
+class c_nvmlNvlinkSetBwMode_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlVgpuHeterogeneousMode_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuHeterogeneousMode_v1 = ...
+
+class c_nvmlVgpuPlacementId_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuPlacementId_v1 = ...
+
+class c_nvmlVgpuPlacementList_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuPlacementList_v1 = ...
+NVML_VGPU_PGPU_HETEROGENEOUS_MODE = ...
+NVML_VGPU_PGPU_HOMOGENEOUS_MODE = ...
+
+class c_nvmlVgpuPlacementList_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuPlacementList_v2 = ...
+
+class c_nvmlVgpuTypeBar1Info_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuTypeBar1Info_v1 = ...
+
+class c_nvmlVgpuInstanceUtilizationSample_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuInstanceUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuInstancesUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuInstancesUtilizationInfo_v1 = ...
+
+class c_nvmlVgpuProcessUtilizationSample_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuProcessUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuProcessesUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuProcessesUtilizationInfo_v1 = ...
+
+class nvmlVgpuRuntimeState_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+VgpuRuntimeState_v1 = ...
+
+class c_nvmlVgpuLicenseExpiry_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_GRID_LICENSE_STATE_UNKNOWN = ...
+NVML_GRID_LICENSE_STATE_UNINITIALIZED = ...
+NVML_GRID_LICENSE_STATE_UNLICENSED_UNRESTRICTED = ...
+NVML_GRID_LICENSE_STATE_UNLICENSED_RESTRICTED = ...
+NVML_GRID_LICENSE_STATE_UNLICENSED = ...
+NVML_GRID_LICENSE_STATE_LICENSED = ...
+
+class c_nvmlVgpuLicenseInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlEncoderSession_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlProcessUtilizationSample_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlProcessUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlProcessesUtilizationInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+ProcessesUtilizationInfo_v1 = ...
+
+class c_nvmlGridLicenseExpiry_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeature_v4_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeatures_v4_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeature_v3_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeatures_v3_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeature_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeatures_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeature_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGridLicensableFeatures_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlMarginTemperature_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlMarginTemperature_v1 = ...
+NVML_DEVICE_UUID_ASCII_LEN = ...
+NVML_DEVICE_UUID_BINARY_LEN = ...
+NVML_UUID_TYPE_NONE = ...
+NVML_UUID_TYPE_ASCII = ...
+NVML_UUID_TYPE_BINARY = ...
+
+class c_nvmlUUIDValue_t(Union):
+    _fields_ = ...
+
+nvmlUUID_v1 = ...
+
+class c_nvmlUUID_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlPdi_v1 = ...
+
+class c_nvmlPdi_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlRepairStatus_v1 = ...
+
+class c_nvmlRepairStatus_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlNvLinkInfo_v1 = ...
+
+class c_nvmlNvLinkInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+NVML_NVLINK_FIRMWARE_UCODE_TYPE_MSE = ...
+NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR = ...
+NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_UPHY = ...
+NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_CLN = ...
+NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_DLN = ...
+NVML_NVLINK_FIRMWARE_VERSION_LENGTH = ...
+
+class c_nvmlNvlinkFirmwareVersion_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlNvlinkFirmwareInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlNvLinkInfo_v2 = ...
+
+class c_nvmlNvLinkInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+NVML_PRM_DATA_MAX_SIZE = ...
+
+class c_nvmlPRMTLV_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self, size=...) -> None: ...
+
+def nvmlDeviceReadWritePRM_v1(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_info
+) -> None: ...
+
+NVML_DEVICE_ADDRESSING_MODE_NONE = ...
+NVML_DEVICE_ADDRESSING_MODE_HMM = ...
+NVML_DEVICE_ADDRESSING_MODE_ATS = ...
+nvmlDeviceAddressingMode_v1 = ...
+
+class c_nvmlDeviceAddressingMode_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlUnrepairableMemory_v1 = ...
+
+class c_nvmlUnrepairableMemory_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+NVML_PRM_COUNTER_ID_NONE = ...
+NVML_PRM_COUNTER_ID_PPCNT_PHYSICAL_LAYER_CTRS_LINK_DOWN_EVENTS = ...
+NVML_PRM_COUNTER_ID_PPCNT_PHYSICAL_LAYER_CTRS_SUCCESSFUL_RECOVERY_EVENTS = ...
+NVML_PRM_COUNTER_ID_PPCNT_RECOVERY_CTRS_TOTAL_SUCCESSFUL_RECOVERY_EVENTS = ...
+NVML_PRM_COUNTER_ID_PPCNT_RECOVERY_CTRS_TIME_SINCE_LAST_RECOVERY = ...
+NVML_PRM_COUNTER_ID_PPCNT_RECOVERY_CTRS_TIME_BETWEEN_LAST_TWO_RECOVERIES = ...
+NVML_PRM_COUNTER_ID_PPCNT_PORTCOUNTERS_PORT_XMIT_WAIT = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_RCV_CODES = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_RCV_CODE_ERR = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_RCV_UNCORRECTABLE_CODE = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_XMIT_CODES = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_XMIT_RETRY_CODES = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_XMIT_RETRY_EVENTS = ...
+NVML_PRM_COUNTER_ID_PPCNT_PLR_SYNC_EVENTS = ...
+NVML_PRM_COUNTER_ID_PPRM_OPER_RECOVERY = ...
+
+class c_nvmlPRMCounterInput_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self, port=...) -> None: ...
+
+class c_nvmlPRMCounterValue_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlPRMCounter_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self, ctrId=..., inData=...) -> None: ...
+
+class c_nvmlPRMCounterList_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self, num, ctrs=...) -> None: ...
+
+def nvmlDeviceReadPRMCounters_v1(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_info
+) -> None: ...
+
+class struct_c_nvmlEventSet_t(Structure): ...
+
+c_nvmlEventSet_t = ...
+nvmlEventTypeSingleBitEccError = ...
+nvmlEventTypeDoubleBitEccError = ...
+nvmlEventTypePState = ...
+nvmlEventTypeXidCriticalError = ...
+nvmlEventTypeClock = ...
+nvmlEventTypePowerSourceChange = ...
+nvmlEventMigConfigChange = ...
+nvmlEventTypeSingleBitEccErrorStorm = ...
+nvmlEventTypeDramRetirementEvent = ...
+nvmlEventTypeDramRetirementFailure = ...
+nvmlEventTypeNonFatalPoisonError = ...
+nvmlEventTypeFatalPoisonError = ...
+nvmlEventTypeGpuUnavailableError = ...
+nvmlEventTypeGpuRecoveryAction = ...
+nvmlEventTypeNone = ...
+nvmlEventTypeAll = ...
+nvmlClocksEventReasonGpuIdle = ...
+nvmlClocksEventReasonApplicationsClocksSetting = ...
+nvmlClocksEventReasonUserDefinedClocks = ...
+nvmlClocksEventReasonSwPowerCap = ...
+nvmlClocksEventReasonHwSlowdown = ...
+nvmlClocksEventReasonSyncBoost = ...
+nvmlClocksEventReasonSwThermalSlowdown = ...
+nvmlClocksEventReasonHwThermalSlowdown = ...
+nvmlClocksEventReasonHwPowerBrakeSlowdown = ...
+nvmlClocksEventReasonDisplayClockSetting = ...
+nvmlClocksEventReasonNone = ...
+nvmlClocksEventReasonAll = ...
+nvmlClocksThrottleReasonGpuIdle = ...
+nvmlClocksThrottleReasonApplicationsClocksSetting = ...
+nvmlClocksThrottleReasonUserDefinedClocks = ...
+nvmlClocksThrottleReasonSwPowerCap = ...
+nvmlClocksThrottleReasonHwSlowdown = ...
+nvmlClocksThrottleReasonSyncBoost = ...
+nvmlClocksThrottleReasonSwThermalSlowdown = ...
+nvmlClocksThrottleReasonHwThermalSlowdown = ...
+nvmlClocksThrottleReasonHwPowerBrakeSlowdown = ...
+nvmlClocksThrottleReasonDisplayClockSetting = ...
+nvmlClocksThrottleReasonNone = ...
+nvmlClocksThrottleReasonAll = ...
+
+class c_nvmlEventData_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+class struct_c_nvmlSystemEventSet_t(Structure): ...
+
+c_nvmlSystemEventSet_t = ...
+nvmlSystemEventTypeGpuDriverUnbind = ...
+nvmlSystemEventTypeGpuDriverBind = ...
+nvmlSystemEventTypeCount = ...
+nvmlSystemEventSetCreateRequest_v1 = ...
+
+class c_nvmlSystemEventSetCreateRequest_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlSystemEventSetFreeRequest_v1 = ...
+
+class c_nvmlSystemEventSetFreeRequest_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlSystemRegisterEventRequest_v1 = ...
+
+class c_nvmlSystemRegisterEventRequest_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlSystemEventData_v1_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+nvmlSystemEventSetWaitRequest_v1 = ...
+
+class c_nvmlSystemEventSetWaitRequest_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+def c_nvmlSystemEventSetCreate(req) -> None:
+    """
+    C API binding for c_nvmlSystemEventSetFree
+    :param req: reference of c_nvmlSystemEventSetCreateRequest_v1_t
+    """
+    ...
+
+def c_nvmlSystemEventSetFree(req) -> None:
+    """
+    C API binding for c_nvmlSystemEventSetFree
+    :param req: reference of c_nvmlSystemEventSetFreeRequest_v1_t
+    """
+    ...
+
+def c_nvmlSystemRegisterEvents(req) -> None:
+    """
+    C API binding for nvmlSystemRegisterEvents
+    :param req: reference of c_nvmlSystemRegisterEventRequest_v1_t
+    """
+    ...
+
+def c_nvmlSystemEventSetWait(req):  # -> Literal[10] | None:
+    """
+    C API binding for nvmlSystemEventSetWait
+    :param req: reference of c_nvmlSystemEventSetWaitRequest_v1_t
+    """
+    ...
+
+def nvmlSystemEventSetCreate(version):
+    """
+    Create an NVML system event set.
+    :param version: The version of the request.
+    :return: A ctypes pointer to the created c_nvmlSystemEventSet_t structure.
+    """
+    ...
+
+def nvmlSystemEventSetFree(version, setHandle) -> None:
+    """
+    Free an NVML system event set.
+    :param version: The version of the request.
+    :param setHandle: A ctypes pointer to a c_nvmlSystemEventSet_t structure.
+    """
+    ...
+
+def nvmlSystemRegisterEvents(version, eventTypes, setHandle) -> None:
+    """
+    Register events for an NVML system event set.
+    :param version: The version of the request.
+    :param eventTypes: A bitmask of event types to register.
+    :param setHandle: A ctypes pointer to a c_nvmlSystemEventSet_t structure.
+    """
+    ...
+
+def nvmlSystemEventSetWait(
+    version, setHandle, timeoutMs, eventData, eventDataSize
+):  # -> list[Any]:
+    """
+    Wait for events in an NVML system event set.
+    :param version: The version of the request.
+    :param setHandle: A ctypes pointer to a c_nvmlSystemEventSet_t structure.
+    :param timeoutMs: Timeout in milliseconds.
+    :param eventData: A ctypes array of c_nvmlSystemEventData_v1_t for event data.
+    :param eventDataSize: Number of c_nvmlSystemEventData_v1_t in evenData array..
+    :return: A list of dictionaries containing event data.
+    """
+    ...
+
+class c_nvmlAccountingStats_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuVersion_t(Structure):
+    _fields_ = ...
+
+class c_nvmlVgpuMetadata_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuPgpuMetadata_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuPgpuCompatibility_t(Structure):
+    _fields_ = ...
+
+NVML_VGPU_SCHEDULER_POLICY_UNKNOWN = ...
+NVML_VGPU_SCHEDULER_POLICY_BEST_EFFORT = ...
+NVML_VGPU_SCHEDULER_POLICY_EQUAL_SHARE = ...
+NVML_VGPU_SCHEDULER_POLICY_FIXED_SHARE = ...
+NVML_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT = ...
+NVML_SCHEDULER_SW_MAX_LOG_ENTRIES = ...
+NVML_VGPU_SCHEDULER_ARR_DEFAULT = ...
+NVML_VGPU_SCHEDULER_ARR_DISABLE = ...
+NVML_VGPU_SCHEDULER_ARR_ENABLE = ...
+NVML_VGPU_SCHEDULER_ENGINE_TYPE_GRAPHICS = ...
+NVML_VGPU_SCHEDULER_ENGINE_TYPE_NVENC1 = ...
+NVML_VGPU_SCHEDULER_ENGINE_TYPE_NVENC0 = ...
+
+class c_nvmlVgpuSchedDataWithARR_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedData_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerParams_t(Union):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerLogEntry_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerLog_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerGetState_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedSetDataWithARR_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedSetData_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerSetParams_t(Union):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerSetState_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerCapabilities_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuTypeIdInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuTypeIdInfo_v1 = ...
+
+class c_nvmlVgpuTypeMaxInstance_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuTypeMaxInstance_v1 = ...
+
+class c_nvmlActiveVgpuInstanceInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlActiveVgpuInstanceInfo_v1 = ...
+
+class c_nvmlVgpuSchedulerState_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuSchedulerState_v1 = ...
+
+class c_nvmlVgpuSchedulerStateInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuSchedulerStateInfo_v1 = ...
+
+class c_nvmlVgpuSchedulerLogInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuSchedulerLogInfo_v1 = ...
+
+class c_nvmlVgpuCreatablePlacementInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlVgpuCreatablePlacementInfo_v1 = ...
+
+class c_nvmlVgpuSchedulerStateInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerLogEntry_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerLogInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlVgpuSchedulerState_v2_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlFBCStats_t(Structure):
+    _fields_ = ...
+
+class c_nvmlFBCSession_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_DEVICE_MIG_DISABLE = ...
+NVML_DEVICE_MIG_ENABLE = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_2_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_3_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_4_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_7_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_8_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_6_SLICE = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV1 = ...
+NVML_GPU_INSTANCE_PROFILE_2_SLICE_REV1 = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV2 = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE_GFX = ...
+NVML_GPU_INSTANCE_PROFILE_2_SLICE_GFX = ...
+NVML_GPU_INSTANCE_PROFILE_4_SLICE_GFX = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE_NO_ME = ...
+NVML_GPU_INSTANCE_PROFILE_2_SLICE_NO_ME = ...
+NVML_GPU_INSTANCE_PROFILE_1_SLICE_ALL_ME = ...
+NVML_GPU_INSTANCE_PROFILE_2_SLICE_ALL_ME = ...
+NVML_GPU_INSTANCE_PROFILE_COUNT = ...
+
+class c_nvmlGpuInstancePlacement_t(Structure):
+    _fields_ = ...
+
+class c_nvmlGpuInstanceProfileInfo_t(Structure):
+    _fields_ = ...
+
+nvmlGpuInstanceProfileInfo_v2 = ...
+
+class c_nvmlGpuInstanceProfileInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlGpuInstanceInfo_t(Structure):
+    _fields_ = ...
+
+class struct_c_nvmlGpuInstance_t(Structure): ...
+
+c_nvmlGpuInstance_t = ...
+NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_2_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_3_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_4_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_7_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_8_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_6_SLICE = ...
+NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE_REV1 = ...
+NVML_COMPUTE_INSTANCE_PROFILE_COUNT = ...
+NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED = ...
+NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT = ...
+
+class c_nvmlComputeInstancePlacement_t(Structure):
+    _fields_ = ...
+
+class c_nvmlComputeInstanceProfileInfo_t(Structure):
+    _fields_ = ...
+
+nvmlComputeInstanceProfileInfo_v2 = ...
+
+class c_nvmlComputeInstanceProfileInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlComputeInstanceInfo_t(Structure):
+    _fields_ = ...
+
+NVML_MAX_GPU_UTILIZATIONS = ...
+NVML_GPU_UTILIZATION_DOMAIN_GPU = ...
+NVML_GPU_UTILIZATION_DOMAIN_FB = ...
+NVML_GPU_UTILIZATION_DOMAIN_VID = ...
+NVML_GPU_UTILIZATION_DOMAIN_BUS = ...
+
+class c_nvmlGpuDynamicPstatesUtilization_t(Structure):
+    _fields_ = ...
+
+class c_nvmlGpuDynamicPstatesInfo_t(Structure):
+    _fields_ = ...
+
+NVML_MAX_THERMAL_SENSORS_PER_GPU = ...
+NVML_THERMAL_TARGET_NONE = ...
+NVML_THERMAL_TARGET_GPU = ...
+NVML_THERMAL_TARGET_MEMORY = ...
+NVML_THERMAL_TARGET_POWER_SUPPLY = ...
+NVML_THERMAL_TARGET_BOARD = ...
+NVML_THERMAL_TARGET_VCD_BOARD = ...
+NVML_THERMAL_TARGET_VCD_INLET = ...
+NVML_THERMAL_TARGET_VCD_OUTLET = ...
+NVML_THERMAL_TARGET_ALL = ...
+NVML_THERMAL_TARGET_UNKNOWN = ...
+NVML_THERMAL_CONTROLLER_NONE = ...
+NVML_THERMAL_CONTROLLER_GPU_INTERNAL = ...
+NVML_THERMAL_CONTROLLER_ADM1032 = ...
+NVML_THERMAL_CONTROLLER_ADT7461 = ...
+NVML_THERMAL_CONTROLLER_MAX6649 = ...
+NVML_THERMAL_CONTROLLER_MAX1617 = ...
+NVML_THERMAL_CONTROLLER_LM99 = ...
+NVML_THERMAL_CONTROLLER_LM89 = ...
+NVML_THERMAL_CONTROLLER_LM64 = ...
+NVML_THERMAL_CONTROLLER_G781 = ...
+NVML_THERMAL_CONTROLLER_ADT7473 = ...
+NVML_THERMAL_CONTROLLER_SBMAX6649 = ...
+NVML_THERMAL_CONTROLLER_VBIOSEVT = ...
+NVML_THERMAL_CONTROLLER_OS = ...
+NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS = ...
+NVML_THERMAL_CONTROLLER_NVSYSCON_E551 = ...
+NVML_THERMAL_CONTROLLER_MAX6649R = ...
+NVML_THERMAL_CONTROLLER_ADT7473S = ...
+NVML_THERMAL_CONTROLLER_UNKNOWN = ...
+
+class c_nvmlGpuThermalSensor_t(Structure):
+    _fields_ = ...
+
+class c_nvmlGpuThermalSettings_t(Structure):
+    _fields_ = ...
+
+_nvmlCoolerControl_t = c_uint
+NVML_THERMAL_COOLER_SIGNAL_NONE = ...
+NVML_THERMAL_COOLER_SIGNAL_TOGGLE = ...
+NVML_THERMAL_COOLER_SIGNAL_VARIABLE = ...
+NVML_THERMAL_COOLER_SIGNAL_COUNT = ...
+_nvmlCoolerTarget_t = c_uint
+NVML_THERMAL_COOLER_TARGET_NONE = ...
+NVML_THERMAL_COOLER_TARGET_GPU = ...
+NVML_THERMAL_COOLER_TARGET_MEMORY = ...
+NVML_THERMAL_COOLER_TARGET_POWER_SUPPLY = ...
+NVML_THERMAL_COOLER_TARGET_GPU_RELATED = ...
+
+class c_nvmlCoolerInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlCoolerInfo_v1 = ...
+
+def nvmlDeviceGetCoolerInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[<subclass of bytes and str> | str | Any]:
+    ...
+
+class struct_c_nvmlComputeInstance_t(Structure): ...
+
+c_nvmlComputeInstance_t = ...
+
+class c_nvmlDeviceAttributes(Structure):
+    _fields_ = ...
+
+class c_nvmlRowRemapperHistogramValues(Structure):
+    _fields_ = ...
+
+NVML_GPU_CERT_CHAIN_SIZE = ...
+NVML_GPU_ATTESTATION_CERT_CHAIN_SIZE = ...
+NVML_CC_GPU_CEC_NONCE_SIZE = ...
+NVML_CC_GPU_ATTESTATION_REPORT_SIZE = ...
+NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE = ...
+NVML_CC_CEC_ATTESTATION_REPORT_NOT_PRESENT = ...
+NVML_CC_CEC_ATTESTATION_REPORT_PRESENT = ...
+
+class c_nvmlConfComputeSystemState_t(Structure):
+    _fields_ = ...
+
+nvmlSystemConfComputeSettings_v1 = ...
+
+class c_nvmlSystemConfComputeSettings_v1_t(Structure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlConfComputeSystemCaps_t(Structure):
+    _fields_ = ...
+
+class c_nvmlConfComputeMemSizeInfo_t(Structure):
+    _fields_ = ...
+
+class c_nvmlConfComputeGpuCertificate_t(Structure):
+    _fields_ = ...
+
+class c_nvmlConfComputeGpuAttestationReport_t(Structure):
+    _fields_ = ...
+
+class c_nvmlConfComputeSetKeyRotationThresholdInfo_t(Structure):
+    _fields_ = ...
+
+ConfComputeSetKeyRotationThresholdInfo_v1 = ...
+
+class c_nvmlConfComputeGetKeyRotationThresholdInfo_t(Structure):
+    _fields_ = ...
+
+ConfComputeGetKeyRotationThresholdInfo_v1 = ...
+
+def convertStrBytes(
+    func,
+):  # -> _Wrapped[..., Any, ..., <subclass of bytes and str> | str | Any]:
+    """
+    In python 3, strings are unicode instead of bytes, and need to be converted for ctypes
+    Args from caller: (1, 'string', <__main__.c_nvmlDevice_t at 0xFFFFFFFF>)
+    Args passed to function: (1, b'string', <__main__.c_nvmlDevice_t at 0xFFFFFFFF)>
+    ----
+    Returned from function: b'returned string'
+    Returned to caller: 'returned string'
+    """
+    ...
+
+def throwOnVersionMismatch(func):  # -> _Wrapped[..., Any, ..., Any]:
+    ...
+def nvmlInitWithFlags(flags) -> None: ...
+def nvmlInit() -> None: ...
+def nvmlShutdown() -> None: ...
+@convertStrBytes
+def nvmlErrorString(result): ...
+@convertStrBytes
+def nvmlSystemGetNVMLVersion():  # -> Any:
+    ...
+def nvmlSystemGetCudaDriverVersion() -> int: ...
+def nvmlSystemGetCudaDriverVersion_v2() -> int: ...
+@convertStrBytes
+def nvmlSystemGetProcessName(pid):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlSystemGetDriverVersion():  # -> Any:
+    ...
+def nvmlSystemGetHicVersion():  # -> list[Any] | Array[c_nvmlHwbcEntry_t]:
+    ...
+def nvmlSystemGetDriverBranch():  # -> c_nvmlSystemDriverBranchInfo_v1_t:
+    ...
+def nvmlUnitGetCount() -> int: ...
+def nvmlUnitGetHandleByIndex(index: int):  # -> _Pointer[struct_c_nvmlUnit_t]:
+    ...
+def nvmlUnitGetUnitInfo(unit):  # -> c_nvmlUnitInfo_t:
+    ...
+def nvmlUnitGetLedState(unit):  # -> c_nvmlLedState_t:
+    ...
+def nvmlUnitGetPsuInfo(unit):  # -> c_nvmlPSUInfo_t:
+    ...
+def nvmlUnitGetTemperature(unit, type) -> int: ...
+def nvmlUnitGetFanSpeedInfo(unit):  # -> c_nvmlUnitFanSpeeds_t:
+    ...
+def nvmlUnitGetDeviceCount(unit) -> int: ...
+def nvmlUnitGetDevices(unit):  # -> Array[_Pointer[struct_c_nvmlDevice_t]]:
+    ...
+def nvmlDeviceGetCount() -> int: ...
+def nvmlDeviceGetHandleByIndex(index: int) -> _Pointer[struct_c_nvmlDevice_t]: ...
+@convertStrBytes
+def nvmlDeviceGetHandleBySerial(serial):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+@convertStrBytes
+def nvmlDeviceGetHandleByUUID(uuid):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+@convertStrBytes
+def nvmlDeviceGetHandleByUUIDV(uuid, type):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+@convertStrBytes
+def nvmlDeviceGetHandleByPciBusId(pciBusId):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+@convertStrBytes
+def nvmlDeviceGetName(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> Any:
+    ...
+
+class c_nvmlDevicePerfModes_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlDevicePerfModes_v1 = ...
+
+@convertStrBytes
+def nvmlDeviceGetPerformanceModes(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+
+class c_nvmlDeviceCurrentClockFreqs_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlDeviceCurrentClockFreqs_v1 = ...
+
+@convertStrBytes
+def nvmlDeviceGetCurrentClockFreqs(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetBoardId(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetMultiGpuBoard(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetBrand(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetC2cModeInfoV1(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlC2cModeInfo_v1_t:
+    ...
+def nvmlDeviceGetC2cModeInfoV(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlC2cModeInfo_v1_t:
+    ...
+@convertStrBytes
+def nvmlDeviceGetBoardPartNumber(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlDeviceGetSerial(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> Any:
+    ...
+def nvmlDeviceGetModuleId(
+    handle: _Pointer[struct_c_nvmlDevice_t], moduleId=...
+) -> int: ...
+def nvmlDeviceGetMemoryAffinity(
+    handle: _Pointer[struct_c_nvmlDevice_t], nodeSetSize, scope
+): ...
+def nvmlDeviceGetCpuAffinityWithinScope(
+    handle: _Pointer[struct_c_nvmlDevice_t], cpuSetSize, scope
+): ...
+def nvmlDeviceGetCpuAffinity(handle: _Pointer[struct_c_nvmlDevice_t], cpuSetSize): ...
+def nvmlDeviceSetCpuAffinity(handle: _Pointer[struct_c_nvmlDevice_t]) -> None: ...
+def nvmlDeviceClearCpuAffinity(handle: _Pointer[struct_c_nvmlDevice_t]) -> None: ...
+def nvmlDeviceGetNumaNodeId(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetAddressingMode(device):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetMinorNumber(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+@convertStrBytes
+def nvmlDeviceGetUUID(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlDeviceGetInforomVersion(
+    handle: _Pointer[struct_c_nvmlDevice_t], infoRomObject
+):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlDeviceGetInforomImageVersion(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> Any:
+    ...
+def nvmlDeviceGetInforomConfigurationChecksum(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceValidateInforom(handle: _Pointer[struct_c_nvmlDevice_t]) -> None: ...
+def nvmlDeviceGetLastBBXFlushTime(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetDisplayMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetDisplayActive(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPersistenceMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPciInfoExt(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_info
+) -> None: ...
+def nvmlDeviceGetPciInfo_v3(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> nvmlPciInfo_t:
+    ...
+def nvmlDeviceGetPciInfo(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> nvmlPciInfo_t:
+    ...
+def nvmlDeviceGetClockInfo(handle: _Pointer[struct_c_nvmlDevice_t], type) -> int: ...
+def nvmlDeviceGetMaxClockInfo(handle: _Pointer[struct_c_nvmlDevice_t], type) -> int: ...
+def nvmlDeviceGetApplicationsClock(
+    handle: _Pointer[struct_c_nvmlDevice_t], type
+) -> int: ...
+def nvmlDeviceGetMaxCustomerBoostClock(
+    handle: _Pointer[struct_c_nvmlDevice_t], type
+) -> int: ...
+def nvmlDeviceGetClock(handle: _Pointer[struct_c_nvmlDevice_t], type, id) -> int: ...
+def nvmlDeviceGetDefaultApplicationsClock(
+    handle: _Pointer[struct_c_nvmlDevice_t], type
+) -> int: ...
+def nvmlDeviceGetSupportedMemoryClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetSupportedGraphicsClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t], memoryClockMHz
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetFanSpeed(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetFanSpeed_v2(handle: _Pointer[struct_c_nvmlDevice_t], fan) -> int: ...
+
+class c_nvmlFanSpeedInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlFanSpeedInfo_v1 = ...
+
+def nvmlDeviceGetFanSpeedRPM(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetTargetFanSpeed(
+    handle: _Pointer[struct_c_nvmlDevice_t], fan
+) -> int: ...
+def nvmlDeviceGetNumFans(device) -> int: ...
+def nvmlDeviceSetDefaultFanSpeed_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], index: int
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetMinMaxFanSpeed(
+    handle: _Pointer[struct_c_nvmlDevice_t], minSpeed=..., maxSpeed=...
+):  # -> list[int] | Literal[0]:
+    ...
+def nvmlDeviceGetFanControlPolicy_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], fan, fanControlPolicy=...
+) -> int: ...
+def nvmlDeviceSetFanControlPolicy(
+    handle: _Pointer[struct_c_nvmlDevice_t], fan, fanControlPolicy
+):  # -> Literal[0]:
+    ...
+
+class c_nvmlTemperature_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlTemperature_v1 = ...
+
+def nvmlDeviceGetTemperatureV1(
+    handle: _Pointer[struct_c_nvmlDevice_t], sensor: int
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetTemperatureV(
+    handle: _Pointer[struct_c_nvmlDevice_t], sensor: int, version=...
+) -> c_int: ...
+def nvmlDeviceGetTemperature(
+    handle: _Pointer[struct_c_nvmlDevice_t], sensor: int
+) -> int: ...
+def nvmlDeviceGetTemperatureThreshold(
+    handle: _Pointer[struct_c_nvmlDevice_t], threshold
+) -> int: ...
+def nvmlDeviceSetTemperatureThreshold(
+    handle: _Pointer[struct_c_nvmlDevice_t], threshold, temp
+) -> None: ...
+def nvmlDeviceGetMarginTemperature(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetPowerState(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPerformanceState(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPowerManagementMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetPowerManagementLimit(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetPowerManagementLimitConstraints(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetPowerManagementDefaultLimit(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetEnforcedPowerLimit(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPowerUsage(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetTotalEnergyConsumption(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetGpuOperationMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetCurrentGpuOperationMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetPendingGpuOperationMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetMemoryInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t], version=...
+):  # -> c_nvmlMemory_t | c_nvmlMemory_v2_t:
+    ...
+def nvmlDeviceGetBAR1MemoryInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlBAR1Memory_t:
+    ...
+def nvmlDeviceGetComputeMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetCudaComputeCapability(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> tuple[int, int]:
+    ...
+def nvmlDeviceGetEccMode(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> list[int]:
+    ...
+def nvmlDeviceGetCurrentEccMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPendingEccMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetDefaultEccMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetTotalEccErrors(
+    handle: _Pointer[struct_c_nvmlDevice_t], errorType, counterType
+) -> int: ...
+def nvmlDeviceGetDetailedEccErrors(
+    handle: _Pointer[struct_c_nvmlDevice_t], errorType, counterType
+):  # -> c_nvmlEccErrorCounts_t:
+    ...
+def nvmlDeviceGetMemoryErrorCounter(
+    handle: _Pointer[struct_c_nvmlDevice_t], errorType, counterType, locationType
+) -> int: ...
+def nvmlDeviceGetUtilizationRates(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> c_nvmlUtilization_t: ...
+def nvmlDeviceGetEncoderUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetDecoderUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetJpgUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetOfaUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetPcieReplayCounter(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetDriverModel_v1(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetDriverModel_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetDriverModel(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> list[int]:
+    ...
+def nvmlDeviceGetCurrentDriverModel(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetPendingDriverModel(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+@convertStrBytes
+def nvmlDeviceGetVbiosVersion(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> Any:
+    ...
+def nvmlDeviceGetComputeRunningProcesses_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetComputeRunningProcesses_v3(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+@throwOnVersionMismatch
+def nvmlDeviceGetComputeRunningProcesses(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetGraphicsRunningProcesses_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetGraphicsRunningProcesses_v3(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+@throwOnVersionMismatch
+def nvmlDeviceGetGraphicsRunningProcesses(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+@throwOnVersionMismatch
+def nvmlDeviceGetMPSComputeRunningProcesses(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetMPSComputeRunningProcesses_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetMPSComputeRunningProcesses_v3(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetRunningProcessDetailList(
+    handle: _Pointer[struct_c_nvmlDevice_t], version, mode
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetAutoBoostedClocksEnabled(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlUnitSetLedState(unit, color) -> None: ...
+def nvmlDeviceSetPersistenceMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], mode
+) -> None: ...
+def nvmlDeviceSetComputeMode(handle: _Pointer[struct_c_nvmlDevice_t], mode) -> None: ...
+def nvmlDeviceSetEccMode(handle: _Pointer[struct_c_nvmlDevice_t], mode) -> None: ...
+def nvmlDeviceClearEccErrorCounts(
+    handle: _Pointer[struct_c_nvmlDevice_t], counterType
+) -> None: ...
+def nvmlDeviceSetDriverModel(
+    handle: _Pointer[struct_c_nvmlDevice_t], model
+) -> None: ...
+def nvmlDeviceSetAutoBoostedClocksEnabled(
+    handle: _Pointer[struct_c_nvmlDevice_t], enabled
+) -> None: ...
+def nvmlDeviceSetDefaultAutoBoostedClocksEnabled(
+    handle: _Pointer[struct_c_nvmlDevice_t], enabled, flags
+) -> None: ...
+def nvmlDeviceSetGpuLockedClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t], minGpuClockMHz, maxGpuClockMHz
+) -> None: ...
+def nvmlDeviceResetGpuLockedClocks(handle: _Pointer[struct_c_nvmlDevice_t]) -> None: ...
+def nvmlDeviceSetMemoryLockedClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t], minMemClockMHz, maxMemClockMHz
+) -> None: ...
+def nvmlDeviceResetMemoryLockedClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> None: ...
+def nvmlDeviceGetClkMonStatus(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_clkMonInfo=...
+):  # -> nvmlClkMonStatus_t | Literal[0]:
+    ...
+def nvmlDeviceSetApplicationsClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t], maxMemClockMHz, maxGraphicsClockMHz
+) -> None: ...
+def nvmlDeviceResetApplicationsClocks(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> None: ...
+def nvmlDeviceSetPowerManagementLimit(
+    handle: _Pointer[struct_c_nvmlDevice_t], limit
+) -> None: ...
+def nvmlDeviceSetGpuOperationMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], mode
+) -> None: ...
+def nvmlEventSetCreate():  # -> _Pointer[struct_c_nvmlEventSet_t]:
+    ...
+def nvmlDeviceRegisterEvents(
+    handle: _Pointer[struct_c_nvmlDevice_t], eventTypes, eventSet
+) -> None: ...
+def nvmlDeviceGetSupportedEventTypes(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlEventSetWait_v2(eventSet, timeoutms):  # -> c_nvmlEventData_t:
+    ...
+def nvmlEventSetWait(eventSet, timeoutms):  # -> c_nvmlEventData_t:
+    ...
+def nvmlEventSetFree(eventSet) -> None: ...
+def nvmlDeviceOnSameBoard(
+    handle1: _Pointer[struct_c_nvmlDevice_t], handle2: _Pointer[struct_c_nvmlDevice_t]
+):  # -> bool:
+    ...
+def nvmlDeviceGetCurrPcieLinkGeneration(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetMaxPcieLinkGeneration(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetCurrPcieLinkWidth(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetMaxPcieLinkWidth(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetGpuMaxPcieLinkGeneration(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetSupportedClocksThrottleReasons(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetSupportedClocksEventReasons(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetCurrentClocksThrottleReasons(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetCurrentClocksEventReasons(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetIndex(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceGetAccountingMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceSetAccountingMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], mode
+) -> None: ...
+def nvmlDeviceClearAccountingPids(handle: _Pointer[struct_c_nvmlDevice_t]) -> None: ...
+def nvmlDeviceGetAccountingStats(
+    handle: _Pointer[struct_c_nvmlDevice_t], pid
+):  # -> c_nvmlAccountingStats_t:
+    ...
+def nvmlDeviceGetAccountingPids(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[int]:
+    ...
+def nvmlDeviceGetAccountingBufferSize(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+) -> int: ...
+def nvmlDeviceGetRetiredPages(device, sourceFilter):  # -> list[int]:
+    ...
+def nvmlDeviceGetRetiredPages_v2(device, sourceFilter):  # -> list[dict[str, int]]:
+    ...
+def nvmlDeviceGetRetiredPagesPendingStatus(device) -> int: ...
+def nvmlDeviceGetAPIRestriction(device, apiType) -> int: ...
+def nvmlDeviceSetAPIRestriction(
+    handle: _Pointer[struct_c_nvmlDevice_t], apiType, isRestricted
+) -> None: ...
+def nvmlDeviceGetBridgeChipInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlBridgeChipHierarchy_t:
+    ...
+def nvmlDeviceGetSamples(device, sampling_type, timeStamp):  # -> tuple[int, list[Any]]:
+    ...
+def nvmlDeviceGetViolationStatus(device, perfPolicyType):  # -> c_nvmlViolationTime_t:
+    ...
+def nvmlDeviceGetPcieThroughput(device, counter) -> int: ...
+def nvmlSystemGetTopologyGpuSet(cpuNumber):  # -> list[Any]:
+    ...
+def nvmlDeviceGetTopologyNearestGpus(device, level):  # -> list[Any]:
+    ...
+def nvmlDeviceGetTopologyCommonAncestor(device1, device2) -> int: ...
+def nvmlDeviceGetNvLinkUtilizationCounter(device, link, counter):  # -> tuple[int, int]:
+    ...
+def nvmlDeviceFreezeNvLinkUtilizationCounter(device, link, counter, freeze) -> None: ...
+def nvmlDeviceResetNvLinkUtilizationCounter(device, link, counter) -> None: ...
+def nvmlDeviceSetNvLinkUtilizationControl(
+    device, link, counter, control, reset
+) -> None: ...
+def nvmlDeviceGetNvLinkUtilizationControl(
+    device, link, counter
+):  # -> nvmlNvLinkUtilizationControl_t:
+    ...
+def nvmlDeviceGetNvLinkCapability(device, link, capability) -> int: ...
+def nvmlDeviceGetNvLinkErrorCounter(device, link, counter) -> int: ...
+def nvmlDeviceResetNvLinkErrorCounters(device, link) -> None: ...
+def nvmlDeviceGetNvLinkRemotePciInfo(device, link):  # -> nvmlPciInfo_t:
+    ...
+def nvmlDeviceGetNvLinkRemoteDeviceType(
+    handle: _Pointer[struct_c_nvmlDevice_t], link
+) -> int: ...
+def nvmlDeviceGetNvLinkState(device, link) -> int: ...
+def nvmlDeviceGetNvLinkVersion(device, link) -> int: ...
+def nvmlDeviceModifyDrainState(pciInfo, newState) -> None: ...
+def nvmlDeviceQueryDrainState(pciInfo) -> int: ...
+def nvmlDeviceRemoveGpu(pciInfo) -> None: ...
+def nvmlDeviceDiscoverGpus(pciInfo) -> None: ...
+def nvmlDeviceGetFieldValues(
+    handle: _Pointer[struct_c_nvmlDevice_t], fieldIds
+):  # -> Array[c_nvmlFieldValue_t]:
+    ...
+def nvmlDeviceClearFieldValues(
+    handle: _Pointer[struct_c_nvmlDevice_t], fieldIds
+):  # -> Array[c_nvmlFieldValue_t]:
+    ...
+def nvmlDeviceGetVirtualizationMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceSetVirtualizationMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], virtualization_mode
+): ...
+def nvmlDeviceGetVgpuHeterogeneousMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceSetVgpuHeterogeneousMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], heterogeneous_mode
+):  # -> Literal[0]:
+    ...
+def nvmlVgpuInstanceGetPlacementId(
+    vgpuInstance,
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetVgpuTypeSupportedPlacements(
+    handle: _Pointer[struct_c_nvmlDevice_t], vgpuTypeId, mode=..., version=...
+):  # -> c_nvmlVgpuPlacementList_v2_t | c_nvmlVgpuPlacementList_v1_t:
+    ...
+def nvmlDeviceGetVgpuTypeCreatablePlacements(
+    handle: _Pointer[struct_c_nvmlDevice_t], vgpuTypeId, version=...
+):  # -> c_nvmlVgpuPlacementList_v2_t | c_nvmlVgpuPlacementList_v1_t:
+    ...
+def nvmlGetVgpuDriverCapabilities(capability) -> int: ...
+def nvmlDeviceGetVgpuCapabilities(
+    handle: _Pointer[struct_c_nvmlDevice_t], capability
+) -> int: ...
+def nvmlDeviceSetVgpuCapabilities(
+    handle: _Pointer[struct_c_nvmlDevice_t], capability, state
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceVgpuForceGspUnload(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetSupportedVgpus(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetCreatableVgpus(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlVgpuTypeGetGpuInstanceProfileId(vgpuTypeId) -> int: ...
+@convertStrBytes
+def nvmlVgpuTypeGetClass(vgpuTypeId):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlVgpuTypeGetName(vgpuTypeId):  # -> Any:
+    ...
+def nvmlVgpuTypeGetDeviceID(vgpuTypeId):  # -> tuple[int, int]:
+    ...
+def nvmlVgpuTypeGetFramebufferSize(vgpuTypeId) -> int: ...
+def nvmlVgpuTypeGetNumDisplayHeads(vgpuTypeId) -> int: ...
+def nvmlVgpuTypeGetResolution(vgpuTypeId):  # -> tuple[int, int]:
+    ...
+@convertStrBytes
+def nvmlVgpuTypeGetLicense(vgpuTypeId):  # -> Any:
+    ...
+def nvmlVgpuTypeGetFrameRateLimit(vgpuTypeId) -> int: ...
+def nvmlVgpuTypeGetGspHeapSize(vgpuTypeId) -> int: ...
+def nvmlVgpuTypeGetFbReservation(vgpuTypeId) -> int: ...
+def nvmlVgpuInstanceGetRuntimeStateSize(vgpuInstance):  # -> nvmlVgpuRuntimeState_v1_t:
+    ...
+def nvmlVgpuTypeGetMaxInstances(
+    handle: _Pointer[struct_c_nvmlDevice_t], vgpuTypeId
+) -> int: ...
+def nvmlVgpuTypeGetMaxInstancesPerVm(vgpuTypeId) -> int: ...
+def nvmlVgpuTypeGetBAR1Info(vgpuTypeId):  # -> c_nvmlVgpuTypeBar1Info_v1_t:
+    ...
+def nvmlDeviceGetActiveVgpus(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> list[Any]:
+    ...
+@convertStrBytes
+def nvmlVgpuInstanceGetVmID(vgpuInstance):  # -> tuple[Any, int]:
+    ...
+@convertStrBytes
+def nvmlVgpuInstanceGetUUID(vgpuInstance):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlVgpuInstanceGetMdevUUID(vgpuInstance):  # -> Any:
+    ...
+@convertStrBytes
+def nvmlVgpuInstanceGetVmDriverVersion(vgpuInstance):  # -> Any:
+    ...
+def nvmlVgpuInstanceGetLicenseStatus(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceGetLicenseInfo_v2(vgpuInstance):  # -> c_nvmlVgpuLicenseInfo_t:
+    ...
+def nvmlVgpuInstanceGetLicenseInfo(vgpuInstance):  # -> c_nvmlVgpuLicenseInfo_t:
+    ...
+def nvmlVgpuInstanceGetFrameRateLimit(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceGetEccMode(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceGetType(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceGetEncoderCapacity(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceSetEncoderCapacity(vgpuInstance, encoder_capacity): ...
+def nvmlVgpuInstanceGetFbUsage(vgpuInstance) -> int: ...
+def nvmlVgpuTypeGetCapabilities(vgpuTypeId, capability) -> int: ...
+def nvmlVgpuInstanceGetGpuInstanceId(vgpuInstance) -> int: ...
+@convertStrBytes
+def nvmlVgpuInstanceGetGpuPciId(vgpuInstance):  # -> Any:
+    ...
+def nvmlDeviceGetVgpuUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetVgpuInstancesUtilizationInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetP2PStatus(device1, device2, p2pIndex) -> int: ...
+def nvmlDeviceGetGridLicensableFeatures_v4(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlGridLicensableFeatures_v4_t:
+    ...
+def nvmlDeviceGetGridLicensableFeatures(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlGridLicensableFeatures_v4_t:
+    ...
+def nvmlDeviceGetGspFirmwareVersion(
+    handle: _Pointer[struct_c_nvmlDevice_t], version=...
+):  # -> Any | Literal[0]:
+    ...
+def nvmlDeviceGetGspFirmwareMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], isEnabled=..., defaultMode=...
+):  # -> list[int] | Literal[0]:
+    ...
+def nvmlDeviceGetEncoderCapacity(
+    handle: _Pointer[struct_c_nvmlDevice_t], encoderQueryType
+) -> int: ...
+def nvmlDeviceGetVgpuProcessUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetVgpuProcessesUtilizationInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetEncoderStats(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> tuple[int, int, int]:
+    ...
+def nvmlDeviceGetEncoderSessions(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetFBCStats(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlFBCStats_t:
+    ...
+def nvmlDeviceGetFBCSessions(handle: _Pointer[struct_c_nvmlDevice_t]):  # -> list[Any]:
+    ...
+def nvmlVgpuInstanceGetEncoderStats(vgpuInstance):  # -> tuple[int, int, int]:
+    ...
+def nvmlVgpuInstanceGetEncoderSessions(vgpuInstance):  # -> list[Any]:
+    ...
+def nvmlVgpuInstanceGetFBCStats(vgpuInstance):  # -> c_nvmlFBCStats_t:
+    ...
+def nvmlVgpuInstanceGetFBCSessions(vgpuInstance):  # -> list[Any]:
+    ...
+def nvmlDeviceGetProcessUtilization(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+):  # -> list[Any]:
+    ...
+def nvmlDeviceGetProcessesUtilizationInfo(
+    handle: _Pointer[struct_c_nvmlDevice_t], timeStamp
+): ...
+def nvmlVgpuInstanceGetMetadata(vgpuInstance):  # -> c_nvmlVgpuMetadata_t:
+    ...
+def nvmlDeviceGetVgpuMetadata(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlVgpuPgpuMetadata_t:
+    ...
+def nvmlGetVgpuCompatibility(
+    vgpuMetadata, pgpuMetadata
+):  # -> c_nvmlVgpuPgpuCompatibility_t:
+    ...
+@convertStrBytes
+def nvmlDeviceGetPgpuMetadataString(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> tuple[Any, int]:
+    ...
+def nvmlDeviceGetVgpuSchedulerLog(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlVgpuSchedulerLog_t:
+    ...
+def nvmlDeviceGetVgpuSchedulerState(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlVgpuSchedulerGetState_t:
+    ...
+def nvmlDeviceGetVgpuSchedulerCapabilities(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> c_nvmlVgpuSchedulerCapabilities_t:
+    ...
+def nvmlDeviceSetVgpuSchedulerState(
+    handle: _Pointer[struct_c_nvmlDevice_t], sched_state
+):  # -> Literal[0]:
+    ...
+def nvmlSetVgpuVersion(vgpuVersion):  # -> Literal[0]:
+    ...
+def nvmlGetVgpuVersion(
+    supported=..., current=...
+):  # -> list[tuple[Any, Any]] | Literal[0]:
+    ...
+def nvmlVgpuInstanceGetAccountingMode(vgpuInstance) -> int: ...
+def nvmlVgpuInstanceGetAccountingPids(vgpuInstance):  # -> tuple[c_uint, Array[c_uint]]:
+    ...
+def nvmlVgpuInstanceGetAccountingStats(
+    vgpuInstance, pid
+):  # -> c_nvmlAccountingStats_t:
+    ...
+def nvmlVgpuInstanceClearAccountingPids(vgpuInstance):  # -> Literal[0]:
+    ...
+def nvmlGpuInstanceGetCreatableVgpus(gpuInstance, c_vgpus): ...
+def nvmlVgpuTypeGetMaxInstancesPerGpuInstance(
+    vgpuTypeId,
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlGpuInstanceGetActiveVgpus(gpuInstance, c_vgpu_instance_info): ...
+def nvmlGpuInstanceSetVgpuSchedulerState(gpuInstance, sched_state): ...
+def nvmlGpuInstanceGetVgpuSchedulerState(gpuInstance, c_vgpu_sched_state_info): ...
+def nvmlGpuInstanceGetVgpuSchedulerLog(gpuInstance, c_vgpu_sched_log_info): ...
+def nvmlGpuInstanceGetVgpuTypeCreatablePlacements(gpuInstance, c_vgpu_placements): ...
+def nvmlGpuInstanceGetVgpuHeterogeneousMode(
+    gpuInstance,
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlGpuInstanceSetVgpuHeterogeneousMode(
+    gpuInstance, heterogeneous_mode
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetVgpuSchedulerState_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_vgpu_sched_state_info_v2
+): ...
+def nvmlGpuInstanceGetVgpuSchedulerState_v2(
+    gpuInstance, c_vgpu_sched_state_info_v2
+): ...
+def nvmlDeviceGetVgpuSchedulerLog_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], c_vgpu_sched_log_info_v2
+): ...
+def nvmlGpuInstanceGetVgpuSchedulerLog_v2(gpuInstance, c_vgpu_sched_log_info_v2): ...
+def nvmlDeviceSetVgpuSchedulerState_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], sched_state_v2
+):  # -> Literal[0]:
+    ...
+def nvmlGpuInstanceSetVgpuSchedulerState_v2(
+    gpuInstance, sched_state_v2
+):  # -> Literal[0]:
+    ...
+def nvmlGetExcludedDeviceCount() -> int: ...
+def nvmlGetExcludedDeviceInfoByIndex(index: int):  # -> c_nvmlExcludedDeviceInfo_t:
+    ...
+def nvmlDeviceGetHostVgpuMode(handle: _Pointer[struct_c_nvmlDevice_t]) -> int: ...
+def nvmlDeviceSetMigMode(device, mode) -> int: ...
+def nvmlDeviceGetMigMode(device):  # -> list[int]:
+    ...
+def nvmlDeviceGetGpuInstanceProfileInfo(
+    device, profile, version=...
+):  # -> c_nvmlGpuInstanceProfileInfo_v2_t | c_nvmlGpuInstanceProfileInfo_t:
+    ...
+def nvmlDeviceGetGpuInstanceProfileInfoById(
+    device, profileId
+):  # -> c_nvmlGpuInstanceProfileInfo_v2_t:
+    ...
+
+nvmlDeviceGetGpuInstanceProfileInfoV = ...
+nvmlDeviceGetGpuInstanceProfileInfoByIdV = ...
+
+def nvmlDeviceGetGpuInstanceRemainingCapacity(device, profileId) -> int: ...
+def nvmlDeviceGetGpuInstancePossiblePlacements(
+    device, profileId, placementsRef, countRef
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceCreateGpuInstance(
+    device, profileId
+):  # -> _Pointer[struct_c_nvmlGpuInstance_t]:
+    ...
+def nvmlDeviceCreateGpuInstanceWithPlacement(
+    device, profileId, placement
+):  # -> _Pointer[struct_c_nvmlGpuInstance_t]:
+    ...
+def nvmlGpuInstanceDestroy(gpuInstance):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetGpuInstances(
+    device, profileId, gpuInstancesRef, countRef
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetGpuInstanceById(
+    device, gpuInstanceId
+):  # -> _Pointer[struct_c_nvmlGpuInstance_t]:
+    ...
+def nvmlGpuInstanceGetInfo(gpuInstance):  # -> c_nvmlGpuInstanceInfo_t:
+    ...
+def nvmlGpuInstanceGetComputeInstanceProfileInfo(
+    device, profile, engProfile, version=...
+):  # -> c_nvmlComputeInstanceProfileInfo_v2_t | c_nvmlComputeInstanceProfileInfo_t:
+    ...
+
+nvmlGpuInstanceGetComputeInstanceProfileInfoV = ...
+
+def nvmlGpuInstanceGetComputeInstanceRemainingCapacity(
+    gpuInstance, profileId
+) -> int: ...
+def nvmlGpuInstanceGetComputeInstancePossiblePlacements(
+    gpuInstance, profileId, placementsRef, countRef
+):  # -> Literal[0]:
+    ...
+def nvmlGpuInstanceCreateComputeInstance(
+    gpuInstance, profileId
+):  # -> _Pointer[struct_c_nvmlComputeInstance_t]:
+    ...
+def nvmlGpuInstanceCreateComputeInstanceWithPlacement(
+    gpuInstance, profileId, placement
+):  # -> _Pointer[struct_c_nvmlComputeInstance_t]:
+    ...
+def nvmlComputeInstanceDestroy(computeInstance):  # -> Literal[0]:
+    ...
+def nvmlGpuInstanceGetComputeInstances(
+    gpuInstance, profileId, computeInstancesRef, countRef
+):  # -> Literal[0]:
+    ...
+def nvmlGpuInstanceGetComputeInstanceById(
+    gpuInstance, computeInstanceId
+):  # -> _Pointer[struct_c_nvmlComputeInstance_t]:
+    ...
+def nvmlComputeInstanceGetInfo_v2(computeInstance):  # -> c_nvmlComputeInstanceInfo_t:
+    ...
+def nvmlComputeInstanceGetInfo(computeInstance):  # -> c_nvmlComputeInstanceInfo_t:
+    ...
+def nvmlDeviceIsMigDeviceHandle(device):  # -> c_uint:
+    ...
+def nvmlDeviceGetGpuInstanceId(device) -> int: ...
+def nvmlDeviceGetComputeInstanceId(device) -> int: ...
+def nvmlDeviceGetMaxMigDeviceCount(device) -> int: ...
+def nvmlDeviceGetMigDeviceHandleByIndex(
+    device, index: int
+):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+def nvmlDeviceGetDeviceHandleFromMigDeviceHandle(
+    migDevice,
+):  # -> _Pointer[struct_c_nvmlDevice_t]:
+    ...
+def nvmlDeviceGetAttributes_v2(device):  # -> c_nvmlDeviceAttributes:
+    ...
+def nvmlDeviceGetAttributes(device):  # -> c_nvmlDeviceAttributes:
+    ...
+def nvmlDeviceGetRemappedRows(device):  # -> tuple[int, int, int, int]:
+    ...
+def nvmlDeviceGetRowRemapperHistogram(device):  # -> c_nvmlRowRemapperHistogramValues:
+    ...
+def nvmlDeviceGetArchitecture(device) -> int: ...
+def nvmlDeviceGetBusType(device) -> int: ...
+def nvmlDeviceGetIrqNum(device) -> int: ...
+def nvmlDeviceGetNumGpuCores(device) -> int: ...
+def nvmlDeviceGetPowerSource(device) -> int: ...
+def nvmlDeviceGetMemoryBusWidth(device) -> int: ...
+def nvmlDeviceGetPcieLinkMaxSpeed(device) -> int: ...
+def nvmlDeviceGetAdaptiveClockInfoStatus(device) -> int: ...
+def nvmlDeviceGetPcieSpeed(device) -> int: ...
+def nvmlDeviceGetDynamicPstatesInfo(
+    device, c_dynamicpstatesinfo=...
+):  # -> c_nvmlGpuDynamicPstatesInfo_t | Literal[0]:
+    ...
+def nvmlDeviceSetFanSpeed_v2(
+    handle: _Pointer[struct_c_nvmlDevice_t], index: int, speed
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetThermalSettings(
+    device, sensorindex: int, c_thermalsettings=...
+):  # -> Any | Literal[0]:
+    ...
+def nvmlDeviceGetMinMaxClockOfPState(
+    device, clockType, pstate, minClockMHz=..., maxClockMHz=...
+):  # -> tuple[int, int] | Literal[0]:
+    ...
+
+_nvmlPowerMizerMode_t = c_uint
+NVML_POWER_MIZER_MODE_ADAPTIVE = ...
+NVML_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE = ...
+NVML_POWER_MIZER_MODE_AUTO = ...
+NVML_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE = ...
+
+class c_nvmlDevicePowerMizerModes_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+def nvmlDeviceGetPowerMizerMode_v1(device, info): ...
+def nvmlDeviceSetPowerMizerMode_v1(device, info): ...
+
+class c_nvmlClockOffset_t(_PrintableStructure):
+    _fields_ = ...
+
+nvmlClockOffset_v1 = ...
+
+def nvmlDeviceGetClockOffsets(device, info):  # -> Literal[0]:
+    ...
+def nvmlDeviceSetClockOffsets(device, info):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetSupportedPerformanceStates(device):  # -> list[Any]:
+    ...
+def nvmlDeviceGetGpcClkVfOffset(device) -> int: ...
+def nvmlDeviceSetGpcClkVfOffset(device, offset):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetGpcClkMinMaxVfOffset(
+    device, minOffset=..., maxOffset=...
+):  # -> tuple[int, int] | Literal[0]:
+    ...
+def nvmlDeviceGetMemClkVfOffset(device) -> int: ...
+def nvmlDeviceSetMemClkVfOffset(device, offset):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetMemClkMinMaxVfOffset(
+    device, minOffset=..., maxOffset=...
+):  # -> tuple[int, int] | Literal[0]:
+    ...
+def nvmlSystemSetConfComputeGpusReadyState(state):  # -> Literal[0]:
+    ...
+def nvmlSystemGetConfComputeGpusReadyState() -> int: ...
+def nvmlSystemGetConfComputeCapabilities():  # -> c_nvmlConfComputeSystemCaps_t:
+    ...
+def nvmlSystemGetConfComputeState():  # -> c_nvmlConfComputeSystemState_t:
+    ...
+def nvmlSystemGetConfComputeSettings(settings): ...
+def nvmlDeviceSetConfComputeUnprotectedMemSize(device, c_ccMemSize):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetConfComputeMemSizeInfo(device):  # -> c_nvmlConfComputeMemSizeInfo_t:
+    ...
+def nvmlDeviceGetConfComputeProtectedMemoryUsage(device):  # -> c_nvmlMemory_t:
+    ...
+def nvmlDeviceGetConfComputeGpuCertificate(
+    device,
+):  # -> c_nvmlConfComputeGpuCertificate_t:
+    ...
+def nvmlDeviceGetConfComputeGpuAttestationReport(
+    device, c_nonce
+):  # -> c_nvmlConfComputeGpuAttestationReport_t:
+    ...
+def nvmlSystemSetConfComputeKeyRotationThresholdInfo(max_atk_adv):  # -> Literal[0]:
+    ...
+def nvmlSystemGetConfComputeKeyRotationThresholdInfo():  # -> c_nvmlConfComputeGetKeyRotationThresholdInfo_t:
+    ...
+
+NVML_GPM_METRIC_GRAPHICS_UTIL = ...
+NVML_GPM_METRIC_SM_UTIL = ...
+NVML_GPM_METRIC_SM_OCCUPANCY = ...
+NVML_GPM_METRIC_INTEGER_UTIL = ...
+NVML_GPM_METRIC_ANY_TENSOR_UTIL = ...
+NVML_GPM_METRIC_DFMA_TENSOR_UTIL = ...
+NVML_GPM_METRIC_HMMA_TENSOR_UTIL = ...
+NVML_GPM_METRIC_DMMA_TENSOR_UTIL = ...
+NVML_GPM_METRIC_IMMA_TENSOR_UTIL = ...
+NVML_GPM_METRIC_DRAM_BW_UTIL = ...
+NVML_GPM_METRIC_FP64_UTIL = ...
+NVML_GPM_METRIC_FP32_UTIL = ...
+NVML_GPM_METRIC_FP16_UTIL = ...
+NVML_GPM_METRIC_PCIE_TX_PER_SEC = ...
+NVML_GPM_METRIC_PCIE_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVDEC_0_UTIL = ...
+NVML_GPM_METRIC_NVDEC_1_UTIL = ...
+NVML_GPM_METRIC_NVDEC_2_UTIL = ...
+NVML_GPM_METRIC_NVDEC_3_UTIL = ...
+NVML_GPM_METRIC_NVDEC_4_UTIL = ...
+NVML_GPM_METRIC_NVDEC_5_UTIL = ...
+NVML_GPM_METRIC_NVDEC_6_UTIL = ...
+NVML_GPM_METRIC_NVDEC_7_UTIL = ...
+NVML_GPM_METRIC_NVJPG_0_UTIL = ...
+NVML_GPM_METRIC_NVJPG_1_UTIL = ...
+NVML_GPM_METRIC_NVJPG_2_UTIL = ...
+NVML_GPM_METRIC_NVJPG_3_UTIL = ...
+NVML_GPM_METRIC_NVJPG_4_UTIL = ...
+NVML_GPM_METRIC_NVJPG_5_UTIL = ...
+NVML_GPM_METRIC_NVJPG_6_UTIL = ...
+NVML_GPM_METRIC_NVJPG_7_UTIL = ...
+NVML_GPM_METRIC_NVOFA_0_UTIL = ...
+NVML_GPM_METRIC_NVOFA_1_UTIL = ...
+NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC = ...
+NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK0_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK0_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK0_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK0_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK1_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK1_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK1_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK1_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK2_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK2_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK2_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK2_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK3_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK3_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK3_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK3_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK4_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK4_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK4_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK4_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK5_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK5_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK5_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK5_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK6_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK6_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK6_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK6_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK7_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK7_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK7_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK7_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK8_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK8_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK8_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK8_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK9_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK9_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK9_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK9_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK10_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK10_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK10_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK10_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK11_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK11_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK11_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK11_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK12_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK12_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK12_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK12_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK13_TOTAL_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK13_TOTAL_RX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK13_DATA_TX_PER_SEC = ...
+NVML_GPM_METRIC_C2C_LINK13_DATA_RX_PER_SEC = ...
+NVML_GPM_METRIC_HOSTMEM_CACHE_HIT = ...
+NVML_GPM_METRIC_HOSTMEM_CACHE_MISS = ...
+NVML_GPM_METRIC_PEERMEM_CACHE_HIT = ...
+NVML_GPM_METRIC_PEERMEM_CACHE_MISS = ...
+NVML_GPM_METRIC_DRAM_CACHE_HIT = ...
+NVML_GPM_METRIC_DRAM_CACHE_MISS = ...
+NVML_GPM_METRIC_NVENC_0_UTIL = ...
+NVML_GPM_METRIC_NVENC_1_UTIL = ...
+NVML_GPM_METRIC_NVENC_2_UTIL = ...
+NVML_GPM_METRIC_NVENC_3_UTIL = ...
+NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR0_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR0_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR0_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR1_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR1_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR1_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR2_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR2_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR2_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR3_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR3_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR3_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR4_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR4_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR4_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR5_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR5_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR5_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR6_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR6_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR6_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_GR7_CTXSW_REQUESTS = ...
+NVML_GPM_METRIC_GR7_CTXSW_CYCLES_PER_REQ = ...
+NVML_GPM_METRIC_GR7_CTXSW_ACTIVE_PCT = ...
+NVML_GPM_METRIC_SM_CYCLES_ELAPSED = ...
+NVML_GPM_METRIC_SM_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_MMA_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_DMMA_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_HMMA_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_IMMA_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_DFMA_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_PCIE_TX = ...
+NVML_GPM_METRIC_PCIE_RX = ...
+NVML_GPM_METRIC_INTEGER_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_FP64_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_FP32_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_FP16_CYCLES_ACTIVE = ...
+NVML_GPM_METRIC_NVLINK_L0_RX = ...
+NVML_GPM_METRIC_NVLINK_L0_TX = ...
+NVML_GPM_METRIC_NVLINK_L1_RX = ...
+NVML_GPM_METRIC_NVLINK_L1_TX = ...
+NVML_GPM_METRIC_NVLINK_L2_RX = ...
+NVML_GPM_METRIC_NVLINK_L2_TX = ...
+NVML_GPM_METRIC_NVLINK_L3_RX = ...
+NVML_GPM_METRIC_NVLINK_L3_TX = ...
+NVML_GPM_METRIC_NVLINK_L4_RX = ...
+NVML_GPM_METRIC_NVLINK_L4_TX = ...
+NVML_GPM_METRIC_NVLINK_L5_RX = ...
+NVML_GPM_METRIC_NVLINK_L5_TX = ...
+NVML_GPM_METRIC_NVLINK_L6_RX = ...
+NVML_GPM_METRIC_NVLINK_L6_TX = ...
+NVML_GPM_METRIC_NVLINK_L7_RX = ...
+NVML_GPM_METRIC_NVLINK_L7_TX = ...
+NVML_GPM_METRIC_NVLINK_L8_RX = ...
+NVML_GPM_METRIC_NVLINK_L8_TX = ...
+NVML_GPM_METRIC_NVLINK_L9_RX = ...
+NVML_GPM_METRIC_NVLINK_L9_TX = ...
+NVML_GPM_METRIC_NVLINK_L10_RX = ...
+NVML_GPM_METRIC_NVLINK_L10_TX = ...
+NVML_GPM_METRIC_NVLINK_L11_RX = ...
+NVML_GPM_METRIC_NVLINK_L11_TX = ...
+NVML_GPM_METRIC_NVLINK_L12_RX = ...
+NVML_GPM_METRIC_NVLINK_L12_TX = ...
+NVML_GPM_METRIC_NVLINK_L13_RX = ...
+NVML_GPM_METRIC_NVLINK_L13_TX = ...
+NVML_GPM_METRIC_NVLINK_L14_RX = ...
+NVML_GPM_METRIC_NVLINK_L14_TX = ...
+NVML_GPM_METRIC_NVLINK_L15_RX = ...
+NVML_GPM_METRIC_NVLINK_L15_TX = ...
+NVML_GPM_METRIC_NVLINK_L16_RX = ...
+NVML_GPM_METRIC_NVLINK_L16_TX = ...
+NVML_GPM_METRIC_NVLINK_L17_RX = ...
+NVML_GPM_METRIC_NVLINK_L17_TX = ...
+NVML_GPM_METRIC_MAX = ...
+
+class c_nvmlUnitInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+class struct_c_nvmlGpmSample_t(Structure): ...
+
+c_nvmlGpmSample_t = ...
+
+class c_metricInfo_t(Structure):
+    _fields_ = ...
+
+class c_nvmlGpmMetric_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlGpmMetricsGet_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_GPM_METRICS_GET_VERSION = ...
+
+class c_nvmlGpmSupport_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_GPM_SUPPORT_VERSION = ...
+
+def nvmlGpmMetricsGet(metricsGet): ...
+def nvmlGpmSampleFree(gpmSample) -> None: ...
+def nvmlGpmSampleAlloc():  # -> _Pointer[struct_c_nvmlGpmSample_t]:
+    ...
+def nvmlGpmSampleGet(device, gpmSample): ...
+def nvmlGpmMigSampleGet(device, gpuInstanceId, gpmSample): ...
+def nvmlGpmQueryDeviceSupport(device):  # -> c_nvmlGpmSupport_t:
+    ...
+def nvmlGpmSetStreamingEnabled(device, state):  # -> Literal[0]:
+    ...
+def nvmlGpmQueryIfStreamingEnabled(device) -> int: ...
+
+NVML_NVLINK_POWER_STATE_HIGH_SPEED = ...
+NVML_NVLINK_POWER_STATE_LOW = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_MIN = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_MAX = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_RESET = ...
+NVML_NVLINK_LOW_POWER_THRESHOLD_DEFAULT = ...
+
+class c_nvmlNvLinkPowerThres_t(Structure):
+    _fields_ = ...
+
+def nvmlDeviceSetNvLinkDeviceLowPowerThreshold(device, l1threshold):  # -> Literal[0]:
+    ...
+
+NVML_GPU_FABRIC_UUID_LEN = ...
+_nvmlGpuFabricState_t = c_uint
+NVML_GPU_FABRIC_STATE_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_STATE_NOT_STARTED = ...
+NVML_GPU_FABRIC_STATE_IN_PROGRESS = ...
+NVML_GPU_FABRIC_STATE_COMPLETED = ...
+
+class c_nvmlGpuFabricInfo_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_DEGRADED_BW = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_DEGRADED_BW = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_TRUE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_FALSE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_RECOVERY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_RECOVERY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_TRUE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_FALSE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_UNHEALTHY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_UNHEALTHY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_TRUE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_FALSE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ACCESS_TIMEOUT_RECOVERY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ACCESS_TIMEOUT_RECOVERY = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NONE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_SYSGUID = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_CHASSIS_SN = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NO_PARTITION = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INSUFFICIENT_NVLINKS = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCOMPATIBLE_GPU_FW = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIURATION_INVALID_LOCATION = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INVALID_LOCATION = ...
+NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_GPU_STATE_INVALID = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_INCORRECT_CONFIGURATION = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_INCORRECT_CONFIGURATION = ...
+NVML_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_TRUE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_FALSE = ...
+NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_PARTITION_ASSIGNED = ...
+NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_PARTITION_ASSIGNED = ...
+NVML_GPU_FABRIC_HEALTH_SUMMARY_NOT_SUPPORTED = ...
+NVML_GPU_FABRIC_HEALTH_SUMMARY_HEALTHY = ...
+NVML_GPU_FABRIC_HEALTH_SUMMARY_UNHEALTHY = ...
+NVML_GPU_FABRIC_HEALTH_SUMMARY_LIMITED_CAPACITY = ...
+nvmlGpuFabricInfo_v2 = ...
+
+class c_nvmlGpuFabricInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+c_nvmlGpuFabricInfoV_t = c_nvmlGpuFabricInfo_v2_t
+
+class c_nvmlGpuFabricInfo_v3_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlGpuFabricInfo_v3 = ...
+
+def nvmlDeviceGetGpuFabricInfo(device, gpuFabricInfo):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetGpuFabricInfoV(device, gpuFabricInfo):  # -> Literal[0]:
+    ...
+
+NVML_GPU_NVLINK_BW_MODE_FULL = ...
+NVML_GPU_NVLINK_BW_MODE_OFF = ...
+NVML_GPU_NVLINK_BW_MODE_MIN = ...
+NVML_GPU_NVLINK_BW_MODE_HALF = ...
+NVML_GPU_NVLINK_BW_MODE_3QUARTER = ...
+NVML_GPU_NVLINK_BW_MODE_COUNT = ...
+
+def nvmlSystemSetNvlinkBwMode(mode):  # -> Literal[0]:
+    ...
+def nvmlSystemGetNvlinkBwMode() -> int: ...
+
+_nvmlPowerScopeType_t = c_uint
+NVML_POWER_SCOPE_GPU = ...
+NVML_POWER_SCOPE_MODULE = ...
+NVML_POWER_SCOPE_MEMORY = ...
+
+class c_nvmlPowerValue_v2_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+
+nvmlPowerValue_v2 = ...
+
+def nvmlDeviceSetPowerManagementLimit_v2(
+    device, powerScope, powerLimit, version=...
+):  # -> Literal[0]:
+    ...
+
+class c_nvmlEccSramErrorStatus_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlEccSramErrorStatus_v1 = ...
+
+def nvmlDeviceGetSramEccErrorStatus(device, status):  # -> Literal[0]:
+    ...
+
+NVML_DEV_CAP_EGM = ...
+nvmlDeviceCapabilities_v1 = ...
+
+class c_nvmlDeviceCapabilities_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+def nvmlDeviceGetCapabilities(device, caps): ...
+
+class c_nvmlPlatformInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+class c_nvmlPlatformInfo_v2_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlPlatformInfo_v1 = ...
+nvmlPlatformInfo_v2 = ...
+
+def nvmlDeviceGetPlatformInfo(device, platformInfo):  # -> Literal[0]:
+    ...
+
+NVML_DEVICE_HOSTNAME_BUFFER_SIZE = ...
+
+class c_nvmlHostname_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlMask255_t(_PrintableStructure):
+    _fields_ = ...
+
+NVML_WORKLOAD_POWER_MAX_PROFILES = ...
+NVML_POWER_PROFILE_MAX_P = ...
+NVML_POWER_PROFILE_MAX_Q = ...
+NVML_POWER_PROFILE_COMPUTE = ...
+NVML_POWER_PROFILE_MEMORY_BOUND = ...
+NVML_POWER_PROFILE_NETWORK = ...
+NVML_POWER_PROFILE_BALANCED = ...
+NVML_POWER_PROFILE_LLM_INFERENCE = ...
+NVML_POWER_PROFILE_LLM_TRAINING = ...
+NVML_POWER_PROFILE_RBM = ...
+NVML_POWER_PROFILE_DCPCIE = ...
+NVML_POWER_PROFILE_HMMA_SPARSE = ...
+NVML_POWER_PROFILE_HMMA_DENSE = ...
+NVML_POWER_PROFILE_SYNC_BALANCED = ...
+NVML_POWER_PROFILE_HPC = ...
+NVML_POWER_PROFILE_MIG = ...
+NVML_POWER_PROFILE_MAX = ...
+nvmlWorkloadPowerProfileInfo_v1 = ...
+
+class c_nvmlWorkloadPowerProfileInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlWorkloadPowerProfileProfilesInfo_v1 = ...
+
+class c_nvmlWorkloadPowerProfileProfilesInfo_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlWorkloadPowerProfileCurrentProfiles_v1 = ...
+
+class c_nvmlWorkloadPowerProfileCurrentProfiles_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlWorkloadPowerProfileRequestedProfiles_v1 = ...
+
+class c_nvmlWorkloadPowerProfileRequestedProfiles_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+NVML_POWER_PROFILE_OPERATION_CLEAR = ...
+NVML_POWER_PROFILE_OPERATION_SET = ...
+NVML_POWER_PROFILE_OPERATION_SET_AND_OVERWRITE = ...
+NVML_POWER_PROFILE_OPERATION_MAX = ...
+nvmlWorkloadPowerProfileUpdateProfiles_v1 = ...
+
+class c_nvmlWorkloadPowerProfileUpdateProfiles_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+def nvmlDeviceWorkloadPowerProfileGetProfilesInfo(
+    device, profilesInfo
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceWorkloadPowerProfileGetCurrentProfiles(
+    device, currentProfiles
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceWorkloadPowerProfileSetRequestedProfiles(
+    device, requestedProfiles
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceWorkloadPowerProfileClearRequestedProfiles(
+    device, requestedProfiles
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceWorkloadPowerProfileUpdateProfiles_v1(
+    device, updateProfiles
+):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetNvlinkSupportedBwModes(device, supportedBwModes):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetNvlinkBwMode(device, getBwMode):  # -> Literal[0]:
+    ...
+def nvmlDeviceSetNvlinkBwMode(device, setBwMode):  # -> Literal[0]:
+    ...
+
+nvmlDramEncryptionInfo_v1 = ...
+
+class c_nvmlDramEncryptionInfo_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+def nvmlDeviceGetDramEncryptionMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> list[<subclass of bytes and str> | str | Any]:
+    ...
+def nvmlDeviceGetCurrentDramEncryptionMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetPendingDramEncryptionMode(
+    handle: _Pointer[struct_c_nvmlDevice_t],
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceSetDramEncryptionMode(
+    handle: _Pointer[struct_c_nvmlDevice_t], mode
+) -> None: ...
+
+NVML_POWER_SMOOTHING_NUM_PROFILE_PARAMS = ...
+NVML_POWER_SMOOTHING_MAX_NUM_PROFILES = ...
+NVML_POWER_SMOOTHING_ADMIN_OVERRIDE_NOT_SET = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_PERCENT_TMP_FLOOR = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_UP_RATE = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_RATE = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_HYSTERESIS = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_SECONDARY_POWER_FLOOR = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_PRIMARY_FLOOR_ACT_WIN_MULT = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_PRIMARY_FLOOR_TAR_WIN_MULT = ...
+NVML_POWER_SMOOTHING_PROFILE_PARAM_PRIMARY_FLOOR_ACT_OFFSET = ...
+nvmlPowerSmoothingState_v1 = ...
+
+class c_nvmlPowerSmoothingState_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlPowerSmoothingProfile_v1 = ...
+
+class c_nvmlPowerSmoothingProfile_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+def nvmlDevicePowerSmoothingActivatePresetProfile(device, profile) -> None: ...
+def nvmlDevicePowerSmoothingUpdatePresetProfileParam(device, profile) -> None: ...
+def nvmlDevicePowerSmoothingSetState(device, state) -> None: ...
+
+class c_nvmlEccSramUniqueUncorrectedErrorEntry_v1_t(_PrintableStructure):
+    _fields_ = ...
+
+class c_nvmlEccSramUniqueUncorrectedErrorCounts_v1_t(_PrintableStructure):
+    _fields_ = ...
+    def __init__(self) -> None: ...
+
+nvmlEccSramUniqueUncorrectedErrorCounts_v1 = ...
+
+def nvmlDeviceGetSramUniqueUncorrectedEccErrorCounts(device, counts):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetPdi(device):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetNvLinkInfo(device, info):  # -> Literal[0]:
+    ...
+def nvmlDeviceGetRepairStatus(
+    device,
+):  # -> list[<subclass of bytes and str> | str | Any]:
+    ...
+@convertStrBytes
+def nvmlDeviceSetHostname_v1(device, hostname) -> None: ...
+def nvmlDeviceGetHostname_v1(device):  # -> <subclass of bytes and str> | str | Any:
+    ...
+def nvmlDeviceGetUnrepairableMemoryFlag_v1(
+    device,
+):  # -> <subclass of bytes and str> | str | Any:
+    ...
+
+NVML_RUSD_POLL_NONE = ...
+NVML_RUSD_POLL_CLOCK = ...
+NVML_RUSD_POLL_PERF = ...
+NVML_RUSD_POLL_MEMORY = ...
+NVML_RUSD_POLL_POWER = ...
+NVML_RUSD_POLL_THERMAL = ...
+NVML_RUSD_POLL_PCI = ...
+NVML_RUSD_POLL_FAN = ...
+NVML_RUSD_POLL_PROC_UTIL = ...
+NVML_RUSD_POLL_ALL = ...
+nvmlRusdSettings_v1 = ...
+
+class c_nvmlRusdSettings_v1_t(_PrintableStructure):
+    _fields_ = ...
+    _fmt_ = ...
+    def __init__(self) -> None: ...
+
+def nvmlDeviceSetRusdSettings_v1(device, settings) -> None: ...
diff --git a/.mlx_typings/safetensors/__init__.pyi b/.typings/safetensors/__init__.pyi
similarity index 100%
rename from .mlx_typings/safetensors/__init__.pyi
rename to .typings/safetensors/__init__.pyi
diff --git a/pyproject.toml b/pyproject.toml
index 570aba3b..9309a81f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -160,7 +160,7 @@ exclude = [
   "**/rust",
   "**/.github",
 ]
-stubPath = ".mlx_typings"
+stubPath = ".typings"
 
 [[tool.basedpyright.executionEnvironments]]
 root = "src/exo/worker/engines/image"
@@ -240,11 +240,7 @@ torchaudio = ["torch"]
 ###
 
 [tool.ruff]
-extend-exclude = [
-  "*mlx_typings/**",
-  "rust/exo_pyo3_bindings/**",
-  "bench/vendor/**",
-]
+extend-exclude = [".typings/**", "rust/exo_pyo3_bindings/**", "bench/vendor/**"]
 
 [tool.ruff.lint]
 extend-select = ["I", "N", "B", "A", "PIE", "SIM"]
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-4bit.toml b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-4bit.toml
index 1e0c0e10..0848f027 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-4bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-4bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "4bit"
 base_model = "FLUX.1 Kontext"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 15475325472
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-8bit.toml b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-8bit.toml
index e2020718..0c142241 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-8bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev-8bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "8bit"
 base_model = "FLUX.1 Kontext"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 21426029632
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev.toml b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev.toml
index 14cdf270..1087a2cf 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Kontext-dev.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = ""
 base_model = "FLUX.1 Kontext"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 33327437952
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-4bit.toml b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-4bit.toml
index fd9d8608..5ccd4a41 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-4bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-4bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "4bit"
 base_model = "FLUX.1 Krea"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 15475325472
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-8bit.toml b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-8bit.toml
index 1d9221a7..288b3949 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-8bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev-8bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "8bit"
 base_model = "FLUX.1 Krea"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 21426029632
diff --git a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev.toml b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev.toml
index 516fdb88..4b3e898d 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-Krea-dev.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-Krea-dev.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = ""
 base_model = "FLUX.1 Krea"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 33327437952
diff --git a/resources/image_model_cards/exolabs--FLUX.1-dev-4bit.toml b/resources/image_model_cards/exolabs--FLUX.1-dev-4bit.toml
index 82b03bad..7bfc489c 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-dev-4bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-dev-4bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "4bit"
 base_model = "FLUX.1 Dev"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 15475325472
diff --git a/resources/image_model_cards/exolabs--FLUX.1-dev-8bit.toml b/resources/image_model_cards/exolabs--FLUX.1-dev-8bit.toml
index e35629d8..52f6dba5 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-dev-8bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-dev-8bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "8bit"
 base_model = "FLUX.1 Dev"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 21426029632
diff --git a/resources/image_model_cards/exolabs--FLUX.1-dev.toml b/resources/image_model_cards/exolabs--FLUX.1-dev.toml
index 44e5533d..39953de0 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-dev.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-dev.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = ""
 base_model = "FLUX.1 Dev"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 33327437952
diff --git a/resources/image_model_cards/exolabs--FLUX.1-schnell-4bit.toml b/resources/image_model_cards/exolabs--FLUX.1-schnell-4bit.toml
index 4d6f97b8..c51bb2d7 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-schnell-4bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-schnell-4bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "4bit"
 base_model = "FLUX.1 Schnell"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 15470210592
diff --git a/resources/image_model_cards/exolabs--FLUX.1-schnell-8bit.toml b/resources/image_model_cards/exolabs--FLUX.1-schnell-8bit.toml
index 56b2faeb..634a9403 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-schnell-8bit.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-schnell-8bit.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = "8bit"
 base_model = "FLUX.1 Schnell"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 21415799872
diff --git a/resources/image_model_cards/exolabs--FLUX.1-schnell.toml b/resources/image_model_cards/exolabs--FLUX.1-schnell.toml
index efb08522..4cd6a525 100644
--- a/resources/image_model_cards/exolabs--FLUX.1-schnell.toml
+++ b/resources/image_model_cards/exolabs--FLUX.1-schnell.toml
@@ -7,6 +7,7 @@ family = "flux"
 quantization = ""
 base_model = "FLUX.1 Schnell"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 33306978432
diff --git a/resources/image_model_cards/exolabs--Qwen-Image-4bit.toml b/resources/image_model_cards/exolabs--Qwen-Image-4bit.toml
index b11765a1..16175cc1 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image-4bit.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image-4bit.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = "4bit"
 base_model = "Qwen Image"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 26799533856
diff --git a/resources/image_model_cards/exolabs--Qwen-Image-8bit.toml b/resources/image_model_cards/exolabs--Qwen-Image-8bit.toml
index 64f2b55a..76d10765 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image-8bit.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image-8bit.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = "8bit"
 base_model = "Qwen Image"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 37014734400
diff --git a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-4bit.toml b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-4bit.toml
index 13992cbe..80e9d8e5 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-4bit.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-4bit.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = "4bit"
 base_model = "Qwen Image Edit"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 26799533856
diff --git a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-8bit.toml b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-8bit.toml
index 60b7e3dd..ce7d6e20 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-8bit.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509-8bit.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = "8bit"
 base_model = "Qwen Image Edit"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 37014734400
diff --git a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509.toml b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509.toml
index 9c68b221..81fcb3ae 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image-Edit-2509.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = ""
 base_model = "Qwen Image Edit"
 capabilities = ["image_edit"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 57445135488
diff --git a/resources/image_model_cards/exolabs--Qwen-Image.toml b/resources/image_model_cards/exolabs--Qwen-Image.toml
index 5a86ccfe..734a8d0b 100644
--- a/resources/image_model_cards/exolabs--Qwen-Image.toml
+++ b/resources/image_model_cards/exolabs--Qwen-Image.toml
@@ -8,6 +8,7 @@ family = "qwen-image"
 quantization = ""
 base_model = "Qwen Image"
 capabilities = ["image_gen"]
+backends = ["MlxMetal"]
 
 [storage_size]
 in_bytes = 57445135488
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-4bit.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-4bit.toml
index a8d578f6..39dba047 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-4bit.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 405874409472
 
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-8bit.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-8bit.toml
index 4989cb3a..372aabaf 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V3.1-8bit.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 765577920512
 
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-4bit.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-4bit.toml
index d5d24d22..071d8e61 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-4bit.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "tool_conditional"
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 378086226621
 
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-8bit.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-8bit.toml
index 600639cd..6f733723 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V3.2-8bit.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "tool_conditional"
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 755957120916
 
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V4-Flash.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V4-Flash.toml
index e1b43f39..c4f64474 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V4-Flash.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V4-Flash.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "tool_conditional"
 
 context_length = 1048576
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 155095760030
 
diff --git a/resources/inference_model_cards/mlx-community--DeepSeek-V4-Pro.toml b/resources/inference_model_cards/mlx-community--DeepSeek-V4-Pro.toml
index 80dbf55c..00dd3e66 100644
--- a/resources/inference_model_cards/mlx-community--DeepSeek-V4-Pro.toml
+++ b/resources/inference_model_cards/mlx-community--DeepSeek-V4-Pro.toml
@@ -11,7 +11,7 @@ capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "tool_conditional"
 
 context_length = 1048576
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 849681803879
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.5-Air-8bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.5-Air-8bit.toml
index 0c9f5e08..63b9ee4e 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.5-Air-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.5-Air-8bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.5 Air"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 122406567936
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.5-Air-bf16.toml b/resources/inference_model_cards/mlx-community--GLM-4.5-Air-bf16.toml
index d92a102a..489d0100 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.5-Air-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.5-Air-bf16.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.5 Air"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 229780750336
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-4bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-4bit.toml
index ce75f1c2..4a10e257 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-4bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 198556925568
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-6bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-6bit.toml
index 247dcb0b..108cab88 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-6bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 286737579648
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-8bit-gs32.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-8bit-gs32.toml
index 314a0888..6fead9cf 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-8bit-gs32.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-8bit-gs32.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 396963397248
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-4bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-4bit.toml
index be6ccf92..47e56efd 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-4bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 19327352832
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-5bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-5bit.toml
index 5f1c8dea..fc685138 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-5bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-5bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 22548578304
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-6bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-6bit.toml
index 36e96616..75f2aca0 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-6bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 26843545600
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-8bit.toml b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-8bit.toml
index 233d54c2..83aef821 100644
--- a/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-4.7-Flash-8bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM 4.7 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 34359738368
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5-8bit.toml b/resources/inference_model_cards/mlx-community--GLM-5-8bit.toml
index 6a5bda1c..0798598b 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5-8bit.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 790517400864
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5-MXFP4-Q8.toml b/resources/inference_model_cards/mlx-community--GLM-5-MXFP4-Q8.toml
index 1e1ac0a0..69272d25 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5-MXFP4-Q8.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5-MXFP4-Q8.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 405478939008
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5-bf16.toml b/resources/inference_model_cards/mlx-community--GLM-5-bf16.toml
index 035388c6..05c0e457 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5-bf16.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 1487822475264
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5.1-DQ4plus-q8.toml b/resources/inference_model_cards/mlx-community--GLM-5.1-DQ4plus-q8.toml
index 09749554..c92ffd25 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5.1-DQ4plus-q8.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5.1-DQ4plus-q8.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5.1"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 465173655552
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5.1-MXFP4-Q8.toml b/resources/inference_model_cards/mlx-community--GLM-5.1-MXFP4-Q8.toml
index 81392a6a..8230d2fd 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5.1-MXFP4-Q8.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5.1-MXFP4-Q8.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5.1"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 405480321024
 
diff --git a/resources/inference_model_cards/mlx-community--GLM-5.1.toml b/resources/inference_model_cards/mlx-community--GLM-5.1.toml
index 1239794e..a59dddfb 100644
--- a/resources/inference_model_cards/mlx-community--GLM-5.1.toml
+++ b/resources/inference_model_cards/mlx-community--GLM-5.1.toml
@@ -10,7 +10,7 @@ base_model = "GLM-5.1"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 202752
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 1487822475264
 
diff --git a/resources/inference_model_cards/mlx-community--Kimi-K2-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Kimi-K2-Instruct-4bit.toml
index 23b2a572..f8ad022c 100644
--- a/resources/inference_model_cards/mlx-community--Kimi-K2-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Kimi-K2-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Kimi K2"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 620622774272
 
diff --git a/resources/inference_model_cards/mlx-community--Kimi-K2-Thinking.toml b/resources/inference_model_cards/mlx-community--Kimi-K2-Thinking.toml
index 15206c88..cccffb5d 100644
--- a/resources/inference_model_cards/mlx-community--Kimi-K2-Thinking.toml
+++ b/resources/inference_model_cards/mlx-community--Kimi-K2-Thinking.toml
@@ -10,7 +10,7 @@ base_model = "Kimi K2"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "suffix"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 706522120192
 
diff --git a/resources/inference_model_cards/mlx-community--Kimi-K2.5.toml b/resources/inference_model_cards/mlx-community--Kimi-K2.5.toml
index 7460d91e..69e17d4e 100644
--- a/resources/inference_model_cards/mlx-community--Kimi-K2.5.toml
+++ b/resources/inference_model_cards/mlx-community--Kimi-K2.5.toml
@@ -10,7 +10,7 @@ base_model = "Kimi K2.5"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "suffix"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 662498705408
 
diff --git a/resources/inference_model_cards/mlx-community--Kimi-K2.6-mlx-DQ3_K_M-q8.toml b/resources/inference_model_cards/mlx-community--Kimi-K2.6-mlx-DQ3_K_M-q8.toml
index 2571a660..b2444d7d 100644
--- a/resources/inference_model_cards/mlx-community--Kimi-K2.6-mlx-DQ3_K_M-q8.toml
+++ b/resources/inference_model_cards/mlx-community--Kimi-K2.6-mlx-DQ3_K_M-q8.toml
@@ -10,7 +10,7 @@ base_model = "Kimi K2.6"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "suffix"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 470628683776
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-4bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-4bit.toml
index f8663f1b..96ea196b 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-4bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-70B-Instruct"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 39688355840
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-8bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-8bit.toml
index 71a75024..67056553 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-8bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-70B-Instruct"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 74964549632
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-bf16.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-bf16.toml
index 03185ccc..531ab7a7 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-70B-Instruct-HF-bf16.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-70B-Instruct"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 141107412992
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-4bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-4bit.toml
index 8c409ed5..6d355ea9 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-4bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-Nano-4B-v1.1"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 2538706944
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-8bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-8bit.toml
index aa0aaffc..98aa0604 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-8bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-Nano-4B-v1.1"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 4794980352
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-bf16.toml b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-bf16.toml
index 2266392e..c479bafa 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.1-Nemotron-Nano-4B-v1.1-bf16.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Llama-3.1-Nemotron-Nano-4B-v1.1"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 9025492992
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.2-1B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.2-1B-Instruct-4bit.toml
index c10c53f1..4a70c63a 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.2-1B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.2-1B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.2 1B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 729808896
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-4bit.toml
index 3ceeee79..9e21b131 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.2 3B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 1863319552
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-8bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-8bit.toml
index 66c88e2a..b3deee1b 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.2-3B-Instruct-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.2 3B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 3501195264
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-4bit.toml
index 73b4e32a..cd2d9600 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.3 70B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 40652242944
 
diff --git a/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-8bit.toml b/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-8bit.toml
index 285156d7..0ffae4af 100644
--- a/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Llama-3.3-70B-Instruct-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.3 70B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 76799803392
 
diff --git a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-70B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-70B-Instruct-4bit.toml
index 214a5fa9..5a2d14db 100644
--- a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-70B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-70B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.1 70B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 40652242944
 
diff --git a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-4bit.toml
index 551c7052..cfa7e57b 100644
--- a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.1 8B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 4637851648
 
diff --git a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-8bit.toml b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-8bit.toml
index 7ac95f17..eb2163a9 100644
--- a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.1 8B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 8954839040
 
diff --git a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-bf16.toml b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-bf16.toml
index cea334f8..4caefc14 100644
--- a/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Meta-Llama-3.1-8B-Instruct-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.1 8B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 16882073600
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.1-3bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.1-3bit.toml
index d0351b24..0865a464 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.1-3bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.1-3bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.1"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 100086644736
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.1-8bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.1-8bit.toml
index 86d6de2d..997a89bf 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.1-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.1-8bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.1"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 242986745856
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-4bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-4bit.toml
index f57b4d74..75e741d0 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-4bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 128666664960
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-6bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-6bit.toml
index 824801b9..6bf42d8b 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-6bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 185826705408
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-8bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-8bit.toml
index 9588abc9..aa645794 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.5-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.5-8bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.5"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 242986745856
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit-mxfp4.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit-mxfp4.toml
index 7dd6e942..2759c97f 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit-mxfp4.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit-mxfp4.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 121537496794
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit.toml
index d06cfa7b..8d1a5ad2 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-4bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 128682598717
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-5bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-5bit.toml
index e0f09cf6..3897cc9f 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-5bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-5bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 157262619651
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-6bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-6bit.toml
index 49c4685d..bac8ae30 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-6bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 185842639299
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-8bit.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-8bit.toml
index 6d62934a..97ce9a75 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7-8bit.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 243002680786
 
diff --git a/resources/inference_model_cards/mlx-community--MiniMax-M2.7.toml b/resources/inference_model_cards/mlx-community--MiniMax-M2.7.toml
index 478df79b..e5acfbda 100644
--- a/resources/inference_model_cards/mlx-community--MiniMax-M2.7.toml
+++ b/resources/inference_model_cards/mlx-community--MiniMax-M2.7.toml
@@ -10,7 +10,7 @@ base_model = "MiniMax M2.7"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "post_last_user"
 context_length = 196608
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 457492783366
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4Bit.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4Bit.toml
index fb032101..840905fa 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4Bit.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4Bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 17775342336
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-5Bit.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-5Bit.toml
index 3b2b15c0..99baffb1 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-5Bit.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-5Bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 21721476864
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-6Bit.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-6Bit.toml
index c2a193d9..47449c7e 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-6Bit.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-6Bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 25667611392
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8Bit.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8Bit.toml
index 7ba87193..785c62f3 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8Bit.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8Bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 33559880448
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-BF16.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-BF16.toml
index d7223a6b..688bf8c6 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-BF16.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-BF16.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 63155889408
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-MXFP4.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-MXFP4.toml
index 033cb9fc..9fa62538 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-MXFP4.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-MXFP4.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 16788808704
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4.toml
index 2858cd1f..d590c794 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-3-Nano-30B-A3B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 19323906944
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-4bits.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-4bits.toml
index a834e1aa..3e3eaa08 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-4bits.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-4bits.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-Nano-9B-v2"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 5002791936
 
diff --git a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-6bit.toml b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-6bit.toml
index ec59e5a0..d06f09d0 100644
--- a/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--NVIDIA-Nemotron-Nano-9B-v2-6bit.toml
@@ -9,7 +9,7 @@ base_model = "NVIDIA Nemotron-Nano-9B-v2"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 7224298496
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-0.6B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-0.6B-4bit.toml
index cf44e9c1..efb96e5d 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-0.6B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-0.6B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 0.6B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 32768
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 342884352
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-0.6B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-0.6B-8bit.toml
index 6061fc49..4c959ebc 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-0.6B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-0.6B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 0.6B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 32768
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 698351616
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-4bit.toml
index 430b985c..ed5506c6 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 235B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 141733920768
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-8bit.toml
index 8b3df97e..2e52ee9d 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-235B-A22B-Instruct-2507-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 235B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 268435456000
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-4bit.toml
index 13951adc..42678d4a 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 30B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 32768
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 17612931072
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-8bit.toml
index 4a4db8e2..026de660 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-30B-A3B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 30B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 32768
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 33279705088
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-4bit.toml
index 26236ff8..62b25b48 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder 480B"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 289910292480
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-8bit.toml
index 4f145936..5efe672b 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-480B-A35B-Instruct-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder 480B"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 579820584960
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-4bit.toml
index 5130447d..d692f7dc 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder Next"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 45644286500
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-5bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-5bit.toml
index b33d2427..4127b434 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-5bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-5bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder Next"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 57657697020
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-6bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-6bit.toml
index fc46f271..e89d91db 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder Next"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 68899327465
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-8bit.toml
index 967bfea6..8ecf357f 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder Next"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 89357758772
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-bf16.toml b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-bf16.toml
index e1c5acac..73c32b0e 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Coder-Next-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Coder Next"
 capabilities = ["text", "code"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 157548627945
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-4bit.toml
index 7850c667..2145cbea 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Next 80B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 46976204800
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-8bit.toml
index 1120f824..e1328021 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Instruct-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Next 80B"
 capabilities = ["text"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 88814387200
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-4bit.toml
index c15735b5..708b309c 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Next 80B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 47080074240
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-8bit.toml
index 3e57c5b4..90097255 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-Next-80B-A3B-Thinking-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3 Next 80B"
 capabilities = ["text", "thinking", "thinking_toggle"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 88814387200
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3-VL-4B-Instruct-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3-VL-4B-Instruct-4bit.toml
index 9f28315c..d8e45002 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3-VL-4B-Instruct-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3-VL-4B-Instruct-4bit.toml
@@ -9,7 +9,7 @@ base_model = "Qwen3-VL 4B"
 capabilities = ["text", "thinking", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 3340000000
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-4bit.toml
index 6f937b4a..5e50aca6 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 122B A10B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 69593314272
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-6bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-6bit.toml
index 6973380c..ae589b0c 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 122B A10B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 100120675296
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-8bit.toml
index 2558dd70..ede2e81c 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 122B A10B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 130648036320
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-bf16.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-bf16.toml
index e504ad65..e1cdb9f5 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-122B-A10B-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 122B A10B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 245125640160
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-27B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-27B-4bit.toml
index 45bb673e..c0ae0cbf 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-27B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-27B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 27B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 16054266848
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-27B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-27B-8bit.toml
index 0e6f8f02..aef1aa39 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-27B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-27B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 27B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 29500943328
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-2B-MLX-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-2B-MLX-8bit.toml
index 5e484a99..78ff8747 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-2B-MLX-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-2B-MLX-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 2B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 2662787264
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-4bit.toml
index 393a0776..d8abb8de 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 20391405152
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-8bit.toml
index bb6742ec..e995d131 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-35B-A3B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 37721130592
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-4bit.toml
index 8404cb7a..202b8286 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 397B A17B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 223860768352
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-6bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-6bit.toml
index c0d3093c..8774868c 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 397B A17B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 322946674272
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-8bit.toml
index 988839d8..a0cef3ff 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-397B-A17B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 397B A17B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 422032580192
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-9B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-9B-4bit.toml
index e864300b..2248f193 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-9B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-9B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 9B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 5950062560
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.5-9B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.5-9B-8bit.toml
index fc3b412d..44cbc456 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.5-9B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.5-9B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.5 9B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 10426433504
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-4bit.toml
index 25bd0d81..88decd00 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 27B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 16054262240
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-8bit.toml
index ee62ba29..8cef7490 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 27B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 29500938720
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-bf16.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-bf16.toml
index f820559d..d04042da 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-27B-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-27B-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 27B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 54713457120
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-4bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-4bit.toml
index b857d8d8..d2ca90e8 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 20401929952
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-5bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-5bit.toml
index db445870..8229424f 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-5bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-5bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 24731729632
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-8bit.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-8bit.toml
index 3d142553..c03748fa 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 37721128672
 
diff --git a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-bf16.toml b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-bf16.toml
index ef459ca3..9bd5cf1e 100644
--- a/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--Qwen3.6-35B-A3B-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Qwen3.6 35B A3B"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 reasoning_dialect = "post_last_user"
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 70214363872
 
diff --git a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-4bit.toml b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-4bit.toml
index b5977723..734febb0 100644
--- a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Step 3.5 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 114572190076
 
diff --git a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-6bit.toml b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-6bit.toml
index fe45fa37..57a5f4cf 100644
--- a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Step 3.5 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 159039627774
 
diff --git a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-8Bit.toml b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-8Bit.toml
index 64ec31bb..977903fd 100644
--- a/resources/inference_model_cards/mlx-community--Step-3.5-Flash-8Bit.toml
+++ b/resources/inference_model_cards/mlx-community--Step-3.5-Flash-8Bit.toml
@@ -10,7 +10,7 @@ base_model = "Step 3.5 Flash"
 capabilities = ["text", "thinking", "thinking_toggle"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 209082699847
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-4bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-4bit.toml
index 51be323e..729b4c5e 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 26B A4B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 15608614044
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-6bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-6bit.toml
index c984d44b..e98f520f 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 26B A4B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 21781015708
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-8bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-8bit.toml
index fe258366..36ac44dd 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 26B A4B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 27953417372
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-bf16.toml b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-bf16.toml
index ea4dbbfc..e1197254 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-26b-a4b-it-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 26B A4B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 51611872412
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-4bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-4bit.toml
index cb8e6358..409db197 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 31B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 18411755224
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-6bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-6bit.toml
index 84562062..21c0461d 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 31B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 26087306968
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-8bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-8bit.toml
index 332a9b00..378447a4 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 31B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 33762858712
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-bf16.toml b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-bf16.toml
index 6fc0a2dc..ea3c87d8 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-31b-it-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-31b-it-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 31B"
 capabilities = ["text", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 62546177752
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-4bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-4bit.toml
index db641a2b..5234fab0 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E2B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 3580765126
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-6bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-6bit.toml
index 4fdf9dda..d4d1f674 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E2B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 4739998662
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-8bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-8bit.toml
index 8834e16f..9eb59b37 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E2B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 5899232198
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-bf16.toml b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-bf16.toml
index 1bad3dd8..b45e690d 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e2b-it-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E2B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 10246357958
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-4bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-4bit.toml
index 0f4cc821..e88c4639 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-4bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-4bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E4B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 5216992212
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-6bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-6bit.toml
index 2cdd2b33..0402a801 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-6bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-6bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E4B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 7090961364
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-8bit.toml b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-8bit.toml
index 1be07028..158d3fc6 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-8bit.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-8bit.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E4B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 8964930516
 
diff --git a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-bf16.toml b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-bf16.toml
index f18df6f3..8d1f84f8 100644
--- a/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-bf16.toml
+++ b/resources/inference_model_cards/mlx-community--gemma-4-e4b-it-bf16.toml
@@ -10,7 +10,7 @@ base_model = "Gemma 4 E4B"
 capabilities = ["text", "vision"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 15992314836
 
diff --git a/resources/inference_model_cards/mlx-community--gpt-oss-120b-MXFP4-Q8.toml b/resources/inference_model_cards/mlx-community--gpt-oss-120b-MXFP4-Q8.toml
index 1a8a028f..091b079b 100644
--- a/resources/inference_model_cards/mlx-community--gpt-oss-120b-MXFP4-Q8.toml
+++ b/resources/inference_model_cards/mlx-community--gpt-oss-120b-MXFP4-Q8.toml
@@ -10,7 +10,7 @@ base_model = "GPT-OSS 120B"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "channel"
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 70652212224
 
diff --git a/resources/inference_model_cards/mlx-community--gpt-oss-20b-MXFP4-Q8.toml b/resources/inference_model_cards/mlx-community--gpt-oss-20b-MXFP4-Q8.toml
index b8bb29ec..9e1a56ba 100644
--- a/resources/inference_model_cards/mlx-community--gpt-oss-20b-MXFP4-Q8.toml
+++ b/resources/inference_model_cards/mlx-community--gpt-oss-20b-MXFP4-Q8.toml
@@ -10,7 +10,7 @@ base_model = "GPT-OSS 20B"
 capabilities = ["text", "thinking"]
 reasoning_dialect = "channel"
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 12025908224
 
diff --git a/resources/inference_model_cards/mlx-community--llama-3.3-70b-instruct-fp16.toml b/resources/inference_model_cards/mlx-community--llama-3.3-70b-instruct-fp16.toml
index 06cf3131..f37400aa 100644
--- a/resources/inference_model_cards/mlx-community--llama-3.3-70b-instruct-fp16.toml
+++ b/resources/inference_model_cards/mlx-community--llama-3.3-70b-instruct-fp16.toml
@@ -10,7 +10,7 @@ base_model = "Llama 3.3 70B"
 capabilities = ["text"]
 
 context_length = 131072
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 144383672320
 
diff --git a/resources/inference_model_cards/moonshotai--Kimi-K2.6.toml b/resources/inference_model_cards/moonshotai--Kimi-K2.6.toml
index 8d9d19b7..b169e51a 100644
--- a/resources/inference_model_cards/moonshotai--Kimi-K2.6.toml
+++ b/resources/inference_model_cards/moonshotai--Kimi-K2.6.toml
@@ -10,7 +10,7 @@ base_model = "Kimi K2.6"
 capabilities = ["text", "thinking", "thinking_toggle", "vision"]
 
 context_length = 262144
-
+backends = ["MlxMetal", "MlxCuda", "MlxCpu"]
 [storage_size]
 in_bytes = 595148192736
 
diff --git a/src/exo/api/main.py b/src/exo/api/main.py
index d3b03e46..90a93a4c 100644
--- a/src/exo/api/main.py
+++ b/src/exo/api/main.py
@@ -482,6 +482,7 @@ class API:
                 ),
                 node_memory=self.state.node_memory,
                 node_network=self.state.node_network,
+                node_backends=self.state.node_backends,
                 topology=self.state.topology,
                 current_instances=self.state.instances,
                 download_status=self.state.downloads,
@@ -545,6 +546,7 @@ class API:
                     ),
                     node_memory=self.state.node_memory,
                     node_network=self.state.node_network,
+                    node_backends=self.state.node_backends,
                     topology=self.state.topology,
                     current_instances=self.state.instances,
                     required_nodes=required_nodes,
diff --git a/src/exo/download/impl_shard_downloader.py b/src/exo/download/impl_shard_downloader.py
index ee85945b..a76d2cd4 100644
--- a/src/exo/download/impl_shard_downloader.py
+++ b/src/exo/download/impl_shard_downloader.py
@@ -199,6 +199,7 @@ class ResumableShardDownloader(ShardDownloader):
             hidden_size=1,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=shard.model_card.backends,
         )
         return PipelineShardMetadata(
             model_card=vision_card,
diff --git a/src/exo/download/shard_downloader.py b/src/exo/download/shard_downloader.py
index 2addda80..fa3c9a4b 100644
--- a/src/exo/download/shard_downloader.py
+++ b/src/exo/download/shard_downloader.py
@@ -7,6 +7,7 @@ from typing import AsyncIterator, Callable
 
 from exo.download.download_utils import RepoDownloadProgress
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.memory import Memory
 from exo.shared.types.worker.shards import (
     PipelineShardMetadata,
@@ -93,6 +94,7 @@ NOOP_DOWNLOAD_PROGRESS = RepoDownloadProgress(
             hidden_size=1,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=0,
         world_size=1,
diff --git a/src/exo/download/tests/test_cancel_download.py b/src/exo/download/tests/test_cancel_download.py
index 3d02d65f..6546bb36 100644
--- a/src/exo/download/tests/test_cancel_download.py
+++ b/src/exo/download/tests/test_cancel_download.py
@@ -12,6 +12,7 @@ from exo.download.download_utils import RepoDownloadProgress
 from exo.download.impl_shard_downloader import SingletonShardDownloader
 from exo.download.shard_downloader import ShardDownloader
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import (
     CancelDownload,
     ForwarderDownloadCommand,
@@ -37,6 +38,7 @@ def _make_shard(model_id: ModelId = MODEL_ID) -> ShardMetadata:
             hidden_size=1024,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=0,
         world_size=1,
diff --git a/src/exo/download/tests/test_download_status_not_lost.py b/src/exo/download/tests/test_download_status_not_lost.py
index 2f1c3ae8..c9e9cc60 100644
--- a/src/exo/download/tests/test_download_status_not_lost.py
+++ b/src/exo/download/tests/test_download_status_not_lost.py
@@ -19,6 +19,7 @@ from exo.download.download_utils import RepoDownloadProgress
 from exo.download.impl_shard_downloader import SingletonShardDownloader
 from exo.download.shard_downloader import ShardDownloader
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import ForwarderDownloadCommand
 from exo.shared.types.common import NodeId
 from exo.shared.types.events import Event, NodeDownloadProgress
@@ -44,6 +45,7 @@ def _make_shard(model_id: ModelId = MODEL_ID) -> ShardMetadata:
             hidden_size=1024,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=0,
         world_size=1,
diff --git a/src/exo/download/tests/test_re_download.py b/src/exo/download/tests/test_re_download.py
index 75617997..7b456540 100644
--- a/src/exo/download/tests/test_re_download.py
+++ b/src/exo/download/tests/test_re_download.py
@@ -13,6 +13,7 @@ from exo.download.download_utils import RepoDownloadProgress
 from exo.download.impl_shard_downloader import SingletonShardDownloader
 from exo.download.shard_downloader import ShardDownloader
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import (
     DeleteDownload,
     ForwarderDownloadCommand,
@@ -38,6 +39,7 @@ def _make_shard(model_id: ModelId = MODEL_ID) -> ShardMetadata:
             hidden_size=1024,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=0,
         world_size=1,
diff --git a/src/exo/master/main.py b/src/exo/master/main.py
index 85abbe39..655e6556 100644
--- a/src/exo/master/main.py
+++ b/src/exo/master/main.py
@@ -364,6 +364,7 @@ class Master:
                                 self.state.instances,
                                 self.state.node_memory,
                                 self.state.node_network,
+                                self.state.node_backends,
                                 download_status=self.state.downloads,
                                 node_rdma_ctl=self.state.node_rdma_ctl,
                             )
diff --git a/src/exo/master/placement.py b/src/exo/master/placement.py
index b55571c7..0ed634e2 100644
--- a/src/exo/master/placement.py
+++ b/src/exo/master/placement.py
@@ -13,6 +13,7 @@ from exo.master.placement_utils import (
 )
 from exo.shared.models.model_cards import ModelId
 from exo.shared.topology import Topology
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import (
     CancelDownload,
     CreateInstance,
@@ -47,6 +48,11 @@ from exo.shared.types.worker.instances import (
 from exo.shared.types.worker.shards import Sharding
 from exo.utils.ports import random_ephemeral_port
 
+INSTANCE_META_BACKENDS: dict[InstanceMeta, list[Backend]] = {
+    InstanceMeta.MlxRing: [Backend.MlxMetal, Backend.MlxCuda, Backend.MlxCpu],
+    InstanceMeta.MlxJaccl: [Backend.MlxMetal],
+}
+
 
 def add_instance_to_placements(
     command: CreateInstance,
@@ -103,6 +109,7 @@ def place_instance(
     current_instances: Mapping[InstanceId, Instance],
     node_memory: Mapping[NodeId, MemoryUsage],
     node_network: Mapping[NodeId, NodeNetworkInfo],
+    node_backends: Mapping[NodeId, list[Backend]],
     required_nodes: set[NodeId] | None = None,
     download_status: Mapping[NodeId, Sequence[DownloadProgress]] | None = None,
     node_rdma_ctl: Mapping[NodeId, NodeRdmaCtlStatus] | None = None,
@@ -167,6 +174,29 @@ def place_instance(
 
     smallest_cycles = get_smallest_cycles(cycles_with_sufficient_memory)
 
+    required_backends = set(INSTANCE_META_BACKENDS[command.instance_meta]) & set(
+        command.model_card.backends
+    )
+    if not required_backends:
+        raise ValueError(
+            f"Model {command.model_card.model_id} backends "
+            f"{sorted(b.value for b in command.model_card.backends)} cannot satisfy engine "
+            f"{command.instance_meta.value} which requires "
+            f"{sorted(b.value for b in INSTANCE_META_BACKENDS[command.instance_meta])}"
+        )
+    smallest_cycles = [
+        cycle
+        for cycle in smallest_cycles
+        if all(
+            set(node_backends.get(node_id, [])) & required_backends for node_id in cycle
+        )
+    ]
+    if not smallest_cycles:
+        raise ValueError(
+            f"No cycle where every node supports a backend in "
+            f"{sorted(b.value for b in required_backends)} for {command.model_card.model_id}"
+        )
+
     rdma_ctl_status = node_rdma_ctl or {}
 
     def _all_rdma_ctl_enabled(cycle: Cycle) -> bool:
diff --git a/src/exo/master/tests/test_master.py b/src/exo/master/tests/test_master.py
index c4a1cff0..d370a1e7 100644
--- a/src/exo/master/tests/test_master.py
+++ b/src/exo/master/tests/test_master.py
@@ -8,6 +8,7 @@ from loguru import logger
 from exo.master.main import Master
 from exo.routing.router import get_node_id_keypair
 from exo.shared.models.model_cards import ModelCard, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import (
     CommandId,
     ForwarderCommand,
@@ -43,6 +44,7 @@ from exo.shared.types.worker.instances import (
 )
 from exo.shared.types.worker.shards import PipelineShardMetadata, Sharding
 from exo.utils.channels import channel
+from exo.utils.info_gatherer.info_gatherer import NodeBackends
 
 
 @pytest.mark.asyncio
@@ -120,6 +122,20 @@ async def test_master():
                 ),
             )
         )
+        await local_event_sender.send(
+            LocalForwarderEvent(
+                origin_idx=1,
+                origin=SystemId("Worker"),
+                session=session_id,
+                event=(
+                    NodeGatheredInfo(
+                        when=str(datetime.now(tz=timezone.utc)),
+                        node_id=node_id,
+                        info=NodeBackends(backends=[Backend.MlxMetal]),
+                    )
+                ),
+            )
+        )
 
         # wait for initial topology event
         logger.info("wait for initial topology event")
@@ -127,6 +143,8 @@ async def test_master():
             await anyio.sleep(0.001)
         while len(master.state.node_memory) == 0:
             await anyio.sleep(0.001)
+        while len(master.state.node_backends) == 0:
+            await anyio.sleep(0.001)
 
         logger.info("inject a CreateInstance Command")
         await command_sender.send(
@@ -142,6 +160,7 @@ async def test_master():
                             hidden_size=7168,
                             supports_tensor=True,
                             tasks=[ModelTask.TextGeneration],
+                            backends=[Backend.MlxMetal],
                         ),
                         sharding=Sharding.Pipeline,
                         instance_meta=InstanceMeta.MlxRing,
@@ -173,17 +192,19 @@ async def test_master():
                 ),
             )
         )
-        while len(_get_events()) < 3:
+        while len(_get_events()) < 4:
             await anyio.sleep(0.01)
 
         events = _get_events()
-        assert len(events) == 3
+        assert len(events) == 4
         assert events[0].idx == 0
         assert events[1].idx == 1
         assert events[2].idx == 2
+        assert events[3].idx == 3
         assert isinstance(events[0].event, NodeGatheredInfo)
-        assert isinstance(events[1].event, InstanceCreated)
-        created_instance = events[1].event.instance
+        assert isinstance(events[1].event, NodeGatheredInfo)
+        assert isinstance(events[2].event, InstanceCreated)
+        created_instance = events[2].event.instance
         assert isinstance(created_instance, MlxRingInstance)
         runner_id = list(created_instance.shard_assignments.runner_to_shard.keys())[0]
         # Validate the shard assignments
@@ -201,6 +222,7 @@ async def test_master():
                         hidden_size=7168,
                         supports_tensor=True,
                         tasks=[ModelTask.TextGeneration],
+                        backends=[Backend.MlxMetal],
                     ),
                     device_rank=0,
                     world_size=1,
@@ -215,10 +237,10 @@ async def test_master():
         assert len(created_instance.hosts_by_node[node_id]) == 1
         assert created_instance.hosts_by_node[node_id][0].ip == "0.0.0.0"
         assert created_instance.ephemeral_port > 0
-        assert isinstance(events[2].event, TaskCreated)
-        assert events[2].event.task.task_status == TaskStatus.Pending
-        assert isinstance(events[2].event.task, TextGenerationTask)
-        assert events[2].event.task.task_params == TextGenerationTaskParams(
+        assert isinstance(events[3].event, TaskCreated)
+        assert events[3].event.task.task_status == TaskStatus.Pending
+        assert isinstance(events[3].event.task, TextGenerationTask)
+        assert events[3].event.task.task_params == TextGenerationTaskParams(
             model=ModelId("llama-3.2-1b"),
             input=[
                 InputMessage(
diff --git a/src/exo/master/tests/test_placement.py b/src/exo/master/tests/test_placement.py
index d3acd24f..b8911872 100644
--- a/src/exo/master/tests/test_placement.py
+++ b/src/exo/master/tests/test_placement.py
@@ -1,3 +1,5 @@
+from collections.abc import Mapping
+
 import pytest
 
 from exo.master.placement import (
@@ -12,6 +14,7 @@ from exo.master.tests.conftest import (
 )
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
 from exo.shared.topology import Topology
+from exo.shared.types.backends import Backend
 from exo.shared.types.commands import PlaceInstance
 from exo.shared.types.common import CommandId, NodeId
 from exo.shared.types.events import (
@@ -71,9 +74,16 @@ def model_card() -> ModelCard:
         hidden_size=30,
         supports_tensor=True,
         tasks=[ModelTask.TextGeneration],
+        backends=[Backend.MlxMetal],
     )
 
 
+def _metal_only(
+    node_memory: Mapping[NodeId, object],
+) -> dict[NodeId, list[Backend]]:
+    return {node_id: [Backend.MlxMetal] for node_id in node_memory}
+
+
 def place_instance_command(model_card: ModelCard) -> PlaceInstance:
     return PlaceInstance(
         command_id=CommandId(),
@@ -155,7 +165,9 @@ def test_get_instance_placements_create_instance(
     topology.add_connection(conn_b_a)
 
     # act
-    placements = place_instance(cic, topology, {}, node_memory, node_network)
+    placements = place_instance(
+        cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+    )
 
     # assert
     assert len(placements) == 1
@@ -195,9 +207,12 @@ def test_get_instance_placements_one_node_exact_fit() -> None:
             hidden_size=1000,
             supports_tensor=True,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
     )
-    placements = place_instance(cic, topology, {}, node_memory, node_network)
+    placements = place_instance(
+        cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+    )
 
     assert len(placements) == 1
     instance_id = list(placements.keys())[0]
@@ -222,9 +237,12 @@ def test_get_instance_placements_one_node_fits_with_extra_memory() -> None:
             hidden_size=1000,
             supports_tensor=True,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
     )
-    placements = place_instance(cic, topology, {}, node_memory, node_network)
+    placements = place_instance(
+        cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+    )
 
     assert len(placements) == 1
     instance_id = list(placements.keys())[0]
@@ -249,11 +267,14 @@ def test_get_instance_placements_one_node_not_fit() -> None:
             hidden_size=1000,
             supports_tensor=True,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
     )
 
     with pytest.raises(ValueError, match="No cycles found with sufficient memory"):
-        place_instance(cic, topology, {}, node_memory, node_network)
+        place_instance(
+            cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+        )
 
 
 def test_get_transition_events_no_change(instance: Instance):
@@ -352,7 +373,9 @@ def test_placement_selects_leaf_nodes(
     cic = place_instance_command(model_card=model_card)
 
     # act
-    placements = place_instance(cic, topology, {}, node_memory, node_network)
+    placements = place_instance(
+        cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+    )
 
     # assert
     assert len(placements) == 1
@@ -456,6 +479,7 @@ def test_tensor_rdma_backend_connectivity_matrix(
         {},
         node_memory,
         node_network,
+        _metal_only(node_memory),
         node_rdma_ctl=node_rdma_ctl,
     )
 
@@ -583,6 +607,7 @@ def test_place_mlx_jaccl_rejects_when_a_node_has_rdma_ctl_disabled(
             {},
             node_memory,
             node_network,
+            _metal_only(node_memory),
             node_rdma_ctl=node_rdma_ctl,
         )
 
@@ -620,6 +645,7 @@ def test_place_mlx_jaccl_rejects_when_node_rdma_ctl_missing(model_card: ModelCar
             {},
             node_memory,
             node_network,
+            _metal_only(node_memory),
             node_rdma_ctl=node_rdma_ctl,
         )
 
@@ -788,7 +814,13 @@ def test_placement_prefers_cycle_with_downloaded_model(
 
     cic = place_instance_command(model_card)
     placements = place_instance(
-        cic, topology, {}, node_memory, node_network, download_status=download_status
+        cic,
+        topology,
+        {},
+        node_memory,
+        node_network,
+        _metal_only(node_memory),
+        download_status=download_status,
     )
 
     assert len(placements) == 1
@@ -860,7 +892,13 @@ def test_placement_prefers_cycle_with_higher_download_progress(
 
     cic = place_instance_command(model_card)
     placements = place_instance(
-        cic, topology, {}, node_memory, node_network, download_status=download_status
+        cic,
+        topology,
+        {},
+        node_memory,
+        node_network,
+        _metal_only(node_memory),
+        download_status=download_status,
     )
 
     assert len(placements) == 1
@@ -908,7 +946,13 @@ def test_placement_does_not_prefer_cycle_with_failed_download(
 
     cic = place_instance_command(model_card)
     placements = place_instance(
-        cic, topology, {}, node_memory, node_network, download_status=download_status
+        cic,
+        topology,
+        {},
+        node_memory,
+        node_network,
+        _metal_only(node_memory),
+        download_status=download_status,
     )
 
     assert len(placements) == 1
@@ -916,3 +960,99 @@ def test_placement_does_not_prefer_cycle_with_failed_download(
     assigned_nodes = set(instance.shard_assignments.node_to_runner.keys())
     # node_a should win on RAM tiebreaker since failed download scores 0.0
     assert assigned_nodes == {node_a}
+
+
+def test_placement_rejects_when_model_backends_disjoint_from_engine(
+    model_card: ModelCard,
+):
+    topology = Topology()
+    node_id = NodeId()
+    topology.add_node(node_id)
+    node_memory = {node_id: create_node_memory(1000 * 1024)}
+    node_network = {node_id: create_node_network()}
+
+    cic = place_instance_command(
+        model_card.model_copy(update={"backends": [Backend.Vllm]})
+    )
+
+    with pytest.raises(ValueError, match="cannot satisfy engine MlxRing"):
+        place_instance(
+            cic, topology, {}, node_memory, node_network, _metal_only(node_memory)
+        )
+
+
+def test_placement_rejects_when_only_some_nodes_support_backend(
+    model_card: ModelCard,
+):
+    topology = Topology()
+    node_a = NodeId()
+    node_b = NodeId()
+    node_c = NodeId()
+    for n in (node_a, node_b, node_c):
+        topology.add_node(n)
+
+    eth = create_socket_connection(1)
+    for src, dst in [
+        (node_a, node_b),
+        (node_b, node_c),
+        (node_c, node_a),
+        (node_a, node_c),
+        (node_c, node_b),
+        (node_b, node_a),
+    ]:
+        topology.add_connection(Connection(source=src, sink=dst, edge=eth))
+
+    node_memory = {n: create_node_memory(500 * 1024) for n in (node_a, node_b, node_c)}
+    node_network = {n: create_node_network() for n in (node_a, node_b, node_c)}
+    node_backends = {
+        node_a: [Backend.MlxMetal],
+        node_b: [Backend.MlxMetal],
+        node_c: [Backend.MlxCuda],  # the lone CUDA-only node breaks the cycle
+    }
+
+    cic = place_instance_command(
+        model_card.model_copy(
+            update={
+                "backends": [Backend.MlxMetal],
+                "n_layers": 12,
+                "storage_size": Memory.from_kb(1500),
+            }
+        )
+    )
+
+    with pytest.raises(ValueError, match="No cycle where every node supports"):
+        place_instance(cic, topology, {}, node_memory, node_network, node_backends)
+
+
+def test_mlx_jaccl_rejects_cuda_only_cycle(model_card: ModelCard):
+    topology, node_a, node_b, node_c, node_network = _build_three_node_rdma_topology()
+    node_memory = {n: create_node_memory(500) for n in (node_a, node_b, node_c)}
+    node_rdma_ctl = {
+        n: NodeRdmaCtlStatus(enabled=True) for n in (node_a, node_b, node_c)
+    }
+    node_backends = {n: [Backend.MlxCuda] for n in (node_a, node_b, node_c)}
+
+    cic = PlaceInstance(
+        sharding=Sharding.Tensor,
+        instance_meta=InstanceMeta.MlxJaccl,
+        command_id=CommandId(),
+        model_card=model_card.model_copy(
+            update={
+                "backends": [Backend.MlxMetal, Backend.MlxCuda],
+                "n_layers": 12,
+                "storage_size": Memory.from_bytes(1500),
+            }
+        ),
+        min_nodes=3,
+    )
+
+    with pytest.raises(ValueError, match="No cycle where every node supports"):
+        place_instance(
+            cic,
+            topology,
+            {},
+            node_memory,
+            node_network,
+            node_backends,
+            node_rdma_ctl=node_rdma_ctl,
+        )
diff --git a/src/exo/master/tests/test_placement_utils.py b/src/exo/master/tests/test_placement_utils.py
index 245c4fd7..b2f64729 100644
--- a/src/exo/master/tests/test_placement_utils.py
+++ b/src/exo/master/tests/test_placement_utils.py
@@ -14,6 +14,7 @@ from exo.master.tests.conftest import (
 )
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
 from exo.shared.topology import Topology
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import NodeId
 from exo.shared.types.memory import Memory
 from exo.shared.types.profiling import (
@@ -243,6 +244,7 @@ def test_get_shard_assignments(
         hidden_size=1000,
         supports_tensor=True,
         tasks=[ModelTask.TextGeneration],
+        backends=[Backend.MlxMetal],
     )
 
     cycles = topology.get_cycles()
@@ -484,6 +486,7 @@ def test_get_shard_assignments_insufficient_memory_raises():
         hidden_size=1000,
         supports_tensor=True,
         tasks=[ModelTask.TextGeneration],
+        backends=[Backend.MlxMetal],
     )
     cycles = topology.get_cycles()
     selected_cycle = cycles[0]
@@ -533,6 +536,7 @@ class TestCfgParallelPlacement:
             supports_tensor=False,
             uses_cfg=True,
             tasks=[ModelTask.TextToImage],
+            backends=[Backend.MlxMetal],
         )
 
         assignments = get_shard_assignments_for_pipeline_parallel(
@@ -576,6 +580,7 @@ class TestCfgParallelPlacement:
             supports_tensor=False,
             uses_cfg=True,
             tasks=[ModelTask.TextToImage],
+            backends=[Backend.MlxMetal],
         )
 
         assignments = get_shard_assignments_for_pipeline_parallel(
@@ -625,6 +630,7 @@ class TestCfgParallelPlacement:
             supports_tensor=False,
             uses_cfg=True,
             tasks=[ModelTask.TextToImage],
+            backends=[Backend.MlxMetal],
         )
 
         assignments = get_shard_assignments_for_pipeline_parallel(
@@ -660,6 +666,7 @@ class TestCfgParallelPlacement:
             supports_tensor=False,
             uses_cfg=False,  # Non-CFG model
             tasks=[ModelTask.TextToImage],
+            backends=[Backend.MlxMetal],
         )
 
         assignments = get_shard_assignments_for_pipeline_parallel(
diff --git a/src/exo/shared/apply.py b/src/exo/shared/apply.py
index d5a9d383..5f72247b 100644
--- a/src/exo/shared/apply.py
+++ b/src/exo/shared/apply.py
@@ -57,6 +57,7 @@ from exo.utils.info_gatherer.info_gatherer import (
     MacThunderboltIdentifiers,
     MemoryUsage,
     MiscData,
+    NodeBackends,
     NodeConfig,
     NodeDiskUsage,
     NodeNetworkInterfaces,
@@ -460,6 +461,11 @@ def apply_node_gathered_info(event: NodeGatheredInfo, state: State) -> State:
             # MacThunderboltConnections poll once both endpoints are enabled again.)
             if not info.enabled:
                 topology.remove_all_rdma_connections_touching(event.node_id)
+        case NodeBackends():
+            update["node_backends"] = {
+                **state.node_backends,
+                event.node_id: info.backends,
+            }
 
     return state.model_copy(update=update)
 
diff --git a/src/exo/shared/models/model_cards.py b/src/exo/shared/models/model_cards.py
index 0d1648a7..f64a509e 100644
--- a/src/exo/shared/models/model_cards.py
+++ b/src/exo/shared/models/model_cards.py
@@ -26,6 +26,7 @@ from exo.shared.constants import (
     EXO_MODELS_DIRS,
     RESOURCES_DIR,
 )
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import ModelId
 from exo.shared.types.memory import Memory
 from exo.shared.types.text_generation import ReasoningDialect
@@ -164,6 +165,7 @@ class ModelCard(FrozenModel):
     quantization: str = ""
     base_model: str = ""
     capabilities: list[str] = []
+    backends: list[Backend]
     reasoning_dialect: ReasoningDialect = "none"
     context_length: int = 0
     uses_cfg: bool = False
@@ -247,6 +249,9 @@ class ModelCard(FrozenModel):
             trust_remote_code=False,
             is_custom=True,
             vision=config_data.vision,
+            backends=list(
+                Backend
+            ),  # all backends — we don't know what an arbitrary HF model supports; let placement gate decide
         )
 
 
diff --git a/src/exo/shared/tests/conftest.py b/src/exo/shared/tests/conftest.py
index 0622cb0b..b0ffb08d 100644
--- a/src/exo/shared/tests/conftest.py
+++ b/src/exo/shared/tests/conftest.py
@@ -8,6 +8,7 @@ from _pytest.logging import LogCaptureFixture
 from loguru import logger
 
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.memory import Memory
 from exo.shared.types.worker.shards import PipelineShardMetadata, ShardMetadata
 
@@ -38,6 +39,7 @@ def get_pipeline_shard_metadata(
             hidden_size=1000,
             supports_tensor=True,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=device_rank,
         world_size=world_size,
diff --git a/src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py b/src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py
index b5b3066c..9d60c28f 100644
--- a/src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py
+++ b/src/exo/shared/tests/test_apply/test_apply_custom_model_cards.py
@@ -1,5 +1,6 @@
 from exo.shared.apply import apply
 from exo.shared.models.model_cards import ModelCard, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import ModelId
 from exo.shared.types.events import (
     CustomModelCardAdded,
@@ -18,6 +19,7 @@ def _model_card(model_id: ModelId) -> ModelCard:
         hidden_size=1,
         supports_tensor=True,
         tasks=[ModelTask.TextGeneration],
+        backends=[Backend.MlxMetal],
     )
 
 
diff --git a/src/exo/shared/types/backends.py b/src/exo/shared/types/backends.py
new file mode 100644
index 00000000..d1b9bc6c
--- /dev/null
+++ b/src/exo/shared/types/backends.py
@@ -0,0 +1,8 @@
+from enum import Enum
+
+
+class Backend(str, Enum):
+    MlxMetal = "MlxMetal"
+    MlxCpu = "MlxCpu"
+    MlxCuda = "MlxCuda"
+    Vllm = "Vllm"
diff --git a/src/exo/shared/types/state.py b/src/exo/shared/types/state.py
index 6a60aa08..baef1d72 100644
--- a/src/exo/shared/types/state.py
+++ b/src/exo/shared/types/state.py
@@ -7,6 +7,7 @@ from pydantic.alias_generators import to_camel
 
 from exo.shared.models.model_cards import ModelCard
 from exo.shared.topology import Topology, TopologySnapshot
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import ModelId, NodeId
 from exo.shared.types.instance_link import InstanceLink, InstanceLinkId
 from exo.shared.types.profiling import (
@@ -59,6 +60,7 @@ class State(FrozenModel):
     node_thunderbolt: Mapping[NodeId, NodeThunderboltInfo] = {}
     node_thunderbolt_bridge: Mapping[NodeId, ThunderboltBridgeStatus] = {}
     node_rdma_ctl: Mapping[NodeId, NodeRdmaCtlStatus] = {}
+    node_backends: Mapping[NodeId, list[Backend]] = {}
 
     # Detected cycles where all nodes have Thunderbolt bridge enabled (>2 nodes)
     thunderbolt_bridge_cycles: Sequence[Sequence[NodeId]] = []
diff --git a/src/exo/utils/info_gatherer/info_gatherer.py b/src/exo/utils/info_gatherer/info_gatherer.py
index 9e75e143..81194c92 100644
--- a/src/exo/utils/info_gatherer/info_gatherer.py
+++ b/src/exo/utils/info_gatherer/info_gatherer.py
@@ -14,6 +14,7 @@ from loguru import logger
 from pydantic import ValidationError
 
 from exo.shared.constants import EXO_CONFIG_FILE, EXO_DEFAULT_MODELS_DIR
+from exo.shared.types.backends import Backend
 from exo.shared.types.memory import Memory
 from exo.shared.types.profiling import (
     DiskUsage,
@@ -353,6 +354,35 @@ async def _gather_iface_map() -> dict[str, str] | None:
     return ports
 
 
+def _has_nvml_cuda() -> bool:
+    try:
+        import pynvml as nvml  # pyright: ignore[reportMissingModuleSource]
+    except ImportError:
+        return False
+    try:
+        nvml.nvmlInit()
+        try:
+            return nvml.nvmlDeviceGetCount() > 0
+        finally:
+            nvml.nvmlShutdown()
+    except Exception:
+        return False
+
+
+class NodeBackends(TaggedModel):
+    backends: list[Backend]
+
+    @classmethod
+    async def gather(cls) -> Self:
+        backends: list[Backend] = [Backend.MlxCpu]
+        if IS_DARWIN:
+            backends.append(Backend.MlxMetal)
+        if await to_thread.run_sync(_has_nvml_cuda):
+            backends.append(Backend.MlxCuda)
+            backends.append(Backend.Vllm)
+        return cls(backends=backends)
+
+
 GatheredInfo = (
     MacmonMetrics
     | MemoryUsage
@@ -365,6 +395,7 @@ GatheredInfo = (
     | MiscData
     | StaticNodeInformation
     | NodeDiskUsage
+    | NodeBackends
 )
 
 
@@ -428,6 +459,8 @@ class InfoGatherer:
             if nc is not None:
                 await self.info_sender.send(nc)
 
+            await self.info_sender.send(await NodeBackends.gather())
+
     def shutdown(self):
         self._tg.cancel_tasks()
 
diff --git a/src/exo/worker/tests/unittests/conftest.py b/src/exo/worker/tests/unittests/conftest.py
index f88148ef..01388c5b 100644
--- a/src/exo/worker/tests/unittests/conftest.py
+++ b/src/exo/worker/tests/unittests/conftest.py
@@ -1,6 +1,7 @@
 from dataclasses import dataclass, field
 
 from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import NodeId
 from exo.shared.types.memory import Memory
 from exo.shared.types.tasks import BaseTask, TaskId
@@ -41,6 +42,7 @@ def get_pipeline_shard_metadata(
             hidden_size=2048,
             supports_tensor=False,
             tasks=[ModelTask.TextGeneration],
+            backends=[Backend.MlxMetal],
         ),
         device_rank=device_rank,
         world_size=world_size,
diff --git a/src/exo/worker/tests/unittests/test_mlx/conftest.py b/src/exo/worker/tests/unittests/test_mlx/conftest.py
index bba9f15a..d948feb9 100644
--- a/src/exo/worker/tests/unittests/test_mlx/conftest.py
+++ b/src/exo/worker/tests/unittests/test_mlx/conftest.py
@@ -12,6 +12,7 @@ import mlx.nn as nn
 
 from exo.shared.constants import EXO_DEFAULT_MODELS_DIR
 from exo.shared.models.model_cards import ModelCard, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import ModelId
 from exo.shared.types.memory import Memory
 from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams
@@ -88,6 +89,7 @@ def run_gpt_oss_pipeline_device(
                 hidden_size=2880,
                 supports_tensor=False,
                 tasks=[ModelTask.TextGeneration],
+                backends=[Backend.MlxMetal],
             ),
             device_rank=rank,
             world_size=world_size,
@@ -169,6 +171,7 @@ def run_gpt_oss_tensor_parallel_device(
                 hidden_size=2880,
                 supports_tensor=True,
                 tasks=[ModelTask.TextGeneration],
+                backends=[Backend.MlxMetal],
             ),
             device_rank=rank,
             world_size=world_size,
diff --git a/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py b/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py
index 1972abee..ad8ee030 100644
--- a/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py
+++ b/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py
@@ -17,6 +17,7 @@ import pytest
 
 from exo.shared.constants import EXO_DEFAULT_MODELS_DIR
 from exo.shared.models.model_cards import ModelCard, ModelTask
+from exo.shared.types.backends import Backend
 from exo.shared.types.common import ModelId
 from exo.shared.types.memory import Memory
 from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams
@@ -37,6 +38,7 @@ def _model_card() -> ModelCard:
         hidden_size=2880,
         supports_tensor=False,
         tasks=[ModelTask.TextGeneration],
+        backends=[Backend.MlxMetal],
     )
 
 

← 14aab356 Runner error handling (#2093)  ·  back to Exo  ·  Tweaked workspace settings (#2095) 5097b266 →