mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-10 11:19:50 +08:00
feat(codex): align Search and execution protocol
This commit is contained in:
@@ -12,20 +12,33 @@ pub(crate) fn codex_model_capabilities_for_transport(
|
||||
provider_model: &str,
|
||||
source_model: &str,
|
||||
) -> Option<crate::ai_serving::CodexResponsesModelCapabilities> {
|
||||
if !transport
|
||||
.provider
|
||||
.provider_type
|
||||
.trim()
|
||||
.eq_ignore_ascii_case("codex")
|
||||
|| !crate::ai_serving::is_openai_responses_family_format(provider_api_format)
|
||||
{
|
||||
codex_model_capabilities(
|
||||
&transport.provider.provider_type,
|
||||
provider_api_format,
|
||||
provider_model,
|
||||
source_model,
|
||||
transport.key.upstream_metadata.as_ref(),
|
||||
)
|
||||
}
|
||||
|
||||
fn codex_model_capabilities(
|
||||
provider_type: &str,
|
||||
provider_api_format: &str,
|
||||
provider_model: &str,
|
||||
source_model: &str,
|
||||
upstream_metadata: Option<&serde_json::Value>,
|
||||
) -> Option<crate::ai_serving::CodexResponsesModelCapabilities> {
|
||||
let uses_codex_model_catalog =
|
||||
crate::ai_serving::is_openai_responses_family_format(provider_api_format)
|
||||
|| crate::ai_serving::api_format_alias_matches(provider_api_format, "openai:search");
|
||||
if !provider_type.trim().eq_ignore_ascii_case("codex") || !uses_codex_model_catalog {
|
||||
return None;
|
||||
}
|
||||
Some(
|
||||
crate::ai_serving::resolve_codex_responses_model_capabilities(
|
||||
provider_model,
|
||||
source_model,
|
||||
transport.key.upstream_metadata.as_ref(),
|
||||
upstream_metadata,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,10 +1,52 @@
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use super::{apply_codex_openai_responses_special_body_edits, apply_codex_openai_special_headers};
|
||||
use super::{
|
||||
apply_codex_openai_responses_special_body_edits, apply_codex_openai_special_headers,
|
||||
codex_model_capabilities,
|
||||
};
|
||||
use crate::ai_serving::planner::standard::build_local_openai_responses_request_body;
|
||||
use http::{HeaderMap, HeaderValue};
|
||||
use serde_json::json;
|
||||
|
||||
#[test]
|
||||
fn search_uses_live_codex_model_catalog_capabilities() {
|
||||
let metadata = crate::ai_serving::build_codex_model_catalog_metadata(&[json!({
|
||||
"slug": "gpt-search-custom",
|
||||
"default_reasoning_level": "low",
|
||||
"supported_reasoning_levels": [
|
||||
{"effort": "low"},
|
||||
{"effort": "max"}
|
||||
],
|
||||
"supports_parallel_tool_calls": true
|
||||
})]);
|
||||
|
||||
let capabilities = codex_model_capabilities(
|
||||
"codex",
|
||||
"openai:search",
|
||||
"gpt-search-custom",
|
||||
"gpt-search-custom",
|
||||
Some(&metadata),
|
||||
)
|
||||
.expect("Search should resolve capabilities from the Codex model catalog");
|
||||
|
||||
assert_eq!(
|
||||
capabilities.default_reasoning_effort.as_deref(),
|
||||
Some("low")
|
||||
);
|
||||
assert_eq!(
|
||||
capabilities.supported_reasoning_efforts,
|
||||
vec!["low".to_string(), "max".to_string()]
|
||||
);
|
||||
assert!(codex_model_capabilities(
|
||||
"codex",
|
||||
"openai:chat",
|
||||
"gpt-search-custom",
|
||||
"gpt-search-custom",
|
||||
Some(&metadata),
|
||||
)
|
||||
.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn applies_codex_defaults_when_body_rules_do_not_handle_fields() {
|
||||
let mut body = json!({
|
||||
|
||||
Reference in New Issue
Block a user