diff --git a/web/app/components/workflow/nodes/_base/components/__tests__/agent-strategy-selector.spec.tsx b/web/app/components/workflow/nodes/_base/components/__tests__/agent-strategy-selector.spec.tsx
index 89b3078a55f..3aefde257d2 100644
--- a/web/app/components/workflow/nodes/_base/components/__tests__/agent-strategy-selector.spec.tsx
+++ b/web/app/components/workflow/nodes/_base/components/__tests__/agent-strategy-selector.spec.tsx
@@ -207,6 +207,28 @@ it('keeps marketplace search and its category link alongside the installed catal
expect(screen.getByText('Marketplace strategy')).toBeInTheDocument()
})
+it('shows installed strategies once and keeps other marketplace results available', async () => {
+ const user = userEvent.setup()
+ const provider = createProvider()
+ marketplaceResults.mockReturnValue([
+ createPlugin({ plugin_id: provider.plugin_id, label: { en_US: 'Installed Marketplace' } }),
+ createPlugin({ plugin_id: 'org/available', label: { en_US: 'Available Marketplace' } }),
+ ])
+ request.mockImplementation(() => Promise.resolve(Response.json([provider])))
+ render(
, {
+ systemFeatures: { enable_marketplace: true },
+ })
+
+ await user.click(screen.getByText('workflowAgent.nodes.agent.strategy.selectTip'))
+ expect(await screen.findByRole('button', { name: 'Agent provider' })).toBeInTheDocument()
+ await user.type(
+ screen.getByPlaceholderText('workflowAgent.nodes.agent.strategy.searchPlaceholder'),
+ 'agent',
+ )
+ expect(screen.queryByText('Installed Marketplace')).not.toBeInTheDocument()
+ expect(await screen.findByText('Available Marketplace')).toBeInTheDocument()
+})
+
it('preserves an older saved selection with no plugin identifier until the user chooses a replacement', async () => {
const user = userEvent.setup()
const onChange = vi.fn()
diff --git a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
index 6949402e6c8..61edce260e3 100644
--- a/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
+++ b/web/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
@@ -116,8 +116,12 @@ export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) =>
const wrapElemRef = useRef
(null)
- const { queryPluginsWithDebounced: fetchPlugins, plugins: notInstalledPlugins = [] } =
+ const { queryPluginsWithDebounced: fetchPlugins, plugins: marketplacePlugins = [] } =
useMarketplacePlugins()
+ const notInstalledPlugins = useMemo(() => {
+ const installedPluginIds = new Set((providers.data ?? []).map((provider) => provider.plugin_id))
+ return marketplacePlugins.filter((plugin) => !installedPluginIds.has(plugin.plugin_id))
+ }, [marketplacePlugins, providers.data])
useEffect(() => {
if (!enable_marketplace) return