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}
66
67#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
68pub struct BrowserToolOptions {
69 pub commands: Vec<Commands>,
70 pub context: Option<BrowserContext>,
71}
72
73impl From<Commands> for BrowserToolOptions {
74 fn from(command: Commands) -> Self {
75 BrowserToolOptions {
76 commands: vec![command],
77 context: None,
78 }
79 }
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
84pub struct BrowserContext {
85 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub thread_id: Option<String>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub task_id: Option<String>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub run_id: Option<String>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
92 pub model_settings: Option<serde_json::Value>,
93 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub distri_client_config: Option<serde_json::Value>,
95}