feat: add knowledge management functionality with CRUD operations and database schema

- Implemented KnowledgeHandler for managing knowledge groups and items, including listing, creating, updating, and deleting operations.
- Added database migration scripts to create necessary tables for knowledge management, including knowledge_groups, knowledge_items, knowledge_parse_tasks, and knowledge_chunks_meta.
- Introduced prompt_rule_knowledge_groups table to associate prompt rules with knowledge groups.
This commit is contained in:
2026-04-05 17:14:13 +08:00
parent 134dd063c3
commit 446f865cdf
62 changed files with 9503 additions and 2664 deletions
+50
View File
@@ -18,6 +18,11 @@ import type {
InstantTaskListParams,
InstantTaskListResponse,
JsonValue,
KnowledgeGroup,
KnowledgeGroupRequest,
KnowledgeItem,
KnowledgeTextItemRequest,
KnowledgeURLItemRequest,
Keyword,
KeywordRequest,
LoginRequest,
@@ -225,6 +230,51 @@ export const articlesApi = {
},
};
export const knowledgeApi = {
listGroups() {
return apiClient.get<KnowledgeGroup[]>("/api/tenant/knowledge/groups");
},
createGroup(payload: KnowledgeGroupRequest) {
return apiClient.post<KnowledgeGroup, KnowledgeGroupRequest>("/api/tenant/knowledge/groups", payload);
},
updateGroup(id: number, payload: KnowledgeGroupRequest) {
return apiClient.put<null, KnowledgeGroupRequest>(`/api/tenant/knowledge/groups/${id}`, payload);
},
removeGroup(id: number) {
return apiClient.remove<null>(`/api/tenant/knowledge/groups/${id}`);
},
listItems(groupId?: number) {
return apiClient.get<KnowledgeItem[]>("/api/tenant/knowledge/items", {
params: groupId ? { group_id: groupId } : undefined,
});
},
createTextItem(payload: KnowledgeTextItemRequest) {
return apiClient.post<KnowledgeItem, KnowledgeTextItemRequest>(
"/api/tenant/knowledge/items/text",
payload,
);
},
createURLItem(payload: KnowledgeURLItemRequest) {
return apiClient.post<KnowledgeItem, KnowledgeURLItemRequest>(
"/api/tenant/knowledge/items/url",
payload,
);
},
async createFileItem(payload: { group_id: number; name?: string; file: File }) {
const form = new FormData();
form.set("group_id", String(payload.group_id));
if (payload.name?.trim()) {
form.set("name", payload.name.trim());
}
form.set("file", payload.file);
const { data } = await apiClient.raw.post("/api/tenant/knowledge/items/file", form);
return data.data as KnowledgeItem;
},
removeItem(id: number) {
return apiClient.remove<null>(`/api/tenant/knowledge/items/${id}`);
},
};
export interface ArticleGenerationStreamEvent {
type: string;
article_id: number;