The LLM
The LLM explains plans and translates operator intent. It never decides a move, it is off by default, and every feature of the lifecycle works without it.
What it does
| Task | Output | Checked by |
|---|---|---|
| Explain a plan or a move, write a report | Text, labelled as model output, shown next to the calculation line | Nothing to check: the text acts on nothing |
| Translate an intent ("empty this host tonight without touching tenant X") into constraints | Constraints in the planner's schema | The schema, then the operator, before the planner runs |
Every output of the model is revalidated by deterministic code before anything happens. A weaker model or a different provider degrades the wording, never the safety of a plan.
What it never does
- It never chooses a host, a VM or a ratio. The planner does.
- It is never required. With the LLM off, each move still carries its calculation line, written from a template.
- It is not fine-tuned on your data. What Aicerine learns from your cloud goes into the migration cost model, which is statistics you can test and replay.
What it sees
The model receives a context pack built by code: a glossary, your policy, the state of the hosts and VMs in the plan's scope, the plan, and the simulator's result. The pack is versioned, bounded in size, and journaled with the decision, so you can see exactly what the model saw and replay it on another model.
Where it runs
One adapter speaks the OpenAI-compatible API. That covers:
- a model served on the appliance (for example with vLLM or llama.cpp), including air-gapped;
- an endpoint you run yourself;
- a hosted provider, if you choose one.
You declare what your model supports (context size, structured output), and the console offers only the features it can carry.
What leaves the appliance
When the endpoint is not on the appliance, the context pack is pseudonymized: VM, host, project and tenant identifiers are replaced by tokens, the mapping stays in the appliance, and the answer is mapped back before display. Numbers are sent as they are. Pseudonymization is always on outside the appliance; you can turn it off only for an endpoint you declare as your own.
Turning the LLM on is your decision, and it is journaled.