fix(cloud): start API before runtime reconcile

This commit is contained in:
dadachann
2026-08-19 17:13:06 +00:00
parent 693c59b726
commit f36542135a
3 changed files with 32 additions and 9 deletions
+17 -2
View File
@@ -301,6 +301,22 @@ class Application:
async def initialize(self):
pass
async def _initialize_plugin_runtime(self) -> None:
try:
await self.plugin_connector.initialize()
except asyncio.CancelledError:
raise
except Exception as exc:
self.logger.warning(f'Plugin runtime unavailable during startup; reconnecting in background: {exc}')
self.plugin_connector.schedule_reconnect()
def _start_plugin_runtime_initialization(self):
return self.task_mgr.create_task(
self._initialize_plugin_runtime(),
name='plugin-runtime-initialization',
scopes=[core_entities.LifecycleControlScope.APPLICATION],
)
async def run(self):
self.event_loop_monitor.start()
try:
@@ -322,8 +338,6 @@ class Application:
name='cloud-manifest-refresh',
scopes=[core_entities.LifecycleControlScope.APPLICATION],
)
await self.plugin_connector.initialize_plugins()
# 后续可能会允许动态重启其他任务
# 故为了防止程序在非 Ctrl-C 情况下退出,这里创建一个不会结束的协程
async def never_ending():
@@ -348,6 +362,7 @@ class Application:
name='http-api-controller',
scopes=[core_entities.LifecycleControlScope.APPLICATION],
)
self._start_plugin_runtime_initialization()
# Telemetry instance heartbeat (startup + daily); respects
# space.disable_telemetry via TelemetryManager.send().
-7
View File
@@ -303,13 +303,6 @@ class BuildAppStage(stage.BootingStage):
)
plugin_connector_inst = plugin_connector.PluginRuntimeConnector(ap, runtime_disconnect_callback)
try:
await plugin_connector_inst.initialize()
except Exception as exc:
# Keep the API/UI available while an external or managed runtime is
# starting, then recover in the background with bounded backoff.
ap.logger.warning(f'Plugin runtime unavailable during startup; reconnecting in background: {exc}')
plugin_connector_inst.schedule_reconnect()
ap.plugin_connector = plugin_connector_inst
workspace_service_inst.release_startup_execution_bindings()
@@ -144,3 +144,18 @@ async def test_runtime_resource_stats_are_aggregate_and_constant_time() -> None:
assert stats['models']['providers'] == 1
assert stats['runtimes']['plugin_installations'] == 1
assert stats['runtimes']['plugin_runtime_connected'] is True
@pytest.mark.asyncio
async def test_start_plugin_runtime_initialization_is_scheduled() -> None:
app = Application()
app.plugin_connector = SimpleNamespace(initialize=AsyncMock())
captured = {}
app.task_mgr = SimpleNamespace(create_task=lambda coro, **kwargs: captured.update(coro=coro, kwargs=kwargs))
app._start_plugin_runtime_initialization()
assert captured['kwargs']['name'] == 'plugin-runtime-initialization'
assert captured['kwargs']['scopes']
await captured['coro']
app.plugin_connector.initialize.assert_awaited_once_with()