mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-17 01:46:07 +00:00
feat(plugin): report deferred response delivery failures (#2287)
* feat(plugin): report deferred response delivery failures * style: fix ruff format issues in plugin_diagnostics and test_handler_actions --------- Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com>
This commit is contained in:
@@ -737,6 +737,8 @@ class PluginRuntimeConnector(ManagedRuntimeConnector):
|
||||
event_ctx = context.EventContext.from_event(event)
|
||||
|
||||
if not self.is_enable_plugin:
|
||||
event_ctx._emitted_plugins = []
|
||||
event_ctx._response_sources = []
|
||||
return event_ctx
|
||||
|
||||
# Pass include_plugins to runtime for filtering
|
||||
@@ -745,9 +747,21 @@ class PluginRuntimeConnector(ManagedRuntimeConnector):
|
||||
)
|
||||
|
||||
event_ctx = context.EventContext.model_validate(event_ctx_result['event_context'])
|
||||
event_ctx._emitted_plugins = event_ctx_result.get('emitted_plugins', [])
|
||||
if 'response_sources' in event_ctx_result:
|
||||
event_ctx._response_sources = event_ctx_result['response_sources']
|
||||
|
||||
return event_ctx
|
||||
|
||||
async def notify_plugin_diagnostic(self, diagnostic: dict[str, Any]) -> None:
|
||||
"""Best-effort diagnostic forwarding to the plugin runtime."""
|
||||
if not self.is_enable_plugin:
|
||||
return
|
||||
try:
|
||||
await self.handler.notify_plugin_diagnostic(diagnostic)
|
||||
except Exception as e:
|
||||
self.ap.logger.debug(f'Plugin diagnostic forwarding skipped: {e}')
|
||||
|
||||
async def list_tools(self, bound_plugins: list[str] | None = None) -> list[ComponentManifest]:
|
||||
if not self.is_enable_plugin:
|
||||
return []
|
||||
|
||||
@@ -26,6 +26,15 @@ from ..core import app
|
||||
from ..utils import constants
|
||||
|
||||
|
||||
class _RawAction:
|
||||
def __init__(self, value: str):
|
||||
self.value = value
|
||||
|
||||
|
||||
def _langbot_to_runtime_action(enum_name: str, fallback_value: str) -> Any:
|
||||
return getattr(LangBotToRuntimeAction, enum_name, _RawAction(fallback_value))
|
||||
|
||||
|
||||
def _make_rag_error_response(error: Exception, error_type: str, **extra_context) -> handler.ActionResponse:
|
||||
"""Create a clean error response for RAG operations.
|
||||
|
||||
@@ -923,6 +932,18 @@ class RuntimeConnectionHandler(handler.Handler):
|
||||
|
||||
return result
|
||||
|
||||
async def notify_plugin_diagnostic(self, diagnostic: dict[str, Any]) -> dict[str, Any]:
|
||||
"""Notify the plugin runtime about a best-effort plugin diagnostic.
|
||||
|
||||
This intentionally uses the raw protocol string instead of a SDK enum so
|
||||
LangBot can keep running with older langbot-plugin versions.
|
||||
"""
|
||||
return await self.call_action(
|
||||
_langbot_to_runtime_action('PLUGIN_DIAGNOSTIC', 'plugin_diagnostic'),
|
||||
diagnostic,
|
||||
timeout=5,
|
||||
)
|
||||
|
||||
async def list_tools(self, include_plugins: list[str] | None = None) -> list[dict[str, Any]]:
|
||||
"""List tools"""
|
||||
result = await self.call_action(
|
||||
|
||||
Reference in New Issue
Block a user