Skip to content

Commit 81d1f90

Browse files
adds backend for otel
1 parent 74548e9 commit 81d1f90

File tree

41 files changed

+1469
-289
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1469
-289
lines changed

core/bifrost.go

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@ type ChannelMessage struct {
3232
// It handles request routing, provider management, and response processing.
3333
type Bifrost struct {
3434
ctx context.Context
35-
account schemas.Account // account interface
36-
plugins []schemas.Plugin // list of plugins
37-
requestQueues sync.Map // provider request queues (thread-safe)
38-
waitGroups sync.Map // wait groups for each provider (thread-safe)
39-
providerMutexes sync.Map // mutexes for each provider to prevent concurrent updates (thread-safe)
40-
channelMessagePool sync.Pool // Pool for ChannelMessage objects, initial pool size is set in Init
41-
responseChannelPool sync.Pool // Pool for response channels, initial pool size is set in Init
42-
errorChannelPool sync.Pool // Pool for error channels, initial pool size is set in Init
43-
responseStreamPool sync.Pool // Pool for response stream channels, initial pool size is set in Init
44-
pluginPipelinePool sync.Pool // Pool for PluginPipeline objects
45-
logger schemas.Logger // logger instance, default logger is used if not provided
46-
mcpManager *MCPManager // MCP integration manager (nil if MCP not configured)
47-
dropExcessRequests atomic.Bool // If true, in cases where the queue is full, requests will not wait for the queue to be empty and will be dropped instead.
35+
account schemas.Account // account interface
36+
plugins atomic.Pointer[[]schemas.Plugin] // list of plugins
37+
requestQueues sync.Map // provider request queues (thread-safe)
38+
waitGroups sync.Map // wait groups for each provider (thread-safe)
39+
providerMutexes sync.Map // mutexes for each provider to prevent concurrent updates (thread-safe)
40+
channelMessagePool sync.Pool // Pool for ChannelMessage objects, initial pool size is set in Init
41+
responseChannelPool sync.Pool // Pool for response channels, initial pool size is set in Init
42+
errorChannelPool sync.Pool // Pool for error channels, initial pool size is set in Init
43+
responseStreamPool sync.Pool // Pool for response stream channels, initial pool size is set in Init
44+
pluginPipelinePool sync.Pool // Pool for PluginPipeline objects
45+
logger schemas.Logger // logger instance, default logger is used if not provided
46+
mcpManager *MCPManager // MCP integration manager (nil if MCP not configured)
47+
dropExcessRequests atomic.Bool // If true, in cases where the queue is full, requests will not wait for the queue to be empty and will be dropped instead.
4848
}
4949

5050
// PluginPipeline encapsulates the execution of plugin PreHooks and PostHooks, tracks how many plugins ran, and manages short-circuiting and error aggregation.
@@ -82,10 +82,11 @@ func Init(ctx context.Context, config schemas.BifrostConfig) (*Bifrost, error) {
8282
bifrost := &Bifrost{
8383
ctx: ctx,
8484
account: config.Account,
85-
plugins: config.Plugins,
85+
plugins: atomic.Pointer[[]schemas.Plugin]{},
8686
requestQueues: sync.Map{},
8787
waitGroups: sync.Map{},
8888
}
89+
bifrost.plugins.Store(&config.Plugins)
8990
bifrost.dropExcessRequests.Store(config.DropExcessRequests)
9091

9192
// Initialize object pools
@@ -293,6 +294,38 @@ func (bifrost *Bifrost) TranscriptionStreamRequest(ctx context.Context, req *sch
293294
return bifrost.handleStreamRequest(ctx, req, schemas.TranscriptionStreamRequest)
294295
}
295296

297+
// ReloadPlugin reloads a plugin with new instance
298+
// During the reload - it's stop the world phase where we take a global lock on the plugin mutex
299+
func (bifrost *Bifrost) ReloadPlugin(plugin schemas.Plugin) error {
300+
for {
301+
oldPlugins := bifrost.plugins.Load()
302+
if oldPlugins == nil {
303+
return nil
304+
}
305+
// Create new slice with replaced plugin
306+
newPlugins := make([]schemas.Plugin, len(*oldPlugins))
307+
copy(newPlugins, *oldPlugins)
308+
found := false
309+
for i, p := range newPlugins {
310+
if p.GetName() == plugin.GetName() {
311+
newPlugins[i] = plugin
312+
found = true
313+
break
314+
}
315+
}
316+
if !found{
317+
// This means that user is adding a new plugin
318+
newPlugins = append(newPlugins, plugin)
319+
}
320+
// Atomic compare-and-swap
321+
if bifrost.plugins.CompareAndSwap(oldPlugins, &newPlugins) {
322+
return nil
323+
}
324+
// Retrying as swapping did not work
325+
}
326+
327+
}
328+
296329
// UpdateProviderConcurrency dynamically updates the queue size and concurrency for an existing provider.
297330
// This method gracefully stops existing workers, creates a new queue with updated settings,
298331
// and starts new workers with the updated concurrency configuration.
@@ -1016,7 +1049,7 @@ func (bifrost *Bifrost) tryRequest(req *schemas.BifrostRequest, ctx context.Cont
10161049
var resp *schemas.BifrostResponse
10171050
select {
10181051
case result = <-msg.Response:
1019-
resp, bifrostErr := pipeline.RunPostHooks(&ctx, result, nil, len(bifrost.plugins))
1052+
resp, bifrostErr := pipeline.RunPostHooks(&ctx, result, nil, len(*bifrost.plugins.Load()))
10201053
if bifrostErr != nil {
10211054
bifrost.releaseChannelMessage(msg)
10221055
return nil, bifrostErr
@@ -1025,7 +1058,7 @@ func (bifrost *Bifrost) tryRequest(req *schemas.BifrostRequest, ctx context.Cont
10251058
return resp, nil
10261059
case bifrostErrVal := <-msg.Err:
10271060
bifrostErrPtr := &bifrostErrVal
1028-
resp, bifrostErrPtr = pipeline.RunPostHooks(&ctx, nil, bifrostErrPtr, len(bifrost.plugins))
1061+
resp, bifrostErrPtr = pipeline.RunPostHooks(&ctx, nil, bifrostErrPtr, len(*bifrost.plugins.Load()))
10291062
bifrost.releaseChannelMessage(msg)
10301063
if bifrostErrPtr != nil {
10311064
return nil, bifrostErrPtr
@@ -1200,7 +1233,7 @@ func (bifrost *Bifrost) requestWorker(provider schemas.Provider, config *schemas
12001233
defer bifrost.releasePluginPipeline(pipeline)
12011234

12021235
postHookRunner = func(ctx *context.Context, result *schemas.BifrostResponse, err *schemas.BifrostError) (*schemas.BifrostResponse, *schemas.BifrostError) {
1203-
resp, bifrostErr := pipeline.RunPostHooks(ctx, result, err, len(bifrost.plugins))
1236+
resp, bifrostErr := pipeline.RunPostHooks(ctx, result, err, len(*bifrost.plugins.Load()))
12041237
if bifrostErr != nil {
12051238
return nil, bifrostErr
12061239
}
@@ -1399,7 +1432,7 @@ func (p *PluginPipeline) resetPluginPipeline() {
13991432
// getPluginPipeline gets a PluginPipeline from the pool and configures it
14001433
func (bifrost *Bifrost) getPluginPipeline() *PluginPipeline {
14011434
pipeline := bifrost.pluginPipelinePool.Get().(*PluginPipeline)
1402-
pipeline.plugins = bifrost.plugins
1435+
pipeline.plugins = *bifrost.plugins.Load()
14031436
pipeline.logger = bifrost.logger
14041437
pipeline.resetPluginPipeline()
14051438
return pipeline
@@ -1579,7 +1612,7 @@ func (bifrost *Bifrost) Shutdown() {
15791612
}
15801613

15811614
// Cleanup plugins
1582-
for _, plugin := range bifrost.plugins {
1615+
for _, plugin := range *bifrost.plugins.Load() {
15831616
err := plugin.Cleanup()
15841617
if err != nil {
15851618
bifrost.logger.Warn(fmt.Sprintf("Error cleaning up plugin: %s", err.Error()))

core/providers/bedrock.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ func (provider *BedrockProvider) ChatCompletion(ctx context.Context, model strin
10981098
},
10991099
}
11001100

1101-
latency := float64(response.Metrics.Latency)
1101+
latency := int64(response.Metrics.Latency)
11021102

11031103
// Create final response
11041104
bifrostResponse := &schemas.BifrostResponse{

core/schemas/bifrost.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,6 @@ type BifrostRequest struct {
276276
Model string `json:"model"`
277277
Input RequestInput `json:"input"`
278278
Params *ModelParameters `json:"params,omitempty"`
279-
280279
// Fallbacks are tried in order, the first one to succeed is returned
281280
// Provider config must be available for each fallback's provider in account's GetConfigForProvider,
282281
// else it will be skipped.
@@ -334,7 +333,7 @@ type Tool struct {
334333
Function Function `json:"function"` // Function definition
335334
}
336335

337-
// Combined tool choices for all providers, make sure to check the provider's
336+
// ToolChoiceType is combined tool choices for all providers, make sure to check the provider's
338337
// documentation to see which tool choices are supported.
339338
type ToolChoiceType string
340339

@@ -793,7 +792,7 @@ type TranscriptionUsage struct {
793792
type BifrostResponseExtraFields struct {
794793
Provider ModelProvider `json:"provider"`
795794
Params ModelParameters `json:"model_params"`
796-
Latency *float64 `json:"latency,omitempty"`
795+
Latency *int64 `json:"latency,omitempty"`
797796
ChatHistory *[]BifrostMessage `json:"chat_history,omitempty"`
798797
BilledUsage *BilledLLMUsage `json:"billed_usage,omitempty"`
799798
ChunkIndex int `json:"chunk_index"` // used for streaming responses to identify the chunk index, will be 0 for non-streaming responses

framework/go.mod

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
github.com/weaviate/weaviate v1.31.5
1313
github.com/weaviate/weaviate-go-client/v5 v5.2.0
1414
gorm.io/driver/sqlite v1.6.0
15-
gorm.io/gorm v1.30.1
15+
gorm.io/gorm v1.31.0
1616
)
1717

1818
require (
@@ -74,16 +74,14 @@ require (
7474
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
7575
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
7676
go.mongodb.org/mongo-driver v1.14.0 // indirect
77-
go.opentelemetry.io/otel v1.37.0 // indirect
78-
go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
7977
golang.org/x/arch v0.20.0 // indirect
8078
golang.org/x/net v0.43.0 // indirect
8179
golang.org/x/oauth2 v0.30.0 // indirect
8280
golang.org/x/sys v0.35.0 // indirect
8381
golang.org/x/text v0.28.0 // indirect
84-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect
85-
google.golang.org/grpc v1.74.2 // indirect
86-
google.golang.org/protobuf v1.36.7 // indirect
82+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
83+
google.golang.org/grpc v1.75.0 // indirect
84+
google.golang.org/protobuf v1.36.8 // indirect
8785
gopkg.in/yaml.v2 v2.4.0 // indirect
8886
gopkg.in/yaml.v3 v3.0.1 // indirect
8987
)

framework/go.sum

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,10 @@ golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3
325325
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
326326
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
327327
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
328-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc=
329-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=
330-
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
331-
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
332-
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
333-
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
328+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
329+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
330+
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
331+
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
334332
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
335333
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
336334
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -349,5 +347,4 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
349347
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
350348
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
351349
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
352-
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
353-
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
350+
gorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY=

plugins/governance/go.mod

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24.1
44

55
toolchain go1.24.3
66

7-
require gorm.io/gorm v1.30.1
7+
require gorm.io/gorm v1.31.0
88

99
require (
1010
github.com/maximhq/bifrost/core v1.1.38
@@ -72,17 +72,14 @@ require (
7272
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
7373
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
7474
go.mongodb.org/mongo-driver v1.14.0 // indirect
75-
go.opentelemetry.io/otel/metric v1.37.0 // indirect
76-
go.opentelemetry.io/otel/sdk v1.37.0 // indirect
77-
go.opentelemetry.io/otel/trace v1.37.0 // indirect
7875
golang.org/x/arch v0.20.0 // indirect
7976
golang.org/x/net v0.43.0 // indirect
8077
golang.org/x/oauth2 v0.30.0 // indirect
8178
golang.org/x/sys v0.35.0 // indirect
8279
golang.org/x/text v0.28.0 // indirect
83-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect
84-
google.golang.org/grpc v1.74.2 // indirect
85-
google.golang.org/protobuf v1.36.7 // indirect
80+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
81+
google.golang.org/grpc v1.75.0 // indirect
82+
google.golang.org/protobuf v1.36.8 // indirect
8683
gopkg.in/yaml.v2 v2.4.0 // indirect
8784
gopkg.in/yaml.v3 v3.0.1 // indirect
8885
gorm.io/driver/sqlite v1.6.0 // indirect

plugins/governance/go.sum

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,10 @@ golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3
327327
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
328328
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
329329
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
330-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc=
331-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=
332-
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
333-
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
334-
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
335-
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
330+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
331+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
332+
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
333+
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
336334
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
337335
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
338336
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -351,5 +349,4 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
351349
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
352350
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
353351
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
354-
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
355-
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
352+
gorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY=

plugins/logging/go.mod

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,16 @@ require (
7070
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
7171
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
7272
go.mongodb.org/mongo-driver v1.14.0 // indirect
73-
go.opentelemetry.io/otel/metric v1.37.0 // indirect
74-
go.opentelemetry.io/otel/sdk v1.37.0 // indirect
75-
go.opentelemetry.io/otel/trace v1.37.0 // indirect
7673
golang.org/x/arch v0.20.0 // indirect
7774
golang.org/x/net v0.43.0 // indirect
7875
golang.org/x/oauth2 v0.30.0 // indirect
7976
golang.org/x/sys v0.35.0 // indirect
8077
golang.org/x/text v0.28.0 // indirect
81-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect
82-
google.golang.org/grpc v1.74.2 // indirect
83-
google.golang.org/protobuf v1.36.7 // indirect
78+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
79+
google.golang.org/grpc v1.75.0 // indirect
80+
google.golang.org/protobuf v1.36.8 // indirect
8481
gopkg.in/yaml.v2 v2.4.0 // indirect
8582
gopkg.in/yaml.v3 v3.0.1 // indirect
8683
gorm.io/driver/sqlite v1.6.0 // indirect
87-
gorm.io/gorm v1.30.1 // indirect
84+
gorm.io/gorm v1.31.0 // indirect
8885
)

plugins/logging/go.sum

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,10 @@ golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3
327327
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
328328
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
329329
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
330-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc=
331-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=
332-
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
333-
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
334-
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
335-
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
330+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
331+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
332+
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
333+
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
336334
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
337335
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
338336
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -351,5 +349,4 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
351349
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
352350
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
353351
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
354-
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
355-
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
352+
gorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY=

0 commit comments

Comments
 (0)