feat: wire OpenAI chat session affinity

This commit is contained in:
RWDai
2026-05-05 11:23:54 +08:00
parent e890a5c2f1
commit 51b191ad2c
6 changed files with 13 additions and 6 deletions

View File

@@ -138,6 +138,7 @@ pub(crate) async fn materialize_local_openai_chat_candidate_attempts(
"openai:chat", "openai:chat",
Some(&input.requested_model), Some(&input.requested_model),
Some(&input.auth_snapshot), Some(&input.auth_snapshot),
input.client_session_affinity.as_ref(),
input.required_capabilities.as_ref(), input.required_capabilities.as_ref(),
sticky_session_token.as_deref(), sticky_session_token.as_deref(),
input.request_auth_channel.as_deref(), input.request_auth_channel.as_deref(),
@@ -217,6 +218,7 @@ pub(crate) async fn build_local_openai_chat_candidate_attempt_source<'a>(
"openai:chat", "openai:chat",
Some(&input.requested_model), Some(&input.requested_model),
Some(&input.auth_snapshot), Some(&input.auth_snapshot),
input.client_session_affinity.as_ref(),
input.required_capabilities.as_ref(), input.required_capabilities.as_ref(),
sticky_session_token.as_deref(), sticky_session_token.as_deref(),
input.request_auth_channel.as_deref(), input.request_auth_channel.as_deref(),
@@ -294,6 +296,7 @@ pub(crate) async fn build_lazy_local_openai_chat_candidate_attempt_source<'a>(
&input.requested_model, &input.requested_model,
require_streaming, require_streaming,
&input.auth_snapshot, &input.auth_snapshot,
input.client_session_affinity.as_ref(),
input.required_capabilities.as_ref(), input.required_capabilities.as_ref(),
sticky_session_token.as_deref(), sticky_session_token.as_deref(),
input.request_auth_channel.as_deref(), input.request_auth_channel.as_deref(),

View File

@@ -139,7 +139,7 @@ pub(crate) async fn maybe_build_sync_local_decision_payload(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, false, state, parts, trace_id, decision, body_json, plan_kind, false,
) )
.await .await
else { else {
@@ -205,7 +205,7 @@ pub(crate) async fn maybe_build_stream_local_decision_payload(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, false, state, parts, trace_id, decision, body_json, plan_kind, false,
) )
.await .await
else { else {

View File

@@ -26,6 +26,7 @@ pub(crate) async fn list_local_openai_chat_candidates(
require_streaming, require_streaming,
input.required_capabilities.as_ref(), input.required_capabilities.as_ref(),
&input.auth_snapshot, &input.auth_snapshot,
input.client_session_affinity.as_ref(),
false, false,
LocalCandidatePreselectionKeyMode::ProviderEndpointKeyModel, LocalCandidatePreselectionKeyMode::ProviderEndpointKeyModel,
) )

View File

@@ -7,10 +7,12 @@ use crate::ai_serving::planner::decision_input::{
build_local_requested_model_decision_input, resolve_local_authenticated_decision_input, build_local_requested_model_decision_input, resolve_local_authenticated_decision_input,
}; };
use crate::ai_serving::resolve_local_decision_execution_runtime_auth_context; use crate::ai_serving::resolve_local_decision_execution_runtime_auth_context;
use crate::client_session_affinity::client_session_affinity_from_parts;
use crate::AppState; use crate::AppState;
pub(crate) async fn resolve_local_openai_chat_decision_input( pub(crate) async fn resolve_local_openai_chat_decision_input(
state: &AppState, state: &AppState,
parts: &http::request::Parts,
trace_id: &str, trace_id: &str,
decision: &GatewayControlDecision, decision: &GatewayControlDecision,
body_json: &serde_json::Value, body_json: &serde_json::Value,
@@ -106,5 +108,6 @@ pub(crate) async fn resolve_local_openai_chat_decision_input(
let mut input = build_local_requested_model_decision_input(resolved_input, requested_model); let mut input = build_local_requested_model_decision_input(resolved_input, requested_model);
input.request_auth_channel = decision.request_auth_channel.clone(); input.request_auth_channel = decision.request_auth_channel.clone();
input.client_session_affinity = client_session_affinity_from_parts(parts, Some(body_json));
Some(input) Some(input)
} }

View File

@@ -43,7 +43,7 @@ pub(crate) async fn build_local_openai_chat_stream_attempt_source<'a>(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, true, state, parts, trace_id, decision, body_json, plan_kind, true,
) )
.await .await
else { else {
@@ -163,7 +163,7 @@ pub(crate) async fn build_local_openai_chat_stream_plan_and_reports(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, true, state, parts, trace_id, decision, body_json, plan_kind, true,
) )
.await .await
else { else {

View File

@@ -52,7 +52,7 @@ pub(crate) async fn build_local_openai_chat_sync_attempt_source<'a>(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, true, state, parts, trace_id, decision, body_json, plan_kind, true,
) )
.await .await
else { else {
@@ -176,7 +176,7 @@ pub(crate) async fn build_local_openai_chat_sync_plan_and_reports(
} }
let Some(input) = resolve_local_openai_chat_decision_input( let Some(input) = resolve_local_openai_chat_decision_input(
state, trace_id, decision, body_json, plan_kind, true, state, parts, trace_id, decision, body_json, plan_kind, true,
) )
.await .await
else { else {