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
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)
|
|
}
|