Image-Text-to-Text
MLX
Safetensors
inkling_mm_model
Mixture of Experts
multimodal
inkling
thinking-machines
conversational
Instructions to use pipenetwork/Inkling-MLX-4bit with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use pipenetwork/Inkling-MLX-4bit 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("pipenetwork/Inkling-MLX-4bit") config = load_config("pipenetwork/Inkling-MLX-4bit") # 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 pipenetwork/Inkling-MLX-4bit with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "pipenetwork/Inkling-MLX-4bit"
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "pipenetwork/Inkling-MLX-4bit" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use pipenetwork/Inkling-MLX-4bit 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 "pipenetwork/Inkling-MLX-4bit"
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 pipenetwork/Inkling-MLX-4bit
Run Hermes
hermes
- OpenClaw new
How to use pipenetwork/Inkling-MLX-4bit with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "pipenetwork/Inkling-MLX-4bit"
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 "pipenetwork/Inkling-MLX-4bit" \ --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"
| """Top-level Inkling multimodal model. | |
| Checkpoint layout: ``model.llm.*`` (text backbone + untied unembed), ``model.visual.*`` | |
| (HMLP vision tower), ``model.audio.*`` (dMel audio tower). Image/audio features are | |
| scattered into the token-embedding stream at their placeholder-token positions, then | |
| the text backbone runs and the untied unembed head produces (muP-scaled) logits. | |
| The MTP head (``model.mtp.*``) is intentionally not loaded (inference-irrelevant). | |
| """ | |
| from __future__ import annotations | |
| import mlx.core as mx | |
| import mlx.nn as nn | |
| import numpy as np | |
| from .audio import AudioModel | |
| from .config import InklingConfig | |
| from .text import TextModel | |
| from .vision import VisionModel | |
| def _scatter_features(embeds, input_ids, token_id, features): | |
| """Replace ``embeds`` rows where ``input_ids == token_id`` with ``features`` | |
| (in sequence order). ``input_ids`` is host-known so we resolve positions on CPU.""" | |
| B, L, H = embeds.shape | |
| ids = np.array(input_ids).reshape(-1) | |
| pos = np.nonzero(ids == token_id)[0] | |
| if pos.size == 0: | |
| return embeds | |
| flat = embeds.reshape(B * L, H) | |
| flat[mx.array(pos)] = features.astype(flat.dtype) | |
| return flat.reshape(B, L, H) | |
| class InnerModel(nn.Module): | |
| """The ``model.`` level holding the three towers.""" | |
| def __init__(self, config: InklingConfig): | |
| super().__init__() | |
| self.llm = TextModel(config.text) | |
| self.visual = VisionModel(config.vision) | |
| self.audio = AudioModel(config.audio) | |
| class InklingForConditionalGeneration(nn.Module): | |
| def __init__(self, config: InklingConfig): | |
| super().__init__() | |
| self.config = config | |
| self.model = InnerModel(config) | |
| # --- convenience accessors --- | |
| def llm(self) -> TextModel: | |
| return self.model.llm | |
| def __call__( | |
| self, | |
| input_ids: mx.array, | |
| pixel_values: mx.array | None = None, | |
| audio_input_ids: mx.array | None = None, | |
| conv_mask=None, | |
| caches=None, | |
| start_pos: int = 0, | |
| last_logit_only: bool = False, | |
| ) -> mx.array: | |
| embeds = self.model.llm.embed_tokens(input_ids) | |
| if pixel_values is not None: | |
| img = self.model.visual(pixel_values) | |
| embeds = _scatter_features(embeds, input_ids, self.config.image_token_id, img) | |
| if audio_input_ids is not None: | |
| aud = self.model.audio(audio_input_ids) | |
| embeds = _scatter_features(embeds, input_ids, self.config.audio_token_id, aud) | |
| hidden = self.model.llm.backbone(embeds, conv_mask=conv_mask, caches=caches, start_pos=start_pos) | |
| if last_logit_only: | |
| hidden = hidden[:, -1:, :] | |
| return self.model.llm.logits(hidden) | |