Repository navigation
feat(agent): [2/5] conversational agent tool config [PRODEV-1742] - #1931
Conversation
b998470 to
70aff17
Compare
Epixa-Dogfood ReviewReview unavailable: Not reviewed: Not read: 4 files that could not be fetched. What this PR doesThe pull request author describes the intended change as follows: feat(agent): [2/5] conversational agent tool config [PRODEV-1742] This review did not reuse a local review of this change. Set up Epixa local review. Full review: 69fd8e5 |
- Add AgentToolType.CONVERSATIONAL_AGENT ("ConversationalAgent") and the
"conversationalagent" TOOL_MAP entry, so any casing normalizes. A tool type
rather than an `a2a` variant: older runtimes skip just the unknown tool
instead of rejecting the whole agent.
- Add AgentConversationalAgentToolResourceConfig and its properties class
(processName optional so a bad record still loads; folderPath and
cachedAgentCard optional), as a separate class so langchain's tool_factory
cannot route it to the job-start path. Added to the ToolResourceConfig union.
- Tests: mixed agent.json parsing, alias round trip, case variants, optional
and missing properties, the cross-repo contract fixture, unknown type still
maps to Unknown.
- Bump uipath to 2.14.37 (pyproject and uv.lock).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
70aff17 to
69fd8e5
Compare
🚨 Heads up:
|
|
🚨 Heads up:
|



PR stack (PRODEV-1742), merge in this order
conversationalAgenttool type, plus itsprocessbinding in the packager. Wait for the@uipath/agents-storage-schemas1.44.0 and@uipath/tool-agent2.2.0 (packager) releases.AgentToolType.CONVERSATIONAL_AGENTandAgentConversationalAgentToolResourceConfig. Wait for the uipath 2.14.37 PyPI release. ← this PRa2a/{folderKey}/{releaseId}over A2A. Runuv lockfirst, then wait for the uipath-langchain 0.18.34 release.conversationalAgenttools (never a job tool), bump dependencies. Runuv lockfirst, then deploy the runtime.conversationalAgenttool resource. Can merge any time after [1/5] is released, with the flag off. First bump@uipath/agents-storage-schemasto^1.44.0and@uipath/tool-agentto^2.2.0(older packagers emit noprocessbinding for this tool), and set the flag default back tofalse.Turn on the Flow flag
canvas.nodes.agent-tool-conversational-a2aonly after [4/5] is deployed.Adds a
conversationalAgenttool type so an agent can call an existing UiPath conversational agent.Why a tool type, not an
a2avariantAn
a2aresource without aslugmakes older runtimes reject the whole agent (AgentA2aResourceConfigrequiresslug, and_normalize_resourceskeepsa2a). An unknown tooltypegoes throughTOOL_MAP.get(t.lower(), "Unknown"), so older runtimes skip just that tool. A tool type also gets the solutionprocess.<processName>binding from the packager, so@resource_override(process, process_name)takes effect. Precedent:AgentToolType.FLOW/FUNCTION.Design
AgentToolType.CONVERSATIONAL_AGENT = "ConversationalAgent"and theTOOL_MAPentry"conversationalagent", so any casing normalizes.AgentConversationalAgentToolResourceConfig(BaseAgentToolResourceConfig)withtype: Literal[CONVERSATIONAL_AGENT],properties: AgentConversationalAgentToolProperties(processNameoptional so a record without it still loads and the runtime reports it at call time,folderPathandcachedAgentCardoptional, plus the baseexampleCalls/requireConversationalConfirmation),outputSchema,settingsandargumentProperties(defaults to{}).locationandguardrailare extras, as for other tools. The storage schema (UiPath/Agents#6529) defines this tool as a standalone object with noargumentProperties,entryPointPathor job-retry settings, so the contract fixture omits them; the model needs no change for that (extra="allow"tolerates a leftover key andargumentPropertiesdefaults to{}). It is a separate class, not another literal onAgentProcessToolResourceConfig.type, so langchain'stool_factorycannot route it to the job-start path.ToolResourceConfigunion nested ontype. Thea2acode is back tomain.Tests
Mixed agent.json (agent tool, remote a2a, conversational agent tool) parses into the right classes; by-alias round trip keeps
type; case variants normalize; optional properties may be missing or null; missingprocessNamestill loads the agent; the cross-repo contract fixture (exactly the storage schema's shape, so noargumentProperties) parses with every field preserved; an unknown tool type still goes to Unknown.Packager parity
No
cli_pack.pychange is needed.generate_bindings_content()returns an emptyBindings, andcli_packonly copies a pre-writtenbindings.json; nothing in uipath-python derives bindings fromagent.jsontool resources, so there is noagent/flow/functionbinding handling to mirror. Theprocess.<processName>binding comes from the TypeScript packager (and, for the C#/bindingspath, the C# generator) in UiPath/Agents#6529, which carries the parity explanation.Version bumped to 2.14.37 in
packages/uipath(pyproject and uv.lock).🤖 Generated with Claude Code