{% extends "admin/_layout.html" %} {% from "_macros.html" import icon %} {% set section = "agents" %} {% block title %}{{ t("Agents") }} - {{ brand.name }}{% endblock %} {% block heading %}{{ t("Agents") }}{% endblock %} {% block admin_content %}

{{ t("An agent chat runs on a linked LLeMbas CLI: the CLI on somebody's machine does the work, under its own limits (its remote: roots and modes), and this instance shows it and passes on what is typed here. Nothing runs on this server. What you decide here is whether the feature exists, how long an approval waits, and the terminal panel.") }}

{% if saved %}
{{ icon("check", "icon--sm") }} {{ t("Saved.") }}
{% endif %}

{{ t("Switch") }}

{{ t("Off, nobody can start one, whatever permissions they hold.") }}

{{ t("People also need the permission “%(permission)s” and a linked LLeMbas CLI (Settings → Devices).", permission=t("Run commands")) }}

{{ t("The modes") }}

{{ t("Set per chat and switchable at any time. This is what each one means; the two lists below adjust them.") }}

{% for value, label, hint in modes %}
{{ label }}
{{ t(hint) }}
{% endfor %}

{{ t("Asking you things") }}

{{ t("Seconds. After this the reply carries on without an answer and says so. At least a minute, whatever is typed here.") }}

{{ t("When a model asks a question it can offer answers to pick from, and by default a box to write something else. Turn this off if you would rather nobody typed free text into a prompt a model composed.") }}

{{ t("The terminal") }}

{{ t("A panel beside an agent chat holding an interactive shell on the linked device, when the device allows it (remote.terminal: true). What somebody types there is theirs: the modes govern the model, not the person at the keyboard. The model cannot see the panel; sending it something is a button they press.") }}

{{ t("People also need the permission “%(permission)s”.", permission=t("Open a terminal")) }} {{ t("Shells open right now: %(n)s", n=terminal_count) }}

{{ tm("Seconds with nobody watching and nothing typed. Closing the panel does not end the session — a build carries on and is still there on the way back — so this is what eventually ends one.") }}

{{ t("One per chat. Each keeps a shell open on the linked device, fed over its link.") }}

{# A second form, and a second settings group. Subagents are not an agent-chat feature — an ordinary chat can delegate as well — but this is the page somebody comes to when they want to know what one reply may set going on its own, and a nav entry for a single card would be worse than the near-miss. A form cannot nest inside another, so this sits *after* the one above rather than as a card inside it. Two forms means the browser posts only the one whose button was pressed, which is what keeps each group's save handler writing one key. #}

{{ t("Helpers") }}

{{ t("A reply can hand a self-contained piece of work to a second model that runs on its own and reports back — several at once, which is what makes research fan out instead of queueing, and in the background, so the reply carries on and is told when the helper is done. There are two kinds: explore, which reads and searches only, and general, which may also change things the chat itself may change. An agent chat's helpers run on its linked device instead, under the device's own limits.") }}

{{ tm("Asking another model a question uses the same switch and the same allowance below, because it costs the same thing: one reply setting another reply going. Which people may do it is a separate permission — %(permission)s — and which models may is a switch on each model's own page.", permission=t("Ask another model")) }}

{{ icon("shield", "icon--sm") }} {{ tm("A helper cannot ask anybody anything, so nothing in its chat can stop for approval. It therefore gets only what this chat could already do without asking: it reads and searches files and the web, and the general kind writes what the chat may write. It cannot send helpers of its own; it can message the main agent, and be messaged, while it works. %(mode)s is not inherited: a helper's task text can have come from a page it read.", mode=t("Auto")) }}

{{ tm("People also need the %(permission)s permission, and the model needs the %(capability)s capability. Off by default: a reply that spawns helpers spends model time multiplicatively, and on one local endpoint four at once is four times the queue rather than four times the speed.", permission=t("Delegate to a helper"), capability=t("Tools")) }}

{{ t("Fanning out across a handful of independent questions is what this is for. A reply that wants twenty has misread the tool. Questions put to other models count against this same number, so one reply cannot spend the allowance twice.") }}

{{ t("Each is a whole generation against the same endpoint the reply that asked for it is waiting on. Past this a model is told to do the work itself rather than made to wait.") }}

{{ t("In tokens, across every round. A helper answers one question, so this should run out well before the reply that asked does. Zero means no ceiling.") }}

{{ tm("Seconds. Past it the helper is stopped, not abandoned: what it had written is kept and handed back with a note saying it is partial.") }}

{{ t("A backstop, as it is above. The clock and the token ceiling are what normally end one.") }}

{{ t("Off means it is deleted once its answer has been handed over, which is what keeps this cheap to use. Turn it on to work out why one came back with something odd. Kept chats are temporary either way and are swept a day later, and neither appears in anybody's sidebar.") }}

{% endblock %}