Skip to content

Commit

Permalink
Fix modifying config structure
Browse files Browse the repository at this point in the history
  • Loading branch information
collindutter committed Jul 22, 2024
1 parent faa3c5a commit 42ea678
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 12 deletions.
29 changes: 19 additions & 10 deletions griptape/config/base_structure_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,8 @@ class BaseStructureConfig(BaseConfig, ABC):
text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True})
audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True})

_structure: Optional[Structure] = field(default=None, kw_only=True, alias="structure")

@property
def structure(self) -> Optional[Structure]:
return self._structure
_structure: Structure = field(default=None, kw_only=True, alias="structure")
_event_listener: Optional[EventListener] = field(default=None, kw_only=True, alias="event_listener")

@property
def drivers(self) -> list:
Expand All @@ -58,14 +55,26 @@ def drivers(self) -> list:
self.audio_transcription_driver,
]

@property
def structure(self) -> Optional[Structure]:
return self._structure

@structure.setter
def structure(self, structure: Structure) -> None:
self._structure = structure
if structure != self.structure:
event_publisher_drivers = [
driver for driver in self.drivers if driver is not None and isinstance(driver, EventPublisherMixin)
]

event_listener = EventListener(self.structure.publish_event)
for driver in self.drivers:
if driver is not None and isinstance(driver, EventPublisherMixin):
driver.add_event_listener(event_listener)
for driver in event_publisher_drivers:
if self._event_listener is not None:
driver.remove_event_listener(self._event_listener)

self._event_listener = EventListener(structure.publish_event)
for driver in event_publisher_drivers:
driver.add_event_listener(self._event_listener)

self._structure = structure

def merge_config(self, config: dict) -> BaseStructureConfig:
base_config = self.to_dict()
Expand Down
2 changes: 0 additions & 2 deletions griptape/mixins/event_publisher_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ def add_event_listener(self, event_listener: EventListener) -> EventListener:
def remove_event_listener(self, event_listener: EventListener) -> None:
if event_listener in self.event_listeners:
self.event_listeners.remove(event_listener)
else:
raise ValueError("Event Listener not found.")

def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None:
for event_listener in self.event_listeners:
Expand Down
35 changes: 35 additions & 0 deletions tests/unit/config/test_structure_config.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import pytest

from griptape.config import StructureConfig
from griptape.structures import Agent


class TestStructureConfig:
Expand Down Expand Up @@ -60,3 +61,37 @@ def test_dot_update(self, config):
config.prompt_driver.max_tokens = 10

assert config.prompt_driver.max_tokens == 10

def test_drivers(self, config):
assert config.drivers == [
config.prompt_driver,
config.image_generation_driver,
config.image_query_driver,
config.embedding_driver,
config.vector_store_driver,
config.conversation_memory_driver,
config.text_to_speech_driver,
config.audio_transcription_driver,
]

def test_structure(self, config):
structure_1 = Agent(
config=config,
)

assert config.structure == structure_1
assert config._event_listener is not None
for driver in config.drivers:
if driver is not None:
assert config._event_listener in driver.event_listeners
assert len(driver.event_listeners) == 1

structure_2 = Agent(
config=config,
)
assert config.structure == structure_2
assert config._event_listener is not None
for driver in config.drivers:
if driver is not None:
assert config._event_listener in driver.event_listeners
assert len(driver.event_listeners) == 1

0 comments on commit 42ea678

Please sign in to comment.