Tool - Googlesearch
Basic Introduction
Google Search Tool is an implementation of the Eino InvokableTool interface, used for web search through the Google Custom Search API. This component implements the Eino: ToolsNode guide.
Usage
Component Initialization
The Google Search Tool is initialized via the NewGoogleSearchTool
function, with the primary configuration parameters as follows:
import "github.com/cloudwego/eino-ext/components/tool/googlesearch"
tool, err := googlesearch.NewTool(ctx, &googlesearch.Config{
APIKey: "your-api-key", // Google API key
SearchEngineID: "your-engine-id", // Search engine ID
BaseURL: "custom-base-url", // Optional: Custom API base URL, default: https://customsearch.googleapis.com
Num: 5, // Optional: Number of results per page
Lang: "zh-CN", // Optional: Search interface language
ToolName: "google_search", // Optional: Tool name
ToolDesc: "google search tool", // Optional: Tool description
})
Search Parameters
The search request supports the following parameters:
type SearchRequest struct {
Query string `json:"query"` // Search keywords
Num int `json:"num"` // Number of results returned
Offset int `json:"offset"` // Start position of results
Lang string `json:"lang"` // Search language
}
Complete Usage Example
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"github.com/cloudwego/eino-ext/components/tool/googlesearch"
)
func main() {
ctx := context.Background()
googleAPIKey := os.Getenv("GOOGLE_API_KEY")
googleSearchEngineID := os.Getenv("GOOGLE_SEARCH_ENGINE_ID")
if googleAPIKey == "" || googleSearchEngineID == "" {
log.Fatal("[GOOGLE_API_KEY] and [GOOGLE_SEARCH_ENGINE_ID] must set")
}
// create tool
searchTool, err := googlesearch.NewTool(ctx, &googlesearch.Config{
APIKey: googleAPIKey,
SearchEngineID: googleSearchEngineID,
Lang: "zh-CN",
Num: 5,
})
if err != nil {
log.Fatal(err)
}
// prepare params
req := googlesearch.SearchRequest{
Query: "Golang concurrent programming",
Num: 3,
Lang: "en",
}
args, err := json.Marshal(req)
if err != nil {
log.Fatal(err)
}
// do search
resp, err := searchTool.InvokableRun(ctx, string(args))
if err != nil {
log.Fatal(err)
}
var searchResp googlesearch.SearchResult
if err := json.Unmarshal([]byte(resp), &searchResp); err != nil {
log.Fatal(err)
}
// Print results
fmt.Println("Search Results:")
fmt.Println("==============")
for i, result := range searchResp.Items {
fmt.Printf("\n%d. Title: %s\n", i+1, result.Title)
fmt.Printf(" Link: %s\n", result.Link)
fmt.Printf(" Desc: %s\n", result.Desc)
}
fmt.Println("")
fmt.Println("==============")
// seems like:
// Search Results:
// ==============
// 1. Title: My Concurrent Programming book is finally PUBLISHED!!! : r/golang
// Link: https://www.reddit.com/r/golang/comments/18b86aa/my_concurrent_programming_book_is_finally/
// Desc: Posted by u/channelselectcase - 398 votes and 46 comments
// 2. Title: Concurrency — An Introduction to Programming in Go | Go Resources
// Link: https://www.golang-book.com/books/intro/10
// Desc:
// 3. Title: The Comprehensive Guide to Concurrency in Golang | by Brandon ...
// Link: https://bwoff.medium.com/the-comprehensive-guide-to-concurrency-in-golang-aaa99f8bccf6
// Desc: Update (November 20, 2023) — This article has undergone a comprehensive revision for enhanced clarity and conciseness. I’ve streamlined the…
// ==============
}
Search Results Example
{
"query": "Golang concurrent programming",
"items": [
{
"link": "https://example.com/article1",
"title": "Go Concurrent Programming Practice",
"snippet": "This is an article about concurrent programming in Go...",
"desc": "Detailed introduction to goroutines and channels in Go..."
},
{
"link": "https://example.com/article2",
"title": "Understanding Concurrency in Go",
"snippet": "A comprehensive guide to concurrent programming...",
"desc": "Learn about Go's concurrency model and best practices..."
}
]
}
Related Documents
Last modified
March 28, 2025
: docs: eino graph update (#1293) (aea58cb)