use std::collections::{BTreeMap, BTreeSet};
use serde::Serialize;
use super::{
material_evidence_floor, CompletionCriterionAssessment, ContractAssessmentStatus,
DiagnosticDisposition, EvidenceDiagnostic, EvidenceDiagnosticAssessment,
EvidenceRequirementAssessment, InquiryEvent, InquiryState, QuestionStatus,
ResearchContractAssessment, ResearchObligation, ResearchObligationAssessment,
SourceEvidenceRole, StopConditionAssessment,
};
const MAX_QUERY_CHARS: usize = 8_000;
const MAX_PACKET_CHARS: usize = 96_000;
const MAX_RATIONALE_CHARS: usize = 4_000;
const MAX_ASSESSMENT_PROMPT_BYTES: usize = 120 * 1024;
const MIN_TIMEOUT_MS: u64 = 1_000;
const MAX_TIMEOUT_MS: u64 = 600_000;
pub const RESEARCH_CONTRACT_ASSESSMENT_SCHEMA_BUDGET_BYTES: usize = 56 * 1024;
#[derive(Clone, Debug, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ResearchContractAssessmentGenerationParams {
pub schema: serde_json::Value,
pub schema_name: String,
pub schema_description: String,
pub prompt: String,
pub mode: String,
pub max_repair_attempts: u8,
pub include_raw_text: bool,
pub timeout_ms: u64,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ResearchContractAssessmentGenerationChunk {
pub chunk_index: usize,
pub chunk_count: usize,
pub params: ResearchContractAssessmentGenerationParams,
scope: AssessmentChunkScope,
reference_catalog: AssessmentReferenceCatalog,
reference_encoding: AssessmentReferenceEncoding,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum AssessmentReferenceEncoding {
ExactIds,
Indexed,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum AssessmentUnit {
Obligation(usize),
StopCondition(usize),
Diagnostic(usize),
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
struct AssessmentChunkScope {
units: Vec<AssessmentUnit>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
struct AssessmentReferenceCatalog {
obligations: BTreeMap<String, ObligationReferenceCatalog>,
stop_condition_evidence_ids: Vec<String>,
diagnostics: BTreeMap<String, DiagnosticReferenceCatalog>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
struct ObligationReferenceCatalog {
evidence_ids: Vec<String>,
source_ids: Vec<String>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
struct DiagnosticReferenceCatalog {
obligation_ids: Vec<String>,
resolved_evidence_ids: Vec<String>,
bounded_evidence_ids: Vec<String>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ResearchContractAssessmentError {
message: String,
}
impl ResearchContractAssessmentError {
fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
pub fn message(&self) -> &str {
&self.message
}
}
impl std::fmt::Display for ResearchContractAssessmentError {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str(&self.message)
}
}
impl std::error::Error for ResearchContractAssessmentError {}
include!("assessment/generation.rs");
include!("assessment/decoding.rs");
include!("assessment/validation.rs");
include!("assessment/derivation.rs");
include!("assessment/tests.rs");