Skip to content

Commit b51399c

Browse files
authored
Merge pull request #647 from iceljc/features/add-knowledge-docs
Features/add knowledge docs
2 parents b30f743 + 86d380b commit b51399c

File tree

11 files changed

+134
-40
lines changed

11 files changed

+134
-40
lines changed

src/Infrastructure/BotSharp.Abstraction/Files/IFileStorageService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,6 @@ public interface IFileStorageService
7474
/// <returns></returns>
7575
bool DeleteKnowledgeFile(string collectionName, string vectorStoreProvider, Guid? fileId = null);
7676
string GetKnowledgeBaseFileUrl(string collectionName, string vectorStoreProvider, Guid fileId, string fileName);
77-
BinaryData? GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName);
77+
BinaryData GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName);
7878
#endregion
7979
}

src/Infrastructure/BotSharp.Abstraction/Files/Models/KnowledgeFileModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class KnowledgeFileModel
77
public string FileExtension { get; set; }
88
public string ContentType { get; set; }
99
public string FileUrl { get; set; }
10+
public DocMetaRefData? RefData { get; set; }
1011
}

src/Infrastructure/BotSharp.Abstraction/Knowledges/IKnowledgeService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public interface IKnowledgeService
2424
Task<UploadKnowledgeResponse> UploadKnowledgeDocuments(string collectionName, IEnumerable<ExternalFileModel> files);
2525
Task<bool> DeleteKnowledgeDocument(string collectionName, Guid fileId);
2626
Task<PagedItems<KnowledgeFileModel>> GetPagedKnowledgeDocuments(string collectionName, KnowledgeFileFilter filter);
27-
Task<FileBinaryDataModel?> GetKnowledgeDocumentBinaryData(string collectionName, Guid fileId);
27+
Task<FileBinaryDataModel> GetKnowledgeDocumentBinaryData(string collectionName, Guid fileId);
2828
#endregion
2929

3030
#region Common

src/Infrastructure/BotSharp.Abstraction/Knowledges/Models/KnowledgeDocMetaData.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,29 @@ public class KnowledgeDocMetaData
2323
[JsonPropertyName("vector_data_ids")]
2424
public IEnumerable<string> VectorDataIds { get; set; } = new List<string>();
2525

26-
[JsonPropertyName("web_url")]
26+
[JsonPropertyName("ref_data")]
2727
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
28-
public string? WebUrl { get; set; }
28+
public DocMetaRefData? RefData { get; set; }
2929

3030
[JsonPropertyName("create_date")]
3131
public DateTime CreateDate { get; set; } = DateTime.UtcNow;
3232

3333
[JsonPropertyName("create_user_id")]
3434
public string CreateUserId { get; set; }
3535
}
36+
37+
public class DocMetaRefData
38+
{
39+
[JsonPropertyName("id")]
40+
public string Id { get; set; }
41+
42+
[JsonPropertyName("name")]
43+
public string Name { get; set; }
44+
45+
[JsonPropertyName("url")]
46+
public string Url { get; set; }
47+
48+
[JsonPropertyName("json_content")]
49+
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
50+
public string? JsonContent { get; set; }
51+
}

src/Infrastructure/BotSharp.Core/Files/Services/Storage/LocalFileStorageService.KnowledgeBase.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,28 +68,39 @@ public bool DeleteKnowledgeFile(string collectionName, string vectorStoreProvide
6868
public string GetKnowledgeBaseFileUrl(string collectionName, string vectorStoreProvider, Guid fileId, string fileName)
6969
{
7070
if (string.IsNullOrWhiteSpace(collectionName)
71-
|| string.IsNullOrWhiteSpace(vectorStoreProvider))
71+
|| string.IsNullOrWhiteSpace(vectorStoreProvider)
72+
|| string.IsNullOrWhiteSpace(fileName))
73+
{
74+
return string.Empty;
75+
}
76+
77+
var docDir = BuildKnowledgeCollectionFileDir(collectionName, vectorStoreProvider);
78+
var file = Path.Combine(docDir, fileId.ToString(), fileName);
79+
if (!File.Exists(file))
7280
{
7381
return string.Empty;
7482
}
7583

7684
return $"/knowledge/document/{collectionName}/file/{fileId}";
7785
}
7886

