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 ADDED
@@ -0,0 +1,6 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ This repository is published as a product scaffold by AbteeX AI Labs. See the
6
+ Apache License 2.0 text at https://www.apache.org/licenses/LICENSE-2.0.
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
+ [![PyPI](https://img.shields.io/pypi/v/lumynax-marama-route.svg?label=PyPI&color=e08a2c)](https://pypi.org/project/lumynax-marama-route/)
7
+ [![npm](https://img.shields.io/npm/v/lumynax-marama-route.svg?label=npm&color=cb3837)](https://www.npmjs.com/package/lumynax-marama-route)
8
+ [![Hugging Face](https://img.shields.io/badge/HuggingFace-AbteeXAILab%2Fmarama--route-yellow)](https://huggingface.co/AbteeXAILab/marama-route)
9
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
10
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](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
+
@@ -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());