AI Copilot

AI Copilot is an assistant built into the Appmixer Designer that builds, edits and explains flows from natural language. Ask it to "Create a flow that posts new Typeform responses to Slack" and it designs the flow directly on the canvas — selecting connectors, wiring components, and filling in parameters.
Copilot can:
Build new flows from a natural-language description.
Edit existing flows — add, replace or remap components in the open flow. For running flows, Copilot works on a draft so the live flow keeps running unchanged.
Explain flows — describe what an existing flow does, step by step.
Enabling Copilot
Copilot ships as a system plugin of the Appmixer engine. It is loaded when it is listed in the SYSTEM_PLUGINS environment variable and an LLM API key is configured:
Additional configuration:
COPILOT_LLM_PROVIDER
anthropic
LLM provider.
COPILOT_LLM_API_KEY
(unset)
LLM provider API key. The plugin is skipped when no API key is set.
COPILOT_LLM_MODEL
claude-sonnet-4-6
LLM model used by the assistant.
COPILOT_MAX_TOKENS
16384
Maximum tokens per LLM response.
COPILOT_MAX_TURNS
25
Maximum agent turns per chat request.
COPILOT_CONVERSATION_TTL
3600000
How long (ms) a conversation is retained on the server.
COPILOT_PRICING_PATH
(unset)
Optional path to a custom model pricing JSON file used for cost computation in the usage API.
When the plugin is not enabled, the Copilot button is automatically hidden in the Designer.
Using Copilot in the Designer
Open a flow in the Designer and click the Copilot button to open the chat panel. Type what you want to build or change. Copilot streams its progress, and when it produces a flow, the canvas is updated and reloaded.
The conversation is retained per flow for the duration of your session, and restored when you re-open the panel.
Replies are rendered as Markdown.
The panel is resizable — drag its edge to change the width, or double-click the resize handle to reset it to the default width.
When editing a running flow, Copilot's changes are applied to a draft — publish the draft to apply them (see Flow Versioning).
Designer widget options
When embedding the Designer via the Appmixer UI SDK, the Copilot panel can be configured with the options.copilot object:
Monitoring AI Usage
The Insights menu in Appmixer Studio contains two sections:
Flow activity — the flow execution logs (previously the "Insights" page).
AI usage — Copilot consumption and cost monitoring. This section is visible to administrators only.
The AI usage page shows:
Summary cards with the total spend, the number of requests and the total tokens consumed in the selected period, including an input/output token breakdown.
Daily consumption for the selected month.
A paged breakdown table grouped by user, group or scope, with free-text search. Expanding a row drills down into the individual LLM requests (or the users within a group/scope), also paged.
The page is backed by the usage API described below.
Copilot API
All Copilot endpoints live under the /system-plugins/copilot prefix and require a valid access token.
Chat
POST https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/chat
Send a chat message. The response is a Server-Sent Events (SSE) stream.
Request Body
message*
string
The user's message.
threadId
string
Conversation thread ID. Omit to start a new conversation (a new ID is generated and returned in the connected event).
flowId
string
Optional ID of the flow to give Copilot as context, enabling editing/explaining of that flow.
SSE events
connected (carries the threadId), text-delta (streamed assistant text), tool-call / tool-result / tool-error (progress of the assistant's tool use), flow-result (the generated flow descriptor with flowName and optional followUpQuestions), done (carries token usage) and error.
Get Conversation
GET https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/conversations/:threadId
Return the transcript of a prior conversation ({ threadId, messages: [{ role, content }] }). Users can only read their own threads. Returns an empty message list once the conversation TTL has lapsed.
Enabled Check
GET https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/enabled
Returns { "enabled": true } when the Copilot plugin is loaded. Clients use this to decide whether to show Copilot UI.
Usage
GET https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/usage
Aggregated LLM usage and cost. Admin only.
Query Parameters
from
string
Start of the period (ISO date). Defaults to the start of the current month.
to
string
End of the period (ISO date). Defaults to now.
groupBy
string
user (default), group or scope.
user
string
Filter by user ID.
group
string
Filter by group ID.
scope
string
Filter by scope.
q
string
Free-text filter.
offset
number
Optional paging offset. Omit both offset and limit to return the complete result set.
limit
number
Optional page size (must be a positive integer).
Response
The response contains the aggregated rows for the requested page, a totalCount with the number of rows in the whole filtered set, and totals that are always computed over the full filtered set — a paged response still describes the whole reporting window, not just the page. Rows are ordered deterministically (request count descending), so pages are stable across requests. When grouping by group or scope, each row also contains a per-user breakdown.
Cost is computed from the model pricing table (see COPILOT_PRICING_PATH). Requests made with models that have no pricing entry do not add to the cost — they are reported with their token counts but priced as zero.
Daily Usage
GET https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/usage/daily
Daily consumption totals for a month (month=YYYY-MM, defaults to the current month; optional user, group, scope filters). Admin only.
User Usage
GET https://api.YOUR_TENANT.appmixer.cloud/system-plugins/copilot/usage/user/:userId
Individual LLM request breakdown for a user (optional from/to). Admins can view any user; non-admin users can only view their own usage.
Supports the same optional offset/limit paging parameters as the Usage endpoint and returns a totalCount alongside the request rows. Omitting offset and limit returns the complete list. Rows are ordered by timestamp, newest first.
Last updated
Was this helpful?
