diff --git a/sia/base_agent.py b/sia/base_agent.py index bee39eb..f50e371 100644 --- a/sia/base_agent.py +++ b/sia/base_agent.py @@ -50,7 +50,7 @@ class BaseAgent(ABC): """ memory_context = self._working_memory.generate_context() context_size = len(memory_context) / 100 - context = self._metrics.generate_context(context_size) + context = self._metrics.generate_context(context_size, self._parser.io_buffer.buffer_length()) for entry in memory_context: context.append(entry) return pretty_print_element(context) \ No newline at end of file diff --git a/sia/response_parser.py b/sia/response_parser.py index eeb9406..93660bf 100644 --- a/sia/response_parser.py +++ b/sia/response_parser.py @@ -7,8 +7,9 @@ from .command import Command from .delete_command import DeleteCommand from .stop_command import StopCommand -from .entry import Entry from .background_entry import BackgroundEntry +from .entry import Entry +from .io_buffer import IOBuffer from .parse_error_entry import ParseErrorEntry from .read_entry import ReadEntry from .reasoning_entry import ReasoningEntry @@ -28,14 +29,24 @@ class ResponseParser: io_buffer: Buffer to use for IO operations """ - def __init__(self, io_buffer): + def __init__(self, io_buffer: IOBuffer): """ Initialize parser with IO buffer. Args: io_buffer: Buffer to use for IO operations """ - self.io_buffer = io_buffer + self._io_buffer = io_buffer + + @property + def io_buffer(self) -> IOBuffer: + """ + Get the IO buffer used by the parser. + + Returns: + IOBuffer: Buffer used for IO operations + """ + return self._io_buffer def parse(self, xml: str) -> Union[Command, Entry]: """ @@ -101,12 +112,12 @@ class ResponseParser: return ReasoningEntry(entry_id, timestamp, root.text) elif root.tag == 'read_stdin': - return ReadEntry(entry_id, timestamp, self.io_buffer) + return ReadEntry(entry_id, timestamp, self._io_buffer) elif root.tag == 'write_stdout': if len(root) != 0 or root.attrib or root.text is None or root.text.strip() == '': return ParseErrorEntry(entry_id, timestamp, xml, "Write stdout entry requires (only) text content") - return WriteEntry(entry_id, timestamp, root.text, self.io_buffer) + return WriteEntry(entry_id, timestamp, root.text, self._io_buffer) else: return ParseErrorEntry(entry_id, timestamp, xml, f"Unknown root element: {root.tag}") diff --git a/sia/system_metrics.py b/sia/system_metrics.py index f0881ae..c4210cb 100644 --- a/sia/system_metrics.py +++ b/sia/system_metrics.py @@ -69,7 +69,7 @@ class SystemMetrics: time.sleep(self._sample_interval) - def generate_context(self, context_usage: float) -> ET.Element: + def generate_context(self, context_usage: float, stdin_buffer_length: int) -> ET.Element: """ Generate XML context element with current system metrics. Clears usage samples after generating averages. @@ -112,7 +112,7 @@ class SystemMetrics: context.set("context_usage", str(round(context_usage * 100))) # Standard input buffer size - context.set("stdin", "0") # Set by agent + context.set("stdin", stdin_buffer_length) return context diff --git a/test/base_agent_test.py b/test/base_agent_test.py index 3d4c70d..17ac4c8 100644 --- a/test/base_agent_test.py +++ b/test/base_agent_test.py @@ -66,7 +66,7 @@ class BaseAgentTest(unittest.TestCase): self.parser = ResponseParser(self.io_buffer) # Mock metrics context generator - def generate_context(context_size): + def generate_context(context_size, stdin_buffer_length): metrics_elem = ET.Element("context") metrics_elem.set("time", "2024-10-31T12:00:00Z") metrics_elem.set("cpu", "10") @@ -76,7 +76,7 @@ class BaseAgentTest(unittest.TestCase): metrics_elem.set("disk_used", "5000") metrics_elem.set("disk_total", "10000") metrics_elem.set("context", str(int(context_size * 100))) - metrics_elem.set("stdin", "0") + metrics_elem.set("stdin", stdin_buffer_length) return metrics_elem self.mock_metrics.generate_context.side_effect = generate_context diff --git a/test/system_metrics_test.py b/test/system_metrics_test.py index 08a12d9..2fe6328 100644 --- a/test/system_metrics_test.py +++ b/test/system_metrics_test.py @@ -96,7 +96,7 @@ class SystemMetricsTest(unittest.TestCase): def test_initial_context(self): """Test initial context generation""" - context = self.metrics.generate_context(0.5) + context = self.metrics.generate_context(0.5, 10) # Verify it's an XML element self.assertIsInstance(context, ET.Element) @@ -125,13 +125,13 @@ class SystemMetricsTest(unittest.TestCase): ]) # Validate stdin buffer size - self.assertEqual(context.get("stdin"), "0") + self.assertEqual(context.get("stdin"), 10) def test_multiple_context_generations(self): """Test multiple context generations have different timestamps""" - context1 = self.metrics.generate_context(0.5) + context1 = self.metrics.generate_context(0.5, 10) time.sleep(1) - context2 = self.metrics.generate_context(0.5) + context2 = self.metrics.generate_context(0.5, 10) self.assertNotEqual( context1.get("time"), diff --git a/test/web_agent_test.py b/test/web_agent_test.py index 7d2e14a..d92dfb1 100644 --- a/test/web_agent_test.py +++ b/test/web_agent_test.py @@ -46,7 +46,7 @@ class WebAgentTest(unittest.TestCase): self.parser = ResponseParser(self.io_buffer) # Mock metrics context generator - def generate_context(context_size): + def generate_context(context_size, stdin_buffer_length): metrics_elem = ET.Element("context") metrics_elem.set("time", "2024-10-31T12:00:00Z") metrics_elem.set("cpu", "10") @@ -56,7 +56,7 @@ class WebAgentTest(unittest.TestCase): metrics_elem.set("disk_used", "5000") metrics_elem.set("disk_total", "10000") metrics_elem.set("context", str(int(context_size * 100))) - metrics_elem.set("stdin", "0") + metrics_elem.set("stdin", stdin_buffer_length) return metrics_elem self.mock_metrics.generate_context.side_effect = generate_context