Files

45 lines
1.1 KiB
Go

package tools
import (
"context"
"fmt"
"github.com/google/uuid"
"github.com/nextlevelbuilder/goclaw/internal/providers"
"github.com/nextlevelbuilder/goclaw/internal/store"
usagecaps "github.com/nextlevelbuilder/goclaw/internal/usage/caps"
)
func reserveToolLLMUsage(ctx context.Context, svc *usagecaps.Service, toolName, providerName, model string, req providers.ChatRequest) (*usagecaps.Reservation, error) {
if svc == nil {
return nil, nil
}
return svc.Preflight(ctx, usagecaps.Request{
TenantID: store.TenantIDFromContext(ctx),
AgentID: store.AgentIDFromContext(ctx),
ProviderName: providerName,
ModelID: model,
ReservationKey: fmt.Sprintf("tool:%s:%s", toolName, uuid.NewString()),
Messages: req.Messages,
MaxOutputTokens: maxOutputTokensFromOptions(req.Options),
})
}
func maxOutputTokensFromOptions(options map[string]any) int {
maxTokens := 1024
if options == nil {
return maxTokens
}
if v, ok := options[providers.OptMaxTokens]; ok {
switch n := v.(type) {
case int:
maxTokens = n
case int64:
maxTokens = int(n)
case float64:
maxTokens = int(n)
}
}
return maxTokens
}