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:
bitloi
2026-04-13 09:26:30 -03:00
committed by GitHub
parent ef07faea80
commit 853021ff2a
13 changed files with 175 additions and 2120 deletions

View File

@@ -515,12 +515,12 @@ def test_templates_rm_save_get_matrix_unit(monkeypatch):
self.template_id = template_id
def to_dict(self):
return {"id": self.template_id}
return {"id": self.template_id, "canvas_type": "Recommended", "canvas_types": ["Recommended", "Agent"]}
monkeypatch.setattr(module.CanvasTemplateService, "get_all", lambda: [_Template("tpl-1")])
res = module.templates()
assert res["code"] == module.RetCode.SUCCESS
assert res["data"] == [{"id": "tpl-1"}]
assert res["data"] == [{"id": "tpl-1", "canvas_type": "Recommended", "canvas_types": ["Recommended", "Agent"]}]
_set_request_json(monkeypatch, module, {"canvas_ids": ["c1", "c2"]})
monkeypatch.setattr(module.UserCanvasService, "accessible", lambda *_args, **_kwargs: False)