Xuehao Xu f6a5a64c9b
feat(knowledge): add optional ingestion and processing extension (#7293)
* feat(knowledge): add optional ingestion and processing extension

* fix(knowledge): address catalog and ingestion review regressions

* fix(knowledge): add sanitized provider diagnostics and Chinese docs

* fix(knowledge): align capabilities and repair catalog e2e assertions
2026-10-24 08:19:02 +08:00

7.4 KiB

Stage 2 acceptance record

Date: 2026-10-22. Base revision: 29ba806fc, plus this uncommitted knowledge-management extension and tests. All ingested documents were synthetic. This records the first Stage 2 management slice, not completion of the whole knowledge-platform roadmap.

Real environment

  • macOS with OrbStack; authenticated DeerFlow Gateway, Next.js and nginx.
  • WeKnora v0.8.3 (adapter source pin 3e22822c1d2397be730c458c7539d0eb8c113a24), ParadeDB/PostgreSQL 17, Redis.
  • Official WeKnora DocReader v0.8.3; Neo4j 2025.10.1 with APOC.
  • GLM-5.3 using the operator's .env.local endpoint/credentials; DeerFlow acceptance model used chat_template_kwargs.enable_thinking=false.
  • Local Ollama BGE-M3, 1024-dimensional vectors (actual embedding request checked).
  • LightRAG v1.5.7 with an existing synthetic graph for retrieval regression.
  • Separate restricted management and retrieval keys; exact administrator/base grants. Authentication and CSRF remained enabled.

Private configuration, credentials, scripts, complete logs and screenshots remain outside the repository in the local knowledge-phase2-local evidence directory. No credential values or private model URLs are part of this report.

Observed outcomes

Check Actual outcome
Manual text ingestion 202, then completed/searchable; unique marker retrieved from the selected document
Markdown file ingestion 202, then completed/searchable
URL ingestion Initial DocReader failure; explicit reprocessing completed after the environment repair below
Capability discovery Plain document and Wiki/graph-enabled bases advertised different optional capabilities
Cancel and explicit recovery Cancellation returned 202; cancelled/not searchable observed; explicit reprocess returned 202, then completed with graph and Wiki spans done
Graph extraction/indexing Graph span done; Neo4j contained two actual relations for the synthetic project; entity node chunk IDs resolved to the original source text
Wiki generation Published entity/project/organization/summary pages and Index observed; exact keyword retrieval returned attributable evidence
Browser GLM question One base/one document selected; correct allowance, deadline and synthetic marker, with clickable source text
Citation persistence Source opened after refresh and after Gateway restart; prior answer and source excerpt persisted
API live regression Management ingestion → selected retrieval → serialized citation replay, plus selected retrieval and Wiki regressions: 3 passed
Three-tool GLM regression Explicit Wiki keyword: 3 passed in 15.64 seconds, including real document/Wiki/LightRAG evidence and citation serialization/forwarding/pruning

Nine real authorization/input checks passed: anonymous 401, missing CSRF 403, ungranted base 403, cross-base document 403, forged identity field 422, unsupported graph option 422, ordinary user 403, retrieval-only upstream key write 403, and upstream outside-base access 403.

The browser synthetic answer was 735 CNY/night, submission within 12 calendar days, marker PHASE2-YEW-735-12. Graph evidence contained project → leader and organization → project relationships. Node provenance was checked; the upstream edges had no direct chunk properties. This is not proof of edge-specific provenance, arbitrary graph quality or multi-hop reasoning.

Failures and environment repairs

The existing local stack lacked DocReader and Neo4j. URL ingestion initially reported DOCREADER_UNAVAILABLE. Official DocReader and Neo4j were added only to the private Compose configuration, without publishing their ports. Reparse then exposed missing APOC functions; installing the official APOC plugin allowed explicit reconciliation/reprocessing to succeed. The local DNS returned Fake-IP addresses, requiring exact upstream SSRF allowlist entries for the model host and the synthetic URL host. No broad SSRF bypass was added.

Free-form three-tool model runs failed the Wiki evidence assertion (two checks passed, one failed). Diagnostic tool calls showed the query 紫杉研发项目负责人 资助组织. WeKnora's Wiki endpoint is lexical; neither that phrase nor its whitespace-separated terms matched the published page titles. A subsequent prompt explicitly requesting the keyword 紫杉 passed all three checks. The fixed-keyword result establishes integration, not unrestricted natural-language Wiki recall. No retrieval assertion was removed or weakened.

One pipeline document remained finalizing/searchable during an additional upstream Wiki update after publishing pages. Final inspection confirmed completed, with chunking, embedding, graph and both Wiki update spans done. The separate cancellation recovery case also reached completed with all relevant spans done. The intermediate searchable state was not treated as terminal completion.

Offline regression and reproduction

Before live acceptance, the full backend suite passed 35,467 tests across four shards (796 skipped); strict blocking-I/O coverage passed 276 tests (one skipped). The extension's focused contract and blocking-I/O tests passed 46 checks. The final focused run including agent-guidance checks passed 60 tests, with the non-opted-in live test skipped. Ruff lint/format and package wheel building passed. Live acceptance added a separately gated test; it does not alter normal offline test behavior.

See README.md for the live environment variables and command. That test deliberately writes one unique synthetic document per run, retains its ID and does not automatically retry or delete it. Browser acceptance requires selecting the resulting document in the existing chat scope selector, asking a question unique to the fixture, opening its source, refreshing, then restarting Gateway and opening the persisted source again. Wiki/graph acceptance must additionally inspect the upstream spans, published pages and actual graph records; document parse completion alone is insufficient.

Out of scope: a management frontend, platform spaces/sharing, arbitrary parser or model configuration, Trace persistence, standalone Wiki editing, upstream user impersonation, multi-Gateway ingestion admission and exactly-once writes.

PR review follow-up

Review regressions now reject parent-child chunk overrides on manual, URL, file and reprocess paths before any upstream mutation; empty and non-chunk overrides remain supported. All four rejection cases failed before the fix and passed afterward. The oversized-upload case has a compact explicit pytest ID, avoiding Windows environment-variable limits (native Windows was not rerun locally). Frontend discovery includes the package's actual namespace and localized copy. Focused backend/guidance checks: 64 passed, 1 skipped. Frontend catalog: 9 passed; frontend lint/typecheck and backend formatting passed.

Further review: capabilities now omit unsupported per-base controls, and invalid local credentials return a distinct pre-request 503. Seven new cases failed before the fix; focused backend/guidance checks now pass 77 tests (1 live skip). The three failing CI catalog E2E cases used the obsolete fixed count 11; they now use the catalog length plus explicit localized management-entry assertions. All three pass locally against an isolated Next.js development server. Catalog unit tests (9), frontend lint/typecheck and backend formatting also pass.