Image-Text-to-Text
MLX
Safetensors
modilify_mk1
diffusion
multimodal
mixture-of-experts
conversational
Instructions to use modilify/Modilify-Mk1-MLX with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use modilify/Modilify-Mk1-MLX 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("modilify/Modilify-Mk1-MLX") config = load_config("modilify/Modilify-Mk1-MLX") # 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 modilify/Modilify-Mk1-MLX with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "modilify/Modilify-Mk1-MLX"
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": "modilify/Modilify-Mk1-MLX" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent
How to use modilify/Modilify-Mk1-MLX 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 "modilify/Modilify-Mk1-MLX"
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 modilify/Modilify-Mk1-MLX
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use modilify/Modilify-Mk1-MLX with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "modilify/Modilify-Mk1-MLX"
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 "modilify/Modilify-Mk1-MLX" \ --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"
| # Copyright 2026 Modilify | |
| # SPDX-License-Identifier: LicenseRef-Modilify-Open-Model-1.0 | |
| """Confidence-and-entropy commit policy for Mk1 inference. | |
| PyTorch → MLX: | |
| fused_commit_confidence same excess-entropy sigmoid-square | |
| prefix_failure_commit_lengths longest prefix with cumsum(risk) < budget | |
| first_committed_token_lengths clip after first stop token | |
| select_commit_lengths sampled prefix or greedy jump | |
| """ | |
| from __future__ import annotations | |
| from collections.abc import Sequence | |
| from dataclasses import dataclass | |
| import math | |
| import mlx.core as mx | |
| from .latent_deliberation import ( | |
| advance_trajectory_clocks, | |
| should_force_trajectory_jump, | |
| ) | |
| FUSED_EPS = 1e-6 | |
| def fused_commit_confidence( | |
| proposal_confidence: mx.array, | |
| token_entropy: mx.array, | |
| *, | |
| vocab_size: int = 256000, | |
| eps: float = FUSED_EPS, | |
| ) -> mx.array: | |
| """Fuse proposal confidence with token entropy. | |
| p = clamp(proposal_confidence, eps, 1 - eps) | |
| h2 = -p * log(p) - (1 - p) * log(1 - p) | |
| excess = max(token_entropy - h2, 0) | |
| fused = sigmoid(logit(p) - excess) ** 2 | |
| """ | |
| del vocab_size | |
| p = mx.clip(proposal_confidence.astype(mx.float32), eps, 1.0 - eps) | |
| entropy = mx.maximum(token_entropy.astype(mx.float32), 0.0) | |
| binary_entropy = -p * mx.log(p) - (1.0 - p) * mx.log1p(-p) | |
| excess = mx.maximum(entropy - binary_entropy, 0.0) | |
| logit_p = mx.log(p) - mx.log1p(-p) | |
| fused = mx.square(mx.sigmoid(logit_p - excess)) | |
| return mx.clip(fused, eps, 1.0 - eps) | |
| def fused_commit_failure_rate( | |
| proposal_confidence: mx.array, | |
| token_entropy: mx.array, | |
| **kwargs: object, | |
| ) -> mx.array: | |
| """Return ``1 - fused_commit_confidence``.""" | |
| return 1.0 - fused_commit_confidence( | |
| proposal_confidence, token_entropy, **kwargs | |
| ) | |
| class CommitPolicyDecision: | |
| """One inference transition from proposal to committed prefix.""" | |
| normal_lengths: mx.array | |
| commit_lengths: mx.array | |
| commit_token_ids: mx.array | |
| jump_rows: mx.array | |
| ponder_steps: mx.array | |
| stagnation_steps: mx.array | |
| def prefix_failure_commit_lengths( | |
| failure_rate: mx.array, | |
| *, | |
| failure_budget: float, | |
| valid_mask: mx.array | None = None, | |
| ) -> mx.array: | |
| """Return the longest prefix with ``cumsum(failure_rate) < budget``.""" | |
| if failure_rate.ndim != 2: | |
| raise ValueError("Failure rate must have shape [batch, canvas].") | |
| if not math.isfinite(failure_budget) or failure_budget <= 0: | |
| raise ValueError("Commit failure budget must be finite and positive.") | |
| if valid_mask is None: | |
| valid_mask = mx.ones(failure_rate.shape, dtype=mx.bool_) | |
| if valid_mask.shape != failure_rate.shape: | |
| raise ValueError("Commit validity mask must match failure rate.") | |
| risk = mx.clip(failure_rate.astype(mx.float32), 0.0, 1.0) * valid_mask.astype( | |
| mx.float32 | |
| ) | |
| cumulative_risk = mx.cumsum(risk, axis=-1) | |
| contiguous_valid = mx.cumprod(valid_mask.astype(mx.int32), axis=-1).astype( | |
| mx.bool_ | |
| ) | |
| allowed = (cumulative_risk < float(failure_budget)) & contiguous_valid | |
| return mx.sum(mx.cumprod(allowed.astype(mx.int32), axis=-1), axis=-1) | |
| def first_committed_token_lengths( | |
| proposal: mx.array, | |
| commit_lengths: mx.array, | |
| token_id: int | Sequence[int], | |
| ) -> mx.array: | |
| """Clip each prefix immediately after its first stop token.""" | |
| if proposal.ndim != 2 or commit_lengths.shape != proposal.shape[:1]: | |
| raise ValueError("Proposal and commit lengths must share a batch dimension.") | |
| canvas = proposal.shape[1] | |
| positions = mx.arange(canvas)[None, :] | |
| committed = positions < commit_lengths[:, None] | |
| if isinstance(token_id, int): | |
| stop_token_ids = (int(token_id),) | |
| else: | |
| stop_token_ids = tuple(dict.fromkeys(int(value) for value in token_id)) | |
| if not stop_token_ids: | |
| raise ValueError("At least one stop token ID is required.") | |
| matches = proposal == stop_token_ids[0] | |
| for value in stop_token_ids[1:]: | |
| matches = matches | (proposal == value) | |
| matches = matches & committed | |
| sentinel = mx.full(positions.shape, canvas, dtype=positions.dtype) | |
| first = mx.min(mx.where(matches, positions, sentinel), axis=-1) | |
| clipped = mx.where(first < canvas, first + 1, commit_lengths) | |
| return mx.minimum(clipped, commit_lengths) | |
| def bounded_prefix_failure_commit_lengths( | |
| committed_token_ids: mx.array, | |
| failure_rate: mx.array, | |
| *, | |
| failure_budget: float, | |
| remaining_lengths: mx.array, | |
| stop_token_id: int | Sequence[int], | |
| valid_mask: mx.array | None = None, | |
| ) -> mx.array: | |
| """Apply remaining-length and stop-token bounds to the prefix policy.""" | |
| if committed_token_ids.shape != failure_rate.shape: | |
| raise ValueError( | |
| "Committed token IDs and failure rate must share [batch, canvas]." | |
| ) | |
| if remaining_lengths.shape != committed_token_ids.shape[:1]: | |
| raise ValueError("Remaining lengths must have shape [batch].") | |
| commit_lengths = prefix_failure_commit_lengths( | |
| failure_rate, | |
| failure_budget=failure_budget, | |
| valid_mask=valid_mask, | |
| ) | |
| commit_lengths = mx.minimum(commit_lengths, mx.maximum(remaining_lengths, 0)) | |
| return first_committed_token_lengths( | |
| committed_token_ids, | |
| commit_lengths, | |
| stop_token_id, | |
| ) | |
| def select_commit_lengths( | |
| sampled_token_ids: mx.array, | |
| normal_failure_rate: mx.array, | |
| previous_failure_rate: mx.array, | |
| greedy_token_ids: mx.array, | |
| jump_failure_rate: mx.array, | |
| *, | |
| ponder_steps: mx.array, | |
| stagnation_steps: mx.array, | |
| active_rows: mx.array, | |
| remaining_lengths: mx.array, | |
| failure_budget: float, | |
| jump_failure_budget: float, | |
| stop_token_id: int | Sequence[int], | |
| max_ponder_steps: int, | |
| stagnation_threshold: int, | |
| min_progress: float, | |
| valid_mask: mx.array | None = None, | |
| ) -> CommitPolicyDecision: | |
| """Select sampled commits or a greedy jump after stagnation.""" | |
| if not ( | |
| sampled_token_ids.shape | |
| == normal_failure_rate.shape | |
| == previous_failure_rate.shape | |
| == greedy_token_ids.shape | |
| == jump_failure_rate.shape | |
| ): | |
| raise ValueError("Sampled and greedy statistics must share [batch, canvas].") | |
| normal = bounded_prefix_failure_commit_lengths( | |
| sampled_token_ids, | |
| normal_failure_rate, | |
| failure_budget=failure_budget, | |
| remaining_lengths=remaining_lengths, | |
| stop_token_id=stop_token_id, | |
| valid_mask=valid_mask, | |
| ) | |
| canvas_length = normal_failure_rate.shape[1] | |
| previous_prefix_length = prefix_failure_commit_lengths( | |
| previous_failure_rate, | |
| failure_budget=failure_budget, | |
| valid_mask=valid_mask, | |
| ) | |
| frontier_length = mx.maximum(previous_prefix_length, normal) + 1 | |
| if valid_mask is not None: | |
| valid_lengths = mx.sum(valid_mask.astype(mx.int32), axis=-1) | |
| else: | |
| valid_lengths = mx.full(frontier_length.shape, canvas_length) | |
| frontier_length = mx.minimum(frontier_length, valid_lengths) | |
| positions = mx.arange(canvas_length)[None, :] | |
| progress_mask = positions < frontier_length[:, None] | |
| if valid_mask is not None: | |
| progress_mask = progress_mask & valid_mask | |
| progress_mask = progress_mask & active_rows[:, None] | |
| signed_improvement = previous_failure_rate.astype(mx.float32) - ( | |
| normal_failure_rate.astype(mx.float32) | |
| ) | |
| weights = progress_mask.astype(mx.float32) | |
| progress = mx.sum(signed_improvement * weights, axis=-1) / mx.maximum( | |
| mx.sum(weights, axis=-1), 1.0 | |
| ) | |
| next_ponder, next_stagnation = advance_trajectory_clocks( | |
| ponder_steps, | |
| stagnation_steps, | |
| commit_lengths=normal, | |
| active_rows=active_rows, | |
| progress_scores=progress, | |
| min_progress=min_progress, | |
| ) | |
| jump_rows = ( | |
| (normal == 0) | |
| & active_rows | |
| & should_force_trajectory_jump( | |
| next_ponder, | |
| next_stagnation, | |
| max_ponder_steps=max_ponder_steps, | |
| stagnation_threshold=stagnation_threshold, | |
| ) | |
| ) | |
| jump_commit = bounded_prefix_failure_commit_lengths( | |
| greedy_token_ids, | |
| jump_failure_rate, | |
| failure_budget=jump_failure_budget, | |
| remaining_lengths=remaining_lengths, | |
| stop_token_id=stop_token_id, | |
| valid_mask=valid_mask, | |
| ) | |
| committed = mx.where(jump_rows, jump_commit, normal) | |
| commit_token_ids = mx.where( | |
| jump_rows[:, None], | |
| greedy_token_ids, | |
| sampled_token_ids, | |
| ) | |
| committed = first_committed_token_lengths( | |
| commit_token_ids, | |
| committed, | |
| stop_token_id, | |
| ) | |
| committed = mx.where(active_rows, committed, 0) | |
| jump_rows = jump_rows & (committed > 0) | |
| next_ponder = mx.where(committed > 0, 0, next_ponder).astype(mx.int32) | |
| next_stagnation = mx.where(committed > 0, 0, next_stagnation).astype(mx.int32) | |
| return CommitPolicyDecision( | |
| normal_lengths=normal, | |
| commit_lengths=committed, | |
| commit_token_ids=commit_token_ids, | |
| jump_rows=jump_rows, | |
| ponder_steps=next_ponder, | |
| stagnation_steps=next_stagnation, | |
| ) | |