-
Notifications
You must be signed in to change notification settings - Fork 34
Add AgentAuditor for Cortensor Hackathon 3 #81
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request introduces AgentAuditor, a decentralized AI compliance oracle built for the Cortensor Hackathon 3. The system provides independent verification of AI task execution through Proof of Inference (PoI) and Proof of Useful Work (PoUW) consensus mechanisms, generating cryptographically signed audit proofs stored on IPFS.
Key Changes:
- Full-stack application with Python FastAPI backend and React TypeScript frontend
- Independent consensus verification engines for PoI/PoUW validation
- Evidence bundle generation with cryptographic signing and IPFS storage
- Database schema and models for audit tracking and agent reputation
Reviewed changes
Copilot reviewed 40 out of 41 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/AgentAuditor/README.md | Comprehensive documentation covering architecture, features, setup, and usage |
| apps/AgentAuditor/.env.example | Environment configuration template with Cortensor and blockchain settings |
| apps/AgentAuditor/.gitignore | Git ignore patterns for Python, Node.js, and IDE files (contains duplication) |
| apps/AgentAuditor/setup.sh | Unix/Linux setup automation script |
| apps/AgentAuditor/setup.bat | Windows setup automation script |
| apps/AgentAuditor/test_setup.py | System test script to verify all dependencies and connections |
| apps/AgentAuditor/settings.json | VS Code Python interpreter configuration |
| apps/AgentAuditor/SessionV2ABI.json | Cortensor SessionV2 smart contract ABI |
| apps/AgentAuditor/database/schema.sql | PostgreSQL database schema with agents, audits, and reputation tracking |
| apps/AgentAuditor/backend/config.py | Application settings and configuration management |
| apps/AgentAuditor/backend/base.py | SQLAlchemy declarative base |
| apps/AgentAuditor/backend/models.py | Database ORM models for agents and audits |
| apps/AgentAuditor/backend/database.py | Database session management and initialization |
| apps/AgentAuditor/backend/web3_client.py | Web3 client for Cortensor smart contract interactions |
| apps/AgentAuditor/backend/cortensor_client.py | REST API client for Cortensor Router communication |
| apps/AgentAuditor/backend/orchestrator.py | Main audit pipeline orchestration logic |
| apps/AgentAuditor/backend/main.py | FastAPI application with REST endpoints |
| apps/AgentAuditor/backend/engines/poi_engine.py | Proof of Inference validation engine |
| apps/AgentAuditor/backend/engines/pouw_engine.py | Proof of Useful Work validation engine |
| apps/AgentAuditor/backend/engines/evidence_generator.py | Evidence bundle creation and signing |
| apps/AgentAuditor/backend/engines/ipfs_client.py | IPFS storage integration via Pinata |
| apps/AgentAuditor/frontend/index.html | React application entry HTML |
| apps/AgentAuditor/frontend/package.json | Node.js dependencies and scripts |
| apps/AgentAuditor/frontend/vite.config.ts | Vite build configuration with API proxy |
| apps/AgentAuditor/frontend/tsconfig.json | TypeScript compiler configuration |
| apps/AgentAuditor/frontend/tailwind.config.js | Tailwind CSS theme customization |
| apps/AgentAuditor/frontend/src/main.tsx | React application bootstrap |
| apps/AgentAuditor/frontend/src/App.tsx | Main app component with routing |
| apps/AgentAuditor/frontend/src/components/Navbar.tsx | Navigation bar component |
| apps/AgentAuditor/frontend/src/pages/Dashboard.tsx | Main dashboard with agent leaderboard |
| apps/AgentAuditor/frontend/src/pages/SubmitAudit.tsx | Audit submission form and progress tracking |
| apps/AgentAuditor/frontend/src/pages/AuditExplorer.tsx | Audit history browser with filtering |
| apps/AgentAuditor/frontend/src/pages/AgentProfile.tsx | Detailed agent statistics and audit history |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
apps/AgentAuditor/.gitignore
Outdated
| *.swp | ||
| ```# filepath: c:\Users\shres\Desktop\AgentAuditor\.gitignore | ||
| # Environment | ||
| .env | ||
| .env.* | ||
| !.env.example | ||
|
|
||
| # Python | ||
| __pycache__/ | ||
| *.py[cod] | ||
| *$py.class | ||
| .Python | ||
| venv/ | ||
| env/ | ||
| .venv/ | ||
| pip-wheel-metadata/ | ||
| pip-log.txt | ||
|
|
||
| # Packaging / build | ||
| build/ | ||
| dist/ | ||
| *.egg-info/ | ||
| .eggs/ | ||
|
|
||
| # Tests / coverage | ||
| .pytest_cache/ | ||
| .coverage | ||
| htmlcov/ | ||
| coverage/ | ||
|
|
||
| # Databases | ||
| *.sqlite3 | ||
| *.db | ||
| *.sqlite | ||
|
|
||
| # Logs | ||
| *.log | ||
| logs/ | ||
|
|
||
| # IDEs / editors | ||
| .vscode/ | ||
| .idea/ | ||
| *.iml | ||
|
|
||
| # OS files | ||
| .DS_Store | ||
| Thumbs.db | ||
|
|
||
| # Node / frontend | ||
| node_modules/ | ||
| npm-debug.log* | ||
| yarn-debug.log* | ||
| yarn-error.log* | ||
| pnpm-debug.log* | ||
| package-lock.json | ||
| yarn.lock | ||
| /dist | ||
| /.vite | ||
|
|
||
| # Docker | ||
| docker-compose.override.yml | ||
|
|
||
| # Jupyter | ||
| .ipynb_checkpoints | ||
|
|
||
| # Secrets / keys / certificates | ||
| *.pem | ||
| *.key | ||
| private_key | ||
| secrets.json | ||
|
|
||
| # Misc | ||
| *.bak |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The entire .gitignore file content is duplicated starting from line 73. Lines 73-145 are an exact duplicate of lines 1-72, including the comment "# filepath: c:\Users\shres\Desktop\AgentAuditor.gitignore" which appears to be accidentally included. Remove the duplicate content from line 73 onwards.
| *.swp | |
| ```# filepath: c:\Users\shres\Desktop\AgentAuditor\.gitignore | |
| # Environment | |
| .env | |
| .env.* | |
| !.env.example | |
| # Python | |
| __pycache__/ | |
| *.py[cod] | |
| *$py.class | |
| .Python | |
| venv/ | |
| env/ | |
| .venv/ | |
| pip-wheel-metadata/ | |
| pip-log.txt | |
| # Packaging / build | |
| build/ | |
| dist/ | |
| *.egg-info/ | |
| .eggs/ | |
| # Tests / coverage | |
| .pytest_cache/ | |
| .coverage | |
| htmlcov/ | |
| coverage/ | |
| # Databases | |
| *.sqlite3 | |
| *.db | |
| *.sqlite | |
| # Logs | |
| *.log | |
| logs/ | |
| # IDEs / editors | |
| .vscode/ | |
| .idea/ | |
| *.iml | |
| # OS files | |
| .DS_Store | |
| Thumbs.db | |
| # Node / frontend | |
| node_modules/ | |
| npm-debug.log* | |
| yarn-debug.log* | |
| yarn-error.log* | |
| pnpm-debug.log* | |
| package-lock.json | |
| yarn.lock | |
| /dist | |
| /.vite | |
| # Docker | |
| docker-compose.override.yml | |
| # Jupyter | |
| .ipynb_checkpoints | |
| # Secrets / keys / certificates | |
| *.pem | |
| *.key | |
| private_key | |
| secrets.json | |
| # Misc | |
| *.bak |
| status: str | ||
| confidence_score: float = 0.0 | ||
| poi_similarity: float = 0.0 | ||
| pouw_score: float = 0.0 # Changed from pouw_mean_score |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The field name in the AuditListItem model is "pouw_score" but in the backend Audit model it's stored as "pouw_mean_score". This inconsistency could cause data mapping issues. Consider either renaming the field in AuditListItem to match the database field name, or updating the database model to use "pouw_score" consistently throughout the codebase.
| pouw_score: float = 0.0 # Changed from pouw_mean_score | |
| pouw_mean_score: float = 0.0 |
| poi_num_nodes: int = 3 # Added | ||
| poi_similarity_threshold: float = 0.6 | ||
|
|
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment on line 29 states "Added" for poi_num_nodes but this field appears to be redundant with the existing poi_redundancy field on line 27. Both fields seem to serve the same purpose of specifying the number of nodes for PoI validation. Consider removing poi_num_nodes and using poi_redundancy consistently throughout the codebase to avoid confusion.
| poi_num_nodes: int = 3 # Added | |
| poi_similarity_threshold: float = 0.6 | |
| poi_similarity_threshold: float = 0.6 | |
| @property | |
| def poi_num_nodes(self) -> int: | |
| """Deprecated alias for poi_redundancy to avoid redundant configuration.""" | |
| return self.poi_redundancy | |
| @poi_num_nodes.setter | |
| def poi_num_nodes(self, value: int) -> None: | |
| self.poi_redundancy = value | |
|
|
||
| CORTENSOR_SESSION_ID= | ||
|
|
||
| CORTENSOR_API_URL=http://172.29.51.244:5010 |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The CORTENSOR_API_URL is hardcoded to a private IP address "http://172.29.51.244:5010" which will not work for other developers or in production. This should default to "http://127.0.0.1:5010" for local development, and the private IP should be moved to a local .env file rather than being included in the example configuration.
| CORTENSOR_API_URL=http://172.29.51.244:5010 | |
| # Local default for CORTENSOR API; override in your own .env if needed | |
| CORTENSOR_API_URL=http://127.0.0.1:5010 |
|
|
||
| # Router External IP and Port for Miner Communication | ||
| # Used for external access to the router | ||
| ROUTER_EXTERNAL_IP="192.168.250.221" |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ROUTER_EXTERNAL_IP is set to a private IP address "192.168.250.221" which is specific to the developer's local network. This should be updated to a placeholder value like "YOUR_ROUTER_IP_HERE" or "0.0.0.0" to make it clear that users need to configure this value for their own environment.
| ROUTER_EXTERNAL_IP="192.168.250.221" | |
| ROUTER_EXTERNAL_IP="YOUR_ROUTER_EXTERNAL_IP_HERE" |
| import logging | ||
| import time | ||
| import requests | ||
| from typing import Dict, Any, List, Optional |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Import of 'Optional' is not used.
| from typing import Dict, Any, List, Optional | |
| from typing import Dict, Any, List |
| import logging | ||
| import time | ||
| import secrets | ||
| from typing import Dict, Any, Optional, List |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Import of 'List' is not used.
| from typing import Dict, Any, Optional, List | |
| from typing import Dict, Any, Optional |
| Web3 client for interacting with Cortensor contracts on Arbitrum Sepolia | ||
| """ | ||
| import json | ||
| import time |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Import of 'time' is not used.
| import time |
| if 1 <= score <= 10: | ||
| return score | ||
| except (ValueError, IndexError): | ||
| pass |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'except' clause does nothing but pass and there is no explanatory comment.
| pass | |
| logger.debug(f"Failed to parse score from validator response: {text!r}") |
| fastapi | ||
| uvicorn[standard] | ||
| sqlalchemy | ||
| psycopg2-binary | ||
| pydantic-settings | ||
| python-dotenv | ||
| web3 | ||
| eth-account | ||
| sentence-transformers | ||
| scikit-learn | ||
| numpy | ||
| requests No newline at end of file |
Copilot
AI
Dec 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The backend dependencies in requirements.txt are all specified without explicit versions, which means pip install -r requirements.txt will always pull the latest available versions from PyPI and other indexes, exposing you to supply-chain compromise if a dependency is hijacked or a malicious update is published. An attacker who compromises, for example, fastapi or requests upstream would gain code execution in your backend environment with access to any secrets and data it handles. To mitigate this, pin each dependency to vetted, fixed versions (or hashes) and manage updates via a controlled dependency update process rather than implicitly trusting the latest releases.
No description provided.