fix: harden knowledge lifecycle rollout

This commit is contained in:
key
2026-08-03 16:00:45 +08:00
parent df77998e0c
commit 99e8c509d5
18 changed files with 709 additions and 156 deletions
+4
View File
@@ -251,6 +251,7 @@ export type DeletionImpact = {
learningTasks: number;
broadcasts: number;
generations: number;
activeGenerationMemberships: number;
canRequestPurge: boolean;
blockers: string[];
};
@@ -296,6 +297,9 @@ export type GenerationBuild = {
expectedVersions: number;
includedVersions: number;
outstandingJobs: number;
embeddingModel?: string;
embeddingDimension?: number;
manifestSha256?: string;
};
export type ActivationGate = {
+25 -2
View File
@@ -936,6 +936,12 @@
:type="deletionImpact.canRequestPurge ? 'warning' : 'info'"
:closable="false"
/>
<el-alert
v-if="deletionImpact?.activeGenerationMemberships"
title="当前活动向量代次仍包含此资料。请先构建并启用不含该资料的新代次,再申请物理清理。"
type="error"
:closable="false"
/>
<el-button
v-if="selectedQualityAsset.lifecycleStatus === 'DEPRECATED' && deletionImpact?.canRequestPurge"
type="danger"
@@ -1148,6 +1154,18 @@
<el-button :loading="rolloutAssisting" @click="buildCandidateGeneration">构建候选代次</el-button>
<el-button :loading="rolloutAssisting" @click="refreshCandidateGeneration">刷新构建状态</el-button>
</div>
<el-alert
v-if="candidateBuild"
:title="`候选 G${candidateBuild.generation}:${candidateBuild.status},已纳入 ${candidateBuild.includedVersions}/${candidateBuild.expectedVersions}`"
:description="
candidateBuild.embeddingModel
? `嵌入模型 ${candidateBuild.embeddingModel},维度 ${candidateBuild.embeddingDimension || '-'},待处理 ${candidateBuild.outstandingJobs}`
: `嵌入清单尚未生成,待处理 ${candidateBuild.outstandingJobs}`
"
:type="candidateBuild.status === 'READY' ? 'success' : candidateBuild.status === 'FAILED' ? 'error' : 'info'"
:closable="false"
show-icon
/>
<el-form label-position="top">
<el-form-item label="影子验证问题">
<el-input v-model="rolloutQuery" maxlength="1000" placeholder="输入一条真实业务问题进行旧链路与治理链路对照" />
@@ -1285,6 +1303,7 @@ import {
type DeletionImpact,
type PurgeRequest,
type MigrationRun,
type GenerationBuild,
type ActivationGate,
type KnowledgeGlossaryTerm,
type KnowledgeRolloutMode,
@@ -1337,6 +1356,7 @@ const rolloutTransitioningId = ref<number | null>(null);
const rolloutScopes = ref<KnowledgeRolloutScope[]>([]);
const rolloutDialogVisible = ref(false);
const selectedRolloutScope = ref<KnowledgeRolloutScope | null>(null);
const candidateBuild = ref<GenerationBuild | null>(null);
const rolloutGate = ref<ActivationGate | null>(null);
const rolloutQuery = ref('');
const rolloutAssisting = ref(false);
@@ -1870,9 +1890,11 @@ async function executePurge(request: PurgeRequest) {
function openRolloutAssistant(scope: KnowledgeRolloutScope) {
selectedRolloutScope.value = scope;
candidateBuild.value = null;
rolloutGate.value = null;
rolloutQuery.value = '';
rolloutDialogVisible.value = true;
if (scope.candidateGeneration) void refreshCandidateGeneration();
}
async function buildCandidateGeneration() {
@@ -1880,7 +1902,7 @@ async function buildCandidateGeneration() {
if (!scope) return;
rolloutAssisting.value = true;
try {
await startGenerationBuild(scope.knowledgeId, '管理端启动候选代次全量构建');
candidateBuild.value = (await startGenerationBuild(scope.knowledgeId, '管理端启动候选代次全量构建')).data;
await loadRolloutScopes();
selectedRolloutScope.value = rolloutScopes.value.find((item) => item.knowledgeId === scope.knowledgeId) || scope;
ElMessage.success('候选代次已排队构建');
@@ -1897,6 +1919,7 @@ async function refreshCandidateGeneration() {
rolloutAssisting.value = true;
try {
const result = (await refreshGenerationBuild(scope.knowledgeId)).data;
candidateBuild.value = result;
ElMessage.info(`候选 G${result.generation}:${result.status},已纳入 ${result.includedVersions}/${result.expectedVersions}`);
} catch {
ElMessage.error('候选代次状态刷新失败');
@@ -1914,7 +1937,7 @@ async function runShadowComparison() {
rolloutQuery.value = '';
ElMessage.success('影子对照样本已记录,不影响当前在线结果');
} catch {
ElMessage.error('影子对照失败,请确认候选代次已创建');
ElMessage.error('影子对照失败,请确认候选代次已就绪且向量服务可用');
} finally {
rolloutAssisting.value = false;
}