feat(admin): 完善代理节点与 OAuth 授权管理

This commit is contained in:
fawney19
2026-04-14 14:09:24 +08:00
parent 593640ac19
commit 861ae81ff0
44 changed files with 2757 additions and 365 deletions
@@ -1,6 +1,5 @@
use tracing::warn;
use crate::ai_pipeline::transport::resolve_transport_proxy_snapshot;
use crate::ai_pipeline::{
GatewayAuthApiKeySnapshot, GatewayProviderTransportSnapshot, PlannerAppState,
};
@@ -232,7 +231,11 @@ async fn resolve_tunnel_owner_affinity_from_transport(
state: PlannerAppState<'_>,
transport: &GatewayProviderTransportSnapshot,
) -> TunnelOwnerAffinityBucket {
let Some(proxy) = resolve_transport_proxy_snapshot(transport) else {
let Some(proxy) = state
.app()
.resolve_transport_proxy_snapshot_with_tunnel_affinity(transport)
.await
else {
return TunnelOwnerAffinityBucket::Neutral;
};
if proxy.enabled == Some(false) {
@@ -12,8 +12,7 @@ use crate::ai_pipeline::planner::report_context::{
};
use crate::ai_pipeline::planner::spec_metadata::local_same_format_provider_spec_metadata;
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::ai_pipeline::{ConversionMode, ExecutionStrategy};
use crate::{
@@ -56,8 +55,9 @@ pub(crate) async fn maybe_build_local_same_format_provider_decision_payload_for_
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToOwned::to_owned);
let proxy =
resolve_transport_proxy_snapshot_with_tunnel_affinity(state, &resolved.transport).await;
let proxy = state
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&resolved.transport)
.await;
let tls_profile = resolve_transport_tls_profile(&resolved.transport);
let mut extra_fields = serde_json::Map::new();
if resolved.is_kiro {
@@ -8,8 +8,7 @@ use crate::ai_pipeline::planner::report_context::{
};
use crate::ai_pipeline::planner::spec_metadata::local_gemini_files_spec_metadata;
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::ai_pipeline::{ConversionMode, ExecutionStrategy, PlannerAppState};
use crate::{AppState, GatewayControlSyncDecisionResponse};
@@ -53,9 +52,10 @@ pub(super) async fn maybe_build_local_gemini_files_decision_payload_for_candidat
} = attempt;
let candidate = eligible.candidate;
let transport = resolved.transport;
let proxy =
resolve_transport_proxy_snapshot_with_tunnel_affinity(planner_state.app(), &transport)
.await;
let proxy = planner_state
.app()
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&transport)
.await;
let tls_profile = resolve_transport_tls_profile(&transport);
let mut extra_fields = serde_json::Map::new();
extra_fields.insert("file_key_id".to_string(), json!(candidate.key_id));
@@ -6,8 +6,7 @@ use crate::ai_pipeline::planner::report_context::{
};
use crate::ai_pipeline::planner::spec_metadata::local_video_create_spec_metadata;
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::ai_pipeline::{ConversionMode, ExecutionStrategy, PlannerAppState};
use crate::{AppState, GatewayControlSyncDecisionResponse};
@@ -38,9 +37,10 @@ pub(super) async fn maybe_build_local_video_create_decision_payload_for_candidat
} = attempt;
let candidate = eligible.candidate;
let transport = resolved.transport;
let proxy =
resolve_transport_proxy_snapshot_with_tunnel_affinity(planner_state.app(), &transport)
.await;
let proxy = planner_state
.app()
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&transport)
.await;
let tls_profile = resolve_transport_tls_profile(&transport);
Some(build_local_execution_decision_response(
@@ -10,8 +10,7 @@ use crate::ai_pipeline::planner::report_context::{
};
use crate::ai_pipeline::planner::spec_metadata::local_standard_spec_metadata;
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::ai_pipeline::{ConversionMode, ExecutionStrategy};
use crate::{
@@ -69,11 +68,9 @@ pub(super) async fn maybe_build_local_standard_decision_payload_for_candidate(
provider_request_body: Some(resolved.provider_request_body.clone()),
provider_request_body_base64: None,
content_type: Some("application/json".to_string()),
proxy: resolve_transport_proxy_snapshot_with_tunnel_affinity(
state,
&resolved.transport,
)
.await,
proxy: state
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&resolved.transport)
.await,
tls_profile: resolve_transport_tls_profile(&resolved.transport),
timeouts: resolve_transport_execution_timeouts(&resolved.transport),
upstream_is_stream: resolved.upstream_is_stream,
@@ -5,8 +5,7 @@ use crate::ai_pipeline::planner::report_context::{
build_local_execution_report_context, LocalExecutionReportContextParts,
};
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::{
append_execution_contract_fields_to_value, append_local_failover_policy_to_value, AppState,
@@ -56,8 +55,9 @@ pub(crate) async fn maybe_build_local_openai_chat_decision_payload_for_candidate
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToOwned::to_owned);
let proxy =
resolve_transport_proxy_snapshot_with_tunnel_affinity(state, &resolved.transport).await;
let proxy = state
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&resolved.transport)
.await;
let tls_profile = resolve_transport_tls_profile(&resolved.transport);
let timeouts = resolve_transport_execution_timeouts(&resolved.transport);
@@ -9,8 +9,7 @@ use crate::ai_pipeline::planner::report_context::{
};
use crate::ai_pipeline::planner::spec_metadata::local_openai_cli_spec_metadata;
use crate::ai_pipeline::transport::{
resolve_transport_execution_timeouts, resolve_transport_proxy_snapshot_with_tunnel_affinity,
resolve_transport_tls_profile,
resolve_transport_execution_timeouts, resolve_transport_tls_profile,
};
use crate::{
append_execution_contract_fields_to_value, append_local_failover_policy_to_value, AppState,
@@ -57,8 +56,9 @@ pub(crate) async fn maybe_build_local_openai_cli_decision_payload_for_candidate(
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToOwned::to_owned);
let proxy =
resolve_transport_proxy_snapshot_with_tunnel_affinity(state, &resolved.transport).await;
let proxy = state
.resolve_transport_proxy_snapshot_with_tunnel_affinity(&resolved.transport)
.await;
let tls_profile = resolve_transport_tls_profile(&resolved.transport);
let timeouts = resolve_transport_execution_timeouts(&resolved.transport);
let mut extra_fields = serde_json::Map::new();