diff --git a/backend/agents/base.py b/backend/agents/base.py index 11321717..09fc3c5e 100644 --- a/backend/agents/base.py +++ b/backend/agents/base.py @@ -36,10 +36,10 @@ async def run(self, context: Dict[str, Any]) -> Dict[str, Any]: """ pass - async def update_progress(self, progress: float, status: str = "running"): + def update_progress(self, progress: float, status: str = "running"): self.state.progress = progress self.state.status = status - await self._sync_state() + self._sync_state() logger.info( f"Agent {self.agent_type} progress updated", extra={ @@ -49,7 +49,7 @@ async def update_progress(self, progress: float, status: str = "running"): } ) - async def _sync_state(self): + def _sync_state(self): """ Syncs current agent state to Firestore. Rule 4.3 compliant: Always save intermediate state to Firestore. diff --git a/backend/agents/contract_agent.py b/backend/agents/contract_agent.py index 999a2ee8..d9e3672c 100644 --- a/backend/agents/contract_agent.py +++ b/backend/agents/contract_agent.py @@ -8,7 +8,7 @@ class ContractAgent(BaseAgent): def __init__(self, session_id: str): super().__init__("contract", session_id) - self.gemini = GeminiService() + self.gemini = gemini_client async def run(self, context: Dict[str, Any]) -> Dict[str, Any]: """ diff --git a/backend/agents/linkedin_agent.py b/backend/agents/linkedin_agent.py index 9bea0c78..11a66c37 100644 --- a/backend/agents/linkedin_agent.py +++ b/backend/agents/linkedin_agent.py @@ -10,6 +10,7 @@ class LinkedinAgent(BaseAgent): def __init__(self, session_id: str): super().__init__("linkedin", session_id) self.linkedin_service = linkedin_service + self.gemini = gemini_client async def run(self, context: Dict[str, Any]) -> Dict[str, Any]: """ diff --git a/backend/agents/orchestrator.py b/backend/agents/orchestrator.py index c7006e63..50613d6d 100644 --- a/backend/agents/orchestrator.py +++ b/backend/agents/orchestrator.py @@ -40,7 +40,7 @@ async def execute_agent_with_retry(self, agent_type: str, context: Dict[str, Any agent.state.status = "running" agent.state.started_at = datetime.now(timezone.utc) - await agent._sync_state() + agent._sync_state() while retries <= max_retries: try: @@ -49,7 +49,7 @@ async def execute_agent_with_retry(self, agent_type: str, context: Dict[str, Any agent.state.progress = 100.0 agent.state.result = result agent.state.completed_at = datetime.now(timezone.utc) - await agent._sync_state() + agent._sync_state() logger.info( f"Agent {agent_type} completed successfully", @@ -78,7 +78,7 @@ async def execute_agent_with_retry(self, agent_type: str, context: Dict[str, Any agent.state.status = "failed" agent.state.error = str(e) agent.state.completed_at = datetime.now(timezone.utc) - await agent._sync_state() + agent._sync_state() logger.error( f"Agent {agent_type} exhausted all retries", extra={ diff --git a/backend/tests/test_contract_agent.py b/backend/tests/test_contract_agent.py index 035ed1e0..093f67b5 100644 --- a/backend/tests/test_contract_agent.py +++ b/backend/tests/test_contract_agent.py @@ -7,7 +7,6 @@ async def test_contract_agent_run(mock_openai): with patch("backend.agents.contract_agent.GeminiService", return_value=mock_openai), \ patch("backend.agents.base.firebase_service"): - agent = ContractAgent(session_id="test-session") context = { "contract_text": "Sample US employment contract with relocation lock-in.", diff --git a/backend/tests/test_integration.py b/backend/tests/test_integration.py index abef8d52..342e39e9 100644 --- a/backend/tests/test_integration.py +++ b/backend/tests/test_integration.py @@ -202,7 +202,7 @@ async def test_orchestrator_executes_agent_and_updates_state(mock_job_agent): result = await orchestrator.execute_agent_with_retry("job", context) mock_job_agent.run.assert_awaited_once_with(context) - mock_job_agent._sync_state.assert_awaited() # Should be called multiple times for state updates + mock_job_agent._sync_state.assert_called() # Should be called multiple times for state updates assert mock_job_agent.state.status == "completed" assert mock_job_agent.state.progress == 100.0 @@ -241,3 +241,4 @@ async def test_orchestrator_handles_persistent_agent_failure(mock_job_agent): assert "Persistent simulated failure" in mock_job_agent.state.error assert result == {"status": "failed", "error": "Persistent simulated failure"} + diff --git a/backend/tests/test_job_agent.py b/backend/tests/test_job_agent.py index fd0f88d1..79655c7e 100644 --- a/backend/tests/test_job_agent.py +++ b/backend/tests/test_job_agent.py @@ -6,7 +6,7 @@ @pytest.mark.asyncio async def test_job_agent_run(mock_firecrawl): # Patch FirecrawlService and firebase_service to avoid real network/db calls - with patch("backend.agents.job_agent.FirecrawlService", return_value=mock_firecrawl), \ + with patch("backend.agents.job_agent.firecrawl_service", mock_firecrawl), \ patch("backend.agents.base.firebase_service") as mock_fb: agent = JobAgent(session_id="test-session") diff --git a/backend/tests/test_linkedin_agent.py b/backend/tests/test_linkedin_agent.py index eeb865b4..e542ed7f 100644 --- a/backend/tests/test_linkedin_agent.py +++ b/backend/tests/test_linkedin_agent.py @@ -7,7 +7,6 @@ async def test_linkedin_agent_run(mock_openai): with patch("backend.agents.linkedin_agent.gemini_service", mock_openai), \ patch("backend.agents.base.firebase_service"): - agent = LinkedinAgent(session_id="test-session") context = { "recruiter_name": "Jane Smith", diff --git a/backend/tests/test_resume_agent.py b/backend/tests/test_resume_agent.py index dbaf06e4..842bac86 100644 --- a/backend/tests/test_resume_agent.py +++ b/backend/tests/test_resume_agent.py @@ -8,7 +8,6 @@ async def test_resume_agent_run(mock_openai): mock_openai.generate_structured_response = AsyncMock(return_value="Mock LLM Response") with patch("backend.agents.resume_agent.gemini_service", mock_openai), \ patch("backend.agents.base.firebase_service"): - agent = ResumeAgent(session_id="test-session") context = { "resume_text": "NYSC Software Engineer",