1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use super::{CommandResult, Commands};
5
6#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
8pub struct ScrapeOptions {
9 pub url: String,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub use_js: Option<bool>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub wait_for: Option<u64>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub extract_links: Option<bool>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub selector: Option<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub extract_images: Option<bool>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub extract_metadata: Option<bool>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub extract_tables: Option<bool>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub extract_forms: Option<bool>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub extract_structured_data: Option<bool>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub readable_content: Option<bool>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub remove_base64_images: Option<bool>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
35pub struct CrawlResponse {
36 pub success: bool,
37 pub command: String,
38 pub data: Option<CrawlData>,
39 pub error: Option<String>,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
43pub struct CrawlData {
44 pub url: String,
45 pub title: String,
46 pub content: Option<String>,
47 pub readable_content: Option<serde_json::Value>,
48 pub links: Option<Vec<serde_json::Value>>,
49 pub links_count: usize,
50 pub images: Option<Vec<serde_json::Value>>,
51 pub images_count: usize,
52 pub metadata: Option<serde_json::Value>,
53 pub tables: Option<Vec<serde_json::Value>>,
54 pub forms: Option<Vec<serde_json::Value>>,
55 pub structured_data: Option<Vec<serde_json::Value>>,
56 pub content_error: Option<String>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
60pub struct AutomateResponse {
61 pub success: bool,
62 pub steps_completed: usize,
63 pub total_steps: usize,
64 pub results: Vec<CommandResult>,
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub error: Option<String>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
71pub struct BrowserToolOptions {
72 pub commands: Vec<Commands>,
73 pub context: Option<BrowserContext>,
74}
75
76impl From<Commands> for BrowserToolOptions {
77 fn from(command: Commands) -> Self {
78 BrowserToolOptions {
79 commands: vec![command],
80 context: None,
81 }
82 }
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
87pub struct BrowserContext {
88 #[serde(default, skip_serializing_if = "Option::is_none")]
89 pub thread_id: Option<String>,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub task_id: Option<String>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub run_id: Option<String>,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub model_settings: Option<serde_json::Value>,
96 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub distri_client_config: Option<serde_json::Value>,
98}