browser_use/tools/
evaluate.rs

1use crate::error::{BrowserError, Result};
2use crate::tools::{Tool, ToolContext, ToolResult};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
8pub struct EvaluateParams {
9    /// JavaScript code to execute
10    pub code: String,
11
12    /// Wait for promise resolution (default: false)
13    #[serde(default)]
14    pub await_promise: bool,
15}
16
17#[derive(Default)]
18pub struct EvaluateTool;
19
20impl Tool for EvaluateTool {
21    type Params = EvaluateParams;
22
23    fn name(&self) -> &str {
24        "evaluate"
25    }
26
27    fn execute_typed(
28        &self,
29        params: EvaluateParams,
30        context: &mut ToolContext,
31    ) -> Result<ToolResult> {
32        let result = context
33            .session
34            .tab()
35            .evaluate(&params.code, params.await_promise)
36            .map_err(|e| BrowserError::EvaluationFailed(e.to_string()))?;
37
38        let result_value = result.value.unwrap_or(Value::Null);
39
40        Ok(ToolResult::success_with(serde_json::json!({
41            "result": result_value
42        })))
43    }
44}