@tencentcloud/sdk-mcp 1.6.8 → 1.7.0
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/CHANGELOG.md +25 -0
- package/README.md +54 -35
- package/knowledge/build-index.js +28 -4
- package/knowledge/chunker.js +82 -14
- package/knowledge/chunking-policy.js +100 -0
- package/knowledge/frontmatter-meta.js +167 -0
- package/knowledge/path-meta.js +28 -6
- package/knowledge/search/exact-lookup.js +26 -123
- package/knowledge/search/filter-pool.js +12 -29
- package/knowledge/search/framework-fallback.js +22 -0
- package/knowledge/search/intent-router.js +13 -0
- package/knowledge/search/query-normalizer.js +56 -3
- package/knowledge/search/search-core.js +391 -0
- package/knowledge/search/search-knowledge.js +290 -361
- package/knowledge/search/search-message.js +87 -0
- package/knowledge/search/search-pass.js +428 -0
- package/knowledge/search/search-types.js +1 -0
- package/knowledge/search/url-row-scorer.js +258 -0
- package/package.json +1 -1
- package/resource/index/manifest.json +1 -1
- package/resource/integration/callkit/preset/ios/integration.md +1 -0
- package/resource/integration/chat/preset/flutter/integration.md +1 -0
- package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +11 -9
- package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +11 -11
- package/resource/knowledge/callkit/best-practice/callkit-miniprogram/uniapp-shrink.md +64 -0
- package/resource/knowledge/callkit/best-practice/common/call-autoplay-blocked.md +81 -0
- package/resource/knowledge/callkit/best-practice/common/call-message-in-chat.md +84 -0
- package/resource/knowledge/callkit/best-practice/common/call-vs-calls.md +114 -0
- package/resource/knowledge/callkit/best-practice/common/callengine-call-flow.md +128 -0
- package/resource/knowledge/callkit/best-practice/common/callengine-log-level.md +72 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-get-engine-instance.md +87 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-get-roomid.md +83 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-limitations.md +37 -0
- package/resource/knowledge/callkit/best-practice/common/callkit-user-register-and-kicked.md +103 -0
- package/resource/knowledge/callkit/preset/react/api.md +1 -150
- package/resource/knowledge/callkit/preset/vue/api.md +1 -38
- package/resource/knowledge/chat/best-practice/common/avchatroom-message-loss-diagnosis.md +71 -0
- package/resource/knowledge/chat/best-practice/common/group-conversation-cleanup-on-system-notice.md +67 -0
- package/resource/knowledge/chat/best-practice/common/image-message-url-lifecycle.md +63 -0
- package/resource/knowledge/chat/best-practice/common/login-repeat-2025-diagnosis.md +65 -0
- package/resource/knowledge/chat/best-practice/common/message-read-report-and-receipt.md +72 -0
- package/resource/knowledge/chat/best-practice/common/message-receive-event.md +70 -0
- package/resource/knowledge/chat/best-practice/common/message-risk-error-and-render.md +69 -0
- package/resource/knowledge/chat/best-practice/common/message-unread-count.md +71 -0
- package/resource/knowledge/chat/best-practice/miniprogram/audio-message-send.md +118 -0
- package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +67 -0
- package/resource/knowledge/chat/best-practice/miniprogram/media-upload-fail-diagnosis.md +68 -0
- package/resource/knowledge/chat/best-practice/web/audio-message-send.md +123 -0
- package/resource/knowledge/chat/preset/android/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/android/features/language.md +1 -0
- package/resource/knowledge/chat/preset/android/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/android/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/flutter/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/conversation-list.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/message-input.md +1 -0
- package/resource/knowledge/chat/preset/ios/features/message-list.md +1 -0
- package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -0
- package/resource/knowledge/chat/urls/sdk/web.md +1 -1
- package/resource/knowledge/livekit/best-practice/android/voice-room-anchor-start.md +124 -0
- package/resource/knowledge/livekit/best-practice/common/admin-take-seat.md +73 -0
- package/resource/knowledge/livekit/best-practice/common/audience-leave-live.md +81 -0
- package/resource/knowledge/livekit/best-practice/common/voice-room-no-audio-troubleshoot.md +100 -0
- package/resource/knowledge/livekit/best-practice/common/voice-room-seat-list-change.md +65 -0
- package/resource/knowledge/livekit/best-practice/flutter/voice-room-anchor-start.md +126 -0
- package/resource/knowledge/livekit/best-practice/ios/voice-room-anchor-start.md +130 -0
- package/resource/knowledge/push/config/react-native.md +1 -0
- package/resource/knowledge/push/config/unity.md +1 -0
- package/resource/knowledge/push/config/unreal-engine.md +1 -0
- package/resource/knowledge/push/integration/android.md +16 -16
- package/resource/knowledge/push/integration/flutter.md +3 -3
- package/resource/knowledge/push/integration/ios.md +3 -3
- package/resource/knowledge/push/integration/react-native.md +1 -1
- package/resource/knowledge/roomkit/best-practice/common/room-ghost-member.md +75 -0
- package/resource/knowledge/roomkit/best-practice/common/room-limit-and-multi.md +88 -0
- package/resource/knowledge/roomkit/best-practice/common/room-screen-share-preview.md +87 -0
- package/resource/knowledge/roomkit/best-practice/common/room-status-after-all-leave.md +73 -0
- package/resource/knowledge/roomkit/best-practice/vue/room-uikit-vs-atomicx.md +115 -0
- package/resource/knowledge/rtcengine/web/plugin/30-advanced-cross-room-link.md +2 -0
- package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +2 -0
- package/server.js +8 -3
- package/tools/common/finalize_answer.js +9 -1
- package/tools/common/search_trtc_knowledge.js +1 -1
- package/tools/definitions/finalize_answer_def.js +2 -2
- package/tools/definitions/integration-boundary.js +2 -1
- package/tools/definitions/search_trtc_knowledge_def.js +1 -1
- package/utils/report-cls-client.js +1 -1
- package/utils/report-es-client.js +1 -1
- package/cursor-setting.png +0 -0
- package/mcp-server-prompt.png +0 -0
- package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +0 -80
- package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +0 -20
- package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +0 -116
- package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +0 -469
- package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +0 -581
- package/resource/knowledge/callkit/preset/web/api.md +0 -79
- package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +0 -16
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
const E7_EN_STOPWORDS = new Set([
|
|
2
|
+
'the', 'and', 'for', 'with', 'from', 'into', 'about', 'using', 'via',
|
|
3
|
+
'how', 'what', 'where', 'when', 'which', 'please', 'docs', 'documentation',
|
|
4
|
+
'tencent', 'im', 'rest', 'server', 'webhook', 'webhooks',
|
|
5
|
+
]);
|
|
6
|
+
/** Generic terms — excluded from API-token hits to avoid false positives */
|
|
7
|
+
const E7_GENERIC_TERMS = new Set([
|
|
8
|
+
'message', 'messages', 'group', 'groups', 'user', 'users', 'account', 'accounts',
|
|
9
|
+
'send', 'get', 'set', 'delete', 'create', 'update', 'query', 'before', 'after',
|
|
10
|
+
'webhook', 'friend', 'single', 'multiple', 'history', 'chat', 'sdk', 'api',
|
|
11
|
+
'profile', 'conversation', 'import', 'recall', 'modify', 'pull', 'mark', 'data',
|
|
12
|
+
'list', 'online', 'status', 'custom', 'attributes', 'counter', 'member', 'members',
|
|
13
|
+
'management', 'overview', 'integration', 'initialization', 'billing', 'topic',
|
|
14
|
+
'topics', 'community', 'robot', 'chatbot', 'streaming', 'broadcast', 'official',
|
|
15
|
+
'extension', 'receipt', 'receipts', 'global', 'mute', 'ban', 'unban', 'forbid',
|
|
16
|
+
'ordinary', 'specified', 'historical', 'unread', 'read', 'configure', 'configuration', 'invalidate',
|
|
17
|
+
'invalidating', 'disband', 'change', 'search', 'cloud', 'local', 'robot', 'bots',
|
|
18
|
+
]);
|
|
19
|
+
const E7_QUERY_NOISE = /\b(rest\s*ful?\s*api|rest\s*api|server\s*api|webhook|webhooks|how\s+to|how\s+do\s+i|what\s+is|where\s+is|please|documentation|docs?)\b/gi;
|
|
20
|
+
const E7_QUERY_NOISE_CN = /怎么|如何|什么|用哪个|查询|服务端/g;
|
|
21
|
+
const E7_PHRASES = [
|
|
22
|
+
'before send one-to-one message',
|
|
23
|
+
'after send one-to-one message',
|
|
24
|
+
'one-to-one message',
|
|
25
|
+
'group message',
|
|
26
|
+
'recall group message',
|
|
27
|
+
'recall one-to-one message',
|
|
28
|
+
'send one-to-one message',
|
|
29
|
+
'send single chat message',
|
|
30
|
+
'getmessagelist',
|
|
31
|
+
'message history',
|
|
32
|
+
'add friend',
|
|
33
|
+
'import single account',
|
|
34
|
+
'import a single account',
|
|
35
|
+
'multi-device login',
|
|
36
|
+
'multi device login',
|
|
37
|
+
'login policy',
|
|
38
|
+
'login strategy',
|
|
39
|
+
'message storage duration',
|
|
40
|
+
'roaming message storage',
|
|
41
|
+
];
|
|
42
|
+
function extractRestEndpoints(text) {
|
|
43
|
+
return [...text.matchAll(/v4\/[\w/]+/gi)].map((m) => m[0].toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
function extractE7ApiTokens(text) {
|
|
46
|
+
const tokens = new Set();
|
|
47
|
+
for (const match of text.matchAll(/\b([a-z][a-z0-9_]{2,})\b/gi)) {
|
|
48
|
+
const token = match[1].toLowerCase();
|
|
49
|
+
if (!E7_GENERIC_TERMS.has(token) && !E7_EN_STOPWORDS.has(token))
|
|
50
|
+
tokens.add(token);
|
|
51
|
+
}
|
|
52
|
+
for (const match of text.matchAll(/\b([A-Z][A-Za-z0-9]*(?:\.[A-Za-z]\w*)?)\b/g)) {
|
|
53
|
+
const token = match[1].toLowerCase();
|
|
54
|
+
if (!E7_GENERIC_TERMS.has(token))
|
|
55
|
+
tokens.add(token);
|
|
56
|
+
}
|
|
57
|
+
for (const match of text.matchAll(/([a-z]+[A-Z][A-Za-z0-9]*)/g)) {
|
|
58
|
+
tokens.add(match[1].toLowerCase());
|
|
59
|
+
}
|
|
60
|
+
return [...tokens];
|
|
61
|
+
}
|
|
62
|
+
function normalizeE7Text(text) {
|
|
63
|
+
return text
|
|
64
|
+
.toLowerCase()
|
|
65
|
+
.replace(E7_QUERY_NOISE, ' ')
|
|
66
|
+
.replace(E7_QUERY_NOISE_CN, '')
|
|
67
|
+
.replace(/[^\w\u4e00-\u9fff/]+/g, ' ')
|
|
68
|
+
.replace(/\s+/g, ' ')
|
|
69
|
+
.trim();
|
|
70
|
+
}
|
|
71
|
+
function splitPromptIntoClauses(prompt) {
|
|
72
|
+
const raw = prompt
|
|
73
|
+
.replace(/rest\s*api|服务端|server\s*api|api|怎么|如何|什么|用哪个|查询/g, '')
|
|
74
|
+
.replace(/\s+/g, ' ')
|
|
75
|
+
.trim();
|
|
76
|
+
const parts = raw.split(/[、,,;;、\s]+/).filter((p) => p.length >= 2);
|
|
77
|
+
return parts.length > 0 ? parts : [raw];
|
|
78
|
+
}
|
|
79
|
+
function phraseBonus(query, title) {
|
|
80
|
+
const q = query.toLowerCase().replace(/\s+/g, ' ');
|
|
81
|
+
const t = title.toLowerCase();
|
|
82
|
+
let bonus = 0;
|
|
83
|
+
for (const phrase of E7_PHRASES) {
|
|
84
|
+
if (q.includes(phrase) && t.includes(phrase))
|
|
85
|
+
bonus += 180;
|
|
86
|
+
}
|
|
87
|
+
if (/send single chat message/.test(q) && /send one-to-one message/.test(t))
|
|
88
|
+
bonus += 200;
|
|
89
|
+
if (/recall group message/.test(q) && /recall group message/.test(t))
|
|
90
|
+
bonus += 200;
|
|
91
|
+
if (/before send one-to-one message/.test(q) && /before send one-to-one message/.test(t))
|
|
92
|
+
bonus += 220;
|
|
93
|
+
if (/\bbefore\b/.test(q) && t.startsWith('before '))
|
|
94
|
+
bonus += 120;
|
|
95
|
+
if (/\bafter\b/.test(q) && t.startsWith('after '))
|
|
96
|
+
bonus += 120;
|
|
97
|
+
if (/多端登录/.test(query) && /多端登录|multi[\s-]?device/i.test(title))
|
|
98
|
+
bonus += 220;
|
|
99
|
+
if (/登录策略|login\s*(policy|strategy)/i.test(query) && /登录策略|login\s*(policy|strategy)/i.test(title))
|
|
100
|
+
bonus += 200;
|
|
101
|
+
return bonus;
|
|
102
|
+
}
|
|
103
|
+
function scoreEnglishStyle(query, title) {
|
|
104
|
+
const queryEndpoints = extractRestEndpoints(query);
|
|
105
|
+
const titleEndpoints = extractRestEndpoints(title);
|
|
106
|
+
for (const qe of queryEndpoints) {
|
|
107
|
+
if (titleEndpoints.some((te) => te === qe || te.endsWith(qe) || qe.endsWith(te))) {
|
|
108
|
+
return 1000;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
let score = phraseBonus(query, title);
|
|
112
|
+
const titleLower = title.toLowerCase();
|
|
113
|
+
const queryApis = extractE7ApiTokens(query);
|
|
114
|
+
let apiHits = 0;
|
|
115
|
+
let longApiHit = false;
|
|
116
|
+
for (const api of queryApis) {
|
|
117
|
+
if (!titleLower.includes(api))
|
|
118
|
+
continue;
|
|
119
|
+
apiHits += 1;
|
|
120
|
+
if (api.length >= 8)
|
|
121
|
+
longApiHit = true;
|
|
122
|
+
}
|
|
123
|
+
if (longApiHit)
|
|
124
|
+
score = Math.max(score, 940);
|
|
125
|
+
else if (apiHits >= 2)
|
|
126
|
+
score = Math.max(score, 900);
|
|
127
|
+
else if (apiHits === 1)
|
|
128
|
+
score = Math.max(score, 860);
|
|
129
|
+
const qNorm = normalizeE7Text(query);
|
|
130
|
+
const tNorm = normalizeE7Text(title);
|
|
131
|
+
const qTokens = qNorm.split(' ').filter((t) => t.length >= 3 && !E7_GENERIC_TERMS.has(t));
|
|
132
|
+
const tTokens = tNorm.split(' ').filter((t) => t.length >= 3 && !E7_GENERIC_TERMS.has(t));
|
|
133
|
+
let overlap = 0;
|
|
134
|
+
for (const qt of qTokens) {
|
|
135
|
+
if (tTokens.some((tt) => tt.includes(qt) || qt.includes(tt)))
|
|
136
|
+
overlap += 1;
|
|
137
|
+
}
|
|
138
|
+
if (overlap >= 3)
|
|
139
|
+
score = Math.max(score, 720 + overlap * 15);
|
|
140
|
+
else if (overlap >= 2)
|
|
141
|
+
score = Math.max(score, 650);
|
|
142
|
+
else if (overlap >= 1)
|
|
143
|
+
score = Math.max(score, 520);
|
|
144
|
+
const qCompact = qNorm.replace(/\s+/g, '');
|
|
145
|
+
const tCompact = tNorm.replace(/\s+/g, '');
|
|
146
|
+
if (qCompact.length >= 5 && tCompact.includes(qCompact)) {
|
|
147
|
+
score = Math.max(score, 560 - Math.min(tCompact.length - qCompact.length, 80));
|
|
148
|
+
}
|
|
149
|
+
else if (tCompact.length >= 5 && qCompact.includes(tCompact)) {
|
|
150
|
+
score = Math.max(score, 500 + Math.min(tCompact.length, 30));
|
|
151
|
+
}
|
|
152
|
+
const qCjk = query.replace(/[^\u4e00-\u9fff]/g, '');
|
|
153
|
+
const tCjk = title.replace(/[^\u4e00-\u9fff]/g, '');
|
|
154
|
+
if (qCjk.length >= 2 && tCjk.includes(qCjk)) {
|
|
155
|
+
let cjkScore = 500;
|
|
156
|
+
if (/批量|群组|群流|广播|导入|公众号|已读|回执/.test(tCjk) && !/批量|群组|群|已读|回执/.test(qCjk)) {
|
|
157
|
+
cjkScore -= 250;
|
|
158
|
+
}
|
|
159
|
+
if (/^单发/.test(tCjk) && /发送|单聊/.test(qCjk))
|
|
160
|
+
cjkScore += 120;
|
|
161
|
+
score = Math.max(score, cjkScore);
|
|
162
|
+
}
|
|
163
|
+
if (score <= 0)
|
|
164
|
+
return 0;
|
|
165
|
+
const queryL = query.toLowerCase();
|
|
166
|
+
const titleL = title.toLowerCase();
|
|
167
|
+
if (/group/.test(queryL) && /one-to-one|c2c/.test(titleL) && !/group/.test(titleL))
|
|
168
|
+
score -= 400;
|
|
169
|
+
if (/one-to-one|c2c|single chat/.test(queryL) && /import.*account|add friend/.test(titleL))
|
|
170
|
+
score -= 400;
|
|
171
|
+
if (/send.*message|one-to-one message/.test(queryL) && /add friend|import.*account/.test(titleL))
|
|
172
|
+
score -= 400;
|
|
173
|
+
if (/getmessagelist|message history/.test(qCompact) && /integration|initialization/.test(titleL) && !/getmessagelist|history/.test(tCompact))
|
|
174
|
+
score -= 400;
|
|
175
|
+
if (/extension/.test(titleL) && !/extension/.test(queryL))
|
|
176
|
+
score -= 350;
|
|
177
|
+
if (/\bbefore\b/.test(queryL) && !/^before\b/.test(titleL.trim()))
|
|
178
|
+
score -= 250;
|
|
179
|
+
if (/\bafter\b/.test(queryL) && !/^after\b/.test(titleL.trim()))
|
|
180
|
+
score -= 250;
|
|
181
|
+
if (/batch|multiple/.test(titleL) && !/batch|multiple/.test(queryL))
|
|
182
|
+
score -= 200;
|
|
183
|
+
if (/group/.test(titleL) && !/group|channel/.test(queryL) && /one-to-one|c2c|single chat/.test(queryL))
|
|
184
|
+
score -= 200;
|
|
185
|
+
return Math.max(score, 0);
|
|
186
|
+
}
|
|
187
|
+
function scoreChineseClauseStyle(query, title) {
|
|
188
|
+
const clauses = splitPromptIntoClauses(query.toLowerCase());
|
|
189
|
+
const titleNorm = title.toLowerCase().replace(/\s+/g, '');
|
|
190
|
+
if (!titleNorm)
|
|
191
|
+
return 0;
|
|
192
|
+
let bestScore = 0;
|
|
193
|
+
const allParts = [...clauses, query.toLowerCase().replace(/\s+/g, '')];
|
|
194
|
+
const titleTokens = titleNorm.split(/[\/(((、,,\s]+/).filter(Boolean);
|
|
195
|
+
const seen = new Set();
|
|
196
|
+
for (const part of allParts) {
|
|
197
|
+
const pn = part.replace(/\s+/g, '');
|
|
198
|
+
if (pn.length < 2 || seen.has(pn))
|
|
199
|
+
continue;
|
|
200
|
+
seen.add(pn);
|
|
201
|
+
let s = 0;
|
|
202
|
+
if (pn === titleNorm) {
|
|
203
|
+
s = 1000;
|
|
204
|
+
}
|
|
205
|
+
else if (titleNorm.includes(pn)) {
|
|
206
|
+
const trailing = titleNorm.slice(titleNorm.indexOf(pn) + pn.length);
|
|
207
|
+
s = 800 - trailing.length * 80;
|
|
208
|
+
}
|
|
209
|
+
else if (pn.includes(titleNorm)) {
|
|
210
|
+
s = 700 + titleNorm.length;
|
|
211
|
+
}
|
|
212
|
+
else if (titleTokens.some((token) => pn.includes(token) || token.includes(pn))) {
|
|
213
|
+
s = 600;
|
|
214
|
+
}
|
|
215
|
+
if (s > bestScore)
|
|
216
|
+
bestScore = s;
|
|
217
|
+
}
|
|
218
|
+
if (bestScore <= 0 && clauses.length > 0) {
|
|
219
|
+
const qn = clauses[0].replace(/发送/g, '发');
|
|
220
|
+
if (qn.length >= 3 && titleNorm.includes(qn)) {
|
|
221
|
+
bestScore = 500;
|
|
222
|
+
if (/批量|群组|群流|广播|导入|公众号|已读|回执/.test(titleNorm)
|
|
223
|
+
&& !/批量|群组|群|已读|回执/.test(clauses[0])) {
|
|
224
|
+
bestScore -= 250;
|
|
225
|
+
}
|
|
226
|
+
if (/^单发/.test(titleNorm) && /发送|单聊/.test(clauses[0])) {
|
|
227
|
+
bestScore += 120;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return Math.max(bestScore, 0);
|
|
232
|
+
}
|
|
233
|
+
export function normalizeUrlRowQuery(query) {
|
|
234
|
+
return normalizeE7Text(query);
|
|
235
|
+
}
|
|
236
|
+
export function scoreUrlRow(query, title) {
|
|
237
|
+
const enScore = scoreEnglishStyle(query, title);
|
|
238
|
+
const zhScore = scoreChineseClauseStyle(query, title);
|
|
239
|
+
if (enScore <= 0 && zhScore <= 0) {
|
|
240
|
+
return {
|
|
241
|
+
score: 0,
|
|
242
|
+
matchedBy: 'none',
|
|
243
|
+
debug: { enScore, zhScore },
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
if (zhScore > enScore) {
|
|
247
|
+
return {
|
|
248
|
+
score: zhScore,
|
|
249
|
+
matchedBy: 'zh',
|
|
250
|
+
debug: { enScore, zhScore },
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
score: enScore,
|
|
255
|
+
matchedBy: 'en',
|
|
256
|
+
debug: { enScore, zhScore },
|
|
257
|
+
};
|
|
258
|
+
}
|