All files / api/src/middlewares/optimizer hyperparameters.ts

3.33% Statements 1/30
100% Branches 0/0
0% Functions 0/2
3.33% Lines 1/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46    1x                                                                                      
import type { UserDataStorageConnector } from '@api/types/connector';
import type { AppContext } from '@api/types/hono';
import { emitSSEEvent } from '@api/utils/sse-event-manager';
import type {
  SkillOptimizationArm,
  SkillOptimizationEvaluationResult,
} from '@shared/types/data';
 
export async function updatePulledArm(
  c: AppContext,
  userDataStorageConnector: UserDataStorageConnector,
  arm: SkillOptimizationArm,
  evaluationResults: SkillOptimizationEvaluationResult[],
) {
  // Extract evaluation_id and score pairs for atomic update
  const evaluationScores = evaluationResults.map((result) => ({
    evaluation_id: result.evaluation_id,
    score: result.score,
  }));
 
  await updateArmStats(c, userDataStorageConnector, arm, evaluationScores);
}
 
export async function updateArmStats(
  c: AppContext,
  userDataStorageConnector: UserDataStorageConnector,
  arm: SkillOptimizationArm,
  evaluationResults: Array<{ evaluation_id: string; score: number }>,
) {
  // Atomically update arm stats for each evaluation AND increment cluster/skill counters
  // PostgreSQL calculates new stats (n, mean, n2, total_reward) per evaluation internally
  // This ensures proper tracking of each evaluation method's performance
  const result = await userDataStorageConnector.updateArmAndIncrementCounters(
    c,
    arm.id,
    evaluationResults,
  );
 
  // Emit SSE event with all updated data (arm, cluster, skill)
  emitSSEEvent('skill-optimization:arm-updated', {
    arm: result.arm,
    cluster: result.cluster,
    skill: result.skill,
  });
}