mirror of
https://github.com/OpenHands/OpenHands.git
synced 2026-03-22 13:47:19 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: tobitege <10787084+tobitege@users.noreply.github.com> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com> Co-authored-by: tofarr <tofarr@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
from dataclasses import dataclass, fields, replace
|
|
|
|
|
|
@dataclass(kw_only=True, frozen=True)
|
|
class ToolResult:
|
|
"""Represents the result of a tool execution."""
|
|
|
|
output: str | None = None
|
|
error: str | None = None
|
|
base64_image: str | None = None
|
|
system: str | None = None
|
|
|
|
def __bool__(self):
|
|
return any(getattr(self, field.name) for field in fields(self))
|
|
|
|
def __add__(self, other: 'ToolResult'):
|
|
def combine_fields(
|
|
field: str | None, other_field: str | None, concatenate: bool = True
|
|
):
|
|
if field and other_field:
|
|
if concatenate:
|
|
return field + other_field
|
|
raise ValueError('Cannot combine tool results')
|
|
return field or other_field
|
|
|
|
return ToolResult(
|
|
output=combine_fields(self.output, other.output),
|
|
error=combine_fields(self.error, other.error),
|
|
base64_image=combine_fields(self.base64_image, other.base64_image, False),
|
|
system=combine_fields(self.system, other.system),
|
|
)
|
|
|
|
def replace(self, **kwargs):
|
|
"""Returns a new ToolResult with the given fields replaced."""
|
|
return replace(self, **kwargs)
|
|
|
|
|
|
class CLIResult(ToolResult):
|
|
"""A ToolResult that can be rendered as a CLI output."""
|
|
|
|
|
|
class ToolFailure(ToolResult):
|
|
"""A ToolResult that represents a failure."""
|
|
|
|
|
|
class ToolError(Exception):
|
|
"""Raised when a tool encounters an error."""
|
|
|
|
def __init__(self, message):
|
|
self.message = message
|