@uipath/skills 1.202.0-preview.710 → 1.202.0-preview.716

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CODEOWNERS CHANGED
@@ -145,9 +145,13 @@
145
145
  /skills/uipath-maestro-flow/references/author/plugins/ixp/ @UiPath/communications-mining @constantinmuraru @vlad-crisan @UiPath/maestro-cli-team
146
146
  /tests/tasks/uipath-maestro-flow/ixp/ @UiPath/communications-mining @constantinmuraru @vlad-crisan @UiPath/maestro-cli-team
147
147
 
148
+ # Chat — inline conversational agent node + the conversation trigger and message nodes
149
+ /skills/uipath-maestro-flow/references/author/plugins/conversational-agent/ @UiPath/jarvis @UiPath/maestro-cli-team
150
+ /tests/tasks/uipath-maestro-flow/conversational/ @UiPath/jarvis @UiPath/maestro-cli-team
151
+
148
152
  # Voice — inline voice agent node + the trigger, dial, and end-call nodes
149
- /skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/ @UiPath/jarvis @joshparksj @maxduu @scottcmg @andrewwan-uipath @norman-le
150
- /tests/tasks/uipath-maestro-flow/voice/ @UiPath/jarvis @joshparksj @maxduu @scottcmg @andrewwan-uipath @norman-le
153
+ /skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/ @UiPath/jarvis @UiPath/maestro-cli-team
154
+ /tests/tasks/uipath-maestro-flow/voice/ @UiPath/jarvis @UiPath/maestro-cli-team
151
155
 
152
156
  # Review skill
153
157
  /skills/uipath-review/ @AlvinStanescu @gabrielavaduva @roalexandru
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/skills",
3
- "version": "1.202.0-preview.710",
3
+ "version": "1.202.0-preview.716",
4
4
  "description": "UiPath agent skills for Claude Code, Codex, Cursor, Copilot, Gemini and OpenCode — RPA, UI automation, UI testing, coded agents/apps/workflows, and troubleshooting. Distributed as the UiPath Claude Code plugin.",
