| # Contributing to Cidadão.AI | |
| Thank you for your interest in contributing to Cidadão.AI! This guide will help you understand how to contribute effectively to our multi-agent transparency analysis system. | |
| ## 🤖 Agent Implementation Guide | |
| ### Current Status | |
| - **8/17 agents fully implemented** (47%) | |
| - **7 agents partially implemented** (need completion) | |
| - **1 agent missing** (needs creation) | |
| ### How to Implement a New Agent | |
| #### 1. **Choose an Agent to Implement** | |
| Priority order for pending agents: | |
| 1. **José Bonifácio** (`bonifacio.py`) - Structure ready, implement logic | |
| 2. **Carlos Drummond** (`drummond.py`) - Design complete, implement channels | |
| 3. **Maria Quitéria** (`maria_quiteria.py`) - Security auditor | |
| 4. **Oscar Niemeyer** (`niemeyer.py`) - Data visualization | |
| 5. Others: Ceuci, Obaluaiê, Lampião | |
| #### 2. **Follow the Standard Pattern** | |
| All agents must inherit from `ReflectiveAgent`: | |
| ```python | |
| from typing import List, Dict, Any | |
| from src.agents.deodoro import ReflectiveAgent, AgentMessage, AgentResponse | |
| class YourAgent(ReflectiveAgent): | |
| """ | |
| Brief description of the agent's purpose. | |
| This agent specializes in [specific domain]. | |
| """ | |
| def __init__(self): | |
| super().__init__( | |
| agent_id="your_agent_id", | |
| name="Full Agent Name", | |
| description="Detailed description of capabilities", | |
| capabilities=[ | |
| "capability_1", | |
| "capability_2", | |
| # List all specific capabilities | |
| ] | |
| ) | |
| async def process(self, message: AgentMessage) -> AgentResponse: | |
| """ | |
| Main processing logic for the agent. | |
| Args: | |
| message: The agent message to process | |
| Returns: | |
| AgentResponse with results | |
| """ | |
| context = message.context | |
| content = message.content | |
| # Your implementation logic here | |
| results = await self._analyze_data(content) | |
| # Use reflection if quality is low | |
| if results.get("confidence", 0) < 0.8: | |
| return await self.reflect_and_retry(message, results) | |
| return AgentResponse( | |
| agent_id=self.agent_id, | |
| message_id=message.message_id, | |
| content=results, | |
| metadata={ | |
| "processing_time": time.time() - start_time, | |
| "confidence": results.get("confidence") | |
| } | |
| ) | |
| ``` | |
| #### 3. **Required Methods** | |
| Each agent must implement: | |
| - `__init__()`: Initialize with unique ID and capabilities | |
| - `process()`: Main async processing method | |
| - Helper methods for specific analyses | |
| #### 4. **Agent Capabilities Examples** | |
| Reference our fully implemented agents: | |
| **Anomaly Detection (Zumbi)**: | |
| - Statistical analysis (Z-score) | |
| - Spectral analysis (FFT) | |
| - Pattern recognition | |
| - Duplicate detection | |
| **Analysis (Anita)**: | |
| - Trend analysis | |
| - Behavioral patterns | |
| - Efficiency metrics | |
| - Seasonal patterns | |
| **Reporting (Tiradentes)**: | |
| - Multi-format generation | |
| - Audience adaptation | |
| - Risk prioritization | |
| - Multilingual support | |
| #### 5. **Testing Requirements** | |
| Create comprehensive tests in `tests/unit/test_agents/`: | |
| ```python | |
| import pytest | |
| from src.agents.your_agent import YourAgent | |
| class TestYourAgent: | |
| @pytest.fixture | |
| def agent(self): | |
| return YourAgent() | |
| @pytest.fixture | |
| def sample_message(self): | |
| return AgentMessage( | |
| content={"data": "test"}, | |
| sender="test", | |
| context=AgentContext(investigation_id="test-123") | |
| ) | |
| async def test_process_valid_data(self, agent, sample_message): | |
| response = await agent.process(sample_message) | |
| assert response.status == "success" | |
| assert "results" in response.content | |
| async def test_handles_invalid_data(self, agent): | |
| # Test error handling | |
| pass | |
| ``` | |
| #### 6. **Documentation Requirements** | |
| - Add docstrings to all methods | |
| - Update `docs/AGENT_STATUS_2025.md` with implementation status | |
| - Include usage examples in docstrings | |
| - Document any external dependencies | |
| ### Code Style Guidelines | |
| 1. **Python Style**: | |
| - Follow PEP 8 | |
| - Use type hints | |
| - Black formatter (88 char line length) | |
| - isort for imports | |
| 2. **Async Best Practices**: | |
| - Use `async`/`await` for all I/O operations | |
| - Proper exception handling with `try`/`except` | |
| - Timeout handling for external calls | |
| 3. **Security**: | |
| - Validate all inputs | |
| - No hardcoded secrets | |
| - Use `settings` from `src.core.config` | |
| ### Commit Message Format | |
| Follow [Conventional Commits](https://www.conventionalcommits.org/): | |
| ``` | |
| feat(agents): implement José Bonifácio policy analysis agent | |
| - Add policy evaluation metrics | |
| - Implement SROI calculations | |
| - Add comprehensive test coverage | |
| ``` | |
| Types: | |
| - `feat`: New feature | |
| - `fix`: Bug fix | |
| - `test`: Tests only | |
| - `docs`: Documentation only | |
| - `refactor`: Code restructuring | |
| - `style`: Formatting changes | |
| - `chore`: Maintenance | |
| ### Testing | |
| Run tests before submitting: | |
| ```bash | |
| # All tests | |
| make test | |
| # Specific agent tests | |
| pytest tests/unit/test_agents/test_your_agent.py -v | |
| # With coverage | |
| make test-coverage | |
| ``` | |
| Minimum requirements: | |
| - 80% test coverage for new code | |
| - All tests passing | |
| - No linting errors | |
| ### Pull Request Process | |
| 1. Fork the repository | |
| 2. Create a feature branch: `git checkout -b feat/implement-agent-name` | |
| 3. Make your changes following the guidelines | |
| 4. Run all checks: `make check` | |
| 5. Commit with clear messages | |
| 6. Push to your fork | |
| 7. Create a Pull Request with: | |
| - Clear description of changes | |
| - Reference to any related issues | |
| - Test results screenshot | |
| - Documentation updates | |
| ### Getting Help | |
| - Check existing agent implementations for examples | |
| - Review `src/agents/deodoro.py` for base classes | |
| - Ask questions in GitHub Issues | |
| - Tag maintainers for complex questions | |
| ## 🚀 Other Contributions | |
| ### Bug Fixes | |
| 1. Create an issue describing the bug | |
| 2. Reference the issue in your PR | |
| 3. Include tests that verify the fix | |
| ### Documentation | |
| - Fix typos and clarify explanations | |
| - Add examples and use cases | |
| - Translate documentation | |
| ### Performance Improvements | |
| - Profile before optimizing | |
| - Benchmark improvements | |
| - Document performance gains | |
| ## 📋 Development Setup | |
| ```bash | |
| # Clone the repo | |
| git clone https://github.com/your-fork/cidadao.ai-backend | |
| cd cidadao.ai-backend | |
| # Create virtual environment | |
| python -m venv venv | |
| source venv/bin/activate # Linux/Mac | |
| # Install dev dependencies | |
| make install-dev | |
| # Run tests | |
| make test | |
| ``` | |
| ## 🤝 Code of Conduct | |
| - Be respectful and inclusive | |
| - Welcome newcomers | |
| - Focus on constructive feedback | |
| - Celebrate Brazilian culture and diversity | |
| ## 📄 License | |
| By contributing, you agree that your contributions will be licensed under the MIT License. | |
| --- | |
| **Questions?** Open an issue with the `question` label. | |
| **Ready to contribute?** Check our [good first issue](https://github.com/anderson-ufrj/cidadao.ai-backend/labels/good%20first%20issue) labels! |