You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
6.2 KiB
Go

/*
* Copyright 2025 CloudWeGo Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package main
import (
"context"
"fmt"
"hash/fnv"
"strings"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/components/tool/utils"
)
type SearchRequest struct {
Query string `json:"query" jsonschema_description:"The search query to find information"`
Category string `json:"category" jsonschema_description:"Category of information (market, technology, finance, general)"`
}
type SearchResponse struct {
Query string `json:"query"`
Results []SearchResult `json:"results"`
}
type SearchResult struct {
Title string `json:"title"`
Summary string `json:"summary"`
Source string `json:"source"`
}
type AnalyzeRequest struct {
Data string `json:"data" jsonschema_description:"The data to analyze"`
AnalysisType string `json:"analysis_type" jsonschema_description:"Type of analysis (trend, comparison, summary, statistical)"`
}
type AnalyzeResponse struct {
AnalysisType string `json:"analysis_type"`
Findings []string `json:"findings"`
Conclusion string `json:"conclusion"`
}
func NewSearchTool(ctx context.Context) (tool.BaseTool, error) {
return utils.InferTool("search", "Search for information on various topics",
func(ctx context.Context, req *SearchRequest) (*SearchResponse, error) {
marketData := map[string][]SearchResult{
"market": {
{Title: "Q3 2025 Market Overview", Summary: "Global markets showed mixed performance with tech sector leading gains", Source: "MarketWatch"},
{Title: "Emerging Markets Analysis", Summary: "Asian markets outperformed expectations with 12% YoY growth", Source: "Bloomberg"},
{Title: "Commodity Prices Update", Summary: "Oil prices stabilized around $75/barrel amid supply concerns", Source: "Reuters"},
},
"technology": {
{Title: "AI Industry Report 2025", Summary: "AI adoption in enterprises reached 67%, up from 45% in 2024", Source: "Gartner"},
{Title: "Cloud Computing Trends", Summary: "Multi-cloud strategies dominate with 78% of enterprises using 2+ providers", Source: "IDC"},
{Title: "Semiconductor Outlook", Summary: "Chip shortage easing with new fab capacity coming online in Q4", Source: "TechCrunch"},
},
"finance": {
{Title: "Interest Rate Forecast", Summary: "Fed expected to maintain rates through Q4 2025", Source: "WSJ"},
{Title: "Banking Sector Health", Summary: "Major banks report strong Q3 earnings with 15% profit growth", Source: "Financial Times"},
{Title: "Cryptocurrency Update", Summary: "Bitcoin stabilizes around $45K with institutional adoption increasing", Source: "CoinDesk"},
},
}
category := strings.ToLower(req.Category)
if category == "" {
category = "general"
}
if results, ok := marketData[category]; ok {
return &SearchResponse{
Query: req.Query,
Results: results,
}, nil
}
hashInput := req.Query + req.Category
return &SearchResponse{
Query: req.Query,
Results: []SearchResult{
{
Title: fmt.Sprintf("Research on: %s", req.Query),
Summary: fmt.Sprintf("Comprehensive analysis of %s shows positive trends", req.Query),
Source: "Research Database",
},
{
Title: fmt.Sprintf("Latest Updates: %s", req.Query),
Summary: fmt.Sprintf("Recent developments in %s indicate growth potential", req.Query),
Source: fmt.Sprintf("Source-%d", consistentHashing(hashInput, 1, 100)),
},
},
}, nil
})
}
func NewAnalyzeTool(ctx context.Context) (tool.BaseTool, error) {
return utils.InferTool("analyze", "Analyze data and generate insights",
func(ctx context.Context, req *AnalyzeRequest) (*AnalyzeResponse, error) {
analysisResults := map[string]struct {
findings []string
conclusion string
}{
"trend": {
findings: []string{
"Upward trend observed over the past 6 months",
"Growth rate accelerating in recent quarters",
"Seasonal patterns detected with Q4 peaks",
},
conclusion: "Overall positive trajectory with strong momentum",
},
"comparison": {
findings: []string{
"Performance exceeds industry average by 15%",
"Competitive positioning improved year-over-year",
"Market share gains observed in key segments",
},
conclusion: "Favorable comparison against benchmarks",
},
"summary": {
findings: []string{
"Key metrics show healthy performance",
"Major milestones achieved on schedule",
"Strategic initiatives progressing well",
},
conclusion: "Overall status is positive with continued growth expected",
},
"statistical": {
findings: []string{
"Mean value: 45.2, Median: 43.8",
"Standard deviation: 12.3",
"95% confidence interval: [40.1, 50.3]",
"Correlation coefficient: 0.82 (strong positive)",
},
conclusion: "Statistical analysis indicates significant patterns with high confidence",
},
}
analysisType := strings.ToLower(req.AnalysisType)
if analysisType == "" {
analysisType = "summary"
}
if result, ok := analysisResults[analysisType]; ok {
return &AnalyzeResponse{
AnalysisType: req.AnalysisType,
Findings: result.findings,
Conclusion: result.conclusion,
}, nil
}
return &AnalyzeResponse{
AnalysisType: req.AnalysisType,
Findings: []string{
"Analysis completed successfully",
"Data patterns identified",
"Insights generated based on input",
},
Conclusion: "Analysis complete with actionable insights",
}, nil
})
}
func consistentHashing(s string, min, max int) int {
h := fnv.New32a()
h.Write([]byte(s))
hash := h.Sum32()
return min + int(hash)%(max-min+1)
}