Skip to content

Commit 320fd73

Browse files
committed
Save partial results to file for generating evals
1 parent 974edf3 commit 320fd73

File tree

2 files changed

+101
-30
lines changed

2 files changed

+101
-30
lines changed

evals/git-evals2/gen-evals.ts

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,35 @@ function getCommitMessage(repoPath: string, commitSha: string): string {
104104
}).trim()
105105
}
106106

107+
function printTaskResult(taskResult: {
108+
id: string
109+
reasoning: string
110+
spec: string
111+
prompt: string
112+
supplementalFiles: string[]
113+
}) {
114+
console.log('\n' + '='.repeat(80))
115+
console.log('📋 GENERATED TASK')
116+
console.log('='.repeat(80))
117+
console.log(`\n🏷️ Task ID: ${taskResult.id}\n`)
118+
console.log(`💭 Reasoning:\n${taskResult.reasoning}\n`)
119+
console.log(`📝 Spec:\n${taskResult.spec}\n`)
120+
console.log(`💬 Prompt:\n${taskResult.prompt}\n`)
121+
console.log(`📁 Supplemental Files (${taskResult.supplementalFiles.length}):`)
122+
taskResult.supplementalFiles.forEach((file, idx) => {
123+
console.log(` ${idx + 1}. ${file}`)
124+
})
125+
console.log('='.repeat(80) + '\n')
126+
}
127+
128+
function savePartialResults(
129+
partialPath: string,
130+
evalData: EvalDataV2,
131+
): void {
132+
fs.writeFileSync(partialPath, JSON.stringify(evalData, null, 2))
133+
console.log(`💾 Saved partial results to ${partialPath}`)
134+
}
135+
107136
export async function generateEvalFileV2({
108137
repoUrl,
109138
commitShas,
@@ -119,7 +148,13 @@ export async function generateEvalFileV2({
119148
apiKey: process.env[API_KEY_ENV_VAR] || getUserCredentials()?.authToken,
120149
})
121150

151+
const finalOutputPath =
152+
outputPath || path.join(__dirname, `eval-${actualRepoName}-v2.json`)
153+
const partialOutputPath = finalOutputPath.replace(/\.json$/, '.partial.json')
154+
122155
console.log(`Processing ${commitShas.length} commits in parallel...`)
156+
console.log(`Partial results will be saved to: ${partialOutputPath}`)
157+
console.log(`Final results will be saved to: ${finalOutputPath}\n`)
123158

124159
const BATCH_SIZE = 5
125160
const evalCommits: EvalCommitV2[] = []
@@ -159,16 +194,9 @@ export async function generateEvalFileV2({
159194
},
160195
})
161196

162-
console.log(`Task ID: ${taskResult.id}`)
163-
console.log(`Generated spec: ${taskResult.spec.substring(0, 100)}...`)
164-
console.log(
165-
`Generated prompt: ${taskResult.prompt.substring(0, 100)}...`,
166-
)
167-
console.log(
168-
`Supplemental files: ${taskResult.supplementalFiles.length} files`,
169-
)
197+
printTaskResult(taskResult)
170198

171-
return {
199+
const evalCommit: EvalCommitV2 = {
172200
id: taskResult.id,
173201
sha: commitSha,
174202
parentSha,
@@ -177,24 +205,44 @@ export async function generateEvalFileV2({
177205
supplementalFiles: taskResult.supplementalFiles,
178206
fileDiffs,
179207
}
208+
209+
return evalCommit
180210
},
181211
)
182212
}
183213

184-
const batchResults = await mapLimit(commitShas, BATCH_SIZE, processCommit)
185-
evalCommits.push(...(batchResults.filter(Boolean) as EvalCommitV2[]))
214+
const batchResults = await mapLimit(
215+
commitShas,
216+
BATCH_SIZE,
217+
async (commitSha: string) => {
218+
const result = await processCommit(commitSha)
219+
if (result) {
220+
evalCommits.push(result)
221+
222+
const partialEvalData: EvalDataV2 = {
223+
repoUrl,
224+
generationDate: new Date().toISOString(),
225+
evalCommits: [...evalCommits],
226+
}
227+
savePartialResults(partialOutputPath, partialEvalData)
228+
}
229+
return result
230+
},
231+
)
186232

187233
const evalData: EvalDataV2 = {
188234
repoUrl,
189235
generationDate: new Date().toISOString(),
190236
evalCommits,
191237
}
192238

193-
const generatedOutputPath =
194-
outputPath || path.join(__dirname, `eval-${actualRepoName}-v2.json`)
239+
fs.writeFileSync(finalOutputPath, JSON.stringify(evalData, null, 2))
240+
console.log(`\n✅ Eval data written to ${finalOutputPath}`)
195241

196-
fs.writeFileSync(generatedOutputPath, JSON.stringify(evalData, null, 2))
197-
console.log(`Eval data written to ${generatedOutputPath}`)
242+
if (fs.existsSync(partialOutputPath)) {
243+
fs.unlinkSync(partialOutputPath)
244+
console.log(`🗑️ Removed partial file: ${partialOutputPath}`)
245+
}
198246
}
199247

