Skip to content

Commit 7cf5dff

Browse files
committed
fix: 修复标签创建重复和流式响应解析问题
修复标签创建时未检查重复名称的问题,增加冲突错误返回。 优化流式响应中对引用数据的处理,支持序列化后的数据结构解析。
1 parent 72a3cbb commit 7cf5dff

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

internal/application/service/tag.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,16 @@ func (s *knowledgeTagService) CreateTag(
110110
if err != nil {
111111
return nil, err
112112
}
113+
114+
// Check if tag with same name already exists
115+
existingTag, err := s.repo.GetByName(ctx, kb.TenantID, kbID, name)
116+
if err == nil && existingTag != nil {
117+
return nil, werrors.NewConflictError("标签名称已存在")
118+
}
119+
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
120+
return nil, err
121+
}
122+
113123
now := time.Now()
114124
tag := &types.KnowledgeTag{
115125
ID: uuid.New().String(),

internal/handler/session/helpers.go

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,35 @@ func buildStreamResponse(evt interfaces.StreamEvent, requestID string) *types.St
6060
// Special handling for references event
6161
if evt.Type == types.ResponseTypeReferences {
6262
refsData := evt.Data["references"]
63-
logger.GetLogger(context.Background()).Info("buildStreamResponse references event",
64-
"refsData_type", fmt.Sprintf("%T", refsData),
65-
"refsData", refsData)
6663
if refs, ok := refsData.(types.References); ok {
67-
logger.GetLogger(context.Background()).Info("buildStreamResponse: matched types.References")
6864
response.KnowledgeReferences = refs
6965
} else if refs, ok := refsData.([]*types.SearchResult); ok {
70-
logger.GetLogger(context.Background()).Info("buildStreamResponse: matched []*types.SearchResult")
7166
response.KnowledgeReferences = types.References(refs)
72-
} else {
73-
logger.GetLogger(context.Background()).Warn("buildStreamResponse: references type assertion failed",
74-
"actual_type", fmt.Sprintf("%T", refsData))
67+
} else if refs, ok := refsData.([]interface{}); ok {
68+
// Handle case where data was serialized/deserialized (e.g., from Redis)
69+
searchResults := make([]*types.SearchResult, 0, len(refs))
70+
for _, ref := range refs {
71+
if refMap, ok := ref.(map[string]interface{}); ok {
72+
sr := &types.SearchResult{
73+
ID: getString(refMap, "id"),
74+
Content: getString(refMap, "content"),
75+
KnowledgeID: getString(refMap, "knowledge_id"),
76+
ChunkIndex: int(getFloat64(refMap, "chunk_index")),
77+
KnowledgeTitle: getString(refMap, "knowledge_title"),
78+
StartAt: int(getFloat64(refMap, "start_at")),
79+
EndAt: int(getFloat64(refMap, "end_at")),
80+
Seq: int(getFloat64(refMap, "seq")),
81+
Score: getFloat64(refMap, "score"),
82+
ChunkType: getString(refMap, "chunk_type"),
83+
ParentChunkID: getString(refMap, "parent_chunk_id"),
84+
ImageInfo: getString(refMap, "image_info"),
85+
KnowledgeFilename: getString(refMap, "knowledge_filename"),
86+
KnowledgeSource: getString(refMap, "knowledge_source"),
87+
}
88+
searchResults = append(searchResults, sr)
89+
}
90+
}
91+
response.KnowledgeReferences = types.References(searchResults)
7592
}
7693
}
7794

0 commit comments

Comments
 (0)