Skip to content

feat(agents): external NAT agents — Studio UI (stacked on #763)#764

Draft
marcusds wants to merge 2 commits into
register-external-agents-backend/mschwabfrom
register-external-agents-frontend/mschwab
Draft

feat(agents): external NAT agents — Studio UI (stacked on #763)#764
marcusds wants to merge 2 commits into
register-external-agents-backend/mschwabfrom
register-external-agents-frontend/mschwab

Conversation

@marcusds

Copy link
Copy Markdown
Contributor

Summary

Studio UI for external NAT agents (agents that run outside NeMo Platform, registered by URL).

⚠️ Stacked on #763 (backend). This PR is based on the backend branch and needs its Agent fields (source/endpoint/card), config-XOR-url create, and the refresh/reachability endpoints. Merge #763 first, then this retargets to main.

What's included

  • Register modal: Connect running agent by endpoint URL (structural validation).
  • Agents table: External badge; onboarding empty state + NAT docs link.
  • Agent panel:
    • Workflow tab — managed: config graph + YAML (credentials redacted); external: A2A card skills + endpoint.
    • Chat wired to the external chat bridge (streaming, multi-turn).
    • Details: Source/Endpoint, reachability badge + Refresh card button.
    • Deploy/Logs gated for external; Evaluate available (via the bridge).
    • Resolves the panel agent via GET /agents/{name} (not a page-1 list scan — external agents past page 1 were mis-rendered as managed).
  • Shared isExternalAgent predicate + ExternalAgentNotice.

Testing

Unit tests for the read models (summarizeAgentCard, summarizeAgentWorkflow) + credential redaction; agent suites green; typecheck (our files) + lint clean.

CI note

The web-typecheck job may fail on pre-existing intake/eval-session errors (Trace.input/output, @axe-core/playwright) authored on main — untouched by this branch; clears when main's typecheck is fixed.

🤖 Generated with Claude Code

marcusds added 2 commits July 17, 2026 11:25
- probe_agent_reachable streams and checks status only (no unbounded body read)
- external chat honors the card's capabilities.streaming: a streaming request to
  a non-streaming agent uses message/send wrapped in one SSE chunk
- streaming uses an incremental UTF-8 decoder so a multi-byte char split across
  network chunks isn't corrupted
- streaming primes the first delta so a failure before any token returns 502;
  a mid-stream failure is logged and ends without a normal "stop" finish
- the conversation prompt preserves system messages and anchors on the last user
  turn (drops trailing assistant)
- managed-agent proxy no longer double-fetches the Agent entity

Skipped (P2): full AgentCard schema validation — would require taking a2a-sdk as
a runtime dep; cards stay loosely validated (operator-trust) and incompatible
ones fail at invocation with a clear error.

Signed-off-by: mschwab <mschwab@nvidia.com>
Studio support for external agents (registered by URL). Depends on the backend
PR (#763): needs the source/endpoint/card Agent fields, config-XOR-url create,
and the refresh/reachability endpoints.

- Register modal: Connect running agent by endpoint URL (structural validation)
- Agents table: External badge; onboarding empty state + NAT docs link
- Agent panel:
  - Workflow tab — managed: config graph + YAML (credentials redacted);
    external: A2A card skills + endpoint
  - Chat playground wired to the external chat bridge (streaming, multi-turn)
  - Details: Source/Endpoint, reachability badge + Refresh card button
  - Deploy/Logs gated for external; Evaluate available (via bridge)
  - resolve the panel agent via GET /agents/{name} (not a page-1 list scan)
- shared isExternalAgent predicate + ExternalAgentNotice

Unit tests for read models + credential redaction; typecheck + lint clean.

Signed-off-by: mschwab <mschwab@nvidia.com>
@marcusds
marcusds force-pushed the register-external-agents-frontend/mschwab branch from 3112e34 to 95e1c7d Compare July 17, 2026 18:26
@marcusds
marcusds force-pushed the register-external-agents-backend/mschwab branch 2 times, most recently from 4915ed8 to e098344 Compare July 17, 2026 19:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant