error.go

 1package google
 2
 3import (
 4	"cmp"
 5	"errors"
 6	"regexp"
 7	"strconv"
 8
 9	"charm.land/fantasy"
10	"google.golang.org/genai"
11)
12
13var googleContextPattern = regexp.MustCompile(`input token count.*?(\d+).*?exceeds.*?maximum.*?(\d+)`)
14
15func toProviderErr(err error) error {
16	var apiErr genai.APIError
17	if !errors.As(err, &apiErr) {
18		return err
19	}
20
21	providerErr := &fantasy.ProviderError{
22		Message:      apiErr.Message,
23		Title:        cmp.Or(fantasy.ErrorTitleForStatusCode(apiErr.Code), "provider request failed"),
24		Cause:        err,
25		StatusCode:   apiErr.Code,
26		ResponseBody: []byte(apiErr.Message),
27	}
28
29	parseContextTooLargeError(apiErr.Message, providerErr)
30
31	return providerErr
32}
33
34func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) {
35	matches := googleContextPattern.FindStringSubmatch(message)
36	if matches == nil {
37		return
38	}
39	providerErr.ContextTooLargeErr = true
40	providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1])
41	providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2])
42}