feat: add new require approvals tool rule (#4280)

* feat: add new require approvals tool rule

* add fe changes

* openapi sync 2
This commit is contained in:
cthomas
2025-08-28 13:34:00 -07:00
committed by GitHub
parent 2791be982a
commit 9e43b8e015
3 changed files with 17 additions and 0 deletions

View File

@@ -39,6 +39,7 @@ from letta.schemas.tool_rule import (
MaxCountPerStepToolRule,
ParentToolRule,
RequiredBeforeExitToolRule,
RequiresApprovalToolRule,
TerminalToolRule,
ToolRule,
)
@@ -139,6 +140,8 @@ def deserialize_tool_rule(
return ParentToolRule(**data)
elif rule_type == ToolRuleType.required_before_exit:
return RequiredBeforeExitToolRule(**data)
elif rule_type == ToolRuleType.requires_approval:
return RequiresApprovalToolRule(**data)
raise ValueError(f"Unknown ToolRule type: {rule_type}")

View File

@@ -94,6 +94,7 @@ class ToolRuleType(str, Enum):
max_count_per_step = "max_count_per_step"
parent_last_tool = "parent_last_tool"
required_before_exit = "required_before_exit" # tool must be called before loop can exit
requires_approval = "requires_approval"
class FileProcessingStatus(str, Enum):

View File

@@ -272,6 +272,18 @@ class MaxCountPerStepToolRule(BaseToolRule):
return available_tools
class RequiresApprovalToolRule(BaseToolRule):
"""
Represents a tool rule configuration which requires approval before the tool can be invoked.
"""
type: Literal[ToolRuleType.requires_approval] = ToolRuleType.requires_approval
def get_valid_tools(self, tool_call_history: List[str], available_tools: Set[str], last_function_response: Optional[str]) -> Set[str]:
"""Does not enforce any restrictions on which tools are valid"""
return available_tools
ToolRule = Annotated[
Union[
ChildToolRule,
@@ -282,6 +294,7 @@ ToolRule = Annotated[
RequiredBeforeExitToolRule,
MaxCountPerStepToolRule,
ParentToolRule,
RequiresApprovalToolRule,
],
Field(discriminator="type"),
]