use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)]
pub struct SpanId(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProvenanceLabel {
System,
Developer,
User,
Tool,
Retrieval,
Memory,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SensitivityLabel {
#[default]
Public,
Private,
Restricted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PromptRole {
System,
User,
Assistant,
Tool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BlockContentType {
Text,
ToolSchema,
ToolResult,
StructuredOutput,
Image,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TokenizationMetadata {
pub model_family: String,
pub token_count: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PromptBlock {
pub span_id: SpanId,
pub sequence_index: u32,
pub role: PromptRole,
pub content: String,
pub content_type: BlockContentType,
pub provenance: ProvenanceLabel,
#[serde(default)]
pub sensitivity: SensitivityLabel,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub token_metadata: Option<TokenizationMetadata>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ToolSchemaHash {
pub tool_name: String,
pub schema_hash: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PromptIR {
pub ir_id: Uuid,
pub blocks: Vec<PromptBlock>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub tool_schema_hashes: Option<Vec<ToolSchemaHash>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub structured_output_schema_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub source_request_hash: Option<String>,
pub created_at: DateTime<Utc>,
}
#[cfg(test)]
#[path = "../../tests/unit/acg/prompt_ir_tests.rs"]
mod tests;