mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-08 02:17:46 +08:00
Prefer provider request body for usage badges
This commit is contained in:
@@ -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