mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-07-25 06:21:10 +00:00
45 lines
1.1 KiB
Go
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
|
|
}
|