fix(delegate): reliability patches for multi-agent delegation

This commit is contained in:
matevip 2026-04-22 10:12:48 +08:00
parent 41a040de35
commit 11fa7487d0
3 changed files with 9 additions and 26 deletions

View File

@ -47,7 +47,6 @@ public class WikiEmbeddingService {
private final ModelConfigService modelConfigService; private final ModelConfigService modelConfigService;
private final WikiKnowledgeBaseService kbService; private final WikiKnowledgeBaseService kbService;
private final SystemSettingMapper systemSettingMapper; private final SystemSettingMapper systemSettingMapper;
private final vip.mate.llm.service.ModelProviderService modelProviderService;
/** 系统默认 embedding 模型的 mate_system_setting key */ /** 系统默认 embedding 模型的 mate_system_setting key */
public static final String SYSTEM_SETTING_DEFAULT_EMBEDDING_ID = "embedding.default.model.id"; public static final String SYSTEM_SETTING_DEFAULT_EMBEDDING_ID = "embedding.default.model.id";
@ -88,24 +87,15 @@ public class WikiEmbeddingService {
if (defaultId != null) { if (defaultId != null) {
ModelConfigEntity model = safeGetModel(defaultId); ModelConfigEntity model = safeGetModel(defaultId);
if (isUsable(model)) { if (isUsable(model)) {
try { return new Resolved(factory.build(model), model.getModelName());
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);
} }
log.warn("[WikiEmbedding] System default embedding model {} is unusable, falling back", defaultId);
} }
// 优先级 3任意 enabled // 优先级 3任意 enabled
ModelConfigEntity anyEnabled = modelConfigService.findFirstEnabledEmbedding(); ModelConfigEntity anyEnabled = modelConfigService.findFirstEnabledEmbedding();
if (isUsable(anyEnabled)) { if (isUsable(anyEnabled)) {
try { return new Resolved(factory.build(anyEnabled), anyEnabled.getModelName());
return new Resolved(factory.build(anyEnabled), anyEnabled.getModelName());
} catch (Exception e) {
log.warn("[WikiEmbedding] Fallback embedding model {} build failed: {}", anyEnabled.getId(), e.getMessage());
}
} }
log.warn("[WikiEmbedding] No usable embedding model configured. " log.warn("[WikiEmbedding] No usable embedding model configured. "
@ -365,17 +355,9 @@ public class WikiEmbeddingService {
} }
private boolean isUsable(ModelConfigEntity model) { private boolean isUsable(ModelConfigEntity model) {
if (model == null || !Boolean.TRUE.equals(model.getEnabled()) return model != null
|| !"embedding".equals(model.getModelType())) { && Boolean.TRUE.equals(model.getEnabled())
return false; && "embedding".equals(model.getModelType());
}
// 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;
}
} }
private Long readSystemDefaultEmbeddingId() { private Long readSystemDefaultEmbeddingId() {

View File

@ -450,7 +450,8 @@ public class ConversationService {
} }
switch (part.getType()) { switch (part.getType()) {
case "text" -> appendSegment(text, part.getText()); 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())); case "file" -> appendSegment(text, "[附件] " + safe(part.getFileName()));
default -> appendSegment(text, part.getText()); default -> appendSegment(text, part.getText());
} }

View File

@ -179,7 +179,7 @@ export interface MessageMetadata {
} }
export interface MessageContentPart { 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 text?: string
fileUrl?: string fileUrl?: string
fileName?: string fileName?: string