Image-Text-to-Text
MLX
Safetensors
gemma4_unified
apple-silicon
multimodal
text-classification
image-classification
typed-decision
conversational
4-bit precision
Instructions to use Ruiruiz30/Jev-Omni-MLX-4bit with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use Ruiruiz30/Jev-Omni-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("Ruiruiz30/Jev-Omni-MLX-4bit") config = load_config("Ruiruiz30/Jev-Omni-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 Ruiruiz30/Jev-Omni-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 "Ruiruiz30/Jev-Omni-MLX-4bit"
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": "Ruiruiz30/Jev-Omni-MLX-4bit" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent
How to use Ruiruiz30/Jev-Omni-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 "Ruiruiz30/Jev-Omni-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 Ruiruiz30/Jev-Omni-MLX-4bit
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use Ruiruiz30/Jev-Omni-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 "Ruiruiz30/Jev-Omni-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 "Ruiruiz30/Jev-Omni-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"
refresh calibrated classifier and benchmark card
Browse files- README.md +1 -1
- omni_mlx/classifier.py +6 -0
README.md
CHANGED
|
@@ -49,7 +49,7 @@ The published Jev-Omni H200 numbers are not transferable to this Mac mini. This
|
|
| 49 |
- Maximum absolute probability difference on the four upstream text cases: 0.244 in this small check.
|
| 50 |
- Public JevBench v1.2 public items (easy + original + hard, 231 decisions) were re-run locally. Raw accuracy was **87.88%**; state-macro and micro are identical because each public item is one state/question. Raw ECE-10 was **0.04497**.
|
| 51 |
- A single global temperature was fit on even source rows (116 items) and checked on odd rows (115 items): `T=1.11517`. On all 231 items, ECE-10 was **0.03069** after scaling; the held-out ECE was **0.06774** versus raw **0.06261**, so this is a published post-hoc calibration artifact, not a universal confidence guarantee.
|
| 52 |
-
- DecisionBench
|
| 53 |
- The runtime supports the published temperature file through `--calibration calibration.json`. Accuracy/argmax is unchanged by temperature scaling; only the returned probability distribution changes.
|
| 54 |
|
| 55 |
## Installation
|
|
|
|
| 49 |
- Maximum absolute probability difference on the four upstream text cases: 0.244 in this small check.
|
| 50 |
- Public JevBench v1.2 public items (easy + original + hard, 231 decisions) were re-run locally. Raw accuracy was **87.88%**; state-macro and micro are identical because each public item is one state/question. Raw ECE-10 was **0.04497**.
|
| 51 |
- A single global temperature was fit on even source rows (116 items) and checked on odd rows (115 items): `T=1.11517`. On all 231 items, ECE-10 was **0.03069** after scaling; the held-out ECE was **0.06774** versus raw **0.06261**, so this is a published post-hoc calibration artifact, not a universal confidence guarantee.
|
| 52 |
+
- DecisionBench medium was started with the original full states; an exact checkpoint (68/293 questions, 0 errors) is under `artifacts/benchmarks/runs/` in the source project. The partial aggregate is deliberately not presented as the official complete score because long states take tens of seconds to minutes on a 16GB Mac.
|
| 53 |
- The runtime supports the published temperature file through `--calibration calibration.json`. Accuracy/argmax is unchanged by temperature scaling; only the returned probability distribution changes.
|
| 54 |
|
| 55 |
## Installation
|
omni_mlx/classifier.py
CHANGED
|
@@ -160,6 +160,12 @@ class Classifier:
|
|
| 160 |
prefix_kwargs["per_layer_inputs"] = first_embedded.per_layer_inputs[:, :prefix_len]
|
| 161 |
prefix_hidden = self.model.language_model.model(**prefix_kwargs)
|
| 162 |
mx.eval(prefix_hidden)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
snapshots = [cache.prefix_cache_snapshot() for cache in prefix_cache]
|
| 164 |
prefix_ms = (time.perf_counter() - started) * 1000
|
| 165 |
output = []
|
|
|
|
| 160 |
prefix_kwargs["per_layer_inputs"] = first_embedded.per_layer_inputs[:, :prefix_len]
|
| 161 |
prefix_hidden = self.model.language_model.model(**prefix_kwargs)
|
| 162 |
mx.eval(prefix_hidden)
|
| 163 |
+
# KV updates use lazy MLX assignment; materialise the cache before
|
| 164 |
+
# taking snapshots so later suffix requests see the exact prefix.
|
| 165 |
+
for cache in prefix_cache:
|
| 166 |
+
state = cache.state
|
| 167 |
+
if state and state[0] is not None:
|
| 168 |
+
mx.eval(*state)
|
| 169 |
snapshots = [cache.prefix_cache_snapshot() for cache in prefix_cache]
|
| 170 |
prefix_ms = (time.perf_counter() - started) * 1000
|
| 171 |
output = []
|