Skip to content

Commit 2b90ee1

Browse files
committed
fix: extract_agent_only for /evaluate - no tasks/ dir required
1 parent b6aee7a commit 2b90ee1

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

src/handlers.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,24 +1229,25 @@ async fn evaluate_with_stored_agent(
12291229
)
12301230
})?;
12311231

1232-
// Extract agent code
1232+
// Extract agent code only (no tasks/ required - we use HF tasks)
12331233
let extract_dir = state.config.workspace_base.join("_extract_evaluate");
12341234
let _ = tokio::fs::remove_dir_all(&extract_dir).await;
1235-
let extracted = crate::task::extract_uploaded_archive(&archive_bytes, &extract_dir)
1236-
.await
1237-
.map_err(|e| {
1238-
(
1239-
StatusCode::BAD_REQUEST,
1240-
Json(serde_json::json!({"error": format!("Failed to extract agent: {}", e)})),
1241-
)
1242-
})?;
1235+
let (agent_code, agent_language) =
1236+
crate::task::extract_agent_only(&archive_bytes, &extract_dir)
1237+
.await
1238+
.map_err(|e| {
1239+
(
1240+
StatusCode::BAD_REQUEST,
1241+
Json(serde_json::json!({"error": format!("Failed to extract agent: {}", e)})),
1242+
)
1243+
})?;
12431244
let _ = tokio::fs::remove_dir_all(&extract_dir).await;
12441245

12451246
let hf_tasks: Vec<crate::task::SweForgeTask> = registry.get_tasks().to_vec();
12461247
let final_archive = crate::task::ExtractedArchive {
12471248
tasks: hf_tasks,
1248-
agent_code: extracted.agent_code,
1249-
agent_language: extracted.agent_language,
1249+
agent_code,
1250+
agent_language,
12501251
};
12511252

12521253
if state.sessions.has_active_batch() {

src/task/mod.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,31 @@ pub fn extract_archive_bytes(data: &[u8], dest: &Path) -> Result<()> {
7979
Ok(())
8080
}
8181

82+
/// Extract only the agent code from an archive (no tasks/ required).
83+
pub async fn extract_agent_only(data: &[u8], dest: &Path) -> Result<(String, String)> {
84+
if data.len() > MAX_ARCHIVE_SIZE {
85+
anyhow::bail!(
86+
"Archive too large: {} bytes (max {})",
87+
data.len(),
88+
MAX_ARCHIVE_SIZE
89+
);
90+
}
91+
92+
tokio::fs::create_dir_all(dest)
93+
.await
94+
.context("Failed to create extraction directory")?;
95+
let dest_owned = dest.to_path_buf();
96+
let data_vec = data.to_vec();
97+
tokio::task::spawn_blocking(move || extract_archive_bytes(&data_vec, &dest_owned))
98+
.await
99+
.context("Extract task panicked")??;
100+
101+
let root = find_agent_root(dest)?;
102+
let agent_code = load_agent_code(&root)?;
103+
let agent_language = detect_agent_language(&root);
104+
Ok((agent_code, agent_language))
105+
}
106+
82107
pub async fn extract_uploaded_archive(data: &[u8], dest: &Path) -> Result<ExtractedArchive> {
83108
if data.len() > MAX_ARCHIVE_SIZE {
84109
anyhow::bail!(
@@ -119,6 +144,20 @@ pub async fn extract_uploaded_archive(data: &[u8], dest: &Path) -> Result<Extrac
119144
})
120145
}
121146

147+
fn find_agent_root(base: &Path) -> Result<PathBuf> {
148+
if base.join("agent_code").exists() {
149+
return Ok(base.to_path_buf());
150+
}
151+
for entry in std::fs::read_dir(base).context("Failed to read extracted directory")? {
152+
let entry = entry?;
153+
let path = entry.path();
154+
if path.is_dir() && path.join("agent_code").exists() {
155+
return Ok(path);
156+
}
157+
}
158+
anyhow::bail!("No agent_code/ found in archive at {}", base.display())
159+
}
160+
122161
fn find_archive_root(base: &Path) -> Result<PathBuf> {
123162
if base.join("tasks").exists() || base.join("agent_code").exists() {
124163
return Ok(base.to_path_buf());

0 commit comments

Comments
 (0)