mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
refactor ai serving modules and crates
This commit is contained in:
@@ -90,7 +90,7 @@ pub(super) async fn maybe_handle(
|
||||
let endpoint = match normalized_provider_type.as_str() {
|
||||
"codex" => endpoints.into_iter().find(|endpoint| {
|
||||
endpoint.is_active
|
||||
&& crate::ai_pipeline::is_openai_responses_format(&endpoint.api_format)
|
||||
&& crate::ai_serving::is_openai_responses_format(&endpoint.api_format)
|
||||
}),
|
||||
"antigravity" => endpoints.into_iter().find(|endpoint| {
|
||||
endpoint.is_active
|
||||
|
||||
@@ -228,7 +228,7 @@ pub(super) async fn handle_admin_provider_oauth_complete_key(
|
||||
.await?;
|
||||
if let Some(endpoint) = endpoints.into_iter().find(|endpoint| {
|
||||
endpoint.is_active
|
||||
&& crate::ai_pipeline::is_openai_responses_format(&endpoint.api_format)
|
||||
&& crate::ai_serving::is_openai_responses_format(&endpoint.api_format)
|
||||
}) {
|
||||
let refreshed_key = state
|
||||
.read_provider_catalog_keys_by_ids(std::slice::from_ref(&key_id))
|
||||
|
||||
@@ -19,7 +19,7 @@ pub(crate) fn provider_oauth_runtime_endpoint_for_provider(
|
||||
.iter()
|
||||
.find(|endpoint| {
|
||||
endpoint.is_active
|
||||
&& crate::ai_pipeline::is_openai_responses_format(&endpoint.api_format)
|
||||
&& crate::ai_serving::is_openai_responses_format(&endpoint.api_format)
|
||||
})
|
||||
.cloned(),
|
||||
"antigravity" => endpoints
|
||||
|
||||
@@ -10,7 +10,7 @@ use super::response::{
|
||||
ADMIN_PROVIDER_QUERY_PROVIDER_ID_REQUIRED_DETAIL,
|
||||
ADMIN_PROVIDER_QUERY_PROVIDER_NOT_FOUND_DETAIL,
|
||||
};
|
||||
use crate::ai_pipeline::{maybe_build_sync_finalize_outcome, GatewayControlDecision};
|
||||
use crate::ai_serving::{maybe_build_sync_finalize_outcome, GatewayControlDecision};
|
||||
use crate::execution_runtime;
|
||||
use crate::handlers::admin::request::{AdminAppState, AdminGatewayProviderTransportSnapshot};
|
||||
use crate::model_fetch::ModelFetchRuntimeState;
|
||||
@@ -289,7 +289,7 @@ fn provider_query_key_supports_endpoint(
|
||||
}
|
||||
|
||||
fn provider_query_normalize_api_format_alias(value: &str) -> String {
|
||||
crate::ai_pipeline::normalize_api_format_alias(value)
|
||||
crate::ai_serving::normalize_api_format_alias(value)
|
||||
}
|
||||
|
||||
fn provider_query_transport_supports_standard_test_execution(
|
||||
@@ -297,7 +297,7 @@ fn provider_query_transport_supports_standard_test_execution(
|
||||
transport: &AdminGatewayProviderTransportSnapshot,
|
||||
api_format: &str,
|
||||
) -> bool {
|
||||
match crate::ai_pipeline::normalize_api_format_alias(api_format).as_str() {
|
||||
match crate::ai_serving::normalize_api_format_alias(api_format).as_str() {
|
||||
"openai:chat" => {
|
||||
crate::provider_transport::policy::supports_local_openai_chat_transport(transport)
|
||||
}
|
||||
@@ -860,7 +860,7 @@ async fn provider_query_execute_kiro_test_candidate(
|
||||
provider_query_extract_error_message(&result)
|
||||
} else if response_body.is_none()
|
||||
&& provider_query_decode_execution_body(&result)
|
||||
.is_some_and(|body| crate::ai_pipeline::stream_body_contains_error_event(&body))
|
||||
.is_some_and(|body| crate::ai_serving::stream_body_contains_error_event(&body))
|
||||
{
|
||||
Some("Kiro upstream returned embedded stream error".to_string())
|
||||
} else {
|
||||
@@ -930,11 +930,11 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
|
||||
let provider_api_format = candidate.endpoint.api_format.as_str();
|
||||
let normalized_provider_api_format =
|
||||
crate::ai_pipeline::normalize_api_format_alias(provider_api_format);
|
||||
crate::ai_serving::normalize_api_format_alias(provider_api_format);
|
||||
let provider_request_body = match normalized_provider_api_format.as_str() {
|
||||
"openai:chat" => {
|
||||
let Some(mut provider_request_body) =
|
||||
crate::ai_pipeline::build_local_openai_chat_request_body(
|
||||
crate::ai_serving::build_local_openai_chat_request_body(
|
||||
&request_body,
|
||||
&candidate.effective_model,
|
||||
false,
|
||||
@@ -959,7 +959,7 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
}
|
||||
"claude:messages" | "gemini:generate_content" => {
|
||||
let Some(mut provider_request_body) =
|
||||
crate::ai_pipeline::build_cross_format_openai_chat_request_body(
|
||||
crate::ai_serving::build_cross_format_openai_chat_request_body(
|
||||
&request_body,
|
||||
&candidate.effective_model,
|
||||
normalized_provider_api_format.as_str(),
|
||||
@@ -985,7 +985,7 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
}
|
||||
"openai:responses" => {
|
||||
let Some(mut provider_request_body) =
|
||||
crate::ai_pipeline::build_cross_format_openai_chat_request_body(
|
||||
crate::ai_serving::build_cross_format_openai_chat_request_body(
|
||||
&request_body,
|
||||
&candidate.effective_model,
|
||||
normalized_provider_api_format.as_str(),
|
||||
@@ -1007,14 +1007,14 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
format!("Provider request body rules rejected {provider_api_format}"),
|
||||
));
|
||||
}
|
||||
crate::ai_pipeline::apply_codex_openai_responses_special_body_edits(
|
||||
crate::ai_serving::apply_codex_openai_responses_special_body_edits(
|
||||
&mut provider_request_body,
|
||||
transport.provider.provider_type.as_str(),
|
||||
provider_api_format,
|
||||
transport.endpoint.body_rules.as_ref(),
|
||||
Some(candidate.key.id.as_str()),
|
||||
);
|
||||
crate::ai_pipeline::apply_openai_responses_compact_special_body_edits(
|
||||
crate::ai_serving::apply_openai_responses_compact_special_body_edits(
|
||||
&mut provider_request_body,
|
||||
provider_api_format,
|
||||
);
|
||||
@@ -1036,13 +1036,13 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
None
|
||||
};
|
||||
let oauth_auth =
|
||||
match crate::ai_pipeline::normalize_api_format_alias(provider_api_format).as_str() {
|
||||
match crate::ai_serving::normalize_api_format_alias(provider_api_format).as_str() {
|
||||
"openai:chat" | "openai:responses" | "claude:messages" | "gemini:generate_content" => {
|
||||
state.resolve_local_oauth_header_auth(&transport).await?
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
let auth = match crate::ai_pipeline::normalize_api_format_alias(provider_api_format).as_str() {
|
||||
let auth = match crate::ai_serving::normalize_api_format_alias(provider_api_format).as_str() {
|
||||
"openai:chat" | "openai:responses" => {
|
||||
crate::provider_transport::auth::resolve_local_openai_bearer_auth(&transport)
|
||||
.or(oauth_auth)
|
||||
@@ -1156,8 +1156,8 @@ async fn provider_query_execute_standard_test_candidate(
|
||||
response_body: None,
|
||||
});
|
||||
}
|
||||
if crate::ai_pipeline::is_openai_responses_format(provider_api_format) {
|
||||
crate::ai_pipeline::apply_codex_openai_responses_special_headers(
|
||||
if crate::ai_serving::is_openai_responses_format(provider_api_format) {
|
||||
crate::ai_serving::apply_codex_openai_responses_special_headers(
|
||||
&mut request_headers,
|
||||
&provider_request_body,
|
||||
&parts.headers,
|
||||
@@ -1264,7 +1264,7 @@ fn provider_query_prefers_chat_standard_test_api_format(api_format: &str) -> boo
|
||||
|
||||
fn provider_query_supports_cli_standard_test_api_format(api_format: &str) -> bool {
|
||||
matches!(
|
||||
crate::ai_pipeline::normalize_api_format_alias(api_format).as_str(),
|
||||
crate::ai_serving::normalize_api_format_alias(api_format).as_str(),
|
||||
"openai:responses" | "claude:messages" | "gemini:generate_content"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ pub(crate) fn normalize_api_format_list(values: Vec<String>) -> Vec<String> {
|
||||
let mut seen = BTreeSet::new();
|
||||
let mut normalized = Vec::new();
|
||||
for value in values {
|
||||
let canonical = crate::ai_pipeline::normalize_api_format_alias(&value);
|
||||
let canonical = crate::ai_serving::normalize_api_format_alias(&value);
|
||||
if seen.insert(canonical.clone()) {
|
||||
normalized.push(canonical);
|
||||
}
|
||||
@@ -36,7 +36,7 @@ pub(crate) fn normalize_api_format_json_object_keys(
|
||||
};
|
||||
let mut normalized = serde_json::Map::new();
|
||||
for (key, value) in map {
|
||||
let canonical = crate::ai_pipeline::normalize_api_format_alias(&key);
|
||||
let canonical = crate::ai_serving::normalize_api_format_alias(&key);
|
||||
normalized.insert(canonical, value);
|
||||
}
|
||||
Ok(Some(serde_json::Value::Object(normalized)))
|
||||
@@ -56,7 +56,7 @@ pub(crate) fn normalize_auth_type_by_format(
|
||||
let allowed = api_formats.iter().cloned().collect::<BTreeSet<_>>();
|
||||
let mut normalized = serde_json::Map::new();
|
||||
for (key, value) in map {
|
||||
let canonical = crate::ai_pipeline::normalize_api_format_alias(&key);
|
||||
let canonical = crate::ai_serving::normalize_api_format_alias(&key);
|
||||
if !allowed.is_empty() && !allowed.contains(&canonical) {
|
||||
return Err(format!("{field_name} 包含未选择的 API 格式: {canonical}"));
|
||||
}
|
||||
|
||||
@@ -350,7 +350,7 @@ fn endpoint_matches_fixed_provider_template(
|
||||
}
|
||||
|
||||
fn normalize_api_format_alias(value: &str) -> String {
|
||||
crate::ai_pipeline::normalize_api_format_alias(value)
|
||||
crate::ai_serving::normalize_api_format_alias(value)
|
||||
}
|
||||
|
||||
fn api_format_matches(left: &str, right: &str) -> bool {
|
||||
|
||||
@@ -38,7 +38,7 @@ fn normalize_provider_model_mappings_api_formats(
|
||||
let normalized = array
|
||||
.iter()
|
||||
.filter_map(serde_json::Value::as_str)
|
||||
.map(crate::ai_pipeline::normalize_api_format_alias)
|
||||
.map(crate::ai_serving::normalize_api_format_alias)
|
||||
.filter(|format| seen.insert(format.clone()))
|
||||
.map(serde_json::Value::String)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
@@ -313,7 +313,7 @@ impl<'a> AdminAppState<'a> {
|
||||
|
||||
let provider_type = provider.provider_type.trim().to_ascii_lowercase();
|
||||
if provider_type == "codex"
|
||||
&& crate::ai_pipeline::is_openai_responses_format(&existing_endpoint.api_format)
|
||||
&& crate::ai_serving::is_openai_responses_format(&existing_endpoint.api_format)
|
||||
{
|
||||
let has_config_in_payload = fields.contains("config");
|
||||
let config_payload = if has_config_in_payload {
|
||||
|
||||
@@ -8,7 +8,7 @@ use super::{
|
||||
maybe_build_internal_finalize_video_response, parse_internal_tunnel_heartbeat_request,
|
||||
parse_internal_tunnel_node_status_request,
|
||||
};
|
||||
use crate::ai_pipeline_api;
|
||||
use crate::ai_serving::api;
|
||||
use crate::constants::{
|
||||
CONTROL_EXECUTED_HEADER, EXECUTION_PATH_EXECUTION_RUNTIME_STREAM,
|
||||
EXECUTION_PATH_EXECUTION_RUNTIME_SYNC,
|
||||
@@ -228,7 +228,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
.into_response(),
|
||||
));
|
||||
}
|
||||
let Some(mut local_payload) = ai_pipeline_api::maybe_build_sync_decision_payload(
|
||||
let Some(mut local_payload) = api::maybe_build_sync_decision_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -330,7 +330,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
.into_response(),
|
||||
));
|
||||
}
|
||||
let Some(mut local_payload) = ai_pipeline_api::maybe_build_stream_decision_payload(
|
||||
let Some(mut local_payload) = api::maybe_build_stream_decision_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -412,7 +412,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
resolved.auth_context = Some(auth_context);
|
||||
resolved.local_auth_rejection = None;
|
||||
}
|
||||
if let Some(mut planned) = ai_pipeline_api::maybe_build_sync_plan_payload(
|
||||
if let Some(mut planned) = api::maybe_build_sync_plan_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -479,7 +479,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
resolved.auth_context = Some(auth_context);
|
||||
resolved.local_auth_rejection = None;
|
||||
}
|
||||
if let Some(mut planned) = ai_pipeline_api::maybe_build_stream_plan_payload(
|
||||
if let Some(mut planned) = api::maybe_build_stream_plan_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -550,7 +550,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
resolved.auth_context = Some(auth_context);
|
||||
resolved.local_auth_rejection = None;
|
||||
}
|
||||
if let Some(plan_payload) = ai_pipeline_api::maybe_build_sync_plan_payload(
|
||||
if let Some(plan_payload) = api::maybe_build_sync_plan_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -634,7 +634,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
resolved.auth_context = Some(auth_context);
|
||||
resolved.local_auth_rejection = None;
|
||||
}
|
||||
if let Some(plan_payload) = ai_pipeline_api::maybe_build_stream_plan_payload(
|
||||
if let Some(plan_payload) = api::maybe_build_stream_plan_payload(
|
||||
state,
|
||||
&parts,
|
||||
trace_id.as_str(),
|
||||
@@ -741,7 +741,7 @@ pub(crate) async fn maybe_build_local_internal_proxy_response_impl(
|
||||
)));
|
||||
};
|
||||
let trace_id = payload.trace_id.clone();
|
||||
if let Some(outcome) = ai_pipeline_api::maybe_build_sync_finalize_outcome(
|
||||
if let Some(outcome) = api::maybe_build_sync_finalize_outcome(
|
||||
trace_id.as_str(),
|
||||
&synthetic_decision,
|
||||
&payload,
|
||||
|
||||
@@ -5,7 +5,7 @@ use self::local::{
|
||||
};
|
||||
use super::internal::resolve_local_proxy_execution_path;
|
||||
pub(crate) use super::public::matches_model_mapping_for_models;
|
||||
use crate::ai_pipeline_api::{
|
||||
use crate::ai_serving::api::{
|
||||
aggregate_claude_stream_sync_response, aggregate_gemini_stream_sync_response,
|
||||
aggregate_openai_chat_stream_sync_response, aggregate_openai_responses_stream_sync_response,
|
||||
maybe_bridge_standard_sync_json_to_stream,
|
||||
@@ -466,7 +466,7 @@ fn aggregate_sync_sse_response_for_client(
|
||||
.as_deref()
|
||||
.map(str::trim)
|
||||
.filter(|value| !value.is_empty());
|
||||
match api_format.map(crate::ai_pipeline::normalize_api_format_alias) {
|
||||
match api_format.map(crate::ai_serving::normalize_api_format_alias) {
|
||||
Some(value) if value.eq_ignore_ascii_case("openai:chat") => {
|
||||
aggregate_openai_chat_stream_sync_response(body)
|
||||
}
|
||||
@@ -531,7 +531,7 @@ fn resolve_affinity_forward_client_api_format(
|
||||
.as_deref()
|
||||
.map(str::trim)
|
||||
.filter(|value| !value.is_empty());
|
||||
match api_format.map(crate::ai_pipeline::normalize_api_format_alias) {
|
||||
match api_format.map(crate::ai_serving::normalize_api_format_alias) {
|
||||
Some(value) if value.eq_ignore_ascii_case("openai:chat") => Some("openai:chat"),
|
||||
Some(value) if value.eq_ignore_ascii_case("openai:responses") => Some("openai:responses"),
|
||||
Some(value) if value.eq_ignore_ascii_case("openai:responses:compact") => {
|
||||
|
||||
@@ -12,7 +12,7 @@ pub(crate) fn models_api_format(request_context: &GatewayPublicRequestContext) -
|
||||
.and_then(|decision| decision.auth_endpoint_signature.as_deref())
|
||||
.map(str::trim)
|
||||
.filter(|signature| !signature.is_empty())?;
|
||||
match crate::ai_pipeline::normalize_api_format_alias(signature).as_str() {
|
||||
match crate::ai_serving::normalize_api_format_alias(signature).as_str() {
|
||||
"openai:chat" => Some("openai:chat"),
|
||||
"openai:responses" => Some("openai:responses"),
|
||||
"openai:responses:compact" => Some("openai:responses:compact"),
|
||||
@@ -33,7 +33,7 @@ const MODELS_CROSS_FORMAT_QUERY_API_FORMATS: &[&str] = &[
|
||||
];
|
||||
|
||||
pub(super) fn models_query_api_formats(api_format: &str) -> &'static [&'static str] {
|
||||
match crate::ai_pipeline::normalize_api_format_alias(api_format).as_str() {
|
||||
match crate::ai_serving::normalize_api_format_alias(api_format).as_str() {
|
||||
"openai:chat"
|
||||
| "openai:responses"
|
||||
| "openai:responses:compact"
|
||||
|
||||
@@ -92,12 +92,12 @@ pub(super) async fn maybe_build_local_test_connection_route_response(
|
||||
let format_value = if endpoint.api_format.trim().is_empty() {
|
||||
"claude:messages".to_string()
|
||||
} else {
|
||||
crate::ai_pipeline::normalize_api_format_alias(&endpoint.api_format)
|
||||
crate::ai_serving::normalize_api_format_alias(&endpoint.api_format)
|
||||
};
|
||||
(endpoint, format_value)
|
||||
};
|
||||
|
||||
let format_value = crate::ai_pipeline::normalize_api_format_alias(&format_value);
|
||||
let format_value = crate::ai_serving::normalize_api_format_alias(&format_value);
|
||||
if !matches!(
|
||||
format_value.as_str(),
|
||||
"openai:chat" | "claude:messages" | "gemini:generate_content"
|
||||
|
||||
@@ -213,7 +213,7 @@ fn users_me_usage_api_format_defaults_to_non_stream(item: &StoredRequestUsageAud
|
||||
return false;
|
||||
};
|
||||
matches!(
|
||||
crate::ai_pipeline::normalize_api_format_alias(value).as_str(),
|
||||
crate::ai_serving::normalize_api_format_alias(value).as_str(),
|
||||
"openai:chat"
|
||||
| "openai:responses"
|
||||
| "openai:responses:compact"
|
||||
|
||||
@@ -33,7 +33,7 @@ pub(crate) fn provider_catalog_key_supports_format(
|
||||
}
|
||||
formats
|
||||
.iter()
|
||||
.any(|candidate| crate::ai_pipeline::api_format_alias_matches(candidate, api_format))
|
||||
.any(|candidate| crate::ai_serving::api_format_alias_matches(candidate, api_format))
|
||||
}
|
||||
|
||||
pub(crate) fn decrypt_catalog_secret_with_fallbacks(
|
||||
|
||||
Reference in New Issue
Block a user