An action has two callers: a model deciding mid-conversation, and an IVR
flow node the designer wired. “Press 1 to book an appointment” and “I’d
like to book an appointment” must reach the same code, or the two paths
drift and one of them is wrong.
That is the whole reason action and skill are separate ideas. The action is
described once; the skill is that description handed to a model.
What an action carries
- A name, unique across every app, because it is also what a model sees.
- One sentence of description, shown to the model and in the flow designer’s node palette. Both readers are deciding whether this is the thing they want.
- The arguments it takes, as a schema. One schema, three consumers: the model’s tool definition, the designer’s form for the node, and the check on the server. The form therefore cannot drift from what the handler actually accepts.
- Its outcomes, which become the flow node’s outlets and the results a model is told about. Every action has at least ok and error.
Some actions are agent-only — they need a live conversation, such as
summarising what a caller said. They are not offered in the node palette,
because a flow drawn with one could not run.
What a virtual agent may actually do
The set offered to an agent is an intersection, and both halves are needed:- the apps switched on for the organisation, and
- the skills listed on that profile.
The check is made again when the action runs, not trusted from when the
tool list was built. A call can outlive a settings change, and a model told
about an action at the start of a call will happily use it ten minutes
after the app was switched off.
What exists today
The first set are core: things done to the call itself. A transfer is not
a record, it is an event, and it is over the moment it happens, so it has no
app, no table and no screen. The rest belong to an app and appear only where
that app is on.