--- # ------------------------------------------------------------------------------ # FILE: roles/llm-inference-multimodel/tasks/preset.yml # DESCRIPTION: Phase P — deploy --models-preset INI file and switch the router # from --models-dir to --models-preset mode. # # Purpose: preset mode is required to add model aliases. The alias # field in the INI lets the Phi-3.5-mini-instruct-Q8_0 entry also # respond to "Phi-3.5-mini-instruct-8bit" — Ryan's Hermes # auxiliary.title_generation already uses this friendlier name. # # This phase is gated on llm_router_preset_enabled | default(false). # With the default (false) it is a no-op. Flip to true in a playbook # or extra-vars to activate. # # Tag: router_preset (deploy INI + restart service on change) # # Order: run AFTER router_systemd. The systemd unit template # conditionally emits --models-preset when llm_router_preset_enabled # is true; this phase deploys the INI the unit references. # # Added 2026-08-12 (t_9adf0889): Phi alias — War Machine. # ------------------------------------------------------------------------------ # ============================================================================= # TAG: router_preset # Deploy the preset INI and restart the router if the INI or unit changed. # ============================================================================= - name: "[router_preset] Deploy preset INI to {{ llm_router_preset_path }}" ansible.builtin.template: src: llama-server-router-preset.ini.j2 dest: "{{ llm_router_preset_path }}" owner: root group: root mode: "0644" become: true register: llm_router_preset_deployed notify: - restart router when: llm_router_preset_enabled | default(false) tags: [router_preset] - name: "[router_preset] Report preset INI deployment result" ansible.builtin.debug: msg: >- Preset INI {{ 'deployed (changed)' if llm_router_preset_deployed.changed | default(false) else 'already up-to-date (no change)' }} at {{ llm_router_preset_path }}. when: llm_router_preset_enabled | default(false) tags: [router_preset] - name: "[router_preset] Flush handlers so router restarts before verification" ansible.builtin.meta: flush_handlers when: llm_router_preset_enabled | default(false) tags: [router_preset] # ============================================================================= # Verification: confirm both the original ID and the alias appear in /v1/models # ============================================================================= - name: "[router_preset] Wait for router /health after potential restart" ansible.builtin.uri: url: "http://{{ llm_router_bind_address }}:{{ llm_router_port }}/health" status_code: 200 timeout: 30 retries: 12 delay: 5 register: llm_preset_health until: llm_preset_health.status == 200 when: llm_router_preset_enabled | default(false) tags: [router_preset] - name: "[router_preset] Query /v1/models to verify preset loaded" ansible.builtin.uri: url: "http://{{ llm_router_bind_address }}:{{ llm_router_port }}/v1/models" status_code: 200 return_content: true timeout: 30 register: llm_preset_models when: llm_router_preset_enabled | default(false) tags: [router_preset] - name: "[router_preset] Extract model IDs and aliases from /v1/models" ansible.builtin.set_fact: llm_preset_model_ids: >- {{ llm_preset_models.json.data | map(attribute='id') | list }} llm_preset_model_aliases: >- {{ llm_preset_models.json.data | map(attribute='aliases') | flatten | list }} when: - llm_router_preset_enabled | default(false) - llm_preset_models is defined tags: [router_preset] - name: "[router_preset] VERIFY: Phi original ID (Phi-3.5-mini-instruct-Q8_0) present in /v1/models" ansible.builtin.fail: msg: >- PRESET VERIFY FAIL: 'Phi-3.5-mini-instruct-Q8_0' not found in /v1/models IDs. Returned IDs: {{ llm_preset_model_ids | default([]) }} Check the preset INI section name. when: - llm_router_preset_enabled | default(false) - llm_preset_model_ids is defined - "'Phi-3.5-mini-instruct-Q8_0' not in llm_preset_model_ids" tags: [router_preset] - name: "[router_preset] VERIFY: Phi alias (Phi-3.5-mini-instruct-8bit) present in /v1/models aliases" ansible.builtin.fail: msg: >- PRESET VERIFY FAIL: alias 'Phi-3.5-mini-instruct-8bit' not found in /v1/models. Returned IDs: {{ llm_preset_model_ids | default([]) }} Returned aliases: {{ llm_preset_model_aliases | default([]) }} Check the 'alias' field in the preset INI for the [Phi-3.5-mini-instruct-Q8_0] section. when: - llm_router_preset_enabled | default(false) - llm_preset_model_ids is defined - "'Phi-3.5-mini-instruct-8bit' not in llm_preset_model_ids and 'Phi-3.5-mini-instruct-8bit' not in llm_preset_model_aliases" tags: [router_preset] - name: "[router_preset] VERIFY: Qwen model ID unchanged" ansible.builtin.fail: msg: >- PRESET VERIFY FAIL: 'Qwen3.6-35B-A3B-UD-Q4_K_S' not found in /v1/models. Returned IDs: {{ llm_preset_model_ids | default([]) }} when: - llm_router_preset_enabled | default(false) - llm_preset_model_ids is defined - "'Qwen3.6-35B-A3B-UD-Q4_K_S' not in llm_preset_model_ids" tags: [router_preset] - name: "[router_preset] VERIFY: Llama model ID unchanged" ansible.builtin.fail: msg: >- PRESET VERIFY FAIL: 'Meta-Llama-3.1-8B-Instruct-Q4_K_M' not found in /v1/models. Returned IDs: {{ llm_preset_model_ids | default([]) }} when: - llm_router_preset_enabled | default(false) - llm_preset_model_ids is defined - "'Meta-Llama-3.1-8B-Instruct-Q4_K_M' not in llm_preset_model_ids" tags: [router_preset] - name: "[router_preset] VERIFY PASS — preset mode active, all models and alias confirmed" ansible.builtin.debug: msg: - "======================================================================" - "PRESET VERIFY PASS: --models-preset mode active on llama-server-router." - "" - " /v1/models IDs: {{ llm_preset_model_ids | default([]) }}" - " /v1/models aliases: {{ llm_preset_model_aliases | default([]) }}" - "" - " 'Phi-3.5-mini-instruct-Q8_0' => PRESENT (primary ID)" - " 'Phi-3.5-mini-instruct-8bit' => PRESENT (alias — Ryan's title_generation target)" - " 'Qwen3.6-35B-A3B-UD-Q4_K_S' => PRESENT" - " 'Meta-Llama-3.1-8B-Instruct-Q4_K_M' => PRESENT" - "" - " GH #22364 note: a 'default' model entry may also appear above." - " This is an expected upstream behavior in preset mode — cosmetic only." - "======================================================================" when: - llm_router_preset_enabled | default(false) - llm_preset_model_ids is defined tags: [router_preset]