refactor: 移除 Python 后端源码,全面迁移至 Rust gateway 架构

- 删除全部 Python 源码 (src/) 及 Alembic 迁移脚本,归档至 _deprecated_py_src/
- 重构 Rust gateway ai_pipeline: 拆分 planner/finalize 模块,新增 contracts/adaptation 层
- 重组 handlers 模块为 admin/public/proxy/internal/shared 子模块结构
- 新增 executor 模块,引入 Rust 原生数据库迁移 (aether-data/migrations)
- 简化 CI/Docker 构建流程,移除 base image 二级构建,统一为单一 app image
- 移除 Python 相关基础设施文件 (entrypoint.sh, gunicorn_conf.py, Dockerfile.base)
This commit is contained in:
fawney19
2026-04-03 16:26:16 +08:00
parent 8f26e1a31f
commit 1d9c77522a
868 changed files with 1735 additions and 2433 deletions

View File

@@ -24,7 +24,7 @@ pub(crate) async fn maybe_execute_via_execution_runtime_stream(
if parts.method != http::Method::POST {
return Ok(None);
}
return crate::gateway::ai_pipeline::planner::maybe_execute_stream_local_path(
return crate::gateway::executor::maybe_execute_stream_local_path(
state, parts, body_bytes, trace_id, decision,
)
.await;
@@ -39,7 +39,7 @@ pub(crate) async fn maybe_execute_via_execution_runtime_stream(
{
return Ok(None);
}
crate::gateway::ai_pipeline::planner::maybe_execute_stream_local_path(
crate::gateway::executor::maybe_execute_stream_local_path(
state, parts, body_bytes, trace_id, decision,
)
.await

View File

@@ -9,9 +9,10 @@ use serde_json::json;
use tokio_util::codec::{FramedRead, LinesCodec};
use tracing::warn;
use crate::gateway::api::response::build_client_response_from_parts;
use crate::gateway::execution_runtime::ndjson::decode_stream_frame_ndjson;
use crate::gateway::execution_runtime::submission::{has_nested_error, strip_utf8_bom_and_ws};
use crate::gateway::{build_client_response_from_parts, GatewayControlDecision, GatewayError};
use crate::gateway::{GatewayControlDecision, GatewayError};
use crate::gateway::{
GEMINI_FILES_DOWNLOAD_PLAN_KIND, MAX_ERROR_BODY_BYTES, MAX_STREAM_PREFETCH_FRAMES,
OPENAI_VIDEO_CONTENT_PLAN_KIND,

View File

@@ -26,6 +26,9 @@ use self::execution_failures::{
use crate::gateway::ai_pipeline::runtime::{
maybe_build_provider_private_stream_normalizer, normalize_provider_private_report_context,
};
use crate::gateway::api::response::{
attach_control_metadata_headers, build_client_response, build_client_response_from_parts,
};
use crate::gateway::constants::{CONTROL_CANDIDATE_ID_HEADER, CONTROL_REQUEST_ID_HEADER};
use crate::gateway::execution_runtime::build_direct_execution_frame_stream;
#[cfg(test)]
@@ -36,18 +39,15 @@ use crate::gateway::execution_runtime::submission::{
use crate::gateway::execution_runtime::transport::{
DirectSyncExecutionRuntime, DirectUpstreamStreamExecution,
};
use crate::gateway::request_candidates::{
use crate::gateway::scheduler::{
current_unix_secs as current_request_candidate_unix_secs,
ensure_execution_request_candidate_slot, record_local_request_candidate_status,
};
use crate::gateway::scheduler::{
resolve_core_stream_direct_finalize_report_kind,
resolve_core_stream_error_finalize_report_kind, should_fallback_to_control_stream,
should_retry_next_local_candidate_stream,
};
use crate::gateway::usage::submit_stream_report;
use crate::gateway::{
attach_control_metadata_headers, build_client_response, build_client_response_from_parts,
maybe_build_stream_response_rewriter, AppState, GatewayControlDecision, GatewayError,
GatewayStreamReportRequest, GatewaySyncReportRequest, MAX_STREAM_PREFETCH_BYTES,
MAX_STREAM_PREFETCH_FRAMES,

View File

@@ -5,18 +5,16 @@ use base64::Engine as _;
use serde_json::{Map, Value};
use tracing::warn;
use crate::gateway::api::response::attach_control_metadata_headers;
use crate::gateway::execution_runtime::submission::{
resolve_core_error_background_report_kind, submit_local_core_error_or_sync_finalize,
};
use crate::gateway::request_candidates::{
use crate::gateway::scheduler::{
current_unix_secs as current_request_candidate_unix_secs,
record_report_request_candidate_status,
};
use crate::gateway::usage::submit_sync_report;
use crate::gateway::{
attach_control_metadata_headers, AppState, GatewayControlDecision, GatewayError,
GatewaySyncReportRequest,
};
use crate::gateway::{AppState, GatewayControlDecision, GatewayError, GatewaySyncReportRequest};
#[derive(Debug, Clone)]
pub(super) struct StreamFailureReport {

View File

@@ -1,12 +1,13 @@
use crate::gateway::ai_pipeline::adaptation::private_envelope::normalize_provider_private_response_value as unwrap_local_finalize_response_value;
use crate::gateway::ai_pipeline::conversion::{
build_core_error_body_for_client_format, core_error_background_report_kind,
core_error_default_client_api_format, is_core_error_finalize_kind, LocalCoreSyncErrorKind,
};
use crate::gateway::ai_pipeline::private_response::normalize_provider_private_response_value as unwrap_local_finalize_response_value;
use crate::gateway::api::response::build_client_response_from_parts;
use crate::gateway::usage::spawn_sync_report;
use crate::gateway::{
build_client_response_from_parts, maybe_compile_sync_finalize_response, AppState,
GatewayControlDecision, GatewayError, GatewaySyncReportRequest,
maybe_compile_sync_finalize_response, AppState, GatewayControlDecision, GatewayError,
GatewaySyncReportRequest,
};
use axum::body::Body;
use axum::http::Response;

View File

@@ -30,7 +30,7 @@ pub(crate) async fn maybe_execute_via_execution_runtime_sync(
if parts.method != http::Method::POST {
return Ok(None);
}
return crate::gateway::ai_pipeline::planner::maybe_execute_sync_local_path(
return crate::gateway::executor::maybe_execute_sync_local_path(
state, parts, body_bytes, trace_id, decision,
)
.await;
@@ -45,7 +45,7 @@ pub(crate) async fn maybe_execute_via_execution_runtime_sync(
{
return Ok(None);
}
crate::gateway::ai_pipeline::planner::maybe_execute_sync_local_path(
crate::gateway::executor::maybe_execute_sync_local_path(
state, parts, body_bytes, trace_id, decision,
)
.await

View File

@@ -6,24 +6,25 @@ use axum::http::Response;
use base64::Engine as _;
use tracing::warn;
use crate::gateway::ai_pipeline::contracts::implicit_sync_finalize_report_kind;
use crate::gateway::api::response::{
attach_control_metadata_headers, build_client_response, build_client_response_from_parts,
};
use crate::gateway::constants::{CONTROL_CANDIDATE_ID_HEADER, CONTROL_REQUEST_ID_HEADER};
#[cfg(test)]
use crate::gateway::execution_runtime::remote_compat::post_sync_plan_to_remote_execution_runtime;
use crate::gateway::execution_runtime::submission::submit_local_core_error_or_sync_finalize;
use crate::gateway::execution_runtime::transport::DirectSyncExecutionRuntime;
use crate::gateway::request_candidates::{
use crate::gateway::scheduler::{
current_unix_secs as current_request_candidate_unix_secs,
ensure_execution_request_candidate_slot, execution_error_details,
record_local_request_candidate_status,
};
use crate::gateway::scheduler::{
resolve_core_sync_error_finalize_report_kind, should_fallback_to_control_sync,
should_finalize_sync_response, should_retry_next_local_candidate_sync,
record_local_request_candidate_status, resolve_core_sync_error_finalize_report_kind,
should_fallback_to_control_sync, should_finalize_sync_response,
should_retry_next_local_candidate_sync,
};
use crate::gateway::usage::{spawn_sync_report, submit_sync_report};
use crate::gateway::video_tasks::VideoTaskSyncReportMode;
use crate::gateway::{
attach_control_metadata_headers, build_client_response, build_client_response_from_parts,
maybe_build_sync_finalize_outcome, AppState, GatewayControlDecision, GatewayError,
GatewaySyncReportRequest,
};
@@ -498,19 +499,6 @@ pub(crate) async fn execute_execution_runtime_sync(
)?))
}
fn resolve_implicit_sync_finalize_report_kind(plan_kind: &str) -> Option<&'static str> {
match plan_kind {
"openai_chat_sync" => Some("openai_chat_sync_finalize"),
"claude_chat_sync" => Some("claude_chat_sync_finalize"),
"gemini_chat_sync" => Some("gemini_chat_sync_finalize"),
"openai_cli_sync" => Some("openai_cli_sync_finalize"),
"openai_compact_sync" => Some("openai_compact_sync_finalize"),
"claude_cli_sync" => Some("claude_cli_sync_finalize"),
"gemini_cli_sync" => Some("gemini_cli_sync_finalize"),
_ => None,
}
}
#[allow(clippy::too_many_arguments)] // mirrors sync execution context
fn maybe_build_implicit_sync_finalize_outcome(
trace_id: &str,
@@ -527,7 +515,7 @@ fn maybe_build_implicit_sync_finalize_outcome(
return Ok(None);
}
let Some(report_kind) = resolve_implicit_sync_finalize_report_kind(plan_kind) else {
let Some(report_kind) = implicit_sync_finalize_report_kind(plan_kind) else {
return Ok(None);
};

View File

@@ -5,12 +5,10 @@ use axum::body::Body;
use axum::http::Response;
use serde_json::json;
use crate::gateway::api::response::build_client_response_from_parts;
use crate::gateway::video_tasks::{LocalVideoTaskSnapshot, VideoTaskSyncReportMode};
use crate::gateway::VideoTaskService;
use crate::gateway::{
build_client_response_from_parts, GatewayControlDecision, GatewayError,
GatewaySyncReportRequest,
};
use crate::gateway::{GatewayControlDecision, GatewayError, GatewaySyncReportRequest};
pub(crate) struct LocalVideoSyncSuccessOutcome {
pub(crate) response: Response<Body>,

View File

@@ -2,16 +2,16 @@ use aether_contracts::{ExecutionPlan, RequestBody};
use axum::http::Request;
use serde_json::json;
use crate::gateway::execution_runtime::submission::{
build_best_effort_local_core_error_body, resolve_core_error_background_report_kind,
resolve_core_success_background_report_kind,
};
use crate::gateway::ai_pipeline::planner::plan_builders::{
build_gemini_stream_plan_from_decision, build_gemini_sync_plan_from_decision,
build_openai_cli_stream_plan_from_decision, build_openai_cli_sync_plan_from_decision,
build_passthrough_sync_plan_from_decision, build_standard_stream_plan_from_decision,
build_standard_sync_plan_from_decision,
};
use crate::gateway::execution_runtime::submission::{
build_best_effort_local_core_error_body, resolve_core_error_background_report_kind,
resolve_core_success_background_report_kind,
};
use crate::gateway::{
resolve_local_sync_error_background_report_kind,
resolve_local_sync_success_background_report_kind, GatewayControlSyncDecisionResponse,