#pragma once // Step 550: Worker Efficiency Dashboard Data Model #include #include #include struct WorkerRunRecord { std::string workerId; std::string taskClass; bool success = false; int tokensUsed = 0; int latencyMs = 0; int rejectionCount = 0; }; struct WorkerTaskMetrics { int runs = 0; int successCount = 0; int failureCount = 0; int totalTokens = 0; int totalLatencyMs = 0; int totalRejections = 0; double successRate = 0.0; double avgTokens = 0.0; double avgLatencyMs = 0.0; double avgRejections = 0.0; }; struct WorkerEfficiencySnapshot { std::map byWorker; std::map byTaskClass; }; class WorkerEfficiencyDashboardModel { public: void record(const WorkerRunRecord& r) { records_.push_back(r); } WorkerEfficiencySnapshot snapshot() const { WorkerEfficiencySnapshot out; for (const auto& r : records_) { accumulate(out.byWorker[r.workerId], r); accumulate(out.byTaskClass[r.taskClass], r); } finalize(out.byWorker); finalize(out.byTaskClass); return out; } private: std::vector records_; static void accumulate(WorkerTaskMetrics& m, const WorkerRunRecord& r) { ++m.runs; if (r.success) ++m.successCount; else ++m.failureCount; m.totalTokens += r.tokensUsed; m.totalLatencyMs += r.latencyMs; m.totalRejections += r.rejectionCount; } static void finalize(std::map& table) { for (auto& kv : table) { auto& m = kv.second; if (m.runs == 0) continue; m.successRate = static_cast(m.successCount) / static_cast(m.runs); m.avgTokens = static_cast(m.totalTokens) / static_cast(m.runs); m.avgLatencyMs = static_cast(m.totalLatencyMs) / static_cast(m.runs); m.avgRejections = static_cast(m.totalRejections) / static_cast(m.runs); } } };