Downloads · 30 days
1.5K
20% of all-time downloads
selorahomes/Selora-AI-LLM-1.7B
Selora-AI-LLM-1.7B is a text generation model from selorahomes. Use it when you need the model to write or continue text. It is set up for transformers. The card lists the license as apache-2.0.
Selora Homes: selorahomes.com Selora AI Home Assistant Integration: github.com/SeloraHomes/ha-selora-ai
Downloads · 30 days
1.5K
20% of all-time downloads
All-time downloads
7.3K
Public
Repo size
15.3 GB
Likes
12
Public
Click a slice to open those files.
.gguf1.8 GB · 100%
From the Hugging Face model README
Selora Homes: selorahomes.com Selora AI Home Assistant Integration: github.com/SeloraHomes/ha-selora-ai
Selora AI LLM is an instruction-tuned language model for
Home Assistant, the open-source smart home
platform. It ships in two forms: five small, single-purpose LoRA specialists — the
reference setup the integration hot-swaps between — and a single general model,
selora-ollama, that folds all five into one for Ollama and is published
separately as selorahomes/Selora-AI-LLM-1.7B-ollama. Each specialist emits
one strict, compact JSON "slim envelope" for its intent, and
the Selora AI integration executes that
envelope against your home — running service calls, resolving live state, or saving an
automation (see Specialists for the exact shapes). The five specialists:
The five specialists are LoRA adapters fine-tuned on a shared Qwen3 1.7B base. A 14B variant for 16 GB deployments is published separately as selorahomes/Selora-AI-LLM-14B.
Base: Qwen3 1.7B · Format: GGUF Q6_K base + 5 per-specialist LoRA adapters (F16) · License: Apache-2.0
Selora AI LLM powers the Selora AI Home Assistant integration and runs locally on Apple Silicon, Linux, or Windows via llama-server or Ollama, or in the cloud via vLLM — built for self-hosted IoT deployments that stay private and offline-first.
answer adapter returns the entities to check plus a
response template, and the integration fills in the live state.Every specialist LoRA emits a compact "slim envelope" — a small JSON object whose
high-frequency keys are single characters to save tokens — and that envelope is an
intermediate representation, not a finished action. The Selora AI integration's
_convert_slim_shape parser turns it into real Home Assistant activity: run a
downloaded GGUF on its own and you get the envelope back; it takes the integration (or
an equivalent parser) to execute service calls, resolve live state, build YAML, or
attach citations. By design the model never fabricates device state — it emits the
calls to make, the entities to look up, the question to ask, or the automation to
build, and the integration completes the loop against live HA.
| Adapter | Emits (raw model output) | What the integration does with it |
|---|---|---|
command | {"c":[{"s":"<service>","e":"<entity_id>","d":{…}}],"r":"<confirmation>"} | Executes each c as an HA service call, in array order, then shows r. The model does not call services itself. |
answer | {"r":"<text with {entity_id} placeholders>","q":["<entity_id>",…]} | Looks up the q entities' live state and substitutes it into the {entity_id} placeholders in r. The model templates state; it never reads it. |
clarification | {"q":"<question>","o":["<option>",…]} | Surfaces the question and the optional quick-reply o options; the user's next reply is the action. |
utilities | {"r":"<advice with {entity_id} placeholders>","q":["<entity_id>",…],"src":["<doc_chunk_id>",…]} | Substitutes live q state into the advice and surfaces the src citations. Advice is grounded in a RELEVANT DOCS block injected at inference. |
automation | Blueprint request → a fenced yaml HA blueprint (blueprint: / input: / !input). Concrete request → {"intent":"automation","response":…,"automation":{"alias":…,"triggers":[…],"conditions":[…],"actions":[…]}} | Uses the blueprint YAML (nearly) as-is, or maps the concrete automation object JSON→YAML into a saved HA automation. |
Key map, applied once on the HA side: r=response, q=query / entity list, c=calls,
s=service, e=entity_id, d=data (service params), o=options.
The integration's selora_local provider classifies each request to one specialist (a
regex pre-classifier), then activates the matching adapter — llama-server's
/lora-adapters hot-swap on the production hub, or vLLM --enable-lora.
Real output for each specialist — the raw model emission; the integration then executes or resolves it:
// command — "Turn off the kitchen light and lock the front door"
{"c":[{"s":"light.turn_off","e":"light.kitchen"},{"s":"lock.lock","e":"lock.front_door"}],"r":"Kitchen light off and front door locked."}
// answer — "Is the bedroom light on?"
{"q":["light.bedroom"],"r":"The bedroom light is {light.bedroom}."}
// clarification — "Turn on a light" (when several exist)
{"q":"Which light — kitchen, bedroom, or living room?","o":["kitchen","bedroom","living room"]}
// utilities — "Why does the Hue bridge show an update?"
{"r":"The {update.philips_hue} update is pending; install it from Settings → Devices & Services → Updates.","q":["update.philips_hue"],"src":["home-assistant/updates#install"]}
// automation (concrete) — "Lock the front door at 10pm if it's still unlocked"
{"intent":"automation","response":"Created the 10pm auto-lock.","automation":{"alias":"Nightly Auto-Lock","triggers":[{"trigger":"time","at":"22:00:00"}],"conditions":[{"condition":"state","entity_id":"lock.front_door","state":"unlocked"}],"actions":[{"service":"lock.lock","entity_id":"lock.front_door"}]}}
The automation adapter's blueprint mode instead emits a fenced yaml block — a
complete HA blueprint with blueprint:, input:, and !input wiring — rather than the
concrete JSON shown above.
The split is what makes high task accuracy attainable on small (1.7B) weights, and it is the reason the model behaves well on the evaluation surfaces below:
AVAILABLE ENTITIES block give each specialist richer single-turn grounding.Measured on the open allenporter/home-assistant-datasets suite — the harness behind the Home Assistant LLM leaderboard — at temperature 0, over the full suite.
Two modes are reported, because they measure different things:
questions reads high on calendar cases, whose fixtures supply event data a
real Home Assistant does not.| dataset | cases | model only | net + model | floor |
|---|---|---|---|---|
| assist | 460 | 74.3% [70.2, 78.1] | 84.3% [80.7, 87.4] | — |
| assist-mini | 196 | 93.9% [89.6, 96.5] | 100.0% [98.1, 100.0] | 0.0% |
| questions | 370 | 70.3% [65.4, 74.7] | 94.6% [91.8, 96.5] | 8.3% |
| automations | 20 | 100.0% [83.9, 100.0] | 100.0% [83.9, 100.0] | — |
95% Wilson intervals. The floor is a control run with the overrides off and a
responder that never acts: read every score against it rather than against zero.
questions has a non-zero floor because some expected answers are satisfied by text
a stub happens to emit.
automations is four blueprint tasks, five samples each. The harness collects
those replies without checking them, so they are scored separately: a reply
passes if Home Assistant accepts it as an automation blueprint with every
requested input declared and wired. The automation is not run, so a blueprint
that loads but leaves out part of the task still passes.
The fused single-model build (selora-ollama) has no measured scores of its own.
Merging trades per-task accuracy for single-model deployment — if your runtime can
hot-swap adapters, use the adapters.
The utilities specialist is grounded in retrieved Home Assistant docs. Scored
with the official benchmark scorers, against the same pipeline answering from
entity state alone:
| Surface (official scorers) | Ungrounded | Selora AI LLM | Measured on |
|---|---|---|---|
| Live integration behavioral gate (82 contracts, real HA) | 79.3% | 87.8% | llama.cpp specialists |
MultiHop-RAG (qa_evaluate, n=60) | 0.250 | 0.650 | llama.cpp specialists |
| RGB noisy-context accuracy | 0.50 | 0.70 | llama.cpp specialists |
| RAGAS faithfulness | 0.309 | 0.822 | selora-ollama (merged) |
| Installer pipeline end-to-end (65 cases) | 44 / 65 | 58 / 65 | llama.cpp specialists |
| Honest refusal, device absent (n=15) | 0 / 15 | 15 / 15 | both runtimes |
| Median answer latency | 3.7 s | 0.4 s | llama.cpp specialists |
Same base (qwen3_17b_base.Q6_K.gguf), same prompts, same Modelfile.utilities / llama-server --lora flow. The Allen-surface tables above were measured before retrieval grounding landed; re-measurement is in progress.
You have a choice in how you start with Selora AI LLM:
ollama run hf.co/selorahomes/Selora-AI-LLM-1.7B-ollama:selora-ollama.Q6_K.gguf.The reference runtime — what the model was trained against and what the Home Assistant integration uses. llama-server's /lora-adapters endpoint is the in-process LoRA hot-swap that lets the integration pick a specialist per turn without reloading the base.
Download the base and all five LoRA files into a single directory, then:
llama-server \
--model qwen3_17b_base.Q6_K.gguf \
--lora-init-without-apply \
--lora selora-command.f16.gguf,selora-automation.f16.gguf,selora-answer.f16.gguf,selora-clarification.f16.gguf,selora-utilities.f16.gguf \
--ctx-size 4096
One --lora with comma-separated paths, not one flag per adapter: llama.cpp keeps
only the last value when --lora is repeated, so the per-flag form loads a single
adapter and silently answers every intent with it. --ctx-size 4096 matches the
budget the corpus and manifest.json (runtime.ctx_size) are built to.
POST to /lora-adapters to switch the active LoRA before each
/v1/chat/completions call. Build instructions for llama-server are in the llama.cpp build guide.
Ollama lets you try Selora AI LLM on your machine and validate the LoRAs work before setting up the full Home Assistant integration. Useful for kicking the tyres on each specialist, smoke-testing the model on your hardware, or driving it from a script.
Selora requires Ollama 0.30 or later (for LoRA inference) installed locally. Pick whichever fits your machine:
brew install ollamacurl -fsSL https://ollama.com/install.sh | shwinget install Ollama.OllamaDownload the base, the LoRAs, and the Modelfiles from this repo into one directory, then from that directory:
ollama create selora-qwen-command -f Modelfile.command
ollama create selora-qwen-automation -f Modelfile.automation
ollama create selora-qwen-answer -f Modelfile.answer
ollama create selora-qwen-clarification -f Modelfile.clarification
ollama create selora-qwen-utilities -f Modelfile.utilities
Each Modelfile pins the per-specialist system prompt and generation parameters,
so no extra configuration is needed. The Q6_K base is stored once in Ollama's
blob store and shared across all the specialists; only the ~10–40 MB LoRA
adapter is added per slot — but ollama list will show one named entry per
specialist.
Ollama 0.30+ does not support in-process LoRA hot-swap, so each specialist runs as its own named model. This path is best for direct chat or scripting use; for the Home Assistant integration use llama-server above.
selora-ollamaIf you'd rather not manage five separate models, selora-ollama folds all five specialists into one self-routing model — one model, all five intents, no hot-swap. It lives in its own repo, selorahomes/Selora-AI-LLM-1.7B-ollama: the merged Q6_K weights (~1.3 GB) alongside the unified router system prompt, chat template, and generation parameters, so Ollama pulls and runs it straight from Hugging Face — no manual download, no Modelfile step:
ollama run hf.co/selorahomes/Selora-AI-LLM-1.7B-ollama:selora-ollama.Q6_K.gguf
Prefer to build it locally — to tweak the system prompt or parameters first? Download that repo and create it from its Modelfile instead:
ollama create selora-ollama -f Modelfile
Either path gives you the same model. Per-surface scores for both runtimes are in the Results section above.
python -m vllm.entrypoints.openai.api_server \
--model ./qwen3_17b_hf \
--enable-lora --max-loras 5 --max-lora-rank 32 \
--lora-modules \
selora-command=/path/to/peft/command \
selora-automation=/path/to/peft/automation \
selora-answer=/path/to/peft/answer \
selora-clarification=/path/to/peft/clarification \
selora-utilities=/path/to/peft/utilities
vLLM activates the matching LoRA based on the request's model field;
no extra routing layer needed.
A walk-through from zero to "Selora AI LLM is answering me in Home Assistant." If you already have HA running and just want to plug in the model, skip to step 4.
Sign up at selorahomes.com/connect. The account ties your local install to:
The local model runs without an account — Connect is for cloud-bridged features and remote access. If you only want offline-only local AI, you can skip this step and revisit later.
Install HA on a Pi, NUC, NAS, or x86 server using the official installation guide. HA OS is the recommended path for new users; Docker is fine for power users.
Confirm you can reach the HA web UI at http://homeassistant.local:8123 before continuing.
The custom component lives at github.com/SeloraHomes/ha-selora-ai. Two install paths:
Via HACS (recommended). HACS — the Home Assistant Community Store — handles updates automatically.
https://github.com/SeloraHomes/ha-selora-ai as type IntegrationManual install. Clone directly into HA's custom_components folder:
cd /config/custom_components
git clone https://github.com/SeloraHomes/ha-selora-ai.git selora_ai
# Restart Home Assistant
From this HuggingFace repo, get:
qwen3_17b_base.Q6_K.gguf (the shared base, ~1.6 GB)selora-command.f16.ggufselora-automation.f16.ggufselora-answer.f16.ggufselora-clarification.f16.ggufselora-utilities.f16.ggufModelfile.* files (for Ollama users; skip for llama-server users)Put them all in a single directory on the machine that'll run the model. Many users put this on the same box as HA; others run it on a dedicated GPU machine and point HA at it over the LAN.
Pick one runtime — both are covered in the Quick start section above:
llama-server — the reference runtime, full LoRA hot-swap support. Best for the HA integration because it lets the integration pick the right specialist per turn.Either way, the model needs to be reachable from wherever HA is running. Confirm with curl http://<host>:8080/v1/models (llama-server) or ollama list (Ollama).
In Home Assistant: Settings → Devices & Services → Add Integration → Selora AI. From the provider dropdown, pick Selora AI Local.
The integration auto-discovers a running llama-server (or Ollama) on the standard ports. If discovery fails, enter the host manually in the config flow.
Type one of these into the Selora AI chat panel that appears after setup:
turn on the kitchen light — should flip a lightwhat lights are on? — should list themcreate an automation that turns on the porch light at sunset — should produce an automation cardturn on a light — should ask which one (if you have several)why is the living-room sensor unavailable? — should give docs-grounded troubleshooting stepsIf they all work, you're done. If any fail, see Troubleshooting at the bottom of this page.
utilities specialist (slot 4)A fifth specialist handles docs-grounded help — maintenance (pending updates,
version conflicts), troubleshooting (why a device is unavailable / offline /
not responding), and setup help (how to add or configure an integration). It is
given the user question, the AVAILABLE ENTITIES list, and a RELEVANT DOCS
list of retrieved Home Assistant documentation chunks, and returns a compact
envelope:
{"r":"<advice with {entity_id} placeholders>","q":["<entity_id>",…],"src":["<doc_chunk_id>",…]}
r is advice grounded in the retrieved docs with {entity_id} placeholders for
any live-state references; q lists the entities whose live state the advice
depends on (so the consumer substitutes current values); src cites the doc
chunks the advice is drawn from. The fix is grounded in the docs, never in entity
state alone — the state is the signal, the docs supply the explanation.
The specialist slot contract is 0=command, 1=automation, 2=answer, 3=clarification, 4=utilities. Backends that hot-swap LoRAs (llama-server's
/lora-adapters, vLLM --enable-lora) load all five at startup.
format_entities_block in scripts/gen_utils.py emits the per-line shape produced by _format_entity_line in custom_components/selora_ai/llm_client/sanitize.py:
AVAILABLE ENTITIES:
- entity_id=light.kitchen; state=off; friendly_name=Kitchen Lights
- entity_id=sensor.sun; state=below_horizon; friendly_name=Sun
Note that the local provider builds its own block in
providers/selora_local/runtime/request_build.py, which differs in detail — no
leading indent, and the friendly name quoted (friendly_name="Kitchen Lights").
The specialists tolerate both in practice, but the two are not byte-identical and
only the form above is what training emits.
The manifest carries runtime.cache_prompt = true so the hub starts
llama-server with system-prompt KV caching enabled, amortizing the
per-specialist system prompt across requests.
Training and inference must match byte-for-byte. The chat template is ChatML
with a /no_think prefix on the user turn, which suppresses Qwen3's reasoning
block so output is bare JSON:
<|im_start|>system
{system prompt}<|im_end|>
<|im_start|>user
/no_think {user message}<|im_end|>
<|im_start|>assistant
<think>
</think>
The empty <think></think> block is part of the prompt, not the output, and
training includes it (masked). The chat template embedded in these GGUFs always
emits it, whatever the client asks for, so any runtime that applies it —
llama.cpp's /v1/chat/completions, Ollama — supplies it at inference. A
model trained without it generates as though the envelope's opening {" had
already been written, and emits q=[...] instead of {"q":[...]} — unparseable,
with no error anywhere.
The user message body has four sections, in this order and nothing else:
USER REQUEST, EXISTING AUTOMATIONS, IMPORTANT (the untrusted-data
warning), AVAILABLE ENTITIES. The utilities specialist appends a fifth,
RELEVANT DOCS. Any drift — reordered sections, extra whitespace, different
per-entity attribute keys — puts the model out of distribution.
{
"temperature": 0.0,
"repeat_penalty": 1.0,
"repeat_last_n": 256,
"max_tokens": 384,
"stop": ["<|im_end|>", "<|endoftext|>"]
}
Bump max_tokens to 1536 for automation requests (longer JSON output).
Base: Qwen3 1.7B fine-tuned
with PEFT on CUDA. Each specialist has its
own LoRA (rank 8–24, scale 20) trained on a synthetic HA-domain corpus generated
from curated home specifications and a service matrix — no scraped forum or
user data. System prompts trained per-specialist; see
prompts/. The answer adapter is trained to emit the slim
{r,q} shape — a q list of entities to look up alongside its
{entity_id}-templated response — which the integration resolves against
live state; see prompts/answer_system_prompt.txt and the
Modelfile.answer SYSTEM block. The utilities adapter is trained on
docs-grounded maintenance / troubleshooting / setup examples with
retrieved-doc context and citation provenance.
Every specialist trains on the same wrapper — its system prompt, then a user turn carrying
USER REQUEST and the AVAILABLE ENTITIES block (plus RELEVANT DOCS for utilities) —
with the target slim envelope as the completion. One real pair per specialist (entity / doc
lists trimmed; requests and target envelopes verbatim):
# command
USER REQUEST: resume the living room TV
AVAILABLE ENTITIES:
- entity_id=media_player.living_room_tv; state=paused; friendly_name="living room TV"
→ {"c":[{"s":"media_player.media_play","e":"media_player.living_room_tv"}],"r":"Playing on living room TV."}
# answer
USER REQUEST: are hallway light and coffee maker on
AVAILABLE ENTITIES:
- entity_id=light.hallway; state=off; friendly_name="hallway light"
- entity_id=switch.coffee_maker; state=on; friendly_name="coffee maker"
→ {"q":["light.hallway","switch.coffee_maker"],"r":"Hallway light: {light.hallway}, coffee maker: {switch.coffee_maker}."}
# clarification
USER REQUEST: can you do something
AVAILABLE ENTITIES:
- entity_id=light.entry; state=off; friendly_name="entry light"
- entity_id=media_player.living_room_tv; state=idle; friendly_name="living room TV"
→ {"q":"Could you tell me what you'd like to do?"}
# automation
USER REQUEST: activate movie night every day at 7pm
AVAILABLE ENTITIES:
- entity_id=scene.movie_night; friendly_name="movie night"
→ {"intent":"automation","response":"At **7pm** every day, this activates **movie night**. Want me to skip weekends?","description":"Activate scene scene.movie_night at 7pm.","automation":{"alias":"Auto-Movie Night","description":"Activate movie night at 7pm daily.","triggers":[{"trigger":"time","at":"19:00:00"}],"conditions":[],"actions":[{"service":"scene.turn_on","target":{"entity_id":"scene.movie_night"},"data":{}}]}}
# utilities
USER REQUEST: guide me through adding HACS
RELEVANT DOCS:
- [hacs] Setting up the HACS integration (https://hacs.xyz/docs/use/configuration/basic/) — "Follow these steps to set up the HACS integration and authenticate it with GitHub…"
AVAILABLE ENTITIES:
- entity_id=light.entry; state=off; friendly_name="entry light"
→ {"r":"To add HACS, go to Settings > Devices & Services > Add Integration and search for it, then follow the config flow. The integration's documentation page covers the prerequisites and step-by-step setup.","src":["hacs:https://hacs.xyz/docs/use/configuration/basic/#2","hacs:https://hacs.xyz/docs/use/configuration/options/#2"]}
Selora AI LLM is evaluated on the open allenporter/home-assistant-datasets suite — the harness behind the Home Assistant LLM leaderboard, so its results are comparable to other models' conversation agents. The headline numbers are in Results at the top of the card; what matters here is what each surface actually grades — each scores a different slice of the stack:
_convert_slim_shape runs the command calls as real
Home Assistant service calls and resolves the answer entity list into live-state
answers; the metric then grades the resulting device state / produced answer. So those
three are end-to-end scores — the adapter plus the integration's parser and
routing, exactly how a user experiences it.automations is scored here, not by the harness. The harness's automation tool
ends at model_output_writer.write(output) with no assertion, so this repo checks the
automation adapter's blueprint YAML itself: Home Assistant must accept it as an
automation blueprint with every requested input declared and wired. The automation is
not run, so a blueprint that loads but leaves out part of the task still passes.| Artifact | Purpose | Distribution |
|---|---|---|
qwen3_17b_base.Q6_K.gguf | Q6_K base for Ollama / llama.cpp | Hugging Face, ollama.com |
selora-{intent}.f16.gguf (×5) | Specialist LoRA adapters | Hugging Face, ollama.com |
Modelfile.{intent} | Ollama recipes (base + LoRA + system prompt) | this repo, ollama.com |
prompts/{intent}_system_prompt.txt | Plain-text trained prompts (reference / testing) | this repo |
selora-ollama.Q6_K.gguf | Single general model — all 5 intents merged, Q6_K (~1.3 GB), shipped with its system / template / params for ollama run hf.co/selorahomes/Selora-AI-LLM-1.7B-ollama:selora-ollama.Q6_K.gguf | Selora-AI-LLM-1.7B-ollama |
Modelfile | The same general model as a local ollama create bundle (pins the router prompt + params) | Selora-AI-LLM-1.7B-ollama |
The full-precision (f16) base and HF safetensors set used by vLLM / TGI / SageMaker live separately in the cloud bundle and are not yet mirrored to Hugging Face.
Five prompts — one per specialist — let you confirm every slot loaded cleanly. Type them into HA's Selora AI panel (or hit the selora_ai/chat_stream WebSocket directly):
| Prompt | Specialist | Expected behaviour |
|---|---|---|
turn on the kitchen light | command | Light flips on; response: "Kitchen light on." |
what lights are on? | answer | List of currently-on lights with [[entities:...]] markers |
create an automation that turns on the porch light at sunset | automation | Automation card with trigger: sun, event: sunset and the porch light target |
turn on a light (with multiple lights present) | clarification | Asks which one and offers options |
why is the living-room sensor unavailable? | utilities | Docs-grounded troubleshooting steps citing source docs |
A clean run on all five = LoRAs loaded, classifier routing correctly, and the trained prompt format reaching the model. If any prompt returns garbage or empty output, check Troubleshooting below.
| Symptom | Likely cause | Fix |
|---|---|---|
Selora AI Local not in provider dropdown | Probe couldn't reach any host candidate | Verify curl http://localhost:8080/v1/models works on the HA host. Add the host manually in config flow if HA can't reach localhost (common on HA OS) |
| Chat returns empty / repeats one token | repeat_penalty != 1.0 somewhere | Confirm llama-server is started without an override, or that the Modelfile's PARAMETER repeat_penalty 1.0 line wasn't edited out |
| Wrong specialist responds (e.g. answer for a command) | Hot-swap call hasn't fired | Check HA logs for Activating LoRA slot N; if absent, the integration didn't classify the prompt as that intent — file an issue with the prompt text |
| Model invents entity_ids that don't exist | AVAILABLE ENTITIES block not being sent | The integration sends this automatically; if you're hitting the model directly, mirror the integration's _format_entity_line output exactly (see "Entity-block format reconciled with the integration" above) |
ollama run works but HA can't reach it | Ollama default localhost:11434, llama-server 0.0.0.0:8080 — different ports | Either point the integration at port 11434 (Ollama path) or run llama-server explicitly. The integration probes :8080 first |
| Pipeline hangs for 30s on automation prompts | An older build of the integration | Update the integration to current main |
For deeper issues, the integration's debug log (logger: custom_components.selora_ai: debug in configuration.yaml) prints the full classifier decision, the request payload sent to llama-server, and the raw model response — enough to diagnose any reproducible case.
main is the latest release. Each release is also tagged v<x.y.z>, so a
specific one is reachable by revision:
from transformers import AutoTokenizer
AutoTokenizer.from_pretrained("selorahomes/Selora-AI-LLM-1.7B", revision="v<x.y.z>")
manifest.json records the version, per-file checksums and the training
recipe for whatever revision you are on. Git tags are the only source of
truth for it — there is no VERSION file.
@misc{selora-ai-2026,
title = {Selora AI LLM: Qwen3 1.7B + LoRA Specialists for Home Assistant},
author = {{Selora Homes}},
year = {2026},
url = {https://huggingface.co/selorahomes/Selora-AI-LLM-1.7B}
}
Apache-2.0