reasoninglayer 0.2.1

Rust client SDK for the Reasoning Layer API
Documentation
//! Synthetic data generation DTOs.

use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerateSyntheticDataRequest {
    #[serde(default)]
    pub target_sorts: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_terms_per_sort: Option<u64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_solutions_per_goal: Option<u64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub seed: Option<u64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_certainty: Option<f64>,
    #[serde(default = "default_true")]
    pub generate_negatives: bool,
    #[serde(default = "default_true")]
    pub enable_statistical_sampling: bool,
    #[serde(default = "default_true")]
    pub enable_forward_chaining: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_forward_chain_iterations: Option<u64>,
    #[serde(default = "default_true")]
    pub enable_format_diversity: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub real_ratio: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub verbalization_strategy: Option<String>,
    #[serde(default = "default_true")]
    pub enable_verbalization: bool,
    #[serde(default = "default_true")]
    pub enable_enhanced_negatives: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_negatives_per_sort: Option<u64>,
}

fn default_true() -> bool {
    true
}

/// Training example, verification report, mixing stats — backend types are extensive
/// nested structures; surfaced as Value to keep this DTO module compact while we
/// stabilise on a typed shape.
pub type TrainingExampleDto = serde_json::Value;
pub type GenerationReportDto = serde_json::Value;
pub type DataMixingStatsDto = serde_json::Value;
pub type VerbalizationResultDto = serde_json::Value;
pub type NegativeExampleDto = serde_json::Value;
pub type DatasetStatisticsDto = serde_json::Value;
pub type CalibrationReportDto = serde_json::Value;
pub type EntityVerificationDetailDto = serde_json::Value;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerateSyntheticDataResponse {
    #[serde(default)]
    pub examples: Vec<TrainingExampleDto>,
    pub report: GenerationReportDto,
    pub mixing_stats: DataMixingStatsDto,
    pub synthetic_terms_count: u64,
    pub training_pairs_count: u64,
    #[serde(default)]
    pub verbalizations: Vec<VerbalizationResultDto>,
    #[serde(default)]
    pub enhanced_negatives: Vec<NegativeExampleDto>,
    pub enhanced_negatives_count: u64,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub round_trip_result: Option<VerifyRoundTripResponse>,
    pub diversity_filtered_count: u64,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub dataset_statistics: Option<DatasetStatisticsDto>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub enhanced_dataset_jsonl: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub calibration_report: Option<CalibrationReportDto>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ExportJsonlResponse {
    pub jsonl: String,
    pub example_count: u64,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyFaithfulnessRequest {
    pub original: BTreeMap<String, String>,
    pub extracted: BTreeMap<String, String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_score: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_recovery_rate: Option<f64>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyFaithfulnessResponse {
    pub passed: bool,
    pub score: f64,
    pub entities_recovered: u64,
    pub entities_expected: u64,
    #[serde(default)]
    pub mismatches: Vec<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerbalizeTermRequest {
    pub term_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub strategy: Option<String>,
    #[serde(default = "default_true")]
    pub include_sort_description: bool,
    #[serde(default = "default_true")]
    pub include_parent_context: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_features: Option<u64>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerbalizeTermResponse {
    pub result: VerbalizationResultDto,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerationPromptRequest {
    pub term_id: String,
    #[serde(default)]
    pub schema_sort_ids: Vec<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerationPromptResponse {
    pub stable_prefix: String,
    pub dynamic_content: String,
    pub full_prompt: String,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerateNegativesRequest {
    pub target_sorts: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_per_sort: Option<u64>,
    #[serde(default = "default_true")]
    pub enable_sort_incompatibility: bool,
    #[serde(default = "default_true")]
    pub enable_feature_perturbation: bool,
    #[serde(default = "default_true")]
    pub enable_cross_sort_confusion: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub seed: Option<u64>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerateNegativesResponse {
    #[serde(default)]
    pub negatives: Vec<NegativeExampleDto>,
    pub count: u64,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EntityDto {
    pub sort_id: String,
    #[serde(default)]
    pub features: BTreeMap<String, serde_json::Value>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyRoundTripRequest {
    pub ground_truth: Vec<EntityDto>,
    pub extracted: Vec<EntityDto>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_faithfulness_score: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_feature_recovery: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_sort_similarity: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sort_weight: Option<f64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub feature_weight: Option<f64>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyRoundTripResponse {
    pub faithfulness_score: f64,
    pub passed: bool,
    pub entities_matched: u64,
    pub entities_expected: u64,
    pub entities_extracted: u64,
    #[serde(default)]
    pub entity_details: Vec<EntityVerificationDetailDto>,
    #[serde(default)]
    pub unmatched_ground_truth: Vec<String>,
    #[serde(default)]
    pub unmatched_extracted: Vec<String>,
    pub total_features_expected: u64,
    pub total_features_recovered: u64,
    #[serde(default)]
    pub mismatches: Vec<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CheckDiversityRequest {
    pub candidate: EntityDto,
    pub existing_term_ids: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub min_diversity_score: Option<f64>,
}

/// Response shape evolves; opaque alias for now.
pub type CheckDiversityResponse = serde_json::Value;