From 3c0b704266975fa0f9849055e663aafd867946eb Mon Sep 17 00:00:00 2001 From: jiangwel Date: Wed, 27 Aug 2025 15:58:18 +0800 Subject: [PATCH] =?UTF-8?q?refactor=EF=BC=9A=20=E4=BC=98=E5=8C=96=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E9=94=99=E8=AF=AF=E6=97=B6=E7=9A=84=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用其它类型的provider添加模型,发生错误会智能的在baseURL结尾添加/v1,或者修改host为宿主机ip以尝试解决问题 - 使用ollama查看模型列表时, 发生错误会智能的修改host为宿主机ip以尝试解决问题 - api key余额不足时,会准确提示用户 --- usecase/modelkit.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/usecase/modelkit.go b/usecase/modelkit.go index db46b12..93187fd 100644 --- a/usecase/modelkit.go +++ b/usecase/modelkit.go @@ -58,8 +58,8 @@ func ModelList(ctx context.Context, req *domain.ModelListReq) (*domain.ModelList resp, err := ollamaListModel(req.BaseURL, httpClient, req.APIHeader) // 尝试通过替换baseURL的host为host.docker.internal解决ollama list err if err != nil { - newBaseURL, err := baseURLReplaceHost(req.BaseURL) - if err != nil { + newBaseURL, replaceHostErr := baseURLReplaceHost(req.BaseURL) + if replaceHostErr != nil { return &domain.ModelListResp{ Error: err.Error(), }, nil @@ -68,16 +68,16 @@ func ModelList(ctx context.Context, req *domain.ModelListReq) (*domain.ModelList if newBaseURL == req.BaseURL { return resp, nil } - resp, err = ollamaListModel(newBaseURL, httpClient, req.APIHeader) + _, listErr := ollamaListModel(newBaseURL, httpClient, req.APIHeader) // 替换后可以成功请求 - if err == nil { + if listErr == nil { return &domain.ModelListResp{ Error: fmt.Errorf("请将host替换为host.docker.internal").Error(), }, nil } } // end - return resp, nil + return resp, err case consts.ModelProviderGemini: client, err := generativeGenai.NewClient(ctx, option.WithAPIKey(req.APIKey)) if err != nil { @@ -207,12 +207,13 @@ func CheckModel(ctx context.Context, req *domain.CheckModelReq) (*domain.CheckMo return checkResp, nil } // end + // end provider := consts.ParseModelProvider(req.Provider) resp, err := getChatModelGenerateChat(ctx, provider, modelType, req.BaseURL, req) // 其他模型供应商,尝试修复baseURL if err != nil && provider == consts.ModelProviderOther { - res, err := fixProviderOtherCheckErr(ctx, req, provider, modelType) + res, err := tryFixBaseURL(ctx, req, provider, modelType) if err != nil { checkResp.Error = err.Error() return checkResp, nil @@ -354,13 +355,12 @@ func ollamaListModel(baseURL string, httpClient *http.Client, apiHeader string) } // 通过修复baseURL尝试修复其它供应商check err, 返回用于提示用户如何修复错误 -func fixProviderOtherCheckErr(ctx context.Context, req *domain.CheckModelReq, provider consts.ModelProvider, modelType consts.ModelType) (string, error) { +func tryFixBaseURL(ctx context.Context, req *domain.CheckModelReq, provider consts.ModelProvider, modelType consts.ModelType) (string, error) { log.Println("尝试修复") // 尝试添加v1 fixedBaseURL, err := baseURLAddV1(req.BaseURL) // baseurl解析错误,直接返回 if err != nil { - log.Printf("baseurl解析错误: %v", err) return "", err } @@ -372,9 +372,10 @@ func fixProviderOtherCheckErr(ctx context.Context, req *domain.CheckModelReq, pr log.Println("添加v1有效") return "请在API地址末尾添加/v1", nil } - log.Println("添加v1无效", err) + log.Println("添加v1无效", err, fixedBaseURL) } + log.Println("尝试替换host") // url末尾添加v1无效,尝试替换host为host.docker.internal fixedBaseURL, err = baseURLReplaceHost(req.BaseURL) // baseurl解析错误,直接返回 @@ -388,9 +389,11 @@ func fixProviderOtherCheckErr(ctx context.Context, req *domain.CheckModelReq, pr if err == nil { return "请将host替换为host.docker.internal", nil } + log.Println("替换host无效", err, fixedBaseURL) } // 替换host也无效,尝试添加v1与替换host + log.Println("尝试添加v1与替换host") fixedBaseURL, err = baseURLAddV1(req.BaseURL) // baseurl解析错误,直接返回 if err != nil { @@ -408,6 +411,7 @@ func fixProviderOtherCheckErr(ctx context.Context, req *domain.CheckModelReq, pr if err == nil { return "API地址末尾添加/v1, host替换为host.docker.internal", nil } + log.Println("添加v1与替换host无效", err, fixedBaseURL) } return "", nil } @@ -453,8 +457,12 @@ func baseURLReplaceHost(inputURL string) (string, error) { } hostAddress := "host.docker.internal" - if rawURL.Host != hostAddress { - rawURL.Host = hostAddress + if rawURL.Hostname() != hostAddress { + if rawURL.Port() != "" { + rawURL.Host = hostAddress + ":" + rawURL.Port() + } else { + rawURL.Host = hostAddress + } } return rawURL.String(), nil }