clean up legacy openai cli adapter names

This commit is contained in:
fawney19
2026-04-26 23:59:53 +08:00
parent 5b914aa78c
commit ea3dc3257e
47 changed files with 412 additions and 572 deletions
@@ -24,15 +24,10 @@ pub(crate) use crate::ai_pipeline::{
GEMINI_VIDEO_CREATE_SYNC_FINALIZE_REPORT_KIND, GEMINI_VIDEO_CREATE_SYNC_PLAN_KIND,
OPENAI_CHAT_STREAM_PLAN_KIND, OPENAI_CHAT_STREAM_SUCCESS_REPORT_KIND,
OPENAI_CHAT_SYNC_ERROR_REPORT_KIND, OPENAI_CHAT_SYNC_FINALIZE_REPORT_KIND,
OPENAI_CHAT_SYNC_PLAN_KIND, OPENAI_CHAT_SYNC_SUCCESS_REPORT_KIND, OPENAI_CLI_STREAM_PLAN_KIND,
OPENAI_CLI_STREAM_SUCCESS_REPORT_KIND, OPENAI_CLI_SYNC_ERROR_REPORT_KIND,
OPENAI_CLI_SYNC_FINALIZE_REPORT_KIND, OPENAI_CLI_SYNC_PLAN_KIND,
OPENAI_CLI_SYNC_SUCCESS_REPORT_KIND, OPENAI_COMPACT_STREAM_PLAN_KIND,
OPENAI_COMPACT_SYNC_ERROR_REPORT_KIND, OPENAI_COMPACT_SYNC_FINALIZE_REPORT_KIND,
OPENAI_COMPACT_SYNC_PLAN_KIND, OPENAI_IMAGE_STREAM_PLAN_KIND,
OPENAI_IMAGE_STREAM_SUCCESS_REPORT_KIND, OPENAI_IMAGE_SYNC_FINALIZE_REPORT_KIND,
OPENAI_IMAGE_SYNC_PLAN_KIND, OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND,
OPENAI_RESPONSES_COMPACT_STREAM_SUCCESS_REPORT_KIND,
OPENAI_CHAT_SYNC_PLAN_KIND, OPENAI_CHAT_SYNC_SUCCESS_REPORT_KIND,
OPENAI_IMAGE_STREAM_PLAN_KIND, OPENAI_IMAGE_STREAM_SUCCESS_REPORT_KIND,
OPENAI_IMAGE_SYNC_FINALIZE_REPORT_KIND, OPENAI_IMAGE_SYNC_PLAN_KIND,
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND, OPENAI_RESPONSES_COMPACT_STREAM_SUCCESS_REPORT_KIND,
OPENAI_RESPONSES_COMPACT_SYNC_ERROR_REPORT_KIND,
OPENAI_RESPONSES_COMPACT_SYNC_FINALIZE_REPORT_KIND, OPENAI_RESPONSES_COMPACT_SYNC_PLAN_KIND,
OPENAI_RESPONSES_COMPACT_SYNC_SUCCESS_REPORT_KIND, OPENAI_RESPONSES_STREAM_PLAN_KIND,
@@ -26,7 +26,7 @@ mod tests {
#[test]
fn request_conversion_registry_supports_bidirectional_standard_matrix() {
assert_eq!(
request_conversion_kind("openai:chat", "openai:cli"),
request_conversion_kind("openai:chat", "openai:responses"),
Some(RequestConversionKind::ToOpenAiResponses)
);
assert_eq!(
@@ -34,7 +34,7 @@ mod tests {
Some(RequestConversionKind::ToClaudeStandard)
);
assert_eq!(
request_conversion_kind("openai:cli", "openai:chat"),
request_conversion_kind("openai:responses", "openai:chat"),
Some(RequestConversionKind::ToOpenAIChat)
);
assert_eq!(
@@ -42,15 +42,15 @@ mod tests {
Some(RequestConversionKind::ToClaudeStandard)
);
assert_eq!(
request_conversion_kind("openai:compact", "gemini:cli"),
request_conversion_kind("openai:responses:compact", "gemini:cli"),
None
);
assert_eq!(
request_conversion_kind("gemini:cli", "openai:compact"),
request_conversion_kind("gemini:cli", "openai:responses:compact"),
None
);
assert_eq!(
request_conversion_kind("openai:chat", "openai:compact"),
request_conversion_kind("openai:chat", "openai:responses:compact"),
None
);
assert_eq!(request_conversion_kind("claude:chat", "claude:chat"), None);
@@ -71,19 +71,19 @@ mod tests {
Some(SyncChatResponseConversionKind::ToOpenAIChat)
);
assert_eq!(
sync_cli_response_conversion_kind("openai:cli", "gemini:cli"),
sync_cli_response_conversion_kind("openai:responses", "gemini:cli"),
Some(SyncCliResponseConversionKind::ToGeminiCli)
);
assert_eq!(
sync_cli_response_conversion_kind("claude:chat", "openai:cli"),
sync_cli_response_conversion_kind("claude:chat", "openai:responses"),
Some(SyncCliResponseConversionKind::ToOpenAiResponses)
);
assert_eq!(
sync_cli_response_conversion_kind("claude:cli", "openai:compact"),
sync_cli_response_conversion_kind("claude:cli", "openai:responses:compact"),
Some(SyncCliResponseConversionKind::ToOpenAiResponses)
);
assert_eq!(
sync_cli_response_conversion_kind("openai:compact", "claude:cli"),
sync_cli_response_conversion_kind("openai:responses:compact", "claude:cli"),
None
);
assert_eq!(
@@ -101,16 +101,14 @@ mod tests {
"claude:chat",
"gemini:chat",
"openai:responses",
"openai:cli",
"claude:cli",
"gemini:cli",
]
);
assert_eq!(
request_candidate_api_formats("openai:cli", false),
request_candidate_api_formats("openai:responses", false),
vec![
"openai:responses",
"openai:cli",
"claude:cli",
"gemini:cli",
"openai:chat",
@@ -119,10 +117,9 @@ mod tests {
]
);
assert_eq!(
request_candidate_api_formats("openai:responses", false),
request_candidate_api_formats("openai:cli", false),
vec![
"openai:responses",
"openai:cli",
"claude:cli",
"gemini:cli",
"openai:chat",
@@ -135,7 +132,6 @@ mod tests {
vec![
"claude:cli",
"openai:responses",
"openai:cli",
"gemini:cli",
"claude:chat",
"openai:chat",
@@ -144,14 +140,14 @@ mod tests {
);
assert_eq!(
request_candidate_api_formats("openai:compact", false),
vec!["openai:responses:compact", "openai:compact"]
vec!["openai:responses:compact"]
);
}
#[test]
fn request_candidate_registry_prefers_same_kind_before_same_family_fallbacks() {
assert_eq!(
request_candidate_api_format_preference("claude:cli", "openai:cli"),
request_candidate_api_format_preference("claude:cli", "openai:responses"),
Some((1, 0))
);
assert_eq!(
@@ -110,7 +110,11 @@ fn maybe_bridge_openai_image_sync_json_to_stream(
}
fn normalize_api_format(value: &str) -> String {
value.trim().to_ascii_lowercase()
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
}
fn is_standard_api_format(value: &str) -> bool {
@@ -118,8 +122,6 @@ fn is_standard_api_format(value: &str) -> bool {
value,
"openai:chat"
| "openai:responses"
| "openai:cli"
| "openai:compact"
| "openai:responses:compact"
| "claude:chat"
| "claude:cli"
@@ -206,9 +208,7 @@ fn convert_provider_sync_response_to_openai_responses(
report_context: &Value,
) -> Option<Value> {
match provider_api_format {
"openai:responses" | "openai:cli" | "openai:compact" | "openai:responses:compact" => {
Some(provider_body_json.clone())
}
"openai:responses" | "openai:responses:compact" => Some(provider_body_json.clone()),
"openai:chat" => convert_openai_chat_response_to_openai_responses(
provider_body_json,
report_context,
@@ -257,7 +257,7 @@ fn emit_client_stream_from_canonical_frames(
let mut emitter = OpenAIChatClientEmitter::default();
emit_with_openai_chat_emitter(&mut emitter, canonical_frames)
}
"openai:responses" | "openai:cli" | "openai:compact" | "openai:responses:compact" => {
"openai:responses" | "openai:responses:compact" => {
let mut emitter = OpenAIResponsesClientEmitter::default();
emit_with_openai_responses_emitter(&mut emitter, canonical_frames)
}
@@ -888,7 +888,7 @@ fn gemini_to_openai_responses_stream_rewriter_converts_function_call_to_complete
}
#[test]
fn gemini_to_openai_compact_stream_rewriter_converts_function_call_to_completed_event() {
fn gemini_to_openai_responses_compact_stream_rewriter_converts_function_call_to_completed_event() {
let report_context = json!({
"provider_api_format": "gemini:cli",
"client_api_format": "openai:responses:compact",
@@ -1078,10 +1078,10 @@ fn converts_gemini_cli_inline_data_to_openai_responses_output_image() {
}
#[test]
fn local_finalize_handles_openai_compact_cross_format_sync_response() {
fn local_finalize_handles_openai_responses_compact_cross_format_sync_response() {
let payload = GatewaySyncReportRequest {
trace_id: "trace-compact-sync-123".to_string(),
report_kind: "openai_compact_sync_finalize".to_string(),
report_kind: "openai_responses_compact_sync_finalize".to_string(),
report_context: Some(json!({
"client_api_format": "openai:responses:compact",
"provider_api_format": "gemini:cli",
@@ -1126,7 +1126,7 @@ fn local_finalize_handles_openai_compact_cross_format_sync_response() {
let report = outcome
.background_report
.expect("compact cross-format should downgrade to success report");
assert_eq!(report.report_kind, "openai_responses_sync_success");
assert_eq!(report.report_kind, "openai_responses_compact_sync_success");
assert_eq!(
report.client_body_json.expect("client body should exist")["object"],
"response"
@@ -1134,10 +1134,10 @@ fn local_finalize_handles_openai_compact_cross_format_sync_response() {
}
#[test]
fn local_finalize_handles_openai_compact_cross_format_function_call_response() {
fn local_finalize_handles_openai_responses_compact_cross_format_function_call_response() {
let payload = GatewaySyncReportRequest {
trace_id: "trace-compact-tool-123".to_string(),
report_kind: "openai_compact_sync_finalize".to_string(),
report_kind: "openai_responses_compact_sync_finalize".to_string(),
report_context: Some(json!({
"client_api_format": "openai:responses:compact",
"provider_api_format": "gemini:cli",
@@ -1346,7 +1346,7 @@ fn local_finalize_handles_openai_responses_cross_format_stream_response_from_gem
}
#[test]
fn local_finalize_handles_openai_compact_openai_family_stream_response_even_when_conversion_flagged(
fn local_finalize_handles_openai_responses_compact_openai_family_stream_response_even_when_conversion_flagged(
) {
let body = concat!(
"event: response.completed\n",
@@ -1354,7 +1354,7 @@ fn local_finalize_handles_openai_compact_openai_family_stream_response_even_when
);
let payload = GatewaySyncReportRequest {
trace_id: "trace-openai-compact-family-stream-123".to_string(),
report_kind: "openai_compact_sync_finalize".to_string(),
report_kind: "openai_responses_compact_sync_finalize".to_string(),
report_context: Some(json!({
"client_api_format": "openai:responses:compact",
"provider_api_format": "openai:responses",
@@ -1382,7 +1382,7 @@ fn local_finalize_handles_openai_compact_openai_family_stream_response_even_when
let report = outcome
.background_report
.expect("same-family stream finalize should downgrade to success report");
assert_eq!(report.report_kind, "openai_responses_sync_success");
assert_eq!(report.report_kind, "openai_responses_compact_sync_success");
let provider_body = report.body_json.expect("provider body should exist");
assert_eq!(provider_body["object"], "response");
assert_eq!(provider_body["status"], "completed");
@@ -9,8 +9,7 @@ pub(crate) use crate::ai_pipeline::contracts::{
GEMINI_FILES_DELETE_PLAN_KIND, GEMINI_FILES_DOWNLOAD_PLAN_KIND, GEMINI_FILES_GET_PLAN_KIND,
GEMINI_FILES_LIST_PLAN_KIND, GEMINI_FILES_UPLOAD_PLAN_KIND, GEMINI_VIDEO_CANCEL_SYNC_PLAN_KIND,
GEMINI_VIDEO_CREATE_SYNC_PLAN_KIND, OPENAI_CHAT_STREAM_PLAN_KIND, OPENAI_CHAT_SYNC_PLAN_KIND,
OPENAI_CLI_STREAM_PLAN_KIND, OPENAI_CLI_SYNC_PLAN_KIND, OPENAI_COMPACT_STREAM_PLAN_KIND,
OPENAI_COMPACT_SYNC_PLAN_KIND, OPENAI_IMAGE_STREAM_PLAN_KIND, OPENAI_IMAGE_SYNC_PLAN_KIND,
OPENAI_IMAGE_STREAM_PLAN_KIND, OPENAI_IMAGE_SYNC_PLAN_KIND,
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND, OPENAI_RESPONSES_COMPACT_SYNC_PLAN_KIND,
OPENAI_RESPONSES_STREAM_PLAN_KIND, OPENAI_RESPONSES_SYNC_PLAN_KIND,
OPENAI_VIDEO_CANCEL_SYNC_PLAN_KIND, OPENAI_VIDEO_CONTENT_PLAN_KIND,
@@ -6,8 +6,7 @@ use crate::ai_pipeline::planner::common::{
GEMINI_CLI_SYNC_PLAN_KIND, GEMINI_FILES_DELETE_PLAN_KIND, GEMINI_FILES_DOWNLOAD_PLAN_KIND,
GEMINI_FILES_GET_PLAN_KIND, GEMINI_FILES_LIST_PLAN_KIND, GEMINI_VIDEO_CANCEL_SYNC_PLAN_KIND,
GEMINI_VIDEO_CREATE_SYNC_PLAN_KIND, OPENAI_CHAT_STREAM_PLAN_KIND, OPENAI_CHAT_SYNC_PLAN_KIND,
OPENAI_CLI_STREAM_PLAN_KIND, OPENAI_CLI_SYNC_PLAN_KIND, OPENAI_COMPACT_STREAM_PLAN_KIND,
OPENAI_COMPACT_SYNC_PLAN_KIND, OPENAI_IMAGE_STREAM_PLAN_KIND, OPENAI_IMAGE_SYNC_PLAN_KIND,
OPENAI_IMAGE_STREAM_PLAN_KIND, OPENAI_IMAGE_SYNC_PLAN_KIND,
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND, OPENAI_RESPONSES_COMPACT_SYNC_PLAN_KIND,
OPENAI_RESPONSES_STREAM_PLAN_KIND, OPENAI_RESPONSES_SYNC_PLAN_KIND,
OPENAI_VIDEO_CANCEL_SYNC_PLAN_KIND, OPENAI_VIDEO_CONTENT_PLAN_KIND,
@@ -98,11 +97,11 @@ fn build_sync_plan_payload_from_decision(
OPENAI_CHAT_SYNC_PLAN_KIND => {
build_openai_chat_sync_plan_from_decision(parts, body_json, payload)?
}
OPENAI_RESPONSES_SYNC_PLAN_KIND | OPENAI_CLI_SYNC_PLAN_KIND => {
OPENAI_RESPONSES_SYNC_PLAN_KIND => {
build_openai_responses_sync_plan_from_decision(parts, body_json, payload, false)?
}
OPENAI_IMAGE_SYNC_PLAN_KIND => build_passthrough_sync_plan_from_decision(parts, payload)?,
OPENAI_RESPONSES_COMPACT_SYNC_PLAN_KIND | OPENAI_COMPACT_SYNC_PLAN_KIND => {
OPENAI_RESPONSES_COMPACT_SYNC_PLAN_KIND => {
build_openai_responses_sync_plan_from_decision(parts, body_json, payload, true)?
}
CLAUDE_CHAT_SYNC_PLAN_KIND | CLAUDE_CLI_SYNC_PLAN_KIND => {
@@ -139,13 +138,13 @@ fn build_stream_plan_payload_from_decision(
OPENAI_CHAT_STREAM_PLAN_KIND => {
build_openai_chat_stream_plan_from_decision(parts, body_json, payload)?
}
OPENAI_RESPONSES_STREAM_PLAN_KIND | OPENAI_CLI_STREAM_PLAN_KIND => {
OPENAI_RESPONSES_STREAM_PLAN_KIND => {
build_openai_responses_stream_plan_from_decision(parts, body_json, payload, false)?
}
OPENAI_IMAGE_STREAM_PLAN_KIND => {
build_standard_stream_plan_from_decision(parts, body_json, payload, false)?
}
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND | OPENAI_COMPACT_STREAM_PLAN_KIND => {
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND => {
build_openai_responses_stream_plan_from_decision(parts, body_json, payload, true)?
}
CLAUDE_CHAT_STREAM_PLAN_KIND | CLAUDE_CLI_STREAM_PLAN_KIND => {
@@ -82,7 +82,7 @@ fn builds_openai_chat_cross_format_request_body_from_openai_responses_source() {
let provider_request_body = build_cross_format_openai_responses_request_body(
&body_json,
"gpt-5-upstream",
"openai:cli",
"openai:responses",
"openai:chat",
false,
"openai",
@@ -118,7 +118,7 @@ fn local_openai_responses_wrapper_preserves_body_order_after_edits() {
"gpt-5.4",
true,
"codex",
"openai:cli",
"openai:responses",
None,
Some("key-123"),
)
@@ -143,7 +143,7 @@ fn local_openai_responses_wrapper_preserves_body_order_after_edits() {
}
#[test]
fn local_openai_compact_wrapper_strips_store_for_same_format_requests() {
fn local_openai_responses_compact_wrapper_strips_store_for_same_format_requests() {
let body_json = json!({
"model": "gpt-5.4",
"input": [],
@@ -155,7 +155,7 @@ fn local_openai_compact_wrapper_strips_store_for_same_format_requests() {
"gpt-5.4",
false,
"openai",
"openai:compact",
"openai:responses:compact",
None,
None,
)
@@ -175,7 +175,7 @@ fn local_openai_responses_upstream_url_preserves_codex_base_path() {
let upstream_url = build_local_openai_responses_upstream_url(
&parts,
&sample_transport("https://tiger.bookapi.cc/codex", "openai:cli"),
&sample_transport("https://tiger.bookapi.cc/codex", "openai:responses"),
false,
)
.expect("openai responses upstream url should build");
@@ -198,7 +198,7 @@ fn strips_metadata_for_codex_openai_responses_requests() {
&body_json,
"gpt-5-upstream",
"claude:cli",
"openai:cli",
"openai:responses",
true,
"codex",
None,
@@ -230,7 +230,7 @@ fn applies_codex_defaults_unless_body_rules_handle_the_field() {
&body_json,
"gpt-5-upstream",
"claude:cli",
"openai:cli",
"openai:responses",
true,
"codex",
Some(&body_rules),
@@ -257,7 +257,7 @@ fn injects_codex_prompt_cache_key_for_openai_responses_cross_format_requests() {
&body_json,
"gpt-5-upstream",
"claude:cli",
"openai:cli",
"openai:responses",
true,
"codex",
None,
@@ -285,7 +285,7 @@ fn injects_codex_prompt_cache_key_for_openai_chat_cross_format_requests() {
&body_json,
"gpt-5-upstream",
"codex",
"openai:cli",
"openai:responses",
false,
None,
Some("key-123"),
@@ -96,12 +96,7 @@ pub(crate) use aether_ai_pipeline::api::{
KIRO_ENVELOPE_NAME, KIRO_MAX_THINKING_BUFFER, OPENAI_CHAT_STREAM_PLAN_KIND,
OPENAI_CHAT_STREAM_SUCCESS_REPORT_KIND, OPENAI_CHAT_SYNC_ERROR_REPORT_KIND,
OPENAI_CHAT_SYNC_FINALIZE_REPORT_KIND, OPENAI_CHAT_SYNC_PLAN_KIND,
OPENAI_CHAT_SYNC_SUCCESS_REPORT_KIND, OPENAI_CLI_STREAM_PLAN_KIND,
OPENAI_CLI_STREAM_SUCCESS_REPORT_KIND, OPENAI_CLI_SYNC_ERROR_REPORT_KIND,
OPENAI_CLI_SYNC_FINALIZE_REPORT_KIND, OPENAI_CLI_SYNC_PLAN_KIND,
OPENAI_CLI_SYNC_SUCCESS_REPORT_KIND, OPENAI_COMPACT_STREAM_PLAN_KIND,
OPENAI_COMPACT_SYNC_ERROR_REPORT_KIND, OPENAI_COMPACT_SYNC_FINALIZE_REPORT_KIND,
OPENAI_COMPACT_SYNC_PLAN_KIND, OPENAI_IMAGE_STREAM_PLAN_KIND,
OPENAI_CHAT_SYNC_SUCCESS_REPORT_KIND, OPENAI_IMAGE_STREAM_PLAN_KIND,
OPENAI_IMAGE_STREAM_SUCCESS_REPORT_KIND, OPENAI_IMAGE_SYNC_FINALIZE_REPORT_KIND,
OPENAI_IMAGE_SYNC_PLAN_KIND, OPENAI_IMAGE_SYNC_SUCCESS_REPORT_KIND,
OPENAI_RESPONSES_COMPACT_STREAM_PLAN_KIND, OPENAI_RESPONSES_COMPACT_STREAM_SUCCESS_REPORT_KIND,