by-qa 0.4.4.dev1__tar.gz → 0.4.4.dev3__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 (213) hide show
  1. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/PKG-INFO +1 -1
  2. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/pyproject.toml +1 -1
  3. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/api/routes.py +70 -9
  4. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/api/schemas.py +15 -0
  5. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_fs_entry_repository.py +15 -0
  6. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_base_service.py +24 -1
  7. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/uv.lock +2 -2
  8. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/.env.example +0 -0
  9. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/.github/workflows/ci.yml +0 -0
  10. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/.github/workflows/release.yml +0 -0
  11. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/.gitignore +0 -0
  12. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/.pre-commit-config.yaml +0 -0
  13. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/AGENTS.md +0 -0
  14. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/CLAUDE.md +0 -0
  15. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/CONTEXT.md +0 -0
  16. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/Dockerfile +0 -0
  17. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/LICENSE +0 -0
  18. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/Makefile +0 -0
  19. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/README.md +0 -0
  20. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/README_zh.md +0 -0
  21. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/docker/minio/init/init-minio.sh +0 -0
  22. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/docker/opengauss/custom/Dockerfile +0 -0
  23. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/docker/opengauss/init/init-opengauss.sh +0 -0
  24. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/docker-compose.kb-stack.yml +0 -0
  25. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/eval/__init__.py +0 -0
  26. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/eval/cli.py +0 -0
  27. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/eval/judge.py +0 -0
  28. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/eval/models.py +0 -0
  29. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/eval/runner.py +0 -0
  30. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/pylintrc +0 -0
  31. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/pytest.ini +0 -0
  32. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/__init__.py +0 -0
  33. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/config.py +0 -0
  34. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/core/__init__.py +0 -0
  35. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/core/exceptions.py +0 -0
  36. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/core/framework_client.py +0 -0
  37. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/core/logger.py +0 -0
  38. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/core/model_config.py +0 -0
  39. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/__init__.py +0 -0
  40. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/api/__init__.py +0 -0
  41. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/api/knowledge_entity_schemas.py +0 -0
  42. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/api/metadata_schemas.py +0 -0
  43. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/build_status.py +0 -0
  44. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/dsl/__init__.py +0 -0
  45. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/dsl/compiler.py +0 -0
  46. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/dsl/errors.py +0 -0
  47. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/dsl/validator.py +0 -0
  48. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/events.py +0 -0
  49. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/__init__.py +0 -0
  50. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/database.py +0 -0
  51. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/object_storage.py +0 -0
  52. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/runtime.py +0 -0
  53. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/storage.py +0 -0
  54. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/infrastructure/storage_s3.py +0 -0
  55. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/metadata_types.py +0 -0
  56. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/__init__.py +0 -0
  57. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/file_metadata_value_repository.py +0 -0
  58. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_base_repository.py +0 -0
  59. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_build_acceptance_repository.py +0 -0
  60. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_build_batch_repository.py +0 -0
  61. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_build_task_repository.py +0 -0
  62. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_entity_asset_repository.py +0 -0
  63. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_entity_repository.py +0 -0
  64. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_fetch_cache_repository.py +0 -0
  65. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_file_reference_repository.py +0 -0
  66. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_file_update_timeline_repository.py +0 -0
  67. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_item_chunk_repository.py +0 -0
  68. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_item_search_repository.py +0 -0
  69. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_semantic_processing_batch_repository.py +0 -0
  70. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/knowledge_semantic_processing_task_repository.py +0 -0
  71. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/metadata_search_repository.py +0 -0
  72. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/processing_task_query_repository.py +0 -0
  73. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/repositories/retrieval_projection_repository.py +0 -0
  74. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/__init__.py +0 -0
  75. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/bootstrap_service.py +0 -0
  76. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/cache_file_lock.py +0 -0
  77. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/document_update_service.py +0 -0
  78. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/embedding_query_service.py +0 -0
  79. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/entry_metadata.py +0 -0
  80. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/errors.py +0 -0
  81. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_background_runner.py +0 -0
  82. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_execution_service.py +0 -0
  83. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_models.py +0 -0
  84. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_mutation_service.py +0 -0
  85. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_processing_service.py +0 -0
  86. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_build_terminal_event_service.py +0 -0
  87. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_metadata_query_service.py +0 -0
  88. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/file_metadata_update_service.py +0 -0
  89. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_document_metadata.py +0 -0
  90. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_background_runner.py +0 -0
  91. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_discovery.py +0 -0
  92. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_enrichment.py +0 -0
  93. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_intelligence.py +0 -0
  94. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_processing_service.py +0 -0
  95. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_synonym_resolution.py +0 -0
  96. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_entity_task_worker.py +0 -0
  97. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_fetch_cache_cleanup_service.py +0 -0
  98. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_item_ingestion_service.py +0 -0
  99. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/knowledge_item_search_service.py +0 -0
  100. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/markdown_front_matter.py +0 -0
  101. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/markdown_reference_resolver.py +0 -0
  102. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/markdown_reference_rewriter.py +0 -0
  103. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/markdown_update_summary_service.py +0 -0
  104. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/metadata_search_service.py +0 -0
  105. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/semantic_task_mutation_service.py +0 -0
  106. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/services/zip_batch_import_service.py +0 -0
  107. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/000_extensions.sql +0 -0
  108. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/001_knowledge_base.sql +0 -0
  109. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/002_knowledge_fs_entry.sql +0 -0
  110. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/003_knowledge_chunk.sql +0 -0
  111. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/004_retrieval_projection.sql +0 -0
  112. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/005_knowledge_fetch_cache_index.sql +0 -0
  113. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/006_knowledge_build_task.sql +0 -0
  114. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/009_knowledge_fs_entry_indexes.sql +0 -0
  115. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/010_knowledge_chunk_indexes.sql +0 -0
  116. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/011_retrieval_projection_indexes.sql +0 -0
  117. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/012_knowledge_fetch_cache_index_indexes.sql +0 -0
  118. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/013_knowledge_build_task_indexes.sql +0 -0
  119. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/014_embedding_table.sql.tpl +0 -0
  120. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/015_metadata_property_def.sql +0 -0
  121. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/016_metadata_property_def_indexes.sql +0 -0
  122. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/017_file_metadata_value.sql +0 -0
  123. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/018_file_metadata_value_indexes.sql +0 -0
  124. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/019_knowledge_fs_entry_virtual_path.sql +0 -0
  125. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/020_knowledge_fs_entry_virtual_path_indexes.sql +0 -0
  126. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/021_knowledge_fs_entry_virtual_path_backfill.sql +0 -0
  127. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/022_knowledge_fs_entry_top_level_sibling_unique.sql +0 -0
  128. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/023_metadata_property_def_name_unique.sql +0 -0
  129. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/024_knowledge_base_name_unique.sql +0 -0
  130. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/025_metadata_value_self_contained_migration.sql +0 -0
  131. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/026_knowledge_file_reference.sql +0 -0
  132. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/027_knowledge_file_update_timeline.sql +0 -0
  133. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/028_knowledge_fs_entry_checksum_index.sql +0 -0
  134. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/029_knowledge_semantic_processing_task.sql +0 -0
  135. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/030_knowledge_file_reference_semantic_extension.sql +0 -0
  136. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/031_knowledge_file_document_kind_backfill.sql +0 -0
  137. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/032_knowledge_schema_migration.sql +0 -0
  138. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/033_knowledge_entity.sql +0 -0
  139. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/034_knowledge_entity_embedding_table.sql.tpl +0 -0
  140. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/035_knowledge_entity_discovery_schema.sql +0 -0
  141. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/036_knowledge_entity_embedding_full_only.sql.tpl +0 -0
  142. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/037_knowledge_semantic_processing_directory_scope.sql +0 -0
  143. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/038_knowledge_build_batch.sql +0 -0
  144. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/039_knowledge_build_task_background_extension.sql +0 -0
  145. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/040_knowledge_build_task_legacy_backfill.sql.tpl +0 -0
  146. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/041_knowledge_build_task_active_constraints.sql +0 -0
  147. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_base/sql/042_knowledge_fs_entry_upload_uniqueness.sql +0 -0
  148. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_build/__init__.py +0 -0
  149. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_build/runtime.py +0 -0
  150. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_build/services/__init__.py +0 -0
  151. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_build/services/document_chunking_service.py +0 -0
  152. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_build/services/heading_patterns.py +0 -0
  153. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/__init__.py +0 -0
  154. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/exceptions.py +0 -0
  155. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/kb_path_utils.py +0 -0
  156. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/markdown_reference.py +0 -0
  157. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/schemas.py +0 -0
  158. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/knowledge_common/text_segmentation.py +0 -0
  159. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/main.py +0 -0
  160. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/__init__.py +0 -0
  161. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/__init__.py +0 -0
  162. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/answer_synthesizer.py +0 -0
  163. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/multi_hop_react.py +0 -0
  164. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/multi_hop_summarizer.py +0 -0
  165. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/query_decomposer.py +0 -0
  166. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/recursion_fallback.py +0 -0
  167. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/single_hop_react.py +0 -0
  168. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/standalone_question_rewriter.py +0 -0
  169. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/agents/subanswer_aggregator.py +0 -0
  170. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/__init__.py +0 -0
  171. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/base_engine.py +0 -0
  172. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/config.py +0 -0
  173. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/context.py +0 -0
  174. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/context_manager.py +0 -0
  175. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/event_filter.py +0 -0
  176. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/exceptions.py +0 -0
  177. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/fallback_messages.py +0 -0
  178. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/messages.py +0 -0
  179. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/middleware/__init__.py +0 -0
  180. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/middleware/tool_call_guard.py +0 -0
  181. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/models.py +0 -0
  182. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/operation_registry.py +0 -0
  183. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/prompt_fragments.py +0 -0
  184. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/reducers.py +0 -0
  185. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/common/state.py +0 -0
  186. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/__init__.py +0 -0
  187. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/__init__.py +0 -0
  188. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/engine.py +0 -0
  189. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/graph.py +0 -0
  190. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/nodes/__init__.py +0 -0
  191. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/nodes/retrieve.py +0 -0
  192. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/state.py +0 -0
  193. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/fast/types.py +0 -0
  194. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/__init__.py +0 -0
  195. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/engine.py +0 -0
  196. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/graph.py +0 -0
  197. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/nodes/__init__.py +0 -0
  198. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/nodes/final_answer.py +0 -0
  199. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/nodes/router.py +0 -0
  200. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/nodes/state_cleanup.py +0 -0
  201. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/state.py +0 -0
  202. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/engines/instant/types.py +0 -0
  203. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/services/__init__.py +0 -0
  204. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/services/checkpointer_factory.py +0 -0
  205. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/services/llm_service.py +0 -0
  206. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/services/opengauss_checkpointer.py +0 -0
  207. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/services/session_history.py +0 -0
  208. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/__init__.py +0 -0
  209. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/dsl_guide.py +0 -0
  210. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/knowledge_tools.py +0 -0
  211. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/operations/__init__.py +0 -0
  212. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/operations/base.py +0 -0
  213. {by_qa-0.4.4.dev1 → by_qa-0.4.4.dev3}/src/by_qa/qa/tools/operations/knowledge_search.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: by-qa
