New web interface, move llm engine to separate process

This commit is contained in:
2025-05-20 09:43:17 +02:00
parent 895a533e01
commit d4a4902b94
137 changed files with 4850 additions and 3503 deletions

View File

@@ -4,14 +4,14 @@ from threading import Event
import time
from sia.auto_approver import AutoApprover
from sia.web_agent import WebAgent, LlmState
from sia.web_agent import WebAgent, AgentState
class AutoApproverTest(unittest.TestCase):
def setUp(self):
"""Create mock agent and approver for each test"""
self.mock_agent = Mock(spec=WebAgent)
# Set up llms attribute as a dictionary
self.mock_agent.llms = {"default": LlmState.IDLE}
self.mock_agent.llms = {"default": AgentState.IDLE}
self.approver = AutoApprover(self.mock_agent)
def test_timeout_setters(self):
@@ -30,7 +30,7 @@ class AutoApproverTest(unittest.TestCase):
def test_enable_starts_thread_in_correct_state(self):
"""Test enabling only starts thread in matching state"""
# Mock the agent's llm state
self.mock_agent.llms["default"] = LlmState.IDLE
self.mock_agent.llms["default"] = AgentState.IDLE
self.approver.context_enabled = True
time.sleep(0.1) # Allow thread to start
self.assertIsNotNone(self.approver._context_thread)
@@ -40,7 +40,7 @@ class AutoApproverTest(unittest.TestCase):
def test_state_change_stops_threads(self):
"""Test state changes stop irrelevant threads"""
# Start in idle state with context thread
self.mock_agent.llms["default"] = LlmState.IDLE
self.mock_agent.llms["default"] = AgentState.IDLE
# Mock _stop_context_thread to verify it's called
with patch.object(self.approver, '_stop_context_thread') as mock_stop:
@@ -48,31 +48,31 @@ class AutoApproverTest(unittest.TestCase):
time.sleep(0.1)
# Change state and verify stop method was called
self.mock_agent.llms["default"] = LlmState.INFERENCE
self.approver._handle_llm_state_change("default", LlmState.INFERENCE)
self.mock_agent.llms["default"] = AgentState.INFERENCE
self.approver._handle_state_change(AgentState.INFERENCE)
mock_stop.assert_called_once()
def test_quick_state_cycle(self):
"""Test thread stops when state changes before timeout"""
self.approver.context_timeout = 5.0
self.mock_agent.llms["default"] = LlmState.IDLE
self.mock_agent.llms["default"] = AgentState.IDLE
self.approver.context_enabled = True
# Change state quickly
time.sleep(0.1)
self.mock_agent.llms["default"] = LlmState.INFERENCE
self.approver._handle_llm_state_change("default", LlmState.INFERENCE)
self.mock_agent.llms["default"] = AgentState.INFERENCE
self.approver._handle_state_change(AgentState.INFERENCE)
# Verify no approval happened
self.mock_agent.run_inference.assert_not_called()
def test_disable_stops_thread(self):
"""Test disabling stops active thread"""
self.mock_agent.llms["default"] = LlmState.IDLE
self.mock_agent.llms["default"] = AgentState.IDLE
# Create a new instance with a fresh mock for this test
mock_agent = Mock(spec=WebAgent)
mock_agent.llms = {"default": LlmState.IDLE}
mock_agent.llms = {"default": AgentState.IDLE}
test_approver = AutoApprover(mock_agent)
# Start with a mocked stop method
@@ -91,7 +91,7 @@ class AutoApproverTest(unittest.TestCase):
def test_successful_auto_approval(self):
"""Test thread approves after timeout when conditions met"""
self.approver.context_timeout = 0.1
self.mock_agent.llms["default"] = LlmState.IDLE
self.mock_agent.llms["default"] = AgentState.IDLE
self.approver.llm_name = "default"
# Use threading Event to properly synchronize the test