systemprompt_evaluation/repository/
judge_calls.rs1use sqlx::PgPool;
7use std::sync::Arc;
8use systemprompt_database::DbPool;
9use systemprompt_identifiers::{
10 AiRequestId, EvalResultId, EvalRubricId, EvalRunId, GatewayConversationId,
11};
12
13use crate::error::Result;
14
15#[derive(Debug, Clone)]
16pub struct EvalJudgeCallRepository {
17 pool: Arc<PgPool>,
18}
19
20#[derive(Debug, Clone)]
21pub struct JudgeCallRecord<'a> {
22 pub conversation_id: &'a GatewayConversationId,
23 pub run_id: &'a EvalRunId,
24 pub result_id: Option<&'a EvalResultId>,
25 pub judge_ai_request_id: Option<&'a AiRequestId>,
26 pub rubric_id: Option<&'a EvalRubricId>,
27 pub cost_microdollars: i64,
28}
29
30impl EvalJudgeCallRepository {
31 pub fn new(db: &DbPool) -> Result<Self> {
32 Ok(Self {
33 pool: db.write_pool_arc()?,
34 })
35 }
36
37 pub async fn insert(&self, record: &JudgeCallRecord<'_>) -> Result<()> {
38 sqlx::query!(
39 r#"
40 INSERT INTO eval_judge_calls (
41 conversation_id, run_id, result_id, judge_ai_request_id,
42 rubric_id, cost_microdollars
43 )
44 VALUES ($1, $2, $3, $4, $5, $6)
45 ON CONFLICT (conversation_id) DO UPDATE
46 SET result_id = EXCLUDED.result_id,
47 judge_ai_request_id = EXCLUDED.judge_ai_request_id,
48 cost_microdollars = EXCLUDED.cost_microdollars
49 "#,
50 record.conversation_id.as_str(),
51 record.run_id.as_str(),
52 record.result_id.map(EvalResultId::as_str),
53 record.judge_ai_request_id.map(AiRequestId::as_str),
54 record.rubric_id.map(EvalRubricId::as_str),
55 record.cost_microdollars
56 )
57 .execute(self.pool.as_ref())
58 .await?;
59 Ok(())
60 }
61}