Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Event.parents property to track event provenance #6

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions openhands/events/event.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
from typing import List

from openhands.events.tool import ToolCallMetadata
from openhands.llm.metrics import Metrics


@dataclass
class ParentEvent:
id: int
method: str


class EventSource(str, Enum):
AGENT = 'agent'
USER = 'user'
Expand Down Expand Up @@ -107,3 +114,13 @@ def tool_call_metadata(self) -> ToolCallMetadata | None:
@tool_call_metadata.setter
def tool_call_metadata(self, value: ToolCallMetadata) -> None:
self._tool_call_metadata = value

@property
def parents(self) -> List[ParentEvent] | None:
if hasattr(self, '_parents'):
return self._parents # type: ignore[attr-defined]
return None

@parents.setter
def parents(self, value: List[ParentEvent]) -> None:
self._parents = value
39 changes: 39 additions & 0 deletions tests/unit/test_event_parents.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest

from openhands.events.event import Event, ParentEvent


def test_event_parents_property():
# Test initial state
event = Event()
assert event.parents is None

# Test setting and getting parents
parent_events = [
ParentEvent(id=1, method="process_a"),
ParentEvent(id=2, method="process_b")
]
event.parents = parent_events

# Verify parents are set correctly
assert event.parents is not None
assert len(event.parents) == 2
assert event.parents[0].id == 1
assert event.parents[0].method == "process_a"
assert event.parents[1].id == 2
assert event.parents[1].method == "process_b"


def test_parent_event_dataclass():
# Test ParentEvent creation
parent = ParentEvent(id=1, method="test_method")
assert parent.id == 1
assert parent.method == "test_method"

# Test equality
parent2 = ParentEvent(id=1, method="test_method")
assert parent == parent2

# Test different values
parent3 = ParentEvent(id=2, method="other_method")
assert parent != parent3
Loading