feat(gateway): add Codex Live and OpenAI Realtime

Implement preflighted Live/Realtime WebSocket transports, protocol-aware authentication, usage auditing, UI filtering, and legacy Codex permission migration.
This commit is contained in:
ZheFox
2026-08-21 04:27:34 +08:00
parent fe38dcd294
commit 2c89202001
105 changed files with 7553 additions and 947 deletions
@@ -7,10 +7,12 @@ use aether_data_contracts::repository::usage::{
extract_provider_actual_service_tier_from_response,
extract_provider_reasoning_effort_from_body, extract_provider_service_tier_from_body,
normalize_provider_service_tier, resolve_provider_cache_ttl_minutes, UsageBodyCaptureState,
PROVIDER_ACTUAL_SERVICE_TIER_METADATA_KEY, PROVIDER_CACHE_TTL_MINUTES_METADATA_KEY,
PROVIDER_REASONING_EFFORT_METADATA_KEY, PROVIDER_SERVICE_TIER_METADATA_KEY,
LIVE_SESSION_METADATA_KEY, PROVIDER_ACTUAL_SERVICE_TIER_METADATA_KEY,
PROVIDER_CACHE_TTL_MINUTES_METADATA_KEY, PROVIDER_REASONING_EFFORT_METADATA_KEY,
PROVIDER_SERVICE_TIER_METADATA_KEY, REALTIME_SESSION_METADATA_KEY,
REQUESTED_REASONING_EFFORT_METADATA_KEY, ROUTING_CANDIDATE_SKIP_REASON_METADATA_KEY,
ROUTING_FAILURE_DIAGNOSTIC_METADATA_KEY, WEBSOCKET_MODE_METADATA_KEY,
ROUTING_FAILURE_DIAGNOSTIC_METADATA_KEY, USAGE_AVAILABLE_METADATA_KEY,
USAGE_PRICING_AVAILABLE_METADATA_KEY, WEBSOCKET_MODE_METADATA_KEY,
WEBSOCKET_TRANSPORT_METADATA_KEY,
};
use serde_json::{json, Map, Value};
@@ -132,6 +134,12 @@ pub(crate) fn retain_first_byte_request_metadata(value: Option<Value>) -> Option
| "upstream_is_stream"
| "client_session_affinity"
| "api_key_is_standalone"
| "websocket_mode"
| "websocket_transport"
| "usage_available"
| "usage_pricing_available"
| "live_session"
| "realtime_session"
| "request_path"
| "request_query_string"
| "request_path_and_query"
@@ -351,6 +359,10 @@ fn copy_allowed_metadata_fields(source: &Map<String, Value>, target: &mut Map<St
copy_bool(source, target, "api_key_is_standalone");
copy_bool(source, target, WEBSOCKET_MODE_METADATA_KEY);
copy_non_empty_string(source, target, WEBSOCKET_TRANSPORT_METADATA_KEY);
copy_bool(source, target, USAGE_AVAILABLE_METADATA_KEY);
copy_bool(source, target, USAGE_PRICING_AVAILABLE_METADATA_KEY);
copy_non_null_value(source, target, LIVE_SESSION_METADATA_KEY);
copy_non_null_value(source, target, REALTIME_SESSION_METADATA_KEY);
copy_non_empty_string(source, target, "request_path");
copy_non_empty_string(source, target, "request_query_string");
copy_non_empty_string(source, target, "request_path_and_query");
@@ -407,6 +419,10 @@ fn move_allowed_metadata_fields(mut source: Map<String, Value>, target: &mut Map
remove_bool(&mut source, target, "api_key_is_standalone");
remove_bool(&mut source, target, WEBSOCKET_MODE_METADATA_KEY);
remove_non_empty_string(&mut source, target, WEBSOCKET_TRANSPORT_METADATA_KEY);
remove_bool(&mut source, target, USAGE_AVAILABLE_METADATA_KEY);
remove_bool(&mut source, target, USAGE_PRICING_AVAILABLE_METADATA_KEY);
remove_non_null_value(&mut source, target, LIVE_SESSION_METADATA_KEY);
remove_non_null_value(&mut source, target, REALTIME_SESSION_METADATA_KEY);
remove_non_empty_string(&mut source, target, "request_path");
remove_non_empty_string(&mut source, target, "request_query_string");
remove_non_empty_string(&mut source, target, "request_path_and_query");