Fixed stdin buffer length in context
This commit is contained in:
@@ -50,7 +50,7 @@ class BaseAgent(ABC):
|
|||||||
"""
|
"""
|
||||||
memory_context = self._working_memory.generate_context()
|
memory_context = self._working_memory.generate_context()
|
||||||
context_size = len(memory_context) / 100
|
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:
|
for entry in memory_context:
|
||||||
context.append(entry)
|
context.append(entry)
|
||||||
return pretty_print_element(context)
|
return pretty_print_element(context)
|
||||||
@@ -7,8 +7,9 @@ from .command import Command
|
|||||||
from .delete_command import DeleteCommand
|
from .delete_command import DeleteCommand
|
||||||
from .stop_command import StopCommand
|
from .stop_command import StopCommand
|
||||||
|
|
||||||
from .entry import Entry
|
|
||||||
from .background_entry import BackgroundEntry
|
from .background_entry import BackgroundEntry
|
||||||
|
from .entry import Entry
|
||||||
|
from .io_buffer import IOBuffer
|
||||||
from .parse_error_entry import ParseErrorEntry
|
from .parse_error_entry import ParseErrorEntry
|
||||||
from .read_entry import ReadEntry
|
from .read_entry import ReadEntry
|
||||||
from .reasoning_entry import ReasoningEntry
|
from .reasoning_entry import ReasoningEntry
|
||||||
@@ -28,14 +29,24 @@ class ResponseParser:
|
|||||||
io_buffer: Buffer to use for IO operations
|
io_buffer: Buffer to use for IO operations
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, io_buffer):
|
def __init__(self, io_buffer: IOBuffer):
|
||||||
"""
|
"""
|
||||||
Initialize parser with IO buffer.
|
Initialize parser with IO buffer.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
io_buffer: Buffer to use for IO operations
|
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]:
|
def parse(self, xml: str) -> Union[Command, Entry]:
|
||||||
"""
|
"""
|
||||||
@@ -101,12 +112,12 @@ class ResponseParser:
|
|||||||
return ReasoningEntry(entry_id, timestamp, root.text)
|
return ReasoningEntry(entry_id, timestamp, root.text)
|
||||||
|
|
||||||
elif root.tag == 'read_stdin':
|
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':
|
elif root.tag == 'write_stdout':
|
||||||
if len(root) != 0 or root.attrib or root.text is None or root.text.strip() == '':
|
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 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:
|
else:
|
||||||
return ParseErrorEntry(entry_id, timestamp, xml, f"Unknown root element: {root.tag}")
|
return ParseErrorEntry(entry_id, timestamp, xml, f"Unknown root element: {root.tag}")
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class SystemMetrics:
|
|||||||
|
|
||||||
time.sleep(self._sample_interval)
|
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.
|
Generate XML context element with current system metrics.
|
||||||
Clears usage samples after generating averages.
|
Clears usage samples after generating averages.
|
||||||
@@ -112,7 +112,7 @@ class SystemMetrics:
|
|||||||
context.set("context_usage", str(round(context_usage * 100)))
|
context.set("context_usage", str(round(context_usage * 100)))
|
||||||
|
|
||||||
# Standard input buffer size
|
# Standard input buffer size
|
||||||
context.set("stdin", "0") # Set by agent
|
context.set("stdin", stdin_buffer_length)
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class BaseAgentTest(unittest.TestCase):
|
|||||||
self.parser = ResponseParser(self.io_buffer)
|
self.parser = ResponseParser(self.io_buffer)
|
||||||
|
|
||||||
# Mock metrics context generator
|
# Mock metrics context generator
|
||||||
def generate_context(context_size):
|
def generate_context(context_size, stdin_buffer_length):
|
||||||
metrics_elem = ET.Element("context")
|
metrics_elem = ET.Element("context")
|
||||||
metrics_elem.set("time", "2024-10-31T12:00:00Z")
|
metrics_elem.set("time", "2024-10-31T12:00:00Z")
|
||||||
metrics_elem.set("cpu", "10")
|
metrics_elem.set("cpu", "10")
|
||||||
@@ -76,7 +76,7 @@ class BaseAgentTest(unittest.TestCase):
|
|||||||
metrics_elem.set("disk_used", "5000")
|
metrics_elem.set("disk_used", "5000")
|
||||||
metrics_elem.set("disk_total", "10000")
|
metrics_elem.set("disk_total", "10000")
|
||||||
metrics_elem.set("context", str(int(context_size * 100)))
|
metrics_elem.set("context", str(int(context_size * 100)))
|
||||||
metrics_elem.set("stdin", "0")
|
metrics_elem.set("stdin", stdin_buffer_length)
|
||||||
return metrics_elem
|
return metrics_elem
|
||||||
|
|
||||||
self.mock_metrics.generate_context.side_effect = generate_context
|
self.mock_metrics.generate_context.side_effect = generate_context
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ class SystemMetricsTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_initial_context(self):
|
def test_initial_context(self):
|
||||||
"""Test initial context generation"""
|
"""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
|
# Verify it's an XML element
|
||||||
self.assertIsInstance(context, ET.Element)
|
self.assertIsInstance(context, ET.Element)
|
||||||
@@ -125,13 +125,13 @@ class SystemMetricsTest(unittest.TestCase):
|
|||||||
])
|
])
|
||||||
|
|
||||||
# Validate stdin buffer size
|
# Validate stdin buffer size
|
||||||
self.assertEqual(context.get("stdin"), "0")
|
self.assertEqual(context.get("stdin"), 10)
|
||||||
|
|
||||||
def test_multiple_context_generations(self):
|
def test_multiple_context_generations(self):
|
||||||
"""Test multiple context generations have different timestamps"""
|
"""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)
|
time.sleep(1)
|
||||||
context2 = self.metrics.generate_context(0.5)
|
context2 = self.metrics.generate_context(0.5, 10)
|
||||||
|
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
context1.get("time"),
|
context1.get("time"),
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class WebAgentTest(unittest.TestCase):
|
|||||||
self.parser = ResponseParser(self.io_buffer)
|
self.parser = ResponseParser(self.io_buffer)
|
||||||
|
|
||||||
# Mock metrics context generator
|
# Mock metrics context generator
|
||||||
def generate_context(context_size):
|
def generate_context(context_size, stdin_buffer_length):
|
||||||
metrics_elem = ET.Element("context")
|
metrics_elem = ET.Element("context")
|
||||||
metrics_elem.set("time", "2024-10-31T12:00:00Z")
|
metrics_elem.set("time", "2024-10-31T12:00:00Z")
|
||||||
metrics_elem.set("cpu", "10")
|
metrics_elem.set("cpu", "10")
|
||||||
@@ -56,7 +56,7 @@ class WebAgentTest(unittest.TestCase):
|
|||||||
metrics_elem.set("disk_used", "5000")
|
metrics_elem.set("disk_used", "5000")
|
||||||
metrics_elem.set("disk_total", "10000")
|
metrics_elem.set("disk_total", "10000")
|
||||||
metrics_elem.set("context", str(int(context_size * 100)))
|
metrics_elem.set("context", str(int(context_size * 100)))
|
||||||
metrics_elem.set("stdin", "0")
|
metrics_elem.set("stdin", stdin_buffer_length)
|
||||||
return metrics_elem
|
return metrics_elem
|
||||||
|
|
||||||
self.mock_metrics.generate_context.side_effect = generate_context
|
self.mock_metrics.generate_context.side_effect = generate_context
|
||||||
|
|||||||
Reference in New Issue
Block a user