mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
refactor: extract provider pool abstractions
This commit is contained in:
@@ -1704,7 +1704,9 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
read_workspace_file("apps/aether-gateway/src/handlers/admin/provider/oauth/quota/mod.rs");
|
||||
for pattern in [
|
||||
"pub(crate) mod antigravity;",
|
||||
"pub(crate) mod chatgpt_web;",
|
||||
"pub(crate) mod codex;",
|
||||
"pub(crate) mod dispatch;",
|
||||
"pub(crate) mod kiro;",
|
||||
"pub(crate) mod shared;",
|
||||
] {
|
||||
@@ -1730,9 +1732,7 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
"apps/aether-gateway/src/handlers/admin/provider/endpoint_keys/quota.rs",
|
||||
);
|
||||
for pattern in [
|
||||
"use super::super::oauth::quota::antigravity::refresh_antigravity_provider_quota_locally;",
|
||||
"use super::super::oauth::quota::codex::refresh_codex_provider_quota_locally;",
|
||||
"use super::super::oauth::quota::kiro::refresh_kiro_provider_quota_locally;",
|
||||
"use super::super::oauth::quota::dispatch::refresh_provider_pool_quota_locally;",
|
||||
"use super::super::oauth::quota::shared::normalize_string_id_list;",
|
||||
] {
|
||||
assert!(
|
||||
@@ -1744,15 +1744,51 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
let oauth_runtime =
|
||||
read_workspace_file("apps/aether-gateway/src/handlers/admin/provider/oauth/runtime.rs");
|
||||
for pattern in [
|
||||
"use super::quota::antigravity::refresh_antigravity_provider_quota_locally;",
|
||||
"use super::quota::codex::refresh_codex_provider_quota_locally;",
|
||||
"use super::quota::kiro::refresh_kiro_provider_quota_locally;",
|
||||
"use super::quota::dispatch::refresh_provider_pool_quota_locally;",
|
||||
"use super::quota::shared::provider_type_supports_quota_refresh;",
|
||||
] {
|
||||
assert!(
|
||||
oauth_runtime.contains(pattern),
|
||||
"handlers/admin/provider/oauth/runtime.rs should import quota helper via explicit owner {pattern}"
|
||||
);
|
||||
}
|
||||
assert!(
|
||||
!oauth_runtime.contains("\"codex\" | \"kiro\" | \"antigravity\" | \"chatgpt_web\""),
|
||||
"handlers/admin/provider/oauth/runtime.rs should not hardcode quota refresh provider allow-list"
|
||||
);
|
||||
|
||||
let quota_shared = read_workspace_file(
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/shared.rs",
|
||||
);
|
||||
assert!(
|
||||
quota_shared.contains("aether_provider_pool::provider_pool_quota_metadata_provider_type("),
|
||||
"handlers/admin/provider/oauth/quota/shared.rs should delegate quota metadata provider detection to aether-provider-pool"
|
||||
);
|
||||
assert!(
|
||||
!quota_shared.contains("[\"codex\", \"kiro\", \"antigravity\", \"gemini_cli\", \"chatgpt_web\"]"),
|
||||
"handlers/admin/provider/oauth/quota/shared.rs should not hardcode quota metadata provider list"
|
||||
);
|
||||
|
||||
let quota_dispatch = read_workspace_file(
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/dispatch.rs",
|
||||
);
|
||||
for pattern in [
|
||||
"pub(crate) async fn refresh_provider_pool_quota_locally(",
|
||||
"const PROVIDER_QUOTA_REFRESH_HANDLERS:",
|
||||
"refresh_codex_provider_quota_locally",
|
||||
"refresh_kiro_provider_quota_locally",
|
||||
"refresh_antigravity_provider_quota_locally",
|
||||
"refresh_chatgpt_web_provider_quota_locally",
|
||||
] {
|
||||
assert!(
|
||||
quota_dispatch.contains(pattern),
|
||||
"handlers/admin/provider/oauth/quota/dispatch.rs should centralize quota refresh dispatch {pattern}"
|
||||
);
|
||||
}
|
||||
assert!(
|
||||
!quota_dispatch.contains("match provider_type.trim().to_ascii_lowercase().as_str()"),
|
||||
"handlers/admin/provider/oauth/quota/dispatch.rs should use provider handler registration instead of provider_type match"
|
||||
);
|
||||
|
||||
let quota_codex_mod = read_workspace_file(
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/codex/mod.rs",
|
||||
@@ -1799,14 +1835,13 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/codex/plan.rs",
|
||||
);
|
||||
for pattern in [
|
||||
"use super::parse::normalize_codex_plan_type;",
|
||||
"use crate::handlers::admin::provider::shared::payloads::CODEX_WHAM_USAGE_URL;",
|
||||
"pub(super) fn build_codex_refresh_headers(",
|
||||
"use aether_provider_pool::{build_codex_pool_quota_request, ProviderPoolQuotaRequestSpec};",
|
||||
"pub(super) fn build_codex_quota_request_spec(",
|
||||
"pub(super) async fn execute_codex_quota_plan(",
|
||||
] {
|
||||
assert!(
|
||||
quota_codex_plan.contains(pattern),
|
||||
"handlers/admin/provider/oauth/quota/codex/plan.rs should own codex quota execution helper {pattern}"
|
||||
"handlers/admin/provider/oauth/quota/codex/plan.rs should delegate codex quota request construction and own execution helper {pattern}"
|
||||
);
|
||||
}
|
||||
let quota_kiro_mod = read_workspace_file(
|
||||
@@ -1843,13 +1878,13 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/kiro/plan.rs",
|
||||
);
|
||||
for pattern in [
|
||||
"use super::super::shared::{execute_provider_quota_plan, ProviderQuotaExecutionOutcome};",
|
||||
"use crate::handlers::admin::provider::shared::payloads::{",
|
||||
"build_provider_quota_execution_plan",
|
||||
"use aether_provider_pool::{build_kiro_pool_quota_request, KiroPoolQuotaAuthInput};",
|
||||
"pub(super) async fn execute_kiro_quota_plan(",
|
||||
] {
|
||||
assert!(
|
||||
quota_kiro_plan.contains(pattern),
|
||||
"handlers/admin/provider/oauth/quota/kiro/plan.rs should own kiro quota execution helper {pattern}"
|
||||
"handlers/admin/provider/oauth/quota/kiro/plan.rs should delegate kiro quota request construction and own execution helper {pattern}"
|
||||
);
|
||||
}
|
||||
let quota_antigravity = read_workspace_file(
|
||||
@@ -1859,6 +1894,30 @@ fn admin_provider_oauth_quota_mod_stays_thin() {
|
||||
quota_antigravity.contains("use super::shared::{"),
|
||||
"handlers/admin/provider/oauth/quota/antigravity.rs should import common quota helpers from shared.rs"
|
||||
);
|
||||
assert!(
|
||||
quota_antigravity.contains("use aether_provider_pool::build_antigravity_pool_quota_request;"),
|
||||
"handlers/admin/provider/oauth/quota/antigravity.rs should delegate antigravity quota request construction to aether-provider-pool"
|
||||
);
|
||||
let quota_chatgpt_web = read_workspace_file(
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/quota/chatgpt_web.rs",
|
||||
);
|
||||
assert!(
|
||||
quota_chatgpt_web.contains("use aether_provider_pool::{")
|
||||
&& quota_chatgpt_web.contains("build_chatgpt_web_pool_quota_request")
|
||||
&& quota_chatgpt_web.contains("enrich_chatgpt_web_quota_metadata")
|
||||
&& quota_chatgpt_web.contains("normalize_chatgpt_web_image_quota_limit"),
|
||||
"handlers/admin/provider/oauth/quota/chatgpt_web.rs should delegate chatgpt_web quota request and metadata behavior to aether-provider-pool"
|
||||
);
|
||||
for forbidden in [
|
||||
"fn enrich_chatgpt_web_quota_metadata(",
|
||||
"fn normalize_chatgpt_web_image_quota_limit(",
|
||||
"fn chatgpt_web_auth_config_string(",
|
||||
] {
|
||||
assert!(
|
||||
!quota_chatgpt_web.contains(forbidden),
|
||||
"handlers/admin/provider/oauth/quota/chatgpt_web.rs should not own provider-pool chatgpt_web quota metadata helper {forbidden}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1926,6 +1985,34 @@ fn admin_provider_oauth_refresh_helpers_use_specific_local_owners() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn admin_provider_oauth_kiro_token_refresh_delegates_to_oauth_adapter() {
|
||||
let kiro_dispatch = read_workspace_file(
|
||||
"apps/aether-gateway/src/handlers/admin/provider/oauth/dispatch/kiro.rs",
|
||||
);
|
||||
assert!(
|
||||
kiro_dispatch.contains("use aether_oauth::provider::providers::KiroProviderOAuthAdapter;"),
|
||||
"gateway Kiro OAuth dispatch should depend on the shared provider OAuth adapter"
|
||||
);
|
||||
assert!(
|
||||
kiro_dispatch.contains(".refresh_auth_config("),
|
||||
"gateway Kiro OAuth dispatch should delegate token refresh to aether-oauth"
|
||||
);
|
||||
for forbidden in [
|
||||
"fn admin_provider_oauth_kiro_build_refresh_url(",
|
||||
"fn admin_provider_oauth_kiro_refresh_response_json(",
|
||||
"\"kiro_batch_refresh:social\"",
|
||||
"\"kiro_batch_refresh:idc\"",
|
||||
"\"refreshToken\": auth_config",
|
||||
"\"grantType\": \"refresh_token\"",
|
||||
] {
|
||||
assert!(
|
||||
!kiro_dispatch.contains(forbidden),
|
||||
"gateway Kiro OAuth dispatch should not own provider-specific token refresh detail {forbidden}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn admin_provider_oauth_dispatch_batch_mod_stays_thin() {
|
||||
let batch_mod = read_workspace_file(
|
||||
|
||||
@@ -1280,10 +1280,10 @@ fn ai_serving_planner_separates_local_candidate_resolution_from_ranking() {
|
||||
}
|
||||
for forbidden in [
|
||||
"pub(crate) async fn apply_local_execution_pool_scheduler(",
|
||||
"run_ai_pool_scheduler(",
|
||||
"fn ai_pool_candidate_facts(",
|
||||
"fn ai_pool_scheduling_config(",
|
||||
"fn ai_pool_runtime_state(",
|
||||
"run_pool_scheduler(",
|
||||
"fn pool_candidate_facts(",
|
||||
"fn pool_scheduling_config(",
|
||||
"fn pool_runtime_state(",
|
||||
] {
|
||||
assert!(
|
||||
!planner_pool_scheduler.contains(forbidden),
|
||||
@@ -1295,10 +1295,10 @@ fn ai_serving_planner_separates_local_candidate_resolution_from_ranking() {
|
||||
for pattern in [
|
||||
"pub(crate) async fn apply_local_execution_pool_scheduler(",
|
||||
"pub(crate) struct PoolKeyCursor",
|
||||
"run_ai_pool_scheduler(",
|
||||
"fn ai_pool_candidate_facts(",
|
||||
"fn ai_pool_scheduling_config(",
|
||||
"fn ai_pool_runtime_state(",
|
||||
"run_pool_scheduler(",
|
||||
"fn pool_candidate_facts(",
|
||||
"fn pool_scheduling_config(",
|
||||
"fn pool_runtime_state(",
|
||||
"DEFAULT_POOL_WINDOW_SIZE",
|
||||
"DEFAULT_POOL_PAGE_SIZE",
|
||||
"DEFAULT_POOL_MAX_SCAN",
|
||||
@@ -1351,21 +1351,218 @@ fn ai_serving_planner_separates_local_candidate_resolution_from_ranking() {
|
||||
);
|
||||
}
|
||||
|
||||
let serving_pool_scheduler =
|
||||
read_workspace_file("crates/aether-ai-serving/src/pool_scheduler.rs");
|
||||
let pool_core_lib = read_workspace_file("crates/aether-pool-core/src/lib.rs");
|
||||
for pattern in [
|
||||
"pub fn run_ai_pool_scheduler",
|
||||
"pub struct AiPoolCandidateInput",
|
||||
"pub struct AiPoolRuntimeState",
|
||||
"pub struct AiPoolSchedulingConfig",
|
||||
"run_pool_scheduler",
|
||||
"PoolCandidateInput",
|
||||
"PoolRuntimeState",
|
||||
"PoolSchedulingConfig",
|
||||
] {
|
||||
assert!(
|
||||
pool_core_lib.contains(pattern),
|
||||
"aether-pool-core lib.rs should expose pool scheduling primitive {pattern}"
|
||||
);
|
||||
}
|
||||
|
||||
let pool_core_scheduler = read_workspace_file("crates/aether-pool-core/src/scheduler.rs");
|
||||
for pattern in [
|
||||
"pub fn run_pool_scheduler",
|
||||
"fn schedule_pool_group",
|
||||
"fn build_pool_sort_vectors",
|
||||
"fn plan_priority_score(",
|
||||
"fn stable_hash_score(",
|
||||
] {
|
||||
assert!(
|
||||
serving_pool_scheduler.contains(pattern),
|
||||
"aether-ai-serving pool_scheduler.rs should own pool scheduling use-case primitive {pattern}"
|
||||
pool_core_scheduler.contains(pattern),
|
||||
"aether-pool-core scheduler.rs should own pool scheduling use-case primitive {pattern}"
|
||||
);
|
||||
}
|
||||
for forbidden in ["codex", "kiro", "chatgpt_web", "provider_type"] {
|
||||
assert!(
|
||||
!pool_core_scheduler.contains(forbidden) && !pool_core_lib.contains(forbidden),
|
||||
"aether-pool-core should stay provider-agnostic and not embed provider behavior {forbidden}"
|
||||
);
|
||||
}
|
||||
|
||||
let serving_lib = read_workspace_file("crates/aether-ai-serving/src/lib.rs");
|
||||
for forbidden in ["pub mod pool_scheduler;", "pub mod pool_scores;"] {
|
||||
assert!(
|
||||
!serving_lib.contains(forbidden),
|
||||
"aether-ai-serving should not own pool core module {forbidden}"
|
||||
);
|
||||
}
|
||||
|
||||
let provider_pool_lib = read_workspace_file("crates/aether-provider-pool/src/lib.rs");
|
||||
for pattern in [
|
||||
"mod capability;",
|
||||
"mod plan;",
|
||||
"mod presets;",
|
||||
"mod provider;",
|
||||
"mod quota;",
|
||||
"mod service;",
|
||||
"pub mod providers;",
|
||||
"pub use provider::{ProviderPoolAdapter, ProviderPoolMemberInput};",
|
||||
"pub use service::ProviderPoolService;",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_lib.contains(pattern),
|
||||
"aether-provider-pool lib.rs should stay a thin module/re-export root through {pattern}"
|
||||
);
|
||||
}
|
||||
|
||||
let provider_pool_provider = read_workspace_file("crates/aether-provider-pool/src/provider.rs");
|
||||
for pattern in [
|
||||
"pub trait ProviderPoolAdapter",
|
||||
"ProviderPoolMemberInput",
|
||||
"supports_quota_refresh",
|
||||
"quota_refresh_endpoint",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_provider.contains(pattern),
|
||||
"aether-provider-pool provider.rs should own adapter contract {pattern}"
|
||||
);
|
||||
}
|
||||
|
||||
let provider_pool_service = read_workspace_file("crates/aether-provider-pool/src/service.rs");
|
||||
for pattern in [
|
||||
"pub struct ProviderPoolService",
|
||||
"with_builtin_adapters",
|
||||
"AntigravityProviderPoolAdapter",
|
||||
"CodexProviderPoolAdapter",
|
||||
"KiroProviderPoolAdapter",
|
||||
"ChatGptWebProviderPoolAdapter",
|
||||
"CLAUDE_CODE_PROVIDER_POOL_ADAPTER",
|
||||
"GEMINI_CLI_PROVIDER_POOL_ADAPTER",
|
||||
"VERTEX_AI_PROVIDER_POOL_ADAPTER",
|
||||
"provider_types_for_capability",
|
||||
"supports_quota_refresh",
|
||||
"quota_refresh_endpoint_for_provider",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_service.contains(pattern),
|
||||
"aether-provider-pool service.rs should own adapter registry/service primitive {pattern}"
|
||||
);
|
||||
}
|
||||
assert!(
|
||||
!provider_pool_service.contains("match provider_type.trim().to_ascii_lowercase().as_str()"),
|
||||
"aether-provider-pool service.rs should delegate provider-specific behavior to adapters"
|
||||
);
|
||||
|
||||
let provider_pool_providers =
|
||||
read_workspace_file("crates/aether-provider-pool/src/providers/mod.rs");
|
||||
for pattern in [
|
||||
"pub mod default;",
|
||||
"pub mod unsupported;",
|
||||
"pub mod antigravity;",
|
||||
"pub mod codex;",
|
||||
"pub mod kiro;",
|
||||
"pub mod chatgpt_web;",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_providers.contains(pattern),
|
||||
"aether-provider-pool providers/mod.rs should expose provider-specific module {pattern}"
|
||||
);
|
||||
}
|
||||
for (path, patterns) in [
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/default.rs",
|
||||
vec!["DefaultProviderPoolAdapter"],
|
||||
),
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/antigravity.rs",
|
||||
vec!["AntigravityProviderPoolAdapter"],
|
||||
),
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/codex.rs",
|
||||
vec![
|
||||
"CodexProviderPoolAdapter",
|
||||
"recent_refresh",
|
||||
"quota_exhausted_from_bucket",
|
||||
],
|
||||
),
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/kiro.rs",
|
||||
vec!["KiroProviderPoolAdapter", "quota_exhausted_from_bucket"],
|
||||
),
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/chatgpt_web.rs",
|
||||
vec![
|
||||
"ChatGptWebProviderPoolAdapter",
|
||||
"build_chatgpt_web_pool_quota_request",
|
||||
"enrich_chatgpt_web_quota_metadata",
|
||||
"normalize_chatgpt_web_image_quota_limit",
|
||||
"quota_exhausted_from_bucket",
|
||||
],
|
||||
),
|
||||
(
|
||||
"crates/aether-provider-pool/src/providers/unsupported.rs",
|
||||
vec![
|
||||
"UnsupportedQuotaProviderPoolAdapter",
|
||||
"CLAUDE_CODE_PROVIDER_POOL_ADAPTER",
|
||||
"GEMINI_CLI_PROVIDER_POOL_ADAPTER",
|
||||
"VERTEX_AI_PROVIDER_POOL_ADAPTER",
|
||||
],
|
||||
),
|
||||
] {
|
||||
let source = read_workspace_file(path);
|
||||
for pattern in patterns {
|
||||
assert!(
|
||||
source.contains(pattern),
|
||||
"{path} should own provider-specific pool behavior {pattern}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let provider_pool_plan = read_workspace_file("crates/aether-provider-pool/src/plan.rs");
|
||||
for pattern in ["normalize_provider_plan_tier", "derive_plan_tier"] {
|
||||
assert!(
|
||||
provider_pool_plan.contains(pattern),
|
||||
"aether-provider-pool plan.rs should own provider plan-tier normalization primitive {pattern}"
|
||||
);
|
||||
}
|
||||
|
||||
let provider_pool_quota = read_workspace_file("crates/aether-provider-pool/src/quota.rs");
|
||||
for pattern in [
|
||||
"provider_pool_key_account_quota_exhausted",
|
||||
"provider_pool_member_quota_snapshot",
|
||||
"provider_pool_quota_metadata_updated_at",
|
||||
"provider_pool_quota_metadata_provider_type",
|
||||
"provider_pool_key_scheduling_label",
|
||||
"provider_pool_quota_snapshot_updated_at",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_quota.contains(pattern),
|
||||
"aether-provider-pool quota.rs should own provider quota/scheduling signal primitive {pattern}"
|
||||
);
|
||||
}
|
||||
|
||||
let provider_pool_presets = read_workspace_file("crates/aether-provider-pool/src/presets.rs");
|
||||
for pattern in [
|
||||
"normalize_provider_scheduling_presets",
|
||||
"build_admin_pool_scheduling_presets_payload",
|
||||
] {
|
||||
assert!(
|
||||
provider_pool_presets.contains(pattern),
|
||||
"aether-provider-pool presets.rs should own provider preset adaptation primitive {pattern}"
|
||||
);
|
||||
}
|
||||
for forbidden in [
|
||||
"run_pool_scheduler",
|
||||
"PoolSchedulerOutcome",
|
||||
"schedule_pool_group",
|
||||
"plan_priority_score(",
|
||||
] {
|
||||
let mut violations = Vec::new();
|
||||
for file in collect_workspace_rust_files("crates/aether-provider-pool/src") {
|
||||
let source = std::fs::read_to_string(&file).expect("source file should be readable");
|
||||
if source.contains(forbidden) {
|
||||
violations.push(file.display().to_string());
|
||||
}
|
||||
}
|
||||
assert!(
|
||||
violations.is_empty(),
|
||||
"aether-provider-pool should not own generic pool scheduler primitive {forbidden}:\n{}",
|
||||
violations.join("\n")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4302,7 +4302,7 @@ async fn gateway_batch_imports_admin_provider_oauth_kiro_via_execution_runtime_p
|
||||
.and_then(|proxy| proxy.node_id.as_deref()),
|
||||
Some("proxy-node-kiro-batch-runtime")
|
||||
);
|
||||
if plan.request_id == "kiro_batch_refresh:social" {
|
||||
if plan.request_id == "provider-oauth:kiro-social-refresh" {
|
||||
assert_eq!(plan.url, "https://oauth.example/refreshToken");
|
||||
assert_eq!(
|
||||
plan.headers
|
||||
|
||||
Reference in New Issue
Block a user