Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DuckDuckGo Search

DuckDuckGoTool provides free web search capabilities using the DuckDuckGo Instant Answer API. No API key or account is required.

Setup

[dependencies]
synaptic = { version = "0.4", features = ["tools"] }

Basic usage

use synaptic::tools::DuckDuckGoTool;
use synaptic::core::Tool;
use serde_json::json;

let tool = DuckDuckGoTool::new();

let result = tool.call(json!({ "query": "Rust programming language" })).await?;
println!("{}", serde_json::to_string_pretty(&result)?);

Configuration

// Default: returns up to 5 results
let tool = DuckDuckGoTool::new();

// Custom result count
let tool = DuckDuckGoTool::with_max_results(10);

Configuration reference

FieldTypeDefaultDescription
max_resultsusize5Maximum number of results to return

Tool parameters

ParameterTypeRequiredDescription
querystringyesThe search query string

Response format

The tool returns a JSON object with query and results fields:

{
  "query": "Rust programming language",
  "results": [
    {
      "type": "abstract",
      "title": "Rust (programming language)",
      "url": "https://en.wikipedia.org/wiki/Rust_(programming_language)",
      "text": "Rust is a multi-paradigm, general-purpose programming language..."
    },
    {
      "type": "related",
      "title": "Cargo (Rust)",
      "url": "https://en.wikipedia.org/wiki/Cargo_(Rust)",
      "text": "Cargo is the Rust package manager."
    }
  ]
}

Result types:

  • abstract — DuckDuckGo's instant answer abstract (from Wikipedia or curated sources)
  • answer — Computed or direct answer (e.g., conversions, definitions)
  • related — Related topics from DuckDuckGo's topic graph

Use with an agent

use synaptic::tools::{DuckDuckGoTool, ToolRegistry};
use synaptic::models::OpenAiChatModel;
use synaptic::graph::create_react_agent;
use std::sync::Arc;

let model = Arc::new(OpenAiChatModel::from_env()?);
let tools: Vec<Arc<dyn Tool>> = vec![Arc::new(DuckDuckGoTool::new())];

let agent = create_react_agent(model, tools);
let result = agent.invoke(/* state */).await?;

Use in a tool registry

use synaptic::tools::{DuckDuckGoTool, ToolRegistry};
use std::sync::Arc;

let registry = ToolRegistry::new();
registry.register(Arc::new(DuckDuckGoTool::new()))?;

// Execute via registry
let result = registry.call("duckduckgo_search", json!({ "query": "async Rust" })).await?;

Error handling

use synaptic::core::SynapticError;

match tool.call(json!({ "query": "Rust" })).await {
    Ok(result) => println!("Results: {}", result["results"].as_array().unwrap().len()),
    Err(SynapticError::Tool(msg)) => eprintln!("Search error: {msg}"),
    Err(e) => return Err(e.into()),
}

Limitations

The DuckDuckGo Instant Answer API is optimized for concise answers and related topics rather than full web search result lists. For comprehensive search result pages, consider using the Tavily integration.