fix(usage): unify OpenAI Live and WebSocket records

This commit is contained in:
ZheFox
2026-08-21 11:53:53 +08:00
parent 9996e75a34
commit acde38b8e7
32 changed files with 629 additions and 95 deletions
@@ -67,6 +67,7 @@ fn parse_users_me_usage_offset(query: Option<&str>) -> Result<usize, String> {
#[derive(Clone, Debug, Default, PartialEq, Eq)]
struct UsersMeUsageRecordFilter {
api_format: Option<String>,
statuses: Option<Vec<String>>,
is_stream: Option<bool>,
is_websocket: Option<bool>,
@@ -74,14 +75,19 @@ struct UsersMeUsageRecordFilter {
}
fn parse_users_me_usage_record_filter(query: Option<&str>) -> UsersMeUsageRecordFilter {
let mut filter = UsersMeUsageRecordFilter {
api_format: query_param_value(query, "api_format")
.map(|value| value.trim().to_string())
.filter(|value| !value.is_empty()),
..UsersMeUsageRecordFilter::default()
};
let Some(status) = query_param_value(query, "status")
.map(|value| value.trim().to_ascii_lowercase())
.filter(|value| !value.is_empty())
else {
return UsersMeUsageRecordFilter::default();
return filter;
};
let mut filter = UsersMeUsageRecordFilter::default();
match status.as_str() {
"stream" => {
filter.is_stream = Some(true);
@@ -1134,7 +1140,7 @@ pub(super) async fn handle_users_me_usage_get(
user_id: Some(auth.user.id.clone()),
provider_name: None,
model: None,
api_format: None,
api_format: record_filter.api_format.clone(),
client_family: None,
exclude_unknown_model_or_provider: false,
statuses: record_filter.statuses.clone(),
@@ -1191,7 +1197,7 @@ pub(super) async fn handle_users_me_usage_get(
user_id: Some(auth.user.id.clone()),
provider_name: None,
model: None,
api_format: None,
api_format: record_filter.api_format.clone(),
client_family: None,
exclude_unknown_model_or_provider: false,
statuses: record_filter.statuses.clone(),
@@ -1221,7 +1227,7 @@ pub(super) async fn handle_users_me_usage_get(
user_id: Some(auth.user.id.clone()),
provider_name: None,
model: None,
api_format: None,
api_format: record_filter.api_format.clone(),
client_family: None,
exclude_unknown_model_or_provider: false,
statuses: record_filter.statuses.clone(),
@@ -1629,6 +1635,20 @@ mod tests {
#[test]
fn users_me_usage_transport_statuses_are_disjoint_server_side_filters() {
let live_websocket = parse_users_me_usage_record_filter(Some(
"limit=20&api_format=codex%3Alive&status=websocket",
));
assert_eq!(live_websocket.api_format.as_deref(), Some("codex:live"));
assert_eq!(live_websocket.is_websocket, Some(true));
let live_without_status =
parse_users_me_usage_record_filter(Some("api_format=codex%3Alive"));
assert_eq!(
live_without_status.api_format.as_deref(),
Some("codex:live")
);
assert_eq!(live_without_status.is_websocket, None);
for status in ["websocket", "ws", "WS"] {
let filter = parse_users_me_usage_record_filter(Some(
format!("limit=20&status={status}").as_str(),