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
+80 -12
View File
@@ -352,24 +352,92 @@ model SystemConfig {
/// 企业微信智能机器人(HQ 可创建多实例,长连接)
model WecomBot {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
name String @db.VarChar(64)
role String @db.VarChar(32)
botId String @unique @map("bot_id") @db.VarChar(128)
secret String @db.VarChar(256)
avatarUrl String? @map("avatar_url") @db.VarChar(512)
welcome String? @db.VarChar(1024)
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
name String @db.VarChar(64)
role String @db.VarChar(32)
botId String @unique @map("bot_id") @db.VarChar(128)
secret String @db.VarChar(256)
avatarUrl String? @map("avatar_url") @db.VarChar(512)
welcome String? @db.VarChar(1024)
/// JSON 字符串数组,如 ["ticket.create","user.view_sms"]
permissions String @db.Text
enabled Boolean @default(true)
sortOrder Int @default(0) @map("sort_order")
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
permissions String @db.Text
/// 未匹配指令时是否调用语言模型
aiEnabled Boolean @default(false) @map("ai_enabled")
llmConfigId BigInt? @map("llm_config_id") @db.UnsignedBigInt
knowledgeBaseId BigInt? @map("knowledge_base_id") @db.UnsignedBigInt
enabled Boolean @default(true)
sortOrder Int @default(0) @map("sort_order")
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
llmConfig LlmApiConfig? @relation(fields: [llmConfigId], references: [id], onDelete: SetNull)
knowledgeBase KnowledgeBase? @relation(fields: [knowledgeBaseId], references: [id], onDelete: SetNull)
@@index([enabled, sortOrder])
@@index([llmConfigId])
@@index([knowledgeBaseId])
@@map("wecom_bot")
}
/// HQ 语言模型 API 配置(非超管仅可见/可开关自己创建的)
model LlmApiConfig {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
name String @db.VarChar(64)
provider String @db.VarChar(32)
baseUrl String @map("base_url") @db.VarChar(512)
apiKey String @map("api_key") @db.VarChar(512)
modelName String @map("model_name") @db.VarChar(128)
temperature Decimal? @db.Decimal(3, 2)
maxTokens Int? @map("max_tokens")
systemPrompt String? @map("system_prompt") @db.Text
enabled Boolean @default(true)
createdByHqAccountId BigInt @map("created_by_hq_account_id") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
wecomBots WecomBot[]
@@index([createdByHqAccountId, enabled])
@@map("llm_api_config")
}
/// HQ 知识库
model KnowledgeBase {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
name String @db.VarChar(128)
description String? @db.VarChar(512)
enabled Boolean @default(true)
createdByHqAccountId BigInt @map("created_by_hq_account_id") @db.UnsignedBigInt
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
documents KnowledgeDocument[]
wecomBots WecomBot[]
@@index([createdByHqAccountId, enabled])
@@map("knowledge_base")
}
model KnowledgeDocument {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
knowledgeBaseId BigInt @map("knowledge_base_id") @db.UnsignedBigInt
title String @db.VarChar(256)
fileName String? @map("file_name") @db.VarChar(256)
fileUrl String? @map("file_url") @db.VarChar(1024)
mimeType String? @map("mime_type") @db.VarChar(128)
sizeBytes Int? @map("size_bytes")
contentText String? @map("content_text") @db.LongText
status String @default("READY") @db.VarChar(16)
errorMessage String? @map("error_message") @db.VarChar(512)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
knowledgeBase KnowledgeBase @relation(fields: [knowledgeBaseId], references: [id], onDelete: Cascade)
@@index([knowledgeBaseId])
@@map("knowledge_document")
}
model MockSmsCode {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
phone String @db.VarChar(20)