refactor: 大规模模块拆分与重组,新增 aether-admin crate

- 新建独立 aether-admin crate 承载 admin 相关共享契约与纯辅助函数
- 拆分 ai_pipeline 下 kiro/private_envelope/conversion/planner 等大文件为子模块目录
- 重组 admin handlers 各业务域(billing/oauth/provider/system/users 等)为目录结构,移除 shared.rs/builders.rs 等反模式
- 移除 ai_pipeline runtime adapters 旧实现(claude/openai/gemini/kiro/vertex/antigravity 等),改由 provider transport 统一承载
- 移除 control_facade/execution_facade/auth_snapshot_facade 等冗余 facade 层
- 拆分 query/billing 与 query/monitoring 模块、state/runtime/payments 与 security 模块
- 扩展架构测试覆盖 admin_billing/admin_model/admin_users 等新模块
- 删除 docs/architecture/refactor-execution-plan.md 已完成的执行计划文档
This commit is contained in:
fawney19
2026-04-09 00:10:38 +08:00
parent 4fb9882b54
commit 4fc95adfb9
663 changed files with 48471 additions and 40232 deletions

View File

@@ -3,9 +3,7 @@ use axum::http::Response;
use aether_data_contracts::repository::candidates::RequestCandidateStatus;
use crate::ai_pipeline::planner::plan_builders::{
LocalStreamPlanAndReport, LocalSyncPlanAndReport,
};
use crate::ai_pipeline_api::{LocalStreamPlanAndReport, LocalSyncPlanAndReport};
use crate::control::GatewayControlDecision;
use crate::execution_runtime::{execute_execution_runtime_stream, execute_execution_runtime_sync};
use crate::request_candidate_runtime::record_local_request_candidate_status;

View File

@@ -1 +0,0 @@
pub(crate) use crate::LocalExecutionRuntimeMissDiagnostic;

View File

@@ -1,11 +1,8 @@
pub(crate) mod candidate_loop;
mod diagnostics;
mod orchestration;
mod plan_fallback;
mod policy;
mod remote;
mod reports;
mod retries;
mod stream_path;
mod sync_path;

View File

