diff --git a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiEmbeddingService.java b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiEmbeddingService.java index 74aec2c7..48f2aefd 100644 --- a/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiEmbeddingService.java +++ b/mateclaw-server/src/main/java/vip/mate/wiki/service/WikiEmbeddingService.java @@ -47,7 +47,6 @@ public class WikiEmbeddingService { private final ModelConfigService modelConfigService; private final WikiKnowledgeBaseService kbService; private final SystemSettingMapper systemSettingMapper; - private final vip.mate.llm.service.ModelProviderService modelProviderService; /** 系统默认 embedding 模型的 mate_system_setting key */ public static final String SYSTEM_SETTING_DEFAULT_EMBEDDING_ID = "embedding.default.model.id"; @@ -88,24 +87,15 @@ public class WikiEmbeddingService { if (defaultId != null) { ModelConfigEntity model = safeGetModel(defaultId); if (isUsable(model)) { - try { - return new Resolved(factory.build(model), model.getModelName()); - } catch (Exception e) { - log.warn("[WikiEmbedding] System default embedding model {} build failed: {}", defaultId, e.getMessage()); - } - } else { - log.warn("[WikiEmbedding] System default embedding model {} is unusable, falling back", defaultId); + return new Resolved(factory.build(model), model.getModelName()); } + log.warn("[WikiEmbedding] System default embedding model {} is unusable, falling back", defaultId); } // 优先级 3:任意 enabled ModelConfigEntity anyEnabled = modelConfigService.findFirstEnabledEmbedding(); if (isUsable(anyEnabled)) { - try { - return new Resolved(factory.build(anyEnabled), anyEnabled.getModelName()); - } catch (Exception e) { - log.warn("[WikiEmbedding] Fallback embedding model {} build failed: {}", anyEnabled.getId(), e.getMessage()); - } + return new Resolved(factory.build(anyEnabled), anyEnabled.getModelName()); } log.warn("[WikiEmbedding] No usable embedding model configured. " @@ -365,17 +355,9 @@ public class WikiEmbeddingService { } private boolean isUsable(ModelConfigEntity model) { - if (model == null || !Boolean.TRUE.equals(model.getEnabled()) - || !"embedding".equals(model.getModelType())) { - return false; - } - // Skip models whose provider lacks a valid API key (mirrors chat model path fix 341ad1f) - try { - return modelProviderService.isProviderConfigured(model.getProvider()); - } catch (Exception e) { - log.debug("[WikiEmbedding] Provider check failed for model {}: {}", model.getId(), e.getMessage()); - return false; - } + return model != null + && Boolean.TRUE.equals(model.getEnabled()) + && "embedding".equals(model.getModelType()); } private Long readSystemDefaultEmbeddingId() { diff --git a/mateclaw-server/src/main/java/vip/mate/workspace/conversation/ConversationService.java b/mateclaw-server/src/main/java/vip/mate/workspace/conversation/ConversationService.java index af23115d..b2c1f589 100644 --- a/mateclaw-server/src/main/java/vip/mate/workspace/conversation/ConversationService.java +++ b/mateclaw-server/src/main/java/vip/mate/workspace/conversation/ConversationService.java @@ -450,7 +450,8 @@ public class ConversationService { } switch (part.getType()) { case "text" -> appendSegment(text, part.getText()); - case "thinking", "tool_call", "parse_error" -> { /* skip — frontend reads these from contentParts directly */ } + case "thinking", "tool_call" -> { /* skip — frontend reads these from contentParts directly */ } + case "parse_error" -> appendSegment(text, part.getText()); case "file" -> appendSegment(text, "[附件] " + safe(part.getFileName())); default -> appendSegment(text, part.getText()); } diff --git a/mateclaw-ui/src/types/index.ts b/mateclaw-ui/src/types/index.ts index 8c11283f..f9b319f5 100644 --- a/mateclaw-ui/src/types/index.ts +++ b/mateclaw-ui/src/types/index.ts @@ -179,7 +179,7 @@ export interface MessageMetadata { } export interface MessageContentPart { - type: 'text' | 'thinking' | 'image' | 'file' | 'audio' | 'video' | 'tool_call' | 'parse_error' + type: 'text' | 'thinking' | 'image' | 'file' | 'audio' | 'video' | 'tool_call' text?: string fileUrl?: string fileName?: string