diff --git a/kipina-codebench/benchmark.mjs b/kipina-codebench/benchmark.mjs index 7756196..d2e82d0 100644 --- a/kipina-codebench/benchmark.mjs +++ b/kipina-codebench/benchmark.mjs @@ -389,8 +389,43 @@ async function runPipeline(model, scenario) { const missing = LCONF.required.filter(f => !files[f]); if (missing.length > 0) { result.error = `Puuttuvat: ${missing.join(', ')}`; return result; } - // 4. Validointi + korjaussilmukka (Python-spesifi) + // 4. Validointi + korjaussilmukka let fixRound = 0; + if (LANG === 'rust') { + // Rust: cargo check Docker-kontissa ennen testejä + for (let checkRound = 0; checkRound < MAX_FIX_ROUNDS; checkRound++) { + // Kirjoita tiedostot levylle + for (const [fn, content] of Object.entries(files)) { + const filePath = join(dir, fn); + mkdirSync(dirname(filePath), { recursive: true }); + writeFileSync(filePath, content); + } + console.log(` [4/5] Cargo check${checkRound > 0 ? ` (korjaus ${checkRound})` : ''}...`); + let checkOut = ''; + try { + checkOut = execSync( + `docker run --rm --entrypoint sh -v "${dir}:/src:ro" ${LCONF.dockerImage} -c "cp -r /src/* . && cargo check 2>&1"`, + { timeout: 300000, encoding: 'utf-8' } + ); + } catch (e) { + checkOut = e.stdout || e.stderr || e.message || ''; + } + const compileErrors = checkOut.split('\n').filter(l => /^error/.test(l)); + if (compileErrors.length === 0) break; // Kääntyy — jatka testeihin + + console.log(` [4/5] ${compileErrors.length} käännösvirhettä — korjataan...`); + fixRound++; + const errorLines = checkOut.split('\n').filter(l => /^error|^\s+-->/.test(l)).slice(0, 30).join('\n'); + const allCode = Object.entries(files).map(([fn, c]) => `=== ${fn} ===\n${c}`).join('\n\n'); + const fixPrompt = `Fix the following Rust compilation errors. Return ALL files with === markers.\n\nERRORS:\n${errorLines}\n\nCURRENT CODE:\n${allCode}`; + const fixResp = await ollamaChat(model, fixPrompt, CODE_SYSTEM, 12288); + timings.push(fixResp); + const fixedFiles = parseGeneratedFiles(fixResp.text); + for (const [fn, content] of Object.entries(fixedFiles)) { + if (LCONF.required.includes(fn)) files[fn] = content; + } + } + } if (LANG === 'python') { let issues = validateProjectCode(files); while (issues.length > 0 && fixRound < MAX_FIX_ROUNDS) {