43 lines
994 B
Go
43 lines
994 B
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/crypto/byteclaw/internal/llm"
|
|
)
|
|
|
|
// TimeNow returns the current time, optionally in an IANA time zone.
|
|
type TimeNow struct{ Now func() time.Time }
|
|
|
|
func (TimeNow) Spec() llm.ToolSpec {
|
|
return llm.ToolSpec{
|
|
Name: "time_now",
|
|
Description: "Get the current date and time. Optional IANA time zone, e.g. Europe/Berlin.",
|
|
Parameters: obj(map[string]any{"timezone": map[string]any{"type": "string"}}),
|
|
}
|
|
}
|
|
|
|
func (t TimeNow) Call(_ context.Context, raw json.RawMessage) (string, error) {
|
|
var a struct {
|
|
Timezone string `json:"timezone"`
|
|
}
|
|
if err := json.Unmarshal(raw, &a); err != nil {
|
|
return "", err
|
|
}
|
|
now := time.Now
|
|
if t.Now != nil {
|
|
now = t.Now
|
|
}
|
|
n := now()
|
|
if a.Timezone != "" {
|
|
loc, err := time.LoadLocation(a.Timezone)
|
|
if err != nil {
|
|
return "", fmt.Errorf("unknown timezone %q", a.Timezone)
|
|
}
|
|
n = n.In(loc)
|
|
}
|
|
return n.Format("2006-01-02T15:04:05 MST (Monday)"), nil
|
|
}
|