1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4
5use crate::search::SearchMode;
6
7#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
8pub struct SearchSettingsResponse {
9 pub mode: SearchMode,
10 pub rerank_enabled: bool,
11 pub rerank_base_url: String,
12 pub rerank_model: String,
13 pub candidate_limit: usize,
14 pub timeout_secs: u64,
15 pub has_api_key: bool,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
19pub struct UpdateSearchSettingsRequest {
20 pub mode: SearchMode,
21 pub rerank_enabled: bool,
22 pub rerank_base_url: String,
23 pub rerank_model: String,
24 pub candidate_limit: usize,
25 pub timeout_secs: u64,
26 #[serde(default)]
27 pub api_key: Option<String>,
28 #[serde(default)]
29 pub clear_api_key: bool,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
33pub struct ProviderAccountResponse {
34 pub account_key: String,
35 pub provider_kind: String,
36 pub display_name: String,
37 pub base_url: String,
38 pub has_api_key: bool,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub disabled_at: Option<DateTime<Utc>>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
44pub struct UpsertProviderAccountRequest {
45 pub account_key: String,
46 pub provider_kind: String,
47 pub display_name: String,
48 pub base_url: String,
49 #[serde(default, skip_serializing_if = "Option::is_none")]
50 pub api_key: Option<String>,
51 #[serde(default)]
52 pub clear_api_key: bool,
53 #[serde(default)]
54 pub disabled: bool,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
58pub struct RuntimeSettingsResponse {
59 pub qdrant: RuntimeQdrantSettings,
60 pub embedding: RuntimeEmbeddingSettings,
61 pub scheduler: RuntimeSchedulerSettings,
62 pub chunking: RuntimeChunkingSettings,
63 pub file_library: RuntimeFileLibrarySettings,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
67pub struct UpdateRuntimeSettingsRequest {
68 pub qdrant: RuntimeQdrantSettings,
69 pub embedding: RuntimeEmbeddingSettings,
70 pub scheduler: RuntimeSchedulerSettings,
71 pub chunking: RuntimeChunkingSettings,
72 pub file_library: RuntimeFileLibrarySettings,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
76pub struct RuntimeQdrantSettings {
77 pub url: String,
78 pub collection_name: String,
79 pub recreate_on_dimension_mismatch: bool,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
83pub struct RuntimeEmbeddingSettings {
84 pub provider_account_key: String,
85 pub model: String,
86 pub dimensions: usize,
87 pub timeout_secs: u64,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
91pub struct RuntimeSchedulerSettings {
92 pub interval_secs: u64,
93 pub run_on_start: bool,
94 pub max_concurrency: usize,
95 pub job_id: String,
96 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub valkey_url: Option<String>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
101pub struct RuntimeChunkingSettings {
102 pub max_chars: usize,
103 pub overlap_chars: usize,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
107pub struct RuntimeFileLibrarySettings {
108 pub storage_root: String,
109 pub max_upload_size_mb: usize,
110 pub max_upload_request_size_mb: usize,
111 pub ingest_concurrency: usize,
112 pub pdf_pages_per_task: u32,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
116#[serde(rename_all = "snake_case")]
117pub enum DoclingSettingsSource {
118 Config,
119 Database,
120 Unconfigured,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
124pub struct DoclingSettingsResponse {
125 pub configured: bool,
126 pub source: DoclingSettingsSource,
127 pub connection: DoclingConnectionSettingsResponse,
128 pub vlm: DoclingVlmSettingsResponse,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
132pub struct UpdateDoclingSettingsRequest {
133 pub connection: UpdateDoclingConnectionSettings,
134 #[serde(default)]
135 pub vlm: UpdateDoclingVlmSettings,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
139pub struct DoclingConnectionSettingsResponse {
140 #[serde(default, skip_serializing_if = "Option::is_none")]
141 pub base_url: Option<String>,
142 pub timeout_secs: u64,
143 pub poll_interval_secs: u64,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
147pub struct UpdateDoclingConnectionSettings {
148 pub base_url: String,
149 pub timeout_secs: u64,
150 pub poll_interval_secs: u64,
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
154pub struct DoclingVlmSettingsResponse {
155 #[serde(default, skip_serializing_if = "Option::is_none")]
156 pub provider_account_key: Option<String>,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
158 pub openai_base_url: Option<String>,
159 pub has_api_key: bool,
160 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub vlm_pipeline_model: Option<String>,
162 #[serde(default, skip_serializing_if = "Option::is_none")]
163 pub picture_description_model: Option<String>,
164 #[serde(default, skip_serializing_if = "Option::is_none")]
165 pub code_formula_model: Option<String>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, Default)]
169pub struct UpdateDoclingVlmSettings {
170 #[serde(default, skip_serializing_if = "Option::is_none")]
171 pub provider_account_key: Option<String>,
172 #[serde(default, skip_serializing_if = "Option::is_none")]
173 pub openai_base_url: Option<String>,
174 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub api_key: Option<String>,
176 #[serde(default)]
177 pub clear_api_key: bool,
178 #[serde(default, skip_serializing_if = "Option::is_none")]
179 pub vlm_pipeline_model: Option<String>,
180 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub picture_description_model: Option<String>,
182 #[serde(default, skip_serializing_if = "Option::is_none")]
183 pub code_formula_model: Option<String>,
184}