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}