1use chrono::{DateTime, Utc};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4use utoipa::ToSchema;
5use uuid::Uuid;
6
7#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, ToSchema, JsonSchema)]
8pub struct ExtractionDirective {
9 pub template_key: String,
10 #[serde(default = "default_parameters")]
11 #[schema(value_type = Object)]
12 pub parameters: serde_json::Value,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
16pub struct ExtractionTemplateInput {
17 pub template_key: String,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub description: Option<String>,
20 pub system_prompt: String,
21 #[schema(value_type = Object)]
22 pub output_schema: serde_json::Value,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub max_output_tokens: Option<i32>,
25 #[serde(default = "default_enabled")]
26 pub enabled: bool,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
30pub struct ExtractionTemplateResponse {
31 pub template_key: String,
32 pub version: i32,
33 pub description: Option<String>,
34 pub system_prompt: String,
35 #[schema(value_type = Object)]
36 pub output_schema: serde_json::Value,
37 pub max_output_tokens: i32,
38 pub enabled: bool,
39 pub created_at: DateTime<Utc>,
40 pub updated_at: DateTime<Utc>,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
44#[serde(rename_all = "snake_case")]
45pub enum ExtractionJobStatus {
46 Queued,
47 Running,
48 Succeeded,
49 Failed,
50 Skipped,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
54pub struct ExtractionJobResponse {
55 pub job_id: Uuid,
56 pub document_id: i64,
57 pub template_key: String,
58 pub template_version: i32,
59 pub source_record_hash: String,
60 pub status: ExtractionJobStatus,
61 pub attempt_count: i32,
62 pub error_message: Option<String>,
63 pub created_at: DateTime<Utc>,
64 pub started_at: Option<DateTime<Utc>>,
65 pub finished_at: Option<DateTime<Utc>>,
66 pub updated_at: DateTime<Utc>,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
70pub struct ExtractionResultResponse {
71 pub version_id: Uuid,
72 pub document_id: i64,
73 pub template_key: String,
74 pub template_version: i32,
75 pub source_record_hash: String,
76 pub model_name: Option<String>,
77 #[schema(value_type = Object)]
78 pub result_json: serde_json::Value,
79 pub created_at: DateTime<Utc>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
83pub struct ExtractionJobsResponse {
84 pub jobs: Vec<ExtractionJobResponse>,
85 pub latest_results: Vec<ExtractionResultResponse>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
89pub struct RebuildDocumentExtractionsRequest {
90 #[serde(default)]
91 pub template_keys: Vec<String>,
92}
93
94fn default_parameters() -> serde_json::Value {
95 serde_json::json!({})
96}
97
98fn default_enabled() -> bool {
99 true
100}