79-
public BinaryData? GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName)
87+
public BinaryData GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName)
8088
{
8189
if (string.IsNullOrWhiteSpace(collectionName)
8290
|| string.IsNullOrWhiteSpace(vectorStoreProvider)
8391
|| string.IsNullOrWhiteSpace(fileName))
8492
{
85-
return null;
93+
return BinaryData.Empty;
8694
}
8795

8896
var docDir = BuildKnowledgeCollectionFileDir(collectionName, vectorStoreProvider);
89-
var fileDir = Path.Combine(docDir, fileId.ToString());
90-
if (!ExistDirectory(fileDir)) return null;
97+
var file = Path.Combine(docDir, fileId.ToString(), fileName);
9198

92-
var file = Path.Combine(fileDir, fileName);
99+
if (!File.Exists(file))
100+
{
101+
return BinaryData.Empty;
102+
}
103+
93104
using var stream = new FileStream(file, FileMode.Open, FileAccess.Read);
94105
stream.Position = 0;
95106

src/Infrastructure/BotSharp.OpenAPI/ViewModels/Knowledges/KnowledgeFileViewModel.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ public class KnowledgeFileViewModel
1919
[JsonPropertyName("file_url")]
2020
public string FileUrl { get; set; }
2121

22+
[JsonPropertyName("ref_data")]
23+
public DocMetaRefData? RefData { get; set; }
24+
25+
2226
public static KnowledgeFileViewModel From(KnowledgeFileModel model)
2327
{
2428
return new KnowledgeFileViewModel
@@ -27,7 +31,8 @@ public static KnowledgeFileViewModel From(KnowledgeFileModel model)
2731
FileName = model.FileName,
2832
FileExtension = model.FileExtension,
2933
ContentType = model.ContentType,
30-
FileUrl = model.FileUrl
34+
FileUrl = model.FileUrl,
35+
RefData = model.RefData
3136
};
3237
}
3338
}

src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Document.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,14 @@ public async Task<PagedItems<KnowledgeFileModel>> GetPagedKnowledgeDocuments(str
150150
Size = filter.Size
151151
});
152152

153-
var files = pagedData.Items?.Select(x =>
153+
var files = pagedData.Items?.Select(x => new KnowledgeFileModel
154154
{
155-
var fileUrl = x.ContentType == MediaTypeNames.Text.Html ?
156-
x.WebUrl : fileStorage.GetKnowledgeBaseFileUrl(collectionName, vectorStoreProvider, x.FileId, x.FileName);
157-
158-
return new KnowledgeFileModel
159-
{
160-
FileId = x.FileId,
161-
FileName = x.FileName,
162-
FileExtension = Path.GetExtension(x.FileName),
163-
ContentType = x.ContentType,
164-
FileUrl = fileUrl
165-
};
155+
FileId = x.FileId,
156+
FileName = x.FileName,
157+
FileExtension = Path.GetExtension(x.FileName),
158+
ContentType = x.ContentType,
159+
FileUrl = fileStorage.GetKnowledgeBaseFileUrl(collectionName, vectorStoreProvider, x.FileId, x.FileName),
160+
RefData = x.RefData
166161
})?.ToList() ?? new List<KnowledgeFileModel>();
167162

168163
return new PagedItems<KnowledgeFileModel>
@@ -172,7 +167,7 @@ public async Task<PagedItems<KnowledgeFileModel>> GetPagedKnowledgeDocuments(str
172167
};
173168
}
174169

175-
public async Task<FileBinaryDataModel?> GetKnowledgeDocumentBinaryData(string collectionName, Guid fileId)
170+
public async Task<FileBinaryDataModel> GetKnowledgeDocumentBinaryData(string collectionName, Guid fileId)
176171
{
177172
var db = _services.GetRequiredService<IBotSharpRepository>();
178173
var fileStorage = _services.GetRequiredService<IFileStorageService>();
@@ -186,7 +181,15 @@ public async Task<PagedItems<KnowledgeFileModel>> GetPagedKnowledgeDocuments(str
186181
});
187182

188183
var metaData = pageData?.Items?.FirstOrDefault();
189-
if (metaData == null) return null;
184+
if (metaData == null)
185+
{
186+
return new FileBinaryDataModel
187+
{
188+
FileName = "error.txt",
189+
ContentType = "text/plain",
190+
FileBinaryData = BinaryData.Empty
191+
};
192+
};
190193

191194
var binaryData = fileStorage.GetKnowledgeBaseFileBinaryData(collectionName, vectorStoreProvider, fileId, metaData.FileName);
192195
return new FileBinaryDataModel

src/Plugins/BotSharp.Plugin.MongoStorage/Collections/KnowledgeCollectionFileMetaDocument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class KnowledgeCollectionFileMetaDocument : MongoBase
99
public string ContentType { get; set; }
1010
public string VectorStoreProvider { get; set; }
1111
public IEnumerable<string> VectorDataIds { get; set; } = new List<string>();
12-
public string? WebUrl { get; set; }
12+
public KnowledgeFileMetaRefMongoModel? RefData { get; set; }
1313
public DateTime CreateDate { get; set; }
1414
public string CreateUserId { get; set; }
1515
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using BotSharp.Abstraction.Knowledges.Models;
2+
3+
namespace BotSharp.Plugin.MongoStorage.Models;
4+
5+
public class KnowledgeFileMetaRefMongoModel
6+
{
7+
public string Id { get; set; }
8+
public string Name { get; set; }
9+
public string Url { get; set; }
10+
public string? JsonContent { get; set; }
11+
12+
public static KnowledgeFileMetaRefMongoModel? ToMongoModel(DocMetaRefData? model)
13+
{
14+
if (model == null) return null;
15+
16+
return new KnowledgeFileMetaRefMongoModel
17+
{
18+
Id = model.Id,
19+
Name = model.Name,
20+
Url = model.Url,
21+
JsonContent = model.JsonContent
22+
};
23+
}
24+
25+
public static DocMetaRefData? ToDomainModel(KnowledgeFileMetaRefMongoModel? model)
26+
{
27+
if (model == null) return null;
28+
29+
return new DocMetaRefData
30+
{
31+
Id = model.Id,
32+
Name = model.Name,
33+
Url = model.Url,
34+
JsonContent = model.JsonContent
35+
};
36+
}
37+
}

