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"

    "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,**
**          **Cache:      true**,**
**          **MaxRetries: **5,**
**       **}**,**
**    **}

    // Create search client
    tool**, **err := duckduckgo.NewTool(ctx**, **config)
    if err != nil {
       log.Fatal("Failed to create tool:"**, **err)
    }

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

    jsonReq**, **err := json.Marshal(searchReq)
    if err != nil {
       log.Fatal("Failed to marshal search request:"**, **err)
    }

    // Execute search
    resp**, **err := tool.InvokableRun(ctx**, **string(jsonReq))
    if err != nil {
       log.Fatal("Search failed:"**, **err)
    }

    var searchResp duckduckgo.SearchResponse
    if err := json.Unmarshal([]byte(resp)**, **&searchResp)**; **err != nil {
       log.Fatal("Failed to unmarshal search response:"**, **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 February 21, 2025 : doc: add eino english docs (#1255) (4f6a3bd)