by-qa 0.4.4.dev4__tar.gz → 0.4.4.dev5__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. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/PKG-INFO +1 -1
  2. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/pyproject.toml +1 -1
  3. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/api/routes.py +62 -0
  4. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/api/schemas.py +31 -2
  5. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_fs_entry_repository.py +22 -0
  6. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_base_service.py +35 -1
  7. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/uv.lock +1 -1
  8. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/.env.example +0 -0
  9. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/.github/workflows/ci.yml +0 -0
  10. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/.github/workflows/release.yml +0 -0
  11. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/.gitignore +0 -0
  12. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/.pre-commit-config.yaml +0 -0
  13. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/AGENTS.md +0 -0
  14. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/CLAUDE.md +0 -0
  15. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/CONTEXT.md +0 -0
  16. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/Dockerfile +0 -0
  17. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/LICENSE +0 -0
  18. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/Makefile +0 -0
  19. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/README.md +0 -0
  20. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/README_zh.md +0 -0
  21. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/docker/minio/init/init-minio.sh +0 -0
  22. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/docker/opengauss/custom/Dockerfile +0 -0
  23. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/docker/opengauss/init/init-opengauss.sh +0 -0
  24. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/docker-compose.kb-stack.yml +0 -0
  25. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/eval/__init__.py +0 -0
  26. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/eval/cli.py +0 -0
  27. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/eval/judge.py +0 -0
  28. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/eval/models.py +0 -0
  29. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/eval/runner.py +0 -0
  30. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/pylintrc +0 -0
  31. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/pytest.ini +0 -0
  32. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/__init__.py +0 -0
  33. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/config.py +0 -0
  34. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/core/__init__.py +0 -0
  35. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/core/exceptions.py +0 -0
  36. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/core/framework_client.py +0 -0
  37. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/core/logger.py +0 -0
  38. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/core/model_config.py +0 -0
  39. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/__init__.py +0 -0
  40. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/api/__init__.py +0 -0
  41. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/api/knowledge_entity_schemas.py +0 -0
  42. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/api/metadata_schemas.py +0 -0
  43. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/build_status.py +0 -0
  44. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/dsl/__init__.py +0 -0
  45. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/dsl/compiler.py +0 -0
  46. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/dsl/errors.py +0 -0
  47. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/dsl/validator.py +0 -0
  48. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/events.py +0 -0
  49. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/__init__.py +0 -0
  50. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/database.py +0 -0
  51. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/object_storage.py +0 -0
  52. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/runtime.py +0 -0
  53. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/storage.py +0 -0
  54. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/infrastructure/storage_s3.py +0 -0
  55. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/metadata_types.py +0 -0
  56. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/__init__.py +0 -0
  57. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/file_metadata_value_repository.py +0 -0
  58. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_base_repository.py +0 -0
  59. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_build_acceptance_repository.py +0 -0
  60. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_build_batch_repository.py +0 -0
  61. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_build_task_repository.py +0 -0
  62. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_entity_asset_repository.py +0 -0
  63. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_entity_repository.py +0 -0
  64. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_fetch_cache_repository.py +0 -0
  65. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_file_reference_repository.py +0 -0
  66. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_file_update_timeline_repository.py +0 -0
  67. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_item_chunk_repository.py +0 -0
  68. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_item_search_repository.py +0 -0
  69. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_semantic_processing_batch_repository.py +0 -0
  70. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/knowledge_semantic_processing_task_repository.py +0 -0
  71. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/metadata_search_repository.py +0 -0
  72. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/processing_task_query_repository.py +0 -0
  73. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/repositories/retrieval_projection_repository.py +0 -0
  74. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/__init__.py +0 -0
  75. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/bootstrap_service.py +0 -0
  76. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/cache_file_lock.py +0 -0
  77. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/document_update_service.py +0 -0
  78. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/embedding_query_service.py +0 -0
  79. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/entry_metadata.py +0 -0
  80. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/errors.py +0 -0
  81. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_background_runner.py +0 -0
  82. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_execution_service.py +0 -0
  83. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_models.py +0 -0
  84. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_mutation_service.py +0 -0
  85. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_processing_service.py +0 -0
  86. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_build_terminal_event_service.py +0 -0
  87. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_metadata_query_service.py +0 -0
  88. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_metadata_update_service.py +0 -0
  89. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/file_upload_source.py +0 -0
  90. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_document_metadata.py +0 -0
  91. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_background_runner.py +0 -0
  92. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_discovery.py +0 -0
  93. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_enrichment.py +0 -0
  94. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_intelligence.py +0 -0
  95. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_processing_service.py +0 -0
  96. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_synonym_resolution.py +0 -0
  97. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_entity_task_worker.py +0 -0
  98. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_fetch_cache_cleanup_service.py +0 -0
  99. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_item_ingestion_service.py +0 -0
  100. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/knowledge_item_search_service.py +0 -0
  101. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/markdown_front_matter.py +0 -0
  102. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/markdown_reference_resolver.py +0 -0
  103. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/markdown_reference_rewriter.py +0 -0
  104. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/markdown_update_summary_service.py +0 -0
  105. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/metadata_search_service.py +0 -0
  106. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/semantic_task_mutation_service.py +0 -0
  107. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/services/zip_batch_import_service.py +0 -0
  108. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/000_extensions.sql +0 -0
  109. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/001_knowledge_base.sql +0 -0
  110. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/002_knowledge_fs_entry.sql +0 -0
  111. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/003_knowledge_chunk.sql +0 -0
  112. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/004_retrieval_projection.sql +0 -0
  113. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/005_knowledge_fetch_cache_index.sql +0 -0
  114. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/006_knowledge_build_task.sql +0 -0
  115. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/009_knowledge_fs_entry_indexes.sql +0 -0
  116. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/010_knowledge_chunk_indexes.sql +0 -0
  117. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/011_retrieval_projection_indexes.sql +0 -0
  118. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/012_knowledge_fetch_cache_index_indexes.sql +0 -0
  119. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/013_knowledge_build_task_indexes.sql +0 -0
  120. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/014_embedding_table.sql.tpl +0 -0
  121. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/015_metadata_property_def.sql +0 -0
  122. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/016_metadata_property_def_indexes.sql +0 -0
  123. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/017_file_metadata_value.sql +0 -0
  124. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/018_file_metadata_value_indexes.sql +0 -0
  125. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/019_knowledge_fs_entry_virtual_path.sql +0 -0
  126. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/020_knowledge_fs_entry_virtual_path_indexes.sql +0 -0
  127. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/021_knowledge_fs_entry_virtual_path_backfill.sql +0 -0
  128. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/022_knowledge_fs_entry_top_level_sibling_unique.sql +0 -0
  129. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/023_metadata_property_def_name_unique.sql +0 -0
  130. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/024_knowledge_base_name_unique.sql +0 -0
  131. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/025_metadata_value_self_contained_migration.sql +0 -0
  132. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/026_knowledge_file_reference.sql +0 -0
  133. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/027_knowledge_file_update_timeline.sql +0 -0
  134. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/028_knowledge_fs_entry_checksum_index.sql +0 -0
  135. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/029_knowledge_semantic_processing_task.sql +0 -0
  136. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/030_knowledge_file_reference_semantic_extension.sql +0 -0
  137. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/031_knowledge_file_document_kind_backfill.sql +0 -0
  138. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/032_knowledge_schema_migration.sql +0 -0
  139. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/033_knowledge_entity.sql +0 -0
  140. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/034_knowledge_entity_embedding_table.sql.tpl +0 -0
  141. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/035_knowledge_entity_discovery_schema.sql +0 -0
  142. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/036_knowledge_entity_embedding_full_only.sql.tpl +0 -0
  143. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/037_knowledge_semantic_processing_directory_scope.sql +0 -0
  144. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/038_knowledge_build_batch.sql +0 -0
  145. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/039_knowledge_build_task_background_extension.sql +0 -0
  146. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/040_knowledge_build_task_legacy_backfill.sql.tpl +0 -0
  147. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/041_knowledge_build_task_active_constraints.sql +0 -0
  148. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_base/sql/042_knowledge_fs_entry_upload_uniqueness.sql +0 -0
  149. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_build/__init__.py +0 -0
  150. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_build/runtime.py +0 -0
  151. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_build/services/__init__.py +0 -0
  152. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_build/services/document_chunking_service.py +0 -0
  153. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_build/services/heading_patterns.py +0 -0
  154. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/__init__.py +0 -0
  155. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/exceptions.py +0 -0
  156. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/kb_path_utils.py +0 -0
  157. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/markdown_reference.py +0 -0
  158. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/schemas.py +0 -0
  159. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/knowledge_common/text_segmentation.py +0 -0
  160. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/main.py +0 -0
  161. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/__init__.py +0 -0
  162. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/__init__.py +0 -0
  163. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/answer_synthesizer.py +0 -0
  164. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/multi_hop_react.py +0 -0
  165. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/multi_hop_summarizer.py +0 -0
  166. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/query_decomposer.py +0 -0
  167. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/recursion_fallback.py +0 -0
  168. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/single_hop_react.py +0 -0
  169. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/standalone_question_rewriter.py +0 -0
  170. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/agents/subanswer_aggregator.py +0 -0
  171. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/__init__.py +0 -0
  172. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/base_engine.py +0 -0
  173. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/config.py +0 -0
  174. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/context.py +0 -0
  175. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/context_manager.py +0 -0
  176. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/event_filter.py +0 -0
  177. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/exceptions.py +0 -0
  178. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/fallback_messages.py +0 -0
  179. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/messages.py +0 -0
  180. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/middleware/__init__.py +0 -0
  181. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/middleware/tool_call_guard.py +0 -0
  182. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/models.py +0 -0
  183. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/operation_registry.py +0 -0
  184. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/prompt_fragments.py +0 -0
  185. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/reducers.py +0 -0
  186. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/common/state.py +0 -0
  187. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/__init__.py +0 -0
  188. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/__init__.py +0 -0
  189. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/engine.py +0 -0
  190. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/graph.py +0 -0
  191. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/nodes/__init__.py +0 -0
  192. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/nodes/retrieve.py +0 -0
  193. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/state.py +0 -0
  194. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/fast/types.py +0 -0
  195. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/__init__.py +0 -0
  196. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/engine.py +0 -0
  197. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/graph.py +0 -0
  198. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/nodes/__init__.py +0 -0
  199. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/nodes/final_answer.py +0 -0
  200. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/nodes/router.py +0 -0
  201. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/nodes/state_cleanup.py +0 -0
  202. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/state.py +0 -0
  203. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/engines/instant/types.py +0 -0
  204. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/services/__init__.py +0 -0
  205. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/services/checkpointer_factory.py +0 -0
  206. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/services/llm_service.py +0 -0
  207. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/services/opengauss_checkpointer.py +0 -0
  208. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/services/session_history.py +0 -0
  209. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/tools/__init__.py +0 -0
  210. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/tools/dsl_guide.py +0 -0
  211. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/tools/knowledge_tools.py +0 -0
  212. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/tools/operations/__init__.py +0 -0
  213. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/src/by_qa/qa/tools/operations/base.py +0 -0
  214. {by_qa-0.4.4.dev4 → by_qa-0.4.4.dev5}/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.dev4
