Skip to main content

systemprompt_evaluation/repository/
judge_calls.rs

1//! Repository for judge-call audit rows.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use 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}