Skip to main content

context69_contracts/
settings.rs

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}