use std::collections::BTreeMap; use std::collections::HashMap; use std::fmt; use std::sync::Arc; use std::sync::RwLock; use std::time::Instant; use super::auth::GatewayAuthApiKeySnapshot; use super::candidates::{read_request_candidate_trace, RequestCandidateTrace}; use super::config::GatewayDataConfig; use super::decision_trace::{read_decision_trace, DecisionTrace}; use crate::provider_transport::{ read_provider_transport_snapshot, GatewayProviderTransportSnapshot, }; use crate::video_tasks::LocalVideoTaskReadResponse; use aether_data::repository::announcements::{ AnnouncementListQuery, AnnouncementReadRepository, AnnouncementWriteRepository, CreateAnnouncementRecord, StoredAnnouncement, StoredAnnouncementPage, UpdateAnnouncementRecord, }; use aether_data::repository::audit::{ AuditLogListQuery, RequestAuditBundle, StoredAdminAuditLogPage, StoredSuspiciousActivity, StoredUserAuditLogPage, }; use aether_data::repository::auth::{ AuthApiKeyLookupKey, AuthApiKeyReadRepository, AuthApiKeyWriteRepository, StoredAuthApiKeyExportRecord, StoredAuthApiKeySnapshot, }; use aether_data::repository::auth_modules::{ AuthModuleReadRepository, AuthModuleWriteRepository, StoredLdapModuleConfig, StoredOAuthProviderModuleConfig, }; use aether_data::repository::gemini_file_mappings::{ GeminiFileMappingListQuery, GeminiFileMappingReadRepository, GeminiFileMappingStats, GeminiFileMappingWriteRepository, StoredGeminiFileMapping, StoredGeminiFileMappingListPage, UpsertGeminiFileMappingRecord, }; use aether_data::repository::management_tokens::{ CreateManagementTokenRecord, ManagementTokenListQuery, ManagementTokenReadRepository, ManagementTokenWriteRepository, RegenerateManagementTokenSecret, StoredManagementToken, StoredManagementTokenListPage, StoredManagementTokenWithUser, UpdateManagementTokenRecord, }; use aether_data::repository::oauth_providers::{ OAuthProviderReadRepository, OAuthProviderWriteRepository, StoredOAuthProviderConfig, UpsertOAuthProviderConfigRecord, }; use aether_data::repository::proxy_nodes::{ ProxyNodeEventQuery, ProxyNodeHeartbeatMutation, ProxyNodeManualCreateMutation, ProxyNodeManualUpdateMutation, ProxyNodeMetricsCleanupSummary, ProxyNodeMetricsStep, ProxyNodeReadRepository, ProxyNodeRegistrationMutation, ProxyNodeRemoteConfigMutation, ProxyNodeTrafficMutation, ProxyNodeTunnelStatusMutation, ProxyNodeWriteRepository, StoredProxyFleetMetricsBucket, StoredProxyNode, StoredProxyNodeEvent, StoredProxyNodeMetricsBucket, }; pub(crate) use aether_data::repository::system::{AdminSystemStats, StoredSystemConfigEntry}; use aether_data::repository::users::{ StoredUserAuthRecord, StoredUserExportRow, StoredUserOAuthLinkSummary, StoredUserSummary, UserReadRepository, }; pub(crate) use aether_data::repository::users::{ StoredUserPreferenceRecord, StoredUserSessionRecord, }; use aether_data::repository::wallet::{ AdjustWalletBalanceInput, AdminPaymentOrderListQuery, AdminRedeemCodeBatchListQuery, AdminRedeemCodeListQuery, AdminWalletLedgerQuery, AdminWalletListQuery, AdminWalletRefundRequestListQuery, CompleteAdminWalletRefundInput, CreateAdminRedeemCodeBatchInput, CreateAdminRedeemCodeBatchResult, CreateManualWalletRechargeInput, CreatePlanPurchaseOrderInput, CreatePlanPurchaseOrderOutcome, CreateWalletRechargeOrderInput, CreateWalletRechargeOrderOutcome, CreateWalletRefundRequestInput, CreateWalletRefundRequestOutcome, CreditAdminPaymentOrderInput, DeleteAdminRedeemCodeBatchInput, DisableAdminRedeemCodeBatchInput, DisableAdminRedeemCodeInput, FailAdminWalletRefundInput, ProcessAdminWalletRefundInput, ProcessPaymentCallbackInput, ProcessPaymentCallbackOutcome, RedeemWalletCodeInput, RedeemWalletCodeOutcome, StoredAdminPaymentCallback, StoredAdminPaymentCallbackPage, StoredAdminPaymentOrder, StoredAdminPaymentOrderPage, StoredAdminRedeemCode, StoredAdminRedeemCodeBatch, StoredAdminRedeemCodeBatchPage, StoredAdminRedeemCodePage, StoredAdminWalletLedgerPage, StoredAdminWalletListPage, StoredAdminWalletRefund, StoredAdminWalletRefundPage, StoredAdminWalletRefundRequestPage, StoredAdminWalletTransaction, StoredAdminWalletTransactionPage, StoredWalletDailyUsageLedger, StoredWalletDailyUsageLedgerPage, StoredWalletSnapshot, WalletLookupKey, WalletMutationOutcome, WalletReadRepository, WalletWriteRepository, }; use aether_data::{ DataBackends, DataLayerError, DatabaseMaintenanceSummary, WalletDailyUsageAggregationInput, WalletDailyUsageAggregationResult, }; use aether_data_contracts::repository::background_tasks::{ BackgroundTaskListQuery, BackgroundTaskReadRepository, BackgroundTaskSummary, BackgroundTaskWriteRepository, StoredBackgroundTaskEvent, StoredBackgroundTaskRun, StoredBackgroundTaskRunPage, UpsertBackgroundTaskEvent, UpsertBackgroundTaskRun, }; use aether_data_contracts::repository::billing::{ AdminBillingCollectorRecord, AdminBillingCollectorWriteInput, AdminBillingMutationOutcome, AdminBillingPresetApplyResult, AdminBillingRuleRecord, AdminBillingRuleWriteInput, BillingPlanRecord, BillingPlanWriteInput, BillingReadRepository, PaymentGatewayConfigRecord, PaymentGatewayConfigWriteInput, StoredBillingModelContext, UserDailyQuotaAvailabilityRecord, UserPlanEntitlementRecord, }; use aether_data_contracts::repository::candidate_selection::{ MinimalCandidateSelectionReadRepository, StoredMinimalCandidateSelectionRow, StoredPoolKeyCandidateRowsByKeyIdsQuery, StoredPoolKeyCandidateRowsQuery, StoredRequestedModelCandidateRowsQuery, }; use aether_data_contracts::repository::candidates::{ PublicHealthStatusCount, PublicHealthTimelineBucket, RequestCandidateReadRepository, RequestCandidateWriteRepository, StoredRequestCandidate, UpsertRequestCandidateRecord, }; use aether_data_contracts::repository::global_models::{ AdminGlobalModelListQuery, AdminProviderModelListQuery, CreateAdminGlobalModelRecord, GlobalModelReadRepository, GlobalModelWriteRepository, PublicCatalogModelListQuery, PublicCatalogModelSearchQuery, PublicGlobalModelQuery, StoredAdminGlobalModel, StoredAdminGlobalModelPage, StoredAdminProviderModel, StoredProviderActiveGlobalModel, StoredProviderModelStats, StoredPublicCatalogModel, StoredPublicGlobalModel, StoredPublicGlobalModelPage, UpdateAdminGlobalModelRecord, UpsertAdminProviderModelRecord, }; use aether_data_contracts::repository::pool_scores::{ GetPoolMemberScoresByIdsQuery, ListPoolMemberProbeCandidatesQuery, ListPoolMemberScoresQuery, ListRankedPoolMembersQuery, PoolMemberHardState, PoolMemberIdentity, PoolMemberProbeAttempt, PoolMemberProbeResult, PoolMemberProbeStatus, PoolMemberScheduleFeedback, PoolMemberScoreWriteRepository, PoolScoreReadRepository, PoolScoreScope, StoredPoolMemberScore, UpsertPoolMemberScore, }; use aether_data_contracts::repository::provider_catalog::{ ProviderCatalogKeyListQuery, ProviderCatalogReadRepository, ProviderCatalogWriteRepository, StoredProviderCatalogEndpoint, StoredProviderCatalogKey, StoredProviderCatalogKeyMaintenanceSummary, StoredProviderCatalogKeyPage, StoredProviderCatalogKeyStats, StoredProviderCatalogProvider, }; use aether_data_contracts::repository::quota::{ ProviderQuotaReadRepository, ProviderQuotaWriteRepository, StoredProviderQuotaSnapshot, }; use aether_data_contracts::repository::routing_profiles::{ RoutingGroupReadRepository, RoutingGroupWriteRepository, }; use aether_data_contracts::repository::settlement::{ SettlementWriteRepository, StoredUsageSettlement, UsageSettlementInput, }; use aether_data_contracts::repository::usage::{ ApiKeyLastUsedDelta, ManagementTokenCounterDelta, PendingUsageCleanupSummary, ProxyNodeCounterDelta, StoredProviderUsageSummary, StoredRequestUsageAudit, UpsertUsageRecord, UsageReadRepository, UsageWriteRepository, }; use aether_data_contracts::repository::video_tasks::{ StoredVideoTask, UpsertVideoTask, VideoTaskLookupKey, VideoTaskModelCount, VideoTaskQueryFilter, VideoTaskReadRepository, VideoTaskStatusCount, VideoTaskWriteRepository, }; use aether_runtime_state::RuntimeQueueStore; pub(crate) use self::referrals::{ ReferralAdminStats, ReferralMutationStatus, ReferralRelationshipListQuery, ReferralRelationshipRecord, ReferralRewardConfig, ReferralRewardListQuery, ReferralRewardRecord, ReferralUserDashboard, }; #[derive(Clone, Default)] pub(crate) struct GatewayDataState { config: GatewayDataConfig, backends: Option, auth_api_key_reader: Option>, auth_api_key_writer: Option>, auth_module_reader: Option>, auth_module_writer: Option>, announcement_reader: Option>, announcement_writer: Option>, management_token_reader: Option>, management_token_writer: Option>, oauth_provider_reader: Option>, oauth_provider_writer: Option>, proxy_node_reader: Option>, proxy_node_writer: Option>, billing_reader: Option>, background_task_reader: Option>, background_task_writer: Option>, gemini_file_mapping_reader: Option>, gemini_file_mapping_writer: Option>, global_model_reader: Option>, global_model_writer: Option>, minimal_candidate_selection_reader: Option>, request_candidate_reader: Option>, request_candidate_writer: Option>, provider_catalog_reader: Option>, provider_catalog_writer: Option>, pool_score_reader: Option>, pool_score_writer: Option>, provider_quota_reader: Option>, provider_quota_writer: Option>, routing_group_reader: Option>, routing_group_writer: Option>, usage_reader: Option>, usage_writer: Option>, user_reader: Option>, user_preferences: Option>>>, usage_worker_queue: Option>, video_task_reader: Option>, video_task_writer: Option>, wallet_reader: Option>, wallet_writer: Option>, settlement_writer: Option>, system_config_values: Option>>>, system_config_value_cache: Arc)>>>, billing_model_context_cache: Arc, } #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub(super) enum BillingModelContextCacheKey { ByModelId { provider_id: String, provider_api_key_id: Option, model_id: String, }, ByGlobalModelName { provider_id: String, provider_api_key_id: Option, global_model_name: String, }, } #[derive(Default)] pub(super) struct BillingModelContextCacheState { pub(super) entries: RwLock)>>, pub(super) inflight: std::sync::Mutex>, pub(super) inflight_notify: tokio::sync::Notify, pub(super) next_inflight_token: std::sync::atomic::AtomicU64, } impl fmt::Debug for GatewayDataState { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("GatewayDataState") .field("config", &self.config) .field("has_backends", &self.backends.is_some()) .field( "has_auth_api_key_reader", &self.auth_api_key_reader.is_some(), ) .field( "has_auth_api_key_writer", &self.auth_api_key_writer.is_some(), ) .field("has_auth_module_reader", &self.auth_module_reader.is_some()) .field("has_auth_module_writer", &self.auth_module_writer.is_some()) .field( "has_announcement_reader", &self.announcement_reader.is_some(), ) .field( "has_announcement_writer", &self.announcement_writer.is_some(), ) .field( "has_management_token_reader", &self.management_token_reader.is_some(), ) .field( "has_management_token_writer", &self.management_token_writer.is_some(), ) .field( "has_oauth_provider_reader", &self.oauth_provider_reader.is_some(), ) .field( "has_oauth_provider_writer", &self.oauth_provider_writer.is_some(), ) .field("has_proxy_node_reader", &self.proxy_node_reader.is_some()) .field("has_proxy_node_writer", &self.proxy_node_writer.is_some()) .field("has_billing_reader", &self.billing_reader.is_some()) .field( "has_background_task_reader", &self.background_task_reader.is_some(), ) .field( "has_background_task_writer", &self.background_task_writer.is_some(), ) .field( "has_gemini_file_mapping_reader", &self.gemini_file_mapping_reader.is_some(), ) .field( "has_gemini_file_mapping_writer", &self.gemini_file_mapping_writer.is_some(), ) .field( "has_global_model_reader", &self.global_model_reader.is_some(), ) .field( "has_global_model_writer", &self.global_model_writer.is_some(), ) .field( "has_minimal_candidate_selection_reader", &self.minimal_candidate_selection_reader.is_some(), ) .field( "has_request_candidate_reader", &self.request_candidate_reader.is_some(), ) .field( "has_request_candidate_writer", &self.request_candidate_writer.is_some(), ) .field( "has_provider_catalog_reader", &self.provider_catalog_reader.is_some(), ) .field( "has_provider_catalog_writer", &self.provider_catalog_writer.is_some(), ) .field("has_pool_score_reader", &self.pool_score_reader.is_some()) .field("has_pool_score_writer", &self.pool_score_writer.is_some()) .field( "has_provider_quota_reader", &self.provider_quota_reader.is_some(), ) .field( "has_provider_quota_writer", &self.provider_quota_writer.is_some(), ) .field( "has_routing_group_reader", &self.routing_group_reader.is_some(), ) .field( "has_routing_group_writer", &self.routing_group_writer.is_some(), ) .field("has_usage_reader", &self.usage_reader.is_some()) .field("has_usage_writer", &self.usage_writer.is_some()) .field("has_user_preferences", &self.user_preferences.is_some()) .field("has_usage_worker_queue", &self.usage_worker_queue.is_some()) .field("has_video_task_reader", &self.video_task_reader.is_some()) .field("has_video_task_writer", &self.video_task_writer.is_some()) .field("has_wallet_reader", &self.wallet_reader.is_some()) .field("has_wallet_writer", &self.wallet_writer.is_some()) .field("has_settlement_writer", &self.settlement_writer.is_some()) .field( "has_system_config_values", &self.system_config_values.is_some(), ) .finish() } } mod auth; mod auth_api_key_cache; mod candidate_cache; mod catalog; mod core; mod integrations; mod models; mod pool_scores; mod provider_catalog_cache; mod referrals; mod request_candidate_cache; mod routing_group_cache; mod routing_profiles; mod runtime; #[cfg(test)] mod testing;