angineer-docs-core 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. angineer_docs_core-0.1.0/LICENSE +21 -0
  2. angineer_docs_core-0.1.0/PKG-INFO +194 -0
  3. angineer_docs_core-0.1.0/README.md +157 -0
  4. angineer_docs_core-0.1.0/pyproject.toml +69 -0
  5. angineer_docs_core-0.1.0/setup.cfg +4 -0
  6. angineer_docs_core-0.1.0/src/angineer_docs_core.egg-info/PKG-INFO +194 -0
  7. angineer_docs_core-0.1.0/src/angineer_docs_core.egg-info/SOURCES.txt +212 -0
  8. angineer_docs_core-0.1.0/src/angineer_docs_core.egg-info/dependency_links.txt +1 -0
  9. angineer_docs_core-0.1.0/src/angineer_docs_core.egg-info/requires.txt +19 -0
  10. angineer_docs_core-0.1.0/src/angineer_docs_core.egg-info/top_level.txt +2 -0
  11. angineer_docs_core-0.1.0/src/docs_core/__init__.py +71 -0
  12. angineer_docs_core-0.1.0/src/docs_core/docs_file_io.py +210 -0
  13. angineer_docs_core-0.1.0/src/docs_core/docs_service.py +1380 -0
  14. angineer_docs_core-0.1.0/src/docs_core/kb_migration_audit.py +51 -0
  15. angineer_docs_core-0.1.0/src/docs_core/kb_migration_store.py +162 -0
  16. angineer_docs_core-0.1.0/src/docs_core/kb_migrator.py +797 -0
  17. angineer_docs_core-0.1.0/src/docs_core/library_registry.py +503 -0
  18. angineer_docs_core-0.1.0/src/docs_core/models/__init__.py +23 -0
  19. angineer_docs_core-0.1.0/src/docs_core/models/types.py +221 -0
  20. angineer_docs_core-0.1.0/src/docs_core/parse_pipeline.py +1422 -0
  21. angineer_docs_core-0.1.0/src/docs_core/parse_records_store.py +257 -0
  22. angineer_docs_core-0.1.0/src/docs_core/paths.py +251 -0
  23. angineer_docs_core-0.1.0/src/docs_core/startup_guard.py +210 -0
  24. angineer_docs_core-0.1.0/src/docs_core/step01_source_prep/__init__.py +5 -0
  25. angineer_docs_core-0.1.0/src/docs_core/step01_source_prep/source_prep.py +62 -0
  26. angineer_docs_core-0.1.0/src/docs_core/step02_convert2pdf/__init__.py +5 -0
  27. angineer_docs_core-0.1.0/src/docs_core/step02_convert2pdf/convert2pdf.py +194 -0
  28. angineer_docs_core-0.1.0/src/docs_core/step03_mineru_parse/__init__.py +11 -0
  29. angineer_docs_core-0.1.0/src/docs_core/step03_mineru_parse/mineru_parser.py +977 -0
  30. angineer_docs_core-0.1.0/src/docs_core/step03_mineru_parse/popo_enhance.py +441 -0
  31. angineer_docs_core-0.1.0/src/docs_core/step04_structure/__init__.py +27 -0
  32. angineer_docs_core-0.1.0/src/docs_core/step04_structure/figure_describer.py +296 -0
  33. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/__init__.py +1 -0
  34. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/popo_block_merger.py +396 -0
  35. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/popo_signal_aligner.py +198 -0
  36. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/popo_signal_injector.py +228 -0
  37. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/popo_signal_level_fusion.py +70 -0
  38. angineer_docs_core-0.1.0/src/docs_core/step04_structure/popo/popo_table_continuation.py +287 -0
  39. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/__init__.py +1 -0
  40. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/formula_semantics.py +1011 -0
  41. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/jsonl_io.py +145 -0
  42. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/markdown_projection.py +171 -0
  43. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/page_role_classifier.py +238 -0
  44. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/row_vocabulary.py +30 -0
  45. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/table_caption.py +65 -0
  46. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/table_cells.py +285 -0
  47. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/table_html_utils.py +85 -0
  48. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/table_semantics.py +379 -0
  49. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/title_level_refiner.py +209 -0
  50. angineer_docs_core-0.1.0/src/docs_core/step04_structure/shared/title_level_resolver.py +218 -0
  51. angineer_docs_core-0.1.0/src/docs_core/step04_structure/solo2json_pipeline.py +671 -0
  52. angineer_docs_core-0.1.0/src/docs_core/step04_structure/solo_engine.py +2785 -0
  53. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/__init__.py +4 -0
  54. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/graph_editor.py +1619 -0
  55. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rebuild/__init__.py +41 -0
  56. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rebuild/canonical_builder.py +895 -0
  57. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rebuild/graph_rebuilder.py +302 -0
  58. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rebuild/table_semantics.py +51 -0
  59. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rebuild/tag_rules.py +27 -0
  60. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/rows_projection.py +153 -0
  61. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/sqlite_index.py +106 -0
  62. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/store/__init__.py +13 -0
  63. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/store/blocks_sql_store.py +1378 -0
  64. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/store/canonical_sql_store.py +1445 -0
  65. angineer_docs_core-0.1.0/src/docs_core/step05_sqlite_fts/store/sqlite_utils.py +74 -0
  66. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/__init__.py +47 -0
  67. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/chroma_vector_store.py +186 -0
  68. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/config.py +133 -0
  69. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/embedding_provider.py +302 -0
  70. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/qdrant_vector_store.py +451 -0
  71. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/sqlite_vector_store.py +426 -0
  72. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/vector_indexer.py +214 -0
  73. angineer_docs_core-0.1.0/src/docs_core/step06_vectors/vector_store.py +76 -0
  74. angineer_docs_core-0.1.0/src/docs_core/step07_graph/__init__.py +25 -0
  75. angineer_docs_core-0.1.0/src/docs_core/step07_graph/auto_extract.py +36 -0
  76. angineer_docs_core-0.1.0/src/docs_core/step07_graph/config.py +122 -0
  77. angineer_docs_core-0.1.0/src/docs_core/step07_graph/entity_dedup.py +56 -0
  78. angineer_docs_core-0.1.0/src/docs_core/step07_graph/entity_extractor.py +163 -0
  79. angineer_docs_core-0.1.0/src/docs_core/step07_graph/evidence_builder.py +378 -0
  80. angineer_docs_core-0.1.0/src/docs_core/step07_graph/extractor_prompts.py +166 -0
  81. angineer_docs_core-0.1.0/src/docs_core/step07_graph/graph_orchestrator.py +727 -0
  82. angineer_docs_core-0.1.0/src/docs_core/step07_graph/graph_store.py +1182 -0
  83. angineer_docs_core-0.1.0/src/docs_core/step07_graph/push_to_graph.py +111 -0
  84. angineer_docs_core-0.1.0/src/docs_core/step07_graph/question_mapper.py +153 -0
  85. angineer_docs_core-0.1.0/src/docs_core/step07_graph/relation_infer.py +125 -0
  86. angineer_docs_core-0.1.0/src/docs_core/step08_maintain/__init__.py +17 -0
  87. angineer_docs_core-0.1.0/src/docs_core/step08_maintain/config.py +127 -0
  88. angineer_docs_core-0.1.0/src/docs_core/step08_maintain/report.py +115 -0
  89. angineer_docs_core-0.1.0/src/docs_core/step08_maintain/runner.py +578 -0
  90. angineer_docs_core-0.1.0/src/docs_core/step09_query/__init__.py +1 -0
  91. angineer_docs_core-0.1.0/src/docs_core/step09_query/agent_port.py +473 -0
  92. angineer_docs_core-0.1.0/src/docs_core/step09_query/protocols/__init__.py +30 -0
  93. angineer_docs_core-0.1.0/src/docs_core/step09_query/protocols/contracts.py +197 -0
  94. angineer_docs_core-0.1.0/src/docs_core/step09_query/protocols/data_port.py +112 -0
  95. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/__init__.py +35 -0
  96. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/clause_resolver.py +208 -0
  97. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/dense_retriever.py +176 -0
  98. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/formula_retriever.py +464 -0
  99. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/hybrid_retriever.py +305 -0
  100. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/query_normalizer.py +382 -0
  101. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/reranker.py +65 -0
  102. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/sparse_retriever.py +316 -0
  103. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieval/table_retriever.py +544 -0
  104. angineer_docs_core-0.1.0/src/docs_core/step09_query/retrieve_service.py +360 -0
  105. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/__init__.py +18 -0
  106. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/schema_linker.py +242 -0
  107. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/sql_executor.py +23 -0
  108. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/sql_explainer.py +14 -0
  109. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/sql_generator.py +10 -0
  110. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/sql_planner.py +67 -0
  111. angineer_docs_core-0.1.0/src/docs_core/step09_query/text2sql/sql_validator.py +60 -0
  112. angineer_docs_core-0.1.0/src/docs_core/step10_export/__init__.py +1 -0
  113. angineer_docs_core-0.1.0/src/docs_core/step10_export/export_artifacts.py +299 -0
  114. angineer_docs_core-0.1.0/src/popo/data_engine/add_link.py +906 -0
  115. angineer_docs_core-0.1.0/src/popo/data_engine/api_utils.py +114 -0
  116. angineer_docs_core-0.1.0/src/popo/data_engine/table_merge_filter.py +369 -0
  117. angineer_docs_core-0.1.0/src/popo/data_engine/table_utils.py +290 -0
  118. angineer_docs_core-0.1.0/src/popo/eval/evaluate.py +424 -0
  119. angineer_docs_core-0.1.0/src/popo/post_processing/generate_metadata.py +173 -0
  120. angineer_docs_core-0.1.0/src/popo/post_processing/get_json_tree.py +227 -0
  121. angineer_docs_core-0.1.0/src/popo/post_processing/inference.py +864 -0
  122. angineer_docs_core-0.1.0/src/popo/post_processing/label_normalization.py +1044 -0
  123. angineer_docs_core-0.1.0/src/popo/post_processing/model_utils.py +290 -0
  124. angineer_docs_core-0.1.0/src/popo/post_processing/run_inference.py +277 -0
  125. angineer_docs_core-0.1.0/src/popo/post_processing/split_subnode.py +108 -0
  126. angineer_docs_core-0.1.0/src/popo/post_processing/table_merge_utils.py +323 -0
  127. angineer_docs_core-0.1.0/tests/test_agent_port.py +204 -0
  128. angineer_docs_core-0.1.0/tests/test_build_id_contract.py +89 -0
  129. angineer_docs_core-0.1.0/tests/test_chunk_noise_contract.py +51 -0
  130. angineer_docs_core-0.1.0/tests/test_citation_target_contract.py +24 -0
  131. angineer_docs_core-0.1.0/tests/test_cross_process_library_visibility.py +39 -0
  132. angineer_docs_core-0.1.0/tests/test_custom_group_flow.py +47 -0
  133. angineer_docs_core-0.1.0/tests/test_delete_library.py +54 -0
  134. angineer_docs_core-0.1.0/tests/test_document_mentions.py +66 -0
  135. angineer_docs_core-0.1.0/tests/test_equation_explain_linkage.py +126 -0
  136. angineer_docs_core-0.1.0/tests/test_formula_batch_extraction.py +106 -0
  137. angineer_docs_core-0.1.0/tests/test_formula_group_linkage.py +30 -0
  138. angineer_docs_core-0.1.0/tests/test_formula_semantics_contract.py +505 -0
  139. angineer_docs_core-0.1.0/tests/test_formula_semantics_invalidation.py +38 -0
  140. angineer_docs_core-0.1.0/tests/test_formula_symbol_correction.py +167 -0
  141. angineer_docs_core-0.1.0/tests/test_front_matter_flat_hierarchy.py +251 -0
  142. angineer_docs_core-0.1.0/tests/test_fts_write_lock.py +133 -0
  143. angineer_docs_core-0.1.0/tests/test_gate_skip_on_task_exit.py +93 -0
  144. angineer_docs_core-0.1.0/tests/test_graph_editor_corrected_edits.py +188 -0
  145. angineer_docs_core-0.1.0/tests/test_graph_editor_formula_segments.py +52 -0
  146. angineer_docs_core-0.1.0/tests/test_graph_entity_approval.py +76 -0
  147. angineer_docs_core-0.1.0/tests/test_graph_entity_status.py +184 -0
  148. angineer_docs_core-0.1.0/tests/test_graph_move_doc.py +69 -0
  149. angineer_docs_core-0.1.0/tests/test_graph_pages_fallback.py +48 -0
  150. angineer_docs_core-0.1.0/tests/test_hierarchy_contract.py +275 -0
  151. angineer_docs_core-0.1.0/tests/test_kb_migration_audit.py +24 -0
  152. angineer_docs_core-0.1.0/tests/test_kb_migration_gate.py +28 -0
  153. angineer_docs_core-0.1.0/tests/test_kb_migration_runner.py +36 -0
  154. angineer_docs_core-0.1.0/tests/test_kb_migration_store.py +42 -0
  155. angineer_docs_core-0.1.0/tests/test_kb_migrator_doc_unit.py +51 -0
  156. angineer_docs_core-0.1.0/tests/test_kb_migrator_preview.py +138 -0
  157. angineer_docs_core-0.1.0/tests/test_kb_migrator_run.py +171 -0
  158. angineer_docs_core-0.1.0/tests/test_library_registry.py +202 -0
  159. angineer_docs_core-0.1.0/tests/test_markdown_projection.py +132 -0
  160. angineer_docs_core-0.1.0/tests/test_merged_from_null_roundtrip.py +68 -0
  161. angineer_docs_core-0.1.0/tests/test_mineru_chunk_merge.py +79 -0
  162. angineer_docs_core-0.1.0/tests/test_mineru_company_api_timeout.py +82 -0
  163. angineer_docs_core-0.1.0/tests/test_mineru_gpu_gate.py +191 -0
  164. angineer_docs_core-0.1.0/tests/test_mineru_parse_meta.py +85 -0
  165. angineer_docs_core-0.1.0/tests/test_multi_library_fts.py +48 -0
  166. angineer_docs_core-0.1.0/tests/test_multi_library_fusion.py +51 -0
  167. angineer_docs_core-0.1.0/tests/test_multi_library_retrieve.py +170 -0
  168. angineer_docs_core-0.1.0/tests/test_multi_library_scope.py +35 -0
  169. angineer_docs_core-0.1.0/tests/test_multi_library_sparse.py +35 -0
  170. angineer_docs_core-0.1.0/tests/test_noise_disposal_contract.py +46 -0
  171. angineer_docs_core-0.1.0/tests/test_page_bbox_model.py +46 -0
  172. angineer_docs_core-0.1.0/tests/test_page_label_chain_contract.py +85 -0
  173. angineer_docs_core-0.1.0/tests/test_page_role_classifier.py +158 -0
  174. angineer_docs_core-0.1.0/tests/test_pages_citations_contract.py +132 -0
  175. angineer_docs_core-0.1.0/tests/test_parse_records_meta_backfill.py +99 -0
  176. angineer_docs_core-0.1.0/tests/test_parse_records_relabel.py +17 -0
  177. angineer_docs_core-0.1.0/tests/test_parse_resume_retry.py +157 -0
  178. angineer_docs_core-0.1.0/tests/test_parse_stage_meta_store.py +95 -0
  179. angineer_docs_core-0.1.0/tests/test_parse_stage_reset_contract.py +17 -0
  180. angineer_docs_core-0.1.0/tests/test_paths_relative.py +79 -0
  181. angineer_docs_core-0.1.0/tests/test_popo_block_merger.py +766 -0
  182. angineer_docs_core-0.1.0/tests/test_popo_contd_type_rules.py +187 -0
  183. angineer_docs_core-0.1.0/tests/test_popo_gate.py +279 -0
  184. angineer_docs_core-0.1.0/tests/test_popo_signal_aligner.py +168 -0
  185. angineer_docs_core-0.1.0/tests/test_popo_signal_injection.py +271 -0
  186. angineer_docs_core-0.1.0/tests/test_popo_signal_level_fusion.py +43 -0
  187. angineer_docs_core-0.1.0/tests/test_purge_cleanup.py +107 -0
  188. angineer_docs_core-0.1.0/tests/test_qdrant_set_payload.py +34 -0
  189. angineer_docs_core-0.1.0/tests/test_qdrant_vector_store.py +170 -0
  190. angineer_docs_core-0.1.0/tests/test_rebuild_vectors_guard.py +78 -0
  191. angineer_docs_core-0.1.0/tests/test_recognition_score_passthrough.py +252 -0
  192. angineer_docs_core-0.1.0/tests/test_reload_scope_cache.py +10 -0
  193. angineer_docs_core-0.1.0/tests/test_row_vocabulary_contract.py +101 -0
  194. angineer_docs_core-0.1.0/tests/test_smoke.py +9 -0
  195. angineer_docs_core-0.1.0/tests/test_solo_fallback_contract.py +290 -0
  196. angineer_docs_core-0.1.0/tests/test_solo_hybrid_format_compat.py +150 -0
  197. angineer_docs_core-0.1.0/tests/test_solo_page_size_fallback.py +59 -0
  198. angineer_docs_core-0.1.0/tests/test_solo_popo_missing.py +27 -0
  199. angineer_docs_core-0.1.0/tests/test_source_file_fallback.py +84 -0
  200. angineer_docs_core-0.1.0/tests/test_startup_guard.py +99 -0
  201. angineer_docs_core-0.1.0/tests/test_structure_pipeline_stats_contract.py +96 -0
  202. angineer_docs_core-0.1.0/tests/test_structure_write_contract.py +193 -0
  203. angineer_docs_core-0.1.0/tests/test_table_attachment.py +171 -0
  204. angineer_docs_core-0.1.0/tests/test_table_cells.py +223 -0
  205. angineer_docs_core-0.1.0/tests/test_table_channel_contract.py +111 -0
  206. angineer_docs_core-0.1.0/tests/test_table_retriever_cache.py +134 -0
  207. angineer_docs_core-0.1.0/tests/test_table_semantics_sidecar.py +190 -0
  208. angineer_docs_core-0.1.0/tests/test_title_level_refiner_contract.py +184 -0
  209. angineer_docs_core-0.1.0/tests/test_title_level_resolver.py +142 -0
  210. angineer_docs_core-0.1.0/tests/test_title_level_review.py +55 -0
  211. angineer_docs_core-0.1.0/tests/test_vector_dimension_meta.py +83 -0
  212. angineer_docs_core-0.1.0/tests/test_vector_search_topk_parity.py +155 -0
  213. angineer_docs_core-0.1.0/tests/test_vector_store_cache.py +132 -0
  214. angineer_docs_core-0.1.0/tests/test_vectorstore_provider_failfast.py +40 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rowe Smith
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,194 @@
1
+ Metadata-Version: 2.4
2
+ Name: angineer-docs-core
3
+ Version: 0.1.0
4
+ Summary: AnGIneer docs engine: parse pipeline (source_prep -> MinerU -> PoPo -> structure -> FTS -> vectors -> graph), retrieval and export
5
+ Author: AnGIneer Team
6
+ License: MIT
7
+ Project-URL: Repository, https://github.com/0mao0/angineer-docs-core
8
+ Project-URL: Issues, https://github.com/0mao0/angineer-docs-core/issues
9
+ Keywords: rag,document-parsing,retrieval,knowledge-base,mineru
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: angineer-tree-core<0.2.0,>=0.1.0
21
+ Requires-Dist: angineer-ai-inference<0.3.0,>=0.2.2
22
+ Requires-Dist: pydantic<3.0.0,>=2.0.0
23
+ Requires-Dist: python-dotenv>=1.0.0
24
+ Requires-Dist: requests>=2.31.0
25
+ Requires-Dist: PyMuPDF>=1.23.0
26
+ Requires-Dist: numpy>=1.24
27
+ Requires-Dist: python-dateutil>=2.8
28
+ Requires-Dist: qdrant-client>=1.12
29
+ Provides-Extra: chroma
30
+ Requires-Dist: chromadb>=0.5.5; extra == "chroma"
31
+ Provides-Extra: text2sql
32
+ Requires-Dist: PyYAML>=6.0; extra == "text2sql"
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
35
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # angineer-docs-core
39
+
40
+ [![PyPI](https://img.shields.io/pypi/v/angineer-docs-core)](https://pypi.org/project/angineer-docs-core/)
41
+
42
+ AnGIneer 的文档解析入库引擎(纯 Python 库):把工程规范 / PDF / Office 文档跑成
43
+ 「**可读、可查、可算、可引用**」的知识库数据——一条管线覆盖
44
+ **源文件准备 → 格式转换 → MinerU 解析 → PoPo 强化 → 结构化 → 图描述 → SQLite+FTS → 向量索引 → 知识图谱**,
45
+ 外加五路检索、text2sql 与产物导出。
46
+
47
+ | 能力 | 说明 | 靠什么 |
48
+ | :--- | :--- | :--- |
49
+ | 📖 可读 | 高保真解析 PDF,保留结构、公式、图表 | MinerU 端点(HTTP) |
50
+ | 🔍 可查 | 语义检索 + 表格精确查询 + 条款定位(五路召回 + 重排) | canonical 七表 + qdrant |
51
+ | 🧮 可算 | 公式语义、表格插值、条款计算(供上层工具消费) | 结构化的 canonical 产物 |
52
+ | 📎 可引用 | 条文 / 表格 / 图片的块级溯源 | `citation_targets` + 块 id |
53
+
54
+ > 定位:只做**数据面**(解析 / 建索引 / 图谱 / 检索),**不含 HTTP 服务与前端**。
55
+ > 大算力全部在外部服务:版面解析、视觉结构强化、图描述、embedding、rerank 都走 HTTP 端点(配置见下)。
56
+
57
+ ## 管线(9 个阶段 + 导出)
58
+
59
+ `hard` = 失败即中止;`soft` = 失败降级继续并在 `parse_stages` 留痕。
60
+
61
+ | # | 阶段 key | 名称 | 类型 | 依赖 | 做什么 |
62
+ | :-- | :--- | :--- | :--- | :--- | :--- |
63
+ | 1 | `source_prep` | 源文件准备 | hard | — | 落地源文件、登记文档节点、准备解析输入 |
64
+ | 2 | `convert` | 格式转换 | hard | source_prep | 非 PDF(doc/docx/xls…)经 LibreOffice 转 PDF |
65
+ | 3 | `raw_parse` | MinerU 解析 | hard | convert | 调 MinerU 端点(file_parse ZIP 协议),产出 markdown / 图片 / `middle.json` |
66
+ | 4 | `popo` | PoPo 强化 | **soft** | raw_parse | PoPo 做视觉结构强化,产出 enriched blocks(需 VLM 端点) |
67
+ | 5 | `structure` | 结构化 | hard | raw_parse | **Solo 是唯一构建者**;PoPo 信号只作为增强注入(对齐 / 合并 / 层级融合 / 续表) |
68
+ | 6 | `figure_describe` | 图描述 | soft | structure | VLM 描述图表内容(可关) |
69
+ | 7 | `fts` | SQLite + FTS | hard | structure | canonical 七表 + 全文索引(检索数据面) |
70
+ | 8 | `vectors` | 向量索引 | soft | fts | qdrant(默认)/ sqlite / chroma |
71
+ | 9 | `graph` | 知识图谱 | soft | structure | 实体与关系抽取入库 |
72
+
73
+ 第 10 步是产物导出(`step10_export`:按册导 markdown / 图片 / 索引 / 图谱)。
74
+
75
+ ## 安装
76
+
77
+ ```bash
78
+ pip install angineer-docs-core
79
+ # 或钉版本
80
+ pip install "angineer-docs-core @ git+https://github.com/0mao0/angineer-docs-core.git@v0.1.0"
81
+ ```
82
+
83
+ Python 要求 `>=3.10`。运行依赖:`angineer-tree-core`(树表底座)、`angineer-ai-inference`(LLM 客户端)、
84
+ `pydantic>=2`、`PyMuPDF`、`numpy`、`python-dateutil`、`qdrant-client`、`requests`、`python-dotenv`。
85
+ 可选 extras:`[chroma]`(旧向量后端)、`[text2sql]`(领域关键词 YAML)。
86
+
87
+ ## 另有外部依赖(不随包提供)
88
+
89
+ | 依赖 | 用途 | 怎么配 |
90
+ | :--- | :--- | :--- |
91
+ | MinerU 端点 | 版面解析(GPU 大头) | `MINERU_CONFIGS` |
92
+ | PoPo 端点 | 视觉结构强化 | `POPO_CONFIGS` |
93
+ | 图描述端点 | 图表描述 | `FIGURE_DESCRIBE_CONFIGS` |
94
+ | embedding 端点 | 向量化 | `EMBEDDING_CONFIGS` |
95
+ | rerank 端点 | 重排 | `RERANKER_CONFIGS` |
96
+ | Qdrant | 向量库(默认 provider) | `QDRANT_URL`(也可换 sqlite / chroma) |
97
+ | LibreOffice | 非 PDF → PDF | 系统安装,`LIBREOFFICE_BIN` 或 PATH |
98
+
99
+ ## 快速开始
100
+
101
+ ```python
102
+ import os
103
+
104
+ os.environ["KNOWLEDGE_BASE_DIR"] = "/srv/knowledge" # 数据根(也可用 ANGINEER_DATA_ROOT)
105
+ os.environ["MINERU_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/mineru","api_key":"..."}]'
106
+ os.environ["POPO_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/popo/v1","api_key":"...","model":"Popo"}]'
107
+ os.environ["DOCS_VECTORSTORE_PROVIDER"] = "qdrant"
108
+ os.environ["QDRANT_URL"] = "http://localhost:6333"
109
+
110
+ from docs_core.parse_pipeline import ParseOrchestrator
111
+
112
+ orch = ParseOrchestrator() # 不注入时用包内置的解析记录表
113
+ doc_id = orch.ensure_document("default", "/abs/path/spec.pdf") # 登记文档节点
114
+ task = orch.create_parse_task("default", doc_id, "/abs/path/spec.pdf") # 后台线程跑全链
115
+ print(task["task_id"])
116
+
117
+ orch.get_parse_task(task["task_id"]) # 查进度 / 当前阶段
118
+ orch.cancel_parse_task(task["task_id"]) # 协作式取消
119
+ orch.retry_parse_task(doc_id) # 失败重跑
120
+ ```
121
+
122
+ - 阶段级重跑与校验:`STAGE_REGISTRY` / `resolve_stage_order` / `validate_stage_retry` / `compute_resume_stages`;
123
+ - 检索侧入口:`docs_core.step09_query`(五路召回 + 重排 + text2sql);
124
+ - 知识库与节点管理:`docs_core.get_docs_service()` / `DocsService`。
125
+
126
+ ## 配置(常用)
127
+
128
+ | 变量 | 默认 | 说明 |
129
+ | :--- | :--- | :--- |
130
+ | `KNOWLEDGE_BASE_DIR` | — | **数据根(最高优先)**:元库 / 索引 / 图谱 / 文档目录都挂它下面 |
131
+ | `ANGINEER_DATA_ROOT` | — | 数据根(次优先,取 `<root>/knowledge`) |
132
+ | `ANGINEER_REPO_ROOT` | 仓库标记探测 | 仓库树根。独立安装(wheel)里没有仓库树,需要数据根请显式给上面两个之一 |
133
+ | `MINERU_CONFIGS` / `POPO_CONFIGS` / `FIGURE_DESCRIBE_CONFIGS` / `EMBEDDING_CONFIGS` / `RERANKER_CONFIGS` | — | JSON 数组,顺序=优先级,第一项为默认;连接失败/超时自动切下一项 |
134
+ | `DOCS_VECTORSTORE_PROVIDER` | —(必填) | `qdrant` / `sqlite` / `chroma`;不设会直接报错(防静默连空库) |
135
+ | `QDRANT_URL` | — | `provider=qdrant` 时必填 |
136
+ | `LIBREOFFICE_BIN` | PATH 探测 | `soffice` 路径(非 PDF 输入必需) |
137
+ | `POPO_MAX_CONCURRENCY` | 4 | PoPo 强化的并发闸(FIFO 排队) |
138
+ | `FIGURE_DESCRIBE_ENABLED` | 见 `.env.example` | 图描述开关 |
139
+
140
+ ## 包里包含什么
141
+
142
+ - **`docs_core`**:管线与数据面本体(9 阶段、canonical 存储、五路检索、图谱、导出);
143
+ - **`popo`**:PoPo fork(上游 MinerU-Popo 的定制版)随包发布,两个要点:
144
+ - 它是**顶层导入名 `popo`**(上游没有 `__init__.py`,按命名空间包收集),装完 site-packages 里会多出这个目录;
145
+ - 缺失也不报错——第 4 步按「软阶段」跳过,结构由 Solo 单独构建(质量降级、链路不断)。
146
+ 自定义位置可用 `POPO_REPO_PATH` 指定。
147
+ - 依赖 **`angineer-tree-core`** 与 **`angineer-ai-inference`**,pip 会自动带上。
148
+
149
+ ## 目录结构
150
+
151
+ ```text
152
+ services/docs-core/
153
+ ├── src/
154
+ │ ├── docs_core/
155
+ │ │ ├── paths.py # 布局:数据根 + 文档目录(纯路径计算,无 IO 副作用)
156
+ │ │ ├── docs_service.py # 门面:知识库/节点/任务落库与查询的统一入口
157
+ │ │ ├── parse_pipeline.py # 阶段注册 / 顺序 / 状态机 / 编排器
158
+ │ │ ├── models/ # 全管线共享契约(canonical 七表类型等)
159
+ │ │ ├── step01_source_prep/ # 源文件准备
160
+ │ │ ├── step02_convert2pdf/ # LibreOffice 转 PDF
161
+ │ │ ├── step03_mineru_parse/ # MinerU 解析 + PoPo 强化(popo_enhance)
162
+ │ │ ├── step04_structure/ # Solo 结构构建 + PoPo 信号消费(popo/ 六件套)
163
+ │ │ ├── step05_sqlite_fts/ # canonical SQLite + FTS(rebuild / store)
164
+ │ │ ├── step06_vectors/ # 向量索引(qdrant / sqlite / chroma + embedding 客户端)
165
+ │ │ ├── step07_graph/ # 知识图谱(实体 / 关系 / 证据包)
166
+ │ │ ├── step08_maintain/ # 巡检与维护
167
+ │ │ ├── step09_query/ # 检索(五路召回)、text2sql、对外协议
168
+ │ │ ├── step10_export/ # 产物导出
169
+ │ │ └── library_registry.py / parse_records_store.py / kb_migrator.py …
170
+ │ └── popo/ # PoPo fork(本地定制,随包发布;上游同步见 UPSTREAM_SYNC.md)
171
+ ├── tests/ # 88 个测试文件 / 500+ 用例
172
+ └── pyproject.toml
173
+ ```
174
+
175
+ ## 不在本库范围
176
+
177
+ - HTTP / API 服务(由主仓库的 docs-api 实现)、前端与管理台;
178
+ - MinerU / PoPo / VLM / embedding / rerank 的推理服务本身;
179
+ - 知识库数据的业务展示与权限。
180
+
181
+ ## 开发与测试
182
+
183
+ ```bash
184
+ pip install -e ".[dev]"
185
+ python -m pytest tests -q
186
+ ```
187
+
188
+ 独立环境(无仓库树、无 `.env`)也能跑:`tests/conftest.py` 会先按 dotenv 规则加载 `.env`(若有),
189
+ 再补缺省 —— 向量后端用 `sqlite`、数据根指向临时目录;跨服务用例(需要 docs-api)自动跳过。
190
+ 当前基线:**507 passed, 17 skipped**(无外部服务、无网络)。
191
+
192
+ ## 许可
193
+
194
+ MIT
@@ -0,0 +1,157 @@
1
+ # angineer-docs-core
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/angineer-docs-core)](https://pypi.org/project/angineer-docs-core/)
4
+
5
+ AnGIneer 的文档解析入库引擎(纯 Python 库):把工程规范 / PDF / Office 文档跑成
6
+ 「**可读、可查、可算、可引用**」的知识库数据——一条管线覆盖
7
+ **源文件准备 → 格式转换 → MinerU 解析 → PoPo 强化 → 结构化 → 图描述 → SQLite+FTS → 向量索引 → 知识图谱**,
8
+ 外加五路检索、text2sql 与产物导出。
9
+
10
+ | 能力 | 说明 | 靠什么 |
11
+ | :--- | :--- | :--- |
12
+ | 📖 可读 | 高保真解析 PDF,保留结构、公式、图表 | MinerU 端点(HTTP) |
13
+ | 🔍 可查 | 语义检索 + 表格精确查询 + 条款定位(五路召回 + 重排) | canonical 七表 + qdrant |
14
+ | 🧮 可算 | 公式语义、表格插值、条款计算(供上层工具消费) | 结构化的 canonical 产物 |
15
+ | 📎 可引用 | 条文 / 表格 / 图片的块级溯源 | `citation_targets` + 块 id |
16
+
17
+ > 定位:只做**数据面**(解析 / 建索引 / 图谱 / 检索),**不含 HTTP 服务与前端**。
18
+ > 大算力全部在外部服务:版面解析、视觉结构强化、图描述、embedding、rerank 都走 HTTP 端点(配置见下)。
19
+
20
+ ## 管线(9 个阶段 + 导出)
21
+
22
+ `hard` = 失败即中止;`soft` = 失败降级继续并在 `parse_stages` 留痕。
23
+
24
+ | # | 阶段 key | 名称 | 类型 | 依赖 | 做什么 |
25
+ | :-- | :--- | :--- | :--- | :--- | :--- |
26
+ | 1 | `source_prep` | 源文件准备 | hard | — | 落地源文件、登记文档节点、准备解析输入 |
27
+ | 2 | `convert` | 格式转换 | hard | source_prep | 非 PDF(doc/docx/xls…)经 LibreOffice 转 PDF |
28
+ | 3 | `raw_parse` | MinerU 解析 | hard | convert | 调 MinerU 端点(file_parse ZIP 协议),产出 markdown / 图片 / `middle.json` |
29
+ | 4 | `popo` | PoPo 强化 | **soft** | raw_parse | PoPo 做视觉结构强化,产出 enriched blocks(需 VLM 端点) |
30
+ | 5 | `structure` | 结构化 | hard | raw_parse | **Solo 是唯一构建者**;PoPo 信号只作为增强注入(对齐 / 合并 / 层级融合 / 续表) |
31
+ | 6 | `figure_describe` | 图描述 | soft | structure | VLM 描述图表内容(可关) |
32
+ | 7 | `fts` | SQLite + FTS | hard | structure | canonical 七表 + 全文索引(检索数据面) |
33
+ | 8 | `vectors` | 向量索引 | soft | fts | qdrant(默认)/ sqlite / chroma |
34
+ | 9 | `graph` | 知识图谱 | soft | structure | 实体与关系抽取入库 |
35
+
36
+ 第 10 步是产物导出(`step10_export`:按册导 markdown / 图片 / 索引 / 图谱)。
37
+
38
+ ## 安装
39
+
40
+ ```bash
41
+ pip install angineer-docs-core
42
+ # 或钉版本
43
+ pip install "angineer-docs-core @ git+https://github.com/0mao0/angineer-docs-core.git@v0.1.0"
44
+ ```
45
+
46
+ Python 要求 `>=3.10`。运行依赖:`angineer-tree-core`(树表底座)、`angineer-ai-inference`(LLM 客户端)、
47
+ `pydantic>=2`、`PyMuPDF`、`numpy`、`python-dateutil`、`qdrant-client`、`requests`、`python-dotenv`。
48
+ 可选 extras:`[chroma]`(旧向量后端)、`[text2sql]`(领域关键词 YAML)。
49
+
50
+ ## 另有外部依赖(不随包提供)
51
+
52
+ | 依赖 | 用途 | 怎么配 |
53
+ | :--- | :--- | :--- |
54
+ | MinerU 端点 | 版面解析(GPU 大头) | `MINERU_CONFIGS` |
55
+ | PoPo 端点 | 视觉结构强化 | `POPO_CONFIGS` |
56
+ | 图描述端点 | 图表描述 | `FIGURE_DESCRIBE_CONFIGS` |
57
+ | embedding 端点 | 向量化 | `EMBEDDING_CONFIGS` |
58
+ | rerank 端点 | 重排 | `RERANKER_CONFIGS` |
59
+ | Qdrant | 向量库(默认 provider) | `QDRANT_URL`(也可换 sqlite / chroma) |
60
+ | LibreOffice | 非 PDF → PDF | 系统安装,`LIBREOFFICE_BIN` 或 PATH |
61
+
62
+ ## 快速开始
63
+
64
+ ```python
65
+ import os
66
+
67
+ os.environ["KNOWLEDGE_BASE_DIR"] = "/srv/knowledge" # 数据根(也可用 ANGINEER_DATA_ROOT)
68
+ os.environ["MINERU_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/mineru","api_key":"..."}]'
69
+ os.environ["POPO_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/popo/v1","api_key":"...","model":"Popo"}]'
70
+ os.environ["DOCS_VECTORSTORE_PROVIDER"] = "qdrant"
71
+ os.environ["QDRANT_URL"] = "http://localhost:6333"
72
+
73
+ from docs_core.parse_pipeline import ParseOrchestrator
74
+
75
+ orch = ParseOrchestrator() # 不注入时用包内置的解析记录表
76
+ doc_id = orch.ensure_document("default", "/abs/path/spec.pdf") # 登记文档节点
77
+ task = orch.create_parse_task("default", doc_id, "/abs/path/spec.pdf") # 后台线程跑全链
78
+ print(task["task_id"])
79
+
80
+ orch.get_parse_task(task["task_id"]) # 查进度 / 当前阶段
81
+ orch.cancel_parse_task(task["task_id"]) # 协作式取消
82
+ orch.retry_parse_task(doc_id) # 失败重跑
83
+ ```
84
+
85
+ - 阶段级重跑与校验:`STAGE_REGISTRY` / `resolve_stage_order` / `validate_stage_retry` / `compute_resume_stages`;
86
+ - 检索侧入口:`docs_core.step09_query`(五路召回 + 重排 + text2sql);
87
+ - 知识库与节点管理:`docs_core.get_docs_service()` / `DocsService`。
88
+
89
+ ## 配置(常用)
90
+
91
+ | 变量 | 默认 | 说明 |
92
+ | :--- | :--- | :--- |
93
+ | `KNOWLEDGE_BASE_DIR` | — | **数据根(最高优先)**:元库 / 索引 / 图谱 / 文档目录都挂它下面 |
94
+ | `ANGINEER_DATA_ROOT` | — | 数据根(次优先,取 `<root>/knowledge`) |
95
+ | `ANGINEER_REPO_ROOT` | 仓库标记探测 | 仓库树根。独立安装(wheel)里没有仓库树,需要数据根请显式给上面两个之一 |
96
+ | `MINERU_CONFIGS` / `POPO_CONFIGS` / `FIGURE_DESCRIBE_CONFIGS` / `EMBEDDING_CONFIGS` / `RERANKER_CONFIGS` | — | JSON 数组,顺序=优先级,第一项为默认;连接失败/超时自动切下一项 |
97
+ | `DOCS_VECTORSTORE_PROVIDER` | —(必填) | `qdrant` / `sqlite` / `chroma`;不设会直接报错(防静默连空库) |
98
+ | `QDRANT_URL` | — | `provider=qdrant` 时必填 |
99
+ | `LIBREOFFICE_BIN` | PATH 探测 | `soffice` 路径(非 PDF 输入必需) |
100
+ | `POPO_MAX_CONCURRENCY` | 4 | PoPo 强化的并发闸(FIFO 排队) |
101
+ | `FIGURE_DESCRIBE_ENABLED` | 见 `.env.example` | 图描述开关 |
102
+
103
+ ## 包里包含什么
104
+
105
+ - **`docs_core`**:管线与数据面本体(9 阶段、canonical 存储、五路检索、图谱、导出);
106
+ - **`popo`**:PoPo fork(上游 MinerU-Popo 的定制版)随包发布,两个要点:
107
+ - 它是**顶层导入名 `popo`**(上游没有 `__init__.py`,按命名空间包收集),装完 site-packages 里会多出这个目录;
108
+ - 缺失也不报错——第 4 步按「软阶段」跳过,结构由 Solo 单独构建(质量降级、链路不断)。
109
+ 自定义位置可用 `POPO_REPO_PATH` 指定。
110
+ - 依赖 **`angineer-tree-core`** 与 **`angineer-ai-inference`**,pip 会自动带上。
111
+
112
+ ## 目录结构
113
+
114
+ ```text
115
+ services/docs-core/
116
+ ├── src/
117
+ │ ├── docs_core/
118
+ │ │ ├── paths.py # 布局:数据根 + 文档目录(纯路径计算,无 IO 副作用)
119
+ │ │ ├── docs_service.py # 门面:知识库/节点/任务落库与查询的统一入口
120
+ │ │ ├── parse_pipeline.py # 阶段注册 / 顺序 / 状态机 / 编排器
121
+ │ │ ├── models/ # 全管线共享契约(canonical 七表类型等)
122
+ │ │ ├── step01_source_prep/ # 源文件准备
123
+ │ │ ├── step02_convert2pdf/ # LibreOffice 转 PDF
124
+ │ │ ├── step03_mineru_parse/ # MinerU 解析 + PoPo 强化(popo_enhance)
125
+ │ │ ├── step04_structure/ # Solo 结构构建 + PoPo 信号消费(popo/ 六件套)
126
+ │ │ ├── step05_sqlite_fts/ # canonical SQLite + FTS(rebuild / store)
127
+ │ │ ├── step06_vectors/ # 向量索引(qdrant / sqlite / chroma + embedding 客户端)
128
+ │ │ ├── step07_graph/ # 知识图谱(实体 / 关系 / 证据包)
129
+ │ │ ├── step08_maintain/ # 巡检与维护
130
+ │ │ ├── step09_query/ # 检索(五路召回)、text2sql、对外协议
131
+ │ │ ├── step10_export/ # 产物导出
132
+ │ │ └── library_registry.py / parse_records_store.py / kb_migrator.py …
133
+ │ └── popo/ # PoPo fork(本地定制,随包发布;上游同步见 UPSTREAM_SYNC.md)
134
+ ├── tests/ # 88 个测试文件 / 500+ 用例
135
+ └── pyproject.toml
136
+ ```
137
+
138
+ ## 不在本库范围
139
+
140
+ - HTTP / API 服务(由主仓库的 docs-api 实现)、前端与管理台;
141
+ - MinerU / PoPo / VLM / embedding / rerank 的推理服务本身;
142
+ - 知识库数据的业务展示与权限。
143
+
144
+ ## 开发与测试
145
+
146
+ ```bash
147
+ pip install -e ".[dev]"
148
+ python -m pytest tests -q
149
+ ```
150
+
151
+ 独立环境(无仓库树、无 `.env`)也能跑:`tests/conftest.py` 会先按 dotenv 规则加载 `.env`(若有),
152
+ 再补缺省 —— 向量后端用 `sqlite`、数据根指向临时目录;跨服务用例(需要 docs-api)自动跳过。
153
+ 当前基线:**507 passed, 17 skipped**(无外部服务、无网络)。
154
+
155
+ ## 许可
156
+
157
+ MIT
@@ -0,0 +1,69 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "angineer-docs-core"
7
+ version = "0.1.0"
8
+ description = "AnGIneer docs engine: parse pipeline (source_prep -> MinerU -> PoPo -> structure -> FTS -> vectors -> graph), retrieval and export"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "AnGIneer Team"}
14
+ ]
15
+ keywords = ["rag", "document-parsing", "retrieval", "knowledge-base", "mineru"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ ]
25
+ dependencies = [
26
+ # 仓库内底座与兄弟包
27
+ "angineer-tree-core>=0.1.0,<0.2.0",
28
+ "angineer-ai-inference>=0.2.2,<0.3.0",
29
+ # 运行期硬依赖(顶层 import,缺一即 import 失败)
30
+ "pydantic>=2.0.0,<3.0.0",
31
+ "python-dotenv>=1.0.0",
32
+ "requests>=2.31.0",
33
+ "PyMuPDF>=1.23.0",
34
+ "numpy>=1.24",
35
+ "python-dateutil>=2.8",
36
+ # 默认向量后端 qdrant(qdrant-client 仅在用到时惰性 import)
37
+ "qdrant-client>=1.12",
38
+ ]
39
+
40
+ [project.optional-dependencies]
41
+ # 旧向量后端:DOCS_VECTORSTORE_PROVIDER=chroma 时才需要
42
+ chroma = ["chromadb>=0.5.5"]
43
+ # text2sql(step09)加载领域关键词 YAML 时才需要
44
+ text2sql = ["PyYAML>=6.0"]
45
+ dev = [
46
+ "pytest>=7.0.0",
47
+ "pytest-cov>=4.0.0",
48
+ ]
49
+
50
+ [tool.setuptools]
51
+ package-dir = {"" = "src"}
52
+
53
+ # popo 是随包发布的 PoPo fork(上游无 __init__.py,按命名空间包收集);
54
+ # 只收源码目录,产物目录(figures / output_cases / outputs)一律不进包。
55
+ [tool.setuptools.packages.find]
56
+ where = ["src"]
57
+ namespaces = true
58
+ include = ["docs_core*", "popo*"]
59
+ exclude = ["popo.figures*", "popo.output_cases*", "popo.outputs*"]
60
+
61
+ [project.urls]
62
+ Repository = "https://github.com/0mao0/angineer-docs-core"
63
+ Issues = "https://github.com/0mao0/angineer-docs-core/issues"
64
+
65
+ [tool.pytest.ini_options]
66
+ testpaths = ["tests"]
67
+ python_files = ["test_*.py"]
68
+ python_classes = ["Test*"]
69
+ python_functions = ["test_*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,194 @@
1
+ Metadata-Version: 2.4
2
+ Name: angineer-docs-core
3
+ Version: 0.1.0
4
+ Summary: AnGIneer docs engine: parse pipeline (source_prep -> MinerU -> PoPo -> structure -> FTS -> vectors -> graph), retrieval and export
5
+ Author: AnGIneer Team
6
+ License: MIT
7
+ Project-URL: Repository, https://github.com/0mao0/angineer-docs-core
8
+ Project-URL: Issues, https://github.com/0mao0/angineer-docs-core/issues
9
+ Keywords: rag,document-parsing,retrieval,knowledge-base,mineru
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: angineer-tree-core<0.2.0,>=0.1.0
21
+ Requires-Dist: angineer-ai-inference<0.3.0,>=0.2.2
22
+ Requires-Dist: pydantic<3.0.0,>=2.0.0
23
+ Requires-Dist: python-dotenv>=1.0.0
24
+ Requires-Dist: requests>=2.31.0
25
+ Requires-Dist: PyMuPDF>=1.23.0
26
+ Requires-Dist: numpy>=1.24
27
+ Requires-Dist: python-dateutil>=2.8
28
+ Requires-Dist: qdrant-client>=1.12
29
+ Provides-Extra: chroma
30
+ Requires-Dist: chromadb>=0.5.5; extra == "chroma"
31
+ Provides-Extra: text2sql
32
+ Requires-Dist: PyYAML>=6.0; extra == "text2sql"
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
35
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # angineer-docs-core
39
+
40
+ [![PyPI](https://img.shields.io/pypi/v/angineer-docs-core)](https://pypi.org/project/angineer-docs-core/)
41
+
42
+ AnGIneer 的文档解析入库引擎(纯 Python 库):把工程规范 / PDF / Office 文档跑成
43
+ 「**可读、可查、可算、可引用**」的知识库数据——一条管线覆盖
44
+ **源文件准备 → 格式转换 → MinerU 解析 → PoPo 强化 → 结构化 → 图描述 → SQLite+FTS → 向量索引 → 知识图谱**,
45
+ 外加五路检索、text2sql 与产物导出。
46
+
47
+ | 能力 | 说明 | 靠什么 |
48
+ | :--- | :--- | :--- |
49
+ | 📖 可读 | 高保真解析 PDF,保留结构、公式、图表 | MinerU 端点(HTTP) |
50
+ | 🔍 可查 | 语义检索 + 表格精确查询 + 条款定位(五路召回 + 重排) | canonical 七表 + qdrant |
51
+ | 🧮 可算 | 公式语义、表格插值、条款计算(供上层工具消费) | 结构化的 canonical 产物 |
52
+ | 📎 可引用 | 条文 / 表格 / 图片的块级溯源 | `citation_targets` + 块 id |
53
+
54
+ > 定位:只做**数据面**(解析 / 建索引 / 图谱 / 检索),**不含 HTTP 服务与前端**。
55
+ > 大算力全部在外部服务:版面解析、视觉结构强化、图描述、embedding、rerank 都走 HTTP 端点(配置见下)。
56
+
57
+ ## 管线(9 个阶段 + 导出)
58
+
59
+ `hard` = 失败即中止;`soft` = 失败降级继续并在 `parse_stages` 留痕。
60
+
61
+ | # | 阶段 key | 名称 | 类型 | 依赖 | 做什么 |
62
+ | :-- | :--- | :--- | :--- | :--- | :--- |
63
+ | 1 | `source_prep` | 源文件准备 | hard | — | 落地源文件、登记文档节点、准备解析输入 |
64
+ | 2 | `convert` | 格式转换 | hard | source_prep | 非 PDF(doc/docx/xls…)经 LibreOffice 转 PDF |
65
+ | 3 | `raw_parse` | MinerU 解析 | hard | convert | 调 MinerU 端点(file_parse ZIP 协议),产出 markdown / 图片 / `middle.json` |
66
+ | 4 | `popo` | PoPo 强化 | **soft** | raw_parse | PoPo 做视觉结构强化,产出 enriched blocks(需 VLM 端点) |
67
+ | 5 | `structure` | 结构化 | hard | raw_parse | **Solo 是唯一构建者**;PoPo 信号只作为增强注入(对齐 / 合并 / 层级融合 / 续表) |
68
+ | 6 | `figure_describe` | 图描述 | soft | structure | VLM 描述图表内容(可关) |
69
+ | 7 | `fts` | SQLite + FTS | hard | structure | canonical 七表 + 全文索引(检索数据面) |
70
+ | 8 | `vectors` | 向量索引 | soft | fts | qdrant(默认)/ sqlite / chroma |
71
+ | 9 | `graph` | 知识图谱 | soft | structure | 实体与关系抽取入库 |
72
+
73
+ 第 10 步是产物导出(`step10_export`:按册导 markdown / 图片 / 索引 / 图谱)。
74
+
75
+ ## 安装
76
+
77
+ ```bash
78
+ pip install angineer-docs-core
79
+ # 或钉版本
80
+ pip install "angineer-docs-core @ git+https://github.com/0mao0/angineer-docs-core.git@v0.1.0"
81
+ ```
82
+
83
+ Python 要求 `>=3.10`。运行依赖:`angineer-tree-core`(树表底座)、`angineer-ai-inference`(LLM 客户端)、
84
+ `pydantic>=2`、`PyMuPDF`、`numpy`、`python-dateutil`、`qdrant-client`、`requests`、`python-dotenv`。
85
+ 可选 extras:`[chroma]`(旧向量后端)、`[text2sql]`(领域关键词 YAML)。
86
+
87
+ ## 另有外部依赖(不随包提供)
88
+
89
+ | 依赖 | 用途 | 怎么配 |
90
+ | :--- | :--- | :--- |
91
+ | MinerU 端点 | 版面解析(GPU 大头) | `MINERU_CONFIGS` |
92
+ | PoPo 端点 | 视觉结构强化 | `POPO_CONFIGS` |
93
+ | 图描述端点 | 图表描述 | `FIGURE_DESCRIBE_CONFIGS` |
94
+ | embedding 端点 | 向量化 | `EMBEDDING_CONFIGS` |
95
+ | rerank 端点 | 重排 | `RERANKER_CONFIGS` |
96
+ | Qdrant | 向量库(默认 provider) | `QDRANT_URL`(也可换 sqlite / chroma) |
97
+ | LibreOffice | 非 PDF → PDF | 系统安装,`LIBREOFFICE_BIN` 或 PATH |
98
+
99
+ ## 快速开始
100
+
101
+ ```python
102
+ import os
103
+
104
+ os.environ["KNOWLEDGE_BASE_DIR"] = "/srv/knowledge" # 数据根(也可用 ANGINEER_DATA_ROOT)
105
+ os.environ["MINERU_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/mineru","api_key":"..."}]'
106
+ os.environ["POPO_CONFIGS"] = '[{"name":"dgx","url":"https://your-gateway/api/popo/v1","api_key":"...","model":"Popo"}]'
107
+ os.environ["DOCS_VECTORSTORE_PROVIDER"] = "qdrant"
108
+ os.environ["QDRANT_URL"] = "http://localhost:6333"
109
+
110
+ from docs_core.parse_pipeline import ParseOrchestrator
111
+
112
+ orch = ParseOrchestrator() # 不注入时用包内置的解析记录表
113
+ doc_id = orch.ensure_document("default", "/abs/path/spec.pdf") # 登记文档节点
114
+ task = orch.create_parse_task("default", doc_id, "/abs/path/spec.pdf") # 后台线程跑全链
115
+ print(task["task_id"])
116
+
117
+ orch.get_parse_task(task["task_id"]) # 查进度 / 当前阶段
118
+ orch.cancel_parse_task(task["task_id"]) # 协作式取消
119
+ orch.retry_parse_task(doc_id) # 失败重跑
120
+ ```
121
+
122
+ - 阶段级重跑与校验:`STAGE_REGISTRY` / `resolve_stage_order` / `validate_stage_retry` / `compute_resume_stages`;
123
+ - 检索侧入口:`docs_core.step09_query`(五路召回 + 重排 + text2sql);
124
+ - 知识库与节点管理:`docs_core.get_docs_service()` / `DocsService`。
125
+
126
+ ## 配置(常用)
127
+
128
+ | 变量 | 默认 | 说明 |
129
+ | :--- | :--- | :--- |
130
+ | `KNOWLEDGE_BASE_DIR` | — | **数据根(最高优先)**:元库 / 索引 / 图谱 / 文档目录都挂它下面 |
131
+ | `ANGINEER_DATA_ROOT` | — | 数据根(次优先,取 `<root>/knowledge`) |
132
+ | `ANGINEER_REPO_ROOT` | 仓库标记探测 | 仓库树根。独立安装(wheel)里没有仓库树,需要数据根请显式给上面两个之一 |
133
+ | `MINERU_CONFIGS` / `POPO_CONFIGS` / `FIGURE_DESCRIBE_CONFIGS` / `EMBEDDING_CONFIGS` / `RERANKER_CONFIGS` | — | JSON 数组,顺序=优先级,第一项为默认;连接失败/超时自动切下一项 |
134
+ | `DOCS_VECTORSTORE_PROVIDER` | —(必填) | `qdrant` / `sqlite` / `chroma`;不设会直接报错(防静默连空库) |
135
+ | `QDRANT_URL` | — | `provider=qdrant` 时必填 |
136
+ | `LIBREOFFICE_BIN` | PATH 探测 | `soffice` 路径(非 PDF 输入必需) |
137
+ | `POPO_MAX_CONCURRENCY` | 4 | PoPo 强化的并发闸(FIFO 排队) |
138
+ | `FIGURE_DESCRIBE_ENABLED` | 见 `.env.example` | 图描述开关 |
139
+
140
+ ## 包里包含什么
141
+
142
+ - **`docs_core`**:管线与数据面本体(9 阶段、canonical 存储、五路检索、图谱、导出);
143
+ - **`popo`**:PoPo fork(上游 MinerU-Popo 的定制版)随包发布,两个要点:
144
+ - 它是**顶层导入名 `popo`**(上游没有 `__init__.py`,按命名空间包收集),装完 site-packages 里会多出这个目录;
145
+ - 缺失也不报错——第 4 步按「软阶段」跳过,结构由 Solo 单独构建(质量降级、链路不断)。
146
+ 自定义位置可用 `POPO_REPO_PATH` 指定。
147
+ - 依赖 **`angineer-tree-core`** 与 **`angineer-ai-inference`**,pip 会自动带上。
148
+
149
+ ## 目录结构
150
+
151
+ ```text
152
+ services/docs-core/
153
+ ├── src/
154
+ │ ├── docs_core/
155
+ │ │ ├── paths.py # 布局:数据根 + 文档目录(纯路径计算,无 IO 副作用)
156
+ │ │ ├── docs_service.py # 门面:知识库/节点/任务落库与查询的统一入口
157
+ │ │ ├── parse_pipeline.py # 阶段注册 / 顺序 / 状态机 / 编排器
158
+ │ │ ├── models/ # 全管线共享契约(canonical 七表类型等)
159
+ │ │ ├── step01_source_prep/ # 源文件准备
160
+ │ │ ├── step02_convert2pdf/ # LibreOffice 转 PDF
161
+ │ │ ├── step03_mineru_parse/ # MinerU 解析 + PoPo 强化(popo_enhance)
162
+ │ │ ├── step04_structure/ # Solo 结构构建 + PoPo 信号消费(popo/ 六件套)
163
+ │ │ ├── step05_sqlite_fts/ # canonical SQLite + FTS(rebuild / store)
164
+ │ │ ├── step06_vectors/ # 向量索引(qdrant / sqlite / chroma + embedding 客户端)
165
+ │ │ ├── step07_graph/ # 知识图谱(实体 / 关系 / 证据包)
166
+ │ │ ├── step08_maintain/ # 巡检与维护
167
+ │ │ ├── step09_query/ # 检索(五路召回)、text2sql、对外协议
168
+ │ │ ├── step10_export/ # 产物导出
169
+ │ │ └── library_registry.py / parse_records_store.py / kb_migrator.py …
170
+ │ └── popo/ # PoPo fork(本地定制,随包发布;上游同步见 UPSTREAM_SYNC.md)
171
+ ├── tests/ # 88 个测试文件 / 500+ 用例
172
+ └── pyproject.toml
173
+ ```
174
+
175
+ ## 不在本库范围
176
+
177
+ - HTTP / API 服务(由主仓库的 docs-api 实现)、前端与管理台;
178
+ - MinerU / PoPo / VLM / embedding / rerank 的推理服务本身;
179
+ - 知识库数据的业务展示与权限。
180
+
181
+ ## 开发与测试
182
+
183
+ ```bash
184
+ pip install -e ".[dev]"
185
+ python -m pytest tests -q
186
+ ```
187
+
188
+ 独立环境(无仓库树、无 `.env`)也能跑:`tests/conftest.py` 会先按 dotenv 规则加载 `.env`(若有),
189
+ 再补缺省 —— 向量后端用 `sqlite`、数据根指向临时目录;跨服务用例(需要 docs-api)自动跳过。
190
+ 当前基线:**507 passed, 17 skipped**(无外部服务、无网络)。
191
+
192
+ ## 许可
193
+
194
+ MIT