diff --git a/src/Oms.Application/Shared/AiLlmClient.cs b/src/Oms.Application/Shared/AiLlmClient.cs index 0400994..eb263af 100644 --- a/src/Oms.Application/Shared/AiLlmClient.cs +++ b/src/Oms.Application/Shared/AiLlmClient.cs @@ -80,7 +80,11 @@ public class AiLlmClient throw new BusinessException($"请先配置 {provider.DisplayName} 的 API Key"); } - var model = modelOverride ?? provider.ApiSecretEnc; + var model = modelOverride; + if (string.IsNullOrWhiteSpace(model)) + { + model = ResolveConfiguredModelId(provider.ApiSecretEnc); + } if (string.IsNullOrWhiteSpace(model)) { model = DefaultModelForProviderType(provider.ProviderType); @@ -273,6 +277,84 @@ public class AiLlmClient "zhipu" => "glm-5.1", _ => null }; + + /// + /// 解析 ApiSecret:兼容纯模型名,或多模型 JSON + /// {"defaultModelId":"...","models":[{"modelId":"...","role":"文字"}]}。 + /// + private static string? ResolveConfiguredModelId(string? apiSecret) + { + var secret = (apiSecret ?? string.Empty).Trim(); + if (string.IsNullOrWhiteSpace(secret)) + { + return null; + } + + if (!secret.StartsWith('{')) + { + return secret; + } + + try + { + using var doc = JsonDocument.Parse(secret); + var root = doc.RootElement; + if (root.TryGetProperty("defaultModelId", out var defaultModel) && + defaultModel.ValueKind == JsonValueKind.String) + { + var id = defaultModel.GetString()?.Trim(); + if (!string.IsNullOrWhiteSpace(id)) + { + return id; + } + } + + if (root.TryGetProperty("models", out var models) && + models.ValueKind == JsonValueKind.Array) + { + foreach (var item in models.EnumerateArray()) + { + if (!item.TryGetProperty("modelId", out var modelIdEl) || + modelIdEl.ValueKind != JsonValueKind.String) + { + continue; + } + + var modelId = modelIdEl.GetString()?.Trim(); + if (string.IsNullOrWhiteSpace(modelId)) + { + continue; + } + + if (item.TryGetProperty("role", out var roleEl) && + roleEl.ValueKind == JsonValueKind.String && + string.Equals(roleEl.GetString(), "文字", StringComparison.Ordinal)) + { + return modelId; + } + } + + foreach (var item in models.EnumerateArray()) + { + if (item.TryGetProperty("modelId", out var modelIdEl) && + modelIdEl.ValueKind == JsonValueKind.String) + { + var modelId = modelIdEl.GetString()?.Trim(); + if (!string.IsNullOrWhiteSpace(modelId)) + { + return modelId; + } + } + } + } + } + catch (JsonException) + { + return secret; + } + + return null; + } } public static class AiLlmServiceExtensions