Files
MonkeyCode/backend/internal/openai/usecase/openai.go

93 lines
1.9 KiB
Go

package openai
import (
"bytes"
"context"
"log/slog"
"text/template"
"github.com/chaitin/MonkeyCode/backend/pkg/cvt"
"github.com/chaitin/MonkeyCode/backend/config"
"github.com/chaitin/MonkeyCode/backend/consts"
"github.com/chaitin/MonkeyCode/backend/db"
"github.com/chaitin/MonkeyCode/backend/domain"
)
type OpenAIUsecase struct {
repo domain.OpenAIRepo
cfg *config.Config
logger *slog.Logger
}
func NewOpenAIUsecase(cfg *config.Config, repo domain.OpenAIRepo, logger *slog.Logger) domain.OpenAIUsecase {
return &OpenAIUsecase{
repo: repo,
cfg: cfg,
logger: logger,
}
}
func (u *OpenAIUsecase) ModelList(ctx context.Context) (*domain.ModelListResp, error) {
models, err := u.repo.ModelList(ctx)
if err != nil {
return nil, err
}
for _, v := range models {
u.logger.DebugContext(ctx, "model", slog.Any("model", v))
}
resp := &domain.ModelListResp{
Object: "list",
Data: cvt.Iter(models, func(_ int, m *db.Model) *domain.ModelData {
return cvt.From(m, &domain.ModelData{})
}),
}
return resp, nil
}
func (u *OpenAIUsecase) GetConfig(ctx context.Context, req *domain.ConfigReq) (*domain.ConfigResp, error) {
apiKey, err := u.repo.GetApiKey(ctx, req.Key)
if err != nil {
return nil, err
}
model, err := u.repo.ModelList(ctx)
if err != nil {
return nil, err
}
chatModel := ""
codeModel := ""
for _, m := range model {
switch m.ModelType {
case consts.ModelTypeLLM:
chatModel = m.ModelName
case consts.ModelTypeCoder:
codeModel = m.ModelName
}
}
t, err := template.New("config").Parse(string(config.ConfigTmpl))
if err != nil {
return nil, err
}
cnt := bytes.NewBuffer(nil)
if err := t.Execute(cnt, map[string]string{
"apiBase": req.BaseURL,
"apikey": apiKey.Key,
"chatModel": chatModel,
"codeModel": codeModel,
}); err != nil {
return nil, err
}
return &domain.ConfigResp{
Type: req.Type,
Content: cnt.String(),
}, nil
}