Managing Agents (Tab: General)
On this page
- Listing agents
- Active / All filter
- Top action-bar Save
- Creating an agent
- Editing an agent
- Status
- What the engine leaves out at runtime
- The same verdict for every reader
- Silencing a check
- Cost and latency regressions
- Spend caps
- Trying the agent
- Tab: General
- Editable fields
- Read-only fields
- Slug rules
- Who can edit
- Exporting and importing
- Disabling and deleting
The Agents screen (/organizations/{org}/workspaces/{ws}/instances - the instances path segment is preserved, only the UI label changed) is where you create, list, edit, export, and delete assistants. This is the main hub of operational work. The API, slug fields, and database table name (instances) remain unchanged: “Agent” is purely the UX-facing term.
Listing agents
The agents page supports two view modes - toggle in the top-right:
- List view. Tabular: name, slug, provider, model, status, last activity. Best for browsing many agents.
- Grid view. Card grid with the agent icon prominent. Best for visually distinguishing a small number of agents.
The list is rendered in the order returned by the API - there is no client-side sort.
Active / All filter
A segmented control next to the view-mode toggle switches between two scopes:
- Active (
instances.filter.activeOnlyi18n key) - shows only agents withstatus = active. This is the default. - All (
instances.filter.alli18n key) - shows every agent, including disabled ones.
The choice - together with the list/grid view-mode toggle - is persisted in the browser via the instances-show-inactive and instances-view-mode localStorage keys. Neither affects the API itself.
Top action-bar Save
Across every tab on an agent’s detail page, the Save button lives in the top action bar (powered by the usePageSaveAction hook). Per-tab Save buttons no longer exist - every editable surface (General, Prompts, Tools, Skills, Settings, Channels, Room) routes its pending state through the same top-of-page button, which is disabled when there are no changes and shows a spinner while saving.
Creating an agent
Click New Agent. The dialog asks for:
- Name. Free-form display name (any UTF-8). Shown in lists, in conversations, and on the Playground selector.
- Slug. URL-safe identifier (lowercase, alphanumeric, hyphens). The slug is immutable once saved and is the model id used in
/v1/chat/completions. - Description. Free-form text, useful for discriminating similar instances.
- Icon. Optional image, uploaded via the
IconUploadwidget and stored as a data URI.
When you save, the engine seeds the new instance with:
- The default prompt sections (see Prompts tab).
- The default tool set:
readSkillandspawnTask(seepackages/engine/src/instances/defaults.ts→DEFAULT_TOOL_NAMES). - An empty skills list.
- Default flags:
memoryEnabled = false,knowledgeEnabled = false,langsmithEnabled = false,authEnabled = true. Memory is off until you turn it on in the Advanced section (see Feature flags). - Authentication required: the agent answers its HTTP endpoints only to callers presenting its API key, and it has no key until you save one on the Channels → Web/API card.
- Every channel off, Web included: the OpenAI-compatible endpoint and
chat/streamanswer404until you switch Web on, which needs the key unless you turn authentication off and accept the risk notice. The Playground works meanwhile, since it uses your panel session rather than the Web channel. - Speech-to-text off:
sttProvider = disabled, so voice notes are not transcribed until you pick a provider in the Model section. - No spend cap (managed services): the agent calls the model with no limit until someone sets one.
The instance is active by default. You can disable it later; see “Disabling and deleting” below.
Editing an agent
Clicking an agent opens its detail page, and that page is a destination: it takes over the sidebar with its own index, plus a link back to the agent list. The tenancy is stated by the header breadcrumb - organization › workspace › agent slug.
Its sections are rows in that sidebar, under five headings, and there is no tab row above the page. The three automation sections share one Automation row in the Behaviour group, just before Advanced: it opens a page with three tabs, Webhooks, Scheduled and Room.
| Group | Sections |
|---|---|
| Overview | Status, Analytics |
| Configuration | General, Model, Providers, Channels, Dev mode |
| Behaviour | Prompts, Tools, MCP, Skills, Knowledge, Hooks, Automation (Webhooks, Scheduled, Room), Advanced |
| Governance | Policy, GDPR opt-out, Spend cap, Retention, Compliance |
| Activity | Conversations, Memory, Logs |
Dev mode appears only where the organization and workspace have been granted dev mode, and only to an operator who may open dev sessions. Providers and Spend cap are available with managed services.
Putting every section in the sidebar removed the “which group was that in?” step, and then exposed the real problem: too many destinations, several of them a single toggle. A section is a place you go; a lone switch is a row on a page. So sections merged where nobody read them apart: the six per-channel sections into one Channels, and the tool traces, the runs and the governance events into Logs.
Credentials and Parameters are gone as destinations, because a key is set beside the thing that uses it. On the open-source build a provider key sits in the Model section, in the block of the task that reads it (conversation, embeddings, transcription); with managed services each task’s provider connection is picked in Providers; a tool’s keys and parameters are set in that tool’s panel on Tools; a hook’s on the Hooks page.
One merge was undone. The opt-out and the retention policy were briefly a single Data & privacy section, on the argument that a GDPR opt-out and a data TTL are the same concern. They are two: one is a per-contact switch an operator flips daily, the other a destructive schedule nobody touches for months. They are separate sections again - GDPR opt-out and Retention.
The address is ?tab=<section>; the Automation tabs are webhooks, scheduled and room, and Spend cap is budget. There is no alias table: a value that no longer names a section lands on Status, the same way any unknown value does. Bookmarks to runs, governanceEvents, triggers, the old per-channel addresses or the retired Credentials and Parameters sections will land there. retention is not among them: it is a live section again.
What each section can do depends on the operator’s permissions and, for the areas available only with managed services, on the deployment: each declares the permission its own engine route requires, so a section you cannot use is not offered.
The detail page also has an Export button in the page header that downloads a JSON bundle of just this agent (the same format as the bulk Export described below).
Status
The landing section (?tab=overview) answers one question the rest of the page cannot: is this agent actually working? It is a list of checks the engine computes for the agent, and it exists because a configuration can be green in every individual section and still do nothing at runtime.
It began as a configuration audit - “what is not set”. It now also reports what is failing: a scheduled task that errors, an MCP server that has stopped answering, a retention policy that never ran, knowledge that never finished indexing, a spend cap that has stopped the agent. The list runs to several dozen checks, covering configuration and credentials, tool, skill and knowledge assignments, automation, the model and its provider, runtime health, spend caps, privacy and governance, and dev mode.
The page opens with a single verdict - All good, Needs attention, or Something is not working - over a list ordered by severity.
Checks come in three weights:
| Severity | Meaning |
|---|---|
| Broken | this does not work - or, in one case, works in a way it should not: a connected dev session serving this agent’s turns from someone’s laptop. Otherwise: tools whose keys are missing never reach the model, assigned tools or skills the engine does not serve, a skill missing its env, a channel half-configured or disabled by the engine, an agent marked inactive with channels attached, a room with no outbound channel, an open A2A or API endpoint, a stored configuration that no longer decrypts, a provider, model or credential the workspace no longer admits, a credential role with no usable connection (managed services), voice notes that cannot be transcribed, a scheduled task failing or stalled, an MCP server unreachable, knowledge stuck in processing or indexed to nothing, a spend cap reached |
| Warning | this will bite - an open dev token with nobody connected, an outdated version pin, plugins or skills not assigned to this workspace, debug payloads on, no retention policy, opt-outs rising, a model parameter the engine is dropping, policies that only observe, a spend cap at 80% or more, a cost or latency regression against this agent’s own past |
| Note | normal for many agents, and not counted against the verdict - no tools enabled, no channels, an empty model card, no spend cap on an agent that is calling the model |
Five rules shape the list, and they are worth knowing because they explain what is not there:
- Every check has a destination. Without a section to go and fix it, an alert is just a complaint.
- Falsifiable, never probabilistic. “The prompt looks long” is not a check; “three tools never reach the model because their keys are missing” is.
- What is normal for many agents is a note, not a warning - an agent that only talks is right to have no tools.
- Compare the agent with its own past, not with a threshold of ours. A fixed “>5 s” is an opinion that ages, so the cost and latency checks compare the last seven days against the seven before them.
- Names belong to the agent, counts to the tenant. A check about organization-tier information reports how many, never which, so it can be shown to anyone who reads the agent.
What the engine leaves out at runtime
An assignment shown on the Tools or Skills page is not proof the model receives it. Several checks name what the engine leaves out at runtime, and why:
| Check | Severity | Cause |
|---|---|---|
| Assigned tools are not served | Broken | the plugin they come from is not granted to this organization. They are missing from the Tools list too, hidden by the same filter |
| Plugins are not assigned to this workspace | Warning | the organization grants the plugin, but this workspace does not list it, so its tools are not served. A new workspace starts with an empty list |
| Tools no longer exist | Broken | the catalogue no longer produces them: the plugin removed them or no longer registers them. No grant brings them back; the assignment has to go |
| Assigned skills are not served | Broken | the skills are no longer active in the catalogue, or not assigned to this workspace |
| Tools never reach the model: knowledge access too low | Broken | the tools need a higher knowledge access level than the agent grants, so the engine skips them |
| Voice messages are not transcribed | Broken | a channel that carries audio is live and the speech-to-text cannot run: on the open-source build its provider’s key is not set on the agent; with managed services the agent’s stt role has no usable provider connection, and the check gives the reason |
Each names the tools, skills, plugins or channels it affects.
The same verdict for every reader
The engine computes the whole list, configuration and runtime alike, with its own authority, so every reader sees the same checks and the same verdict on the same agent. A Viewer and an Owner no longer get different lists because one of them could not read the secrets or the dev sessions. Organization-tier facts appear as counts, as described above.
Reading the list requires analytics:read. A reader without it sees an empty Status block rather than an error, and the rest of the agent page works as usual.
The workspace Dashboard and the organization’s count above it read the same evaluation, which is what lets a number there be opened at the rows that produced it.
Silencing a check
A check that is true but not interesting on this agent can be silenced (dismissed). It needs agent:write, and the effect is per agent - the same check stays active everywhere else.
- A dismissal is not a delete. The check is still evaluated and still returned, marked as silenced, because a silenced check nobody can see or undo is a check that was removed. Silenced checks move to a collapsed footer that counts them, with a Restore control on each row.
- There is no expiry. A silenced check stays silenced until someone restores it.
- An optional note can record why.
- The verdict is computed on what is left. Silencing a broken check turns the page green. That is the point of the control, and the reason to leave the note.
- A dismissal holds at every tier above. Once silenced here, the check stops colouring this agent’s row in the workspace Dashboard and the organization’s count above that.
A caller with agent:read but not agent:write can see the controls, and a click fails with a message next to the button.
Two of the checks are about activity rather than configuration - an agent that has never answered, and one that has gone dormant. They are checks rather than a separate “worth a look” list precisely so they carry a destination and can be dismissed like everything else.
Cost and latency regressions
Two checks compare the agent with itself over a seven-day window, against the seven days immediately before it:
| Check | Fires when |
|---|---|
| Cost spike | the previous week cost at least 1 USD and this week costs more than twice that |
| Latency regression | the previous week averaged at least 1 s and this week averages more than 1.8× that |
Both floors are there so a quiet agent never trips them on noise, which also means a genuinely low-traffic agent will never see these fire. Note that the averages count only calls that returned - a turn that died at the provider does not move the latency average. Failures are the other question, and they have their own checks.
Spend caps
With managed services, three checks report the agent’s spend caps: Spend cap reached ({period}) (broken) when committed spend in an agent-wide window has reached its cap, Near the spend cap ({period}) (warning) at 80% of it, and No spend cap (note) for an agent with no cap that made model calls in the last seven days. Caps per contact and per conversation raise no check.
Trying the agent
A Try button in the page header opens a chat drawer over the configuration, pinned to this agent - no agent picker, and the page behind it stays live and editable, so a prompt can be changed and re-tried without losing the thread. It keeps its conversation, its stream, and even an unsent draft as you move between sections.
A test chat is a real conversation. It writes to the agent’s conversations like any other channel, so it appears in Conversations, in analytics, and under the retention policy.
The Name, Description, and Icon are editable from the General section. The slug is not editable.
Tab: General
The General tab is the instance’s identity card.
Editable fields
- Icon - uploaded via the
IconUploadwidget (image, stored as a data URI). - Name - display name, shown everywhere.
- Description - free-form, often used to tell similar instances apart.
- Status switch - toggles between
activeandinactive. The status switch lives on this General tab; the agents list does not expose it inline.
Read-only fields
- Slug - the immutable URL-safe identifier (shown disabled in the form). To change a slug, create a new instance and use export/import to copy the configuration over.
Slug rules
- Lowercase ASCII letters, digits, and hyphens only.
- Must start with a letter.
- Length: 2 to 64 characters.
- Reserved slugs (
admin,api,health,v1) are rejected.
Who can edit
Editing General fields requires the agent:write permission on an agent the operator can reach; reading requires agent:read. Which agents an operator can reach depends on their role and, on managed-services deployments, on their workspace bindings. See Roles and permissions.
Exporting and importing
The Instances page supports two bulk actions:
- Export. Downloads a JSON bundle of one or more selected instances. The bundle carries configuration only: prompts, enabled tools, enabled skills (with version pins), behaviour flags, non-secret channel configuration, hooks, room configuration, event sources, and scheduled tasks. Every credential-like value is stripped - the export is safe to share.
- Import. Uploads a JSON bundle. Conflicting slugs are surfaced for confirmation; you can choose to overwrite or rename on the fly.
The knowledge base is not part of the bundle: it has its own export and import endpoints, so moving it is a deliberate, separate step.
Use export/import to move instance configuration between environments (staging to production) or to share a working configuration with a colleague. See Export and import an instance for the exact contents and the post-import steps.
Disabling and deleting
An instance has three operations on its lifecycle:
- Disable. Status flips to
inactive. Channels stop. The instance is no longer visible in the OpenAI-compatible API’s/v1/modelslist. Conversations and history are kept. - Re-enable. Status flips back to
active. Channels do not auto-restart; you must start them manually. - Delete. Permanently removes the instance and all its scoped data: conversations, messages, memories, audit logs for that instance, room configuration, and event sources. There is no undo. A confirmation dialog requires you to type the slug.
Tip. When in doubt, prefer disable over delete. Disabled instances cost nothing and can be restored.