Skip to main content

browsr_types/
context.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use super::{CommandResult, Commands};
5
6/// Crawl command parameters
7#[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    /// Error message from the first failed command, if any
66    #[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/// Context to enrich structured extraction calls with thread metadata and model settings
86#[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}