feat(admin): LLM config, knowledge base, and WeCom AI binding
CI / verify (pull_request) Has been cancelled

Add owner-scoped model API settings, uploadable knowledge bases, and WeCom bot AI/KB wiring with OpenAI-compatible URL normalization.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-26 09:31:22 +08:00
parent 745c192693
commit 2b7ef65cce
30 changed files with 2507 additions and 56 deletions
@@ -95,6 +95,13 @@ export class WecomBotActionsService {
'',
);
}
if (bot.aiEnabled && bot.llmConfigId) {
lines.push(
'**智能问答**',
'未匹配指令的自然语言将交由绑定的语言模型回答(可挂知识库)',
'',
);
}
lines.push(`当前权限:${bot.permissions.join(', ') || '无'}`);
return lines.join('\n');
}
@@ -103,7 +110,8 @@ export class WecomBotActionsService {
bot: WecomBotRuntimeConfig,
wecomUserId: string,
text: string,
): Promise<string> {
opts?: { skipNaturalFallback?: boolean },
): Promise<string | null> {
const content = text.trim();
if (!content) return this.buildHelp(bot);
@@ -152,14 +160,19 @@ export class WecomBotActionsService {
return this.queryHandbook(q);
}
// 自然语言手册(仅团队助手有 handbook 权限时)
if (wecomBotHasPermission(bot, 'handbook.query') && content.length >= 2) {
// 自然语言手册(仅团队助手有 handbook 权限时;开启 AI 时改由模型+知识库回答
if (
!opts?.skipNaturalFallback &&
wecomBotHasPermission(bot, 'handbook.query') &&
content.length >= 2
) {
const hit = searchHandbook(content, 1);
if (hit.length) {
return formatHandbook(hit);
}
}
if (opts?.skipNaturalFallback) return null;
return `未识别指令。\n\n${this.buildHelp(bot)}`;
}