mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-05 00:47:48 +08:00
fix: extract nested provider response models
This commit is contained in:
@@ -242,8 +242,10 @@ impl WireOverrides {
|
||||
metadata,
|
||||
request_body,
|
||||
data.request_body_state,
|
||||
data.api_format.as_deref(),
|
||||
data.response_body.as_ref(),
|
||||
data.response_body_state,
|
||||
data.endpoint_api_format.as_deref(),
|
||||
);
|
||||
// Billing reads raw-body TTL before metadata regardless of capture state.
|
||||
// Preserve that precedence independently of reasoning and tier authority.
|
||||
|
||||
@@ -90,8 +90,10 @@ pub fn build_upsert_usage_record_from_event(
|
||||
data.request_metadata,
|
||||
data.request_body.as_ref(),
|
||||
data.request_body_state,
|
||||
data.api_format.as_deref(),
|
||||
data.response_body.as_ref(),
|
||||
data.response_body_state,
|
||||
data.endpoint_api_format.as_deref(),
|
||||
);
|
||||
let now_unix_secs = event.timestamp_ms / 1_000;
|
||||
|
||||
|
||||
@@ -255,8 +255,10 @@ pub(crate) fn attach_provider_response_model_metadata(
|
||||
metadata: Option<Value>,
|
||||
request_body: Option<&Value>,
|
||||
request_body_state: Option<UsageBodyCaptureState>,
|
||||
request_api_format: Option<&str>,
|
||||
response_body: Option<&Value>,
|
||||
response_body_state: Option<UsageBodyCaptureState>,
|
||||
provider_api_format: Option<&str>,
|
||||
) -> Option<Value> {
|
||||
let both_bodies_are_authoritative =
|
||||
usage_body_capture_is_authoritative(request_body, request_body_state)
|
||||
@@ -264,8 +266,10 @@ pub(crate) fn attach_provider_response_model_metadata(
|
||||
let response_model = extract_provider_response_model_from_bodies(
|
||||
request_body,
|
||||
request_body_state,
|
||||
request_api_format,
|
||||
response_body,
|
||||
response_body_state,
|
||||
provider_api_format,
|
||||
);
|
||||
if !both_bodies_are_authoritative && response_model.is_none() {
|
||||
return metadata;
|
||||
@@ -293,8 +297,10 @@ pub(crate) fn refresh_provider_response_model_metadata(
|
||||
metadata: Option<Value>,
|
||||
request_body: Option<&Value>,
|
||||
request_body_state: Option<UsageBodyCaptureState>,
|
||||
request_api_format: Option<&str>,
|
||||
response_body: Option<&Value>,
|
||||
response_body_state: Option<UsageBodyCaptureState>,
|
||||
provider_api_format: Option<&str>,
|
||||
) -> Option<Value> {
|
||||
let mut object = match metadata {
|
||||
Some(Value::Object(object)) => object,
|
||||
@@ -308,8 +314,10 @@ pub(crate) fn refresh_provider_response_model_metadata(
|
||||
if let Some(response_model) = extract_provider_response_model_from_bodies(
|
||||
request_body,
|
||||
request_body_state,
|
||||
request_api_format,
|
||||
response_body,
|
||||
response_body_state,
|
||||
provider_api_format,
|
||||
) {
|
||||
object.insert(
|
||||
PROVIDER_RESPONSE_MODEL_METADATA_KEY.to_string(),
|
||||
@@ -881,8 +889,10 @@ mod tests {
|
||||
Some(json!({"provider_response_model": "old-model", "trace_id": "trace-1"})),
|
||||
Some(&json!({"model": "gpt-5"})),
|
||||
Some(UsageBodyCaptureState::Inline),
|
||||
Some("openai:chat"),
|
||||
Some(&json!({"model": "gpt-5.1"})),
|
||||
Some(UsageBodyCaptureState::Inline),
|
||||
Some("openai:chat"),
|
||||
)
|
||||
.expect("response model should be attached");
|
||||
assert_eq!(metadata["provider_response_model"], "gpt-5.1");
|
||||
@@ -892,8 +902,10 @@ mod tests {
|
||||
Some(json!({"provider_response_model": "gpt-5.1"})),
|
||||
Some(&json!({"model": "gpt-5"})),
|
||||
Some(UsageBodyCaptureState::Inline),
|
||||
Some("openai:chat"),
|
||||
Some(&json!({"model": "gpt-5"})),
|
||||
Some(UsageBodyCaptureState::Inline),
|
||||
Some("openai:chat"),
|
||||
);
|
||||
assert!(metadata.is_none());
|
||||
|
||||
@@ -901,8 +913,10 @@ mod tests {
|
||||
Some(json!({"provider_response_model": "gpt-5.1"})),
|
||||
None,
|
||||
Some(UsageBodyCaptureState::Disabled),
|
||||
Some("openai:chat"),
|
||||
Some(&json!({"model": "gpt-5.2"})),
|
||||
Some(UsageBodyCaptureState::Inline),
|
||||
Some("openai:chat"),
|
||||
);
|
||||
assert!(metadata.is_none());
|
||||
}
|
||||
|
||||
@@ -5304,8 +5304,10 @@ fn preserve_provider_response_facts(event: &mut UsageEvent) {
|
||||
metadata,
|
||||
event.data.request_body.as_ref(),
|
||||
event.data.request_body_state,
|
||||
event.data.api_format.as_deref(),
|
||||
event.data.response_body.as_ref(),
|
||||
event.data.response_body_state,
|
||||
event.data.endpoint_api_format.as_deref(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -729,8 +729,10 @@ fn build_terminal_usage_event_from_seed_impl(
|
||||
request_metadata,
|
||||
request_body.as_ref(),
|
||||
body_states.request_body_state,
|
||||
Some(client_contract.as_str()),
|
||||
provider_response.as_ref(),
|
||||
body_states.response_body_state,
|
||||
Some(provider_contract.as_str()),
|
||||
);
|
||||
|
||||
let mut data = UsageEventData {
|
||||
@@ -1059,8 +1061,10 @@ pub fn build_sync_terminal_usage_seed(
|
||||
request_metadata,
|
||||
context_seed.request_body.as_ref(),
|
||||
context_seed.body_states.request_body_state,
|
||||
Some(context_seed.client_contract.as_str()),
|
||||
provider_response_full.as_ref(),
|
||||
provider_response_body_state,
|
||||
Some(context_seed.provider_contract.as_str()),
|
||||
);
|
||||
|
||||
TerminalUsageSeed {
|
||||
@@ -1244,8 +1248,10 @@ pub fn build_stream_terminal_usage_seed(
|
||||
request_metadata,
|
||||
context_seed.request_body.as_ref(),
|
||||
context_seed.body_states.request_body_state,
|
||||
Some(context_seed.client_contract.as_str()),
|
||||
provider_response_full.as_ref(),
|
||||
provider_response_body_state,
|
||||
Some(context_seed.provider_contract.as_str()),
|
||||
);
|
||||
// The parser's terminal summary is authoritative when a response body is truncated or the
|
||||
// body and summary disagree; attach it after the body refresh so it wins.
|
||||
|
||||
Reference in New Issue
Block a user