Files
WeKnora/internal/agent/tools/param_cast_test.go
wizardchen e936e0b347 feat(agent): implement LLM call timeout and transient error handling
- Introduced a configurable LLM call timeout with a default value, allowing for better control over LLM call durations.
- Added logic to retry transient errors (e.g., timeouts, rate limits) up to a specified maximum number of retries, improving robustness in error handling.
- Implemented parameter casting for tool arguments to ensure correct types are used, addressing common LLM quirks.
- Enhanced tool execution error messages with guidance for retrying with different approaches.
- Added validation for configuration values to prevent runtime errors.
2026-03-25 22:08:29 +08:00

82 lines
2.3 KiB
Go

package tools
import (
"encoding/json"
"testing"
)
func TestCastParams_StringToBool(t *testing.T) {
schema := json.RawMessage(`{"type":"object","properties":{"enabled":{"type":"boolean"}}}`)
args := json.RawMessage(`{"enabled":"true"}`)
result := CastParams(args, schema)
var parsed map[string]interface{}
if err := json.Unmarshal(result, &parsed); err != nil {
t.Fatal(err)
}
if parsed["enabled"] != true {
t.Errorf("expected true, got %v (%T)", parsed["enabled"], parsed["enabled"])
}
}
func TestCastParams_StringToInt(t *testing.T) {
schema := json.RawMessage(`{"type":"object","properties":{"count":{"type":"integer"}}}`)
args := json.RawMessage(`{"count":"42"}`)
result := CastParams(args, schema)
var parsed map[string]interface{}
if err := json.Unmarshal(result, &parsed); err != nil {
t.Fatal(err)
}
// JSON numbers are float64 in Go
if parsed["count"] != float64(42) {
t.Errorf("expected 42, got %v (%T)", parsed["count"], parsed["count"])
}
}
func TestCastParams_StringToFloat(t *testing.T) {
schema := json.RawMessage(`{"type":"object","properties":{"score":{"type":"number"}}}`)
args := json.RawMessage(`{"score":"3.14"}`)
result := CastParams(args, schema)
var parsed map[string]interface{}
if err := json.Unmarshal(result, &parsed); err != nil {
t.Fatal(err)
}
if parsed["score"] != 3.14 {
t.Errorf("expected 3.14, got %v", parsed["score"])
}
}
func TestCastParams_NoChangeNeeded(t *testing.T) {
schema := json.RawMessage(`{"type":"object","properties":{"name":{"type":"string"}}}`)
args := json.RawMessage(`{"name":"hello"}`)
result := CastParams(args, schema)
if string(result) != string(args) {
t.Errorf("expected no change, got %s", result)
}
}
func TestCastParams_NilSchema(t *testing.T) {
args := json.RawMessage(`{"foo":"bar"}`)
result := CastParams(args, nil)
if string(result) != string(args) {
t.Errorf("expected no change with nil schema")
}
}
func TestCastParams_BoolFalseString(t *testing.T) {
schema := json.RawMessage(`{"type":"object","properties":{"flag":{"type":"boolean"}}}`)
args := json.RawMessage(`{"flag":"false"}`)
result := CastParams(args, schema)
var parsed map[string]interface{}
if err := json.Unmarshal(result, &parsed); err != nil {
t.Fatal(err)
}
if parsed["flag"] != false {
t.Errorf("expected false, got %v (%T)", parsed["flag"], parsed["flag"])
}
}