























@@ -1052,35 +1052,40 @@ function validateConfigObjectWithPluginsBase(
10521052].toSorted((left, right) => left.localeCompare(right));
10531053};
105410541055-const hasStalePluginEvidenceForUnknownWebSearchProvider = (providerId: string): boolean => {
1056-const normalizedProviderId = normalizePluginId(providerId);
1057-if (!normalizedProviderId || ensureKnownIds().has(normalizedProviderId)) {
1055+const hasPluginEvidenceForWebSearchProvider = (
1056+ ...pluginOrProviderIds: readonly string[]
1057+): boolean => {
1058+const candidateIds = new Set(
1059+pluginOrProviderIds.map((id) => normalizePluginId(id)).filter((id) => id.length > 0),
1060+);
1061+if (candidateIds.size === 0) {
10581062return false;
10591063}
1064+const matches = (pluginId: string) => candidateIds.has(normalizePluginId(pluginId));
10601065const pluginConfig = config.plugins;
1061-if (
1062-Array.isArray(pluginConfig?.allow) &&
1063-pluginConfig.allow.some((pluginId) => normalizePluginId(pluginId) === normalizedProviderId)
1064-) {
1066+if (Array.isArray(pluginConfig?.allow) && pluginConfig.allow.some(matches)) {
10651067return true;
10661068}
1067-if (
1068-isRecord(pluginConfig?.entries) &&
1069-Object.keys(pluginConfig.entries).some(
1070-(pluginId) => normalizePluginId(pluginId) === normalizedProviderId,
1071-)
1072-) {
1069+if (isRecord(pluginConfig?.entries) && Object.keys(pluginConfig.entries).some(matches)) {
10731070return true;
10741071}
1075-if (
1076-isRecord(pluginConfig?.installs) &&
1077-Object.keys(pluginConfig.installs).some(
1078-(pluginId) => normalizePluginId(pluginId) === normalizedProviderId,
1079-)
1080-) {
1072+if (isRecord(pluginConfig?.installs) && Object.keys(pluginConfig.installs).some(matches)) {
10811073return true;
10821074}
1083-return ensureInstalledPluginRecordIds().has(normalizedProviderId);
1075+for (const pluginId of candidateIds) {
1076+if (ensureInstalledPluginRecordIds().has(pluginId)) {
1077+return true;
1078+}
1079+}
1080+return false;
1081+};
1082+1083+const hasStalePluginEvidenceForUnknownWebSearchProvider = (providerId: string): boolean => {
1084+const normalizedProviderId = normalizePluginId(providerId);
1085+if (!normalizedProviderId || ensureKnownIds().has(normalizedProviderId)) {
1086+return false;
1087+}
1088+return hasPluginEvidenceForWebSearchProvider(providerId);
10841089};
1085109010861091const validateWebSearchProvider = () => {
@@ -1102,11 +1107,19 @@ function validateConfigObjectWithPluginsBase(
11021107(entry) => entry.provider.id === trimmed,
11031108);
11041109if (installCatalogEntry) {
1105-issues.push({
1110+const issue = {
11061111 path,
11071112message: `web_search provider is not available: ${trimmed} (install or enable plugin "${installCatalogEntry.pluginId}", then run openclaw doctor --fix)`,
11081113allowedValues: collectKnownWebSearchProviderIds(),
1109-});
1114+};
1115+if (hasPluginEvidenceForWebSearchProvider(trimmed, installCatalogEntry.pluginId)) {
1116+warnings.push({
1117+ ...issue,
1118+message: `web_search provider is not available: ${trimmed} (configured plugin "${installCatalogEntry.pluginId}" is unavailable; Gateway will ignore this optional provider until the plugin is installed/enabled or openclaw doctor --fix repairs the config)`,
1119+});
1120+return;
1121+}
1122+issues.push(issue);
11101123return;
11111124}
11121125const allowedValues = collectKnownWebSearchProviderIds();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。