feat: update auto reply and packaging
This commit is contained in:
@@ -79,8 +79,8 @@ func TestRebuildKnowledgeIndexScansSubdirectories(t *testing.T) {
|
||||
// 根目录故意不放任何知识文件,全部放进多层子目录。
|
||||
files := map[string]string{
|
||||
filepath.Join("01_产品", "数控机床", "VMC850规格.md"): "VMC850 立式加工中心,主轴转速 8000rpm。",
|
||||
filepath.Join("03_售后", "故障排查", "常见故障.md"): "报警 E01 表示伺服过载,请检查负载。",
|
||||
filepath.Join("readme.txt"): "", // 空文件,应进 FailedFiles 不计入 FileCount
|
||||
filepath.Join("03_售后", "故障排查", "常见故障.md"): "报警 E01 表示伺服过载,请检查负载。",
|
||||
filepath.Join("readme.txt"): "", // 空文件,应进 FailedFiles 不计入 FileCount
|
||||
}
|
||||
for rel, content := range files {
|
||||
full := filepath.Join(dir, rel)
|
||||
@@ -96,6 +96,7 @@ func TestRebuildKnowledgeIndexScansSubdirectories(t *testing.T) {
|
||||
cfg.Knowledge.Directory = dir
|
||||
cfg.Knowledge.IndexPath = filepath.Join(dir, "index.json")
|
||||
cfg.Retrieval.EmbeddingIndexPath = filepath.Join(dir, "embedding_index.json")
|
||||
cfg.Retrieval.RetrievalMode = retrievalModeKeywordOnly
|
||||
engine := testAutoReplyEngine(cfg)
|
||||
|
||||
idx, err := engine.rebuildKnowledgeIndex()
|
||||
@@ -118,6 +119,56 @@ func TestRebuildKnowledgeIndexScansSubdirectories(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRebuildKnowledgeIndexClearsKnowledgeLastErrorOnSuccess(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
if err := os.WriteFile(filepath.Join(dir, "faq.md"), []byte("AgentBox supports knowledge search."), 0644); err != nil {
|
||||
t.Fatalf("write knowledge file failed: %v", err)
|
||||
}
|
||||
|
||||
cfg := config.NewDefaultAutoReplyConfig()
|
||||
cfg.Knowledge.Directory = dir
|
||||
cfg.Knowledge.IndexPath = filepath.Join(dir, "index.json")
|
||||
cfg.Retrieval.EmbeddingIndexPath = filepath.Join(dir, "embedding_index.json")
|
||||
cfg.Retrieval.RetrievalMode = retrievalModeKeywordOnly
|
||||
engine := testAutoReplyEngine(cfg)
|
||||
engine.setLastErrorWithScope(autoReplyErrorScopeKnowledge, "向量召回失败,已降级关键词检索: test")
|
||||
|
||||
if _, err := engine.rebuildKnowledgeIndex(); err != nil {
|
||||
t.Fatalf("rebuildKnowledgeIndex failed: %v", err)
|
||||
}
|
||||
if engine.status.LastError != "" || engine.status.LastErrorScope != "" {
|
||||
t.Fatalf("expected knowledge error cleared, got scope=%q error=%q", engine.status.LastErrorScope, engine.status.LastError)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRebuildKnowledgeIndexKeepsKnowledgeLastErrorWhenEmbeddingFails(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
if err := os.WriteFile(filepath.Join(dir, "faq.md"), []byte("AgentBox supports knowledge search."), 0644); err != nil {
|
||||
t.Fatalf("write knowledge file failed: %v", err)
|
||||
}
|
||||
|
||||
cfg := config.NewDefaultAutoReplyConfig()
|
||||
cfg.Knowledge.Directory = dir
|
||||
cfg.Knowledge.IndexPath = filepath.Join(dir, "index.json")
|
||||
cfg.Retrieval.EmbeddingIndexPath = filepath.Join(dir, "embedding_index.json")
|
||||
cfg.Retrieval.RetrievalMode = retrievalModeHybridRerank
|
||||
cfg.AI.BaseURL = ""
|
||||
cfg.AI.APIKey = ""
|
||||
engine := testAutoReplyEngine(cfg)
|
||||
engine.setLastErrorWithScope(autoReplyErrorScopeKnowledge, "向量召回失败,已降级关键词检索: test")
|
||||
|
||||
idx, err := engine.rebuildKnowledgeIndex()
|
||||
if err == nil {
|
||||
t.Fatal("expected embedding rebuild failure")
|
||||
}
|
||||
if idx == nil || idx.FileCount != 1 {
|
||||
t.Fatalf("expected scanned index returned with one file, got %#v", idx)
|
||||
}
|
||||
if engine.status.LastErrorScope != autoReplyErrorScopeKnowledge || engine.status.LastError == "" {
|
||||
t.Fatalf("expected knowledge error retained, got scope=%q error=%q", engine.status.LastErrorScope, engine.status.LastError)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParsePDFKnowledgeFileExtractsTextLayer(t *testing.T) {
|
||||
path := filepath.Join(t.TempDir(), "text.pdf")
|
||||
writeMinimalTextPDF(t, path, "AgentBox PDF content 123")
|
||||
|
||||
Reference in New Issue
Block a user