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.

136 lines
4.1 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"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/components/tool/utils"
)
type GetWeatherInput struct {
Location string `json:"location" jsonschema:"description=The city and state, e.g. San Francisco, CA"`
Unit string `json:"unit,omitempty" jsonschema:"enum=celsius,enum=fahrenheit,description=The unit of temperature"`
}
type GetWeatherOutput struct {
Temperature float64 `json:"temperature"`
Unit string `json:"unit"`
Condition string `json:"condition"`
}
type GetForecastInput struct {
Location string `json:"location" jsonschema:"description=The city and state"`
Days int `json:"days" jsonschema:"description=Number of days to forecast (1-10)"`
}
type GetForecastOutput struct {
Forecasts []DayForecast `json:"forecasts"`
}
type DayForecast struct {
Day string `json:"day"`
Temperature float64 `json:"temperature"`
Condition string `json:"condition"`
}
type GetStockPriceInput struct {
Ticker string `json:"ticker" jsonschema:"description=Stock ticker symbol (e.g., AAPL, GOOGL)"`
IncludeHistory bool `json:"include_history,omitempty" jsonschema:"description=Include historical data"`
}
type GetStockPriceOutput struct {
Ticker string `json:"ticker"`
Price float64 `json:"price"`
Change float64 `json:"change"`
}
type ConvertCurrencyInput struct {
Amount float64 `json:"amount" jsonschema:"description=Amount to convert"`
FromCurrency string `json:"from_currency" jsonschema:"description=Source currency code (e.g., USD)"`
ToCurrency string `json:"to_currency" jsonschema:"description=Target currency code (e.g., EUR)"`
}
type ConvertCurrencyOutput struct {
OriginalAmount float64 `json:"original_amount"`
ConvertedAmount float64 `json:"converted_amount"`
ExchangeRate float64 `json:"exchange_rate"`
}
func createWeatherTools() []tool.BaseTool {
getWeather, _ := utils.InferTool(
"get_weather",
"Get the current weather in a given location",
func(ctx context.Context, input *GetWeatherInput) (*GetWeatherOutput, error) {
return &GetWeatherOutput{
Temperature: 22.5,
Unit: input.Unit,
Condition: "Sunny",
}, nil
},
)
getForecast, _ := utils.InferTool(
"get_forecast",
"Get the weather forecast for multiple days ahead",
func(ctx context.Context, input *GetForecastInput) (*GetForecastOutput, error) {
forecasts := make([]DayForecast, input.Days)
for i := 0; i < input.Days; i++ {
forecasts[i] = DayForecast{
Day: fmt.Sprintf("Day %d", i+1),
Temperature: 20.0 + float64(i),
Condition: "Partly Cloudy",
}
}
return &GetForecastOutput{Forecasts: forecasts}, nil
},
)
return []tool.BaseTool{getWeather, getForecast}
}
func createFinanceTools() []tool.BaseTool {
getStockPrice, _ := utils.InferTool(
"get_stock_price",
"Get the current stock price and market data for a given ticker symbol",
func(ctx context.Context, input *GetStockPriceInput) (*GetStockPriceOutput, error) {
return &GetStockPriceOutput{
Ticker: input.Ticker,
Price: 150.25,
Change: 2.5,
}, nil
},
)
convertCurrency, _ := utils.InferTool(
"convert_currency",
"Convert an amount from one currency to another using current exchange rates",
func(ctx context.Context, input *ConvertCurrencyInput) (*ConvertCurrencyOutput, error) {
rate := 0.85
return &ConvertCurrencyOutput{
OriginalAmount: input.Amount,
ConvertedAmount: input.Amount * rate,
ExchangeRate: rate,
}, nil
},
)
return []tool.BaseTool{getStockPrice, convertCurrency}
}