|
11 | 11 | class BaseAgent(ABC): |
12 | 12 | """Abstract base class for all agents with Sentrius API integration.""" |
13 | 13 |
|
14 | | - def __init__(self, name: str, config_path: Optional[str] = None, config: Optional[SentriusAgentConfig] = None): |
15 | | - self.name = name |
| 14 | + def __init__(self, config_manager, name: Optional[str] = None): |
| 15 | + self.config_manager = config_manager |
| 16 | + self.name = name or self.__class__.__name__.lower().replace('agent', '') |
16 | 17 |
|
17 | | - # Load configuration |
18 | | - if config: |
19 | | - self.config = config |
20 | | - elif config_path: |
21 | | - self.config = SentriusAgentConfig.from_yaml(config_path) |
22 | | - else: |
23 | | - self.config = SentriusAgentConfig.from_env() |
| 18 | + # Check if we're in test mode |
| 19 | + self.test_mode = config_manager.get_property('test.mode', 'false').lower() == 'true' |
24 | 20 |
|
25 | | - # Initialize Sentrius agent |
26 | | - self.sentrius_agent = SentriusAgent(self.config) |
| 21 | + if not self.test_mode: |
| 22 | + # Load configuration for Sentrius integration |
| 23 | + agent_config = config_manager.get_agent_config() |
| 24 | + keycloak_config = config_manager.get_keycloak_config() |
| 25 | + |
| 26 | + # Create SentriusAgentConfig from the loaded configuration |
| 27 | + self.config = SentriusAgentConfig( |
| 28 | + keycloak_server_url=keycloak_config['server_url'], |
| 29 | + keycloak_realm=keycloak_config['realm'], |
| 30 | + keycloak_client_id=keycloak_config['client_id'], |
| 31 | + keycloak_client_secret=keycloak_config['client_secret'], |
| 32 | + agent_name_prefix=agent_config['name_prefix'], |
| 33 | + agent_type=agent_config['agent_type'], |
| 34 | + agent_callback_url=agent_config['callback_url'], |
| 35 | + api_url=agent_config['api_url'], |
| 36 | + heartbeat_interval=agent_config['heartbeat_interval'] |
| 37 | + ) |
| 38 | + |
| 39 | + # Initialize Sentrius agent |
| 40 | + self.sentrius_agent = SentriusAgent(self.config) |
| 41 | + else: |
| 42 | + logger.info("Running in test mode - external services disabled") |
| 43 | + self.sentrius_agent = None |
27 | 44 |
|
28 | | - logger.info(f"Initialized {self.__class__.__name__}: {self.name}") |
| 45 | + logger.info(f"Initialized {self.__class__.__name__}: {config_manager}") |
29 | 46 |
|
30 | 47 | @abstractmethod |
31 | | - def execute_task(self): |
| 48 | + def execute_task(self, task_data: Optional[Dict[str, Any]] = None): |
32 | 49 | """Method to execute the agent's specific task.""" |
33 | 50 | pass |
34 | 51 |
|
35 | | - def run(self): |
| 52 | + def run(self, task_data: Optional[Dict[str, Any]] = None): |
36 | 53 | """Main run method that handles agent lifecycle.""" |
37 | 54 | try: |
38 | | - with self.sentrius_agent: |
39 | | - logger.info(f"Starting {self.name} agent") |
40 | | - |
41 | | - # Submit start event |
42 | | - self.sentrius_agent.submit_provenance_event( |
43 | | - event_type="AGENT_START", |
44 | | - details={ |
45 | | - "agent_name": self.name, |
46 | | - "agent_class": self.__class__.__name__ |
47 | | - } |
48 | | - ) |
49 | | - |
50 | | - # Execute the specific task |
51 | | - self.execute_task() |
52 | | - |
53 | | - # Submit completion event |
54 | | - self.sentrius_agent.submit_provenance_event( |
55 | | - event_type="AGENT_COMPLETE", |
56 | | - details={ |
57 | | - "agent_name": self.name, |
58 | | - "status": "completed" |
59 | | - } |
60 | | - ) |
61 | | - |
62 | | - logger.info(f"{self.name} agent completed successfully") |
| 55 | + if self.sentrius_agent and not self.test_mode: |
| 56 | + with self.sentrius_agent: |
| 57 | + logger.info(f"Starting {self.name} agent") |
| 58 | + |
| 59 | + # Submit start event |
| 60 | + self.sentrius_agent.submit_provenance_event( |
| 61 | + event_type="AGENT_START", |
| 62 | + details={ |
| 63 | + "agent_name": self.name, |
| 64 | + "agent_class": self.__class__.__name__ |
| 65 | + } |
| 66 | + ) |
| 67 | + |
| 68 | + # Execute the specific task |
| 69 | + result = self.execute_task(task_data) |
| 70 | + |
| 71 | + # Submit completion event |
| 72 | + self.sentrius_agent.submit_provenance_event( |
| 73 | + event_type="AGENT_COMPLETE", |
| 74 | + details={ |
| 75 | + "agent_name": self.name, |
| 76 | + "status": "completed" |
| 77 | + } |
| 78 | + ) |
| 79 | + |
| 80 | + logger.info(f"{self.name} agent completed successfully") |
| 81 | + return result |
| 82 | + else: |
| 83 | + # Test mode - just execute the task |
| 84 | + logger.info(f"Starting {self.name} agent (test mode)") |
| 85 | + result = self.execute_task(task_data) |
| 86 | + logger.info(f"{self.name} agent completed successfully (test mode)") |
| 87 | + return result |
63 | 88 |
|
64 | 89 | except Exception as e: |
65 | 90 | logger.error(f"{self.name} agent failed: {e}") |
66 | 91 |
|
67 | 92 | # Submit error event |
68 | | - try: |
69 | | - self.sentrius_agent.submit_provenance_event( |
70 | | - event_type="AGENT_ERROR", |
71 | | - details={ |
72 | | - "agent_name": self.name, |
73 | | - "error": str(e), |
74 | | - "error_type": type(e).__name__ |
75 | | - } |
76 | | - ) |
77 | | - except: |
78 | | - pass # Don't fail if we can't submit error event |
| 93 | + if self.sentrius_agent and not self.test_mode: |
| 94 | + try: |
| 95 | + self.sentrius_agent.submit_provenance_event( |
| 96 | + event_type="AGENT_ERROR", |
| 97 | + details={ |
| 98 | + "agent_name": self.name, |
| 99 | + "error": str(e), |
| 100 | + "error_type": type(e).__name__ |
| 101 | + } |
| 102 | + ) |
| 103 | + except: |
| 104 | + pass # Don't fail if we can't submit error event |
79 | 105 |
|
80 | 106 | raise |
81 | 107 |
|
82 | 108 | def submit_provenance(self, event_type: str, details: Dict[str, Any]): |
83 | 109 | """Submit a provenance event.""" |
84 | | - self.sentrius_agent.submit_provenance_event(event_type, details) |
| 110 | + if self.sentrius_agent and not self.test_mode: |
| 111 | + self.sentrius_agent.submit_provenance_event(event_type, details) |
| 112 | + else: |
| 113 | + logger.info(f"Test mode - would submit provenance: {event_type} - {details}") |
0 commit comments