diff --git a/DOCKER_SETUP.md b/DOCKER_SETUP.md index ee12e92d..790f2f9f 100644 --- a/DOCKER_SETUP.md +++ b/DOCKER_SETUP.md @@ -161,14 +161,7 @@ Some services require credential files (JSON files for GCP, OAuth, etc.). Follow | `AWS_REGION` | AWS region (e.g., ap-south-1) | | `AWS_KMS_ARN` | KMS key ARN for encryption | | `AWS_QUEUE_URL` | SQS queue URL | -| `TRANSCRIPT_BUCKET_NAME` | Bucket for audio transcripts | -| `AUDIO_BUCKET_NAME` | Bucket for audio files | -| `AWS_GOLD_ASSET_BUCKET_NAME` | Bucket for gold/insights assets | -| `MODEL_STORAGE_BUCKET` | Bucket for ML models | -| `AGENT_YAML_BUCKET` | Bucket for agent YAML configs | -| `VOICE_AGENT_BUCKET` | Bucket for voice agent configs | -| `IMAGE_SEARCH_REFERENCE_IMAGES_BUCKET` | Bucket for reference images | -| `APPLICATION_BUCKET` | Bucket for API service applications | +| `APPLICATION_BUCKET` | S3 bucket for all application data (agents, transcripts, audio, models, etc.) | #### GCP Configuration (if CLOUD_PROVIDER=gcp) @@ -180,9 +173,8 @@ Some services require credential files (JSON files for GCP, OAuth, etc.). Follow | `GCP_KMS_KEY_RING` | KMS key ring name | | `GCP_KMS_CRYPTO_KEY` | KMS crypto key name | | `GCP_KMS_CRYPTO_KEY_VERSION` | KMS key version (usually 1) | -| `GCP_ASSET_STORAGE_BUCKET` | Bucket for assets | | `WORKFLOW_WORKER_TOPIC` | Workflow Pub/Sub topic | -| `APPLICATION_BUCKET` | Bucket for API service applications | +| `APPLICATION_BUCKET` | GCS bucket for all application data (agents, transcripts, audio, models, etc.) | #### Optional Configurations @@ -316,7 +308,7 @@ Uncomment the `inference_app` service in `docker-compose.yml` to enable. |----------|-------------| | `APP_ENV` | Application environment | | `CLOUD_PROVIDER` | `aws` or `gcp` | -| `MODEL_STORAGE_BUCKET` | Bucket for ML models | +| `APPLICATION_BUCKET` | Bucket for ML models and inference data | **If AWS**: @@ -382,12 +374,9 @@ Uncomment the `inference_app` service in `docker-compose.yml` to enable. } ``` -3. **Create Buckets**: +3. **Create Bucket**: ```bash - aws s3 mb s3://your-transcript-bucket --region ap-south-1 - aws s3 mb s3://your-audio-bucket --region ap-south-1 - aws s3 mb s3://your-agent-yaml-bucket --region ap-south-1 - # ... create other buckets as needed + aws s3 mb s3://your-application-bucket --region ap-south-1 ``` ### GCP Setup @@ -419,11 +408,9 @@ Uncomment the `inference_app` service in `docker-compose.yml` to enable. --iam-account=rootflo-backend@YOUR_PROJECT_ID.iam.gserviceaccount.com ``` -4. **Create Buckets**: +4. **Create Bucket**: ```bash - gsutil mb -l asia-south1 gs://your-gcp-assets-bucket - gsutil mb -l asia-south1 gs://your-gcp-storage-bucket - # ... create other buckets as needed + gsutil mb -l asia-south1 gs://your-application-bucket ``` 5. **Create Pub/Sub Topics**: diff --git a/docker-compose.sample.yml b/docker-compose.sample.yml index 98beea6c..39b5c206 100644 --- a/docker-compose.sample.yml +++ b/docker-compose.sample.yml @@ -175,26 +175,19 @@ services: - AWS_REGION= - AWS_KMS_ARN= - AWS_QUEUE_URL= - - TRANSCRIPT_BUCKET_NAME= - - AUDIO_BUCKET_NAME= - - AWS_GOLD_ASSET_BUCKET_NAME= - - MODEL_STORAGE_BUCKET= - - AGENT_YAML_BUCKET= - - VOICE_AGENT_BUCKET= - - IMAGE_SEARCH_REFERENCE_IMAGES_BUCKET= - APPLICATION_BUCKET= # GCP Configuration (if CLOUD_PROVIDER=gcp) - GCP_PROJECT_ID= - GCP_LOCATION= - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials/gcp-service-account.json - - GCP_ASSET_STORAGE_BUCKET= - GCP_KMS_KEY_RING= - GCP_KMS_CRYPTO_KEY= - GCP_KMS_CRYPTO_KEY_VERSION= - GCP_GOLD_TOPIC_ID= - GCP_EMAIL_TOPIC_ID= - WORKFLOW_WORKER_TOPIC= + - APPLICATION_BUCKET= # ============================================ # LLM/AI Configuration @@ -415,13 +408,13 @@ services: - AWS_ACCESS_KEY_ID= - AWS_SECRET_ACCESS_KEY= - AWS_REGION= - - MODEL_STORAGE_BUCKET= - + - APPLICATION_BUCKET= + # GCP Configuration (if CLOUD_PROVIDER=gcp) - GCP_PROJECT_ID= - GCP_LOCATION= - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials/gcp-service-account.json - - MODEL_STORAGE_BUCKET= + - APPLICATION_BUCKET= networks: - floware-network diff --git a/wavefront/server/apps/floware/floware/config.ini b/wavefront/server/apps/floware/floware/config.ini index 717796ed..4ecd225b 100644 --- a/wavefront/server/apps/floware/floware/config.ini +++ b/wavefront/server/apps/floware/floware/config.ini @@ -80,23 +80,14 @@ url=${WEB_URL} [aws] aws_access_key=${AWS_ACCESS_KEY_ID} aws_secret_key=${AWS_SECRET_ACCESS_KEY} -transcript_bucket_name=${TRANSCRIPT_BUCKET_NAME} -aws_asset_storage_bucket=${AWS_GOLD_ASSET_BUCKET_NAME} -audio_bucket_name=${AUDIO_BUCKET_NAME} -model_storage_bucket=${MODEL_STORAGE_BUCKET} queue_url=${AWS_QUEUE_URL} region=${AWS_REGION} [gcp] -transcript_bucket_name=${TRANSCRIPT_BUCKET_NAME} -audio_bucket_name=${AUDIO_BUCKET_NAME} -model_storage_bucket=${MODEL_STORAGE_BUCKET} gcp_service_account_json = ${GCP_SERVICE_ACCOUNT_JSON} -gcp_asset_storage_bucket = ${GCP_ASSET_STORAGE_BUCKET} gcp_project_id = ${GCP_PROJECT_ID} gold_topic_id=${GCP_GOLD_TOPIC_ID} email_topic_id=${GCP_EMAIL_TOPIC_ID} -gcp_storage_bucket_name = ${GCP_STORAGE_BUCKET_NAME} gcp_location = ${GCP_LOCATION} gcp_key_ring = ${GCP_KMS_KEY_RING} gcp_crypto_key = ${GCP_KMS_CRYPTO_KEY} @@ -110,6 +101,9 @@ dataset_id=${BQ_DATASET_ID} [cloud_config] cloud_provider=${CLOUD_PROVIDER} +[storage] +application_bucket=${APPLICATION_BUCKET} + [email] email_provider=${EMAIL_PROVIDER} @@ -142,9 +136,6 @@ openai_model_name=${OPENAI_MODEL_NAME} [leads] enabled=${LEADS_ENABLED} -[agents] -agent_yaml_bucket=${AGENT_YAML_BUCKET} - [auth] max_failed_attempts=${MAX_FAILED_ATTEMPTS} lockout_duration_hours=${LOCKOUT_DURATION_HOURS} @@ -156,15 +147,8 @@ inference_service_url=${INFERENCE_SERVICE_URL} [embedding_url] embedding_service_url=${EMBEDDING_SERVICE_URL} -[image_search] -reference_images_bucket = ${IMAGE_SEARCH_REFERENCE_IMAGES_BUCKET} - [voice_agents] call_processing_base_url=${CALL_PROCESSING_BASE_URL} -voice_agent_bucket=${VOICE_AGENT_BUCKET} - -[api_service] -application_bucket=${APPLICATION_BUCKET} [hermes] url=${HERMES_URL:http://localhost:8080/flo-hermes} diff --git a/wavefront/server/apps/floware/floware/services/config_service.py b/wavefront/server/apps/floware/floware/services/config_service.py index 901774da..958c8bf7 100644 --- a/wavefront/server/apps/floware/floware/services/config_service.py +++ b/wavefront/server/apps/floware/floware/services/config_service.py @@ -19,12 +19,21 @@ def __init__( def _get_gcp_credentials(self) -> dict[str, Any]: config_credentials = self.config.get('gcp') + storage_config = self.config.get('storage') if not isinstance(config_credentials, dict): raise HTTPException(status_code=500, detail='GCP configuration is missing') - if not config_credentials.get( - 'gcp_asset_storage_bucket' - ) or not config_credentials.get('config_file_name'): - raise HTTPException(status_code=500, detail='Incomplete GCP configuration') + if not isinstance(storage_config, dict): + raise HTTPException( + status_code=500, detail='Storage configuration is missing' + ) + if not storage_config.get('application_bucket') or not config_credentials.get( + 'config_file_name' + ): + raise HTTPException( + status_code=500, detail='Incomplete GCP or storage configuration' + ) + # Merge storage config into credentials dict for backward compatibility + config_credentials['application_bucket'] = storage_config['application_bucket'] return config_credentials async def store_app_config( @@ -44,7 +53,7 @@ async def store_app_config( if file_content: self.cloud_manager.save_small_file( file_content, - config_credentials['gcp_asset_storage_bucket'], + config_credentials['application_bucket'], config_credentials['config_file_name'], ) # if atleast one icon or file_content is there then allow the all_config to be saved @@ -71,7 +80,7 @@ async def get_app_config(self): config_credentials = self._get_gcp_credentials() # Generate new presigned URL url = self.cloud_manager.generate_presigned_url( - config_credentials['gcp_asset_storage_bucket'], + config_credentials['application_bucket'], config_path, 'get', ) diff --git a/wavefront/server/apps/floware/tests/conftest.py b/wavefront/server/apps/floware/tests/conftest.py index 9b700cbe..e18397c9 100644 --- a/wavefront/server/apps/floware/tests/conftest.py +++ b/wavefront/server/apps/floware/tests/conftest.py @@ -176,10 +176,12 @@ def mock_config_repository(): def mock_config(): """Mock configuration for testing""" return { + 'storage': { + 'application_bucket': 'test-bucket', + }, 'gcp': { - 'gcp_asset_storage_bucket': 'test-bucket', 'config_file_name': 'config.png', - } + }, } diff --git a/wavefront/server/apps/inference_app/inference_app/config.ini b/wavefront/server/apps/inference_app/inference_app/config.ini index cc12d9df..d3b20585 100644 --- a/wavefront/server/apps/inference_app/inference_app/config.ini +++ b/wavefront/server/apps/inference_app/inference_app/config.ini @@ -1,8 +1,5 @@ -[aws] -model_storage_bucket=${MODEL_STORAGE_BUCKET} - -[gcp] -model_storage_bucket=${MODEL_STORAGE_BUCKET} +[storage] +application_bucket=${APPLICATION_BUCKET} [cloud_config] cloud_provider=${CLOUD_PROVIDER} diff --git a/wavefront/server/apps/inference_app/inference_app/controllers/inference_controller.py b/wavefront/server/apps/inference_app/inference_app/controllers/inference_controller.py index e9a5e82a..0facbf04 100644 --- a/wavefront/server/apps/inference_app/inference_app/controllers/inference_controller.py +++ b/wavefront/server/apps/inference_app/inference_app/controllers/inference_controller.py @@ -63,12 +63,7 @@ async def generic_inference_handler( ), ): try: - provider = config['cloud_config']['cloud_provider'] - model_storage_bucket = ( - config['gcp']['model_storage_bucket'] - if provider.lower() == 'gcp' - else config['aws']['model_storage_bucket'] - ) + model_storage_bucket = config['storage']['application_bucket'] logger.info( f'Loading model from bucket: {model_storage_bucket}, model_info: {payload.model_info}' diff --git a/wavefront/server/background_jobs/workflow_job/workflow_job/config.ini b/wavefront/server/background_jobs/workflow_job/workflow_job/config.ini index 86fa0b7f..7e3bfb74 100644 --- a/wavefront/server/background_jobs/workflow_job/workflow_job/config.ini +++ b/wavefront/server/background_jobs/workflow_job/workflow_job/config.ini @@ -4,20 +4,16 @@ app_env = ${APP_ENV:dev} passthrough_secret = ${PASSTHROUGH_SECRET} batch_size = ${BATCH_SIZE:5} -[agents] -agent_yaml_bucket = ${AGENT_YAML_BUCKET} - [cloud_config] cloud_provider = ${CLOUD_PROVIDER} +[storage] +application_bucket = ${APPLICATION_BUCKET} + [gcp_config] project_id = ${GCP_PROJECT_ID} pubsub_subscription_id = ${GCP_PUBSUB_SUBSCRIPTION_ID} pubsub_topic_id = ${GCP_PUBSUB_TOPIC_ID} -bucket = ${APPLICATION_BUCKET} - -[gcp] -gcp_asset_storage_bucket = ${APPLICATION_BUCKET} [hermes] url=${HERMES_URL} diff --git a/wavefront/server/modules/agents_module/agents_module/agents_container.py b/wavefront/server/modules/agents_module/agents_module/agents_container.py index eccfce3c..1119e756 100644 --- a/wavefront/server/modules/agents_module/agents_module/agents_container.py +++ b/wavefront/server/modules/agents_module/agents_module/agents_container.py @@ -40,7 +40,7 @@ class AgentsContainer(containers.DeclarativeContainer): namespace_service=namespace_service, cloud_storage_manager=cloud_storage_manager, cache_manager=cache_manager, - bucket_name=config.agents.agent_yaml_bucket, + bucket_name=config.storage.application_bucket, ) # Agent inference service @@ -57,7 +57,7 @@ class AgentsContainer(containers.DeclarativeContainer): namespace_service=namespace_service, cloud_storage_manager=cloud_storage_manager, cache_manager=cache_manager, - bucket_name=config.agents.agent_yaml_bucket, + bucket_name=config.storage.application_bucket, agent_crud_service=agent_crud_service, tool_loader=tool_loader, ) @@ -66,7 +66,7 @@ class AgentsContainer(containers.DeclarativeContainer): WorkflowInferenceService, cloud_storage_manager=cloud_storage_manager, cache_manager=cache_manager, - bucket_name=config.agents.agent_yaml_bucket, + bucket_name=config.storage.application_bucket, agent_crud_service=agent_crud_service, tool_loader=tool_loader, ) diff --git a/wavefront/server/modules/auth_module/auth_module/services/outlook_service.py b/wavefront/server/modules/auth_module/auth_module/services/outlook_service.py index 8bfd6cdb..ba267ca8 100644 --- a/wavefront/server/modules/auth_module/auth_module/services/outlook_service.py +++ b/wavefront/server/modules/auth_module/auth_module/services/outlook_service.py @@ -252,11 +252,7 @@ async def _process_and_publish_emails( f'kb_{existing_kb.id}/{message.id}/{message.conversation_id}' ) # Get bucket name from config - bucket_name = ( - config['gcp']['gcp_asset_storage_bucket'] - if config['cloud_config']['cloud_provider'] == 'gcp' - else config['aws']['aws_asset_storage_bucket'] - ) + bucket_name = config['storage']['application_bucket'] # Get topic/queue URL from config topic_id = ( diff --git a/wavefront/server/modules/gold_module/gold_module/gold_container.py b/wavefront/server/modules/gold_module/gold_module/gold_container.py index 2f4b737f..75855434 100644 --- a/wavefront/server/modules/gold_module/gold_module/gold_container.py +++ b/wavefront/server/modules/gold_module/gold_module/gold_container.py @@ -16,14 +16,14 @@ class GoldContainer(containers.DeclarativeContainer): aws_image_service = providers.Singleton( AWSImageService, - bucket_name=config.aws.aws_asset_storage_bucket, + bucket_name=config.storage.application_bucket, queue_url=config.aws.queue_url, region=config.aws.region, ) gcp_image_service = providers.Singleton( GCPImageService, - bucket_name=config.gcp.gcp_asset_storage_bucket, + bucket_name=config.storage.application_bucket, project_id=config.gcp.gcp_project_id, topic_id=config.gcp.gold_topic_id, ) diff --git a/wavefront/server/modules/inference_module/inference_module/controllers/inference_controller.py b/wavefront/server/modules/inference_module/inference_module/controllers/inference_controller.py index 0325f2f5..c32c9554 100644 --- a/wavefront/server/modules/inference_module/inference_module/controllers/inference_controller.py +++ b/wavefront/server/modules/inference_module/inference_module/controllers/inference_controller.py @@ -36,12 +36,7 @@ async def model_loading( ), cache_manager: CacheManager = Depends(Provide[CommonContainer.cache_manager]), ): - provider = config['cloud_config']['cloud_provider'] - model_storage_bucket = ( - config['gcp']['model_storage_bucket'] - if provider.lower() == 'gcp' - else config['aws']['model_storage_bucket'] - ) + model_storage_bucket = config['storage']['application_bucket'] if cache_manager.get_str(f"model_name_key_{model_file.filename.split('.')[0]}"): return JSONResponse( status_code=status.HTTP_400_BAD_REQUEST, diff --git a/wavefront/server/modules/inference_module/tests/conftest.py b/wavefront/server/modules/inference_module/tests/conftest.py index e3e1addf..0178617c 100644 --- a/wavefront/server/modules/inference_module/tests/conftest.py +++ b/wavefront/server/modules/inference_module/tests/conftest.py @@ -145,8 +145,7 @@ def setup_containers(test_engine, test_session, test_user_id, test_session_id): mock_config_service = Mock() mock_config_service.config = { 'cloud_config': {'cloud_provider': 'gcp'}, - 'gcp': {'model_storage_bucket': 'test_bucket'}, - 'aws': {'model_storage_bucket': 'test_bucket'}, + 'storage': {'application_bucket': 'test_bucket'}, } inference_container.config.override( providers.Singleton(lambda: mock_config_service.config) diff --git a/wavefront/server/modules/insights_module/insights_module/insights_container.py b/wavefront/server/modules/insights_module/insights_module/insights_container.py index 211ded47..e5c96acd 100644 --- a/wavefront/server/modules/insights_module/insights_module/insights_container.py +++ b/wavefront/server/modules/insights_module/insights_module/insights_container.py @@ -63,15 +63,15 @@ class InsightsContainer(containers.DeclarativeContainer): cloud_service = providers.Singleton( AWSServices, insights_service=insights_service, - transcript_bucket_name=config.aws.transcript_bucket_name, - audio_bucket_name=config.aws.audio_bucket_name, + transcript_bucket_name=config.storage.application_bucket, + audio_bucket_name=config.storage.application_bucket, ) elif cloud_provider == 'gcp': cloud_service = providers.Singleton( GCPServices, insights_service=insights_service, - transcript_bucket_name=config.gcp.transcript_bucket_name, - audio_bucket_name=config.gcp.audio_bucket_name, + transcript_bucket_name=config.storage.application_bucket, + audio_bucket_name=config.storage.application_bucket, ) colud_manager = providers.Singleton( diff --git a/wavefront/server/modules/knowledge_base_module/knowledge_base_module/controllers/knowledge_base_document_controller.py b/wavefront/server/modules/knowledge_base_module/knowledge_base_module/controllers/knowledge_base_document_controller.py index c01872be..cc03e705 100644 --- a/wavefront/server/modules/knowledge_base_module/knowledge_base_module/controllers/knowledge_base_document_controller.py +++ b/wavefront/server/modules/knowledge_base_module/knowledge_base_module/controllers/knowledge_base_document_controller.py @@ -123,11 +123,7 @@ async def upload_document( # Upload to cloud storage logger.info(f'The data filename is {gcs_file_name}') - bucket_name = ( - config['gcp']['gcp_asset_storage_bucket'] - if config['cloud_config']['cloud_provider'] == 'gcp' - else config['aws']['aws_asset_storage_bucket'] - ) + bucket_name = config['storage']['application_bucket'] await asyncio.to_thread( cloud_storage.save_small_file, file_content=file_bytes, @@ -305,12 +301,7 @@ async def get_document_with_id( ), ) if signed_url: - provider = config['cloud_config']['cloud_provider'] - bucket = ( - config['gcp']['gcp_asset_storage_bucket'] - if provider.lower() == 'gcp' - else config['aws']['aws_asset_storage_bucket'] - ) + bucket = config['storage']['application_bucket'] presigned_url = cloude_storage_manager.generate_presigned_url( bucket, existing_document.file_path, 'GET' ) diff --git a/wavefront/server/modules/knowledge_base_module/tests/conftest.py b/wavefront/server/modules/knowledge_base_module/tests/conftest.py index a4108dca..9f07fb37 100644 --- a/wavefront/server/modules/knowledge_base_module/tests/conftest.py +++ b/wavefront/server/modules/knowledge_base_module/tests/conftest.py @@ -141,8 +141,7 @@ def setup_containers(test_engine, test_session, test_user_id, test_session_id): mock_config_service = Mock() mock_config_service.config = { 'cloud_config': {'cloud_provider': 'gcp'}, - 'gcp': {'gcp_asset_storage_bucket': 'test_bucket'}, - 'aws': {'aws_asset_storage_bucket': 'test_bucket'}, + 'storage': {'application_bucket': 'test_bucket'}, 'model': {'inference_service_url': 'http://mock-inference-url.com'}, } knowledge_base_container.config.override( @@ -216,12 +215,13 @@ def setup_containers(test_engine, test_session, test_user_id, test_session_id): test_config_dict = { 'model': {'inference_service_url': 'http://mock-inference-url.com'}, 'cloud_config': {'cloud_provider': 'gcp'}, + 'storage': { + 'application_bucket': 'test_bucket', + }, 'gcp': { - 'gcp_asset_storage_bucket': 'test_bucket', 'email_topic_id': 'test_topic', }, 'aws': { - 'aws_asset_storage_bucket': 'test_bucket', 'queue_url': 'test_queue_url', }, } diff --git a/wavefront/server/modules/plugins_module/plugins_module/plugins_container.py b/wavefront/server/modules/plugins_module/plugins_module/plugins_container.py index e7e56f66..2a1b2668 100644 --- a/wavefront/server/modules/plugins_module/plugins_module/plugins_container.py +++ b/wavefront/server/modules/plugins_module/plugins_module/plugins_container.py @@ -47,17 +47,13 @@ class PluginsContainer(containers.DeclarativeContainer): DynamicQueryService, cloud_manager=cloud_manager, dynamic_query_repo=dynamic_query_repository, - bucket_name=config.aws.aws_asset_storage_bucket - if cloud_provider == 'aws' - else config.gcp.gcp_asset_storage_bucket, + bucket_name=config.storage.application_bucket, ) message_processor_service = providers.Singleton( MessageProcessorService, cloud_manager=cloud_manager, message_processor_repository=message_processor_repository, - bucket_name=config.aws.aws_asset_storage_bucket - if cloud_provider == 'aws' - else config.gcp.gcp_asset_storage_bucket, + bucket_name=config.storage.application_bucket, hermes_url=config.hermes.url, ) diff --git a/wavefront/server/modules/user_management_module/tests/conftest.py b/wavefront/server/modules/user_management_module/tests/conftest.py index 102d1876..ed43e225 100644 --- a/wavefront/server/modules/user_management_module/tests/conftest.py +++ b/wavefront/server/modules/user_management_module/tests/conftest.py @@ -164,12 +164,13 @@ def setup_containers( # Mock config test_kb_config_dict = { 'cloud_config': {'cloud_provider': 'gcp'}, + 'storage': { + 'application_bucket': 'test_bucket', + }, 'gcp': { - 'gcp_asset_storage_bucket': 'test_bucket', 'email_topic_id': 'test_topic', }, 'aws': { - 'aws_asset_storage_bucket': 'test_bucket', 'queue_url': 'test_queue_url', }, } diff --git a/wavefront/server/modules/voice_agents_module/voice_agents_module/voice_agents_container.py b/wavefront/server/modules/voice_agents_module/voice_agents_module/voice_agents_container.py index f799c4f8..edf31e97 100644 --- a/wavefront/server/modules/voice_agents_module/voice_agents_module/voice_agents_container.py +++ b/wavefront/server/modules/voice_agents_module/voice_agents_module/voice_agents_container.py @@ -86,7 +86,7 @@ class VoiceAgentsContainer(containers.DeclarativeContainer): cache_manager=cache_manager, tts_generator_service=tts_generator_service, cloud_storage_manager=cloud_storage_manager, - voice_agent_bucket=config.voice_agents.voice_agent_bucket, + voice_agent_bucket=config.storage.application_bucket, ) twilio_service = providers.Singleton(