5
5
  "author": {
6
6
  "name": "UiPath"
@@ -24,7 +24,7 @@ Primary configuration file for autonomous agent. Edit directly.
24
24
 
25
25
  ```json
26
26
  {
27
- "version": "1.1.0",
27
+ "version": "1.2.0",
28
28
  "settings": {
29
29
  "model": "<MODEL_IDENTIFIER>",
30
30
  "maxTokens": 128000,
@@ -85,12 +85,13 @@ Primary configuration file for conversational agent. Edit directly.
85
85
 
86
86
  ```json
87
87
  {
88
- "version": "1.1.0",
88
+ "version": "1.2.0",
89
89
  "settings": {
90
90
  "model": "<MODEL_IDENTIFIER>",
91
91
  "maxTokens": 64000,
92
92
  "temperature": 0,
93
93
  "engine": "conversational-v1",
94
+ "maxIterations": 8,
94
95
  "mode": "standard"
95
96
  },
96
97
  "inputSchema": {
@@ -142,7 +143,7 @@ Primary configuration file for conversational agent. Edit directly.
142
143
  | `maxTokens` | Max output tokens. Must not exceed the chosen model's `MaxTokens` cap (from `uip agent model list`). |
143
144
  | `temperature` | 0 = deterministic, higher = creative |
144
145
  | `engine` | Keep `"basic-v2"` for autonomous, `"conversational-v1"` for conversational |
145
- | `maxIterations` | Max autonomous agent loop iterations. Default 25. Keep as omitted for conversational. |
146
+ | `maxIterations` | Max autonomous agent loop iterations. Default 25. Default 8 for conversational. |
146
147
  | `mode` | Use `"standard"` |
147
148
 
148
149
  > Prompt **quality** (system/user prompt structure, tool-call criteria, output contract) lives in [prompting/agent-prompting-guide.md](prompting/agent-prompting-guide.md). This file owns the **mechanics** (schema, `contentTokens` sync).
@@ -208,7 +209,7 @@ Runtime note: attachments cannot be supplied via `uip` CLI. Test from Studio Web
208
209
 
209
210
  | Field | Value |
210
211
  |-------|-------|
211
- | `version` | `"1.1.0"` — always scaffolded at this version |
212
+ | `version` | `"1.2.0"` — always scaffolded at this version |
212
213
  | `type` | `"lowCode"` |
213
214
  | `projectId` | Auto-generated UUID — do not edit |
214
215
 
@@ -219,7 +220,7 @@ Runtime note: attachments cannot be supplied via `uip` CLI. Test from Studio Web
219
220
  | `storageVersion` | Managed by `uip agent refresh` — do not edit |
220
221
  | `isConversational` | `false` for autonomous agents, `true` for conversational agents. Do not edit. |
221
222
  | `showProjectCreationExperience` | `false` |
222
- | `targetRuntime` | `"pythonAgent"` for autonomous. **`null` for conversational** — conversational agents are not yet in PROD, so the field is intentionally left null until the runtime value is finalized. |
223
+ | `targetRuntime` | `"pythonAgent"` for standalone agents, autonomous and conversational alike. **Absent for `--inline-in-flow` scaffolds** of either flavor — see [capabilities/inline-in-flow/inline-in-flow.md](capabilities/inline-in-flow/inline-in-flow.md). |
223
224
 
224
225
  ### Input Schema
225
226
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: uipath-maestro-flow
3
- description: "TRIGGER for `.flow` files, UiPath Flow / Maestro Flow build/edit requests, and adding or listing IXP model/document-extraction nodes for a Flow. Build, edit, run, debug, fix, evaluate a Maestro Flow (.flow): create/connect nodes (connector, approval, script, subflow, ixp, data fabric entity), triggers, schedules, validate; upload, publish, manage runs/instances; diagnose errors, incidents, traces; design eval sets, evaluators, run Studio Web evals. `uip maestro flow` CLI. DO NOT TRIGGER for raw IXP project labelling/prediction review/prompt tuning outside Flow→uipath-ixp; C#/XAML→uipath-rpa; standalone agents→uipath-agents."
3
+ description: "TRIGGER for `.flow` files, UiPath Flow / Maestro Flow build/edit requests, and adding or listing IXP model/document-extraction nodes for a Flow. Build, edit, run, debug, fix, evaluate a Maestro Flow (.flow): create/connect nodes (connector, approval, script, subflow, ixp, data fabric entity), triggers, schedules, validate; build conversational flows (chat, chatbot, voice, phone calls); upload, publish, manage runs/instances; diagnose errors, incidents, traces; design eval sets, evaluators, run Studio Web evals. `uip maestro flow` CLI. DO NOT TRIGGER for raw IXP project labelling/prediction review/prompt tuning outside Flow→uipath-ixp; C#/XAML→uipath-rpa; standalone agents→uipath-agents."
4
4
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
5
5
  ---
6
6
 
@@ -25,7 +25,7 @@ Guide for creating, editing, validating, debugging, publishing, diagnosing, and
25
25
 
26
26
  ## Capabilities
27
27
 
28
- - **Author** — Build and edit `.flow` files; add nodes, edges, variables, subflows, transforms, and triggers; explore the registry; validate and format locally; apply node ownership; configure connectors, triggers, managed HTTP, inline-agent scaffolding, IxP/document-extraction nodes, IxP models, and Data Fabric entity nodes; plan complex flows first. Read [references/author/CAPABILITY.md](references/author/CAPABILITY.md).
28
+ - **Author** — Build and edit `.flow` files; add nodes, edges, variables, subflows, transforms, and triggers; explore the registry; validate and format locally; apply node ownership; configure connectors, triggers, managed HTTP, inline-agent scaffolding, IxP/document-extraction nodes, IxP models, and Data Fabric entity nodes; build conversational flows for text chat or voice; plan complex flows first. Read [references/author/CAPABILITY.md](references/author/CAPABILITY.md).
29
29
  - Create projects with `uip maestro flow init`.
30
30
  - **Operate** — Publish, run, and manage deployed flows; debug real systems, trigger processes, inspect jobs/traces, and pause, resume, cancel, or retry instances. Read [references/operate/CAPABILITY.md](references/operate/CAPABILITY.md).
31
31
  - Push to Studio Web with `uip solution upload`.
@@ -31,6 +31,7 @@ Every node in a `.flow` file has exactly one author. The validator enforces this
31
31
  | Human-in-the-loop | `uipath.human-in-the-loop.quick-form` (inline form), `uipath.human-in-the-loop.coded-action-app` (app-based) |
32
32
  | Patterns | `uipath.pattern.batch-transform`, `uipath.pattern.deep-rag` |
33
33
  | Agents | `uipath.agent.autonomous` (inline; after `uip agent init --inline-in-flow`) |
34
+ | Chat | `core.trigger.conversation`, `uipath.conversational.wait-for-message`, `uipath.conversational.send-message`, `uipath.conversational.get-conversation-context`, plus the agent — `uipath.agent.conversational` (inline; after `uip agent init --inline-in-flow --conversational`) or `uipath.core.agent.*` (in-solution / published) |
34
35
  | Voice | `core.trigger.voice`, `uipath.agent.voice` (inline; after `uip agent init --inline-in-flow --conversational`), `uipath.conversational.voice.create-outgoing-call`, `uipath.conversational.voice.end-call` |
35
36
  | Resource nodes | `uipath.core.rpa-workflow.*`, `uipath.core.agent.*`, `uipath.core.flow.*`, `uipath.core.agentic-process.*`, `uipath.core.api-workflow.*`, `uipath.core.human-task.*` |
36
37
  | Document extraction | `uipath.ixp.*` — the extraction step must always land a node ([ixp/impl.md](plugins/ixp/impl.md#landing-the-node-when-you-cannot-fully-configure-it)) |
@@ -105,6 +106,7 @@ If you find yourself hand-writing `inputs.detail`, a `=jsonString:` blob, or `bi
105
106
  | **Wire one node's output into another node's input** | [shared/node-output-wiring.md](../shared/node-output-wiring.md) |
106
107
  | **Orchestrate RPA, agents, apps** | Relevant resource plugin: [rpa](plugins/rpa/), [agent](plugins/agent/), [agentic-process](plugins/agentic-process/), [flow](plugins/flow/), [api-workflow](plugins/api-workflow/), [hitl](plugins/hitl/) |
107
108
  | **Embed an AI agent tightly coupled to this flow** | [plugins/inline-agent/](plugins/inline-agent/) |
109
+ | **Build a chat agent flow (model a text-based chat experience)** | [plugins/conversational-agent/](plugins/conversational-agent/) — the conversation trigger and message nodes, plus inline, in-solution, or published chat agent(s) |
108
110
  | **Build a voice agent flow (answer or place phone calls)** | [plugins/inline-voice-agent/](plugins/inline-voice-agent/) — `uipath.agent.voice` plus the nodes that start, place, and end the call |
109
111
  | **Extract structured fields from documents** | [plugins/ixp/](plugins/ixp/) — IxP extraction models for PDFs, scanned forms, receipts, invoices, contracts |
110
112
  | **List IxP models / runtime projects available in flow** | [plugins/ixp/impl.md — Listing Published Models](plugins/ixp/impl.md#listing-published-models) — read-only registry search, no `.flow` scaffold or edits |
@@ -179,6 +181,7 @@ If you find yourself hand-writing `inputs.detail`, a `=jsonString:` blob, or `bi
179
181
  - [hitl](plugins/hitl/) — human input via UiPath Apps
180
182
  - [agent](plugins/agent/) — published AI agent resources
181
183
  - [inline-agent](plugins/inline-agent/) — autonomous agent embedded in flow
184
+ - [conversational-agent](plugins/conversational-agent/) — model a text-based chat experience: conversation trigger, message nodes, and an inline, in-solution, or published chat agent
182
185
  - [inline-voice-agent](plugins/inline-voice-agent/) — voice agent on a live phone call (inbound/outbound) + the trigger, create-call, and end-call nodes
183
186
  - [ixp](plugins/ixp/) — published IxP document-extraction models (PDFs, scanned forms, receipts, invoices, contracts)
184
187
  - [queue](plugins/queue/) — Orchestrator queue item creation
@@ -44,6 +44,7 @@ For edits touching multiple top-level arrays, follow [parallel same-file Edit ru
44
44
  | **Add a connector trigger** | Remove the manual trigger; add and configure the connector trigger with a connection. Use [CLI: Replace trigger](editing-operations-cli.md#replace-manual-trigger-with-connector-trigger) and [connector-trigger/impl.md](plugins/connector-trigger/impl.md). |
45
45
  | **Add a resource node** | Discover through the registry (`--local` for in-solution, or tenant registry for published); add with `Edit`; wire edges. Use the relevant plugin's `impl.md` and [editing-operations-json.md](editing-operations-json.md). |
46
46
  | **Add an inline agent node** | Embed `uipath.agent.autonomous` with an inline agent definition in the flow project. See [inline-agent/planning.md](plugins/inline-agent/planning.md) for inline versus published selection and [inline-agent/impl.md](plugins/inline-agent/impl.md) for scaffolding, JSON, and validation. |
47
+ | **Add chat nodes** | Turn a flow into a text-based conversation: a chat experience looping with wait-for-message, started by `core.trigger.conversation` — the trigger is what marks the package conversational. See [conversational-agent/planning.md](plugins/conversational-agent/planning.md) for the rules and when chat beats voice, and [conversational-agent/impl.md](plugins/conversational-agent/impl.md) for node JSON and the `conversationalAgentSettings` wiring. |
47
48
  | **Add voice nodes** | Turn a flow into a phone conversation: a `uipath.agent.voice` inline conversational agent wired to a live call, plus the trigger, create-call, and end-call nodes. Binding an inbound number happens at deploy time, not in the `.flow`. See [inline-voice-agent/planning.md](plugins/inline-voice-agent/planning.md) for the two topologies and trunk requirements, and [inline-voice-agent/impl.md](plugins/inline-voice-agent/impl.md) for node JSON, `callContext` wiring, and number binding. |
48
49
  | **Add a HITL QuickForm node** | Insert the human approval/review/enrichment checkpoint and wire its `completed` port. See [Edit/Write: Add a node](editing-operations-json.md) and [hitl/impl.md](plugins/hitl/impl.md). |
49
50
 
@@ -92,6 +92,7 @@ Read the relevant plugin `planning.md` when selecting a type.
92
92
  | `core.trigger.manual` | inline | On-demand user or API start |
93
93
  | `core.trigger.scheduled` | [scheduled-trigger](plugins/scheduled-trigger/planning.md) | Recurring schedule |
94
94
  | IS connector trigger | [connector-trigger](plugins/connector-trigger/planning.md) | External event; type `uipath.connector.trigger.<key>.<trigger>` |
95
+ | `core.trigger.conversation` | [conversational-agent](plugins/conversational-agent/planning.md) | Flow starts when a chat conversation is created, and emits its `conversationId` |
95
96
  | `core.trigger.voice` | [inline-voice-agent](plugins/inline-voice-agent/planning.md) | Flow starts when a phone call arrives on a bound number (inbound voice topology) |
96
97
 
97
98
  Every flow has exactly one trigger, first in topology. IS connector triggers replace manual or scheduled triggers. `core.trigger.manual` has no inputs and output port `output`.
@@ -114,6 +115,9 @@ Every flow has exactly one trigger, first in topology. IS connector triggers rep
114
115
  | `core.datafabric.update` | [data-fabric](plugins/data-fabric/planning.md) | Patch named columns on one record; gated by `canvas.nodes.update-entity` |
115
116
  | `core.datafabric.delete` | [data-fabric](plugins/data-fabric/planning.md) | Delete one record; gated by `canvas.nodes.delete-entity` |
116
117
  | `uipath.human-in-the-loop.quick-form` | [hitl](plugins/hitl/planning.md) | Inline human review, approval, or data entry |
118
+ | `uipath.conversational.wait-for-message` | [conversational-agent](plugins/conversational-agent/planning.md) | Pause until the user sends a chat message (initiates an exchange); returns the conversation context |
119
+ | `uipath.conversational.send-message` | [conversational-agent](plugins/conversational-agent/planning.md) | Write a message the flow composes itself into the chat |
120
+ | `uipath.conversational.get-conversation-context` | [conversational-agent](plugins/conversational-agent/planning.md) | Read latest conversation context without waiting for a new user message |
117
121
  | `uipath.conversational.voice.create-outgoing-call` | [inline-voice-agent](plugins/inline-voice-agent/planning.md) | Dial an outbound phone call and emit its `callContext` (outbound voice topology) |
118
122
  | `uipath.conversational.voice.end-call` | [inline-voice-agent](plugins/inline-voice-agent/planning.md) | End the active call in a voice flow |
119
123
 
@@ -139,6 +143,7 @@ Connector nodes are Integration Service nodes, not built-in. They appear after `
139
143
  | --- | --- | --- |
140
144
  | `uipath.agent.autonomous` | [inline-agent](plugins/inline-agent/planning.md) | Low-code agent scaffolded inside this flow via `uip agent init --inline-in-flow`, tightly coupled, not independently reused |
141
145
  | `uipath.core.agent.{key}` | [agent](plugins/agent/planning.md) | Separate in-solution or published agent, reusable and independently versioned |
146
+ | `uipath.agent.conversational` | [conversational-agent](plugins/conversational-agent/planning.md) | AI agent that runs a single response turn given a chat-history, streaming its messages and tool-calls to the conversation. In-solution and published chat agents use `uipath.core.agent.{key}` above |
142
147
  | `uipath.agent.voice` | [inline-voice-agent](plugins/inline-voice-agent/planning.md) | AI agent that converses in real time on a live phone call — an inline conversational agent (`settings.voice` in its `agent.json`) wired to a `callContext` |
143
148
 
144
149
  See [inline-agent/planning.md — Inline vs Published Agent Decision Table](plugins/inline-agent/planning.md#inline-vs-published-agent-decision-table).
@@ -180,6 +185,7 @@ Every edge requires `sourcePort` and `targetPort`.
180
185
  | `core.trigger.manual` | — | `output` |
181
186
  | `core.trigger.scheduled` | — | `output` |
182
187
  | `uipath.connector.trigger.*` | — | `output` |
188
+ | `core.trigger.conversation` | — | `output` |
183
189
  | `core.trigger.voice` | — | `output` |
184
190
  | `uipath.connector.event.*` | `input` | `output`, `error` |
185
191
  | `core.action.script` | `input` | `success`, `error` |
@@ -197,7 +203,11 @@ Every edge requires `sourcePort` and `targetPort`.
197
203
  | `core.subflow` | `input` | `output`, `error` |
198
204
  | `core.logic.mock` | `input` | `output` |
199
205
  | `uipath.agent.autonomous` | `input` | `success`, `error`, `tool`, `context`, `escalation` |
206
+ | `uipath.agent.conversational` | `input` | `success`, `escalation`, `context`, `tool` |
200
207
  | `uipath.agent.voice` | `input` | `success`, `error`, `tool`, `context`, `escalation` |
208
+ | `uipath.conversational.wait-for-message` | `input` | `output` |
209
+ | `uipath.conversational.send-message` | `input` | `output` |
210
+ | `uipath.conversational.get-conversation-context` | `input` | `output` |
201
211
  | `uipath.conversational.voice.create-outgoing-call` | `input` | `success`, `error` |
202
212
  | `uipath.conversational.voice.end-call` | `input` | `success`, `error` |
203
213
  | `uipath.core.agent.*` | `input` | `output`, `error` |
@@ -323,6 +333,7 @@ Before presenting the plan, validate every rule:
323
333
  - **Wait:** duration or date -> [delay](plugins/delay/planning.md); external robot result -> [queue](plugins/queue/planning.md) `create-and-wait`.
324
334
  - **Human:** approval or data entry -> [hitl](plugins/hitl/planning.md), or `core.logic.mock` if unavailable.
325
335
  - **Agent:** tightly coupled low-code agent inside flow -> [inline-agent](plugins/inline-agent/planning.md), `uipath.agent.autonomous`; coded or separate in-solution/published agent -> [agent](plugins/agent/planning.md), `uipath.core.agent.{key}`.
336
+ - **Chat:** text-based conversation the flow holds turn by turn -> [conversational-agent](plugins/conversational-agent/planning.md), `core.trigger.conversation` plus `uipath.conversational.wait-for-message` with responding chat agent(s) and `send-message` node(s); agent inside this flow -> `uipath.agent.conversational`; sibling or published agent -> [agent](plugins/agent/planning.md), `uipath.core.agent.{key}` with `isConversational`; single approval or data-entry without a full conversation -> [hitl](plugins/hitl/planning.md).
326
337
  - **LLM over CSV/document:** CSV row columns -> [batch-transform](plugins/batch-transform/planning.md), `uipath.pattern.batch-transform`; one-document synthesis/Q&A/citations -> [summarize](plugins/summarize/planning.md), `uipath.pattern.deep-rag`; multi-step tool reasoning -> inline or published agent; ordinary reshaping -> transform.
327
338
  - **Document extraction:** variable-layout PDF, scan, photo, or attachment -> [ixp](plugins/ixp/planning.md), `uipath.ixp.{modelName}.{fullyQualifiedName}`; structured source -> script or transform; free-form reasoning -> agent; untrained IxP model -> `core.logic.mock` plus Open Question.
328
339
  - **Missing capability:** use `core.logic.mock`; identify the needed artifact and owning skill (`uipath-rpa` for desktop/browser or coded C# workflows, `uipath-agents` for agents). Phase 2 replaces the mock if published.
@@ -46,6 +46,11 @@ Use these plugin mappings:
46
46
  | `core.logic.terminate` | [terminate/impl.md](plugins/terminate/impl.md) |
47
47
  | `core.subflow` | [subflow/impl.md](plugins/subflow/impl.md) |
48
48
  | `core.trigger.scheduled` | [scheduled-trigger/impl.md](plugins/scheduled-trigger/impl.md) |
49
+ | `core.trigger.conversation` | [conversational-agent/impl.md](plugins/conversational-agent/impl.md) |
50
+ | `uipath.agent.conversational` | [conversational-agent/impl.md](plugins/conversational-agent/impl.md) |
51
+ | `uipath.conversational.wait-for-message` | [conversational-agent/impl.md](plugins/conversational-agent/impl.md) |
52
+ | `uipath.conversational.send-message` | [conversational-agent/impl.md](plugins/conversational-agent/impl.md) |
53
+ | `uipath.conversational.get-conversation-context` | [conversational-agent/impl.md](plugins/conversational-agent/impl.md) |
49
54
  | `core.trigger.voice` | [inline-voice-agent/impl.md](plugins/inline-voice-agent/impl.md) |
50
55
  | `core.action.queue.*` | [queue/impl.md](plugins/queue/impl.md) |
51
56
  | `core.datafabric.*` | [data-fabric/impl.md](plugins/data-fabric/impl.md) |
@@ -189,6 +189,16 @@ Connect trigger → agent → end:
189
189
 
190
190
  Reference upstream values as `$vars.<nodeId>.output.<field>` and flow globals as `$vars.<global>`. Agent inputs therefore reference `$vars.<TRIGGER_ID>.output.<INPUT_FIELD>`.
191
191
 
192
+ ## Conversational Agents
193
+
194
+ A conversational (text chat) agent uses this node type with a different input shape — `isConversational: true` plus a `conversationalAgentSettings` block, instead of the agent's own schema fields. It also needs the conversation trigger and wait-for-message loop around it.
195
+
196
+ All of that — the five-key settings block, the node JSON, the loop, and the ports — lives in [conversational-agent/impl.md](../conversational-agent/impl.md). Come back here only for discovery: an in-solution agent is visible only with `--local`.
197
+
198
+ ```bash
199
+ uip maestro flow registry get "uipath.core.agent.{key}" --local --output json
200
+ ```
201
+
192
202
  ## Accessing Output
193
203
 
194
204
  ```javascript
@@ -43,6 +43,20 @@ Use workflow nodes for the deterministic parts (fetch data, transform, route) an
43
43
  - **Need to call an external service API** — use [Connector](../connector/planning.md) or [HTTP](../http/planning.md)
44
44
  - **Agent should be a tool for another agent** — don't use this node; instead add the agent as a tool resource (`uipath.agent.resource.tool.agent`) wired to a parent agent node. See the `uipath-agents` skill for the resource file format
45
45
 
46
+ ## Conversational Agents
47
+
48
+ A **conversational** agent — one that holds a text chat — uses this same node type. `uip agent init --conversational` and the registry mark it out:
49
+
50
+ | | Autonomous | Conversational |
51
+ | --- | --- | --- |
52
+ | `display.icon` | `autonomous-agent` | `conversational-agent` |
53
+ | `inputDefaults` | the agent's own input schema | `isConversational: true`, `conversationalAgentSettings: {}` |
54
+ | Usable as another agent's tool | yes | no — no `uipath.agent.resource.tool.agent.<id>` sibling is emitted |
55
+
56
+ The conversational agent node is only part of a chat. The conversation trigger, the wait-for-message loop, the `conversationalAgentSettings` wiring, and the node JSON for all three agent flavors live in [conversational-agent/planning.md](../conversational-agent/planning.md) — start there for any chat flow.
57
+
58
+ A published conversational agent gets its `isConversational` flag from its Orchestrator release; an in-solution one gets it from the sibling project's `agent.json`. Either way the registry reports it, so trust `registry get` rather than guessing from the name.
59
+
46
60
  ## Ports
47
61
 
48
62
  | Input Port | Output Port(s) |
@@ -0,0 +1,291 @@
1
+ # Chat (Text-based Conversation) Nodes — Implementation
2
+
3
+ Wire whatever shape the conversation needs, inside the rules in [planning.md](planning.md#critical-rules-any-conversational-flow-must-follow).
4
+
5
+ For a phone conversation, use [inline-voice-agent/impl.md](../inline-voice-agent/impl.md) instead.
6
+
7
+ Everything here is the same for all three agent flavors except the agent node itself and its port. Settle the flavor first — [planning.md](planning.md#pick-the-agent-flavor-before-you-build).
8
+
9
+ ## Resolve the Agent
10
+
11
+ **Inline** — scaffold it, from the solution root:
12
+
13
+ ```bash
14
+ uip agent init "<FlowProjectName>" --inline-in-flow --conversational
15
+ ```
16
+
17
+ Writes `<FlowProject>/<uuid>/agent.json` plus `flow-layout.json`, and returns `Data.ProjectId`. **Keep that UUID** — it is what the agent node's `inputs.source` must carry.
18
+
19
+ **In-solution** — the agent is a sibling project; nothing to scaffold in the flow. Find its node type:
20
+
21
+ ```bash
22
+ uip maestro flow registry list --local --output json
23
+ ```
24
+
25
+ **Published** — already on the tenant:
26
+
27
+ ```bash
28
+ uip maestro flow registry search "<agent name>" --output json
29
+ ```
30
+
31
+ Both of the latter give a `uipath.core.agent.*` node type — suffixed with the solution resource key in-solution, the Orchestrator-assigned UUID when published. `registry get` on it returns `inputDefaults` holding `isConversational: true` and `conversationalAgentSettings`, which is how you confirm the agent really is a chat agent rather than an autonomous one. Discovery details live in [agent/impl.md](../agent/impl.md#discovery-and-registry-validation).
32
+
33
+ **If an in-solution agent comes back autonomous**, the registry could not read its `agent.json` — it builds that node from the sibling project's file, and falls back to autonomous when the file is missing or malformed. Re-run with `--log-level debug` and it names the reason:
34
+
35
+ ```
36
+ [DEBUG] Unparseable agent.json in <projectDir>: … The node will describe an autonomous agent.
37
+ [DEBUG] No readable agent.json in <projectDir>; the node will describe an autonomous agent.
38
+ ```
39
+
40
+ Nothing else reports it, and the authored node would run as autonomous with no error at any step. Published agents are unaffected — their flag comes from the release, not a local file.
41
+
42
+ ## Configure `agent.json`
43
+
44
+ Edit the scaffolded file, then regenerate its derived fields:
45
+
46
+ ```bash
47
+ uip agent refresh "<FlowProject>/<uuid>" --inline-in-flow
48
+ uip agent validate "<FlowProject>/<uuid>" --inline-in-flow
49
+ ```
50
+
51
+ `refresh` rebuilds `contentTokens[]` from `messages[].content`. **Skip it and `agent validate` fails** with `contentTokens has 0 entries but content requires 1` — the error does not name `agent refresh`, so it is easy to get stuck on.
52
+
53
+ Run `refresh` after any `agent.json` edit — for an in-solution agent too, without the flag: `uip agent refresh "<AgentProject>"`. A published agent has no local file, so there is nothing to refresh.
54
+
55
+ Settings that matter for a conversational agent:
56
+
57
+ | Key | Value | Why |
58
+ | --- | --- | --- |
59
+ | `settings.engine` | `conversational-v1` | What makes it a chat agent rather than autonomous |
60
+ | `metadata.isConversational` | `true` | Read by the registry to pick the icon and keep the agent out of the agent-as-tool picker |
61
+ | `settings.maxIterations` | `8` | keep what the scaffold wrote |
62
+
63
+ `uip agent init --conversational` writes all three. Do not remove them.
64
+
65
+ ## Registry Validation
66
+
67
+ `flow validate` has **no registry fallback** — a hand-authored node must carry its manifest in the file's `definitions[]`. Fetch one per node type in the flow:
68
+
69
+ ```bash
70
+ uip maestro flow registry get core.trigger.conversation --output json
71
+ uip maestro flow registry get uipath.conversational.wait-for-message --output json
72
+ uip maestro flow registry get uipath.agent.conversational --output json
73
+ ```
74
+
75
+ Append each `Data.Node` verbatim to the `.flow`'s `definitions[]`, and set the node's `typeVersion` to exactly the `version` the command returned. Miss one and validate reports `Node type "<type>:<version>" has no matching definition`.
76
+
77
+ The conversational agent node requires a login; the trigger and the tool nodes resolve from the bundled catalog.
78
+
79
+ ## The `conversationalAgentSettings` Wiring Rule
80
+
81
+ This is the one that goes wrong silently. The agent reads the conversation through `inputs.conversationalAgentSettings`, which holds **five** keys — a `context` binding plus four fields derived from it:
82
+
83
+ ```json
84
+ "conversationalAgentSettings": {
85
+ "mode": "simple",
86
+ "context": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext", "fieldType": "object" },
87
+ "conversationId": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext.conversationId", "fieldType": "string" },
88
+ "exchangeId": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext.latestExchangeId", "fieldType": "string" },
89
+ "messages": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext.messages", "fieldType": "array" },
90
+ "userSettings": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext.userSettings", "fieldType": "object" }
91
+ }
92
+ ```
93
+
94
+ **`mode` and `context` exist only to restore the editor UI.** The four individual fields are what the runtime reads, in either mode, and validation requires `conversationId` regardless. `custom` is for a turn assembled from more than one source. `mode` is optional; the examples here all declare `simple`.
95
+
96
+ **Write all five.** In Studio Web the author fills `context` and the panel derives the other four, but that derivation only runs in the editor — nothing derives them when the file is authored from the CLI.
97
+
98
+ Validation only requires `conversationId`, so it half-helps: leave that out and validate fails, but bind `context` and `conversationId` while dropping `exchangeId`, `messages` and `userSettings` and validate passes. The runtime reads all four, so that flow ships an agent with no chat history and no user settings.
99
+
100
+ Note the field is `latestExchangeId` inside `conversationContext`, not `exchangeId`.
101
+
102
+ ## Bindings Are Objects, Not `=js:` Strings
103
+
104
+ Every expression binding in a `.flow` is the object form above. A bare `"=js:$vars.…"` string is a pre-1.3 file format that current files no longer use — Studio Web renders it as literal text rather than a binding, and nothing warns.
105
+
106
+ This matters when using `node add`, which writes `--input` JSON through untouched:
107
+
108
+ ```bash
109
+ # WRONG — lands in the file verbatim, renders as text
110
+ uip maestro flow node add ChatFlow/ChatFlow.flow uipath.conversational.wait-for-message \
111
+ --input '{"conversationId":"=js:$vars.conversationTrigger1.output.conversationId"}'
112
+
113
+ # RIGHT
114
+ uip maestro flow node add ChatFlow/ChatFlow.flow uipath.conversational.wait-for-message \
115
+ --input '{"conversationId":{"type":"jsExpression","expression":"$vars.conversationTrigger1.output.conversationId","fieldType":"string"}}'
116
+ ```
117
+
118
+ (`uip maestro flow node configure --detail` uses the `=js:` form for **connector** nodes — that is a different surface and does not apply here.)
119
+
120
+ ## Node JSON
121
+
122
+ > **Which surface authors this node.** [inline-agent/impl.md § What NOT to Do](../inline-agent/impl.md#what-not-to-do) bars Flow CLI `node add` / `edge add` for inline **autonomous** agent graph edits. That rule does not cover `uipath.agent.conversational`: the CLI path below is the supported one for this node, `--source` is a documented `node add` flag for it, and the full recipe validates clean. Use `Edit` / `Write` when you prefer, but do not read the inline-agent prohibition as applying here.
123
+
124
+ Editing the `.flow` directly carries the usual obligations — chiefly a `variables.nodes[]` entry for every data-producing node, which is what makes `$vars.<id>.output` resolve at all. See [editing-operations-json.md](../../editing-operations-json.md). `node add` writes those entries for you.
125
+
126
+ ### Conversation trigger
127
+
128
+ Replace the default manual trigger — `flow init` scaffolds `core.trigger.manual`, and the conversation trigger is what makes the packaged flow conversational and exposed as a chat experience. Same two-step shape as [editing-operations-cli.md § Replace manual trigger with connector trigger](../../editing-operations-cli.md#replace-manual-trigger-with-connector-trigger), with the conversation trigger in place of a connector one.
129
+
130
+ ```bash
131
+ uip maestro flow node remove ChatFlow/ChatFlow.flow start
132
+ uip maestro flow node add ChatFlow/ChatFlow.flow core.trigger.conversation --position 256,144
133
+ ```
134
+
135
+ ### Wait for message
136
+
137
+ ```json
138
+ {
139
+ "id": "waitForMessage1",
140
+ "type": "uipath.conversational.wait-for-message",
141
+ "inputs": {
142
+ "conversationId": { "type": "jsExpression", "expression": "$vars.conversationTrigger1.output.conversationId", "fieldType": "string" },
143
+ "from": "User"
144
+ }
145
+ }
146
+ ```
147
+
148
+ ### The agent — inline
149
+
150
+ `inputs.source` is the scaffolded UUID; `conversationalAgentSettings` is the five-key block above.
151
+
152
+ ```bash
153
+ uip maestro flow node add ChatFlow/ChatFlow.flow uipath.agent.conversational \
154
+ --position 768,144 --source <ProjectId> --input '<the settings JSON>'
155
+ ```
156
+
157
+ ### The agent — in-solution or published
158
+
159
+ Same settings block, different node type, and `isConversational` alongside it instead of `source`. The suffix is the solution resource key in-solution and the Orchestrator-assigned UUID when published, so read the exact `nodeType` off `registry get` either way:
160
+
161
+ ```json
162
+ {
163
+ "id": "supportAgent1",
164
+ "type": "uipath.core.agent.<suffix from registry get>",
165
+ "typeVersion": "<version from registry get>",
166
+ "inputs": {
167
+ "isConversational": true,
168
+ "conversationalAgentSettings": { "...": "the five-key block above" }
169
+ }
170
+ }
171
+ ```
172
+
173
+ An in-solution agent needs its `definitions[]` entry fetched with `--local`; a published one comes from the pulled tenant registry.
174
+
175
+ ### Send message (for flow-composed messages)
176
+
177
+ `conversationId`, `exchangeId`, `content`, `role` and `mimeType` are all required. `role` and `mimeType` each accept exactly one value, so write them as shown. `content` is normally a literal — the agent's own replies are streamed, not routed through this node.
178
+
179
+ ```json
180
+ {
181
+ "id": "sendMessage1",
182
+ "type": "uipath.conversational.send-message",
183
+ "inputs": {
184
+ "conversationId": { "type": "jsExpression", "expression": "$vars.conversationTrigger1.output.conversationId", "fieldType": "string" },
185
+ "exchangeId": { "type": "jsExpression", "expression": "$vars.waitForMessage1.output.conversationContext.latestExchangeId", "fieldType": "string" },
186
+ "content": { "type": "literal", "expression": "Anything else I can help with?", "fieldType": "string" },
187
+ "role": "assistant",
188
+ "mimeType": "text/markdown"
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### Get conversation context
194
+
195
+ Reads recent exchanges without waiting. Rarely needed, and constrained — see [planning.md § Get Conversation Context](planning.md#get-conversation-context).
196
+ ```json
197
+ {
198
+ "id": "getConversationContext1",
199
+ "type": "uipath.conversational.get-conversation-context",
200
+ "inputs": {
201
+ "conversationId": { "type": "jsExpression", "expression": "$vars.conversationTrigger1.output.conversationId", "fieldType": "string" },
202
+ "exchangeLimit": 20
203
+ }
204
+ }
205
+ ```
206
+
207
+ ## Structured Outputs
208
+
209
+ In addition to responding to the chat, an **inline** conversational agent can also return named fields for a downstream node to route on. Published and in-solution agents cannot.
210
+
211
+ Declare each field in two places or it yields nothing at run time:
212
+
213
+ | Where | What |
214
+ | --- | --- |
215
+ | the node, in the `.flow` | `inputs.agentOutputVariables: [{ "id": "shouldHandoff", "type": "boolean", "description": "..." }]` |
216
+ | the inline `agent.json` | the same field under `outputSchema.properties` |
217
+
218
+ Bind it downstream as `$vars.<agentNodeId>.output.shouldHandoff`. Writing one side without the other passes `agent validate` and `flow validate` — nothing checks the pair.
219
+
220
+ ## Wire the Edges
221
+
222
+ An **inline** agent leaves on `success`; an in-solution or published one leaves on `output`. The smallest loop:
223
+
224
+ ```bash
225
+ uip maestro flow edge add ChatFlow/ChatFlow.flow conversationTrigger1 waitForMessage1
226
+ uip maestro flow edge add ChatFlow/ChatFlow.flow waitForMessage1 conversationalAgent1
227
+ uip maestro flow edge add ChatFlow/ChatFlow.flow conversationalAgent1 waitForMessage1 --source-port success
228
+ ```
229
+
230
+ Omit `--source-port success` and the command fails with `Source port "output" not found on node "conversationalAgent1". Available source ports: escalation, context, tool, success`.
231
+
232
+ ## Validate
233
+
234
+ ```bash
235
+ uip maestro flow validate ChatFlow/ChatFlow.flow
236
+ ```
237
+
238
+ Unbound identifiers each report their own error, naming the node and field:
239
+
240
+ ```
241
+ [nodes[waitForMessage1].inputs.conversationId] [SCHEMA_ERROR] Conversation ID is required
242
+ [nodes[sendMessage1].inputs.exchangeId] [SCHEMA_ERROR] Exchange ID is required
243
+ [nodes[sendMessage1].inputs.content] [SCHEMA_ERROR] Content is required
244
+ [nodes[conversationalAgent1].inputs.conversationalAgentSettings.conversationId]
245
+ [CONVERSATIONAL_CONVERSATION_ID_REQUIRED] Conversation ID is required
246
+ ```
247
+
248
+ A clean validate does **not** mean the bindings are right — see [planning.md § Output Variables](planning.md#output-variables).
249
+
250
+ ## Pack and Ship
251
+
252
+ ```bash
253
+ uip maestro flow pack ChatFlow ./dist --version 1.0.0
254
+ ```
255
+
256
+ Confirm the marker in the packaged `content/operate.json`:
257
+
258
+ ```json
259
+ "runtimeOptions": { "isConversational": true }
260
+ ```
261
+
262
+ The marker is the contract with the runtime chat channels: a headless SDK lists any deployed process carrying it, and every OOTB integration on that SDK (e.g. web-chat, iframe embedding, UiPath Assistant, Microsoft Teams, Slack) plus custom UIs pick it up automatically.
263
+
264
+ Absent means the flow does not start on `core.trigger.conversation`, and it will not be listed as a Conversational Agent in the channels.
265
+
266
+ ## Debug — the CLI Hands Off
267
+
268
+ A chat cannot be driven headlessly, so `flow debug` uploads the solution and stops:
269
+
270
+ ```bash
271
+ uip maestro flow debug ChatFlow --open-in-browser
272
+ ```
273
+
274
+ Returns `Code: FlowDebugStudioWebHandoff` with `Data.studioWebUrl` and `Data.handedOff: true`, and no debug session is started. `--timeout` has no effect on this path.
275
+
276
+ Two chat UIs can drive the run — the CLI names both:
277
+
278
+ - **Studio Web** — open `Data.studioWebUrl` (`--open-in-browser` does it for you) and chat from its panel
279
+ - **UiPath Maestro VS Code extension** — open the flow and hit Debug
280
+
281
+ If the solution's `.uipx` already carries a `SolutionId`, the upload overwrites that solution rather than creating a second one.
282
+
283
+ ## What NOT to Do
284
+
285
+ - **Do not stop at `context` and `conversationId`** — see [§ The `conversationalAgentSettings` Wiring Rule](#the-conversationalagentsettings-wiring-rule).
286
+ - **Do not invent output paths.** `waitForMessage1.output.exchangeId` and `conversationalAgent1.output.response` do not exist, and validate accepts both.
287
+ - **Do not use `=js:` strings** for bindings in a `.flow`.
288
+ - **Do not carry one flavor's agent port across.** Inline continues on `success`, in-solution and published on `output`.
289
+ - **Do not add a send-message just to deliver the conversational agent's reply.** The conversational agent already streams it.
290
+ - **Do not expect `flow debug` to run the conversation.** It hands off to Studio Web or the VS Code extension.
291
+ - **Do not leave the manual trigger in place.** Without `core.trigger.conversation` the package is not marked conversational, and nothing errors.
@@ -0,0 +1,133 @@
1
+ # Chat (Text-based Conversation) Nodes — Planning
2
+
3
+ Build a conversational flow whose job is to model a **text-based chat**: a user types, the Flow responds through AI or deterministic answers, and waits for the next message or eventually terminates. For a chat that happens over a **phone call**, use [inline-voice-agent](../inline-voice-agent/planning.md) instead — same idea, different medium, different node types.
4
+
5
+ The flow is **surface-agnostic**; one conversational flow is consumed from many channels. Once deployed, the common UiPath TypeScript SDK can list every conversational flow on the tenant, and every OOTB integration built on that SDK — e.g. web-chat, iframe embedding, UiPath Assistant, Microsoft Teams, Slack — plus any customer's custom UI is able to converse with the chat experience. Author for the conversation, not for a channel.
6
+
7
+ ## Node Types
8
+
9
+ | Node type | Role |
10
+ | --- | --- |
11
+ | `core.trigger.conversation` | Starts the flow when a conversation is created. Emits the `conversationId` every other node is addressed by. |
12
+ | `uipath.conversational.wait-for-message` | Pauses until the user sends a message (initiates an exchange). Returns the conversation context (which includes the recent exchanges in the chat history), intended for input into a conversational agent node. |
13
+ | conversational agent node | Requires the user to initiate an exchange first. Given the conversation context, runs a single response turn, streaming its messages and tool-calls back to the chat. Which node type depends on where the agent lives — see below. |
14
+ | `uipath.conversational.send-message` | Requires the user to initiate an exchange first. Sends a flow-composed message (e.g. a handoff notice, results/updates from other nodes) back to the chat. |
15
+ | `uipath.conversational.get-conversation-context` | Immediately reads the conversation context without waiting for a user message. Rarely needed, and constrained — see [§ Get Conversation Context](#get-conversation-context). |
16
+
17
+ ### Pick the agent flavor before you build
18
+
19
+ The trigger and message nodes are identical whichever you pick. Only the agent node changes — and **ask the user rather than defaulting**, because the answer decides the node type, the ports, and whether you scaffold anything at all:
20
+
21
+ | Flavor | Node type | Where the agent lives | Choose it when |
22
+ | --- | --- | --- | --- |
23
+ | **Inline** | `uipath.agent.conversational` | A UUID subdirectory inside this flow project | The agent exists only as part of this conversational flow, or you need [structured outputs](impl.md#structured-outputs) to route on — only inline has them. You scaffold it with `agent init --inline-in-flow --conversational`. |
24
+ | **In-solution** | `uipath.core.agent.{key}` | A sibling project in the same solution | The agent is its own project, versioned separately, maybe reused by other flows in the solution. Discover it with `registry list --local`. |
25
+ | **Published** | `uipath.core.agent.<agentUuid>` | The tenant, already published | The user names an existing agent, or one is already deployed. Discover it with `registry search`. Nothing to scaffold. |
26
+
27
+ `{key}` is the in-solution agent's solution resource key, the `key` in `resources/solution_folder/process/agent/<Project>.json`, and **not** `agent.json`'s `projectId`. A published agent's suffix is the Orchestrator-assigned UUID instead. Read either off `registry get`.
28
+
29
+ **If the user names an existing agent, it is not inline.** Run `uip maestro flow registry search "<name>" --output json` (and `registry list --local` for solution siblings) before scaffolding anything — the same rule the [agent](../agent/planning.md) plugin states for autonomous agents.
30
+
31
+ In-solution and published share one node type and one set of ports; inline differs on both (see [Ports](#ports)).
32
+
33
+ Read each node's current inputs and version from the registry rather than assuming — these move between releases:
34
+
35
+ ```bash
36
+ uip maestro flow registry get uipath.conversational.wait-for-message
37
+ ```
38
+
39
+ ## When to Use
40
+
41
+ Use these nodes when the flow **is** the conversation: a support chat, an intake questionnaire, a triage bot. The flow's shape generally loops with wait-for-message, but can also have termination - once the flow ends, the conversation gracefully completes, with a UI change to the user that the conversation has completed.
42
+
43
+ ### Chat vs Voice vs Autonomous
44
+
45
+ | Situation | Text-based conversation (`uipath.agent.conversational`) | Voice ([`uipath.agent.voice`](../inline-voice-agent/planning.md)) | Inline autonomous ([`uipath.agent.autonomous`](../inline-agent/planning.md)) |
46
+ | --- | --- | --- | --- |
47
+ | The user types and reads replies | Yes | No | No |
48
+ | The user is on a phone call | No | Yes | No |
49
+ | A reasoning step over flow data, nobody talking | No | No | Yes |
50
+ | Reply reaches the user | Streamed by the agent | Spoken on the call | Only through send-message node with the agent's result (high latency) |
51
+
52
+ ### When NOT to Use
53
+ - **The conversation is a phone call** — [inline-voice-agent](../inline-voice-agent/planning.md).
54
+ - **A single pause for a human to review, approve, or fill in data** — See [hitl](../hitl/planning.md) for a form.
55
+
56
+ ## Critical Rules Any Conversational Flow Must Follow
57
+ Combine the nodes, along with flow's other nodes and routing capabilities, to model conversational paths as needed. The **following rules hold for whatever shape you build:**
58
+
59
+ - **Start with `core.trigger.conversation`.** The trigger alone sets `runtimeOptions.isConversational` in the packed `operate.json`, marking it as a chattable process.
60
+ - **Immediately follow the conversation trigger with a wait-for-message node.** This is so the Flow can immediately handle user's first chat message.
61
+ - Related: the flow **cannot send a message "first"** and can only reply. The user must initiate an exchange before conversational agent and send-message nodes can respond, as those nodes require an exchange ID to reply to; this exchange ID is included in the conversation context outputted from a wait-for-message node.
62
+ - Every key in `conversationalAgentSettings` derives from a wait-for-message node's `conversationContext` — see [impl.md](impl.md#the-conversationalagentsettings-wiring-rule).
63
+ - **Reach a wait node again to keep the conversation alive.** The flow's response to the latest exchange ends when either (1) arriving back at a wait-for-message node or (2) when the flow ends. Until either occurs, the user is not expected to send a message (chat UI blocks input, since it is the flow's turn in the exchange). When the flow ends, the chat UI will indicate to the user that the conversation has gracefully completed.
64
+ - **The conversational agent node streams its own reply.** No send-message is needed for the agent to answer, since its message and tool-calls are streamed automatically to the chat and appended to the conversation history.
65
+ - **Leave the conversational agent on the port its flavor exposes** — `success` for inline, `output` for in-solution and published. See [Ports](#ports).
66
+
67
+ A simple flow that satisfies all the rules:
68
+
69
+ ```
70
+ core.trigger.conversation → wait-for-message → conversational agent ──┐
71
+ ▲ │
72
+ └───────────────────────────────────┘
73
+ ```
74
+
75
+ That is a starting point, not the only supported shape. Add whatever the conversational flow needs: additional agent and send-message nodes, a decision on the agent's outputs, handoffs, parallel branches to execute behind-the-scenes tasks, an escalation to [hitl](../hitl/planning.md), a connector or RPA call between turns, or no loop back at all when the conversation should end.
76
+
77
+ ### Get Conversation Context
78
+
79
+ `get-conversation-context` is legal but usually redundant — wait-for-message already returns the context. It may be useful for cases when conversational agent and send-message nodes are chained together (to re-obtain the chat-history between them) or when needing the most up-to-date conversation-history without requiring the user to send a message. Note that you **cannot** immediately use `get-conversation-context` after the `core.trigger.conversation` and use the outputted conversation context as input for conversational agents and send-message nodes, since there is not yet an initiated exchange (see above critical rules).
80
+
81
+ ## Ports
82
+
83
+ | Node type | Target | Source |
84
+ | --- | --- | --- |
85
+ | `core.trigger.conversation` | — | `output` |
86
+ | `uipath.conversational.wait-for-message` | `input` | `output` |
87
+ | `uipath.agent.conversational` (inline) | `input` | `success`, `escalation`, `context`, `tool` |
88
+ | `uipath.core.agent.{key}` (in-solution) | `input` | `output` |
89
+ | `uipath.core.agent.<agentUuid>` (published) | `input` | `output`, `error` |
90
+ | `uipath.conversational.send-message` | `input` | `output` |
91
+ | `uipath.conversational.get-conversation-context` | `input` | `output` |
92
+
93
+ Only the inline agent breaks the pattern: `success`, and no `output` port. In-solution and published have `output` and no `success`. Both mistakes are caught — `edge add` lists the real ports, validate reports `Edge references undeclared source handle`. Note `output` is also a variable namespace (`$vars.<id>.output.…`) on every node, which is why the inline agent has one without having the port.
94
+
95
+ ## Output Variables
96
+
97
+ | Node | Output |
98
+ | --- | --- |
99
+ | `core.trigger.conversation` | `output.conversationId` |
100
+ | `uipath.conversational.wait-for-message` | `output.conversationContext` — an object holding `conversationId`, `latestExchangeId`, `messages`, `userSettings` |
101
+ | `uipath.agent.conversational` | `output.uipath__agent_response_messages` — this turn's messages (role, contentParts, toolCalls). The reply is streamed, so there is no `output.response`. |
102
+
103
+ There is **no `output.exchangeId`** on wait-for-message and **no `output.response`** on the agent. Binding either produces `undefined` at runtime, and `flow validate` does not catch it — invented `$vars` paths pass validation today, so read the real field names off `registry get` rather than trusting a clean validate.
104
+
105
+ ## Scaffolding Prerequisite
106
+
107
+ The inline agent node points at an agent project directory that must exist first:
108
+
109
+ ```bash
110
+ uip agent init "<FlowProjectName>" --inline-in-flow --conversational
111
+ ```
112
+
113
+ The returned `ProjectId` is the UUID the node's `inputs.source` must carry. See [impl.md](impl.md) for the scaffold contents and the `agent.json` settings that matter.
114
+
115
+ ## Resources — tools, context, escalation
116
+
117
+ The `tool`, `context` and `escalation` source ports behave exactly as they do on the inline autonomous node: discover the resource node type through the registry, add the node with `Edit`, wire the artifact edge from the agent's port, and author the matching `resource.json`. Do not re-derive that flow — [inline-agent/impl.md § Adding Resource Nodes](../inline-agent/impl.md#adding-resource-nodes) owns discovery, the one UUID that serves as both `inputs.source` and the sidecar directory, and the `refresh --bindings-target` step that propagates tool bindings into the parent flow.
118
+
119
+ Three things differ from the autonomous node:
120
+
121
+ - **There is no `memory` port.** The autonomous node has one; `uipath.agent.conversational` does not. An edge to it fails the same way any bad port does — `edge add` will not list it, and validate reports `Edge references undeclared source handle`.
122
+ - **Guardrails ride as a top-level `guardrails` array in the inline agent's `agent.json`**, which `uip agent init --inline-in-flow --conversational` scaffolds for you. Which guardrails apply is flavor-specific — Studio Web's properties panel filters the catalog by conversational vs autonomous — so do not assume a guardrail available on an autonomous agent is offered here.
123
+ - **Do not add `guardrails` to `inputSchema.properties`.** That requirement is autonomous-only, where it sits alongside the process arguments. A conversational agent's `inputSchema` stays `{"type": "object", "properties": {}}`; populating it breaks the shape the `uipath-agents` scaffold test asserts.
124
+
125
+ ## Planning Annotation
126
+
127
+ In the architectural plan:
128
+
129
+ - `chat-agent: <description>` — one line per agent; omit for a scripted chat. Inline: Reuse the [inline-agent](../inline-agent/planning.md) annotations. In-solution or published: `<agent-name> in <folder-path>`.
130
+ - `chat-agent-flavor: <agent-name> = inline | in-solution | published` — one per agent above; decides the node type (`uipath.agent.conversational` for inline, `uipath.core.agent.*` for the others — see the [flavor table](#pick-the-agent-flavor-before-you-build) for which suffix each takes) and on which port (`success` for inline, `output` for the others)
131
+ - `chat-send-message: <purpose>` — one line per flow-authored message (loading messages, handoff notice, node output results); a scripted chat consists mostly of these
132
+ - `chat-structured-output: <agent-name> = <fieldName>` — only when the flow branches on that conversational agent's reply; forces that conversational agent to inline flavor because in-solution and published conversational agents have no structured outputs
133
+ - Tools, contexts, and escalations on any inline chat agent reuse the [inline-agent](../inline-agent/planning.md) annotations
@@ -518,7 +518,7 @@ Current CLIs report the same fault as `[SCHEMA_ERROR] System prompt is required`
518
518
 
519
519
  ## What NOT to Do
520
520
 
521
- - **Do not use Flow CLI `node add`, `edge add`, or `variable` commands for inline-agent graph edits** — inline-agent node, edge, variable, layout, and tool-resource node changes are non-carve-out structural `.flow` mutations and must be authored directly with `Edit` / `Write`.
521
+ - **Do not use Flow CLI `node add`, `edge add`, or `variable` commands for inline-agent graph edits** — inline-agent node, edge, variable, layout, and tool-resource node changes are non-carve-out structural `.flow` mutations and must be authored directly with `Edit` / `Write`. This rule scopes to `uipath.agent.autonomous`. It does **not** cover the inline conversational agent (`uipath.agent.conversational`), whose documented recipe authors the node and its edges with `node add` / `edge add` — see [conversational-agent/impl.md § Node JSON](../conversational-agent/impl.md#node-json).
522
522
  - **Do not write `inputs.systemPrompt` / `inputs.userPrompt` on the inline-agent node** — full rule in § Wiring Flow Variables into Agent Prompts § Anti-patterns. Prompts live in `agent.json`.
523
523
  - **Do not put a `model` block on the inline-agent node instance** — the node inherits serviceType/version/context from `definitions[]`; the inline-agent source lives at `inputs.source`.
524
524
  - **Do not use `model.agentProjectId`, `inputs.agentProjectId`, or `model.source` on any inline-agent-related node instance** — both `uipath.agent.autonomous` and every attached resource node (`uipath.agent.resource.tool.*`, `uipath.agent.resource.escalation`, `uipath.agent.resource.context.*`) carry source identity at `inputs.source` and have no instance `model` block.
@@ -35,6 +35,8 @@ Capability index for postmortem on a failed `flow debug` or deployed process run
35
35
  | Need | Read |
36
36
  | --- | --- |
37
37
  | Triage a failed flow run | [troubleshooting-guide.md](troubleshooting-guide.md) |
38
+ | An in-solution chat agent shows as autonomous | The registry builds that node from the sibling project's `agent.json` and falls back to autonomous when it cannot read it. `--log-level debug` names the reason ("Unparseable agent.json" / "No readable agent.json"); nothing else reports it. See [conversational-agent/impl.md](../author/plugins/conversational-agent/impl.md#resolve-the-agent) |
39
+ | A chat flow "hangs" or times out during debug | Not a fault. `flow debug` hands a `core.trigger.conversation` flow off rather than running it, and a flow parked on `wait-for-message` is waiting for a user message that no headless run will send. Drive it from a chat UI — Studio Web or the UiPath Maestro VS Code extension. See [conversational-agent/impl.md](../author/plugins/conversational-agent/impl.md#debug--the-cli-hands-off) |
38
40
  | Read the cause out of a faulted `flow debug` response | [troubleshooting-guide.md — Step 0](troubleshooting-guide.md#step-0--read-the-cause-in-the-debug-output-you-already-have) |
39
41
  | Find the error message and faulting element | [troubleshooting-guide.md — Step 2 Fetch incidents](troubleshooting-guide.md#step-2--fetch-incidents) |
40
42
  | See data state at failure time | [troubleshooting-guide.md — Step 3 Fetch runtime variable state](troubleshooting-guide.md#step-3--fetch-runtime-variable-state) |
@@ -39,6 +39,7 @@ Capability index for the lifecycle of a flow as a deployed asset. Operate owns e
39
39
  | **Deploy a flow to Orchestrator** (only if explicitly requested) | [ship.md — Path 2](ship.md#path-2--orchestrator-deploy-explicit-only) + [/uipath:uipath-solution](/uipath:uipath-solution) |
40
40
  | **Sync solution resource declarations** | [ship.md — Pre-flight](ship.md#pre-flight) (the `uip solution resources refresh` step) |
41
41
  | **Debug a flow end-to-end** | [run.md — Debug](run.md#debug--controlled-end-to-end-run) |
42
+ | **Debug a chat flow** | `flow debug` cannot drive a conversation headlessly. On a flow starting with `core.trigger.conversation` it uploads, returns `Code: FlowDebugStudioWebHandoff` with `Data.studioWebUrl`, and starts no run. Chat from either Studio Web (open that URL; `--open-in-browser` does it for you) or the UiPath Maestro VS Code extension. `--timeout` does nothing here. See [author/plugins/conversational-agent/impl.md](../author/plugins/conversational-agent/impl.md#debug--the-cli-hands-off) |
42
43
  | **Pass input arguments to `flow debug`** | [run.md — Debug](run.md#debug--controlled-end-to-end-run) (the `--inputs` flag) |
43
44
  | **Bind local files to file-typed inputs** | [run.md — Debug](run.md#debug--controlled-end-to-end-run) and [run.md — Process run](run.md#process-run--trigger-a-deployed-process) (same `--attachment <variableId>=<localPath>` flag on both, repeatable; `--attachment` overrides `--inputs` on key collisions) |
44
45
  | **Trigger a deployed process** | [run.md — Process run](run.md#process-run--trigger-a-deployed-process) |
@@ -34,6 +34,8 @@ Static values do not need `=js:`. For mixed strings, use `=js:` with JavaScript
34
34
  | Loop nodes (`core.logic.loop`) | `inputs.collection` | **YES** |
35
35
  | Subflow nodes (`core.subflow`) | `inputs.<inputId>.source` | **YES** |
36
36
  | Script nodes (`core.action.script`) | `inputs.script` body | **NO**; the body is already JS and reads `$vars.*` directly |
37
+ | **Chat `conversationId`** (`uipath.conversational.*` nodes) | `inputs.conversationId` — a structured binding object to the trigger's only output, `$vars.<conversationTriggerId>.output.conversationId`. send-message also needs `exchangeId`, which is `conversationContext.latestExchangeId` on the wait node — there is no `output.exchangeId`. | **NO** — the expression sits unprefixed inside the object's `expression` field. See [conversational-agent/impl.md § Node JSON](../author/plugins/conversational-agent/impl.md#node-json). |
38
+ | **Chat `conversationalAgentSettings`** (`uipath.agent.conversational`, `uipath.core.agent.*` when conversational) | `inputs.conversationalAgentSettings` — five structured binding objects: `context` plus the `conversationId`, `exchangeId`, `messages` and `userSettings` derived from it. All five must be written when authoring from the CLI. | **NO** — the expression sits unprefixed inside each object's `expression` field. See [conversational-agent/impl.md § The `conversationalAgentSettings` Wiring Rule](../author/plugins/conversational-agent/impl.md#the-conversationalagentsettings-wiring-rule). |
37
39
  | **Voice `callContext`** (`uipath.agent.voice`, `uipath.conversational.voice.end-call`) | `inputs.callContext` — a structured binding object `{ "type": "jsExpression", "expression": "$vars.<originNodeId>.output.callContext", "fieldType": ... }`, never a bare string. `fieldType` is `"object"` on the voice agent and `"string"` on the end-call node. | **NO** — the expression sits unprefixed inside the object's `expression` field. See [author/plugins/inline-voice-agent/impl.md § The `callContext` wiring rule](../author/plugins/inline-voice-agent/impl.md#the-callcontext-wiring-rule). |
38
40
  | **Inline-agent prompt** (`uipath.agent.autonomous` / `uipath.agent.voice` `agent.json` `messages[].content`) | Tokens use the flattened delivery key, never the flow expression: `{{input.<flowNodeId>__output__<field>}}`. The key is delivered by the node's `inputs.agentInputVariables[]` binding (`=$vars.<flowNodeId>.output.<field>`) and declared in `inputSchema.properties`. Mirror in `contentTokens[]` as `{ "type": "variable", "rawString": "input.<flowNodeId>__output__<field>" }` — `rawString` is brace-free with no added spaces, and `uip agent refresh` regenerates it, so never hand-author it. **Never a raw `{{ $vars.… }}`** (nothing rewrites agent.json prompt text — the model receives it literally) and never a bare `{{name}}`. | **NO** — `{{ ... }}` tokens, not `=js:`. See [author/plugins/inline-agent/impl.md § Wiring Flow Variables into Agent Prompts](../author/plugins/inline-agent/impl.md#wiring-flow-variables-into-agent-prompts). Encoding note: a read `agent.json` may use the flat `__` input keys or a newer nested (dotted-key) form — author flat, read both (see the impl.md encoding note). |
39
41
 
@@ -81,4 +83,4 @@ When a flow outputs literal `vars.X.output.Y`, `nodes.X.output.Y`, or another un
81
83
  1. Open the `.flow` file.
82
84
  2. Search for the token: `grep '"vars\.' <project>.flow` or `grep '"\$vars\.' <project>.flow`.
83
85
  3. In `bodyParameters`, `queryParameters`, `pathParameters`, end-node `source`, and other value fields, prepend `=js:` to each variable reference.
84
- 4. Run `uip maestro flow validate` and re-debug.
86
+ 4. Run `uip maestro flow validate` and re-debug.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "skillsVersion": "1.202.0-preview.710",
3
+ "skillsVersion": "1.202.0-preview.716",
4
4
  "targetCli": "^1.202.0"
5
5
  }