mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-09 02:47:45 +08:00
feat: 扩展 Rust gateway 全功能模块,新增 billing/crypto/wallet crate 及完整数据层
- 新增 aether-billing、aether-crypto、aether-wallet 独立 crate - aether-data 扩展 repository 层:announcements、auth_modules、billing、 candidate_selection、gemini_file_mappings、global_models、management_tokens、 oauth_providers、proxy_nodes、quota、users、wallet 等模块 - aether-gateway 新增 api/auth/billing/control/middleware/scheduler/usage/ video_tasks/hooks/maintenance/model_fetch/provider_transport 等功能模块 - 重构 executor decision 和 gateway state 为模块目录结构 - 新增 gateway router、frontdoor 路由层及对应测试 - Python 侧 API 路由重构,新增 compat/support 模块 - 前端 Logo 组件更新及 Provider 管理页面调整
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
fn request_wants_stream(
|
||||
request_context: &GatewayPublicRequestContext,
|
||||
body: &axum::body::Bytes,
|
||||
) -> bool {
|
||||
if request_context
|
||||
.request_path
|
||||
.contains(":streamGenerateContent")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if !request_context
|
||||
.request_content_type
|
||||
.as_deref()
|
||||
.map(|value| value.to_ascii_lowercase().contains("application/json"))
|
||||
.unwrap_or(false)
|
||||
|| body.is_empty()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
serde_json::from_slice::<serde_json::Value>(body)
|
||||
.ok()
|
||||
.and_then(|value| value.get("stream").and_then(|stream| stream.as_bool()))
|
||||
.unwrap_or(false)
|
||||
}
|
||||
|
||||
fn finalize_gateway_response(
|
||||
state: &AppState,
|
||||
mut response: Response<Body>,
|
||||
trace_id: &str,
|
||||
remote_addr: &std::net::SocketAddr,
|
||||
method: &http::Method,
|
||||
path_and_query: &str,
|
||||
control_decision: Option<&GatewayControlDecision>,
|
||||
execution_path: &'static str,
|
||||
started_at: &Instant,
|
||||
request_permit: Option<AdmissionPermit>,
|
||||
) -> Response<Body> {
|
||||
response.headers_mut().insert(
|
||||
HeaderName::from_static(EXECUTION_PATH_HEADER),
|
||||
HeaderValue::from_static(execution_path),
|
||||
);
|
||||
|
||||
let elapsed_ms = started_at.elapsed().as_millis() as u64;
|
||||
let python_dependency_reason = response
|
||||
.headers()
|
||||
.get(PYTHON_DEPENDENCY_REASON_HEADER)
|
||||
.and_then(|value| value.to_str().ok())
|
||||
.unwrap_or("none");
|
||||
info!(
|
||||
trace_id = %trace_id,
|
||||
remote_addr = %remote_addr,
|
||||
method = %method,
|
||||
path = %path_and_query,
|
||||
route_class = control_decision
|
||||
.and_then(|decision| decision.route_class.as_deref())
|
||||
.unwrap_or("passthrough"),
|
||||
execution_path,
|
||||
python_dependency_reason,
|
||||
status = response.status().as_u16(),
|
||||
elapsed_ms,
|
||||
"gateway completed request"
|
||||
);
|
||||
|
||||
record_shadow_result_non_blocking(
|
||||
state.clone(),
|
||||
trace_id,
|
||||
method,
|
||||
path_and_query,
|
||||
control_decision,
|
||||
execution_path,
|
||||
&response,
|
||||
);
|
||||
|
||||
maybe_hold_axum_response_permit(response, request_permit)
|
||||
}
|
||||
|
||||
fn finalize_gateway_response_with_context(
|
||||
state: &AppState,
|
||||
response: Response<Body>,
|
||||
remote_addr: &std::net::SocketAddr,
|
||||
request_context: &GatewayPublicRequestContext,
|
||||
execution_path: &'static str,
|
||||
started_at: &Instant,
|
||||
request_permit: Option<AdmissionPermit>,
|
||||
) -> Response<Body> {
|
||||
finalize_gateway_response(
|
||||
state,
|
||||
response,
|
||||
&request_context.trace_id,
|
||||
remote_addr,
|
||||
&request_context.request_method,
|
||||
&request_context.request_path_and_query(),
|
||||
request_context.control_decision.as_ref(),
|
||||
execution_path,
|
||||
started_at,
|
||||
request_permit,
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user