diff --git a/web/src/pages/dataset/compilation/llm-wiki-view.tsx b/web/src/pages/dataset/compilation/llm-wiki-view.tsx index b8f56289c90..d9ce278fe0b 100644 --- a/web/src/pages/dataset/compilation/llm-wiki-view.tsx +++ b/web/src/pages/dataset/compilation/llm-wiki-view.tsx @@ -25,6 +25,7 @@ import CompilationEmptyState from './empty-state'; import { useCompilationArtifact } from './hooks/use-compilation-artifact'; import { useRunEndEffect } from './hooks/use-run-end-effect'; import { CompilationLoadingCard } from './loading-card'; +import { canGenerateWiki } from './wiki-generation-eligibility'; import { WikiDetailContent } from './wiki-detail-content'; import { WikiLeftPanel } from './wiki-left-panel'; @@ -63,7 +64,7 @@ export function LlmWikiView() { setLeftTab(value as LeftPanelTab); }, []); - const canGenerate = (knowledgeBase?.chunk_count ?? 0) > 0; + const canGenerate = canGenerateWiki(knowledgeBase); const isLoading = topicListLoading && topics.length === 0; const isEmpty = topics.length === 0 && !topicListLoading; diff --git a/web/src/pages/dataset/compilation/wiki-generation-eligibility.test.ts b/web/src/pages/dataset/compilation/wiki-generation-eligibility.test.ts new file mode 100644 index 00000000000..503b9d1144e --- /dev/null +++ b/web/src/pages/dataset/compilation/wiki-generation-eligibility.test.ts @@ -0,0 +1,71 @@ +import { IDataset } from '@/interfaces/database/dataset'; + +import { canGenerateWiki } from './wiki-generation-eligibility'; + +function dataset(overrides: Partial = {}): IDataset { + return { + chunk_count: 1, + pipeline_id: '', + parser_config: {}, + ...overrides, + } as IDataset; +} + +function parserConfig( + overrides: Record, +): IDataset['parser_config'] { + return overrides as unknown as IDataset['parser_config']; +} + +describe('canGenerateWiki', () => { + it('requires parsed chunks', () => { + expect(canGenerateWiki(dataset({ chunk_count: 0, pipeline_id: 'pipeline' }))).toBe( + false, + ); + }); + + it('blocks generation when no compilation configuration is present', () => { + expect(canGenerateWiki(dataset())).toBe(false); + }); + + it('allows pipeline-backed datasets', () => { + expect(canGenerateWiki(dataset({ pipeline_id: 'pipeline-id' }))).toBe(true); + }); + + it('allows the singular parser-config template group field', () => { + expect( + canGenerateWiki( + dataset({ + parser_config: parserConfig({ + compilation_template_group_id: ['group-id'], + }), + }), + ), + ).toBe(true); + }); + + it('allows the plural parser-config template group field', () => { + expect( + canGenerateWiki( + dataset({ + parser_config: parserConfig({ + compilation_template_group_ids: ['group-id'], + }), + }), + ), + ).toBe(true); + }); + + it('ignores blank pipeline and template group values', () => { + expect( + canGenerateWiki( + dataset({ + pipeline_id: ' ', + parser_config: parserConfig({ + compilation_template_group_id: [' ', ''], + }), + }), + ), + ).toBe(false); + }); +}); diff --git a/web/src/pages/dataset/compilation/wiki-generation-eligibility.ts b/web/src/pages/dataset/compilation/wiki-generation-eligibility.ts new file mode 100644 index 00000000000..b678ce5663c --- /dev/null +++ b/web/src/pages/dataset/compilation/wiki-generation-eligibility.ts @@ -0,0 +1,34 @@ +import { IDataset } from '@/interfaces/database/dataset'; + +type CompilationParserConfig = IDataset['parser_config'] & { + compilation_template_group_id?: string | string[]; + compilation_template_group_ids?: string | string[]; +}; + +function hasConfiguredGroup(value: unknown): boolean { + if (Array.isArray(value)) { + return value.some( + (groupId) => typeof groupId === 'string' && groupId.trim().length > 0, + ); + } + + return typeof value === 'string' && value.trim().length > 0; +} + +export function canGenerateWiki(knowledgeBase?: IDataset): boolean { + if ((knowledgeBase?.chunk_count ?? 0) <= 0) { + return false; + } + + const parserConfig = knowledgeBase?.parser_config as + | CompilationParserConfig + | undefined; + const compilationGroupIds = + parserConfig?.compilation_template_group_ids ?? + parserConfig?.compilation_template_group_id; + + return ( + Boolean(knowledgeBase?.pipeline_id?.trim()) || + hasConfiguredGroup(compilationGroupIds) + ); +}