3
- Version: 0.4.4.dev1
3
+ Version: 0.4.4.dev3
4
4
  Summary: Open-source knowledge-base ingestion and retrieval service.
5
5
  Author: AI Assistant
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "by-qa"
7
- version = "0.4.4.dev1"
7
+ version = "0.4.4.dev3"
8
8
  description = "Open-source knowledge-base ingestion and retrieval service."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -42,6 +42,7 @@ from by_qa.knowledge_base.api.schemas import (
42
42
  DocumentUpdateRequest,
43
43
  FileBuildStatusRequest,
44
44
  FileToMarkdownIndexRequest,
45
+ KnowledgeBaseFileCountRequest,
45
46
  KnowledgeItemDownloadRequest,
46
47
  KnowledgeItemGlobRequest,
47
48
  KnowledgeItemListDirRequest,
@@ -98,15 +99,17 @@ def _documented_error_response(
98
99
  result_msg: str,
99
100
  result_object: dict[str, Any] | None = None,
100
101
  status_code: int = 422,
102
+ preserve_http_status: bool = False,
101
103
  ) -> JSONResponse:
102
- """Return the documented error envelope with HTTP status normalized to 200."""
103
- logger.info(
104
- "knowledge_base error response normalized to HTTP 200: business_status_code=%s, result_msg=%s",
105
- status_code,
106
- result_msg,
107
- )
104
+ """Return the error envelope, normalizing legacy endpoints to HTTP 200."""
105
+ if not preserve_http_status:
106
+ logger.info(
107
+ "knowledge_base error response normalized to HTTP 200: business_status_code=%s, result_msg=%s",
108
+ status_code,
109
+ result_msg,
110
+ )
108
111
  return JSONResponse(
109
- status_code=200,
112
+ status_code=status_code if preserve_http_status else 200,
110
113
  content=jsonable_encoder(
111
114
  {
112
115
  "resultCode": "-1",
@@ -501,6 +504,61 @@ def register_routes(
501
504
  )
502
505
  return _documented_success_response(result_object={})
503
506
 
507
+ @app.post(
508
+ "/api/v1/knowledgeBases/fileCount",
509
+ openapi_extra={
510
+ "requestBody": {
511
+ "required": True,
512
+ "content": {
513
+ "application/json": {
514
+ "schema": KnowledgeBaseFileCountRequest.model_json_schema(
515
+ by_alias=True
516
+ )
517
+ }
518
+ },
519
+ }
520
+ },
521
+ )
522
+ async def knowledge_base_file_count(http_request: Request):
523
+ # Parse locally so malformed bodies also honor this endpoint's HTTP 422
524
+ # contract rather than the application's legacy HTTP 200 error handler.
525
+ try:
526
+ request = KnowledgeBaseFileCountRequest.model_validate(
527
+ await http_request.json()
528
+ )
529
+ except ValueError:
530
+ return _documented_error_response(
531
+ result_msg="request validation failed",
532
+ status_code=422,
533
+ preserve_http_status=True,
534
+ )
535
+
536
+ logger.info(
537
+ "knowledge_base_file_count request received: kb_code=%s", request.kb_code
538
+ )
539
+ try:
540
+ service = await get_knowledge_base_service()
541
+ result = await service.file_count(request)
542
+ except KnowledgeBaseConfigurationError as exc:
543
+ return _documented_error_response(
544
+ result_msg=str(exc), status_code=503, preserve_http_status=True
545
+ )
546
+ except KnowledgeBaseValidationError as exc:
547
+ return _documented_error_response(
548
+ result_msg=str(exc), status_code=422, preserve_http_status=True
549
+ )
550
+ except Exception as exc:
551
+ logger.exception(
552
+ "knowledge_base_file_count unexpected error: kb_code=%s",
553
+ request.kb_code,
554
+ )
555
+ return _documented_error_response(
556
+ result_msg=str(exc) or "internal error",
557
+ status_code=500,
558
+ preserve_http_status=True,
559
+ )
560
+ return _documented_success_response(result_object=result)
561
+
504
562
  @app.post("/api/v1/directories/create")
505
563
  async def create_directory(
506
564
  background_tasks: BackgroundTasks,
@@ -694,6 +752,7 @@ def register_routes(
694
752
  file_description: str | None = Body(None, alias="fileDescription"),
695
753
  file_content: UploadFile | None = File(None, alias="fileContent"),
696
754
  process_front_matter: bool = Form(True, alias="processFrontMatter"),
755
+ extract_zip: bool = Form(True, alias="extractZip"),
697
756
  skip_if_duplicate: bool = Form(False, alias="skipIfDuplicate"),
698
757
  metadata: str | None = Form(None, alias="metadata"),
699
758
  ):
@@ -709,6 +768,7 @@ def register_routes(
709
768
  file_content.content_type if file_content is not None else None
710
769
  ),
711
770
  "processFrontMatter": process_front_matter,
771
+ "extractZip": extract_zip,
712
772
  "skipIfDuplicate": skip_if_duplicate,
713
773
  "metadata": _parse_optional_metadata_form(metadata),
714
774
  }
@@ -724,16 +784,17 @@ def register_routes(
724
784
  status_code=422,
725
785
  )
726
786
  logger.info(
727
- "upload_file request received: kb_code=%s, file_path=%s, has_description=%s, process_front_matter=%s",
787
+ "upload_file request received: kb_code=%s, file_path=%s, has_description=%s, process_front_matter=%s, extract_zip=%s",
728
788
  request.kb_code,
729
789
  request.file_path,
730
790
  request.file_description is not None,
731
791
  request.process_front_matter,
792
+ request.extract_zip,
732
793
  )
733
794
  filename = (file_content.filename or "") if file_content is not None else ""
734
795
  try:
735
796
  service = await get_knowledge_item_ingestion_service()
736
- if filename.lower().endswith(".zip"):
797
+ if request.extract_zip and filename.lower().endswith(".zip"):
737
798
  if not zipfile.is_zipfile(io.BytesIO(payload or b"")):
738
799
  return _documented_error_response(
739
800
  result_msg="invalid zip file",
@@ -54,6 +54,17 @@ class DeleteKnowledgeBaseRequest(BaseModel):
54
54
  )
55
55
 
56
56
 
57
+ class KnowledgeBaseFileCountRequest(BaseModel):
58
+ """Request body for counting all live files in a knowledge base."""
59
+
60
+ model_config = ConfigDict(populate_by_name=True)
61
+
62
+ kb_code: str = Field(
63
+ min_length=1,
64
+ validation_alias=AliasChoices("knCode", "kb_code"),
65
+ )
66
+
67
+
57
68
  class UpdateKnowledgeBaseRequest(BaseModel):
58
69
  """Request body for updating knowledge base business fields."""
59
70
 
@@ -329,6 +340,10 @@ class KnowledgeItemUploadRequest(BaseModel):
329
340
  default=True,
330
341
  validation_alias=AliasChoices("processFrontMatter", "process_front_matter"),
331
342
  )
343
+ extract_zip: bool = Field(
344
+ default=True,
345
+ validation_alias=AliasChoices("extractZip", "extract_zip"),
346
+ )
332
347
  metadata: dict[str, Any] | None = None
333
348
  skip_if_duplicate: bool = Field(
334
349
  default=False,
@@ -1261,6 +1261,21 @@ class KnowledgeFsEntryRepository:
1261
1261
  )
1262
1262
  return [dict(row) for row in await self._fetchall(cursor)]
1263
1263
 
1264
+ async def count_file_entries_by_knowledge_base_id(
1265
+ self, cursor, *, knowledge_base_id: int
1266
+ ) -> int:
1267
+ """Count all live files, regardless of directory depth or build state."""
1268
+ await cursor.execute(
1269
+ """SELECT COUNT(*) AS file_count
1270
+ FROM knowledge_fs_entry
1271
+ WHERE knowledge_base_id = %(knowledge_base_id)s
1272
+ AND is_deleted = FALSE
1273
+ AND entry_type = 'FILE'""",
1274
+ {"knowledge_base_id": knowledge_base_id},
1275
+ )
1276
+ row = await cursor.fetchone()
1277
+ return int(row["file_count"])
1278
+
1264
1279
  async def list_file_entries_by_knowledge_base_id(
1265
1280
  self, cursor, *, knowledge_base_id: int
1266
1281
  ) -> list[dict[str, Any]]:
@@ -19,6 +19,7 @@ from by_qa.knowledge_base.api.schemas import (
19
19
  DeleteDirectoryRequest,
20
20
  DeleteKnowledgeBaseRequest,
21
21
  FileBuildStatusRequest,
22
+ KnowledgeBaseFileCountRequest,
22
23
  KnowledgeItemDownloadRequest,
23
24
  KnowledgeItemGlobRequest,
24
25
  KnowledgeItemListDirItem,
@@ -150,7 +151,8 @@ class KnowledgeBaseService:
150
151
  completed_build_batch_ids: list[str] = []
151
152
  terminated_semantic_tasks: list[dict[str, Any]] = []
152
153
  completed_semantic_batches: dict[
153
- str, tuple[dict[str, Any], dict[str, int]]
154
+ str,
155
+ tuple[dict[str, Any], dict[str, int]],
154
156
  ] = {}
155
157
  try:
156
158
  cursor = connection.cursor()
@@ -989,6 +991,27 @@ class KnowledgeBaseService:
989
991
  return target_path
990
992
  return target_path.rstrip("/") + current_path[len(source_path.rstrip("/")) :]
991
993
 
994
+ async def file_count(
995
+ self, request: KnowledgeBaseFileCountRequest
996
+ ) -> dict[str, int]:
997
+ """Return the number of non-deleted files in an active knowledge base."""
998
+ connection = await self.connection_factory()
999
+ try:
1000
+ cursor = connection.cursor()
1001
+ kb_row = await self.knowledge_base_repository.get_by_code(
1002
+ cursor, request.kb_code
1003
+ )
1004
+ if not kb_row:
1005
+ raise KnowledgeBaseValidationError(
1006
+ f"knowledge base not found: {request.kb_code}"
1007
+ )
1008
+ count = await self.knowledge_fs_entry_repository.count_file_entries_by_knowledge_base_id(
1009
+ cursor, knowledge_base_id=self._row_id(kb_row)
1010
+ )
1011
+ return {"fileCount": count}
1012
+ finally:
1013
+ await connection.close()
1014
+
992
1015
  async def list_dir(
993
1016
  self, request: KnowledgeItemListDirRequest
994
1017
  ) -> KnowledgeItemListDirResponse:
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 3
2
+ revision = 5
3
3
  requires-python = ">=3.12"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.14' and sys_platform == 'win32'",
@@ -313,7 +313,7 @@ wheels = [
313
313
 
314
314
  [[package]]
315
315
  name = "by-qa"
316
- version = "0.4.4.dev1"
316
+ version = "0.4.4.dev3"
317
317
  source = { editable = "." }
318
318
  dependencies = [
319
319
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes