Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions ui/ModelModal/src/ModelModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ export const ModelModal: React.FC<ModelModalProps> = ({
});

const providerBrand = watch('provider');
const isOllama = providerBrand === 'Ollama';

const [modelUserList, setModelUserList] = useState<{ model: string }[]>([]);

Expand Down Expand Up @@ -510,7 +509,10 @@ export const ModelModal: React.FC<ModelModalProps> = ({
message: 'URL 不能为空',
},
validate: (value) => {
const res = isValidURL(value, isOllama);
if (!providers[providerBrand].urlWrite || providerBrand === 'AzureOpenAI') {
return true;
}
const res = isValidURL(value);
return res === "" || res;
}
}}
Expand Down
2 changes: 1 addition & 1 deletion ui/ModelModal/src/constants/providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
18 changes: 14 additions & 4 deletions ui/ModelModal/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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 格式";
}

Expand Down Expand Up @@ -142,4 +152,4 @@ export const logger = {
console.error('[ModelModal]', ...args);
}
},
};
};
56 changes: 0 additions & 56 deletions usecase/modelkit.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"encoding/json"
"fmt"
"log"
"maps"
"net/http"
"net/url"
"path"
Expand All @@ -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"

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand All @@ -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,
Expand Down
Loading