diff --git a/backend/cmd/server/wire_gen.go b/backend/cmd/server/wire_gen.go index d7c5c26..c5c2997 100644 --- a/backend/cmd/server/wire_gen.go +++ b/backend/cmd/server/wire_gen.go @@ -17,14 +17,14 @@ import ( v1_4 "github.com/chaitin/MonkeyCode/backend/internal/dashboard/handler/v1" repo6 "github.com/chaitin/MonkeyCode/backend/internal/dashboard/repo" usecase5 "github.com/chaitin/MonkeyCode/backend/internal/dashboard/usecase" - repo3 "github.com/chaitin/MonkeyCode/backend/internal/extension/repo" + repo4 "github.com/chaitin/MonkeyCode/backend/internal/extension/repo" usecase2 "github.com/chaitin/MonkeyCode/backend/internal/extension/usecase" "github.com/chaitin/MonkeyCode/backend/internal/middleware" v1_2 "github.com/chaitin/MonkeyCode/backend/internal/model/handler/http/v1" - repo4 "github.com/chaitin/MonkeyCode/backend/internal/model/repo" + repo2 "github.com/chaitin/MonkeyCode/backend/internal/model/repo" usecase3 "github.com/chaitin/MonkeyCode/backend/internal/model/usecase" "github.com/chaitin/MonkeyCode/backend/internal/openai/handler/v1" - repo2 "github.com/chaitin/MonkeyCode/backend/internal/openai/repo" + repo3 "github.com/chaitin/MonkeyCode/backend/internal/openai/repo" "github.com/chaitin/MonkeyCode/backend/internal/openai/usecase" "github.com/chaitin/MonkeyCode/backend/internal/proxy" "github.com/chaitin/MonkeyCode/backend/internal/proxy/repo" @@ -54,17 +54,17 @@ func newServer() (*Server, error) { return nil, err } proxyRepo := repo.NewProxyRepo(client) - proxyUsecase := usecase.NewProxyUsecase(proxyRepo) + modelRepo := repo2.NewModelRepo(client) + proxyUsecase := usecase.NewProxyUsecase(proxyRepo, modelRepo) domainProxy := proxy.NewLLMProxy(proxyUsecase, configConfig, slogLogger) - openAIRepo := repo2.NewOpenAIRepo(client) + openAIRepo := repo3.NewOpenAIRepo(client) openAIUsecase := openai.NewOpenAIUsecase(configConfig, openAIRepo, slogLogger) - extensionRepo := repo3.NewExtensionRepo(client) + extensionRepo := repo4.NewExtensionRepo(client) extensionUsecase := usecase2.NewExtensionUsecase(extensionRepo, configConfig, slogLogger) proxyMiddleware := middleware.NewProxyMiddleware(proxyUsecase) redisClient := store.NewRedisCli(configConfig) activeMiddleware := middleware.NewActiveMiddleware(redisClient, slogLogger) v1Handler := v1.NewV1Handler(slogLogger, web, domainProxy, openAIUsecase, extensionUsecase, proxyMiddleware, activeMiddleware, configConfig) - modelRepo := repo4.NewModelRepo(client) modelUsecase := usecase3.NewModelUsecase(slogLogger, modelRepo, configConfig) sessionSession := session.NewSession(configConfig) authMiddleware := middleware.NewAuthMiddleware(sessionSession, slogLogger) diff --git a/backend/domain/model.go b/backend/domain/model.go index 583f26b..a64e778 100644 --- a/backend/domain/model.go +++ b/backend/domain/model.go @@ -20,6 +20,7 @@ type ModelUsecase interface { } type ModelRepo interface { + GetWithCache(ctx context.Context, modelType consts.ModelType) (*db.Model, error) List(ctx context.Context) (*AllModelResp, error) Create(ctx context.Context, m *CreateModelReq) (*db.Model, error) Update(ctx context.Context, id string, fn func(tx *db.Tx, old *db.Model, up *db.ModelUpdateOne) error) (*db.Model, error) diff --git a/backend/domain/proxy.go b/backend/domain/proxy.go index a7a2d25..d344a98 100644 --- a/backend/domain/proxy.go +++ b/backend/domain/proxy.go @@ -10,7 +10,6 @@ import ( "github.com/chaitin/MonkeyCode/backend/db" ) -// Proxy LLM API代理接口 type Proxy interface { AcceptCompletion(ctx context.Context, req *AcceptCompletionReq) error HandleCompletion(ctx context.Context, w http.ResponseWriter, req CompletionRequest) diff --git a/backend/go.mod b/backend/go.mod index 1855d9f..85acd2d 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -10,6 +10,7 @@ require ( github.com/google/wire v0.6.0 github.com/labstack/echo/v4 v4.13.4 github.com/lib/pq v1.10.9 + github.com/patrickmn/go-cache v2.1.0+incompatible github.com/redis/go-redis/v9 v9.7.3 github.com/rokku-c/go-openai v1.35.7-fix2 github.com/spf13/viper v1.20.1 diff --git a/backend/go.sum b/backend/go.sum index 9f2f330..b26474e 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -115,6 +115,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/backend/internal/model/repo/model.go b/backend/internal/model/repo/model.go index cbc1616..faac2c9 100644 --- a/backend/internal/model/repo/model.go +++ b/backend/internal/model/repo/model.go @@ -6,6 +6,7 @@ import ( "entgo.io/ent/dialect/sql" "github.com/google/uuid" + "github.com/patrickmn/go-cache" "github.com/chaitin/MonkeyCode/backend/consts" "github.com/chaitin/MonkeyCode/backend/db" @@ -18,11 +19,30 @@ import ( ) type ModelRepo struct { - db *db.Client + db *db.Client + cache *cache.Cache } func NewModelRepo(db *db.Client) domain.ModelRepo { - return &ModelRepo{db: db} + cache := cache.New(24*time.Hour, 10*time.Minute) + return &ModelRepo{db: db, cache: cache} +} + +func (r *ModelRepo) GetWithCache(ctx context.Context, modelType consts.ModelType) (*db.Model, error) { + if v, ok := r.cache.Get(string(modelType)); ok { + return v.(*db.Model), nil + } + + m, err := r.db.Model.Query(). + Where(model.ModelType(modelType)). + Where(model.Status(consts.ModelStatusActive)). + Only(ctx) + if err != nil { + return nil, err + } + + r.cache.Set(string(modelType), m, 24*time.Hour) + return m, nil } func (r *ModelRepo) Create(ctx context.Context, m *domain.CreateModelReq) (*db.Model, error) { @@ -40,6 +60,7 @@ func (r *ModelRepo) Create(ctx context.Context, m *domain.CreateModelReq) (*db.M status = consts.ModelStatusActive } + r.cache.Delete(string(m.ModelType)) return r.db.Model.Create(). SetUserID(uid). SetModelName(m.ModelName). @@ -62,6 +83,7 @@ func (r *ModelRepo) Update(ctx context.Context, id string, fn func(tx *db.Tx, ol if err != nil { return err } + r.cache.Delete(string(old.ModelType)) up := tx.Model.UpdateOneID(old.ID) if err := fn(tx, old, up); err != nil { diff --git a/backend/internal/proxy/usecase/proxy.go b/backend/internal/proxy/usecase/proxy.go index 2a39f54..065e506 100644 --- a/backend/internal/proxy/usecase/proxy.go +++ b/backend/internal/proxy/usecase/proxy.go @@ -10,11 +10,12 @@ import ( ) type ProxyUsecase struct { - repo domain.ProxyRepo + repo domain.ProxyRepo + modelRepo domain.ModelRepo } -func NewProxyUsecase(repo domain.ProxyRepo) domain.ProxyUsecase { - return &ProxyUsecase{repo: repo} +func NewProxyUsecase(repo domain.ProxyRepo, modelRepo domain.ModelRepo) domain.ProxyUsecase { + return &ProxyUsecase{repo: repo, modelRepo: modelRepo} } func (p *ProxyUsecase) Record(ctx context.Context, record *domain.RecordParam) error { @@ -23,7 +24,7 @@ func (p *ProxyUsecase) Record(ctx context.Context, record *domain.RecordParam) e // SelectModelWithLoadBalancing implements domain.ProxyUsecase. func (p *ProxyUsecase) SelectModelWithLoadBalancing(modelName string, modelType consts.ModelType) (*domain.Model, error) { - model, err := p.repo.SelectModelWithLoadBalancing(modelName, modelType) + model, err := p.modelRepo.GetWithCache(context.Background(), modelType) if err != nil { return nil, err }