@tencent-rtc/mcp 1.6.4 → 1.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/knowledge/chunker.js +83 -54
- package/knowledge/path-meta.js +179 -26
- package/knowledge/search/exact-lookup.js +168 -10
- package/knowledge/search/filter-pool.js +73 -19
- package/knowledge/search/product-scope-intent.js +2 -2
- package/knowledge/search/requires-framework.js +2 -2
- package/knowledge/search/search-knowledge.js +247 -61
- package/package.json +1 -1
- package/resource/index/manifest.json +1 -1
- package/resource/integration/callkit/preset/android/integration.md +2 -4
- package/resource/integration/callkit/preset/flutter/integration.md +4 -5
- package/resource/integration/callkit/preset/ios/integration.md +1 -4
- package/resource/integration/callkit/preset/react/integration.md +13 -20
- package/resource/integration/callkit/preset/vue/integration.md +14 -21
- package/resource/integration/chat/preset/android/integration.md +6 -9
- package/resource/integration/chat/preset/flutter/integration.md +9 -12
- package/resource/integration/chat/preset/ios/integration.md +2 -4
- package/resource/integration/chat/preset/react/integration.md +0 -10
- package/resource/integration/livekit/preset/live/android/live-audience-integration.md +129 -0
- package/resource/integration/livekit/preset/live/android/live-host-integration.md +219 -0
- package/resource/integration/livekit/preset/live/android/live-list-integration.md +261 -0
- package/resource/integration/livekit/preset/live/android/prepare-integration.md +254 -0
- package/resource/integration/livekit/preset/live/ios/live-audience-integration.md +202 -0
- package/resource/integration/livekit/preset/live/ios/live-host-integration.md +369 -0
- package/resource/integration/livekit/preset/live/ios/live-list-integration.md +229 -0
- package/resource/integration/livekit/preset/live/ios/prepare-integration.md +204 -0
- package/resource/integration/livekit/preset/live/vue/live-list-integration.md +0 -3
- package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +0 -5
- package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +0 -6
- package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +5 -10
- package/resource/integration/roomkit/preset/vue/integration.md +0 -4
- package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +80 -0
- package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +24 -0
- package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +116 -0
- package/resource/knowledge/callkit/core-sdk/android/answer-call.md +7 -8
- package/resource/knowledge/callkit/core-sdk/android/make-call.md +5 -7
- package/resource/knowledge/callkit/core-sdk/android/offline-push.md +3 -5
- package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +2 -6
- package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +2 -6
- package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +4 -9
- package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1 -4
- package/resource/knowledge/callkit/core-sdk/ios/make-call.md +8 -11
- package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +17 -23
- package/resource/knowledge/callkit/core-sdk/web/call-engine.md +33 -0
- package/resource/knowledge/callkit/core-sdk/web/call-event.md +327 -0
- package/resource/knowledge/callkit/core-sdk/web/callengine-api-overview.md +33 -0
- package/resource/knowledge/callkit/faq/android.md +0 -2
- package/resource/knowledge/callkit/faq/error-code.md +0 -2
- package/resource/knowledge/callkit/faq/flutter.md +2 -2
- package/resource/knowledge/callkit/faq/ios.md +3 -5
- package/resource/knowledge/callkit/faq/web.md +2 -3
- package/resource/knowledge/callkit/preset/android/api.md +2 -5
- package/resource/knowledge/callkit/preset/ios/api.md +0 -2
- package/resource/knowledge/callkit/preset/react/api.md +445 -0
- package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +445 -0
- package/resource/knowledge/callkit/preset/vue/api.md +465 -0
- package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +465 -0
- package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +16 -0
- package/resource/knowledge/chat/preset/android/features/chat-setting.md +1 -1
- package/resource/knowledge/chat/preset/android/features/conversation-list.md +1 -1
- package/resource/knowledge/chat/preset/android/features/language.md +0 -1
- package/resource/knowledge/chat/preset/android/features/message-input.md +1 -1
- package/resource/knowledge/chat/preset/android/features/message-list.md +2 -3
- package/resource/knowledge/chat/preset/android/features/search.md +0 -1
- package/resource/knowledge/chat/preset/android/features/theme.md +1 -1
- package/resource/knowledge/chat/preset/android-view/integration.md +3 -11
- package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +0 -1
- package/resource/knowledge/chat/preset/flutter/features/message-list.md +1 -2
- package/resource/knowledge/chat/preset/flutter/features/search.md +5 -6
- package/resource/knowledge/chat/preset/flutter/features/theme.md +2 -2
- package/resource/knowledge/chat/preset/ios/features/chat-setting.md +1 -1
- package/resource/knowledge/chat/preset/ios/features/conversation-list.md +1 -2
- package/resource/knowledge/chat/preset/ios/features/message-list.md +1 -2
- package/resource/knowledge/chat/preset/ios/features/search.md +0 -1
- package/resource/knowledge/chat/preset/ios-uikit/integration.md +13 -15
- package/resource/knowledge/chat/preset/react/features/conversation-list.md +5 -5
- package/resource/knowledge/chat/preset/react/features/message-input.md +2 -3
- package/resource/knowledge/chat/preset/react/features/search.md +0 -1
- package/resource/knowledge/chat/preset/react/features/theme.md +0 -1
- package/resource/knowledge/chat/urls/sdk/android.md +3 -3
- package/resource/knowledge/chat/urls/sdk/flutter.md +3 -3
- package/resource/knowledge/chat/urls/sdk/ios.md +3 -3
- package/resource/knowledge/chat/urls/sdk/web.md +3 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +7 -14
- package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +5 -8
- package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +15 -18
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +15 -20
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +10 -13
- package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +4 -6
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +8 -10
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +5 -7
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +7 -14
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +6 -9
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +15 -18
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +15 -20
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +10 -13
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +4 -6
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +8 -10
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +3 -5
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +7 -14
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +5 -8
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +6 -9
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +5 -10
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +3 -6
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +4 -6
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +2 -4
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +1 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +4 -6
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +3 -5
- package/resource/knowledge/livekit/core-sdk/api-reference/{web → vue}/index.md +24 -24
- package/resource/knowledge/livekit/core-sdk/{voice/android/voice-audio-effect.md → features/android/audio-effect.md} +1 -2
- package/resource/knowledge/livekit/core-sdk/{live/android/live-gift.md → features/android/gift.md} +2 -3
- package/resource/knowledge/livekit/core-sdk/{voice/android/voice-room-list.md → features/android/live-list.md} +2 -4
- package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audio-effect.md → features/flutter/audio-effect.md} +0 -2
- package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-barrage.md → features/flutter/barrage.md} +2 -2
- package/resource/knowledge/livekit/core-sdk/{live/flutter/live-gift.md → features/flutter/gift.md} +2 -3
- package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-room-list.md → features/flutter/live-list.md} +1 -1
- package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audience-list.md → features/ios/audience-list.md} +1 -2
- package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audio-effect.md → features/ios/audio-effect.md} +1 -3
- package/resource/knowledge/livekit/core-sdk/{live/ios/live-base-beauty.md → features/ios/base-beauty.md} +2 -2
- package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-gift.md → features/ios/gift.md} +2 -3
- package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-room-list.md → features/ios/live-list.md} +2 -4
- package/resource/knowledge/livekit/core-sdk/live/android/{live-co-guest-interaction.md → co-guest-interaction.md} +0 -1
- package/resource/knowledge/livekit/core-sdk/live/android/{live-host-interaction.md → host-interaction.md} +5 -7
- package/resource/knowledge/livekit/core-sdk/live/android/{live-integration.md → integration.md} +3 -6
- package/resource/knowledge/livekit/core-sdk/live/flutter/{live-co-guest-interaction.md → co-guest-interaction.md} +1 -1
- package/resource/knowledge/livekit/core-sdk/live/flutter/{live-host-interaction.md → host-interaction.md} +0 -2
- package/resource/knowledge/livekit/core-sdk/live/flutter/{live-integration.md → integration.md} +1 -4
- package/resource/knowledge/livekit/core-sdk/live/ios/{live-co-guest-interaction.md → co-guest-interaction.md} +0 -1
- package/resource/knowledge/livekit/core-sdk/live/ios/{live-host-interaction.md → host-interaction.md} +2 -4
- package/resource/knowledge/livekit/core-sdk/live/ios/{live-integration.md → integration.md} +2 -5
- package/resource/knowledge/livekit/core-sdk/voice/android/{voice-host-interaction.md → host-interaction.md} +3 -5
- package/resource/knowledge/livekit/core-sdk/voice/android/{voice-integration.md → integration.md} +3 -6
- package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-co-guest-interaction.md → co-guest-interaction.md} +1 -2
- package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-integration.md → integration.md} +6 -9
- package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-co-guest-interaction.md → co-guest-interaction.md} +2 -2
- package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-host-interaction.md → host-interaction.md} +4 -6
- package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-integration.md → integration.md} +1 -4
- package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +0 -2
- package/resource/knowledge/push/api-reference/android.md +123 -0
- package/resource/knowledge/push/api-reference/flutter.md +176 -0
- package/resource/knowledge/push/api-reference/harmonyos.md +138 -0
- package/resource/knowledge/push/api-reference/ios.md +176 -0
- package/resource/knowledge/push/api-reference/react-native.md +147 -0
- package/resource/knowledge/push/api-reference/uni-app.md +147 -0
- package/resource/knowledge/push/api-reference/unity.md +119 -0
- package/resource/knowledge/push/api-reference/unreal-engine.md +123 -0
- package/resource/knowledge/push/config/android.md +4 -7
- package/resource/knowledge/push/config/harmonyos.md +0 -3
- package/resource/knowledge/push/config/ios.md +12 -20
- package/resource/knowledge/push/config/react-native.md +18 -26
- package/resource/knowledge/push/config/unity.md +20 -28
- package/resource/knowledge/push/config/unreal-engine.md +21 -29
- package/resource/knowledge/push/integration/android.md +6 -8
- package/resource/knowledge/push/integration/flutter.md +6 -9
- package/resource/knowledge/push/integration/harmonyos.md +1 -0
- package/resource/knowledge/push/integration/ios.md +7 -9
- package/resource/knowledge/push/integration/react-native.md +9 -13
- package/resource/knowledge/push/integration/uni-app.md +7 -7
- package/resource/knowledge/push/integration/unity.md +10 -13
- package/resource/knowledge/push/integration/unreal-engine.md +6 -9
- package/resource/knowledge/push/overview/prepare.md +2 -2
- package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +3 -3
- package/resource/knowledge/roomkit/core-sdk/android/capability-matrix.md +46 -0
- package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +1 -1
- package/resource/knowledge/roomkit/core-sdk/android/room-state.md +2 -2
- package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +6 -6
- package/resource/knowledge/roomkit/core-sdk/android/unsupported-features.md +79 -0
- package/resource/knowledge/roomkit/core-sdk/flutter/capability-matrix.md +46 -0
- package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +1 -1
- package/resource/knowledge/roomkit/core-sdk/flutter/unsupported-features.md +79 -0
- package/resource/knowledge/roomkit/core-sdk/ios/capability-matrix.md +46 -0
- package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +1 -1
- package/resource/knowledge/roomkit/core-sdk/ios/unsupported-features.md +79 -0
- package/resource/knowledge/roomkit/preset/android/integration.md +5 -7
- package/resource/knowledge/roomkit/preset/flutter/integration.md +2 -7
- package/resource/knowledge/roomkit/preset/ios/integration.md +3 -9
- package/resource/knowledge/roomkit/preset/react/integration.md +12 -16
- package/resource/knowledge/trtc/android/TRTCCloud.md +154 -238
- package/resource/knowledge/trtc/android/TRTCCloudDef.md +133 -134
- package/resource/knowledge/trtc/android/TRTCCloudListener.md +86 -120
- package/resource/knowledge/trtc/android/TRTCStatistics.md +10 -10
- package/resource/knowledge/trtc/android/TXAudioEffectManager.md +10 -30
- package/resource/knowledge/trtc/android/TXBeautyManager.md +25 -25
- package/resource/knowledge/trtc/android/TXDeviceManager.md +2 -2
- package/resource/knowledge/trtc/android/TXLiteAVCode.md +12 -12
- package/resource/knowledge/trtc/c++/ITRTCCloud.md +166 -261
- package/resource/knowledge/trtc/c++/ITRTCStatistics.md +12 -12
- package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +10 -30
- package/resource/knowledge/trtc/c++/ITXDeviceManager.md +9 -11
- package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +96 -130
- package/resource/knowledge/trtc/c++/TRTCTypeDef.md +122 -123
- package/resource/knowledge/trtc/c++/TXLiteAVCode.md +12 -12
- package/resource/knowledge/trtc/ios/TRTCCloud.md +168 -255
- package/resource/knowledge/trtc/ios/TRTCCloudDef.md +124 -125
- package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +89 -124
- package/resource/knowledge/trtc/ios/TRTCStatistics.md +10 -10
- package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +9 -28
- package/resource/knowledge/trtc/ios/TXBeautyManager.md +25 -25
- package/resource/knowledge/trtc/ios/TXDeviceManager.md +9 -11
- package/resource/knowledge/trtc/ios/TXLiteAVCode.md +12 -12
- package/server.js +21 -21
- package/tools/common/finalize_answer.js +1 -1
- package/tools/common/present_framework_choice.js +2 -2
- package/tools/common/search_trtc_knowledge.js +3 -3
- package/tools/common/submit_feedback.js +1 -1
- package/tools/definitions/get_native_live_uikit_integration_def.js +61 -0
- package/tools/definitions/get_native_livekit_core_integration_def.js +3 -3
- package/tools/definitions/present_framework_choice_def.js +2 -2
- package/tools/definitions/search_trtc_knowledge_def.js +5 -5
- package/tools/index.js +2 -0
- package/tools/live/get_native_live_uikit_integration.js +69 -0
- package/tools/live/get_native_livekit_core_integration.js +6 -6
- package/utils/report-cls-client.js +1 -1
- package/utils/report-es-client.js +1 -1
- package/resource/knowledge/callkit/preset/web/api.md +0 -83
- package/resource/knowledge/livekit/core-sdk/live/android/live-audio-effect.md +0 -226
- package/resource/knowledge/livekit/core-sdk/live/android/live-live-list.md +0 -438
- package/resource/knowledge/livekit/core-sdk/live/flutter/live-barrage.md +0 -490
- package/resource/knowledge/livekit/core-sdk/live/flutter/live-live-list.md +0 -726
- package/resource/knowledge/livekit/core-sdk/live/ios/live-audience-list.md +0 -264
- package/resource/knowledge/livekit/core-sdk/live/ios/live-audio-effect.md +0 -216
- package/resource/knowledge/livekit/core-sdk/live/ios/live-gift.md +0 -407
- package/resource/knowledge/livekit/core-sdk/live/ios/live-live-list.md +0 -349
- package/resource/knowledge/livekit/core-sdk/voice/android/voice-audience-list.md +0 -269
- package/resource/knowledge/livekit/core-sdk/voice/android/voice-barrage.md +0 -456
- package/resource/knowledge/livekit/core-sdk/voice/android/voice-gift.md +0 -455
- package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +0 -260
- package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +0 -598
- package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-gift.md +0 -424
- package/resource/knowledge/livekit/core-sdk/voice/ios/voice-barrage.md +0 -408
- /package/resource/knowledge/livekit/core-sdk/{live/android/live-audience-list.md → features/android/audience-list.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/{live/android/live-barrage.md → features/android/barrage.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/{live/android/live-base-beauty.md → features/android/base-beauty.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audience-list.md → features/flutter/audience-list.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-base-beauty.md → features/flutter/base-beauty.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/{live/ios/live-barrage.md → features/ios/barrage.md} +0 -0
- /package/resource/knowledge/livekit/core-sdk/voice/android/{voice-co-guest-interaction.md → co-guest-interaction.md} +0 -0
|
@@ -23,7 +23,7 @@ function loadManifest() {
|
|
|
23
23
|
cachedManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
24
24
|
return cachedManifest;
|
|
25
25
|
}
|
|
26
|
-
function postProcess(ranked, chunksById, limit) {
|
|
26
|
+
function postProcess(ranked, chunksById, limit, opts) {
|
|
27
27
|
const sourceCount = {};
|
|
28
28
|
const urlMappingSourceCount = {};
|
|
29
29
|
/** 已入选的 push config/android/{vendor} 文件,用于抑制其他厂商噪声 */
|
|
@@ -34,9 +34,10 @@ function postProcess(ranked, chunksById, limit) {
|
|
|
34
34
|
if (!chunk)
|
|
35
35
|
continue;
|
|
36
36
|
const isUrlMapping = Boolean(isUrlMappingSource(chunk.source));
|
|
37
|
+
const isPinnedUrlRow = isUrlMapping && (opts?.pinnedUrlRowChunkIds?.has(chunk.id) ?? false);
|
|
37
38
|
if (isUrlMapping) {
|
|
38
39
|
const urlCount = urlMappingSourceCount[chunk.source] ?? 0;
|
|
39
|
-
if (urlCount >= 1)
|
|
40
|
+
if (!isPinnedUrlRow && urlCount >= 1)
|
|
40
41
|
continue;
|
|
41
42
|
urlMappingSourceCount[chunk.source] = urlCount + 1;
|
|
42
43
|
}
|
|
@@ -68,22 +69,33 @@ function postProcess(ranked, chunksById, limit) {
|
|
|
68
69
|
if (firstPush) {
|
|
69
70
|
// 首条不设分数截止,至少保证 1 条返回
|
|
70
71
|
}
|
|
71
|
-
else {
|
|
72
|
+
else if (!isPinnedUrlRow) {
|
|
72
73
|
// 分数衰减到 top 的 5% 以下时停止,不硬填到 limit
|
|
74
|
+
// chat/urls 的行级精确命中(E7)不受该规则截断,保证多子主题可并行返回
|
|
73
75
|
const topScore = fragments[0].score;
|
|
74
76
|
if (topScore > 0 && item.score < topScore * 0.05)
|
|
75
77
|
break;
|
|
76
78
|
}
|
|
79
|
+
const contentWithHint = chunk.contains_code
|
|
80
|
+
? `【代码示例,须与目标端一致】\n${chunk.content}`
|
|
81
|
+
: chunk.content;
|
|
77
82
|
fragments.push({
|
|
78
83
|
rank: fragments.length + 1,
|
|
79
84
|
score: item.score,
|
|
80
85
|
title: chunk.title,
|
|
81
|
-
content:
|
|
86
|
+
content: contentWithHint,
|
|
82
87
|
source: chunk.source,
|
|
83
88
|
doc_urls: resolveFragmentDocUrls(chunk.source, chunk.content, getSourceFileContent(chunk.source)),
|
|
84
89
|
product: chunk.product,
|
|
85
90
|
framework: chunk.framework,
|
|
86
91
|
types: chunk.types,
|
|
92
|
+
variant: chunk.variant,
|
|
93
|
+
scope: chunk.scope,
|
|
94
|
+
doc_kind: chunk.doc_kind,
|
|
95
|
+
capability_status: chunk.capability_status,
|
|
96
|
+
api_names: chunk.api_names,
|
|
97
|
+
contains_code: chunk.contains_code,
|
|
98
|
+
citation: `[来源: ${chunk.id}]`,
|
|
87
99
|
chunk_id: chunk.id,
|
|
88
100
|
});
|
|
89
101
|
if (fragments.length >= limit)
|
|
@@ -112,62 +124,168 @@ function partitionFragments(fragments) {
|
|
|
112
124
|
const urlMappingKinds = [...new Set(urlMapping.map((f) => isUrlMappingSource(f.source)).filter(Boolean))];
|
|
113
125
|
return { urlMapping, localDoc, urlMappingKinds };
|
|
114
126
|
}
|
|
127
|
+
function hasBestPracticeFragment(fragments) {
|
|
128
|
+
return fragments.some((f) => /\/best-practice\//i.test(f.source));
|
|
129
|
+
}
|
|
130
|
+
function inferQueryApiTokens(prompt) {
|
|
131
|
+
const tokens = new Set();
|
|
132
|
+
const upperNoise = new Set(['SDK', 'API', 'HTTP', 'HTTPS', 'JSON', 'CALL', 'NAME', 'STATUS']);
|
|
133
|
+
for (const match of prompt.matchAll(/\b([a-z]+[A-Z][A-Za-z0-9_]*)\b/g)) {
|
|
134
|
+
tokens.add(match[1]);
|
|
135
|
+
}
|
|
136
|
+
for (const match of prompt.matchAll(/\b([A-Z][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*)\b/g)) {
|
|
137
|
+
tokens.add(match[1]);
|
|
138
|
+
}
|
|
139
|
+
for (const match of prompt.matchAll(/\b(use[A-Z]\w*)\b/g)) {
|
|
140
|
+
tokens.add(match[1]);
|
|
141
|
+
}
|
|
142
|
+
for (const match of prompt.matchAll(/\b(I[A-Z][A-Za-z0-9_]*)\b/g)) {
|
|
143
|
+
tokens.add(match[1]);
|
|
144
|
+
}
|
|
145
|
+
for (const match of prompt.matchAll(/\b([A-Z][A-Za-z0-9_]*\.[A-Z_][A-Z0-9_]*)\b/g)) {
|
|
146
|
+
tokens.add(match[1]);
|
|
147
|
+
}
|
|
148
|
+
for (const match of prompt.matchAll(/\b([A-Z_]{3,})\b/g)) {
|
|
149
|
+
const token = match[1];
|
|
150
|
+
if (!upperNoise.has(token))
|
|
151
|
+
tokens.add(token);
|
|
152
|
+
}
|
|
153
|
+
return [...tokens];
|
|
154
|
+
}
|
|
155
|
+
function tokenInChunk(token, chunk) {
|
|
156
|
+
if (chunk.api_names?.some((name) => name.toLowerCase() === token.toLowerCase()))
|
|
157
|
+
return true;
|
|
158
|
+
if (chunk.symbols?.some((name) => name.toLowerCase() === token.toLowerCase()))
|
|
159
|
+
return true;
|
|
160
|
+
const low = token.toLowerCase();
|
|
161
|
+
return chunk.title.toLowerCase().includes(low) || chunk.source.toLowerCase().includes(low);
|
|
162
|
+
}
|
|
163
|
+
function computeApiNameCoverage(tokens, candidates) {
|
|
164
|
+
if (!tokens.length)
|
|
165
|
+
return 1;
|
|
166
|
+
const hit = tokens.filter((token) => candidates.some((chunk) => tokenInChunk(token, chunk))).length;
|
|
167
|
+
return Number((hit / tokens.length).toFixed(2));
|
|
168
|
+
}
|
|
169
|
+
function computeMissingApiTokens(tokens, candidates) {
|
|
170
|
+
if (!tokens.length)
|
|
171
|
+
return [];
|
|
172
|
+
return tokens.filter((token) => !candidates.some((chunk) => tokenInChunk(token, chunk)));
|
|
173
|
+
}
|
|
174
|
+
function applyRankMultipliers(ranked, chunksById, opts) {
|
|
175
|
+
const adjusted = ranked.map((item) => {
|
|
176
|
+
const chunk = chunksById.get(item.id);
|
|
177
|
+
if (!chunk)
|
|
178
|
+
return item;
|
|
179
|
+
let multiplier = 1;
|
|
180
|
+
// A2: 传了 product 时,命中 scope 的通配语料允许召回但降权
|
|
181
|
+
if (opts.product?.length && chunk.product === '*') {
|
|
182
|
+
multiplier *= 0.2;
|
|
183
|
+
}
|
|
184
|
+
// F2: framework 软降权(保留硬过滤,处理 fallback/边界残留)
|
|
185
|
+
if (opts.framework && opts.frameworks?.length && !chunk.framework.includes('*')) {
|
|
186
|
+
const explicitMatch = opts.frameworks.some((fw) => chunk.framework.includes(fw));
|
|
187
|
+
const callCoreWebFallback = Boolean(opts.product?.includes('call')
|
|
188
|
+
&& (opts.framework === 'react' || opts.framework === 'vue')
|
|
189
|
+
&& chunk.variant === 'core-sdk'
|
|
190
|
+
&& chunk.framework.includes('web'));
|
|
191
|
+
const liveWebVueFallback = Boolean(opts.product?.includes('live')
|
|
192
|
+
&& opts.framework === 'web'
|
|
193
|
+
&& chunk.variant === 'core-sdk'
|
|
194
|
+
&& chunk.framework.includes('vue')
|
|
195
|
+
&& chunk.source.includes('/api-reference/'));
|
|
196
|
+
if (!explicitMatch && !callCoreWebFallback && !liveWebVueFallback) {
|
|
197
|
+
multiplier *= 0.2;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { ...item, score: item.score * multiplier };
|
|
201
|
+
});
|
|
202
|
+
return adjusted.sort((a, b) => b.score - a.score);
|
|
203
|
+
}
|
|
115
204
|
/**
|
|
116
|
-
*
|
|
117
|
-
* - high:top ≥ 50 或有精确命中(exactHits 非空)
|
|
118
|
-
* - medium:top ≥ 10 且 top / second ≥ 1.3(区分度足够)
|
|
119
|
-
* - low:top 较低或与 second 接近(同水位竞争,agent 应谨慎)
|
|
120
|
-
* - none:fragments 为空
|
|
205
|
+
* 多因子置信度评估:exact 命中 + 分数梯度 + API 覆盖度。
|
|
121
206
|
*/
|
|
122
|
-
function assessConfidence(fragments, exactHits) {
|
|
207
|
+
function assessConfidence(fragments, exactHits, apiNameCoverage, queryApiTokens) {
|
|
123
208
|
if (fragments.length === 0) {
|
|
124
209
|
return { confidence: 'none', status: 'empty' };
|
|
125
210
|
}
|
|
126
211
|
const top = fragments[0].score;
|
|
127
212
|
const second = fragments[1]?.score ?? 0;
|
|
128
|
-
if (exactHits.length > 0 || top >= 50) {
|
|
129
|
-
return { confidence: 'high', status: 'success' };
|
|
130
|
-
}
|
|
131
213
|
const ratio = second > 0 ? top / second : Infinity;
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (top >=
|
|
136
|
-
|
|
214
|
+
let confidence;
|
|
215
|
+
if (exactHits.length > 0 || top >= 50)
|
|
216
|
+
confidence = 'high';
|
|
217
|
+
else if (top >= 12 && ratio >= 1.25)
|
|
218
|
+
confidence = 'medium';
|
|
219
|
+
else if (top >= 6 && ratio >= 1.12)
|
|
220
|
+
confidence = 'medium';
|
|
221
|
+
else
|
|
222
|
+
confidence = 'low';
|
|
223
|
+
// D2: API 覆盖过低时,confidence 上限降为 low
|
|
224
|
+
if (queryApiTokens.length > 0 && apiNameCoverage < 0.3) {
|
|
225
|
+
confidence = 'low';
|
|
137
226
|
}
|
|
138
|
-
|
|
227
|
+
const status = confidence === 'low' ? 'low_confidence' : 'success';
|
|
228
|
+
return { confidence, status };
|
|
229
|
+
}
|
|
230
|
+
function buildAnswerContract(status, confidence, opts) {
|
|
231
|
+
const uncertaintyRule = status === 'low_confidence' || confidence === 'low'
|
|
232
|
+
? '当信息不足时必须显式写“待确认:”,只允许陈述缺口,不允许猜测补全。'
|
|
233
|
+
: '除“待确认:”段落外,不得出现“可能/大概/应该/推测”等猜测措辞。';
|
|
234
|
+
const riskRule = opts?.fabricationRisk
|
|
235
|
+
? 'fabrication_risk=true 时,若片段未覆盖该细节,必须输出“待确认:知识片段未覆盖此项”。'
|
|
236
|
+
: '';
|
|
237
|
+
return [
|
|
238
|
+
'【输出模板(必须遵守)】',
|
|
239
|
+
'使用“问题导向”标题组织答案,优先复用用户提问原句:一、<问题1> 二、<问题2> 三、<问题3> …',
|
|
240
|
+
'每个小节先给直接结论,再补 1-2 句必要说明;避免模板化术语(如“依据/操作”字样)。',
|
|
241
|
+
'信息缺口统一放在对应小节末尾,使用“待确认:xxx”;若全都确认则可省略“待确认”小节。',
|
|
242
|
+
'末尾保留“参考文档”小节,仅列文档标题或 URL;正文不展示检索过程、证据链、打分细节。',
|
|
243
|
+
'用户可见正文禁止出现系统检索话术(如“命中片段/检索结果/置信度/分数/召回/重排”)。',
|
|
244
|
+
'硬约束:不得引入 fragments 未出现的 API 名、字段值、枚举项、事件名。',
|
|
245
|
+
uncertaintyRule,
|
|
246
|
+
riskRule,
|
|
247
|
+
].filter(Boolean).join(' ');
|
|
139
248
|
}
|
|
140
|
-
function buildAgentMessage(status, fragments, confidence,
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const tail = `${
|
|
249
|
+
function buildAgentMessage(status, fragments, confidence, _references, opts) {
|
|
250
|
+
const platformRule = '端别硬规则:字段/API 描述前先标注【端别: framework】;禁止“部分版本也称 xxx”这类跨端混写;字段大小写必须与目标端文档一致;多端片段同时命中时主答案仅讲目标端,其他端差异放末尾简述;无片段覆盖的细节禁止补全。';
|
|
251
|
+
const riskRule = opts?.fabricationRisk ? '当前检索存在幻觉风险(fabrication_risk=true):禁止补全未命中 API 细节。' : '';
|
|
252
|
+
const answerContract = buildAnswerContract(status, confidence, opts);
|
|
253
|
+
const tail = `${platformRule} ${riskRule} ${answerContract} Final answer drafted -> MUST call \`finalize_answer\` before replying. Explicit follow-up feedback -> call \`submit_feedback\`.`;
|
|
145
254
|
if (status === 'needs_framework') {
|
|
146
|
-
return '
|
|
255
|
+
return '【硬规则】问题依赖具体平台实现,但未指定 frameworks,全平台混检信息密度低且被禁止。MUST 先调用 `present_framework_choice`(传入 product),等用户选定 web/miniprogram/android/ios/flutter/react/vue/uni-app 等后再调用本工具,并 MUST 带上 **product + frameworks**。禁止传空 frameworks 硬搜。';
|
|
147
256
|
}
|
|
148
257
|
const { urlMapping, localDoc, urlMappingKinds } = partitionFragments(fragments);
|
|
149
258
|
const hasUrlMapping = urlMapping.length > 0;
|
|
150
259
|
const hasLocalDoc = localDoc.length > 0;
|
|
260
|
+
const hasBestPractice = hasBestPracticeFragment(fragments);
|
|
151
261
|
const urlKindLabel = urlMappingKinds.join(' / ') || 'urls';
|
|
152
262
|
if (status === 'success' && fragments.length > 0) {
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
263
|
+
const topFragment = fragments[0];
|
|
264
|
+
if (topFragment?.capability_status === 'unsupported') {
|
|
265
|
+
const scopeLabel = topFragment.scope ? `(${topFragment.scope})` : '';
|
|
266
|
+
return `当前问题在该平台 / 形态下 **不支持**${scopeLabel}。回答 MUST:① 第一段先明确写“**不支持**”;② 说明这是当前平台 Core 的能力边界,而不是缺少示例代码;③ 仅提供当前平台已支持的替代方案(如对应平台 preset 预制 UI);若当前知识库未给出明确替代形态,应直接说明暂无可执行替代路径;④ **禁止**输出当前平台 Core 的 API 调用步骤或集成步骤。${tail}`;
|
|
267
|
+
}
|
|
156
268
|
if (hasUrlMapping && !hasLocalDoc) {
|
|
157
|
-
return
|
|
269
|
+
return `当前可用信息主要是文档入口链接(${urlKindLabel})。请先匹配用户问题对应的目标 URL,抓取官网文档后再合成答案;禁止仅复述映射表或臆造 API/错误码细节。${tail}`;
|
|
158
270
|
}
|
|
159
271
|
if (hasUrlMapping && hasLocalDoc) {
|
|
160
|
-
|
|
272
|
+
if (hasBestPractice) {
|
|
273
|
+
return `优先基于已命中的 best-practice 与本地片段直接作答;URL 映射仅作补充参考,不要再抓官网做二次求证。${tail}`;
|
|
274
|
+
}
|
|
275
|
+
return `本地文档片段可直接用于作答;若本地片段未覆盖关键细节,再从 URL 映射中提取目标 URL 抓取官网文档补齐。${tail}`;
|
|
161
276
|
}
|
|
162
|
-
return
|
|
277
|
+
return `请仅基于已返回 fragments 合成答案;不要并行 web_search 或额外抓取官网文档。${tail}`;
|
|
163
278
|
}
|
|
164
279
|
if (status === 'low_confidence') {
|
|
165
280
|
if (hasUrlMapping) {
|
|
166
|
-
|
|
281
|
+
if (hasBestPractice) {
|
|
282
|
+
return `优先基于 best-practice 与本地片段给出可执行结论;未覆盖的内容统一写入“待确认”,不要默认抓官网二次求证。${tail}`;
|
|
283
|
+
}
|
|
284
|
+
return `请先从 URL 映射里提取目标 URL 并抓取官网文档补齐关键信息,再给出答案;仍无法确认的内容明确写“待确认”。${tail}`;
|
|
167
285
|
}
|
|
168
|
-
return
|
|
286
|
+
return `请基于已有 fragments 给出最可执行答案,并将未覆盖细节明确写为“待确认”;可引导用户补充组件名/API 名/错误码后重新检索。不要默认并行 web_search。${tail}`;
|
|
169
287
|
}
|
|
170
|
-
return
|
|
288
|
+
return `知识库未命中有效片段。请向用户说明并确认 product/framework 是否准确;若仍无 platform 信息且问题依赖具体客户端,应先 \`present_framework_choice\`。${tail}`;
|
|
171
289
|
}
|
|
172
290
|
export function searchKnowledge(params) {
|
|
173
291
|
const norm = normalizeParams(params);
|
|
@@ -188,42 +306,110 @@ export function searchKnowledge(params) {
|
|
|
188
306
|
}
|
|
189
307
|
const manifest = loadManifest();
|
|
190
308
|
const allChunks = manifest.chunks;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
309
|
+
const queryApiTokens = inferQueryApiTokens(norm.prompt);
|
|
310
|
+
const runSearchPass = (passNorm, opts) => {
|
|
311
|
+
let pool = filterPool(allChunks, passNorm);
|
|
312
|
+
// types 误传自愈:首轮保留,二次扩检也同样保留该能力
|
|
313
|
+
if (pool.length === 0 && passNorm.types?.length) {
|
|
314
|
+
pool = filterPool(allChunks, { ...passNorm, types: undefined });
|
|
315
|
+
}
|
|
316
|
+
const { boosts, exactHits, urlRowHitChunkIds } = runExactLookup(passNorm.prompt, pool, passNorm);
|
|
317
|
+
// A2 补充正向路由:UserSig 问法下允许 share 命中且优先于无关 urls 噪声
|
|
318
|
+
if (/usersig|sdkappid|secretkey|鉴权|签名|gentestusersig/i.test(passNorm.prompt)) {
|
|
319
|
+
for (const chunk of pool) {
|
|
320
|
+
if (chunk.product === '*' && chunk.source.includes('knowledge/share/userSig.md')) {
|
|
321
|
+
boosts[chunk.id] = (boosts[chunk.id] ?? 0) + 220;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// B2: API 覆盖不足扩检时,对 api/integration 语料做轻量重排提权
|
|
326
|
+
if (opts?.apiRetry) {
|
|
327
|
+
for (const chunk of pool) {
|
|
328
|
+
if (chunk.types.includes('api') || chunk.types.includes('integration')) {
|
|
329
|
+
boosts[chunk.id] = (boosts[chunk.id] ?? 0) + 40;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const productIndex = getProductsBM25Index(allChunks, passNorm.product);
|
|
334
|
+
const poolWithContent = attachPoolContent(pool);
|
|
335
|
+
const chunksById = new Map(poolWithContent.map((chunk) => [chunk.id, chunk]));
|
|
336
|
+
const ranked = rankSubsetWithIndex(passNorm.prompt, pool.map((chunk) => chunk.id), productIndex, boosts);
|
|
337
|
+
const rankedWithMultipliers = applyRankMultipliers(ranked, chunksById, {
|
|
338
|
+
product: passNorm.product,
|
|
339
|
+
framework: passNorm.framework,
|
|
340
|
+
frameworks: passNorm.frameworks,
|
|
341
|
+
});
|
|
342
|
+
const pinnedUrlRowChunkIds = new Set(urlRowHitChunkIds);
|
|
343
|
+
const fragments = postProcess(rankedWithMultipliers, chunksById, passNorm.limit, {
|
|
344
|
+
pinnedUrlRowChunkIds,
|
|
345
|
+
});
|
|
346
|
+
const urlMappingSources = [...new Set(fragments.map((f) => f.source).filter((source) => isUrlMappingSource(source)))];
|
|
347
|
+
const references = buildReferences(fragments);
|
|
348
|
+
const apiNameCoverage = computeApiNameCoverage(queryApiTokens, poolWithContent);
|
|
349
|
+
const missingApiTokens = computeMissingApiTokens(queryApiTokens, poolWithContent);
|
|
350
|
+
return {
|
|
351
|
+
pool,
|
|
352
|
+
fragments,
|
|
353
|
+
exactHits,
|
|
354
|
+
urlMappingSources,
|
|
355
|
+
references,
|
|
356
|
+
apiNameCoverage,
|
|
357
|
+
missingApiTokens,
|
|
358
|
+
urlMapRelaxed: pinnedUrlRowChunkIds.size > 0,
|
|
359
|
+
urlMapExactHitCount: pinnedUrlRowChunkIds.size,
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
let pass = runSearchPass(norm);
|
|
363
|
+
let retryReason;
|
|
364
|
+
// B2: API token 覆盖不足时触发一次扩检(去掉 types 约束 + api/integration 轻提权)
|
|
365
|
+
const missingRatio = queryApiTokens.length > 0
|
|
366
|
+
? Number((pass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
|
|
367
|
+
: 0;
|
|
368
|
+
if (queryApiTokens.length > 0 && (pass.apiNameCoverage === 0 || missingRatio >= 0.3)) {
|
|
369
|
+
const retryPass = runSearchPass({ ...norm, types: undefined }, { apiRetry: true });
|
|
370
|
+
const retryMissingRatio = queryApiTokens.length > 0
|
|
371
|
+
? Number((retryPass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
|
|
372
|
+
: 0;
|
|
373
|
+
if (retryPass.apiNameCoverage > pass.apiNameCoverage
|
|
374
|
+
|| retryMissingRatio < missingRatio
|
|
375
|
+
|| (pass.fragments.length === 0 && retryPass.fragments.length > 0)) {
|
|
376
|
+
pass = retryPass;
|
|
377
|
+
retryReason = `api_gap_retry:coverage=${pass.apiNameCoverage},missing_ratio=${retryMissingRatio}`;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
const routeInconsistencyWarning = pass.fragments.length > 0
|
|
381
|
+
? pass.fragments.filter((f) => f.product === '*').length / pass.fragments.length > 0.3
|
|
382
|
+
: false;
|
|
383
|
+
const { confidence, status } = assessConfidence(pass.fragments, pass.exactHits, pass.apiNameCoverage, queryApiTokens);
|
|
384
|
+
const fabricationRisk = (queryApiTokens.length > 0 && pass.apiNameCoverage < 0.3)
|
|
385
|
+
|| (confidence === 'low' && pass.fragments.length < 2);
|
|
386
|
+
const topScore = pass.fragments[0]?.score;
|
|
387
|
+
const secondScore = pass.fragments[1]?.score;
|
|
388
|
+
const answerContract = buildAnswerContract(status, confidence, { fabricationRisk });
|
|
212
389
|
return {
|
|
213
390
|
status,
|
|
214
391
|
confidence,
|
|
215
|
-
message: buildAgentMessage(status, fragments, confidence, references),
|
|
392
|
+
message: buildAgentMessage(status, pass.fragments, confidence, pass.references, { fabricationRisk }),
|
|
216
393
|
query: params,
|
|
217
394
|
meta: {
|
|
218
395
|
pool_size: allChunks.length,
|
|
219
|
-
filtered_size: pool.length,
|
|
220
|
-
exact_hits: exactHits,
|
|
221
|
-
...(urlMappingSources.length ? { url_mapping_sources: urlMappingSources } : {}),
|
|
222
|
-
...(
|
|
396
|
+
filtered_size: pass.pool.length,
|
|
397
|
+
exact_hits: pass.exactHits,
|
|
398
|
+
...(pass.urlMappingSources.length ? { url_mapping_sources: pass.urlMappingSources } : {}),
|
|
399
|
+
...(pass.urlMapRelaxed ? { url_map_relaxed: pass.urlMapRelaxed } : {}),
|
|
400
|
+
...(pass.urlMapExactHitCount > 0 ? { url_map_exact_hit_count: pass.urlMapExactHitCount } : {}),
|
|
401
|
+
...(pass.references.length ? { references: pass.references } : {}),
|
|
223
402
|
...(topScore !== undefined ? { top_score: Number(topScore.toFixed(2)) } : {}),
|
|
224
403
|
...(secondScore !== undefined ? { second_score: Number(secondScore.toFixed(2)) } : {}),
|
|
404
|
+
...(queryApiTokens.length ? { query_api_tokens: queryApiTokens } : {}),
|
|
405
|
+
...(pass.missingApiTokens.length ? { missing_api_tokens: pass.missingApiTokens } : {}),
|
|
406
|
+
...(retryReason ? { retry_reason: retryReason } : {}),
|
|
407
|
+
answer_contract: answerContract,
|
|
408
|
+
api_name_coverage: pass.apiNameCoverage,
|
|
409
|
+
fabrication_risk: fabricationRisk,
|
|
410
|
+
route_inconsistency_warning: routeInconsistencyWarning,
|
|
225
411
|
},
|
|
226
|
-
fragments,
|
|
412
|
+
fragments: pass.fragments,
|
|
227
413
|
};
|
|
228
414
|
}
|
|
229
415
|
export { normalizeParams, filterPool };
|