67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package builtin
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"math/rand/v2"
|
|
)
|
|
|
|
type randomTool struct {
|
|
enabled bool
|
|
prompt string
|
|
}
|
|
|
|
func NewRandomTool() *randomTool {
|
|
return &randomTool{
|
|
enabled: true,
|
|
prompt: "生成指定范围内的随机整数,默认 0 到 100(含端点)",
|
|
}
|
|
}
|
|
|
|
func (t *randomTool) Name() string { return "random_number" }
|
|
func (t *randomTool) Description() string { return t.prompt }
|
|
func (t *randomTool) Enabled() bool { return t.enabled }
|
|
func (t *randomTool) DefaultConfig() map[string]any {
|
|
return map[string]any{"enabled": true, "prompt": t.prompt}
|
|
}
|
|
|
|
func (t *randomTool) Configure(cfg map[string]any) error {
|
|
var err error
|
|
if t.enabled, err = parseEnabled(cfg); err != nil {
|
|
return err
|
|
}
|
|
if p, ok := cfg["prompt"].(string); ok && p != "" {
|
|
t.prompt = p
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (t *randomTool) Parameters() map[string]any {
|
|
return map[string]any{
|
|
"type": "object",
|
|
"properties": map[string]any{
|
|
"min": map[string]any{"type": "integer", "description": "最小值,默认 0"},
|
|
"max": map[string]any{"type": "integer", "description": "最大值,默认 100"},
|
|
},
|
|
}
|
|
}
|
|
|
|
func (t *randomTool) Execute(args json.RawMessage) (string, error) {
|
|
var p struct {
|
|
Min *int `json:"min"`
|
|
Max *int `json:"max"`
|
|
}
|
|
_ = json.Unmarshal(args, &p)
|
|
min, max := 0, 100
|
|
if p.Min != nil {
|
|
min = *p.Min
|
|
}
|
|
if p.Max != nil {
|
|
max = *p.Max
|
|
}
|
|
if max < min {
|
|
return "", fmt.Errorf("max (%d) 不能小于 min (%d)", max, min)
|
|
}
|
|
return fmt.Sprintf("%d", rand.IntN(max-min+1)+min), nil
|
|
}
|