diff --git a/lib/crates/fabro-agent/tests/it/parity_matrix.rs b/lib/crates/fabro-agent/tests/it/parity_matrix.rs index 808d8b71d..6b60d1cf7 100644 --- a/lib/crates/fabro-agent/tests/it/parity_matrix.rs +++ b/lib/crates/fabro-agent/tests/it/parity_matrix.rs @@ -17,6 +17,7 @@ use fabro_auth::EnvCredentialSource; use fabro_llm::client::Client; use fabro_llm::provider::ProviderAdapter; use fabro_llm::providers::{OpenAiAdapter, OpenAiCompatibleAdapter}; +use fabro_model::catalog::{LlmCatalogSettings, ProviderCatalogSettings}; use fabro_model::{Catalog, ModelHandle, ProviderId}; use fabro_test::{TwinScenario, TwinScenarios, TwinToolCall, twin_openai}; use tokio::sync::Mutex as AsyncMutex; @@ -184,7 +185,20 @@ fn make_openai_compatible_twin_session( twin: &OpenAiTwinOptions, ) -> Session { let client = make_openai_compatible_twin_client(&provider, twin); - let catalog = Arc::new(Catalog::from_builtin().expect("default catalog should build")); + // LiteLLM is opt-in in the built-in catalog. Enable the provider in this + // twin fixture so the profile can resolve the same OpenAI-compatible + // codec that the manually registered adapter uses. + let mut settings = LlmCatalogSettings::default(); + settings + .providers + .insert(provider.to_string(), ProviderCatalogSettings { + enabled: Some(true), + ..ProviderCatalogSettings::default() + }); + let catalog = Arc::new( + Catalog::from_builtin_with_overrides(&settings) + .expect("OpenAI-compatible twin catalog should build"), + ); let profile: Arc = Arc::new( OpenAiProfile::new(model) .with_provider_id(provider) diff --git a/test/twin/openai/docs/compatibility-matrix.md b/test/twin/openai/docs/compatibility-matrix.md index 6c6588a2f..6fad3d925 100644 --- a/test/twin/openai/docs/compatibility-matrix.md +++ b/test/twin/openai/docs/compatibility-matrix.md @@ -30,6 +30,7 @@ Supported `/v1/responses` fields: Supported `/v1/chat/completions` fields: - bearer auth +- `max_tokens` - `stream` - `tools` - `tool_choice` diff --git a/test/twin/openai/src/openai/models.rs b/test/twin/openai/src/openai/models.rs index 06d99e0e7..abd2e47e7 100644 --- a/test/twin/openai/src/openai/models.rs +++ b/test/twin/openai/src/openai/models.rs @@ -531,6 +531,7 @@ pub fn normalize_whitespace(input: &str) -> String { pub struct ChatCompletionsRequest { pub model: String, pub messages: Vec, + pub max_tokens: Option, #[serde(default)] pub stream: bool, pub tools: Option>, diff --git a/test/twin/openai/tests/chat_completions_contract.rs b/test/twin/openai/tests/chat_completions_contract.rs index 965d361ff..db1ace170 100644 --- a/test/twin/openai/tests/chat_completions_contract.rs +++ b/test/twin/openai/tests/chat_completions_contract.rs @@ -69,6 +69,7 @@ async fn chat_completions_accepts_supported_openai_compatible_fields() { }, { "role": "user", "content": "structured chat" } ], + "max_tokens": 128, "stream": false, "tools": [{ "type": "function", "function": { "name": "lookup" } }], "tool_choice": "auto",