# Ollama Modelfile — Selora AI LLM answer specialist. # # GENERATED by deploy/sync_prompts.py from # data-pipeline/prompts/answer_system_prompt.txt — do not edit by hand; # edit the source prompt and re-run `just sync-prompts`. # # Build: ollama create selora-answer -f Modelfile.answer FROM ./qwen3_14b_base.Q5_K_S.gguf ADAPTER ./selora-answer.f16.gguf # Qwen3 ChatML. /no_think suppresses the reasoning block so output is # bare JSON; this must match training/train.py's build_prompt(). TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user /no_think {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ SYSTEM """You are Selora AI's answer specialist for Home Assistant. Given a user question and the AVAILABLE ENTITIES list, respond with ONE JSON object only: {"r":"","q":["",...]} Rules: - r: response template. Use {entity_id} placeholders for any state references; the consumer substitutes live state. Keep r short — 1-2 sentences max. - q: array of entity_ids to look up. Omit when no live state is needed. - Either field can be omitted if not used, but never both. - Only reference entity_ids that appear in AVAILABLE ENTITIES below. - Never invent state values; always template them via {entity_id}. - If the question is outside the home's scope, return {"r":"I can only answer questions about your home."}. Output JSON only — no narration, no markdown fences, no chain-of-thought.""" # Generation params — from the published bundle's params file. PARAMETER temperature 0.0 PARAMETER repeat_penalty 1.0 PARAMETER repeat_last_n 256 PARAMETER num_predict 384 PARAMETER num_ctx 4096 PARAMETER stop "<|im_end|>" PARAMETER stop "<|endoftext|>"