mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
Merge pull request #521 from Avilianb/fix/provider-query-responses-compact-body
Fix provider model test compact request bodies
This commit is contained in:
@@ -564,6 +564,29 @@ fn provider_query_build_test_request_body_for_api_format(
|
|||||||
client_api_format.as_str(),
|
client_api_format.as_str(),
|
||||||
payload,
|
payload,
|
||||||
);
|
);
|
||||||
|
} else if matches!(
|
||||||
|
client_api_format.as_str(),
|
||||||
|
"openai:responses" | "openai:responses:compact"
|
||||||
|
) && !value_has_non_empty_text(object.get("input"))
|
||||||
|
{
|
||||||
|
if let Some(prompt) = object
|
||||||
|
.remove("prompt")
|
||||||
|
.filter(|value| value_has_non_empty_text(Some(value)))
|
||||||
|
{
|
||||||
|
object.insert("input".to_string(), prompt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if matches!(
|
||||||
|
client_api_format.as_str(),
|
||||||
|
"openai:responses" | "openai:responses:compact"
|
||||||
|
) && value_has_non_empty_text(object.get("input"))
|
||||||
|
{
|
||||||
|
object.remove("prompt");
|
||||||
|
}
|
||||||
|
if client_api_format == "openai:responses:compact"
|
||||||
|
&& value_has_non_empty_text(object.get("input"))
|
||||||
|
{
|
||||||
|
object.remove("messages");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return body;
|
return body;
|
||||||
|
|||||||
@@ -30,7 +30,9 @@ pub(super) fn provider_query_standard_test_client_api_format(
|
|||||||
provider_api_format: &str,
|
provider_api_format: &str,
|
||||||
) -> &'static str {
|
) -> &'static str {
|
||||||
let normalized_api_format = crate::ai_serving::normalize_api_format_alias(provider_api_format);
|
let normalized_api_format = crate::ai_serving::normalize_api_format_alias(provider_api_format);
|
||||||
if crate::ai_serving::is_embedding_api_format(&normalized_api_format) {
|
if normalized_api_format == "openai:responses:compact" {
|
||||||
|
"openai:responses:compact"
|
||||||
|
} else if crate::ai_serving::is_embedding_api_format(&normalized_api_format) {
|
||||||
"openai:embedding"
|
"openai:embedding"
|
||||||
} else if crate::ai_serving::is_rerank_api_format(&normalized_api_format) {
|
} else if crate::ai_serving::is_rerank_api_format(&normalized_api_format) {
|
||||||
"openai:rerank"
|
"openai:rerank"
|
||||||
|
|||||||
@@ -324,6 +324,117 @@ fn provider_query_responses_test_request_body_defaults_to_responses_input() {
|
|||||||
assert!(body.get("messages").is_none());
|
assert!(body.get("messages").is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn provider_query_compact_test_request_body_defaults_to_responses_input() {
|
||||||
|
let payload = json!({"message": "hello from compact"});
|
||||||
|
|
||||||
|
let client_api_format =
|
||||||
|
provider_query_standard_test_client_api_format("openai:responses:compact");
|
||||||
|
let body = provider_query_build_test_request_body_for_api_format(
|
||||||
|
&payload,
|
||||||
|
"gpt-5.4-mini",
|
||||||
|
"/api/admin/provider-query/test-model",
|
||||||
|
client_api_format,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(client_api_format, "openai:responses:compact");
|
||||||
|
assert_eq!(body["model"], json!("gpt-5.4-mini"));
|
||||||
|
assert_eq!(body["input"], json!("hello from compact"));
|
||||||
|
assert!(body.get("messages").is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn provider_query_compact_test_request_body_promotes_prompt_to_input() {
|
||||||
|
let payload = json!({
|
||||||
|
"request_body": {
|
||||||
|
"model": "custom-model",
|
||||||
|
"prompt": "hello from prompt"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let body = provider_query_build_test_request_body_for_api_format(
|
||||||
|
&payload,
|
||||||
|
"fallback-model",
|
||||||
|
"/api/admin/provider-query/test-model",
|
||||||
|
"openai:responses:compact",
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(body["model"], json!("custom-model"));
|
||||||
|
assert_eq!(body["input"], json!("hello from prompt"));
|
||||||
|
assert!(body.get("prompt").is_none());
|
||||||
|
assert!(provider_query_request_body_is_openai_responses_shape(&body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn provider_query_compact_test_request_body_strips_stale_chat_fields() {
|
||||||
|
let payload = json!({
|
||||||
|
"request_body": {
|
||||||
|
"model": "custom-model",
|
||||||
|
"input": "hello from input",
|
||||||
|
"messages": [{ "role": "user", "content": "stale chat body" }],
|
||||||
|
"prompt": "stale prompt"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let body = provider_query_build_test_request_body_for_api_format(
|
||||||
|
&payload,
|
||||||
|
"fallback-model",
|
||||||
|
"/api/admin/provider-query/test-model",
|
||||||
|
"openai:responses:compact",
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(body["model"], json!("custom-model"));
|
||||||
|
assert_eq!(body["input"], json!("hello from input"));
|
||||||
|
assert!(body.get("messages").is_none());
|
||||||
|
assert!(body.get("prompt").is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn provider_query_compact_provider_body_builds_without_chat_conversion() {
|
||||||
|
let payload = json!({"message": "hello compact provider"});
|
||||||
|
let client_api_format =
|
||||||
|
provider_query_standard_test_client_api_format("openai:responses:compact");
|
||||||
|
let mut request_body = provider_query_build_test_request_body_for_api_format(
|
||||||
|
&payload,
|
||||||
|
"gpt-5.4-mini",
|
||||||
|
"/api/admin/provider-query/test-model",
|
||||||
|
client_api_format,
|
||||||
|
);
|
||||||
|
if let Some(object) = request_body.as_object_mut() {
|
||||||
|
object.insert("stream".to_string(), serde_json::Value::Bool(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert!(provider_query_request_body_is_openai_responses_shape(
|
||||||
|
&request_body
|
||||||
|
));
|
||||||
|
|
||||||
|
let mut provider_request_body = crate::ai_serving::build_local_openai_responses_request_body(
|
||||||
|
&request_body,
|
||||||
|
"upstream-gpt",
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.expect("compact model test body should build from responses shape");
|
||||||
|
crate::ai_serving::apply_openai_responses_compact_special_body_edits(
|
||||||
|
&mut provider_request_body,
|
||||||
|
"openai:responses:compact",
|
||||||
|
);
|
||||||
|
crate::ai_serving::enforce_request_body_stream_field(
|
||||||
|
&mut provider_request_body,
|
||||||
|
"openai:responses:compact",
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(provider_request_body["model"], json!("upstream-gpt"));
|
||||||
|
assert_eq!(
|
||||||
|
provider_request_body["input"],
|
||||||
|
json!("hello compact provider")
|
||||||
|
);
|
||||||
|
assert!(provider_request_body.get("messages").is_none());
|
||||||
|
assert!(provider_request_body.get("stream").is_none());
|
||||||
|
assert!(provider_request_body.get("store").is_none());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn provider_query_standard_test_rejects_gemini_success_without_visible_output() {
|
fn provider_query_standard_test_rejects_gemini_success_without_visible_output() {
|
||||||
let result = aether_contracts::ExecutionResult {
|
let result = aether_contracts::ExecutionResult {
|
||||||
|
|||||||
Reference in New Issue
Block a user