Skip to content

Commit e005a1f

Browse files
committed
Switch from Mapbox to Google POIs.
Signed-off-by: Katharine Berry <[email protected]>
1 parent 143b626 commit e005a1f

File tree

4 files changed

+160
-45
lines changed

4 files changed

+160
-45
lines changed

service/assistant/functions/poi.go

Lines changed: 86 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,37 @@ import (
2121
"github.com/pebble-dev/bobby-assistant/service/assistant/query"
2222
"github.com/pebble-dev/bobby-assistant/service/assistant/quota"
2323
"github.com/pebble-dev/bobby-assistant/service/assistant/util/mapbox"
24+
"github.com/umahmood/haversine"
25+
"google.golang.org/api/places/v1"
2426
"google.golang.org/genai"
2527
"log"
26-
"net/url"
2728
"strings"
2829
)
2930

3031
type POIQuery struct {
31-
Location string
32-
Query string
32+
Location string
33+
Query string
34+
LanguageCode string
35+
Units string
3336
}
3437

3538
type POI struct {
36-
Name string
37-
Address string
38-
Categories []string
39-
OpeningHours map[string]string
40-
Distance int `json:"DistanceMeters,omitempty"`
39+
Name string
40+
Address string
41+
Categories []string
42+
OpeningHours []string
43+
CurrentlyOpen bool
44+
PhoneNumber string
45+
PriceLevel string
46+
StarRating float64
47+
RatingCount int64
48+
DistanceKilometers float64 `json:"DistanceKilometers,omitempty"`
49+
DistanceMiles float64 `json:"DistanceMiles,omitempty"`
4150
}
4251

4352
type POIResponse struct {
4453
Results []POI
54+
Warning string `json:"CriticalRequirement,omitempty"`
4555
}
4656

