Instructions to use inferencerlabs/granite-vision-4.1-4b-MLX-Q9 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use inferencerlabs/granite-vision-4.1-4b-MLX-Q9 with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("inferencerlabs/granite-vision-4.1-4b-MLX-Q9") config = load_config("inferencerlabs/granite-vision-4.1-4b-MLX-Q9") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use inferencerlabs/granite-vision-4.1-4b-MLX-Q9 with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "inferencerlabs/granite-vision-4.1-4b-MLX-Q9"
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "inferencerlabs/granite-vision-4.1-4b-MLX-Q9" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent
How to use inferencerlabs/granite-vision-4.1-4b-MLX-Q9 with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "inferencerlabs/granite-vision-4.1-4b-MLX-Q9"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default inferencerlabs/granite-vision-4.1-4b-MLX-Q9
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use inferencerlabs/granite-vision-4.1-4b-MLX-Q9 with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "inferencerlabs/granite-vision-4.1-4b-MLX-Q9"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "inferencerlabs/granite-vision-4.1-4b-MLX-Q9" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
| from typing import Optional | |
| import logging | |
| from transformers import LlavaNextConfig | |
| logger = logging.getLogger(__name__) | |
| class Granite4VisionConfig(LlavaNextConfig): | |
| model_type = "granite4_vision" | |
| def __init__( | |
| self, | |
| downsample_rate=None, | |
| use_image_newline_parameter=True, | |
| deepstack_layer_map: Optional[list] = None, | |
| use_spatial_sampling: bool = False, | |
| spatial_stride: int = 2, | |
| spatial_vision_layer: int = -1, | |
| spatial_target_layers: Optional[list] = None, | |
| projector_dropout=0.1, | |
| **kwargs | |
| ): | |
| self.downsample_rate = downsample_rate | |
| self.use_image_newline_parameter = use_image_newline_parameter | |
| self.projector_dropout = projector_dropout | |
| # Deepstack layer map: list of (vision_layer_idx, llm_layer_idx) tuples. | |
| # Features from each vision layer are extracted, downsampled, and injected | |
| # at the corresponding LLM layer during forward pass. | |
| # e.g., [(-25, 12), (-17, 8), (-9, 4), (-1, 0)] | |
| if deepstack_layer_map is not None: | |
| self.deepstack_layer_map = [(int(v), int(l)) for v, l in deepstack_layer_map] | |
| assert len(self.deepstack_layer_map) == len(set(self.deepstack_layer_map)), "expecting no duplicates" | |
| else: | |
| self.deepstack_layer_map = None | |
| # Spatial sampling: extracts 4 groups from a single vision layer using | |
| # spatial offset sampling (top-left, top-right, bottom-left, bottom-right | |
| # of each 2x2 block), each injected at a different LLM layer. | |
| self.use_spatial_sampling = use_spatial_sampling | |
| self.spatial_stride = spatial_stride | |
| self.spatial_vision_layer = spatial_vision_layer | |
| self.spatial_target_layers = spatial_target_layers or [0, 10, 20, 30] | |
| super().__init__(**kwargs) | |