200248
if (require.main === module) {

evals/git-evals2/migrate-evals-to-v2.ts

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,19 @@ async function migrateCommit(
9898
agentDefinitions,
9999
})
100100

101+
console.log(`\n--- Generated Task Result ---`)
101102
console.log(`Task ID: ${taskResult.id}`)
102-
console.log(
103-
`Generated spec: ${taskResult.spec.substring(0, 100)}...`,
104-
)
105-
console.log(
106-
`Generated prompt: ${taskResult.prompt.substring(0, 100)}...`,
107-
)
108-
console.log(
109-
`Supplemental files: ${taskResult.supplementalFiles.length} files`,
110-
)
103+
console.log(`\nReasoning:`)
104+
console.log(taskResult.reasoning)
105+
console.log(`\nSpec:`)
106+
console.log(taskResult.spec)
107+
console.log(`\nPrompt:`)
108+
console.log(taskResult.prompt)
109+
console.log(`\nSupplemental Files (${taskResult.supplementalFiles.length}):`)
110+
taskResult.supplementalFiles.forEach((file, i) => {
111+
console.log(` ${i + 1}. ${file}`)
112+
})
113+
console.log(`--- End Task Result ---\n`)
111114

112115
return {
113116
id: taskResult.id,
@@ -150,6 +153,9 @@ export async function migrateEvalFile({
150153
const migratedCommits: EvalCommitV2[] = []
151154
const failedCommits: Array<{ sha: string; error: string }> = []
152155

156+
const finalOutputPath = outputPath || inputPath.replace(/\.json$/, '-v2.json')
157+
const partialOutputPath = finalOutputPath.replace(/\.json$/, '.partial.json')
158+
153159
const processCommit = async (
154160
oldCommit: EvalCommit,
155161
index: number,
@@ -159,12 +165,28 @@ export async function migrateEvalFile({
159165
)
160166

161167
try {
162-
return await migrateCommit(
168+
const result = await migrateCommit(
163169
oldCommit,
164170
oldEvalData.repoUrl,
165171
client,
166172
localAgentDefinitions,
167173
)
174+
175+
if (result) {
176+
migratedCommits.push(result)
177+
178+
const partialData: EvalDataV2 = {
179+
repoUrl: oldEvalData.repoUrl,
180+
testRepoName: oldEvalData.testRepoName,
181+
generationDate: new Date().toISOString(),
182+
initCommand: oldEvalData.initCommand,
183+
evalCommits: migratedCommits,
184+
}
185+
fs.writeFileSync(partialOutputPath, JSON.stringify(partialData, null, 2))
186+
console.log(`✓ Saved partial results to ${partialOutputPath}`)
187+
}
188+
189+
return result
168190
} catch (error) {
169191
const errorMessage =
170192
error instanceof Error ? error.message : String(error)
@@ -180,7 +202,7 @@ export async function migrateEvalFile({
180202
}
181203
}
182204

183-
const results = await mapLimit(
205+
await mapLimit(
184206
oldEvalData.evalCommits,
185207
batchSize,
186208
async (commit: EvalCommit) => {
@@ -189,8 +211,6 @@ export async function migrateEvalFile({
189211
},
190212
)
191213

192-
migratedCommits.push(...(results.filter(Boolean) as EvalCommitV2[]))
193-
194214
console.log(
195215
`\n✓ Successfully migrated ${migratedCommits.length}/${oldEvalData.evalCommits.length} commits`,
196216
)
@@ -210,10 +230,13 @@ export async function migrateEvalFile({
210230
evalCommits: migratedCommits,
211231
}
212232

213-
const finalOutputPath = outputPath || inputPath.replace(/\.json$/, '-v2.json')
214-
215233
fs.writeFileSync(finalOutputPath, JSON.stringify(newEvalData, null, 2))
216234

235+
if (fs.existsSync(partialOutputPath)) {
236+
fs.unlinkSync(partialOutputPath)
237+
console.log(`\n✓ Removed partial file: ${partialOutputPath}`)
238+
}
239+
217240
const oldSize = fs.statSync(inputPath).size
218241
const newSize = fs.statSync(finalOutputPath).size
219242

0 commit comments

Comments
 (0)