mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-09 20:50:20 +08:00
Prefer provider request body for usage badges
This commit is contained in:
@@ -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]
|
||||
|
||||
+22
-18
@@ -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')
|
||||
|
||||
+22
-18
@@ -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!({
|
||||
|
||||
Reference in New Issue
Block a user