( executor: ExperimentExecutor, subject: SubjectAdapter, cell: ExperimentCell, subjectCredentialNames: readonly string[], signal?: AbortSignal, )
| 263 | } |
| 264 | |
| 265 | async function executeCell( |
| 266 | executor: ExperimentExecutor, |
| 267 | subject: SubjectAdapter, |
| 268 | cell: ExperimentCell, |
| 269 | subjectCredentialNames: readonly string[], |
| 270 | signal?: AbortSignal, |
| 271 | ): Promise<EvalResult> { |
| 272 | try { |
| 273 | const attempt = await executor.runAttempt( |
| 274 | { cell, subjectCredentialNames, ...(signal ? { signal } : {}) }, |
| 275 | async ({ context, verify }) => { |
| 276 | let execution: SubjectExecutionResult; |
| 277 | try { |
| 278 | execution = decodeSubjectExecution( |
| 279 | await subject.execute({ |
| 280 | cell, |
| 281 | context: { ...context, ...(signal ? { signal } : {}) }, |
| 282 | }), |
| 283 | ); |
| 284 | } catch { |
| 285 | return failure('infra_failed', 'subject execution failed'); |
| 286 | } |
| 287 | if ( |
| 288 | signal?.aborted || |
| 289 | execution.status === 'infra_failed' || |
| 290 | execution.status === 'indeterminate' |
| 291 | ) { |
| 292 | return fromUncertainSubject(execution, signal?.aborted === true); |
| 293 | } |
| 294 | try { |
| 295 | const verified = decodeVerification(await verify()); |
| 296 | return { |
| 297 | score: verified.score, |
| 298 | usage: execution.usage, |
| 299 | costUsd: execution.costUsd, |
| 300 | durationMs: execution.durationMs, |
| 301 | status: settledStatus(execution.status, verified.status), |
| 302 | failureReason: |
| 303 | verified.status === 'infra_failed' |
| 304 | ? verified.failureReason |
| 305 | : (execution.failureReason ?? verified.failureReason), |
| 306 | artifacts: [...execution.artifacts, ...verified.artifacts], |
| 307 | }; |
| 308 | } catch { |
| 309 | return failure('infra_failed', 'verification failed', execution); |
| 310 | } |
| 311 | }, |
| 312 | ); |
| 313 | if (attempt.kind === 'not_started') { |
| 314 | const cancelled = attempt.code === 'cancelled'; |
| 315 | return failure( |
| 316 | cancelled ? 'indeterminate' : 'infra_failed', |
| 317 | cancelled ? 'executor preparation cancelled' : 'executor preparation failed', |
| 318 | undefined, |
| 319 | attempt.artifacts, |
| 320 | ); |
| 321 | } |
| 322 | if (attempt.kind === 'settled') return decodeEvalResult(attempt.value); |
no test coverage detected