package service import ( "context" "encoding/json" "fmt" "model-gateway/consts/model" "model-gateway/dao" "model-gateway/model/dto" "model-gateway/service/httpclient" modelUtils "model-gateway/service/utils" "time" "gitea.redpowerfuture.com/red-future/common/oss" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" ) var ModelSession = &modelSessionService{} type modelSessionService struct{} // CreateSession 创建会话(同步调用,非流式) func (s *modelSessionService) CreateSession(ctx context.Context, req *dto.CallModelSessionReq) (res *dto.ModelCallRes, err error) { startTime := time.Now() attempt := 0 id := req.Id modelInfo := req.ModelInfo newRequestParams := req.RequestParams LOOP: // 6) 模型请求 modelRespBody, err := httpclient.ModelHttpNormalRequest(ctx, modelInfo.BaseURL, modelInfo.RequestHeadMapping, modelInfo.HttpMethod, newRequestParams) if err != nil { return nil, err } if modelRespBody == nil { return nil, fmt.Errorf("模型返回参数是空") } // 7) 上传模型返回参数文件 uploadOriginalResp, err := Upload(ctx, &dto.UploadFileBytesReq{ FileBytes: modelRespBody, FileName: fmt.Sprintf("modelRespParams:%v.json", time.Now().UnixMilli()), }) if err != nil { return nil, fmt.Errorf("上传模型返回参数文件失败:%v", err) } // 8) 更新模型会话信息 updateModelSessionReq := dto.UpdateModelSessionReq{ Id: id, OriginalResponsePath: uploadOriginalResp.FileURL, } docMsg := new(dto.ModelCallRes) docMsg.TaskId = id errCode, errMsg, err := parseModelError(modelRespBody, modelInfo.ErrorMessageMapping) if err != nil { return nil, fmt.Errorf("模型返回参数解析失败:%v", err) } if errCode != "" { if attempt < modelCallMaxRetries && shouldRetryWithMemory(ctx, modelInfo, errCode, errMsg, string(modelRespBody)) { attempt++ wait := time.Duration(1<