Tool - DuckDuckGoSearch

Basic Introduction

The DuckDuckGo Search Tool is an implementation of the Tool InvokableTool interface for conducting web searches through the DuckDuckGo search engine. DuckDuckGo is a privacy-focused search engine that does not track users’ search behavior and can be used directly without the need for API key authentication. This component implements the Eino: ToolsNode guide.

Usage

Component Initialization

The DuckDuckGo Search Tool is initialized through the NewTool function. The main configuration parameters are as follows:

import "github.com/cloudwego/eino-ext/components/tool/duckduckgo"

tool, err := duckduckgo.NewTool(ctx, &duckduckgo.Config{
    ToolName:    "duckduckgo_search",     // Tool name
    ToolDesc:    "search web for information by duckduckgo", // Tool description
    Region:      ddgsearch.RegionWT,      // Search region
    MaxResults:  10,                      // Number of results per page
    SafeSearch:  ddgsearch.SafeSearchOff, // Safe search level
    TimeRange:   ddgsearch.TimeRangeAll,  // Time range
    DDGConfig:   &ddgsearch.Config{},     // DuckDuckGo configuration
})

Search Parameters

The search request supports the following parameters:

type SearchRequest struct {
    Query string `json:"query"` // Search keyword
    Page  int    `json:"page"`  // Page number
}

Complete Usage Example

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "time"

    "github.com/cloudwego/eino-ext/components/tool/duckduckgo"
    "github.com/cloudwego/eino-ext/components/tool/duckduckgo/ddgsearch"
)

func main() {
    ctx := context.Background()

    // Create configuration
    config := &duckduckgo.Config{
        MaxResults: 3, // Limit to return 3 results
        Region:     ddgsearch.RegionCN,
        DDGConfig: &ddgsearch.Config{
            Timeout:    10 * time.Second,
            Cache:      true,
            MaxRetries: 5,
        },
    }

    // Create search client
    tool, err := duckduckgo.NewTool(ctx, config)
    if err != nil {
        log.Fatalf("NewTool of duckduckgo failed, err=%v", err)
    }

    // Create search request
    searchReq := &duckduckgo.SearchRequest{
        Query: "Golang programming development",
        Page:  1,
    }

    jsonReq, err := json.Marshal(searchReq)
    if err != nil {
        log.Fatalf("Marshal of search request failed, err=%v", err)
    }

    // Execute search
    resp, err := tool.InvokableRun(ctx, string(jsonReq))
    if err != nil {
        log.Fatalf("Search of duckduckgo failed, err=%v", err)
    }

    var searchResp duckduckgo.SearchResponse
    if err := json.Unmarshal([]byte(resp), &searchResp); err != nil {
        log.Fatalf("Unmarshal of search response failed, err=%v", err)
    }

    // Print results
    fmt.Println("Search Results:")
    fmt.Println("==============")
    for i, result := range searchResp.Results {
        fmt.Printf("\n%d. Title: %s\n", i+1, result.Title)
        fmt.Printf("   Link: %s\n", result.Link)
        fmt.Printf("   Description: %s\n", result.Description)
    }
    fmt.Println("")
    fmt.Println("==============")
}

Search Result Example

{
    "results": [
        {
            "title": "Go Concurrent Programming Practice",
            "description": "This is an article about concurrent programming in Go...",
            "link": "https://example.com/article1"
        },
        {
            "title": "Understanding Concurrency in Go",
            "description": "A comprehensive guide to concurrent programming...",
            "link": "https://example.com/article2"
        }
    ]
}

Last modified March 28, 2025 : docs: eino graph update (#1293) (aea58cb)