diff --git a/crates/arc-agent/tests/parity_matrix.rs b/crates/arc-agent/tests/parity_matrix.rs index 6f4d65d00..fb6e3d56b 100644 --- a/crates/arc-agent/tests/parity_matrix.rs +++ b/crates/arc-agent/tests/parity_matrix.rs @@ -136,7 +136,8 @@ macro_rules! provider_tests { provider_test!($scenario, Provider::Kimi, "kimi-k2.5", kimi); provider_test!($scenario, Provider::Zai, "glm-4.7", zai); provider_test!($scenario, Provider::Minimax, "minimax-m2.5", minimax); - provider_test!($scenario, Provider::Inception, "mercury-2", inception); + // Quarantined: Inception provider unreliable + // provider_test!($scenario, Provider::Inception, "mercury-2", inception); }; } @@ -182,7 +183,8 @@ macro_rules! non_openai_provider_tests { provider_test!($scenario, Provider::Kimi, "kimi-k2.5", kimi); provider_test!($scenario, Provider::Zai, "glm-4.7", zai); provider_test!($scenario, Provider::Minimax, "minimax-m2.5", minimax); - provider_test!($scenario, Provider::Inception, "mercury-2", inception); + // Quarantined: Inception provider unreliable + // provider_test!($scenario, Provider::Inception, "mercury-2", inception); }; } @@ -433,7 +435,8 @@ reasoning_effort_tests!( reasoning_effort_tests!(Provider::Kimi, "kimi-k2.5", kimi_reasoning_effort); reasoning_effort_tests!(Provider::Zai, "glm-4.7", zai_reasoning_effort); reasoning_effort_tests!(Provider::Minimax, "minimax-m2.5", minimax_reasoning_effort); -reasoning_effort_tests!(Provider::Inception, "mercury-2", inception_reasoning_effort); +// Quarantined: Inception provider unreliable +// reasoning_effort_tests!(Provider::Inception, "mercury-2", inception_reasoning_effort); // --------------------------------------------------------------------------- // Scenario 12: subagent_spawn @@ -487,7 +490,8 @@ loop_detection_tests!( loop_detection_tests!(Provider::Kimi, "kimi-k2.5", kimi_loop_detection); loop_detection_tests!(Provider::Zai, "glm-4.7", zai_loop_detection); loop_detection_tests!(Provider::Minimax, "minimax-m2.5", minimax_loop_detection); -loop_detection_tests!(Provider::Inception, "mercury-2", inception_loop_detection); +// Quarantined: Inception provider unreliable +// loop_detection_tests!(Provider::Inception, "mercury-2", inception_loop_detection); // --------------------------------------------------------------------------- // Scenario 14: error_recovery diff --git a/crates/arc-devcontainer/src/features.rs b/crates/arc-devcontainer/src/features.rs index 073e0c69e..dd49ffaeb 100644 --- a/crates/arc-devcontainer/src/features.rs +++ b/crates/arc-devcontainer/src/features.rs @@ -126,10 +126,23 @@ async fn ensure_oras() -> crate::Result<()> { Ok(()) } +/// Find the first `.tgz` file in a directory. +async fn find_tgz(dir: &Path) -> Option { + let mut entries = tokio::fs::read_dir(dir).await.ok()?; + while let Ok(Some(entry)) = entries.next_entry().await { + if let Some(name) = entry.file_name().to_str() { + if name.ends_with(".tgz") { + return Some(name.to_string()); + } + } + } + None +} + /// Extract a tgz archive in the given directory. -async fn extract_tgz(feature_dir: &Path, feature_id: &str) -> crate::Result<()> { +async fn extract_tgz(feature_dir: &Path, tgz_name: &str, feature_id: &str) -> crate::Result<()> { let status = tokio::process::Command::new("tar") - .args(["xzf", "devcontainer-feature.tgz"]) + .args(["xzf", tgz_name]) .current_dir(feature_dir) .status() .await @@ -193,8 +206,9 @@ async fn fetch_feature_oci(feature_id: &str, output_dir: &Path) -> crate::Result ))); } - if feature_dir.join("devcontainer-feature.tgz").exists() { - extract_tgz(&feature_dir, feature_id).await?; + // OCI registries may name the tgz with a feature suffix (e.g. devcontainer-feature-node.tgz) + if let Some(tgz) = find_tgz(&feature_dir).await { + extract_tgz(&feature_dir, &tgz, feature_id).await?; } read_feature_metadata(&feature_dir).await @@ -249,7 +263,7 @@ async fn fetch_feature_https( DevcontainerError::Feature(format!("failed to write {}: {e}", tgz_path.display())) })?; - extract_tgz(&feature_dir, feature_id).await?; + extract_tgz(&feature_dir, "devcontainer-feature.tgz", feature_id).await?; read_feature_metadata(&feature_dir).await } diff --git a/crates/arc-llm/src/providers/anthropic.rs b/crates/arc-llm/src/providers/anthropic.rs index 716a3fadf..38dd97120 100644 --- a/crates/arc-llm/src/providers/anthropic.rs +++ b/crates/arc-llm/src/providers/anthropic.rs @@ -1075,7 +1075,12 @@ fn build_api_request( let api_request = ApiRequest { model: request.model.clone(), messages: api_messages, - max_tokens: request.max_tokens.unwrap_or(65536), + max_tokens: request + .max_tokens + .or_else(|| { + crate::catalog::get_model_info(&request.model).and_then(|m| m.limits.max_output) + }) + .unwrap_or(65536), system: system_value, temperature: request.temperature, top_p: request.top_p, diff --git a/crates/arc-workflows/tests/integration.rs b/crates/arc-workflows/tests/integration.rs index e1269026e..1236f87e2 100644 --- a/crates/arc-workflows/tests/integration.rs +++ b/crates/arc-workflows/tests/integration.rs @@ -5825,6 +5825,22 @@ mod real_llm { _sandbox: &Arc, _tool_hooks: Option>, ) -> Result { + self.complete(prompt).await + } + + async fn one_shot( + &self, + _node: &Node, + prompt: &str, + _system_prompt: Option<&str>, + _stage_dir: &std::path::Path, + ) -> Result { + self.complete(prompt).await + } + } + + impl LlmCodergenBackend { + async fn complete(&self, prompt: &str) -> Result { let request = Request { model: self.model.clone(), messages: vec![Message::user(prompt)],