src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.KnowledgeBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public bool SaveKnolwedgeBaseFileMeta(KnowledgeDocMetaData metaData)
135135
ContentType = metaData.ContentType,
136136
VectorStoreProvider = metaData.VectorStoreProvider,
137137
VectorDataIds = metaData.VectorDataIds,
138-
WebUrl = metaData.WebUrl,
138+
RefData = KnowledgeFileMetaRefMongoModel.ToMongoModel(metaData.RefData),
139139
CreateDate = metaData.CreateDate,
140140
CreateUserId = metaData.CreateUserId
141141
};
@@ -203,10 +203,10 @@ public PagedItems<KnowledgeDocMetaData> GetKnowledgeBaseFileMeta(string collecti
203203
ContentType = x.ContentType,
204204
VectorStoreProvider = x.VectorStoreProvider,
205205
VectorDataIds = x.VectorDataIds,
206-
WebUrl = x.WebUrl,
206+
RefData = KnowledgeFileMetaRefMongoModel.ToDomainModel(x.RefData),
207207
CreateDate = x.CreateDate,
208208
CreateUserId = x.CreateUserId
209-
})?.ToList() ?? new List<KnowledgeDocMetaData>();
209+
})?.ToList() ?? new();
210210

211211
return new PagedItems<KnowledgeDocMetaData>
212212
{

src/Plugins/BotSharp.Plugin.TencentCos/Services/TencentCosService.KnowledgeBase.cs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,28 +68,49 @@ public string GetKnowledgeBaseFileUrl(string collectionName, string vectorStoreP
6868
return string.Empty;
6969
}
7070

71-
var dir = BuildKnowledgeCollectionFileDir(vectorStoreProvider, collectionName);
72-
return $"https://{_fullBuketName}.cos.{_settings.Region}.myqcloud.com/{dir}/{fileId}/{fileName}"; ;
71+
var docDir = BuildKnowledgeCollectionFileDir(vectorStoreProvider, collectionName);
72+
var fileDir = $"{docDir}/{fileId}";
73+
if (!ExistDirectory(fileDir))
74+
{
75+
return string.Empty;
76+
}
77+
78+
return $"https://{_fullBuketName}.cos.{_settings.Region}.myqcloud.com/{fileDir}/{fileName}"; ;
7379
}
7480

75-
public BinaryData? GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName)
81+
public BinaryData GetKnowledgeBaseFileBinaryData(string collectionName, string vectorStoreProvider, Guid fileId, string fileName)
7682
{
7783
if (string.IsNullOrWhiteSpace(collectionName)
7884
|| string.IsNullOrWhiteSpace(vectorStoreProvider)
7985
|| string.IsNullOrWhiteSpace(fileName))
8086
{
81-
return null;
87+
return BinaryData.Empty;
8288
}
8389

84-
var docDir = BuildKnowledgeCollectionFileDir(collectionName, vectorStoreProvider);
85-
var fileDir = $"{docDir}/{fileId}";
86-
if (!ExistDirectory(fileDir)) return null;
90+
try
91+
{
92+
var docDir = BuildKnowledgeCollectionFileDir(collectionName, vectorStoreProvider);
93+
var fileDir = $"{docDir}/{fileId}";
94+
if (!ExistDirectory(fileDir))
95+
{
96+
return BinaryData.Empty;
97+
}
8798

88-
var file = $"{fileDir}/{fileName}";
89-
var bytes = _cosClient.BucketClient.DownloadFileBytes(file);
90-
if (bytes == null) return null;
99+
var file = $"{fileDir}/{fileName}";
100+
var bytes = _cosClient.BucketClient.DownloadFileBytes(file);
101+
if (bytes == null)
102+
{
103+
return BinaryData.Empty;
104+
}
91105

92-
return BinaryData.FromBytes(bytes);
106+
return BinaryData.FromBytes(bytes);
107+
}
108+
catch (Exception ex)
109+
{
110+
_logger.LogWarning($"Error when downloading collection file ({collectionName}-{vectorStoreProvider}-{fileId}-{fileName})" +
111+
$"\r\n{ex.Message}\r\n{ex.InnerException}");
112+
return BinaryData.Empty;
113+
}
93114
}
94115

95116

0 commit comments

Comments
 (0)