diff --git a/README.md b/README.md index b8162f25..a22159d8 100644 --- a/README.md +++ b/README.md @@ -2,45 +2,41 @@ ## Overview -Project Nalgonda is an innovative platform for managing and executing AI-driven swarm agencies. -Built upon the [OpenAI Assistants API](https://platform.openai.com/docs/assistants/overview), -it extends functionality through specialized tools and a sophisticated management system for AI agencies. -It combines robust FastAPI architecture, Firebase Firestore, and OpenAI's GPT models for dynamic agency -and agent management. +Project Nalgonda is an advanced platform designed for the orchestration and operational management of AI-driven swarm agencies. Leveraging [OpenAI Assistants API](https://platform.openai.com/docs/assistants/overview), it enriches the capabilities of the AI agencies with specialized tools and a robust management system. Built on a solid FastAPI framework and employing Firebase Firestore along with OpenAI's GPT models, it enables dynamic agency and agent management at scale. ## Key Components -- **Configuration Managers**: Manage configurations for AI agencies, agents and tools. -- **WebSocket Connection Manager**: Handles WebSocket connections for interactive agency-client communication. -- **Custom Tools**: Includes tools like `SearchWeb`, `GenerateProposal`, `BuildDirectoryTree`, and more. -- **FastAPI Web Server**: For API routing, CORS middleware, Firebase initialization, and WebSocket communication. -- **Data Models**: Pydantic models for agencies, agents, and tool configurations and request validation. -- **Data Persistence**: Firestore for storing tool, agent, and agency configurations. -- **Caching**: Redis for efficient caching of agency states. +- **Configuration Managers**: Centralized management of configurations for agencies, agents, and individual tools. +- **WebSocket Connection Manager**: Ensures real-time interactive communication between agencies and clients through WebSocket connections. +- **Custom Tools**: A suite of specialized tools including `SearchWeb`, `GenerateProposal`, `BuildDirectoryTree`, among others, designed to augment the functionalities of the AI agents. +- **FastAPI Web Server**: Manages API routing, initializes CORS middleware, sets up Firebase, and facilitates WebSocket communication. +- **Data Models**: Utilizes Pydantic models for defining and validating configurations of agencies, agents, tools, as well as the structure of request data. +- **Repositories**: Utilizes Firestore for robust storage and querying capabilities for tool, agent, and agency configurations -- ensuring a seamless persistence layer. +- **Caching**: Employs Redis for efficient and scalable caching of agency states (sessions) for optimized performance. ## Features -- **Tool Configuration**: Configure tools with code and parameters. -- **Agent Configuration**: Configure agents with knowledge and tools. -- **Agency Configuration**: Set up agencies with agents. -- **Tool Execution**: Execute tools for various tasks. -- **User Management**: Manage user access to different agencies [TODO]. -- **API and WebSocket Routers**: Define API endpoints and WebSocket routes. -- **Security**: Basic implementations of JWT authentication and authorization [TBD]. +- **Tool Configuration**: Offers extensive flexibility in customizing tools with specific codes and parameters for varied tasks. +- **Agent Configuration**: Allows detailed setup of agents with specialized knowledge areas and toolsets. +- **Agency Configuration**: Facilitates the creation and management of agencies composed of configured agents. +- **Tool Execution**: Executes tools within an established framework for accomplishing a wide range of tasks. +- **User Management**: User access management features for interaction with different agencies. +- **API and WebSocket Routers**: Lays down a comprehensive set of API endpoints and WebSocket routes for external interactions and real-time communications. +- **Security**: Basic implementation of JWT for user authentication and authorization with plans for further enhancements. ## Installation -1. Ensure Python 3.11+ and Node.js 20.11+ are installed. -2. Install Python dependencies (from `requirements.txt` or using Poetry). -3. Set up environment variables in ".env", reference in ".env.testing". - - Use `cat ~/ai-in-hand-firebase-adminsdk-....json | jq -c .` for Google Credentials. -4. In `frontend` directory, run: - - for local development: `npm install && npm run start` - - for production (builds to nalgonda/ui/ directory and is served by FastAPI): - `npm install -g gatsby-cli && npm install --global yarn && yarn install && yarn build` +Follow these steps for setting up the environment and running the Nalgonda project locally: + +1. Ensure Python 3.11+ and Node.js 20.10+ are installed. +2. Install Python dependencies either from `requirements.txt` or using Poetry. +3. Configure environment variables in ".env", taking ".env.testing" as a reference point (used only for local development). +4. To set up the frontend: + - For local development: `npm install && npm run start` + - For production: `npm install -g gatsby-cli && npm install --global yarn && yarn install && yarn build` (builds to nalgonda/ui/ directory to be served by FastAPI) ### Running the Application -Start the FastAPI server: `uvicorn nalgonda.main:app --reload` +Start the FastAPI server with: `uvicorn nalgonda.main:app --reload` ## Deployment to Heroku @@ -54,11 +50,10 @@ Start the FastAPI server: `uvicorn nalgonda.main:app --reload` ## Usage ### API Endpoints -To interact with the platform, use the Postman collection, which includes all necessary routes and variables for testing. +The provided Postman collection encompasses all the necessary routes and variables, facilitating extensive testing and interaction with the platform. ### WebSocket Communication -Connect to WebSocket endpoints (`/v1/ws/{agency_id}`, `/v1/ws/{agency_id}/{session_id}`) -for real-time communication with AI agencies. +Outlines the process for establishing WebSocket connections (`/v1/ws/{agency_id}/{session_id}`) for real-time interactions. ## Areas for Improvement -- Enhanced exception handling, security, documentation, testing, caching logic, and database interactions. +Enhance exception handling, security measures, documentation quality (e.g. docstrings), testing robustness. diff --git a/nalgonda/README.md b/nalgonda/README.md new file mode 100644 index 00000000..8e6e1513 --- /dev/null +++ b/nalgonda/README.md @@ -0,0 +1,30 @@ +# Nalgonda Project Overview + +The Nalgonda project is a comprehensive backend application designed to manage agencies, agents, and their interactions. +It employs a variety of custom tools, data models, persistent storage mechanisms, backend services, +external dependencies, and routed endpoints to deliver a fully functional system for agency management. + +## Directory Overview + +- **Custom Tools**: Contains tools for directory structure printing, proposal generation, file content printing, +Airtable integration, web searching, code summarization, and program writing based on specific parameters. + +- **Models**: Defines data structures and logic for agency configurations, agent details, authentication, +request handling, and tool configurations, ensuring data integrity and operation logic. + +- **Repositories**: Manages Firestore interactions for data storage and retrieval, +implementing functionalities for agency and agent configurations, tool data, and user information management. + +- **Services**: Provides backend functionalities including agency and agent management, caching, +real-time WebSocket communication, and threading. + +- **Dependencies**: Manages external service integrations and real-time communication necessities, +including OAuth2 authentication, dependency injections, and WebSocket connections. + +- **Routers**: Orchestrates the application's request routing logic, handling API endpoint definitions +across various versions and functionalities like agency operations, agent management, authentication, +and session handling. + +This document serves to provide a broad overview of the project's structure and should be supplemented +by reading the detailed README files within each directory for a comprehensive understanding +of each component's functionality. diff --git a/nalgonda/custom_tools/README.md b/nalgonda/custom_tools/README.md new file mode 100644 index 00000000..2220c69e --- /dev/null +++ b/nalgonda/custom_tools/README.md @@ -0,0 +1,26 @@ +# Custom Tools Directory + +This directory contains a collection of custom tools developed to extend the functionalities of the Nalgonda project. +Each tool performs a specific task and can be called upon when needed. + +## Tools and Descriptions + +- **Build Directory Tree**: Prints the structure of directories and files within a specified directory +while preventing directory traversal. + +- **Generate Proposal**: Generates a proposal for a project based on a project brief. +Uses a GPT model to generate text based on input. + +- **Print File Contents**: Prints the contents of a specific file, preventing directory traversal. + +- **Save Lead to Airtable**: Saves new lead information to Airtable, including name, email, and lead details. + +- **Search Web**: Performs a web search and returns the results. It uses the `duckduckgo_search` library. + +- **Summarize Code**: Summarizes the code of a specified file using GPT-3. +It relies on the `PrintFileContents` tool to access the code text. + +- **Utils**: Contains utility functions including directory traversal checks. + +- **Write and Save Program**: Writes and saves files that represent a program/application +to the disk based on specified parameters. diff --git a/nalgonda/custom_tools/__init__.py b/nalgonda/custom_tools/__init__.py index d24ba57d..0cb46a37 100644 --- a/nalgonda/custom_tools/__init__.py +++ b/nalgonda/custom_tools/__init__.py @@ -3,7 +3,7 @@ from nalgonda.custom_tools.build_directory_tree import BuildDirectoryTree from nalgonda.custom_tools.generate_proposal import GenerateProposal -from nalgonda.custom_tools.print_file import PrintFileContents +from nalgonda.custom_tools.print_file_contents import PrintFileContents from nalgonda.custom_tools.save_lead_to_airtable import SaveLeadToAirtable from nalgonda.custom_tools.search_web import SearchWeb from nalgonda.custom_tools.summarize_code import SummarizeCode diff --git a/nalgonda/custom_tools/print_file.py b/nalgonda/custom_tools/print_file_contents.py similarity index 88% rename from nalgonda/custom_tools/print_file.py rename to nalgonda/custom_tools/print_file_contents.py index 43461322..0db03486 100644 --- a/nalgonda/custom_tools/print_file.py +++ b/nalgonda/custom_tools/print_file_contents.py @@ -9,9 +9,7 @@ class PrintFileContents(BaseTool): """Print the contents of a specific file.""" - file_name: Path = Field( - ..., description="The name of the file to be printed. It can be a relative or absolute path." - ) + file_name: Path = Field(..., description="The name of the file to be printed. It can be a relative path.") _validate_file_name = field_validator("file_name", mode="after")(check_directory_traversal) diff --git a/nalgonda/dependencies/README.md b/nalgonda/dependencies/README.md new file mode 100644 index 00000000..6a5061e1 --- /dev/null +++ b/nalgonda/dependencies/README.md @@ -0,0 +1,9 @@ +# Dependencies Directory + +This directory is crucial for managing the external dependencies and service interfaces used throughout the project. +It contains: + +- `auth.py`: Handles user authentication and authorization with OAuth2, including JWT token management. +- `dependencies.py`: Centralizes dependency injections for Redis, Agency, Agent, and Thread managers among others, +ensuring modularity and ease of use. +- `websocket_connection_manager.py`: Manages WebSocket connections enabling real-time communication in the application. diff --git a/nalgonda/dependencies/auth.py b/nalgonda/dependencies/auth.py index 82eb8768..42506e72 100644 --- a/nalgonda/dependencies/auth.py +++ b/nalgonda/dependencies/auth.py @@ -6,7 +6,7 @@ from starlette.status import HTTP_400_BAD_REQUEST, HTTP_403_FORBIDDEN from nalgonda.models.auth import TokenData, UserInDB -from nalgonda.persistence.user_repository import UserRepository +from nalgonda.repositories.user_repository import UserRepository from nalgonda.settings import settings oauth2_scheme = OAuth2PasswordBearer(tokenUrl="v1/api/token") diff --git a/nalgonda/dependencies/dependencies.py b/nalgonda/dependencies/dependencies.py index 4cb33f28..62ef6604 100644 --- a/nalgonda/dependencies/dependencies.py +++ b/nalgonda/dependencies/dependencies.py @@ -1,8 +1,8 @@ from fastapi import Depends from redis import asyncio as aioredis -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage -from nalgonda.persistence.agent_config_firestore_storage import AgentConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agent_config_firestore_storage import AgentConfigFirestoreStorage from nalgonda.services.agency_manager import AgencyManager from nalgonda.services.agent_manager import AgentManager from nalgonda.services.caching.redis_cache_manager import RedisCacheManager diff --git a/nalgonda/models/README.md b/nalgonda/models/README.md new file mode 100644 index 00000000..2fe90d3f --- /dev/null +++ b/nalgonda/models/README.md @@ -0,0 +1,17 @@ +# Models Directory + +This directory contains the data models used across the Nalgonda project. +These models define the data structures, validation logic, and relationships between data entities. +They are essential for the proper functioning of the application, ensuring data integrity and facilitating data operations. + +## Models and Descriptions + +- **AgencyConfig**: Represents the configuration of an agency, including identifiers, names, instructions, agents, and the agency chart. + +- **AgentConfig**: Defines the configuration for an individual agent, detailing identifiers, descriptions, instructions, and tools. + +- **ToolConfig**: Configures tools within the application, describing tool identifiers, names, versions, and approval status. + +- **Auth Models**: Includes models for token generation, user details, and authentication processes. + +- **Request Models**: Covers models for handling requests, specifically for threading and messaging within an agency. diff --git a/nalgonda/persistence/agency_config_lock_manager.py b/nalgonda/persistence/agency_config_lock_manager.py deleted file mode 100644 index 727215d2..00000000 --- a/nalgonda/persistence/agency_config_lock_manager.py +++ /dev/null @@ -1,25 +0,0 @@ -import threading -from collections import defaultdict - - -class AgencyConfigLockManager: - """Manages locking for agency configuration files. - - This manager guarantees that each agency configuration has a unique lock, - preventing simultaneous access and modification by multiple processes. - """ - - # Mapping from agency ID to its corresponding Lock. - _locks: dict[str, threading.Lock] = defaultdict(threading.Lock) - - @classmethod - def get_lock(cls, agency_id: str) -> threading.Lock: - """Retrieves the lock for a given agency ID, creating it if not present. - - Args: - agency_id (str): The unique identifier for the agency. - - Returns: - threading.Lock: The lock associated with the agency ID. - """ - return cls._locks[agency_id] diff --git a/nalgonda/repositories/README.md b/nalgonda/repositories/README.md new file mode 100644 index 00000000..b2265801 --- /dev/null +++ b/nalgonda/repositories/README.md @@ -0,0 +1,20 @@ +# Repositories Directory + +This directory is responsible for all persistent storage interactions within the Nalgonda project, +particularly with Firestore. It contains implementations for storing, retrieving, and managing configurations +and data for agencies, agents, tools, and users. + +## Files and Descriptions + +- **AgencyConfigFirestoreStorage.py**: Manages the persistence of agency configurations in Firestore, +providing methods to load and save these configurations based on owner or agency IDs. + +- **AgentConfigFirestoreStorage.py**: Similar to its agency counterpart, this file handles the persistence +of agent configurations, offering functionalities to load and save agent data. + +- **ToolConfigFirestoreStorage.py**: Facilitates storing and retrieving tool configurations in Firestore. +This includes handling tool data validation and manipulation. + +- **UserRepository.py**: Manages user data within Firestore, including functions to retrieve and update user records. +This setup reinforces the project's data integrity and provides a seamless integration with Firebase's Firestore +for its storage needs. diff --git a/nalgonda/persistence/__init__.py b/nalgonda/repositories/__init__.py similarity index 100% rename from nalgonda/persistence/__init__.py rename to nalgonda/repositories/__init__.py diff --git a/nalgonda/persistence/agency_config_firestore_storage.py b/nalgonda/repositories/agency_config_firestore_storage.py similarity index 100% rename from nalgonda/persistence/agency_config_firestore_storage.py rename to nalgonda/repositories/agency_config_firestore_storage.py diff --git a/nalgonda/persistence/agent_config_firestore_storage.py b/nalgonda/repositories/agent_config_firestore_storage.py similarity index 100% rename from nalgonda/persistence/agent_config_firestore_storage.py rename to nalgonda/repositories/agent_config_firestore_storage.py diff --git a/nalgonda/persistence/tool_config_firestore_storage.py b/nalgonda/repositories/tool_config_firestore_storage.py similarity index 100% rename from nalgonda/persistence/tool_config_firestore_storage.py rename to nalgonda/repositories/tool_config_firestore_storage.py diff --git a/nalgonda/persistence/user_repository.py b/nalgonda/repositories/user_repository.py similarity index 100% rename from nalgonda/persistence/user_repository.py rename to nalgonda/repositories/user_repository.py diff --git a/nalgonda/routers/README.md b/nalgonda/routers/README.md new file mode 100644 index 00000000..cc8a863e --- /dev/null +++ b/nalgonda/routers/README.md @@ -0,0 +1,11 @@ +# Routers Directory + +This directory defines the API routing logic for the project, organizing routes into specific functionalities +and versions. Key components include: + +- `__init__.py` & `v1/__init__.py`: Establish the application's routing logic, categorizing the APIs and handling errors. +- `agency.py`, `agent.py`, `auth.py`, `session.py`, `tool.py`: Define the endpoints for managing agencies, agents, +authentication, sessions, and tools, respectively. +- `websocket.py`: Sets up WebSocket endpoints for real-time messaging. + +The Swagger documentation is available at `/v1/docs`. diff --git a/nalgonda/routers/v1/api/agency.py b/nalgonda/routers/v1/api/agency.py index 42361577..ce53e675 100644 --- a/nalgonda/routers/v1/api/agency.py +++ b/nalgonda/routers/v1/api/agency.py @@ -9,7 +9,7 @@ from nalgonda.dependencies.dependencies import get_agency_manager, get_agent_manager from nalgonda.models.agency_config import AgencyConfig from nalgonda.models.auth import UserInDB -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage from nalgonda.services.agency_manager import AgencyManager from nalgonda.services.agent_manager import AgentManager diff --git a/nalgonda/routers/v1/api/agent.py b/nalgonda/routers/v1/api/agent.py index 5d7386ed..15b8f5ff 100644 --- a/nalgonda/routers/v1/api/agent.py +++ b/nalgonda/routers/v1/api/agent.py @@ -9,7 +9,7 @@ from nalgonda.dependencies.dependencies import get_agent_manager from nalgonda.models.agent_config import AgentConfig from nalgonda.models.auth import UserInDB -from nalgonda.persistence.agent_config_firestore_storage import AgentConfigFirestoreStorage +from nalgonda.repositories.agent_config_firestore_storage import AgentConfigFirestoreStorage from nalgonda.services.agent_manager import AgentManager logger = logging.getLogger(__name__) diff --git a/nalgonda/routers/v1/api/session.py b/nalgonda/routers/v1/api/session.py index fbcc616f..86bc9d85 100644 --- a/nalgonda/routers/v1/api/session.py +++ b/nalgonda/routers/v1/api/session.py @@ -9,7 +9,7 @@ from nalgonda.dependencies.dependencies import get_agency_manager, get_thread_manager from nalgonda.models.auth import UserInDB from nalgonda.models.request_models import AgencyMessagePostRequest, ThreadPostRequest -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage from nalgonda.services.agency_manager import AgencyManager from nalgonda.services.thread_manager import ThreadManager @@ -80,7 +80,9 @@ async def post_agency_message( raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="Agency not found") try: - response = await asyncio.to_thread(agency.get_completion, message=user_message, yield_messages=False) + response = await asyncio.to_thread( + agency.get_completion, message=user_message, yield_messages=False, message_files=None + ) return {"response": response} except Exception as e: logger.exception(e) diff --git a/nalgonda/routers/v1/api/tool.py b/nalgonda/routers/v1/api/tool.py index 45b6dc95..19ae9b7e 100644 --- a/nalgonda/routers/v1/api/tool.py +++ b/nalgonda/routers/v1/api/tool.py @@ -6,7 +6,7 @@ from nalgonda.dependencies.auth import get_current_active_user, get_current_superuser from nalgonda.models.auth import UserInDB from nalgonda.models.tool_config import ToolConfig -from nalgonda.persistence.tool_config_firestore_storage import ToolConfigFirestoreStorage +from nalgonda.repositories.tool_config_firestore_storage import ToolConfigFirestoreStorage from nalgonda.services.tool_service import generate_tool_description tool_router = APIRouter(tags=["tool"]) diff --git a/nalgonda/routers/v1/websocket.py b/nalgonda/routers/v1/websocket.py index 2a1efa03..51cfe65d 100644 --- a/nalgonda/routers/v1/websocket.py +++ b/nalgonda/routers/v1/websocket.py @@ -7,8 +7,8 @@ from websockets.exceptions import ConnectionClosedOK from nalgonda.dependencies.dependencies import get_agency_manager -from nalgonda.dependencies.websocket_connection_manager import WebSocketConnectionManager from nalgonda.services.agency_manager import AgencyManager +from nalgonda.services.websocket_connection_manager import WebSocketConnectionManager logger = logging.getLogger(__name__) connection_manager = WebSocketConnectionManager() diff --git a/nalgonda/services/README.md b/nalgonda/services/README.md new file mode 100644 index 00000000..efed06cc --- /dev/null +++ b/nalgonda/services/README.md @@ -0,0 +1,21 @@ +# Services Directory + +This directory contains critical components that constitute the backend services of the Nalgonda project. +These services enable various functionalities from managing entities like agencies and agents to handling caching, +WebSocket connections, and threading. + +## Services and Descriptions + +- **Agency Manager**: Manages agencies and their configurations, including retrieval, update, and caching of agency information. + +- **Agent Manager**: Manages agents including creating, updating, and retrieving agent information. + +- **Cache Manager**: Defines an abstract base for cache management operations. + +- **Redis Cache Manager**: Implements cache management using Redis as the backend. + +- **Thread Manager**: Manages communication threads between agents within an agency, enabling threaded interactions. + +- **Tool Service**: Provides tool description generation using GPT-3. + +- **WebSocket Manager**: Manages WebSocket connections between the frontend and backend. diff --git a/nalgonda/services/agency_manager.py b/nalgonda/services/agency_manager.py index 2044c57b..cbcaa750 100644 --- a/nalgonda/services/agency_manager.py +++ b/nalgonda/services/agency_manager.py @@ -5,7 +5,7 @@ from agency_swarm import Agency, Agent, get_openai_client from nalgonda.models.agency_config import AgencyConfig -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage from nalgonda.services.agent_manager import AgentManager from nalgonda.services.caching.redis_cache_manager import RedisCacheManager diff --git a/nalgonda/services/agent_manager.py b/nalgonda/services/agent_manager.py index fb4624a6..c539643d 100644 --- a/nalgonda/services/agent_manager.py +++ b/nalgonda/services/agent_manager.py @@ -5,7 +5,7 @@ from nalgonda.custom_tools import TOOL_MAPPING from nalgonda.models.agent_config import AgentConfig -from nalgonda.persistence.agent_config_firestore_storage import AgentConfigFirestoreStorage +from nalgonda.repositories.agent_config_firestore_storage import AgentConfigFirestoreStorage from nalgonda.settings import settings logger = logging.getLogger(__name__) diff --git a/nalgonda/dependencies/websocket_connection_manager.py b/nalgonda/services/websocket_connection_manager.py similarity index 100% rename from nalgonda/dependencies/websocket_connection_manager.py rename to nalgonda/services/websocket_connection_manager.py diff --git a/tests/functional/v1/api/test_session_endpoints.py b/tests/functional/v1/api/test_session_endpoints.py index 566103e6..7d37afdd 100644 --- a/tests/functional/v1/api/test_session_endpoints.py +++ b/tests/functional/v1/api/test_session_endpoints.py @@ -47,7 +47,7 @@ def test_create_session_agency_not_found(client): @pytest.fixture def mock_get_agency(): - get_agency_mock = AsyncMock(return_value=MagicMock(get_completion=AsyncMock(return_value="Hello, world!"))) + get_agency_mock = AsyncMock(return_value=MagicMock(get_completion=MagicMock(return_value="Hello, world!"))) with patch.object(AgencyManager, "get_agency", get_agency_mock) as mock_get_agency: yield mock_get_agency diff --git a/tests/functional/v1/api/test_tool_endpoints.py b/tests/functional/v1/api/test_tool_endpoints.py index 911ff505..f590555c 100644 --- a/tests/functional/v1/api/test_tool_endpoints.py +++ b/tests/functional/v1/api/test_tool_endpoints.py @@ -2,7 +2,7 @@ import pytest -from nalgonda.persistence.tool_config_firestore_storage import ToolConfigFirestoreStorage +from nalgonda.repositories.tool_config_firestore_storage import ToolConfigFirestoreStorage from tests.test_utils import TEST_USER_ID diff --git a/tests/unit/dependencies/test_auth.py b/tests/unit/dependencies/test_auth.py index 57877af2..d295de22 100644 --- a/tests/unit/dependencies/test_auth.py +++ b/tests/unit/dependencies/test_auth.py @@ -23,7 +23,7 @@ @pytest.fixture() def mock_user_repository(): - with patch("nalgonda.persistence.user_repository.UserRepository.get_user_by_id") as mock: + with patch("nalgonda.repositories.user_repository.UserRepository.get_user_by_id") as mock: mock.return_value = user_data yield mock diff --git a/tests/unit/persistence/test_agency_config_lock_manager.py b/tests/unit/persistence/test_agency_config_lock_manager.py deleted file mode 100644 index 64343154..00000000 --- a/tests/unit/persistence/test_agency_config_lock_manager.py +++ /dev/null @@ -1,43 +0,0 @@ -import threading - -from nalgonda.persistence.agency_config_lock_manager import AgencyConfigLockManager - - -def test_lock_uniqueness(): - agency_id1 = "agency1" - agency_id2 = "agency2" - - lock1 = AgencyConfigLockManager.get_lock(agency_id1) - lock2 = AgencyConfigLockManager.get_lock(agency_id2) - - assert lock1 is not lock2, "Different agencies should have different locks" - - -def test_lock_for_same_agency(): - agency_id = "agency1" - - lock1 = AgencyConfigLockManager.get_lock(agency_id) - lock2 = AgencyConfigLockManager.get_lock(agency_id) - - assert lock1 is lock2, "The same agency should return the same lock instance" - - -def test_lock_concurrency_handling(): - agency_id = "agency1" - lock = AgencyConfigLockManager.get_lock(agency_id) - - # Define a shared resource - shared_resource = [] - - def task(): - with lock: - shared_resource.append(1) - - # Run tasks in parallel to simulate concurrent access - threads = [threading.Thread(target=task) for _ in range(10)] - for thread in threads: - thread.start() - for thread in threads: - thread.join() - - assert len(shared_resource) == 10, "Concurrency issue: shared resource was accessed simultaneously" diff --git a/tests/unit/persistence/__init__.py b/tests/unit/repositories/__init__.py similarity index 100% rename from tests/unit/persistence/__init__.py rename to tests/unit/repositories/__init__.py diff --git a/tests/unit/persistence/test_agency_config_firestore_storage.py b/tests/unit/repositories/test_agency_config_firestore_storage.py similarity index 95% rename from tests/unit/persistence/test_agency_config_firestore_storage.py rename to tests/unit/repositories/test_agency_config_firestore_storage.py index 0ca291ec..71799ac6 100644 --- a/tests/unit/persistence/test_agency_config_firestore_storage.py +++ b/tests/unit/repositories/test_agency_config_firestore_storage.py @@ -1,7 +1,7 @@ import pytest from nalgonda.models.agency_config import AgencyConfig -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage from tests.test_utils.constants import TEST_USER_ID diff --git a/tests/unit/persistence/test_agent_config_firestore_storage.py b/tests/unit/repositories/test_agent_config_firestore_storage.py similarity index 95% rename from tests/unit/persistence/test_agent_config_firestore_storage.py rename to tests/unit/repositories/test_agent_config_firestore_storage.py index 5e586d75..4dbd5d70 100644 --- a/tests/unit/persistence/test_agent_config_firestore_storage.py +++ b/tests/unit/repositories/test_agent_config_firestore_storage.py @@ -1,7 +1,7 @@ import pytest from nalgonda.models.agent_config import AgentConfig -from nalgonda.persistence.agent_config_firestore_storage import AgentConfigFirestoreStorage +from nalgonda.repositories.agent_config_firestore_storage import AgentConfigFirestoreStorage from tests.test_utils import TEST_USER_ID diff --git a/tests/unit/persistence/test_tool_config_firestore_storage.py b/tests/unit/repositories/test_tool_config_firestore_storage.py similarity index 96% rename from tests/unit/persistence/test_tool_config_firestore_storage.py rename to tests/unit/repositories/test_tool_config_firestore_storage.py index 84f58de1..1760a871 100644 --- a/tests/unit/persistence/test_tool_config_firestore_storage.py +++ b/tests/unit/repositories/test_tool_config_firestore_storage.py @@ -1,7 +1,7 @@ import pytest from nalgonda.models.tool_config import ToolConfig -from nalgonda.persistence.tool_config_firestore_storage import ToolConfigFirestoreStorage +from nalgonda.repositories.tool_config_firestore_storage import ToolConfigFirestoreStorage from tests.test_utils import TEST_USER_ID diff --git a/tests/unit/services/test_agency_manager.py b/tests/unit/services/test_agency_manager.py index 9717b512..a787104c 100644 --- a/tests/unit/services/test_agency_manager.py +++ b/tests/unit/services/test_agency_manager.py @@ -4,7 +4,7 @@ from agency_swarm import Agency, Agent from nalgonda.models.agency_config import AgencyConfig -from nalgonda.persistence.agency_config_firestore_storage import AgencyConfigFirestoreStorage +from nalgonda.repositories.agency_config_firestore_storage import AgencyConfigFirestoreStorage from nalgonda.services.agency_manager import AgencyManager from tests.test_utils import TEST_USER_ID