mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-08 08:28:02 +08:00
feat: support multiple canvas_types for agent templates and remove duplicate files (#14030)
### What problem does this PR solve? Closes #13907 The template catalog had duplicate files (e.g. `*_r.json`) only to place the same template into multiple sidebar groups. This increases maintenance cost and makes template updates error-prone. This PR adds first-class support for multiple template categories in a single file via `canvas_types`, then removes duplicate template files. What changed: - Added `canvas_types` to `CanvasTemplate` model and DB migration. - Added normalization logic when loading templates: - accepts legacy `canvas_type` - accepts new `canvas_types` - merges/deduplicates values - preserves backward compatibility by keeping `canvas_type` as first normalized value. - Updated template import flow to load only `.json` files and in stable sorted order. - Updated frontend template filtering to match on `canvas_types` first, with fallback to legacy `canvas_type`. - Consolidated duplicated template pairs into single files and removed: - `deep_search_r.json` - `reflective_academic_paper_generator_r.json` - `seo_article_writer_r.json` - Added regression/edge-case tests for category normalization and route serialization expectations. ### Type of change - [ ] Bug Fix (non-breaking change which fixes an issue) - [x] New Feature (non-breaking change which adds functionality) - [ ] Documentation Update - [ ] Refactoring - [ ] Performance Improvement - [ ] Other (please describe):
This commit is contained in:
@@ -87,6 +87,7 @@ export declare interface IFlow {
|
||||
export interface IFlowTemplate {
|
||||
avatar: string;
|
||||
canvas_type: string;
|
||||
canvas_types?: string[];
|
||||
create_date: string;
|
||||
create_time: number;
|
||||
canvas_category?: string;
|
||||
|
||||
@@ -78,10 +78,18 @@ export default function AgentTemplates() {
|
||||
if (!selectMenuItem) {
|
||||
return templateList;
|
||||
}
|
||||
const selectedCanvasType = selectMenuItem.toLocaleLowerCase();
|
||||
return templateList.filter(
|
||||
(item) =>
|
||||
item.canvas_type?.toLocaleLowerCase() ===
|
||||
selectMenuItem?.toLocaleLowerCase(),
|
||||
(item) => {
|
||||
if (Array.isArray(item.canvas_types) && item.canvas_types.length > 0) {
|
||||
return item.canvas_types.some(
|
||||
(canvasType) =>
|
||||
typeof canvasType === 'string' &&
|
||||
canvasType.toLocaleLowerCase() === selectedCanvasType,
|
||||
);
|
||||
}
|
||||
return item.canvas_type?.toLocaleLowerCase() === selectedCanvasType;
|
||||
},
|
||||
);
|
||||
}, [selectMenuItem, templateList]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user