@@ -1,22 +1,22 @@
use axum::body::Body;
use axum::http::Response;
use crate::ai_pipeline::planner;
use crate::ai_pipeline::planner::common::{
parse_direct_request_body, EXECUTION_RUNTIME_STREAM_DECISION_ACTION,
EXECUTION_RUNTIME_SYNC_DECISION_ACTION,
use crate::ai_pipeline_api::{
build_local_gemini_files_stream_plan_and_reports_for_kind,
build_local_gemini_files_sync_plan_and_reports_for_kind,
build_local_openai_chat_stream_plan_and_reports_for_kind,
build_local_openai_chat_sync_plan_and_reports_for_kind,
build_local_openai_cli_stream_plan_and_reports_for_kind,
build_local_openai_cli_sync_plan_and_reports_for_kind,
build_local_same_format_stream_plan_and_reports, build_local_same_format_sync_plan_and_reports,
build_local_video_sync_plan_and_reports_for_kind,
build_standard_family_stream_plan_and_reports, build_standard_family_sync_plan_and_reports,
parse_direct_request_body, resolve_claude_stream_spec, resolve_claude_sync_spec,
resolve_gemini_stream_spec, resolve_gemini_sync_spec, resolve_local_same_format_stream_spec,
resolve_local_same_format_sync_spec, set_local_openai_chat_execution_exhausted_diagnostic,
LocalStandardSpec, LocalStreamPlanAndReport, LocalSyncPlanAndReport,
EXECUTION_RUNTIME_STREAM_DECISION_ACTION, EXECUTION_RUNTIME_SYNC_DECISION_ACTION,
};
use crate::ai_pipeline::planner::passthrough::provider::plans::{
build_local_stream_plan_and_reports as build_same_format_stream_plan_and_reports,
build_local_sync_plan_and_reports as build_same_format_sync_plan_and_reports,
resolve_stream_spec as resolve_same_format_stream_spec,
resolve_sync_spec as resolve_same_format_sync_spec,
};
use crate::ai_pipeline::planner::standard::family::{
build_local_stream_plan_and_reports as build_standard_stream_plan_and_reports,
build_local_sync_plan_and_reports as build_standard_sync_plan_and_reports, LocalStandardSpec,
};
use crate::ai_pipeline::planner::standard::{claude, gemini, openai};
use crate::control::GatewayControlDecision;
use crate::executor::candidate_loop::{
execute_stream_plan_and_reports, execute_sync_plan_and_reports,
@@ -52,7 +52,7 @@ pub(crate) async fn maybe_execute_sync_via_local_decision(
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports = openai::chat::build_local_openai_chat_sync_plan_and_reports_for_kind(
let plan_and_reports = build_local_openai_chat_sync_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
@@ -74,7 +74,7 @@ pub(crate) async fn maybe_execute_sync_via_local_decision(
return Ok(Some(response));
}
openai::chat::set_local_openai_chat_execution_exhausted_diagnostic(
set_local_openai_chat_execution_exhausted_diagnostic(
state, trace_id, decision, plan_kind, body_json, plan_count,
);
Ok(None)
@@ -88,7 +88,7 @@ pub(crate) async fn maybe_execute_stream_via_local_decision(
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports = openai::chat::build_local_openai_chat_stream_plan_and_reports_for_kind(
let plan_and_reports = build_local_openai_chat_stream_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
@@ -104,7 +104,7 @@ pub(crate) async fn maybe_execute_stream_via_local_decision(
return Ok(Some(response));
}
openai::chat::set_local_openai_chat_execution_exhausted_diagnostic(
set_local_openai_chat_execution_exhausted_diagnostic(
state, trace_id, decision, plan_kind, body_json, plan_count,
);
Ok(None)
@@ -118,10 +118,11 @@ pub(crate) async fn maybe_execute_sync_via_local_openai_cli_decision(
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports = openai::cli::build_local_openai_cli_sync_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
let plan_and_reports: Vec<LocalSyncPlanAndReport> =
build_local_openai_cli_sync_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -145,10 +146,11 @@ pub(crate) async fn maybe_execute_stream_via_local_openai_cli_decision(
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports = openai::cli::build_local_openai_cli_stream_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
let plan_and_reports: Vec<LocalStreamPlanAndReport> =
build_local_openai_cli_stream_plan_and_reports_for_kind(
state, parts, trace_id, decision, body_json, plan_kind,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -169,9 +171,11 @@ pub(crate) async fn maybe_execute_sync_via_standard_family_decision(
return Ok(None);
};
let plan_and_reports =
build_standard_sync_plan_and_reports(state, parts, trace_id, decision, body_json, spec)
.await?;
let plan_and_reports: Vec<LocalSyncPlanAndReport> =
build_standard_family_sync_plan_and_reports(
state, parts, trace_id, decision, body_json, spec,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -200,9 +204,11 @@ pub(crate) async fn maybe_execute_stream_via_standard_family_decision(
return Ok(None);
};
let plan_and_reports =
build_standard_stream_plan_and_reports(state, parts, trace_id, decision, body_json, spec)
.await?;
let plan_and_reports: Vec<LocalStreamPlanAndReport> =
build_standard_family_stream_plan_and_reports(
state, parts, trace_id, decision, body_json, spec,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -225,7 +231,7 @@ pub(crate) async fn maybe_execute_sync_via_local_standard_decision(
decision,
body_json,
plan_kind,
claude::resolve_sync_spec,
resolve_claude_sync_spec,
)
.await?
{
@@ -239,7 +245,7 @@ pub(crate) async fn maybe_execute_sync_via_local_standard_decision(
decision,
body_json,
plan_kind,
gemini::resolve_sync_spec,
resolve_gemini_sync_spec,
)
.await
}
@@ -259,7 +265,7 @@ pub(crate) async fn maybe_execute_stream_via_local_standard_decision(
decision,
body_json,
plan_kind,
claude::resolve_stream_spec,
resolve_claude_stream_spec,
)
.await?
{
@@ -273,7 +279,7 @@ pub(crate) async fn maybe_execute_stream_via_local_standard_decision(
decision,
body_json,
plan_kind,
gemini::resolve_stream_spec,
resolve_gemini_stream_spec,
)
.await
}
@@ -286,13 +292,15 @@ pub(crate) async fn maybe_execute_sync_via_local_same_format_provider_decision(
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let Some(spec) = resolve_same_format_sync_spec(plan_kind) else {
let Some(spec) = resolve_local_same_format_sync_spec(plan_kind) else {
return Ok(None);
};
let plan_and_reports =
build_same_format_sync_plan_and_reports(state, parts, trace_id, decision, body_json, spec)
.await?;
let plan_and_reports: Vec<LocalSyncPlanAndReport> =
build_local_same_format_sync_plan_and_reports(
state, parts, trace_id, decision, body_json, spec,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -316,14 +324,15 @@ pub(crate) async fn maybe_execute_stream_via_local_same_format_provider_decision
body_json: &serde_json::Value,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let Some(spec) = resolve_same_format_stream_spec(plan_kind) else {
let Some(spec) = resolve_local_same_format_stream_spec(plan_kind) else {
return Ok(None);
};
let plan_and_reports = build_same_format_stream_plan_and_reports(
state, parts, trace_id, decision, body_json, spec,
)
.await?;
let plan_and_reports: Vec<LocalStreamPlanAndReport> =
build_local_same_format_stream_plan_and_reports(
state, parts, trace_id, decision, body_json, spec,
)
.await?;
if plan_and_reports.is_empty() {
return Ok(None);
}
@@ -341,8 +350,8 @@ pub(crate) async fn maybe_execute_sync_via_local_gemini_files_decision(
decision: &GatewayControlDecision,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports =
planner::specialized::files::build_local_gemini_files_sync_plan_and_reports_for_kind(
let plan_and_reports: Vec<LocalSyncPlanAndReport> =
build_local_gemini_files_sync_plan_and_reports_for_kind(
state,
parts,
body_json,
@@ -375,8 +384,8 @@ pub(crate) async fn maybe_execute_stream_via_local_gemini_files_decision(
decision: &GatewayControlDecision,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports =
planner::specialized::files::build_local_gemini_files_stream_plan_and_reports_for_kind(
let plan_and_reports: Vec<LocalStreamPlanAndReport> =
build_local_gemini_files_stream_plan_and_reports_for_kind(
state, parts, trace_id, decision, plan_kind,
)
.await?;
@@ -395,8 +404,8 @@ pub(crate) async fn maybe_execute_sync_via_local_video_decision(
decision: &GatewayControlDecision,
plan_kind: &str,
) -> Result<Option<Response<Body>>, GatewayError> {
let plan_and_reports =
planner::specialized::video::build_local_video_sync_plan_and_reports_for_kind(
let plan_and_reports: Vec<LocalSyncPlanAndReport> =
build_local_video_sync_plan_and_reports_for_kind(
state, parts, body_json, trace_id, decision, plan_kind,
)
.await?;

View File

@@ -1,7 +1,7 @@
use axum::body::Body;
use axum::http::Response;
use crate::ai_pipeline::planner::{maybe_build_stream_plan_payload, maybe_build_sync_plan_payload};
use crate::ai_pipeline_api::{maybe_build_stream_plan_payload, maybe_build_sync_plan_payload};
use crate::control::GatewayControlDecision;
use crate::execution_runtime::{execute_execution_runtime_stream, execute_execution_runtime_sync};
use crate::{AppState, GatewayControlPlanResponse, GatewayError, GatewayFallbackReason};

View File

@@ -1,3 +0,0 @@
pub(crate) use crate::ai_pipeline::planner::plan_builders::{
LocalStreamPlanAndReport, LocalSyncPlanAndReport,
};

View File

@@ -1 +0,0 @@
// Retry policy stays unchanged; executor uses existing execution_runtime behavior.

View File

@@ -2,10 +2,9 @@ use axum::body::{Body, Bytes};
use axum::http::Response;
use std::collections::BTreeMap;
use crate::ai_pipeline::planner::common::OPENAI_VIDEO_CONTENT_PLAN_KIND;
use crate::ai_pipeline::planner::{
use crate::ai_pipeline_api::{
is_matching_stream_request, resolve_execution_runtime_stream_plan_kind,
supports_stream_scheduler_decision_kind,
supports_stream_scheduler_decision_kind, OPENAI_VIDEO_CONTENT_PLAN_KIND,
};
use crate::api::response::build_client_response_from_parts;
use crate::control::GatewayControlDecision;

View File

@@ -2,13 +2,11 @@ use axum::body::{Body, Bytes};
use axum::http::Response;
use std::collections::BTreeMap;
use crate::ai_pipeline::planner::common::{
GEMINI_VIDEO_CANCEL_SYNC_PLAN_KIND, OPENAI_VIDEO_CANCEL_SYNC_PLAN_KIND,
OPENAI_VIDEO_DELETE_SYNC_PLAN_KIND, OPENAI_VIDEO_REMIX_SYNC_PLAN_KIND,
};
use crate::ai_pipeline::planner::{
use crate::ai_pipeline_api::{
is_matching_stream_request, resolve_execution_runtime_stream_plan_kind,
resolve_execution_runtime_sync_plan_kind, supports_sync_scheduler_decision_kind,
GEMINI_VIDEO_CANCEL_SYNC_PLAN_KIND, OPENAI_VIDEO_CANCEL_SYNC_PLAN_KIND,
OPENAI_VIDEO_DELETE_SYNC_PLAN_KIND, OPENAI_VIDEO_REMIX_SYNC_PLAN_KIND,
};
use crate::api::response::build_client_response_from_parts;
use crate::control::resolve_execution_runtime_auth_context;