Skip to main content

Fix: default LiteLLM config only works on Docker Desktop

IMPLEMENTATION RULES: Before implementing this plan, read and follow:

Status: Backlog

Goal: A first-time uis deploy litellm should produce a usable model list on any cluster, and the playbook's model check should actually run.

Investigation: INVESTIGATE-service-litellm-install-reliability.md

Priority: Medium

Last Updated: 2026-08-06


Problem

Two independent defects in the same area.

F7 — host.docker.internal in the default ConfigMap

When no ai-models-litellm ConfigMap exists, task 3.1 creates one containing:

- model_name: llama3.2
litellm_params:
model: ollama_chat/llama3.2
api_base: "http://host.docker.internal:11434"

host.docker.internal is a Docker Desktop / Rancher Desktop convenience name. On a real k3s node it does not resolve. A first install on a server therefore ends with exactly one model, which cannot answer — while /v1/models still lists it, so the failure only appears at inference time.

This is a dev-only assumption baked into the default path: the same class of problem as the Traefik v2/v3 mismatch, where the developer environment and the server environment quietly diverge.

F8 — The model verification task reads the wrong ConfigMap

Task 13 reads a ConfigMap named litellm-config:

name: litellm-config

but tasks 3 and 3.1 create ai-models-litellm. The task is guarded by when: litellm_configmap.resources | length > 0, so it finds nothing, skips silently, and the "expected model count" comparison in tasks 14–15 never runs. A verification step that never executes is worse than no verification, because the play still prints "Models loaded and verified".


Solution

Make the default portable and honest, and fix the ConfigMap reference so the existing check does its job.


Phase 1: Portable default

Tasks

  • 1.1 Decide the default behaviour when no model ConfigMap exists. Options: (a) ship no models and say so clearly, (b) detect Rancher Desktop and only then use host.docker.internal, (c) ship a commented-out example
  • 1.2 Implement the chosen default in task 3.1
  • 1.3 Make the deploy output state plainly when the model list is empty or placeholder-only, and how to supply a real one
  • 1.4 Document the "apply your ConfigMap before uis deploy litellm" pattern — the playbook only creates a default when one is absent, which is the supported way to keep a custom model list across redeploys

Validation

./uis deploy litellm      # on a non-Docker-Desktop cluster
# default model list is either empty-and-stated, or reachable

User confirms a first install on a server is not silently broken.


Phase 2: Fix the model check

Tasks

  • 2.1 Change task 13 to read ai-models-litellm
  • 2.2 Confirm tasks 14–15 now compare expected vs actual model names
  • 2.3 Decide whether a mismatch should warn or fail; given the pattern in this investigation, prefer failing over printing SUCCESS

Validation

./uis deploy litellm
# task 15 output lists the models from ai-models-litellm and compares them

User confirms the check runs and reports real numbers.


Acceptance Criteria

  • No host.docker.internal on a code path that runs on a server
  • A first install either has working models or says clearly that it has none
  • Task 13 reads the ConfigMap that actually exists
  • The model count comparison executes rather than skipping
  • The pre-apply pattern for custom model lists is documented

Implementation Notes

Recommend option (a) for Phase 1.1 — ship no models and say so. A placeholder that looks like a model but cannot answer is the same silent-success pattern this whole investigation is about. An empty list with a clear message is honest and immediately actionable.


Files to Modify

  • ansible/playbooks/210-setup-litellm.yml (tasks 3.1 and 13)