@tencent-rtc/mcp 1.6.6 → 1.6.8
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/build-index.js +3 -0
- package/knowledge/content-loader.js +3 -1
- package/knowledge/search/filter-pool.js +12 -4
- package/knowledge/search/query-normalizer.js +76 -0
- package/knowledge/search/search-knowledge.js +104 -5
- package/package.json +1 -1
- package/resource/_schema/feature-aliases.yaml +1 -0
- package/resource/_schema/query-normalization.yaml +9 -0
- package/resource/index/manifest.json +1 -1
- package/resource/integration/callkit/preset/android/integration.md +3 -14
- package/resource/integration/callkit/preset/flutter/integration.md +1 -12
- package/resource/integration/callkit/preset/ios/integration.md +2 -12
- package/resource/integration/callkit/preset/react/integration.md +1 -14
- package/resource/integration/callkit/preset/vue/integration.md +1 -14
- package/resource/integration/chat/preset/android/integration.md +6 -13
- package/resource/integration/chat/preset/flutter/integration.md +1 -8
- package/resource/integration/chat/preset/ios/integration.md +4 -12
- package/resource/integration/chat/preset/react/integration.md +6 -16
- package/resource/integration/chat/preset/vue/integration.md +0 -9
- package/resource/integration/livekit/preset/live/android/live-audience-integration.md +2 -6
- package/resource/integration/livekit/preset/live/android/live-host-integration.md +1 -11
- package/resource/integration/livekit/preset/live/android/live-list-integration.md +2 -6
- package/resource/integration/livekit/preset/live/android/prepare-integration.md +2 -7
- package/resource/integration/livekit/preset/live/ios/live-audience-integration.md +2 -7
- package/resource/integration/livekit/preset/live/ios/live-host-integration.md +1 -13
- package/resource/integration/livekit/preset/live/ios/live-list-integration.md +2 -10
- package/resource/integration/livekit/preset/live/ios/prepare-integration.md +3 -8
- package/resource/integration/livekit/preset/live/vue/live-list-integration.md +0 -4
- package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +1 -5
- package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +2 -7
- package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +2 -8
- package/resource/integration/roomkit/preset/vue/integration.md +0 -11
- package/resource/knowledge/callkit/core-sdk/android/answer-call.md +0 -7
- package/resource/knowledge/callkit/core-sdk/android/make-call.md +0 -8
- package/resource/knowledge/callkit/core-sdk/android/offline-push.md +1 -9
- package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +2 -8
- package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +2 -8
- package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +1 -16
- package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +0 -8
- package/resource/knowledge/callkit/core-sdk/ios/make-call.md +0 -8
- package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +0 -11
- package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +178 -200
- package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +195 -217
- package/resource/knowledge/callkit/faq/android.md +4 -14
- package/resource/knowledge/callkit/faq/common.md +0 -2
- package/resource/knowledge/callkit/faq/error-code.md +2 -4
- package/resource/knowledge/callkit/faq/ios.md +1 -4
- package/resource/knowledge/callkit/preset/android/api.md +0 -6
- package/resource/knowledge/callkit/preset/ios/api.md +0 -4
- package/resource/knowledge/callkit/preset/react/api.md +3 -4
- package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +3 -4
- package/resource/knowledge/callkit/preset/vue/api.md +3 -4
- package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +3 -4
- package/resource/knowledge/chat/preset/android/features/chat-setting.md +0 -5
- package/resource/knowledge/chat/preset/android/features/contact-list.md +0 -7
- package/resource/knowledge/chat/preset/android/features/conversation-list.md +0 -6
- package/resource/knowledge/chat/preset/android/features/language.md +0 -8
- package/resource/knowledge/chat/preset/android/features/message-input.md +0 -6
- package/resource/knowledge/chat/preset/android/features/message-list.md +0 -8
- package/resource/knowledge/chat/preset/android/features/search.md +0 -7
- package/resource/knowledge/chat/preset/android/features/theme.md +0 -4
- package/resource/knowledge/chat/preset/android-view/integration.md +0 -6
- package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +0 -4
- package/resource/knowledge/chat/preset/flutter/features/contact-list.md +0 -9
- package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +0 -7
- package/resource/knowledge/chat/preset/flutter/features/language.md +0 -5
- package/resource/knowledge/chat/preset/flutter/features/message-input.md +0 -6
- package/resource/knowledge/chat/preset/flutter/features/message-list.md +0 -8
- package/resource/knowledge/chat/preset/flutter/features/search.md +0 -5
- package/resource/knowledge/chat/preset/flutter/features/theme.md +0 -4
- package/resource/knowledge/chat/preset/ios/features/chat-setting.md +0 -5
- package/resource/knowledge/chat/preset/ios/features/contact-list.md +0 -5
- package/resource/knowledge/chat/preset/ios/features/conversation-list.md +0 -7
- package/resource/knowledge/chat/preset/ios/features/language.md +1 -8
- package/resource/knowledge/chat/preset/ios/features/message-input.md +0 -6
- package/resource/knowledge/chat/preset/ios/features/message-list.md +0 -8
- package/resource/knowledge/chat/preset/ios/features/search.md +0 -5
- package/resource/knowledge/chat/preset/ios/features/theme.md +0 -4
- package/resource/knowledge/chat/preset/ios-uikit/integration.md +0 -6
- package/resource/knowledge/chat/preset/react/features/contact-list.md +0 -23
- package/resource/knowledge/chat/preset/react/features/conversation-actions.md +2 -11
- package/resource/knowledge/chat/preset/react/features/conversation-list.md +4 -26
- package/resource/knowledge/chat/preset/react/features/conversation-preview.md +0 -6
- 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/preset/vue/features/contact-list.md +3 -9
- package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +0 -3
- package/resource/knowledge/chat/preset/vue/features/conversation-list.md +2 -13
- package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +2 -3
- package/resource/knowledge/chat/preset/vue/features/conversation-search.md +1 -0
- package/resource/knowledge/chat/preset/vue/features/search.md +4 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +0 -7
- package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +0 -5
- package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +0 -7
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +0 -5
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +1 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +0 -7
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +0 -5
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +0 -3
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +0 -1
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +0 -2
- package/resource/knowledge/livekit/core-sdk/features/android/audience-list.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/android/audio-effect.md +2 -3
- package/resource/knowledge/livekit/core-sdk/features/android/barrage.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/android/base-beauty.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/android/gift.md +2 -7
- package/resource/knowledge/livekit/core-sdk/features/android/live-list.md +3 -4
- package/resource/knowledge/livekit/core-sdk/features/flutter/audience-list.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/flutter/audio-effect.md +2 -4
- package/resource/knowledge/livekit/core-sdk/features/flutter/barrage.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/flutter/base-beauty.md +0 -2
- package/resource/knowledge/livekit/core-sdk/features/flutter/gift.md +2 -7
- package/resource/knowledge/livekit/core-sdk/features/flutter/live-list.md +3 -2
- package/resource/knowledge/livekit/core-sdk/features/ios/audience-list.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/ios/audio-effect.md +2 -4
- package/resource/knowledge/livekit/core-sdk/features/ios/barrage.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/ios/base-beauty.md +2 -2
- package/resource/knowledge/livekit/core-sdk/features/ios/gift.md +2 -7
- package/resource/knowledge/livekit/core-sdk/features/ios/live-list.md +3 -4
- package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +0 -3
- package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +0 -4
- package/resource/knowledge/livekit/core-sdk/live/android/integration.md +1 -4
- package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +1 -3
- package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +0 -1
- package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +1 -4
- package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +0 -3
- package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +0 -3
- package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +1 -4
- package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +0 -2
- package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +0 -5
- package/resource/knowledge/livekit/core-sdk/voice/android/integration.md +1 -4
- package/resource/knowledge/livekit/core-sdk/voice/flutter/co-guest-interaction.md +1 -4
- package/resource/knowledge/livekit/core-sdk/voice/flutter/integration.md +3 -6
- package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +0 -2
- package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +0 -4
- package/resource/knowledge/livekit/core-sdk/voice/ios/integration.md +1 -4
- package/resource/knowledge/livekit/faq/error-code.md +0 -1
- package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +2 -3
- package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +3 -3
- package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +3 -3
- package/resource/knowledge/push/api-reference/android.md +0 -1
- package/resource/knowledge/push/api-reference/harmonyos.md +0 -2
- package/resource/knowledge/push/api-reference/react-native.md +3 -5
- package/resource/knowledge/push/api-reference/uni-app.md +3 -5
- package/resource/knowledge/push/api-reference/unity.md +0 -1
- package/resource/knowledge/push/api-reference/unreal-engine.md +0 -1
- package/resource/knowledge/push/config/android.md +0 -24
- package/resource/knowledge/push/config/harmonyos.md +0 -1
- package/resource/knowledge/push/config/ios.md +0 -3
- package/resource/knowledge/push/config/react-native.md +0 -29
- package/resource/knowledge/push/config/unity.md +1 -24
- package/resource/knowledge/push/config/unreal-engine.md +1 -24
- package/resource/knowledge/push/integration/android.md +0 -14
- package/resource/knowledge/push/integration/flutter.md +0 -19
- package/resource/knowledge/push/integration/harmonyos.md +0 -2
- package/resource/knowledge/push/integration/ios.md +0 -3
- package/resource/knowledge/push/integration/react-native.md +0 -24
- package/resource/knowledge/push/integration/uni-app.md +1 -11
- package/resource/knowledge/push/integration/unity.md +0 -9
- package/resource/knowledge/push/integration/unreal-engine.md +1 -17
- package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/android/room-state.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +1 -5
- package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +0 -4
- package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +1 -5
- package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +1 -1
- package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +0 -6
- package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +0 -9
- package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -11
- package/resource/knowledge/roomkit/core-sdk/vue/room-participant-state.md +1 -5
- package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +1 -8
- package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -3
- package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +0 -3
- package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +0 -5
- package/resource/knowledge/roomkit/preset/android/integration.md +0 -4
- package/resource/knowledge/roomkit/preset/flutter/integration.md +1 -13
- package/resource/knowledge/roomkit/preset/ios/integration.md +0 -6
- package/resource/knowledge/roomkit/preset/react/integration.md +0 -16
- package/resource/knowledge/rtcengine/web/api.md +1 -8
- package/resource/knowledge/rtcengine/web/faq.md +3 -5
- package/resource/knowledge/rtcengine/web/how_to_integrated_web_sdk.md +0 -6
- package/resource/knowledge/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +1 -1
- package/resource/knowledge/rtcengine/web/plugin/21-advanced-auto-play-policy.md +1 -1
- package/resource/knowledge/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +1 -1
- package/resource/knowledge/rtcengine/web/plugin/27-advanced-small-stream.md +1 -1
- package/resource/knowledge/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -3
- package/resource/knowledge/rtcengine/web/plugin/34-advanced-proxy.md +2 -4
- package/resource/knowledge/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -4
- package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -2
- package/resource/knowledge/trtc/android/TRTCCloud.md +8 -56
- package/resource/knowledge/trtc/android/TRTCCloudDef.md +6 -7
- package/resource/knowledge/trtc/android/TRTCCloudListener.md +1 -18
- package/resource/knowledge/trtc/android/TXAudioEffectManager.md +0 -14
- package/resource/knowledge/trtc/android/TXDeviceManager.md +0 -1
- package/resource/knowledge/trtc/android/TXLiteAVCode.md +1 -1
- package/resource/knowledge/trtc/c++/ITRTCCloud.md +7 -59
- package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +0 -14
- package/resource/knowledge/trtc/c++/ITXDeviceManager.md +0 -4
- package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1 -19
- package/resource/knowledge/trtc/c++/TRTCTypeDef.md +6 -7
- package/resource/knowledge/trtc/c++/TXLiteAVCode.md +1 -1
- package/resource/knowledge/trtc/ios/TRTCCloud.md +9 -60
- package/resource/knowledge/trtc/ios/TRTCCloudDef.md +6 -7
- package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1 -19
- package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +0 -13
- package/resource/knowledge/trtc/ios/TXDeviceManager.md +0 -4
- package/resource/knowledge/trtc/ios/TXLiteAVCode.md +1 -1
- package/server.js +1 -1
- package/tools/common/search_trtc_knowledge.js +2 -0
- package/tools/definitions/search_trtc_knowledge_def.js +1 -0
- package/utils/report-cls-client.js +3 -3
- package/utils/report-es-client.js +1 -1
- package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +0 -230
- package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +0 -797
- package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +0 -325
- package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +0 -325
package/knowledge/build-index.js
CHANGED
|
@@ -5,6 +5,9 @@ import { chunkMarkdown, toManifestChunk } from './chunker.js';
|
|
|
5
5
|
import { buildDocSourceUrlMap } from './doc-url-resolver.js';
|
|
6
6
|
import { inferPathMeta } from './path-meta.js';
|
|
7
7
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
// Build-time: writes index into dist/resource/index/.
|
|
9
|
+
// dist/knowledge/ → ../resource/ → dist/resource/
|
|
10
|
+
// Must run AFTER scripts/copy-resource.js, otherwise the target dir does not exist.
|
|
8
11
|
const RESOURCE_ROOT = path.resolve(__dirname, '../resource');
|
|
9
12
|
function walkMarkdownFiles(dir, baseRel) {
|
|
10
13
|
if (!fs.existsSync(dir))
|
|
@@ -4,7 +4,9 @@ import { fileURLToPath } from 'url';
|
|
|
4
4
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
5
|
const fileCache = new Map();
|
|
6
6
|
function resolveResourceRoot() {
|
|
7
|
-
//
|
|
7
|
+
// Runtime md source dir (sibling of knowledge/):
|
|
8
|
+
// npm package: <pkg>/knowledge/ → <pkg>/resource/
|
|
9
|
+
// local: dist/knowledge/ → dist/resource/ (populated by copy-resource.js at build time)
|
|
8
10
|
return path.resolve(__dirname, '../resource');
|
|
9
11
|
}
|
|
10
12
|
function readSourceFile(source) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { downgradeToProductType } from './product-scope-intent.js';
|
|
2
|
+
import { normalizeQueryPrompt } from './query-normalizer.js';
|
|
2
3
|
/**
|
|
3
4
|
* MCP framework enum → index 中对应的 framework 值列表。
|
|
4
5
|
* path-meta.ts 已通过 normalizeFrameworkDir 把目录名归一到标准 framework,
|
|
@@ -70,15 +71,16 @@ function inferImplicitFramework(products, frameworks, prompt) {
|
|
|
70
71
|
return undefined;
|
|
71
72
|
}
|
|
72
73
|
export function normalizeParams(params) {
|
|
74
|
+
const normalizedPrompt = normalizeQueryPrompt(params.prompt);
|
|
73
75
|
const limit = Math.min(Math.max(params.limit ?? 8, 1), 16);
|
|
74
|
-
const effectiveFramework = inferImplicitFramework(params.product, params.frameworks,
|
|
76
|
+
const effectiveFramework = inferImplicitFramework(params.product, params.frameworks, normalizedPrompt);
|
|
75
77
|
const requestedFrameworks = params.frameworks?.length
|
|
76
78
|
? params.frameworks
|
|
77
79
|
: effectiveFramework ? [effectiveFramework] : undefined;
|
|
78
80
|
const frameworks = expandFrameworks(requestedFrameworks, params.product);
|
|
79
|
-
const types = resolveTypes(params.product, params.types,
|
|
81
|
+
const types = resolveTypes(params.product, params.types, normalizedPrompt, requestedFrameworks);
|
|
80
82
|
return {
|
|
81
|
-
prompt:
|
|
83
|
+
prompt: normalizedPrompt,
|
|
82
84
|
product: params.product,
|
|
83
85
|
framework: effectiveFramework,
|
|
84
86
|
frameworks,
|
|
@@ -144,7 +146,13 @@ export function filterPool(chunks, norm) {
|
|
|
144
146
|
&& chunk.variant === 'core-sdk'
|
|
145
147
|
&& chunk.framework.includes('vue')
|
|
146
148
|
&& chunk.source.includes('/api-reference/'));
|
|
147
|
-
|
|
149
|
+
// Room special-case: Conference Web docs are under roomkit/core-sdk/vue.
|
|
150
|
+
const roomWebVueFallback = Boolean(norm.product?.includes('room')
|
|
151
|
+
&& norm.framework === 'web'
|
|
152
|
+
&& chunk.variant === 'core-sdk'
|
|
153
|
+
&& chunk.framework.includes('vue')
|
|
154
|
+
&& chunk.source.includes('knowledge/roomkit/core-sdk/vue/'));
|
|
155
|
+
if (!explicitMatch && !wildcardAllowed && !callCoreWebFallback && !liveWebVueFallback && !roomWebVueFallback)
|
|
148
156
|
return false;
|
|
149
157
|
}
|
|
150
158
|
if (norm.scenario && chunk.scenario && chunk.scenario !== norm.scenario) {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const SCHEMA_ROOT = path.resolve(__dirname, '../../resource/_schema');
|
|
6
|
+
const QUERY_NORMALIZATION_FILE = path.join(SCHEMA_ROOT, 'query-normalization.yaml');
|
|
7
|
+
const MAX_APPEND_TOKENS = 6;
|
|
8
|
+
let cachedConfig = null;
|
|
9
|
+
function unquote(input) {
|
|
10
|
+
return input.trim().replace(/^['"]|['"]$/g, '');
|
|
11
|
+
}
|
|
12
|
+
function loadQueryNormalizationConfig() {
|
|
13
|
+
if (cachedConfig)
|
|
14
|
+
return cachedConfig;
|
|
15
|
+
const config = { literal: {}, word: {} };
|
|
16
|
+
if (!fs.existsSync(QUERY_NORMALIZATION_FILE)) {
|
|
17
|
+
cachedConfig = config;
|
|
18
|
+
return config;
|
|
19
|
+
}
|
|
20
|
+
const text = fs.readFileSync(QUERY_NORMALIZATION_FILE, 'utf-8');
|
|
21
|
+
let currentSection = '';
|
|
22
|
+
for (const rawLine of text.split('\n')) {
|
|
23
|
+
const line = rawLine.trimEnd();
|
|
24
|
+
if (!line.trim() || line.trimStart().startsWith('#'))
|
|
25
|
+
continue;
|
|
26
|
+
const sectionMatch = line.match(/^(literal|word):\s*$/);
|
|
27
|
+
if (sectionMatch) {
|
|
28
|
+
currentSection = sectionMatch[1];
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const entryMatch = line.match(/^\s{2}([^:#]+):\s*\[(.*)\]\s*$/);
|
|
32
|
+
if (!entryMatch || !currentSection)
|
|
33
|
+
continue;
|
|
34
|
+
const key = unquote(entryMatch[1]);
|
|
35
|
+
const values = entryMatch[2]
|
|
36
|
+
.split(',')
|
|
37
|
+
.map((token) => unquote(token))
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
if (!key || !values.length)
|
|
40
|
+
continue;
|
|
41
|
+
config[currentSection][key] = values;
|
|
42
|
+
}
|
|
43
|
+
cachedConfig = config;
|
|
44
|
+
return config;
|
|
45
|
+
}
|
|
46
|
+
function escapeRegExp(value) {
|
|
47
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
48
|
+
}
|
|
49
|
+
export function normalizeQueryPrompt(prompt) {
|
|
50
|
+
const config = loadQueryNormalizationConfig();
|
|
51
|
+
const terms = new Set(prompt.split(/\s+/).filter(Boolean));
|
|
52
|
+
const promptLower = prompt.toLowerCase();
|
|
53
|
+
let appendedCount = 0;
|
|
54
|
+
const tryAppend = (tokens) => {
|
|
55
|
+
for (const token of tokens) {
|
|
56
|
+
if (appendedCount >= MAX_APPEND_TOKENS)
|
|
57
|
+
return;
|
|
58
|
+
if (!terms.has(token)) {
|
|
59
|
+
terms.add(token);
|
|
60
|
+
appendedCount += 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
for (const [needle, expansion] of Object.entries(config.literal)) {
|
|
65
|
+
if (!prompt.includes(needle))
|
|
66
|
+
continue;
|
|
67
|
+
tryAppend(expansion);
|
|
68
|
+
}
|
|
69
|
+
for (const [needle, expansion] of Object.entries(config.word)) {
|
|
70
|
+
const pattern = new RegExp(`\\b${escapeRegExp(needle.toLowerCase())}\\b`, 'i');
|
|
71
|
+
if (!pattern.test(promptLower))
|
|
72
|
+
continue;
|
|
73
|
+
tryAppend(expansion);
|
|
74
|
+
}
|
|
75
|
+
return [...terms].join(' ');
|
|
76
|
+
}
|
|
@@ -129,7 +129,16 @@ function hasBestPracticeFragment(fragments) {
|
|
|
129
129
|
}
|
|
130
130
|
function inferQueryApiTokens(prompt) {
|
|
131
131
|
const tokens = new Set();
|
|
132
|
-
|
|
132
|
+
// Keep API-shaped tokens only; exclude product/platform brand words to avoid false low-confidence downgrades.
|
|
133
|
+
const upperNoise = new Set([
|
|
134
|
+
'SDK', 'API', 'HTTP', 'HTTPS', 'JSON', 'CALL', 'NAME', 'STATUS',
|
|
135
|
+
'TRTC', 'TENCENT', 'WEB', 'VUE', 'REACT', 'ROOMKIT', 'LIVEKIT', 'CALLKIT',
|
|
136
|
+
]);
|
|
137
|
+
const platformNoise = new Set([
|
|
138
|
+
'ios', 'android', 'flutter', 'web', 'react', 'vue', 'miniprogram',
|
|
139
|
+
'harmonyos', 'react-native', 'unity', 'unreal', 'unreal-engine', 'donut', 'uni-app',
|
|
140
|
+
'pc', 'h5',
|
|
141
|
+
]);
|
|
133
142
|
for (const match of prompt.matchAll(/\b([a-z]+[A-Z][A-Za-z0-9_]*)\b/g)) {
|
|
134
143
|
tokens.add(match[1]);
|
|
135
144
|
}
|
|
@@ -150,7 +159,7 @@ function inferQueryApiTokens(prompt) {
|
|
|
150
159
|
if (!upperNoise.has(token))
|
|
151
160
|
tokens.add(token);
|
|
152
161
|
}
|
|
153
|
-
return [...tokens];
|
|
162
|
+
return [...tokens].filter((token) => !platformNoise.has(token.toLowerCase()));
|
|
154
163
|
}
|
|
155
164
|
function tokenInChunk(token, chunk) {
|
|
156
165
|
if (chunk.api_names?.some((name) => name.toLowerCase() === token.toLowerCase()))
|
|
@@ -171,6 +180,21 @@ function computeMissingApiTokens(tokens, candidates) {
|
|
|
171
180
|
return [];
|
|
172
181
|
return tokens.filter((token) => !candidates.some((chunk) => tokenInChunk(token, chunk)));
|
|
173
182
|
}
|
|
183
|
+
function hasProductScopeIntent(prompt) {
|
|
184
|
+
return /控制台|开通|开通服务|计费|套餐|价格|pricing|billing|plan|console|activate|activation|service/i.test(prompt);
|
|
185
|
+
}
|
|
186
|
+
function hasNativeTrtcApiSignal(prompt, queryApiTokens) {
|
|
187
|
+
if (/\bTRTCCloud\b|\bTRTCRenderParams\b|\bTXDeviceManager\b|setLocalRenderParams|startLocalPreview|stopLocalPreview/i.test(prompt)) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
return queryApiTokens.some((token) => /^(TRTC|TX)[A-Za-z0-9_]+$/.test(token)
|
|
191
|
+
|| /^(set|get|start|stop|enable|disable)[A-Z][A-Za-z0-9_]+$/.test(token));
|
|
192
|
+
}
|
|
193
|
+
function hasNativeClientFramework(frameworks) {
|
|
194
|
+
if (!frameworks?.length)
|
|
195
|
+
return false;
|
|
196
|
+
return frameworks.some((fw) => ['android', 'ios', 'flutter', 'c++'].includes(fw));
|
|
197
|
+
}
|
|
174
198
|
function applyRankMultipliers(ranked, chunksById, opts) {
|
|
175
199
|
const adjusted = ranked.map((item) => {
|
|
176
200
|
const chunk = chunksById.get(item.id);
|
|
@@ -193,7 +217,12 @@ function applyRankMultipliers(ranked, chunksById, opts) {
|
|
|
193
217
|
&& chunk.variant === 'core-sdk'
|
|
194
218
|
&& chunk.framework.includes('vue')
|
|
195
219
|
&& chunk.source.includes('/api-reference/'));
|
|
196
|
-
|
|
220
|
+
const roomWebVueFallback = Boolean(opts.product?.includes('room')
|
|
221
|
+
&& opts.framework === 'web'
|
|
222
|
+
&& chunk.variant === 'core-sdk'
|
|
223
|
+
&& chunk.framework.includes('vue')
|
|
224
|
+
&& chunk.source.includes('knowledge/roomkit/core-sdk/vue/'));
|
|
225
|
+
if (!explicitMatch && !callCoreWebFallback && !liveWebVueFallback && !roomWebVueFallback) {
|
|
197
226
|
multiplier *= 0.2;
|
|
198
227
|
}
|
|
199
228
|
}
|
|
@@ -360,7 +389,7 @@ export function searchKnowledge(params) {
|
|
|
360
389
|
};
|
|
361
390
|
};
|
|
362
391
|
let pass = runSearchPass(norm);
|
|
363
|
-
|
|
392
|
+
const retryReasons = [];
|
|
364
393
|
// B2: API token 覆盖不足时触发一次扩检(去掉 types 约束 + api/integration 轻提权)
|
|
365
394
|
const missingRatio = queryApiTokens.length > 0
|
|
366
395
|
? Number((pass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
|
|
@@ -374,9 +403,44 @@ export function searchKnowledge(params) {
|
|
|
374
403
|
|| retryMissingRatio < missingRatio
|
|
375
404
|
|| (pass.fragments.length === 0 && retryPass.fragments.length > 0)) {
|
|
376
405
|
pass = retryPass;
|
|
377
|
-
|
|
406
|
+
retryReasons.push(`api_gap_retry:coverage=${pass.apiNameCoverage},missing_ratio=${retryMissingRatio}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// B3: Mixed “integration + product-scope” questions should include product docs, not just feature/integration.
|
|
410
|
+
if (norm.types?.length && !norm.types.includes('product') && hasProductScopeIntent(norm.prompt)) {
|
|
411
|
+
const widenedTypes = [...new Set([...norm.types, 'product'])];
|
|
412
|
+
const retryPass = runSearchPass({ ...norm, types: widenedTypes });
|
|
413
|
+
const baseHasProduct = pass.fragments.some((f) => f.types.includes('product'));
|
|
414
|
+
const retryHasProduct = retryPass.fragments.some((f) => f.types.includes('product'));
|
|
415
|
+
if ((retryHasProduct && !baseHasProduct)
|
|
416
|
+
|| (pass.fragments.length === 0 && retryPass.fragments.length > 0)
|
|
417
|
+
|| (retryPass.fragments[0]?.score ?? 0) > (pass.fragments[0]?.score ?? 0) * 1.08) {
|
|
418
|
+
pass = retryPass;
|
|
419
|
+
retryReasons.push('product_scope_retry:types+=product');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// B4: If query looks like Native TRTC APIs but routed to live/room/call, auto-append native_trtc_sdk and retry.
|
|
423
|
+
const shouldRetryNativeProduct = hasNativeClientFramework(norm.frameworks)
|
|
424
|
+
&& hasNativeTrtcApiSignal(norm.prompt, queryApiTokens)
|
|
425
|
+
&& norm.product?.some((p) => ['live', 'room', 'call'].includes(p))
|
|
426
|
+
&& !norm.product?.includes('native_trtc_sdk')
|
|
427
|
+
&& queryApiTokens.length > 0
|
|
428
|
+
&& pass.apiNameCoverage < 0.5;
|
|
429
|
+
if (shouldRetryNativeProduct) {
|
|
430
|
+
const expandedProducts = [...new Set([...(norm.product ?? []), 'native_trtc_sdk'])];
|
|
431
|
+
const retryPass = runSearchPass({ ...norm, product: expandedProducts, types: undefined }, { apiRetry: true });
|
|
432
|
+
const retryMissingRatio = queryApiTokens.length > 0
|
|
433
|
+
? Number((retryPass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
|
|
434
|
+
: 0;
|
|
435
|
+
if (retryPass.apiNameCoverage > pass.apiNameCoverage
|
|
436
|
+
|| retryPass.exactHits.length > pass.exactHits.length
|
|
437
|
+
|| retryMissingRatio < missingRatio
|
|
438
|
+
|| (pass.fragments.length === 0 && retryPass.fragments.length > 0)) {
|
|
439
|
+
pass = retryPass;
|
|
440
|
+
retryReasons.push(`native_product_retry:products=${expandedProducts.join('+')},coverage=${retryPass.apiNameCoverage}`);
|
|
378
441
|
}
|
|
379
442
|
}
|
|
443
|
+
const retryReason = retryReasons.length ? retryReasons.join(';') : undefined;
|
|
380
444
|
const routeInconsistencyWarning = pass.fragments.length > 0
|
|
381
445
|
? pass.fragments.filter((f) => f.product === '*').length / pass.fragments.length > 0.3
|
|
382
446
|
: false;
|
|
@@ -386,6 +450,40 @@ export function searchKnowledge(params) {
|
|
|
386
450
|
const topScore = pass.fragments[0]?.score;
|
|
387
451
|
const secondScore = pass.fragments[1]?.score;
|
|
388
452
|
const answerContract = buildAnswerContract(status, confidence, { fabricationRisk });
|
|
453
|
+
const hasProductScope = hasProductScopeIntent(norm.prompt);
|
|
454
|
+
const hasNativeSignal = hasNativeTrtcApiSignal(norm.prompt, queryApiTokens);
|
|
455
|
+
const hasProductContent = pass.fragments.some((f) => f.types.includes('product') || /\/product\.md$/i.test(f.source));
|
|
456
|
+
const hasIntegrationContent = pass.fragments.some((f) => f.types.includes('integration') || /\/integration\.md$/i.test(f.source) || /\/preset\//i.test(f.source));
|
|
457
|
+
const hasApiQueryTokens = queryApiTokens.length > 0;
|
|
458
|
+
const apiGapDetected = hasApiQueryTokens && (pass.apiNameCoverage === 0 || missingRatio >= 0.3);
|
|
459
|
+
const retryApiGapApplied = retryReasons.some((r) => r.startsWith('api_gap_retry:'));
|
|
460
|
+
const retryProductScopeApplied = retryReasons.includes('product_scope_retry:types+=product');
|
|
461
|
+
const retryNativeProductApplied = retryReasons.some((r) => r.startsWith('native_product_retry:'));
|
|
462
|
+
const convergenceReached = status === 'success'
|
|
463
|
+
&& (confidence === 'high' || confidence === 'medium')
|
|
464
|
+
&& (!hasApiQueryTokens || pass.apiNameCoverage >= 0.5)
|
|
465
|
+
&& (!hasProductScope || hasProductContent || hasIntegrationContent);
|
|
466
|
+
const retryAdvice = (() => {
|
|
467
|
+
if (status === 'needs_framework') {
|
|
468
|
+
return { stop_retry: true, next_action: 'ask_framework', reason: 'missing_framework' };
|
|
469
|
+
}
|
|
470
|
+
if (convergenceReached) {
|
|
471
|
+
return { stop_retry: true, next_action: 'answer', reason: 'converged' };
|
|
472
|
+
}
|
|
473
|
+
if (hasApiQueryTokens && apiGapDetected && !retryApiGapApplied) {
|
|
474
|
+
return { stop_retry: false, next_action: 'retry_widen_types', reason: 'api_coverage_gap' };
|
|
475
|
+
}
|
|
476
|
+
if (hasProductScope && !hasProductContent && !retryProductScopeApplied) {
|
|
477
|
+
return { stop_retry: false, next_action: 'retry_add_product_scope', reason: 'missing_product_scope_content' };
|
|
478
|
+
}
|
|
479
|
+
if (hasNativeSignal && hasNativeClientFramework(norm.frameworks) && !retryNativeProductApplied) {
|
|
480
|
+
return { stop_retry: false, next_action: 'retry_add_native_trtc_sdk', reason: 'possible_native_product_misroute' };
|
|
481
|
+
}
|
|
482
|
+
if (status === 'empty' || confidence === 'low') {
|
|
483
|
+
return { stop_retry: false, next_action: 'retry_or_clarify', reason: 'insufficient_retrieval_signal' };
|
|
484
|
+
}
|
|
485
|
+
return { stop_retry: true, next_action: 'answer', reason: 'default_stop' };
|
|
486
|
+
})();
|
|
389
487
|
return {
|
|
390
488
|
status,
|
|
391
489
|
confidence,
|
|
@@ -408,6 +506,7 @@ export function searchKnowledge(params) {
|
|
|
408
506
|
api_name_coverage: pass.apiNameCoverage,
|
|
409
507
|
fabrication_risk: fabricationRisk,
|
|
410
508
|
route_inconsistency_warning: routeInconsistencyWarning,
|
|
509
|
+
retry_advice: retryAdvice,
|
|
411
510
|
},
|
|
412
511
|
fragments: pass.fragments,
|
|
413
512
|
};
|
package/package.json
CHANGED
|
@@ -8,3 +8,4 @@ live:
|
|
|
8
8
|
room:
|
|
9
9
|
screen-share.md: ["screen sharing", "screen share", "startScreenShare"]
|
|
10
10
|
virtual-background.md: ["virtual background"]
|
|
11
|
+
device-state.md: ["conference", "meeting", "turn on camera", "camera", "backend support", "server support", "会议", "开摄像头", "后端支持", "服务端支持"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
literal:
|
|
2
|
+
摄影头: ["摄像头"]
|
|
3
|
+
会议: ["roomkit", "conference"]
|
|
4
|
+
会议室: ["roomkit", "conference"]
|
|
5
|
+
word:
|
|
6
|
+
conference: ["meeting", "roomkit", "conference"]
|
|
7
|
+
meeting: ["meeting", "roomkit", "conference"]
|
|
8
|
+
room: ["meeting", "roomkit", "conference"]
|
|
9
|
+
roomkit: ["meeting", "roomkit", "conference"]
|