Skip to content

Commit 76e0398

Browse files
committed
fix(multitenant): register CapabilityServiceFactory in the backend
ExecutorService declares a hard dependency on CAPABILITY_SERVICE, but the langflow backend's register_all_service_factories() registered ExecutorServiceFactory without CapabilityServiceFactory. The service manager could not resolve the dependency when building ExecutorService, so every flow run failed with NoFactoryRegisteredError / "ExecutorService is not available". lfx's own bootstrap (get_factories) auto-discovers the capability factory, so lfx run/serve were unaffected; only the backend's hand-maintained factory list had drifted. Add a regression test asserting the backend registers a factory for every ExecutorService dependency.
1 parent 32528e5 commit 76e0398

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

src/backend/base/langflow/services/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ def register_all_service_factories() -> None:
487487
from lfx.services.schema import ServiceType
488488

489489
service_manager = get_service_manager()
490+
from lfx.services.capability import factory as capability_factory
490491
from lfx.services.executor import factory as executor_factory
491492
from lfx.services.mcp_composer import factory as mcp_composer_factory
492493
from lfx.services.settings import factory as settings_factory
@@ -543,6 +544,9 @@ def register_all_service_factories() -> None:
543544
)
544545
service_manager.register_factory(authorization_factory.AuthorizationServiceFactory())
545546
service_manager.register_factory(mcp_composer_factory.MCPComposerServiceFactory())
547+
# ExecutorService depends on CAPABILITY_SERVICE, so its factory must be
548+
# registered too or the manager can't resolve the dependency.
549+
service_manager.register_factory(capability_factory.CapabilityServiceFactory())
546550
service_manager.register_factory(executor_factory.ExecutorServiceFactory())
547551
service_manager.set_factory_registered()
548552

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""Regression test for the executor/capability service-factory wiring.
2+
3+
``ExecutorService`` declares a hard dependency on ``CAPABILITY_SERVICE``. The
4+
langflow backend must register ``CapabilityServiceFactory`` alongside
5+
``ExecutorServiceFactory`` or the service manager cannot resolve the dependency
6+
when it builds ``ExecutorService`` -- which made every flow run 500 with
7+
``NoFactoryRegisteredError`` / "ExecutorService is not available".
8+
"""
9+
10+
from __future__ import annotations
11+
12+
from langflow.services.utils import register_all_service_factories
13+
from lfx.services.manager import get_service_manager
14+
from lfx.services.schema import ServiceType
15+
16+
17+
def test_executor_dependency_factories_are_registered():
18+
register_all_service_factories()
19+
service_manager = get_service_manager()
20+
21+
executor_factory = service_manager.factories.get(ServiceType.EXECUTOR_SERVICE.value)
22+
assert executor_factory is not None, "ExecutorServiceFactory is not registered"
23+
24+
for dependency in executor_factory.dependencies:
25+
assert dependency.value in service_manager.factories, (
26+
f"ExecutorService depends on {dependency.value}, but no factory is registered for it; "
27+
f"the service manager cannot build ExecutorService."
28+
)
29+
30+
# The specific dependency that regressed.
31+
assert ServiceType.CAPABILITY_SERVICE.value in service_manager.factories

0 commit comments

Comments
 (0)