mirror of
https://github.com/chaitin/MonkeyCode.git
synced 2026-02-03 07:13:26 +08:00
93 lines
1.9 KiB
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
|
|
}
|