mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-16 14:57:15 +00:00
feat(runner): unify plugin execution across agents and event processors
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
"""Policy helpers for classifying AgentRunner ledger error signals."""
|
||||
"""Policy helpers for classifying Runner ledger error signals."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -7,7 +7,7 @@ import re
|
||||
|
||||
|
||||
_INVALID_TOOL_ARGUMENT_PATTERN = re.compile(
|
||||
r"invalid json arguments|\b\d+\s+validation errors?\s+for\s+[A-Za-z_][A-Za-z0-9_]*Args\b",
|
||||
r'invalid json arguments|\b\d+\s+validation errors?\s+for\s+[A-Za-z_][A-Za-z0-9_]*Args\b',
|
||||
re.IGNORECASE,
|
||||
)
|
||||
|
||||
@@ -19,14 +19,14 @@ def load_ledger_json(value: str | None, *, field: str, failures: list[dict]) ->
|
||||
try:
|
||||
return json.loads(value)
|
||||
except (TypeError, ValueError) as exc:
|
||||
failures.append({"kind": "invalid_json", "field": field, "reason": str(exc)})
|
||||
failures.append({'kind': 'invalid_json', 'field': field, 'reason': str(exc)})
|
||||
return {}
|
||||
|
||||
|
||||
def invalid_tool_argument_error_signal(value: str) -> str:
|
||||
"""Return the persisted signal for malformed model-supplied tool arguments."""
|
||||
match = _INVALID_TOOL_ARGUMENT_PATTERN.search(value)
|
||||
return match.group(0) if match else ""
|
||||
return match.group(0) if match else ''
|
||||
|
||||
|
||||
def classify_invalid_tool_argument_errors(
|
||||
@@ -40,15 +40,14 @@ def classify_invalid_tool_argument_errors(
|
||||
warnings: list[dict] = []
|
||||
for event in events:
|
||||
recovered = run_completed and any(
|
||||
sequence > event["sequence"]
|
||||
for sequence in successful_tool_completion_sequences
|
||||
sequence > event['sequence'] for sequence in successful_tool_completion_sequences
|
||||
)
|
||||
if recovered:
|
||||
warnings.append(
|
||||
{
|
||||
"kind": "recovered_tool_argument_error",
|
||||
"event": event,
|
||||
"reason": "The model continued with a later successful tool call and the run completed.",
|
||||
'kind': 'recovered_tool_argument_error',
|
||||
'event': event,
|
||||
'reason': 'The model continued with a later successful tool call and the run completed.',
|
||||
}
|
||||
)
|
||||
else:
|
||||
@@ -64,15 +63,15 @@ def classify_tool_authorization(
|
||||
"""Classify tool names absent from the Host authorization snapshot."""
|
||||
if not calls:
|
||||
return [], []
|
||||
if authorization_mode == "runner-native":
|
||||
if authorization_mode == 'runner-native':
|
||||
return [], [
|
||||
{
|
||||
"kind": "runner_native_tool_calls",
|
||||
"calls": calls,
|
||||
"reason": (
|
||||
"External runner tool telemetry is not a LangBot Host tool call; "
|
||||
'kind': 'runner_native_tool_calls',
|
||||
'calls': calls,
|
||||
'reason': (
|
||||
'External runner tool telemetry is not a LangBot Host tool call; '
|
||||
"the runner's own permission system governs it."
|
||||
),
|
||||
}
|
||||
]
|
||||
return [{"kind": "unauthorized_tool_calls", "calls": calls}], []
|
||||
return [{'kind': 'unauthorized_tool_calls', 'calls': calls}], []
|
||||
|
||||
Reference in New Issue
Block a user