pub struct WebSearchExecutor { /* private fields */ }Expand description
Issues a natural-language query to an external search API and returns ranked results.
§Security
- The search endpoint is validated with the same SSRF machinery as
WebScrapeExecutor: HTTPS-only, DNS-resolved and checked against private ranges, and the resolved addresses are pinned into thereqwest::Clientviaresolve_to_addrsto close the DNS-rebinding TOCTOU window. [tools.scrape].denied_domainsis enforced against the endpoint; the scrape allowlist is intentionally not consulted (the endpoint is operator-configured infrastructure, not an LLM-chosen target).- Rendered result text (titles + snippets) passes through the IPI filter before reaching the LLM, since snippet content originates from arbitrary indexed pages.
- Result URLs are returned as text only — never auto-fetched by this tool.
§Example
use zeph_tools::{SearchConfig, ScrapeConfig};
use zeph_tools::search::WebSearchExecutor;
use zeph_common::secret::Secret;
let cfg = SearchConfig { enabled: true, ..SearchConfig::default() };
let executor = WebSearchExecutor::new(&cfg, &ScrapeConfig::default(), Some(Secret::new("key")));
assert!(executor.is_some());Implementations§
Source§impl WebSearchExecutor
impl WebSearchExecutor
Sourcepub fn new(
cfg: &SearchConfig,
scrape_cfg: &ScrapeConfig,
api_key: Option<Secret>,
) -> Option<Self>
pub fn new( cfg: &SearchConfig, scrape_cfg: &ScrapeConfig, api_key: Option<Secret>, ) -> Option<Self>
Build a WebSearchExecutor from configuration.
Returns Some only when cfg.enabled is true AND
SearchBackend::from_config succeeds (e.g. a valid key is present for a keyed
backend). Returns None otherwise — the caller must omit the tool from the
executor chain entirely in that case, so tool_definitions() never advertises an
unusable tool to the LLM (FR-002).
denied_domains and ipi_filter_threshold are read from [tools.scrape] — the
search tool has no independent domain-policy or IPI-threshold configuration.
No network connections are made at construction time.
Sourcepub fn with_audit(self, logger: Arc<AuditLogger>) -> Self
pub fn with_audit(self, logger: Arc<AuditLogger>) -> Self
Attach an audit logger. Each tool invocation will emit an AuditEntry.
Sourcepub fn with_egress_config(self, config: EgressConfig) -> Self
pub fn with_egress_config(self, config: EgressConfig) -> Self
Configure egress event logging.
Sourcepub fn with_egress_tx(
self,
tx: Sender<EgressEvent>,
dropped: Arc<AtomicU64>,
) -> Self
pub fn with_egress_tx( self, tx: Sender<EgressEvent>, dropped: Arc<AtomicU64>, ) -> Self
Attach the egress telemetry channel sender and drop counter.
Sourcepub fn egress_dropped(&self) -> Arc<AtomicU64> ⓘ
pub fn egress_dropped(&self) -> Arc<AtomicU64> ⓘ
Returns a clone of the egress drop counter, for use in the drain task.
Trait Implementations§
Source§impl Debug for WebSearchExecutor
impl Debug for WebSearchExecutor
Source§impl ToolExecutor for WebSearchExecutor
impl ToolExecutor for WebSearchExecutor
Source§fn tool_definitions(&self) -> Vec<ToolDef>
fn tool_definitions(&self) -> Vec<ToolDef>
Source§async fn execute(
&self,
_response: &str,
) -> Result<Option<ToolOutput>, ToolError>
async fn execute( &self, _response: &str, ) -> Result<Option<ToolOutput>, ToolError>
response for fenced tool blocks and execute them. Read moreSource§async fn execute_tool_call(
&self,
call: &ToolCall,
) -> Result<Option<ToolOutput>, ToolError>
async fn execute_tool_call( &self, call: &ToolCall, ) -> Result<Option<ToolOutput>, ToolError>
Source§fn is_tool_retryable(&self, tool_id: &str) -> bool
fn is_tool_retryable(&self, tool_id: &str) -> bool
Source§fn requires_confirmation(&self, _call: &ToolCall) -> bool
fn requires_confirmation(&self, _call: &ToolCall) -> bool
Source§fn execute_tool_call_confirmed(
&self,
call: &ToolCall,
) -> impl Future<Output = Result<Option<ToolOutput>, ToolError>> + Send
fn execute_tool_call_confirmed( &self, call: &ToolCall, ) -> impl Future<Output = Result<Option<ToolOutput>, ToolError>> + Send
Source§fn checkpoint_undo(&self, _n: usize) -> CheckpointActionResult
fn checkpoint_undo(&self, _n: usize) -> CheckpointActionResult
n checkpointed write commands. Read moreSource§fn checkpoint_redo(&self) -> CheckpointActionResult
fn checkpoint_redo(&self) -> CheckpointActionResult
Source§fn checkpoint_list(&self) -> CheckpointListResult
fn checkpoint_list(&self) -> CheckpointListResult
Source§fn is_tool_speculatable(&self, _tool_id: &str) -> bool
fn is_tool_speculatable(&self, _tool_id: &str) -> bool
Source§fn execute_confirmed(
&self,
response: &str,
) -> impl Future<Output = Result<Option<ToolOutput>, ToolError>> + Send
fn execute_confirmed( &self, response: &str, ) -> impl Future<Output = Result<Option<ToolOutput>, ToolError>> + Send
Source§fn set_skill_env(&self, _env: Option<HashMap<String, String>>)
fn set_skill_env(&self, _env: Option<HashMap<String, String>>)
Source§fn set_effective_trust(&self, _level: SkillTrustLevel)
fn set_effective_trust(&self, _level: SkillTrustLevel)
Auto Trait Implementations§
impl !Freeze for WebSearchExecutor
impl !RefUnwindSafe for WebSearchExecutor
impl !UnwindSafe for WebSearchExecutor
impl Send for WebSearchExecutor
impl Sync for WebSearchExecutor
impl Unpin for WebSearchExecutor
impl UnsafeUnpin for WebSearchExecutor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> ErasedToolExecutor for Twhere
T: ToolExecutor,
impl<T> ErasedToolExecutor for Twhere
T: ToolExecutor,
fn execute_erased<'a>( &'a self, response: &'a str, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn execute_confirmed_erased<'a>( &'a self, response: &'a str, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn tool_definitions_erased(&self) -> Vec<ToolDef>
fn execute_tool_call_erased<'a>( &'a self, call: &'a ToolCall, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
Source§fn execute_tool_call_confirmed_erased<'a>(
&'a self,
call: &'a ToolCall,
) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
fn execute_tool_call_confirmed_erased<'a>( &'a self, call: &'a ToolCall, ) -> Pin<Box<dyn Future<Output = Result<Option<ToolOutput>, ToolError>> + Send + 'a>>
ToolExecutor::execute_tool_call_confirmed reach it through the blanket impl below.
Other implementors should fall back to
execute_tool_call_erased (normal
enforcement path) unless they need to replicate confirmed-path-specific behavior
(e.g. a fallback that only applies on the unconfirmed path must be mirrored
explicitly, not assumed). See
erased_tool_executor_no_inner_defaults!
for leaf executors with no wrapped inner.Source§fn set_skill_env(&self, env: Option<HashMap<String, String>>)
fn set_skill_env(&self, env: Option<HashMap<String, String>>)
Source§fn set_effective_trust(&self, level: SkillTrustLevel)
fn set_effective_trust(&self, level: SkillTrustLevel)
Source§fn checkpoint_undo_erased(&self, n: usize) -> CheckpointActionResult
fn checkpoint_undo_erased(&self, n: usize) -> CheckpointActionResult
n checkpointed write commands. Read moreSource§fn checkpoint_redo_erased(&self) -> CheckpointActionResult
fn checkpoint_redo_erased(&self) -> CheckpointActionResult
Source§fn checkpoint_list_erased(&self) -> CheckpointListResult
fn checkpoint_list_erased(&self) -> CheckpointListResult
Source§fn is_tool_retryable_erased(&self, tool_id: &str) -> bool
fn is_tool_retryable_erased(&self, tool_id: &str) -> bool
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request