diff --git a/ui/ModelModal/src/ModelModal.tsx b/ui/ModelModal/src/ModelModal.tsx index 9e88ceb..36c564e 100644 --- a/ui/ModelModal/src/ModelModal.tsx +++ b/ui/ModelModal/src/ModelModal.tsx @@ -84,7 +84,6 @@ export const ModelModal: React.FC = ({ }); const providerBrand = watch('provider'); - const isOllama = providerBrand === 'Ollama'; const [modelUserList, setModelUserList] = useState<{ model: string }[]>([]); @@ -510,7 +509,10 @@ export const ModelModal: React.FC = ({ message: 'URL 不能为空', }, validate: (value) => { - const res = isValidURL(value, isOllama); + if (!providers[providerBrand].urlWrite || providerBrand === 'AzureOpenAI') { + return true; + } + const res = isValidURL(value); return res === "" || res; } }} diff --git a/ui/ModelModal/src/constants/providers.ts b/ui/ModelModal/src/constants/providers.ts index 1af11b8..783a8b1 100644 --- a/ui/ModelModal/src/constants/providers.ts +++ b/ui/ModelModal/src/constants/providers.ts @@ -112,7 +112,7 @@ export const DEFAULT_MODEL_PROVIDERS: ModelProviderMap = { embedding: false, rerank: false, modelDocumentUrl: 'https://github.com/ollama/ollama/tree/main/docs', - defaultBaseUrl: 'http://172.17.0.1:11434', + defaultBaseUrl: 'http://172.17.0.1:11434/v1', }, SiliconFlow: { label: 'SiliconFlow', diff --git a/ui/ModelModal/src/utils/index.ts b/ui/ModelModal/src/utils/index.ts index 68dafa5..8aa8f15 100644 --- a/ui/ModelModal/src/utils/index.ts +++ b/ui/ModelModal/src/utils/index.ts @@ -15,7 +15,7 @@ export const addOpacityToColor = (color: string, opacity: number): string => { /** * 验证URL格式 */ -export const isValidURL = (url: string, isOllama: boolean): string => { +export const isValidURL = (url: string): string => { try { const urlObj = new URL(url); @@ -29,9 +29,19 @@ export const isValidURL = (url: string, isOllama: boolean): string => { return "请使用宿主机主机名(linux:172.17.0.1, mac/windows:host.docker.internal)"; } - // 3. 检查是否以 /v+数字 结尾 或者 包含/v+数字/ + // 3. 检查是否以斜杠结尾 + if (url.endsWith('/')) { + return "请去掉URL末尾的斜杠"; + } + + // 4. 检查路径中是否包含 /chat/completions + if (urlObj.pathname.includes('/chat/completions')) { + return "请去掉URL中的/chat/completions路径"; + } + + // 5. 检查是否以 /v+数字 结尾 或者 包含/v+数字/ const pathPattern = /\/v\d+(\/.*)?$/; - if (!isOllama && !pathPattern.test(urlObj.pathname)) { + if (!pathPattern.test(urlObj.pathname)) { return "模型供应商必须支持与 OpenAI 兼容的 API 格式"; } @@ -142,4 +152,4 @@ export const logger = { console.error('[ModelModal]', ...args); } }, -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/usecase/modelkit.go b/usecase/modelkit.go index 14abf70..bc5cad4 100644 --- a/usecase/modelkit.go +++ b/usecase/modelkit.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "log" - "maps" "net/http" "net/url" "path" @@ -17,12 +16,10 @@ import ( "github.com/cloudwego/eino-ext/components/model/deepseek" "github.com/cloudwego/eino-ext/components/model/gemini" - "github.com/cloudwego/eino-ext/components/model/ollama" "github.com/cloudwego/eino-ext/components/model/openai" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" generativeGenai "github.com/google/generative-ai-go/genai" - "github.com/ollama/ollama/api" "google.golang.org/api/option" "google.golang.org/genai" @@ -54,24 +51,6 @@ func ModelList(ctx context.Context, req *domain.ModelListReq) (*domain.ModelList return &domain.ModelListResp{ Models: domain.From(domain.ModelProviders[provider]), }, nil - // 以下模型供应商需要特殊处理 - case consts.ModelProviderOllama: - resp, err := ollamaListModel(req.BaseURL, httpClient, req.APIHeader) - // ollama list发生错误, 尝试修复url - if err != nil { - msg := generateBaseURLFixSuggestion(err.Error(), req.BaseURL, provider) - if msg == "" { - return &domain.ModelListResp{ - Error: err.Error(), - }, nil - } else { - return &domain.ModelListResp{ - Error: msg, - }, nil - } - } - // end - return resp, err case consts.ModelProviderGemini: client, err := generativeGenai.NewClient(ctx, option.WithAPIKey(req.APIKey)) if err != nil { @@ -296,24 +275,6 @@ func GetChatModel(ctx context.Context, model *domain.ModelMetadata) (model.BaseC return nil, err } return chatModel, nil - case consts.ModelProviderOllama: - baseUrl, err := utils.URLRemovePath(config.BaseURL) - if err != nil { - return nil, err - } - - chatModel, err := ollama.NewChatModel(ctx, &ollama.ChatModelConfig{ - BaseURL: baseUrl, - Timeout: config.Timeout, - Model: config.Model, - Options: &api.Options{ - Temperature: temperature, - }, - }) - if err != nil { - return nil, err - } - return chatModel, nil // 兼容 openai api default: chatModel, err := openai.NewChatModel(ctx, config) @@ -325,23 +286,6 @@ func GetChatModel(ctx context.Context, model *domain.ModelMetadata) (model.BaseC } // 以下是辅助函数,用于处理模型列表和检查相关的功能 -func ollamaListModel(baseURL string, httpClient *http.Client, apiHeader string) (*domain.ModelListResp, error) { - // get from ollama http://10.10.16.24:11434/api/tags - u, err := url.Parse(baseURL) - if err != nil { - return nil, err - } - u.Path = "/api/tags" - client := request.NewClient(u.Scheme, u.Host, httpClient.Timeout, request.WithClient(httpClient)) - - h := request.Header{} - if apiHeader != "" { - headers := request.GetHeaderMap(apiHeader) - maps.Copy(h, headers) - } - return request.Get[domain.ModelListResp](client, u.Path, request.WithHeader(h)) -} - func getChatModelGenerateChat(ctx context.Context, provider consts.ModelProvider, modelType consts.ModelType, baseURL string, req *domain.CheckModelReq) (*schema.Message, error) { chatModel, err := GetChatModel(ctx, &domain.ModelMetadata{ Provider: provider,