Prefer provider request body for usage badges

This commit is contained in:
fawney19
2026-05-27 15:39:39 +08:00
parent 6673ab6d4a
commit 21e52722e6
4 changed files with 135 additions and 49 deletions
@@ -418,19 +418,33 @@ impl StoredRequestUsageAudit {
}
pub fn provider_reasoning_effort(&self) -> Option<String> {
if self
.provider_request_body
.as_ref()
.and_then(Value::as_object)
.is_some()
{
return extract_provider_reasoning_effort_from_body(
self.provider_request_body.as_ref(),
);
}
self.request_metadata_string(PROVIDER_REASONING_EFFORT_METADATA_KEY)
.and_then(normalize_provider_reasoning_effort)
.or_else(|| {
extract_provider_reasoning_effort_from_body(self.provider_request_body.as_ref())
})
}
pub fn provider_service_tier(&self) -> Option<String> {
if self
.provider_request_body
.as_ref()
.and_then(Value::as_object)
.is_some()
{
return extract_provider_service_tier_from_body(self.provider_request_body.as_ref());
}
self.request_metadata_string(PROVIDER_SERVICE_TIER_METADATA_KEY)
.and_then(normalize_provider_service_tier)
.or_else(|| {
extract_provider_service_tier_from_body(self.provider_request_body.as_ref())
})
}
pub fn body_ref(&self, field: UsageBodyField) -> Option<&str> {
@@ -2398,7 +2412,7 @@ mod tests {
}
#[test]
fn provider_reasoning_effort_reads_metadata_and_provider_request_body() {
fn provider_reasoning_effort_prefers_provider_request_body_over_metadata() {
let mut usage = sample_usage();
usage.provider_request_body = Some(json!({
"reasoning": { "effort": "XHigh" },
@@ -2413,6 +2427,10 @@ mod tests {
"provider_service_tier": "standard"
}));
assert_eq!(usage.provider_reasoning_effort().as_deref(), Some("xhigh"));
assert_eq!(usage.provider_service_tier().as_deref(), Some("priority"));
usage.provider_request_body = None;
assert_eq!(usage.provider_reasoning_effort().as_deref(), Some("max"));
assert_eq!(usage.provider_service_tier().as_deref(), Some("standard"));
@@ -2424,6 +2442,17 @@ mod tests {
assert_eq!(usage.provider_reasoning_effort().as_deref(), Some("high"));
assert_eq!(usage.provider_service_tier().as_deref(), Some("priority"));
usage.request_metadata = Some(json!({
"provider_reasoning_effort": "max",
"provider_service_tier": "standard"
}));
usage.provider_request_body = Some(json!({
"model": "gpt-5"
}));
assert_eq!(usage.provider_reasoning_effort(), None);
assert_eq!(usage.provider_service_tier(), None);
}
#[test]
@@ -114,15 +114,17 @@ SELECT
OR NULLIF(BTRIM("usage".request_metadata->>'user_agent'), '') IS NOT NULL
OR NULLIF(BTRIM("usage".request_metadata->>'request_path'), '') IS NOT NULL
OR NULLIF(BTRIM("usage".request_metadata->>'request_path_and_query'), '') IS NOT NULL
OR COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
) IS NOT NULL
OR COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
) IS NOT NULL
OR CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN COALESCE(
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
)
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), '')
END IS NOT NULL
OR CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), '')
END IS NOT NULL
OR ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
OR ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN jsonb_strip_nulls(jsonb_build_object(
@@ -135,16 +137,18 @@ SELECT
'request_path_and_query',
NULLIF(BTRIM("usage".request_metadata->>'request_path_and_query'), ''),
'provider_reasoning_effort',
COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
),
CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN COALESCE(
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
)
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), '')
END,
'provider_service_tier',
COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
),
CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), '')
END,
'client_requested_stream',
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
@@ -114,15 +114,17 @@ SELECT
OR NULLIF(BTRIM("usage".request_metadata->>'user_agent'), '') IS NOT NULL
OR NULLIF(BTRIM("usage".request_metadata->>'request_path'), '') IS NOT NULL
OR NULLIF(BTRIM("usage".request_metadata->>'request_path_and_query'), '') IS NOT NULL
OR COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
) IS NOT NULL
OR COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
) IS NOT NULL
OR CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN COALESCE(
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
)
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), '')
END IS NOT NULL
OR CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), '')
END IS NOT NULL
OR ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
OR ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN jsonb_strip_nulls(jsonb_build_object(
@@ -135,16 +137,18 @@ SELECT
'request_path_and_query',
NULLIF(BTRIM("usage".request_metadata->>'request_path_and_query'), ''),
'provider_reasoning_effort',
COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
),
CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN COALESCE(
NULLIF(BTRIM("usage".provider_request_body->>'reasoning_effort'), ''),
NULLIF(BTRIM("usage".provider_request_body->'reasoning'->>'effort'), '')
)
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_reasoning_effort'), '')
END,
'provider_service_tier',
COALESCE(
NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), ''),
NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
),
CASE
WHEN jsonb_typeof("usage".provider_request_body) = 'object' THEN NULLIF(BTRIM("usage".provider_request_body->>'service_tier'), '')
ELSE NULLIF(BTRIM("usage".request_metadata->>'provider_service_tier'), '')
END,
'client_requested_stream',
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
@@ -77,15 +77,20 @@ pub(crate) fn attach_provider_request_body_metadata(
metadata: Option<Value>,
provider_request_body: Option<&Value>,
) -> Option<Value> {
let provider_body_is_object = provider_request_body.and_then(Value::as_object).is_some();
let reasoning_effort = extract_provider_reasoning_effort_from_body(provider_request_body);
let service_tier = extract_provider_service_tier_from_body(provider_request_body);
if reasoning_effort.is_none() && service_tier.is_none() {
if !provider_body_is_object && reasoning_effort.is_none() && service_tier.is_none() {
return metadata;
}
let mut object = match metadata {
Some(Value::Object(object)) => object,
_ => Map::new(),
};
if provider_body_is_object {
object.remove(PROVIDER_REASONING_EFFORT_METADATA_KEY);
object.remove(PROVIDER_SERVICE_TIER_METADATA_KEY);
}
if let Some(reasoning_effort) = reasoning_effort {
object.insert(
PROVIDER_REASONING_EFFORT_METADATA_KEY.to_string(),
@@ -98,7 +103,7 @@ pub(crate) fn attach_provider_request_body_metadata(
Value::String(service_tier),
);
}
Some(Value::Object(object))
(!object.is_empty()).then_some(Value::Object(object))
}
fn copy_allowed_metadata_fields(source: &Map<String, Value>, target: &mut Map<String, Value>) {
@@ -438,10 +443,11 @@ mod tests {
use std::collections::BTreeMap;
use super::{
build_usage_request_metadata_seed, merge_usage_request_metadata,
merge_usage_request_metadata_owned, sanitize_usage_request_metadata,
sanitize_usage_request_metadata_ref, MAX_USAGE_REQUEST_METADATA_BYTES,
MAX_USAGE_REQUEST_METADATA_DEPTH, MAX_USAGE_REQUEST_METADATA_NODES,
attach_provider_request_body_metadata, build_usage_request_metadata_seed,
merge_usage_request_metadata, merge_usage_request_metadata_owned,
sanitize_usage_request_metadata, sanitize_usage_request_metadata_ref,
MAX_USAGE_REQUEST_METADATA_BYTES, MAX_USAGE_REQUEST_METADATA_DEPTH,
MAX_USAGE_REQUEST_METADATA_NODES,
};
fn sample_plan() -> ExecutionPlan {
@@ -678,6 +684,49 @@ mod tests {
assert_eq!(metadata, None);
}
#[test]
fn provider_request_body_metadata_uses_final_provider_body_as_source_of_truth() {
let metadata = Some(json!({
"trace_id": "trace-1",
"provider_reasoning_effort": "high",
"provider_service_tier": "priority"
}));
let updated = attach_provider_request_body_metadata(
metadata.clone(),
Some(&json!({
"model": "gpt-5",
"reasoning": { "effort": "low" },
"service_tier": "standard"
})),
)
.expect("metadata should remain");
assert_eq!(
updated,
json!({
"trace_id": "trace-1",
"provider_reasoning_effort": "low",
"provider_service_tier": "standard"
})
);
let cleared = attach_provider_request_body_metadata(
metadata,
Some(&json!({
"model": "gpt-5"
})),
)
.expect("metadata should retain unrelated fields");
assert_eq!(
cleared,
json!({
"trace_id": "trace-1"
})
);
}
#[test]
fn owned_merge_matches_filtered_merge_for_trusted_objects() {
let base = Some(json!({