lumynax-marama-route 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -0
- package/README.md +365 -0
- package/bin/launcher.js +90 -0
- package/package.json +48 -0
- package/scripts/postinstall.js +137 -0
- package/vendor/lumynax_marama_route-0.4.3-py3-none-any.whl +0 -0
package/LICENSE
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# LumynaX MaramaRoute
|
|
2
|
+
|
|
3
|
+
> AbteeX AI Labs model router, downloader, and local runtime CLI for the LumynaX Hugging Face model family.
|
|
4
|
+
> One install. 98 curated LumynaX model entries. Pull model weights on demand from Hugging Face.
|
|
5
|
+
|
|
6
|
+
[](https://pypi.org/project/lumynax-marama-route/)
|
|
7
|
+
[](https://www.npmjs.com/package/lumynax-marama-route)
|
|
8
|
+
[](https://huggingface.co/AbteeXAILab/marama-route)
|
|
9
|
+
[](https://www.apache.org/licenses/LICENSE-2.0)
|
|
10
|
+
[](https://www.python.org/downloads/)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What is MaramaRoute?
|
|
15
|
+
|
|
16
|
+
MaramaRoute is the AbteeX AI Labs command line surface for LumynaX models:
|
|
17
|
+
|
|
18
|
+
- `catalog` shows the bundled Hugging Face-backed LumynaX registry.
|
|
19
|
+
- `pull` downloads a model artifact into the local MaramaRoute cache.
|
|
20
|
+
- `run` executes a pulled GGUF model when `llama-cpp-python` is installed.
|
|
21
|
+
- `route`, `compare`, `matrix`, and `analytics` explain which LumynaX model fits a request and why.
|
|
22
|
+
- `serve` starts the local browser console and route API for governed applications.
|
|
23
|
+
|
|
24
|
+
The package does not bundle large model weights. It bundles the registry and download logic, then pulls weights from the AbteeXAILab Hugging Face repos selected by model id.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install lumynax-marama-route
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The same CLI is available through npm for Node-first teams:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g lumynax-marama-route
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Six command aliases are installed:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
MaramaRoute --help
|
|
44
|
+
LumynaXRoute --help
|
|
45
|
+
marama-route --help
|
|
46
|
+
maramaroute --help
|
|
47
|
+
lumynax-route --help
|
|
48
|
+
lumynaxroute --help
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 30-second Quickstart
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install lumynax-marama-route
|
|
57
|
+
|
|
58
|
+
# List every bundled AbteeXAILab Hugging Face model entry.
|
|
59
|
+
MaramaRoute catalog
|
|
60
|
+
|
|
61
|
+
# Download a small GGUF model into the local MaramaRoute cache.
|
|
62
|
+
MaramaRoute pull lumynax-coder-qwen25-05b-instruct-gguf
|
|
63
|
+
|
|
64
|
+
# Run a pulled GGUF model locally when llama-cpp-python is installed.
|
|
65
|
+
python -m pip install llama-cpp-python
|
|
66
|
+
MaramaRoute run lumynax-coder-qwen25-05b-instruct-gguf "Say kia ora to Aotearoa."
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If you only want to inspect what would be downloaded:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
MaramaRoute pull lumynax-coder-qwen25-05b-instruct-gguf --dry-run
|
|
73
|
+
MaramaRoute local
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Model download commands
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Download the primary artifact listed in the registry.
|
|
82
|
+
MaramaRoute pull lumynax-coder-qwen25-05b-instruct-gguf
|
|
83
|
+
|
|
84
|
+
# Download every file in the Hugging Face repo snapshot.
|
|
85
|
+
MaramaRoute pull lumynax-coder-qwen25-05b-instruct-gguf --all-files
|
|
86
|
+
|
|
87
|
+
# Use a custom cache directory.
|
|
88
|
+
MaramaRoute pull lumynax-coder-qwen25-05b-instruct-gguf --cache-dir ./models
|
|
89
|
+
|
|
90
|
+
# Run locally after pull; GGUF models use llama.cpp through llama-cpp-python.
|
|
91
|
+
MaramaRoute run lumynax-coder-qwen25-05b-instruct-gguf "Write a tiny Python function."
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Registry coverage
|
|
97
|
+
|
|
98
|
+
Distribution across the LumynaX family:
|
|
99
|
+
|
|
100
|
+
**Families:** qwen (29) | deepseek (6) | lumynax (6) | phi (6) | mistral (5) | olmo (5) | granite (4) | smollm (4)
|
|
101
|
+
|
|
102
|
+
**Runtimes:** llama_cpp (65) | llama_cpp_multimodal (3) | python_embedding (4) | transformers (21) | transformers_multimodal (5)
|
|
103
|
+
|
|
104
|
+
Every model in the bundled registry carries:
|
|
105
|
+
|
|
106
|
+
- `model_id`
|
|
107
|
+
- `repo_id`
|
|
108
|
+
- `runtime`
|
|
109
|
+
- `modalities`
|
|
110
|
+
- `context_tokens`
|
|
111
|
+
- `residency`
|
|
112
|
+
- `license_id`
|
|
113
|
+
- `sovereignty_tier`
|
|
114
|
+
- `primary_artifact`
|
|
115
|
+
|
|
116
|
+
Common catalog commands:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
MaramaRoute models
|
|
120
|
+
MaramaRoute catalog --task code --limit 10
|
|
121
|
+
MaramaRoute catalog --task reasoning --requires-tools --jurisdiction NZ
|
|
122
|
+
MaramaRoute catalog --search qwen --family qwen --limit 20
|
|
123
|
+
MaramaRoute analytics
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Full Hugging Face model list
|
|
129
|
+
|
|
130
|
+
| Model id | Hugging Face repo | Runtime | Tier | Primary artifact |
|
|
131
|
+
|---|---|---:|---:|---|
|
|
132
|
+
| `lumynax-coder-qwen25-05b-instruct-gguf` | [`AbteeXAILab/lumynax-coder-qwen25-05b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-qwen25-05b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-coder-0.5b-instruct-q4_k_m.gguf` |
|
|
133
|
+
| `lumynax-coder-qwen25-14b-instruct-gguf` | [`AbteeXAILab/lumynax-coder-qwen25-14b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-qwen25-14b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-coder-14b-instruct-q4_k_m.gguf` |
|
|
134
|
+
| `lumynax-coder-qwen25-15b-instruct-gguf` | [`AbteeXAILab/lumynax-coder-qwen25-15b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-qwen25-15b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-coder-1.5b-instruct-q4_k_m.gguf` |
|
|
135
|
+
| `lumynax-coder-qwen25-7b-instruct-gguf` | [`AbteeXAILab/lumynax-coder-qwen25-7b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-qwen25-7b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-coder-7b-instruct-q4_k_m.gguf` |
|
|
136
|
+
| `lumynax-embed-bge-m3` | [`AbteeXAILab/lumynax-embed-bge-m3`](https://huggingface.co/AbteeXAILab/lumynax-embed-bge-m3) | `python_embedding` | 2 | `merged_model/pytorch_model.bin` |
|
|
137
|
+
| `lumynax-embed-e5-mistral-7b` | [`AbteeXAILab/lumynax-embed-e5-mistral-7b`](https://huggingface.co/AbteeXAILab/lumynax-embed-e5-mistral-7b) | `python_embedding` | 2 | `merged_model/model-00001-of-00002.safetensors` |
|
|
138
|
+
| `lumynax-frontier-minimax-m25-unsloth` | [`AbteeXAILab/lumynax-frontier-minimax-m25-unsloth`](https://huggingface.co/AbteeXAILab/lumynax-frontier-minimax-m25-unsloth) | `llama_cpp` | 3 | `MiniMax-M2.5-UD-TQ1_0.gguf` |
|
|
139
|
+
| `lumynax-infused-gemma-e4b` | [`AbteeXAILab/lumynax-infused-gemma-e4b`](https://huggingface.co/AbteeXAILab/lumynax-infused-gemma-e4b) | `transformers_multimodal` | 2 | `merged_model/model.safetensors` |
|
|
140
|
+
| `lumynax-infused-gemma-e4b-text-gguf` | [`AbteeXAILab/lumynax-infused-gemma-e4b-text-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-gemma-e4b-text-gguf) | `llama_cpp` | 3 | `lumynax-infused-gemma-e4b-text-gguf-q4_k_m.gguf` |
|
|
141
|
+
| `lumynax-infused-gemma4-26b-a4b-gguf` | [`AbteeXAILab/lumynax-infused-gemma4-26b-a4b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-gemma4-26b-a4b-gguf) | `llama_cpp` | 3 | `lumynax-infused-gemma4-26b-a4b-ud-q4_k_m.gguf` |
|
|
142
|
+
| `lumynax-infused-granite31-1b-a400m-gguf` | [`AbteeXAILab/lumynax-infused-granite31-1b-a400m-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-granite31-1b-a400m-gguf) | `llama_cpp` | 3 | `granite-3.1-1b-a400m-instruct-Q4_K_M.gguf` |
|
|
143
|
+
| `lumynax-infused-granite33-2b-gguf` | [`AbteeXAILab/lumynax-infused-granite33-2b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-granite33-2b-gguf) | `llama_cpp` | 3 | `granite-3.3-2b-instruct-Q4_K_M.gguf` |
|
|
144
|
+
| `lumynax-infused-granite33-8b-gguf` | [`AbteeXAILab/lumynax-infused-granite33-8b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-granite33-8b-gguf) | `llama_cpp` | 3 | `granite-3.3-8b-instruct-Q4_K_M.gguf` |
|
|
145
|
+
| `lumynax-infused-mistral-7b-v03-gguf` | [`AbteeXAILab/lumynax-infused-mistral-7b-v03-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-mistral-7b-v03-gguf) | `llama_cpp` | 3 | `Mistral-7B-Instruct-v0.3-Q4_K_M.gguf` |
|
|
146
|
+
| `lumynax-infused-mistral-small-text-gguf` | [`AbteeXAILab/lumynax-infused-mistral-small-text-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-mistral-small-text-gguf) | `llama_cpp` | 3 | `lumynax-infused-mistral-small-text-gguf-f16.gguf` |
|
|
147
|
+
| `lumynax-infused-olmo2-1b-0425-gguf` | [`AbteeXAILab/lumynax-infused-olmo2-1b-0425-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-olmo2-1b-0425-gguf) | `llama_cpp` | 3 | `OLMo-2-0425-1B-Instruct-Q4_K_M.gguf` |
|
|
148
|
+
| `lumynax-infused-olmo2-7b-1124-gguf` | [`AbteeXAILab/lumynax-infused-olmo2-7b-1124-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-olmo2-7b-1124-gguf) | `llama_cpp` | 3 | `olmo-2-1124-7B-instruct-Q4_K_M.gguf` |
|
|
149
|
+
| `lumynax-infused-phi-4-text-gguf` | [`AbteeXAILab/lumynax-infused-phi-4-text-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-phi-4-text-gguf) | `llama_cpp` | 3 | `lumynax-infused-phi-4-text-gguf-f16.gguf` |
|
|
150
|
+
| `lumynax-infused-phi3-mini-4k-gguf` | [`AbteeXAILab/lumynax-infused-phi3-mini-4k-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-phi3-mini-4k-gguf) | `llama_cpp` | 3 | `Phi-3-mini-4k-instruct-q4.gguf` |
|
|
151
|
+
| `lumynax-infused-phi4-mini-instruct-gguf` | [`AbteeXAILab/lumynax-infused-phi4-mini-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-phi4-mini-instruct-gguf) | `llama_cpp` | 3 | `Phi-4-mini-instruct-Q4_K_M.gguf` |
|
|
152
|
+
| `lumynax-infused-qwen2-audio-7b` | [`AbteeXAILab/lumynax-infused-qwen2-audio-7b`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen2-audio-7b) | `transformers` | 2 | `merged_model/model-00003-of-00005.safetensors` |
|
|
153
|
+
| `lumynax-infused-qwen25-15b-instruct-gguf` | [`AbteeXAILab/lumynax-infused-qwen25-15b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen25-15b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-1.5b-instruct-q4_k_m.gguf` |
|
|
154
|
+
| `lumynax-infused-qwen25-3b-instruct-gguf` | [`AbteeXAILab/lumynax-infused-qwen25-3b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen25-3b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-3b-instruct-q4_k_m.gguf` |
|
|
155
|
+
| `lumynax-infused-qwen25-7b-instruct-gguf` | [`AbteeXAILab/lumynax-infused-qwen25-7b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen25-7b-instruct-gguf) | `llama_cpp` | 3 | `qwen2.5-7b-instruct-q3_k_m.gguf` |
|
|
156
|
+
| `lumynax-infused-qwen25-omni-7b-voice` | [`AbteeXAILab/lumynax-infused-qwen25-omni-7b-voice`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen25-omni-7b-voice) | `transformers` | 2 | `merged_model/model-00003-of-00005.safetensors` |
|
|
157
|
+
| `lumynax-infused-qwen3-06b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-06b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-06b-gguf) | `llama_cpp` | 3 | `Qwen3-0.6B-Q8_0.gguf` |
|
|
158
|
+
| `lumynax-infused-qwen3-14b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-14b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-14b-gguf) | `llama_cpp` | 3 | `Qwen3-14B-Q4_K_M.gguf` |
|
|
159
|
+
| `lumynax-infused-qwen3-17b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-17b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-17b-gguf) | `llama_cpp` | 3 | `Qwen3-1.7B-Q8_0.gguf` |
|
|
160
|
+
| `lumynax-infused-qwen3-30b-a3b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-30b-a3b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-30b-a3b-gguf) | `llama_cpp` | 3 | `lumynax-infused-qwen3-30b-a3b-q4_k_m.gguf` |
|
|
161
|
+
| `lumynax-infused-qwen3-8b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-8b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-8b-gguf) | `llama_cpp` | 3 | `lumynax-infused-qwen3-8b-q4_k_m.gguf` |
|
|
162
|
+
| `lumynax-infused-qwen3-coder-30b-a3b-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-coder-30b-a3b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-coder-30b-a3b-gguf) | `llama_cpp` | 3 | `lumynax-infused-qwen3-coder-30b-a3b-q4_k_m.gguf` |
|
|
163
|
+
| `lumynax-infused-qwen3-text-gguf` | [`AbteeXAILab/lumynax-infused-qwen3-text-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-qwen3-text-gguf) | `llama_cpp` | 3 | `lumynax-infused-qwen3-text-gguf-f16.gguf` |
|
|
164
|
+
| `lumynax-infused-smollm-135m-gguf` | [`AbteeXAILab/lumynax-infused-smollm-135m-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-smollm-135m-gguf) | `llama_cpp` | 3 | `SmolLM-135M-Instruct.Q4_K_M.gguf` |
|
|
165
|
+
| `lumynax-infused-smollm2-17b-gguf` | [`AbteeXAILab/lumynax-infused-smollm2-17b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-smollm2-17b-gguf) | `llama_cpp` | 3 | `smollm2-1.7b-instruct-q4_k_m.gguf` |
|
|
166
|
+
| `lumynax-infused-smollm2-360m-gguf` | [`AbteeXAILab/lumynax-infused-smollm2-360m-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-smollm2-360m-gguf) | `llama_cpp` | 3 | `smollm2-360m-instruct-q8_0.gguf` |
|
|
167
|
+
| `lumynax-infused-smollm3-3b-gguf` | [`AbteeXAILab/lumynax-infused-smollm3-3b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-smollm3-3b-gguf) | `llama_cpp` | 3 | `SmolLM3-Q4_K_M.gguf` |
|
|
168
|
+
| `lumynax-infused-zephyr-7b-beta-gguf` | [`AbteeXAILab/lumynax-infused-zephyr-7b-beta-gguf`](https://huggingface.co/AbteeXAILab/lumynax-infused-zephyr-7b-beta-gguf) | `llama_cpp` | 3 | `zephyr-7b-beta.Q4_K_M.gguf` |
|
|
169
|
+
| `lumynax-moe-moonlight-16b-a3b-gguf` | [`AbteeXAILab/lumynax-moe-moonlight-16b-a3b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-moe-moonlight-16b-a3b-gguf) | `llama_cpp` | 3 | `lumynax-moe-moonlight-16b-a3b-iq4_xs.gguf` |
|
|
170
|
+
| `lumynax-moe-olmoe-1b-7b-gguf` | [`AbteeXAILab/lumynax-moe-olmoe-1b-7b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-moe-olmoe-1b-7b-gguf) | `llama_cpp` | 3 | `olmoe-1b-7b-0924-instruct-q4_k_m.gguf` |
|
|
171
|
+
| `lumynax-multimodal-glm46v-flash` | [`AbteeXAILab/lumynax-multimodal-glm46v-flash`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-glm46v-flash) | `llama_cpp_multimodal` | 2 | `lumynax-multimodal-glm46v-flash-ud-iq2_m.gguf` |
|
|
172
|
+
| `lumynax-multimodal-kimi-vl-a3b-thinking` | [`AbteeXAILab/lumynax-multimodal-kimi-vl-a3b-thinking`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-kimi-vl-a3b-thinking) | `llama_cpp_multimodal` | 2 | `lumynax-multimodal-kimi-vl-a3b-thinking-q4_k_m.gguf` |
|
|
173
|
+
| `lumynax-nz-3b` | [`AbteeXAILab/lumynax-nz-3b`](https://huggingface.co/AbteeXAILab/lumynax-nz-3b) | `transformers` | 2 | `merged_model/model-00001-of-00055.safetensors` |
|
|
174
|
+
| `lumynax-nz-qwen25-coder-3b-gguf` | [`AbteeXAILab/lumynax-nz-qwen25-coder-3b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-nz-qwen25-coder-3b-gguf) | `llama_cpp` | 3 | `lumynax-nz-qwen25-coder-3b-q4_k_m.gguf` |
|
|
175
|
+
| `lumynax-reasoning-deepseek-distill-text-gguf` | [`AbteeXAILab/lumynax-reasoning-deepseek-distill-text-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-deepseek-distill-text-gguf) | `llama_cpp` | 3 | `lumynax-reasoning-deepseek-distill-text-gguf-f16.gguf` |
|
|
176
|
+
| `lumynax-reasoning-deepseek-r1-qwen-15b-gguf` | [`AbteeXAILab/lumynax-reasoning-deepseek-r1-qwen-15b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-deepseek-r1-qwen-15b-gguf) | `llama_cpp` | 3 | `DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M.gguf` |
|
|
177
|
+
| `lumynax-reasoning-deepseek-r1-qwen-7b-gguf` | [`AbteeXAILab/lumynax-reasoning-deepseek-r1-qwen-7b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-deepseek-r1-qwen-7b-gguf) | `llama_cpp` | 3 | `DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf` |
|
|
178
|
+
| `lumynax-reasoning-gpt-oss-20b-gguf` | [`AbteeXAILab/lumynax-reasoning-gpt-oss-20b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-gpt-oss-20b-gguf) | `llama_cpp` | 3 | `lumynax-reasoning-gpt-oss-20b-mxfp4.gguf` |
|
|
179
|
+
| `lumynax-reasoning-phi4-mini-gguf` | [`AbteeXAILab/lumynax-reasoning-phi4-mini-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-phi4-mini-gguf) | `llama_cpp` | 3 | `Phi-4-mini-reasoning-Q4_K_M.gguf` |
|
|
180
|
+
| `lumynax-tiny` | [`AbteeXAILab/lumynax-tiny`](https://huggingface.co/AbteeXAILab/lumynax-tiny) | `transformers` | 2 | `merged_model/model.safetensors` |
|
|
181
|
+
| `lumynax-tiny-qwen25-05b-gguf` | [`AbteeXAILab/lumynax-tiny-qwen25-05b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-tiny-qwen25-05b-gguf) | `llama_cpp` | 3 | `lumynax-tiny-qwen25-05b-q4_k_m.gguf` |
|
|
182
|
+
| `lumynax-frontier-qwen3-235b-a22b-instruct` | [`AbteeXAILab/lumynax-frontier-qwen3-235b-a22b-instruct`](https://huggingface.co/AbteeXAILab/lumynax-frontier-qwen3-235b-a22b-instruct) | `transformers` | 2 | `model.safetensors (sharded)` |
|
|
183
|
+
| `lumynax-frontier-minimax-m2-230b` | [`AbteeXAILab/lumynax-frontier-minimax-m2-230b`](https://huggingface.co/AbteeXAILab/lumynax-frontier-minimax-m2-230b) | `transformers` | 2 | `model.safetensors (sharded)` |
|
|
184
|
+
| `lumynax-frontier-mixtral-8x22b-instruct-gguf` | [`AbteeXAILab/lumynax-frontier-mixtral-8x22b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-mixtral-8x22b-instruct-gguf) | `llama_cpp` | 3 | `Mixtral-8x22B-Instruct-v0.1.Q4_K_M.gguf` |
|
|
185
|
+
| `lumynax-frontier-dbrx-instruct-132b-gguf` | [`AbteeXAILab/lumynax-frontier-dbrx-instruct-132b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-dbrx-instruct-132b-gguf) | `llama_cpp` | 3 | `dbrx-instruct.Q4_K_M.gguf` |
|
|
186
|
+
| `lumynax-multimodal-qwen25-vl-72b-instruct-gguf` | [`AbteeXAILab/lumynax-multimodal-qwen25-vl-72b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-qwen25-vl-72b-instruct-gguf) | `llama_cpp_multimodal` | 3 | `Qwen2.5-VL-72B-Instruct-Q4_K_M.gguf` |
|
|
187
|
+
| `lumynax-multimodal-pixtral-large-124b` | [`AbteeXAILab/lumynax-multimodal-pixtral-large-124b`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-pixtral-large-124b) | `transformers_multimodal` | 2 | `model.safetensors (sharded)` |
|
|
188
|
+
| `lumynax-reasoning-glm46-355b-moe` | [`AbteeXAILab/lumynax-reasoning-glm46-355b-moe`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-glm46-355b-moe) | `transformers` | 2 | `model.safetensors (sharded)` |
|
|
189
|
+
| `lumynax-multimodal-internvl3-78b-instruct` | [`AbteeXAILab/lumynax-multimodal-internvl3-78b-instruct`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-internvl3-78b-instruct) | `transformers_multimodal` | 2 | `model.safetensors (33 shards)` |
|
|
190
|
+
| `lumynax-speech-whisper-large-v3-turbo` | [`AbteeXAILab/lumynax-speech-whisper-large-v3-turbo`](https://huggingface.co/AbteeXAILab/lumynax-speech-whisper-large-v3-turbo) | `transformers` | 3 | `model.safetensors` |
|
|
191
|
+
| `lumynax-speech-kokoro-82m-tts` | [`AbteeXAILab/lumynax-speech-kokoro-82m-tts`](https://huggingface.co/AbteeXAILab/lumynax-speech-kokoro-82m-tts) | `transformers` | 3 | `kokoro-v1_0.pth` |
|
|
192
|
+
| `lumynax-reranker-bge-v2-m3` | [`AbteeXAILab/lumynax-reranker-bge-v2-m3`](https://huggingface.co/AbteeXAILab/lumynax-reranker-bge-v2-m3) | `transformers` | 3 | `model.safetensors` |
|
|
193
|
+
| `lumynax-guard-text-moderation` | [`AbteeXAILab/lumynax-guard-text-moderation`](https://huggingface.co/AbteeXAILab/lumynax-guard-text-moderation) | `transformers` | 3 | `model.safetensors` |
|
|
194
|
+
| `lumynax-math-qwen25-math-7b-gguf` | [`AbteeXAILab/lumynax-math-qwen25-math-7b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-math-qwen25-math-7b-gguf) | `llama_cpp` | 3 | `Qwen2.5-Math-7B-Instruct-Q4_K_M.gguf` |
|
|
195
|
+
| `lumynax-translate-nllb-200-3b` | [`AbteeXAILab/lumynax-translate-nllb-200-3b`](https://huggingface.co/AbteeXAILab/lumynax-translate-nllb-200-3b) | `transformers` | 3 | `model.safetensors` |
|
|
196
|
+
| `lumynax-coder-deepseek-v2-lite-16b-gguf` | [`AbteeXAILab/lumynax-coder-deepseek-v2-lite-16b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-deepseek-v2-lite-16b-gguf) | `llama_cpp` | 3 | `DeepSeek-Coder-V2-Lite-Instruct-Q4_K_M.gguf` |
|
|
197
|
+
| `lumynax-chat-hermes-3-llama31-8b-gguf` | [`AbteeXAILab/lumynax-chat-hermes-3-llama31-8b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-chat-hermes-3-llama31-8b-gguf) | `llama_cpp` | 3 | `Hermes-3-Llama-3.1-8B-Q4_K_M.gguf` |
|
|
198
|
+
| `lumynax-doc-nougat-base` | [`AbteeXAILab/lumynax-doc-nougat-base`](https://huggingface.co/AbteeXAILab/lumynax-doc-nougat-base) | `transformers` | 3 | `model.safetensors` |
|
|
199
|
+
| `lumynax-doc-donut-base` | [`AbteeXAILab/lumynax-doc-donut-base`](https://huggingface.co/AbteeXAILab/lumynax-doc-donut-base) | `transformers` | 3 | `model.safetensors` |
|
|
200
|
+
| `lumynax-ocr-trocr-large-printed` | [`AbteeXAILab/lumynax-ocr-trocr-large-printed`](https://huggingface.co/AbteeXAILab/lumynax-ocr-trocr-large-printed) | `transformers` | 3 | `model.safetensors` |
|
|
201
|
+
| `lumynax-ocr-trocr-large-handwritten` | [`AbteeXAILab/lumynax-ocr-trocr-large-handwritten`](https://huggingface.co/AbteeXAILab/lumynax-ocr-trocr-large-handwritten) | `transformers` | 3 | `model.safetensors` |
|
|
202
|
+
| `lumynax-doc-layoutlmv3-base` | [`AbteeXAILab/lumynax-doc-layoutlmv3-base`](https://huggingface.co/AbteeXAILab/lumynax-doc-layoutlmv3-base) | `transformers` | 3 | `model.safetensors` |
|
|
203
|
+
| `lumynax-doc-table-transformer-detection` | [`AbteeXAILab/lumynax-doc-table-transformer-detection`](https://huggingface.co/AbteeXAILab/lumynax-doc-table-transformer-detection) | `transformers` | 3 | `model.safetensors` |
|
|
204
|
+
| `lumynax-embed-nomic-v2-moe` | [`AbteeXAILab/lumynax-embed-nomic-v2-moe`](https://huggingface.co/AbteeXAILab/lumynax-embed-nomic-v2-moe) | `python_embedding` | 3 | `model.safetensors` |
|
|
205
|
+
| `lumynax-embed-granite-278m-multilingual` | [`AbteeXAILab/lumynax-embed-granite-278m-multilingual`](https://huggingface.co/AbteeXAILab/lumynax-embed-granite-278m-multilingual) | `python_embedding` | 3 | `model.safetensors` |
|
|
206
|
+
| `lumynax-frontier-qwen25-72b-instruct-gguf` | [`AbteeXAILab/lumynax-frontier-qwen25-72b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-qwen25-72b-instruct-gguf) | `llama_cpp` | 3 | `Qwen2.5-72B-Instruct-Q4_K_M.gguf` |
|
|
207
|
+
| `lumynax-frontier-olmo2-32b-instruct` | [`AbteeXAILab/lumynax-frontier-olmo2-32b-instruct`](https://huggingface.co/AbteeXAILab/lumynax-frontier-olmo2-32b-instruct) | `transformers` | 2 | `model.safetensors (sharded)` |
|
|
208
|
+
| `lumynax-chat-yi-15-34b-gguf` | [`AbteeXAILab/lumynax-chat-yi-15-34b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-chat-yi-15-34b-gguf) | `llama_cpp` | 3 | `Yi-1.5-34B-Chat-Q4_K_M.gguf` |
|
|
209
|
+
| `lumynax-reasoning-internlm3-8b-gguf` | [`AbteeXAILab/lumynax-reasoning-internlm3-8b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-internlm3-8b-gguf) | `llama_cpp` | 3 | `internlm3-8b-instruct-Q4_K_M.gguf` |
|
|
210
|
+
| `lumynax-multimodal-aria-25b-moe` | [`AbteeXAILab/lumynax-multimodal-aria-25b-moe`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-aria-25b-moe) | `transformers_multimodal` | 2 | `model.safetensors (sharded)` |
|
|
211
|
+
| `lumynax-multimodal-llava-next-34b` | [`AbteeXAILab/lumynax-multimodal-llava-next-34b`](https://huggingface.co/AbteeXAILab/lumynax-multimodal-llava-next-34b) | `transformers_multimodal` | 2 | `model.safetensors (sharded)` |
|
|
212
|
+
| `lumynax-reasoning-qwq-32b-gguf` | [`AbteeXAILab/lumynax-reasoning-qwq-32b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-qwq-32b-gguf) | `llama_cpp` | 3 | `qwq-32b-q4_k_m.gguf` |
|
|
213
|
+
| `lumynax-frontier-phi-4-14b-gguf` | [`AbteeXAILab/lumynax-frontier-phi-4-14b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-phi-4-14b-gguf) | `llama_cpp` | 3 | `phi-4-Q4_K_M.gguf` |
|
|
214
|
+
| `lumynax-frontier-coder-qwen3-480b-a35b-gguf` | [`AbteeXAILab/lumynax-frontier-coder-qwen3-480b-a35b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-coder-qwen3-480b-a35b-gguf) | `llama_cpp` | 2 | `Q4_K_M/Qwen3-Coder-480B-A35B-Instruct-Q4_K_M-00001-of-00006.gguf` |
|
|
215
|
+
| `lumynax-frontier-coder-deepseek-v25-1210-gguf` | [`AbteeXAILab/lumynax-frontier-coder-deepseek-v25-1210-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-coder-deepseek-v25-1210-gguf) | `llama_cpp` | 2 | `DeepSeek-V2.5-1210-Q4_K_M/DeepSeek-V2.5-1210-Q4_K_M-00001-of-00004.gguf` |
|
|
216
|
+
| `lumynax-coder-codellama-70b-instruct-gguf` | [`AbteeXAILab/lumynax-coder-codellama-70b-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-codellama-70b-instruct-gguf) | `llama_cpp` | 3 | `codellama-70b-instruct.Q4_K_M.gguf` |
|
|
217
|
+
| `lumynax-coder-deepseek-coder-33b-gguf` | [`AbteeXAILab/lumynax-coder-deepseek-coder-33b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-deepseek-coder-33b-gguf) | `llama_cpp` | 3 | `deepseek-coder-33b-instruct.Q4_K_M.gguf` |
|
|
218
|
+
| `lumynax-coder-qwen25-coder-32b-gguf` | [`AbteeXAILab/lumynax-coder-qwen25-coder-32b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-qwen25-coder-32b-gguf) | `llama_cpp` | 3 | `Qwen2.5-Coder-32B-Instruct-Q4_K_M.gguf` |
|
|
219
|
+
| `lumynax-coder-starcoder2-15b-gguf` | [`AbteeXAILab/lumynax-coder-starcoder2-15b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-starcoder2-15b-gguf) | `llama_cpp` | 3 | `starcoder2-15b-instruct-v0.1-Q4_K_M.gguf` |
|
|
220
|
+
| `lumynax-coder-yi-coder-9b-gguf` | [`AbteeXAILab/lumynax-coder-yi-coder-9b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-yi-coder-9b-gguf) | `llama_cpp` | 3 | `Yi-Coder-9B-Chat-Q4_K_M.gguf` |
|
|
221
|
+
| `lumynax-coder-codeqwen15-7b-chat-gguf` | [`AbteeXAILab/lumynax-coder-codeqwen15-7b-chat-gguf`](https://huggingface.co/AbteeXAILab/lumynax-coder-codeqwen15-7b-chat-gguf) | `llama_cpp` | 3 | `codeqwen-1_5-7b-chat-q4_k_m.gguf` |
|
|
222
|
+
| `lumynax-reasoning-deepseek-prover-v2-671b-gguf` | [`AbteeXAILab/lumynax-reasoning-deepseek-prover-v2-671b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-deepseek-prover-v2-671b-gguf) | `llama_cpp` | 2 | `Q4_K_M/DeepSeek-Prover-V2-671B-Q4_K_M-00001-of-00009.gguf` |
|
|
223
|
+
| `lumynax-reasoning-deepseek-r1-distill-llama-70b-gguf` | [`AbteeXAILab/lumynax-reasoning-deepseek-r1-distill-llama-70b-gguf`](https://huggingface.co/AbteeXAILab/lumynax-reasoning-deepseek-r1-distill-llama-70b-gguf) | `llama_cpp` | 3 | `DeepSeek-R1-Distill-Llama-70B-Q4_K_M.gguf` |
|
|
224
|
+
| `lumynax-longctx-prolong-512k-instruct` | [`AbteeXAILab/lumynax-longctx-prolong-512k-instruct`](https://huggingface.co/AbteeXAILab/lumynax-longctx-prolong-512k-instruct) | `transformers` | 3 | `model.safetensors.index.json` |
|
|
225
|
+
| `lumynax-frontier-phi-35-moe-instruct-gguf` | [`AbteeXAILab/lumynax-frontier-phi-35-moe-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-frontier-phi-35-moe-instruct-gguf) | `llama_cpp` | 3 | `Phi-3.5-MoE-instruct-Q4_K_M.gguf` |
|
|
226
|
+
| `lumynax-longctx-yi-9b-200k` | [`AbteeXAILab/lumynax-longctx-yi-9b-200k`](https://huggingface.co/AbteeXAILab/lumynax-longctx-yi-9b-200k) | `transformers` | 3 | `model.safetensors.index.json` |
|
|
227
|
+
| `lumynax-longctx-glm4-9b-chat-1m-gguf` | [`AbteeXAILab/lumynax-longctx-glm4-9b-chat-1m-gguf`](https://huggingface.co/AbteeXAILab/lumynax-longctx-glm4-9b-chat-1m-gguf) | `llama_cpp` | 3 | `glm-4-9b-chat-1m-Q4_K_M.gguf` |
|
|
228
|
+
| `lumynax-longctx-qwen25-7b-1m-gguf` | [`AbteeXAILab/lumynax-longctx-qwen25-7b-1m-gguf`](https://huggingface.co/AbteeXAILab/lumynax-longctx-qwen25-7b-1m-gguf) | `llama_cpp` | 3 | `Qwen2.5-7B-Instruct-1M-Q4_K_M.gguf` |
|
|
229
|
+
| `lumynax-moe-olmoe-1b-7b-0924-instruct-gguf` | [`AbteeXAILab/lumynax-moe-olmoe-1b-7b-0924-instruct-gguf`](https://huggingface.co/AbteeXAILab/lumynax-moe-olmoe-1b-7b-0924-instruct-gguf) | `llama_cpp` | 3 | `OLMoE-1B-7B-0924-Instruct-Q4_K_M.gguf` |
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Routing behavior
|
|
234
|
+
|
|
235
|
+
Every routing decision passes through ordered gates. Models that fail any gate are rejected with a documented reason.
|
|
236
|
+
|
|
237
|
+
| Gate | Rejects when |
|
|
238
|
+
|---|---|
|
|
239
|
+
| Modality match | Requested modalities are not a subset of model modalities |
|
|
240
|
+
| Context length | Model `context_tokens` is below `min_context_tokens` |
|
|
241
|
+
| Tool support | `requires_tools=true` but the model lacks tool support |
|
|
242
|
+
| JSON support | `requires_json=true` but the model lacks JSON support |
|
|
243
|
+
| License allowlist | License ID is not in the caller allowlist |
|
|
244
|
+
| Jurisdictional residency | `requires_local=true` and jurisdiction is not in model residency |
|
|
245
|
+
| Sovereignty tier | Data sensitivity requires a higher sovereignty tier |
|
|
246
|
+
|
|
247
|
+
Surviving candidates are scored on:
|
|
248
|
+
- Jurisdiction fit (+8)
|
|
249
|
+
- Task-type tag match (+7, with +10 for coder specialization, +9 for reasoning)
|
|
250
|
+
- Sovereignty bonus for `iwi` / `data sovereignty` keywords (+3 x tier)
|
|
251
|
+
- Runtime preference (GGUF/llama.cpp gets +2.5)
|
|
252
|
+
- Quality rank vs cost rank tradeoff
|
|
253
|
+
|
|
254
|
+
The router returns the winner plus the full rejection log so operators can see why each candidate did or did not qualify.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## More commands
|
|
259
|
+
|
|
260
|
+
### Local browser console and route API
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
MaramaRoute serve --port 8787 --open
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
The local server exposes:
|
|
267
|
+
|
|
268
|
+
- `GET /health`
|
|
269
|
+
- `GET /v1/models`
|
|
270
|
+
- `POST /v1/route`
|
|
271
|
+
- `POST /v1/chat/completions`
|
|
272
|
+
|
|
273
|
+
### Ask the router which model fits
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
MaramaRoute route --request examples/request.code-restricted.json
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Inspect a single model
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
MaramaRoute catalog --search starcoder --limit 5
|
|
283
|
+
MaramaRoute compare --model lumynax-coder-starcoder2-15b-gguf --model lumynax-coder-qwen25-coder-32b-gguf
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Run the built-in route scenario matrix
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
MaramaRoute matrix
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Emit an OpenCode provider config (drop into `~/.opencode/providers/`)
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
MaramaRoute opencode-config > ~/.opencode/providers/lumynax.json
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Drive it from Python
|
|
299
|
+
|
|
300
|
+
```python
|
|
301
|
+
from marama_route import (
|
|
302
|
+
SovereignModelRouter,
|
|
303
|
+
RoutingRequest,
|
|
304
|
+
load_model_registry,
|
|
305
|
+
)
|
|
306
|
+
from pathlib import Path
|
|
307
|
+
|
|
308
|
+
models = load_model_registry(Path("./my_registry.json"))
|
|
309
|
+
router = SovereignModelRouter(models)
|
|
310
|
+
|
|
311
|
+
decision = router.route(
|
|
312
|
+
RoutingRequest(
|
|
313
|
+
prompt="Translate this paragraph to te reo Maori",
|
|
314
|
+
task_type="general",
|
|
315
|
+
jurisdiction="NZ",
|
|
316
|
+
data_sensitivity="personal", # routes only to sovereignty_tier >= 2
|
|
317
|
+
requires_local=True,
|
|
318
|
+
)
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
print(decision.selected_model.model_id) # e.g. lumynax-translate-nllb-200-3b
|
|
322
|
+
print(decision.reasons) # rationale
|
|
323
|
+
print(decision.scores) # full scorecard
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Why this exists
|
|
329
|
+
|
|
330
|
+
LumynaX is built by **AbteeX AI Labs** in Auckland, Aotearoa New Zealand. Three principles drive the design:
|
|
331
|
+
|
|
332
|
+
1. **Sovereignty over convenience.** Every routing decision can be justified to a Maori data-governance reviewer, a privacy officer, or an iwi advisory board. The registry, the routing log, and the policy gates exist *for that conversation*.
|
|
333
|
+
|
|
334
|
+
2. **Local-first by default.** Tier-3+ models run on machines the data owner controls. The router never silently escalates a sensitive request to a remote frontier model.
|
|
335
|
+
|
|
336
|
+
3. **Open weights, open license, open evals.** Apache-2.0 on this routing layer. Upstream model licenses surfaced honestly per entry. No vendor lock-in.
|
|
337
|
+
|
|
338
|
+
Every model card states its provenance. Every routing decision is auditable. Every sovereignty constraint is testable.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Companion products
|
|
343
|
+
|
|
344
|
+
- **[`abteex-sovereigncode`](https://pypi.org/project/abteex-sovereigncode/)** - Policy API and audit ledger for coding agents. Pairs with MaramaRoute when you need per-request policy enforcement and tamper-evident logs.
|
|
345
|
+
- **[LumynaX model family](https://huggingface.co/AbteeXAILab)** - 98 sovereign-tagged model repos on Hugging Face, all routable through MaramaRoute out of the box.
|
|
346
|
+
- **[TinyLuminaX](https://github.com/Aimaghsoodi/TinyLuminaX)** - the heterogeneous MoE research line and training scaffolds.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Links
|
|
351
|
+
|
|
352
|
+
- **PyPI:** <https://pypi.org/project/lumynax-marama-route/>
|
|
353
|
+
- **npm:** <https://www.npmjs.com/package/lumynax-marama-route>
|
|
354
|
+
- **Hugging Face:** <https://huggingface.co/AbteeXAILab/marama-route>
|
|
355
|
+
- **GitHub:** <https://github.com/Aimaghsoodi/TinyLuminaX>
|
|
356
|
+
- **Website:** <https://lumynax.com> | <https://abteex.com>
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## License
|
|
361
|
+
|
|
362
|
+
Apache-2.0 - see [LICENSE](LICENSE).
|
|
363
|
+
|
|
364
|
+
Upstream models retain their own licenses; check each model card before commercial deployment.
|
|
365
|
+
|
package/bin/launcher.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Launcher: finds a Python 3.11+ interpreter and dispatches to marama_route.cli.
|
|
3
|
+
// The wheel was installed during `npm install` via scripts/postinstall.js.
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
const { spawnSync } = require('node:child_process');
|
|
7
|
+
const path = require('node:path');
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
|
|
10
|
+
const MIN_PY_MAJOR = 3;
|
|
11
|
+
const MIN_PY_MINOR = 11;
|
|
12
|
+
|
|
13
|
+
function tryPython(cmd, args) {
|
|
14
|
+
try {
|
|
15
|
+
const result = spawnSync(cmd, args, { encoding: 'utf8' });
|
|
16
|
+
if (result.error || result.status !== 0) return null;
|
|
17
|
+
return result.stdout.trim();
|
|
18
|
+
} catch (_err) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function pythonMeetsMin(versionLine) {
|
|
24
|
+
// versionLine looks like "Python 3.12.4"
|
|
25
|
+
const match = versionLine.match(/Python (\d+)\.(\d+)/);
|
|
26
|
+
if (!match) return false;
|
|
27
|
+
const major = parseInt(match[1], 10);
|
|
28
|
+
const minor = parseInt(match[2], 10);
|
|
29
|
+
if (major > MIN_PY_MAJOR) return true;
|
|
30
|
+
if (major < MIN_PY_MAJOR) return false;
|
|
31
|
+
return minor >= MIN_PY_MINOR;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function findPython() {
|
|
35
|
+
// Candidates in preference order. Windows `py -3` launcher first if present.
|
|
36
|
+
const candidates = [
|
|
37
|
+
['py', ['-3', '--version']],
|
|
38
|
+
['python3', ['--version']],
|
|
39
|
+
['python', ['--version']],
|
|
40
|
+
];
|
|
41
|
+
for (const [cmd, versionArgs] of candidates) {
|
|
42
|
+
const version = tryPython(cmd, versionArgs);
|
|
43
|
+
if (version && pythonMeetsMin(version)) {
|
|
44
|
+
return { cmd, runArgs: versionArgs.slice(0, -1) }; // drop '--version' suffix
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function importCheck(pythonCmd, pythonRunArgs) {
|
|
51
|
+
const args = [...pythonRunArgs, '-c', 'import marama_route'];
|
|
52
|
+
const result = spawnSync(pythonCmd, args, { encoding: 'utf8' });
|
|
53
|
+
return result.status === 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function main() {
|
|
57
|
+
const py = findPython();
|
|
58
|
+
if (!py) {
|
|
59
|
+
process.stderr.write(
|
|
60
|
+
'lumynax-marama-route: could not find a Python 3.11+ interpreter on PATH.\n' +
|
|
61
|
+
'Install Python 3.11 or newer from https://www.python.org/downloads/ and re-run.\n'
|
|
62
|
+
);
|
|
63
|
+
process.exit(127);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!importCheck(py.cmd, py.runArgs)) {
|
|
67
|
+
process.stderr.write(
|
|
68
|
+
'lumynax-marama-route: the Python package "marama_route" is not installed in the active interpreter (' +
|
|
69
|
+
py.cmd + ').\n' +
|
|
70
|
+
'Re-run `npm install -g lumynax-marama-route` or manually:\n' +
|
|
71
|
+
' ' + py.cmd + ' ' + py.runArgs.join(' ') + ' -m pip install lumynax-marama-route\n'
|
|
72
|
+
);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Dispatch: python -m marama_route.cli <user args>
|
|
77
|
+
const userArgs = process.argv.slice(2);
|
|
78
|
+
const result = spawnSync(
|
|
79
|
+
py.cmd,
|
|
80
|
+
[...py.runArgs, '-m', 'marama_route.cli', ...userArgs],
|
|
81
|
+
{ stdio: 'inherit' }
|
|
82
|
+
);
|
|
83
|
+
if (result.error) {
|
|
84
|
+
process.stderr.write('lumynax-marama-route: launcher failed: ' + result.error.message + '\n');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
process.exit(typeof result.status === 'number' ? result.status : 1);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lumynax-marama-route",
|
|
3
|
+
"version": "0.4.3",
|
|
4
|
+
"description": "LumynaX MaramaRoute: AbteeX AI Labs model router, downloader, and local runtime CLI for LumynaX releases.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"lumynax",
|
|
7
|
+
"marama-route",
|
|
8
|
+
"model-router",
|
|
9
|
+
"model-download",
|
|
10
|
+
"huggingface",
|
|
11
|
+
"sovereignty",
|
|
12
|
+
"new-zealand",
|
|
13
|
+
"aotearoa",
|
|
14
|
+
"abteex-ai-labs"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://lumynax.com",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/Aimaghsoodi/TinyLuminaX/issues"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/Aimaghsoodi/TinyLuminaX.git"
|
|
23
|
+
},
|
|
24
|
+
"license": "Apache-2.0",
|
|
25
|
+
"author": "AbteeX AI Labs",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"MaramaRoute": "bin/launcher.js",
|
|
31
|
+
"LumynaXRoute": "bin/launcher.js",
|
|
32
|
+
"maramaroute": "bin/launcher.js",
|
|
33
|
+
"lumynaxroute": "bin/launcher.js",
|
|
34
|
+
"marama-route": "bin/launcher.js",
|
|
35
|
+
"lumynax-route": "bin/launcher.js"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"postinstall": "node scripts/postinstall.js",
|
|
39
|
+
"test": "node scripts/postinstall.js --check-only"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"bin/",
|
|
43
|
+
"scripts/",
|
|
44
|
+
"vendor/",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Postinstall: pip-install the bundled wheel into the active Python interpreter.
|
|
3
|
+
// Strategy:
|
|
4
|
+
// 1. Find Python 3.11+.
|
|
5
|
+
// 2. If marama_route is already importable at the right version, no-op.
|
|
6
|
+
// 3. Otherwise, pip install ./vendor/<wheel>.whl --user (or current env).
|
|
7
|
+
// We never fail the npm install when Python isn't found — the launcher will explain.
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const { spawnSync } = require('node:child_process');
|
|
11
|
+
const path = require('node:path');
|
|
12
|
+
const fs = require('node:fs');
|
|
13
|
+
|
|
14
|
+
const PACKAGE_DIR = path.resolve(__dirname, '..');
|
|
15
|
+
const VENDOR_DIR = path.join(PACKAGE_DIR, 'vendor');
|
|
16
|
+
const PKG_VERSION = require(path.join(PACKAGE_DIR, 'package.json')).version;
|
|
17
|
+
|
|
18
|
+
const MIN_PY_MAJOR = 3;
|
|
19
|
+
const MIN_PY_MINOR = 11;
|
|
20
|
+
|
|
21
|
+
const checkOnly = process.argv.includes('--check-only');
|
|
22
|
+
|
|
23
|
+
function tryRun(cmd, args) {
|
|
24
|
+
try {
|
|
25
|
+
return spawnSync(cmd, args, { encoding: 'utf8' });
|
|
26
|
+
} catch (_err) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function pythonMeetsMin(versionLine) {
|
|
32
|
+
const match = /Python (\d+)\.(\d+)/.exec(versionLine || '');
|
|
33
|
+
if (!match) return false;
|
|
34
|
+
const major = parseInt(match[1], 10);
|
|
35
|
+
const minor = parseInt(match[2], 10);
|
|
36
|
+
if (major > MIN_PY_MAJOR) return true;
|
|
37
|
+
if (major < MIN_PY_MAJOR) return false;
|
|
38
|
+
return minor >= MIN_PY_MINOR;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function findPython() {
|
|
42
|
+
const candidates = [
|
|
43
|
+
['py', ['-3']],
|
|
44
|
+
['python3', []],
|
|
45
|
+
['python', []],
|
|
46
|
+
];
|
|
47
|
+
for (const [cmd, baseArgs] of candidates) {
|
|
48
|
+
const result = tryRun(cmd, [...baseArgs, '--version']);
|
|
49
|
+
if (!result || result.status !== 0) continue;
|
|
50
|
+
const versionOut = (result.stdout || result.stderr || '').trim();
|
|
51
|
+
if (pythonMeetsMin(versionOut)) {
|
|
52
|
+
return { cmd, runArgs: baseArgs, version: versionOut };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function findVendoredWheel() {
|
|
59
|
+
if (!fs.existsSync(VENDOR_DIR)) return null;
|
|
60
|
+
const files = fs.readdirSync(VENDOR_DIR).filter(f => f.endsWith('.whl'));
|
|
61
|
+
if (files.length === 0) return null;
|
|
62
|
+
// Prefer wheel matching the package version
|
|
63
|
+
const exact = files.find(f => f.includes(`-${PKG_VERSION}-`));
|
|
64
|
+
return path.join(VENDOR_DIR, exact || files[0]);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function moduleVersion(py) {
|
|
68
|
+
const result = tryRun(py.cmd, [
|
|
69
|
+
...py.runArgs,
|
|
70
|
+
'-c',
|
|
71
|
+
'import importlib.metadata as m; print(m.version("lumynax-marama-route"))',
|
|
72
|
+
]);
|
|
73
|
+
if (!result || result.status !== 0) return null;
|
|
74
|
+
return (result.stdout || '').trim();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function installWheel(py, wheelPath) {
|
|
78
|
+
const args = [...py.runArgs, '-m', 'pip', 'install', '--upgrade', '--quiet', wheelPath];
|
|
79
|
+
const result = spawnSync(py.cmd, args, { stdio: 'inherit' });
|
|
80
|
+
return result.status === 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function main() {
|
|
84
|
+
const py = findPython();
|
|
85
|
+
if (!py) {
|
|
86
|
+
process.stdout.write(
|
|
87
|
+
'[lumynax-marama-route] Python 3.11+ not found on PATH.\n' +
|
|
88
|
+
'[lumynax-marama-route] Skipping Python package install. The MaramaRoute command will\n' +
|
|
89
|
+
'[lumynax-marama-route] prompt you to install Python the first time it is run.\n' +
|
|
90
|
+
'[lumynax-marama-route] Install from https://www.python.org/downloads/ and then run:\n' +
|
|
91
|
+
'[lumynax-marama-route] pip install lumynax-marama-route\n'
|
|
92
|
+
);
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
process.stdout.write(`[lumynax-marama-route] Using ${py.version} (${py.cmd}).\n`);
|
|
96
|
+
|
|
97
|
+
const installed = moduleVersion(py);
|
|
98
|
+
if (installed === PKG_VERSION) {
|
|
99
|
+
process.stdout.write(`[lumynax-marama-route] lumynax-marama-route ${installed} already installed.\n`);
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (checkOnly) {
|
|
104
|
+
process.stdout.write(
|
|
105
|
+
installed
|
|
106
|
+
? `[lumynax-marama-route] check-only: have ${installed}, want ${PKG_VERSION}\n`
|
|
107
|
+
: '[lumynax-marama-route] check-only: not installed yet\n'
|
|
108
|
+
);
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const wheelPath = findVendoredWheel();
|
|
113
|
+
if (!wheelPath) {
|
|
114
|
+
process.stdout.write(
|
|
115
|
+
'[lumynax-marama-route] No bundled wheel found in vendor/. Falling back to PyPI:\n' +
|
|
116
|
+
'[lumynax-marama-route] ' + py.cmd + ' -m pip install lumynax-marama-route\n'
|
|
117
|
+
);
|
|
118
|
+
const fallback = spawnSync(py.cmd, [...py.runArgs, '-m', 'pip', 'install', '--upgrade', '--quiet', 'lumynax-marama-route'], { stdio: 'inherit' });
|
|
119
|
+
return fallback.status === 0 ? 0 : 0; // never fail npm install
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
process.stdout.write(`[lumynax-marama-route] Installing bundled wheel: ${path.basename(wheelPath)}\n`);
|
|
123
|
+
const ok = installWheel(py, wheelPath);
|
|
124
|
+
if (!ok) {
|
|
125
|
+
process.stdout.write(
|
|
126
|
+
'[lumynax-marama-route] pip install of the bundled wheel failed (probably a permissions issue).\n' +
|
|
127
|
+
'[lumynax-marama-route] You can run it manually:\n' +
|
|
128
|
+
'[lumynax-marama-route] ' + py.cmd + ' -m pip install --user "' + wheelPath + '"\n'
|
|
129
|
+
);
|
|
130
|
+
return 0; // never fail npm install
|
|
131
|
+
}
|
|
132
|
+
process.stdout.write(`[lumynax-marama-route] Installed lumynax-marama-route ${PKG_VERSION}.\n`);
|
|
133
|
+
process.stdout.write('[lumynax-marama-route] Try: MaramaRoute --help\n');
|
|
134
|
+
return 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
process.exit(main());
|
|
Binary file
|