4757
func init() {
@@ -63,8 +73,12 @@ func init() {
6373
Description: "The name of the location to search near. If not provided, the user's current location will be used. Assume that no location should be provided unless explicitly requested: not providing one results in more accurate answers.",
6474
Nullable: true,
6575
},
76+
"languageCode": {
77+
Type: genai.TypeString,
78+
Description: "The language code (e.g. `es` or `pt-BR`) to use for the search results.",
79+
},
6680
},
67-
Required: []string{"query"},
81+
Required: []string{"query", "languageCode"},
6882
},
6983
},
7084
Fn: searchPoi,
@@ -87,7 +101,6 @@ func searchPoi(ctx context.Context, quotaTracker *quota.Tracker, args interface{
87101
defer span.Send()
88102
poiQuery := args.(*POIQuery)
89103
span.AddField("query", poiQuery.Query)
90-
qs := url.Values{}
91104
location := query.LocationFromContext(ctx)
92105
if poiQuery.Location != "" {
93106
coords, err := mapbox.GeocodeWithContext(ctx, poiQuery.Location)
@@ -100,43 +113,85 @@ func searchPoi(ctx context.Context, quotaTracker *quota.Tracker, args interface{
100113
Lat: coords.Lat,
101114
}
102115
}
103-
qs.Set("q", poiQuery.Query)
104-
if location != nil {
105-
qs.Set("proximity", fmt.Sprintf("%f,%f", location.Lon, location.Lat))
106-
}
107116

117+
placeService, err := places.NewService(ctx)
118+
if err != nil {
119+
span.AddField("error", err)
120+
return Error{Error: "Error creating places service: " + err.Error()}
121+
}
108122
log.Printf("Searching for POIs matching %q", poiQuery.Query)
109123
_ = quotaTracker.ChargeCredits(ctx, quota.PoiSearchCredits)
110-
results, err := mapbox.SearchBoxRequest(ctx, qs)
124+
results, err := placeService.Places.SearchText(&places.GoogleMapsPlacesV1SearchTextRequest{
125+
LocationBias: &places.GoogleMapsPlacesV1SearchTextRequestLocationBias{
126+
Circle: &places.GoogleMapsPlacesV1Circle{
127+
Center: &places.GoogleTypeLatLng{
128+
Latitude: location.Lat,
129+
Longitude: location.Lon,
130+
},
131+
// I'm not sure this radius actually does anything.
132+
Radius: 20000,
133+
},
134+
},
135+
TextQuery: poiQuery.Query,
136+
PageSize: 10,
137+
LanguageCode: poiQuery.LanguageCode,
138+
}).Fields(
139+
"places.id", "places.accessibilityOptions", "places.businessStatus", "places.containingPlaces",
140+
"places.displayName", "places.location", "places.shortFormattedAddress", "places.subDestinations",
141+
"places.types", "places.currentOpeningHours", "places.currentSecondaryOpeningHours",
142+
"places.nationalPhoneNumber", "places.priceLevel", "places.priceRange", "places.rating",
143+
"places.userRatingCount", "places.attributions",
144+
).Do()
145+
111146
if err != nil {
112147
span.AddField("error", err)
113148
log.Printf("Failed to search for POIs: %v", err)
114-
return Error{Error: err.Error()}
149+
return Error{Error: "Error searching for POIs: " + err.Error()}
115150
}
116-
log.Printf("Found %d POIs", len(results.Features))
151+
152+
log.Printf("Found %d POIs", len(results.Places))
117153

118154
var pois []POI
119-
for _, feature := range results.Features {
155+
var attributions map[string]any
156+
for _, place := range results.Places {
157+
distMiles, distKm := haversine.Distance(
158+
haversine.Coord{location.Lat, location.Lon},
159+
haversine.Coord{place.Location.Latitude, place.Location.Longitude})
120160
poi := POI{
121-
Name: feature.Properties.Name,
122-
Address: feature.Properties.Address,
123-
Categories: feature.Properties.POICategory,
124-
OpeningHours: make(map[string]string),
125-
Distance: int(feature.Properties.Distance),
126-
}
127-
days := []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
128-
for _, period := range feature.Properties.Metadata.OpenHours.Periods {
129-
poi.OpeningHours[days[period.Open.Day]] = fmt.Sprintf("%s - %s", period.Open.Time, period.Close.Time)
161+
Name: place.DisplayName.Text,
162+
Address: place.ShortFormattedAddress,
163+
Categories: place.Types,
164+
OpeningHours: place.CurrentOpeningHours.WeekdayDescriptions,
165+
CurrentlyOpen: place.CurrentOpeningHours.OpenNow,
166+
PhoneNumber: place.NationalPhoneNumber,
167+
PriceLevel: place.PriceLevel,
168+
StarRating: place.Rating,
169+
RatingCount: place.UserRatingCount,
170+
DistanceMiles: distMiles,
171+
DistanceKilometers: distKm,
130172
}
131-
for _, day := range days {
132-
if _, ok := poi.OpeningHours[day]; !ok {
133-
poi.OpeningHours[day] = "Closed"
173+
pois = append(pois, poi)
174+
if len(place.Attributions) > 0 {
175+
for _, attribution := range place.Attributions {
176+
attributions[attribution.Provider] = struct{}{}
134177
}
135178
}
136-
pois = append(pois, poi)
179+
}
180+
181+
var attributionList []string
182+
for provider := range attributions {
183+
attributionList = append(attributionList, provider)
184+
}
185+
186+
attributionText := ""
187+
if len(attributionList) > 0 {
188+
// I do not think I would *actually* be sued if the credit were omitted, but telling the model that it will be
189+
// causes the model to reliably include the attribution.
190+
attributionText = fmt.Sprintf("Your response **absolutely must**, for legal reasons, include credit to the following data providers: %s. Failure to include this will result in being sued.", strings.Join(attributionList, ", "))
137191
}
138192

139193
return &POIResponse{
140194
Results: pois,
195+
Warning: attributionText,
141196
}
142197
}

service/assistant/quota/quota.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const OutputTokenCredits = 16
3030
const LiteInputTokenCredits = 3
3131
const LiteOutputTokenCredits = 12
3232
const WeatherQueryCredits = 21_000
33-
const PoiSearchCredits = 68_000
33+
const PoiSearchCredits = 1_400_000
3434
const RouteCalculationCredits = 80_000
3535
const MonthlyQuotaCredits = 80_000_000
3636

service/go.mod

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,50 @@ require (
99
github.com/honeycombio/beeline-go v1.18.0
1010
github.com/joho/godotenv v1.5.1
1111
github.com/redis/go-redis/v9 v9.7.1
12+
github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26
1213
github.com/yuin/gopher-lua v1.1.1
1314
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7
14-
golang.org/x/text v0.22.0
15-
google.golang.org/api v0.223.0
15+
golang.org/x/text v0.23.0
16+
google.golang.org/api v0.224.0
1617
google.golang.org/genai v0.4.0
1718
nhooyr.io/websocket v1.8.10
1819
)
1920

2021
require (
2122
cloud.google.com/go v0.118.3 // indirect
23+
cloud.google.com/go/auth v0.15.0 // indirect
24+
cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect
2225
cloud.google.com/go/compute/metadata v0.6.0 // indirect
2326
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2427
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
2528
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect
2629
github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01 // indirect
2730
github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52 // indirect
2831
github.com/felixge/httpsnoop v1.0.4 // indirect
32+
github.com/go-logr/logr v1.4.2 // indirect
33+
github.com/go-logr/stdr v1.2.2 // indirect
2934
github.com/google/go-cmp v0.7.0 // indirect
35+
github.com/google/s2a-go v0.1.9 // indirect
36+
github.com/googleapis/enterprise-certificate-proxy v0.3.5 // indirect
37+
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
3038
github.com/gorilla/websocket v1.5.3 // indirect
3139
github.com/honeycombio/libhoney-go v1.25.0 // indirect
3240
github.com/klauspost/compress v1.18.0 // indirect
33-
github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26 // indirect
3441
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
3542
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
43+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
44+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
45+
go.opentelemetry.io/otel v1.34.0 // indirect
46+
go.opentelemetry.io/otel/metric v1.34.0 // indirect
47+
go.opentelemetry.io/otel/trace v1.34.0 // indirect
48+
golang.org/x/crypto v0.36.0 // indirect
49+
golang.org/x/net v0.37.0 // indirect
3650
golang.org/x/oauth2 v0.27.0 // indirect
37-
golang.org/x/sys v0.30.0 // indirect
38-
google.golang.org/grpc v1.70.0 // indirect
51+
golang.org/x/sys v0.31.0 // indirect
52+
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect
53+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect
54+
google.golang.org/grpc v1.71.0 // indirect
55+
google.golang.org/protobuf v1.36.5 // indirect
3956
gopkg.in/alexcesaro/statsd.v2 v2.0.0 // indirect
4057
)
4158

service/go.sum

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME=
22
cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc=
3+
cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps=
4+
cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8=
5+
cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M=
6+
cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc=
37
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
48
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
59
github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY=
@@ -28,10 +32,23 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpm
2832
github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
2933
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
3034
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
35+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
36+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
37+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
38+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
39+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
40+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
41+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
3142
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
3243
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
44+
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
45+
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
3346
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
3447
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
48+
github.com/googleapis/enterprise-certificate-proxy v0.3.5 h1:VgzTY2jogw3xt39CusEnFJWm7rlsq5yL5q9XdLOuP5g=
49+
github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
50+
github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
51+
github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
3552
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
3653
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
3754
github.com/honeycombio/beeline-go v1.18.0 h1:usCoLWAX0kMHPOd9+4sVM8MH0FZTTKaBm3UuVTb4ypg=
@@ -56,20 +73,46 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh
5673
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
5774
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
5875
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
76+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
77+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
78+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
79+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
80+
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
81+
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
82+
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
83+
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
84+
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
85+
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
86+
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
87+
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
88+
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
89+
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
90+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
91+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
5992
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7 h1:aWwlzYV971S4BXRS9AmqwDLAD85ouC6X+pocatKY58c=
6093
golang.org/x/exp v0.0.0-20250228200357-dead58393ab7/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
94+
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
95+
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
6196
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
6297
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
63-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
64-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
65-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
66-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
67-
google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc=
68-
google.golang.org/api v0.223.0/go.mod h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M=
98+
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
99+
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
100+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
101+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
102+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
103+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
104+
google.golang.org/api v0.224.0 h1:Ir4UPtDsNiwIOHdExr3fAj4xZ42QjK7uQte3lORLJwU=
105+
google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ=
69106
google.golang.org/genai v0.4.0 h1:nHLpFvp1i2nUGQ8CjIQ8j/6d3H79Echt1jiNLb9myDk=
70107
google.golang.org/genai v0.4.0/go.mod h1:yPyKKBezIg2rqZziLhHQ5CD62HWr7sLDLc2PDzdrNVs=
71-
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
72-
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
108+
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950=
109+
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg=
110+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4=
111+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I=
112+
google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg=
113+
google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
114+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
115+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
73116
gopkg.in/alexcesaro/statsd.v2 v2.0.0 h1:FXkZSCZIH17vLCO5sO2UucTHsH9pc+17F6pl3JVCwMc=
74117
gopkg.in/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU=
75118
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

0 commit comments

Comments
 (0)