3
+ Version: 0.4.4.dev5
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.dev4"
7
+ version = "0.4.4.dev5"
8
8
  description = "Open-source knowledge-base ingestion and retrieval service."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -44,6 +44,7 @@ from by_qa.knowledge_base.api.schemas import (
44
44
  FileBuildStatusRequest,
45
45
  FileToMarkdownIndexRequest,
46
46
  KnowledgeBaseFileCountRequest,
47
+ KnowledgeBaseStatusRequest,
47
48
  KnowledgeItemDownloadRequest,
48
49
  KnowledgeItemGlobRequest,
49
50
  KnowledgeItemListDirRequest,
@@ -512,6 +513,11 @@ def register_routes(
512
513
 
513
514
  @app.post(
514
515
  "/api/v1/knowledgeBases/fileCount",
516
+ deprecated=True,
517
+ description=(
518
+ "Deprecated. Use POST /api/v1/knowledgeBases/status with knCodeList "
519
+ "to retrieve fileCount and spaceSize for each knowledge base."
520
+ ),
515
521
  openapi_extra={
516
522
  "requestBody": {
517
523
  "required": True,
@@ -565,6 +571,62 @@ def register_routes(
565
571
  )
566
572
  return _documented_success_response(result_object=result)
567
573
 
574
+ @app.post(
575
+ "/api/v1/knowledgeBases/status",
576
+ openapi_extra={
577
+ "requestBody": {
578
+ "required": True,
579
+ "content": {
580
+ "application/json": {
581
+ "schema": KnowledgeBaseStatusRequest.model_json_schema(
582
+ by_alias=True
583
+ )
584
+ }
585
+ },
586
+ }
587
+ },
588
+ )
589
+ async def knowledge_base_status(http_request: Request):
590
+ # Parse locally so malformed bodies also honor this endpoint's HTTP 422
591
+ # contract rather than the application's legacy HTTP 200 error handler.
592
+ try:
593
+ request = KnowledgeBaseStatusRequest.model_validate(
594
+ await http_request.json()
595
+ )
596
+ except ValueError:
597
+ return _documented_error_response(
598
+ result_msg="request validation failed",
599
+ status_code=422,
600
+ preserve_http_status=True,
601
+ )
602
+
603
+ logger.info(
604
+ "knowledge_base_status request received: kb_code_list=%s",
605
+ request.kb_code_list,
606
+ )
607
+ try:
608
+ service = await get_knowledge_base_service()
609
+ result = await service.status(request)
610
+ except KnowledgeBaseConfigurationError as exc:
611
+ return _documented_error_response(
612
+ result_msg=str(exc), status_code=503, preserve_http_status=True
613
+ )
614
+ except KnowledgeBaseValidationError as exc:
615
+ return _documented_error_response(
616
+ result_msg=str(exc), status_code=422, preserve_http_status=True
617
+ )
618
+ except Exception as exc:
619
+ logger.exception(
620
+ "knowledge_base_status unexpected error: kb_code_list=%s",
621
+ request.kb_code_list,
622
+ )
623
+ return _documented_error_response(
624
+ result_msg=str(exc) or "internal error",
625
+ status_code=500,
626
+ preserve_http_status=True,
627
+ )
628
+ return _documented_success_response(result_object=result)
629
+
568
630
  @app.post("/api/v1/directories/create")
569
631
  async def create_directory(
570
632
  background_tasks: BackgroundTasks,
@@ -1,8 +1,16 @@
1
1
  """Pydantic schemas for knowledge base APIs."""
2
2
 
3
- from typing import Any, Literal, Optional
3
+ from typing import Annotated, Any, Literal, Optional
4
4
 
5
- from pydantic import AliasChoices, BaseModel, ConfigDict, Field, model_validator
5
+ from pydantic import (
6
+ AliasChoices,
7
+ BaseModel,
8
+ ConfigDict,
9
+ Field,
10
+ StringConstraints,
11
+ field_validator,
12
+ model_validator,
13
+ )
6
14
 
7
15
 
8
16
  def _normalize_api_path(path: str, *, allow_root: bool) -> str:
@@ -65,6 +73,27 @@ class KnowledgeBaseFileCountRequest(BaseModel):
65
73
  )
66
74
 
67
75
 
76
+ class KnowledgeBaseStatusRequest(BaseModel):
77
+ """Request body for batch file counts and logical storage sizes."""
78
+
79
+ model_config = ConfigDict(populate_by_name=True)
80
+
81
+ kb_code_list: list[
82
+ Annotated[
83
+ str, StringConstraints(strict=True, strip_whitespace=True, min_length=1)
84
+ ]
85
+ ] = Field(
86
+ min_length=1,
87
+ strict=True,
88
+ validation_alias=AliasChoices("knCodeList", "kb_code_list"),
89
+ )
90
+
91
+ @field_validator("kb_code_list")
92
+ @classmethod
93
+ def deduplicate_codes(cls, codes: list[str]) -> list[str]:
94
+ return list(dict.fromkeys(codes))
95
+
96
+
68
97
  class UpdateKnowledgeBaseRequest(BaseModel):
69
98
  """Request body for updating knowledge base business fields."""
70
99
 
@@ -1276,6 +1276,28 @@ class KnowledgeFsEntryRepository:
1276
1276
  row = await cursor.fetchone()
1277
1277
  return int(row["file_count"])
1278
1278
 
1279
+ async def file_stats_by_knowledge_base_ids(
1280
+ self, cursor: Any, *, knowledge_base_ids: list[int]
1281
+ ) -> dict[int, dict[str, int]]:
1282
+ """Aggregate current live file counts and byte totals in one query."""
1283
+ await cursor.execute(
1284
+ """SELECT knowledge_base_id, COUNT(*) AS file_count,
1285
+ COALESCE(SUM(COALESCE(file_size, 0)), 0) AS size_bytes
1286
+ FROM knowledge_fs_entry
1287
+ WHERE knowledge_base_id = ANY(%(knowledge_base_ids)s)
1288
+ AND is_deleted = FALSE
1289
+ AND entry_type = 'FILE'
1290
+ GROUP BY knowledge_base_id""",
1291
+ {"knowledge_base_ids": knowledge_base_ids},
1292
+ )
1293
+ return {
1294
+ int(row["knowledge_base_id"]): {
1295
+ "file_count": int(row["file_count"]),
1296
+ "size_bytes": int(row["size_bytes"]),
1297
+ }
1298
+ for row in await self._fetchall(cursor)
1299
+ }
1300
+
1279
1301
  async def list_file_entries_by_knowledge_base_id(
1280
1302
  self, cursor, *, knowledge_base_id: int
1281
1303
  ) -> list[dict[str, Any]]:
@@ -4,7 +4,7 @@ import fnmatch
4
4
  import json
5
5
  import mimetypes
6
6
  from dataclasses import dataclass
7
- from decimal import Decimal
7
+ from decimal import ROUND_HALF_UP, Decimal
8
8
  from pathlib import Path, PurePosixPath
9
9
  from typing import Any, Callable
10
10
 
@@ -20,6 +20,7 @@ from by_qa.knowledge_base.api.schemas import (
20
20
  DeleteKnowledgeBaseRequest,
21
21
  FileBuildStatusRequest,
22
22
  KnowledgeBaseFileCountRequest,
23
+ KnowledgeBaseStatusRequest,
23
24
  KnowledgeItemDownloadRequest,
24
25
  KnowledgeItemGlobRequest,
25
26
  KnowledgeItemListDirItem,
@@ -1012,6 +1013,39 @@ class KnowledgeBaseService:
1012
1013
  finally:
1013
1014
  await connection.close()
1014
1015
 
1016
+ async def status(self, request: KnowledgeBaseStatusRequest) -> dict[str, Any]:
1017
+ """Return ordered per-KB counts and sizes in KB, or fail the whole batch."""
1018
+ connection = await self.connection_factory()
1019
+ try:
1020
+ cursor = connection.cursor()
1021
+ kb_ids = []
1022
+ for code in request.kb_code_list:
1023
+ row = await self.knowledge_base_repository.get_by_code(cursor, code)
1024
+ if not row:
1025
+ raise KnowledgeBaseValidationError(
1026
+ f"knowledge base not found: {code}"
1027
+ )
1028
+ kb_ids.append(self._row_id(row))
1029
+ stats = await self.knowledge_fs_entry_repository.file_stats_by_knowledge_base_ids(
1030
+ cursor, knowledge_base_ids=kb_ids
1031
+ )
1032
+ data = []
1033
+ for code, kb_id in zip(request.kb_code_list, kb_ids):
1034
+ stat = stats.get(kb_id, {"file_count": 0, "size_bytes": 0})
1035
+ size_kb = (Decimal(stat["size_bytes"]) / Decimal(1024)).quantize(
1036
+ Decimal("0.01"), rounding=ROUND_HALF_UP
1037
+ )
1038
+ data.append(
1039
+ {
1040
+ "knCode": code,
1041
+ "fileCount": stat["file_count"],
1042
+ "spaceSize": float(size_kb),
1043
+ }
1044
+ )
1045
+ return {"data": data}
1046
+ finally:
1047
+ await connection.close()
1048
+
1015
1049
  async def list_dir(
1016
1050
  self, request: KnowledgeItemListDirRequest
1017
1051
  ) -> KnowledgeItemListDirResponse:
@@ -313,7 +313,7 @@ wheels = [
313
313
 
314
314
  [[package]]
315
315
  name = "by-qa"
316
- version = "0.4.4.dev4"
316
+ version = "0.4.4.dev5"
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