ragbits-core 1.4.0.dev202509220622__tar.gz → 1.4.0.dev202512151244__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 (161) hide show
  1. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/.gitignore +5 -0
  2. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/CHANGELOG.md +9 -4
  3. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/PKG-INFO +3 -1
  4. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/README.md +2 -0
  5. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/pyproject.toml +1 -1
  6. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/litellm.py +115 -4
  7. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/hf.py +35 -17
  8. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/__init__.py +0 -0
  9. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/__init__.py +0 -0
  10. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/metrics/__init__.py +0 -0
  11. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/metrics/base.py +0 -0
  12. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/metrics/logfire.py +0 -0
  13. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/metrics/otel.py +0 -0
  14. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/traces/__init__.py +0 -0
  15. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/traces/base.py +0 -0
  16. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/traces/cli.py +0 -0
  17. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/traces/logfire.py +0 -0
  18. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/audit/traces/otel.py +0 -0
  19. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/cli.py +0 -0
  20. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/config.py +0 -0
  21. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/__init__.py +0 -0
  22. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/base.py +0 -0
  23. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/__init__.py +0 -0
  24. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/base.py +0 -0
  25. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/fastembed.py +0 -0
  26. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/litellm.py +0 -0
  27. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/local.py +0 -0
  28. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/noop.py +0 -0
  29. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/dense/vertex_multimodal.py +0 -0
  30. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/exceptions.py +0 -0
  31. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/sparse/__init__.py +0 -0
  32. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/sparse/bag_of_tokens.py +0 -0
  33. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/sparse/base.py +0 -0
  34. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/embeddings/sparse/fastembed.py +0 -0
  35. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/__init__.py +0 -0
  36. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/base.py +0 -0
  37. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/exceptions.py +0 -0
  38. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/factory.py +0 -0
  39. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/local.py +0 -0
  40. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/llms/mock.py +0 -0
  41. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/options.py +0 -0
  42. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/__init__.py +0 -0
  43. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/_cli.py +0 -0
  44. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/base.py +0 -0
  45. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/discovery.py +0 -0
  46. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/exceptions.py +0 -0
  47. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/parsers.py +0 -0
  48. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/prompt.py +0 -0
  49. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/prompt/promptfoo.py +0 -0
  50. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/py.typed +0 -0
  51. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/__init__.py +0 -0
  52. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/azure.py +0 -0
  53. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/base.py +0 -0
  54. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/exceptions.py +0 -0
  55. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/gcs.py +0 -0
  56. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/git.py +0 -0
  57. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/google_drive.py +0 -0
  58. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/local.py +0 -0
  59. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/s3.py +0 -0
  60. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/sources/web.py +0 -0
  61. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/types.py +0 -0
  62. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/__init__.py +0 -0
  63. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/_pyproject.py +0 -0
  64. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/config_handling.py +0 -0
  65. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/decorators.py +0 -0
  66. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/dict_transformations.py +0 -0
  67. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/function_schema.py +0 -0
  68. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/helpers.py +0 -0
  69. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/lazy_litellm.py +0 -0
  70. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/pydantic.py +0 -0
  71. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/utils/secrets.py +0 -0
  72. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/__init__.py +0 -0
  73. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/_cli.py +0 -0
  74. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/base.py +0 -0
  75. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/chroma.py +0 -0
  76. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/hybrid.py +0 -0
  77. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/hybrid_strategies.py +0 -0
  78. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/in_memory.py +0 -0
  79. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/pgvector.py +0 -0
  80. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/qdrant.py +0 -0
  81. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/src/ragbits/core/vector_stores/weaviate.py +0 -0
  82. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/assets/img/test.png +0 -0
  83. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/assets/img/test2.jpg +0 -0
  84. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/assets/md/bar.md +0 -0
  85. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/assets/md/foo.md +0 -0
  86. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/cli/__init__.py +0 -0
  87. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/cli/test_cli_trace_handler.py +0 -0
  88. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/cli/test_vector_store.py +0 -0
  89. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/conftest.py +0 -0
  90. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/sources/test_git.py +0 -0
  91. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/sources/test_hf.py +0 -0
  92. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/sources/test_s3.py +0 -0
  93. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/vector_stores/__init__.py +0 -0
  94. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/vector_stores/test_keyword_search.py +0 -0
  95. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/vector_stores/test_vector_store.py +0 -0
  96. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/integration/vector_stores/test_vector_store_sparse.py +0 -0
  97. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/__init__.py +0 -0
  98. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/audit/test_cli.py +0 -0
  99. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/audit/test_metrics.py +0 -0
  100. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/audit/test_trace.py +0 -0
  101. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_bag_of_tokens.py +0 -0
  102. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_fastembed.py +0 -0
  103. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_from_config.py +0 -0
  104. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_litellm.py +0 -0
  105. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_local.py +0 -0
  106. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_noop.py +0 -0
  107. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_vector_size.py +0 -0
  108. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/embeddings/test_vertex_multimodal.py +0 -0
  109. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/__init__.py +0 -0
  110. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/factory/__init__.py +0 -0
  111. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/factory/test_get_preferred_llm.py +0 -0
  112. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/test_base.py +0 -0
  113. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/test_from_config.py +0 -0
  114. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/test_litellm.py +0 -0
  115. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/llms/test_local.py +0 -0
  116. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/__init__.py +0 -0
  117. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/__init__.py +0 -0
  118. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/prompt_classes_for_tests.py +0 -0
  119. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/ragbits_tests_pkg_with_prompts/__init__.py +0 -0
  120. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/ragbits_tests_pkg_with_prompts/prompts/__init__.py +0 -0
  121. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/ragbits_tests_pkg_with_prompts/prompts/temp_prompt1.py +0 -0
  122. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/ragbits_tests_pkg_with_prompts/prompts/temp_prompt2.py +0 -0
  123. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/discovery/test_prompt_discovery.py +0 -0
  124. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/test_parsers.py +0 -0
  125. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/prompts/test_prompt.py +0 -0
  126. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_aws.py +0 -0
  127. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_azure.py +0 -0
  128. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_exceptions.py +0 -0
  129. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_gcs.py +0 -0
  130. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_git.py +0 -0
  131. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_google_drive.py +0 -0
  132. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_hf.py +0 -0
  133. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_local.py +0 -0
  134. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_source_discriminator.py +0 -0
  135. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/sources/test_web.py +0 -0
  136. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/test_options.py +0 -0
  137. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/__init__.py +0 -0
  138. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/pyproject/test_find.py +0 -0
  139. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/pyproject/test_get_config.py +0 -0
  140. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/pyproject/test_get_instace.py +0 -0
  141. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_config_handling.py +0 -0
  142. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_decorators.py +0 -0
  143. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_dict_transformations.py +0 -0
  144. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_function_schema.py +0 -0
  145. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_helpers.py +0 -0
  146. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/test_secrets.py +0 -0
  147. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/bad_factory_project/pyproject.toml +0 -0
  148. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/factory_project/pyproject.toml +0 -0
  149. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/happy_project/pyproject.toml +0 -0
  150. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/project_with_instance_factory/pyproject.toml +0 -0
  151. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/project_with_instances_yaml/instances.yaml +0 -0
  152. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/utils/testprojects/project_with_instances_yaml/pyproject.toml +0 -0
  153. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_base.py +0 -0
  154. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_chroma.py +0 -0
  155. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_from_config.py +0 -0
  156. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_hybrid.py +0 -0
  157. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_hybrid_strategies.py +0 -0
  158. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_in_memory.py +0 -0
  159. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_pgvector.py +0 -0
  160. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_qdrant.py +0 -0
  161. {ragbits_core-1.4.0.dev202509220622 → ragbits_core-1.4.0.dev202512151244}/tests/unit/vector_stores/test_weaviate.py +0 -0
@@ -8,6 +8,7 @@ venv/
8
8
  .venv/
9
9
  __pycache__/
10
10
  **.egg-info/
11
+ .deepeval/
11
12
 
12
13
  # Local cursor rules
13
14
  .cursor/rules/local/
@@ -109,3 +110,7 @@ node_modules/
109
110
  lazygit
110
111
 
111
112
  lazygit.tar.gz
113
+
114
+ # chat conversation logs
115
+ duet_conversation.log
116
+ worktrees/
@@ -2,18 +2,20 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ - Add Support for Thinking in agents (#837)
6
+ - Add support for confirmation requests in chat (#853)
7
+ - Add name parameter and slightly refactor HuggingFace dataloder (#829)
8
+
5
9
  ## 1.3.0 (2025-09-11)
6
10
 
7
11
  - feat: improve app startup speed with lazy LiteLLM loading
8
12
 
9
-
10
13
  - Feat: added support for IVFFlat indexing and Halfvec datatype
11
14
 
12
15
  - Added Lazy loading of dependencies in local.py and during importing of LiteLLM
13
16
  - Add tool_choice parameter to LLM interface (#738)
14
17
  - Fix Prompt consumes same iterator twice leading to no data added to chat (#768)
15
18
 
16
-
17
19
  ## 1.2.2 (2025-08-08)
18
20
 
19
21
  - Fix: rendering iterator arguments in Prompt (#768)
@@ -94,6 +96,7 @@
94
96
  ## 0.16.0 (2025-04-29)
95
97
 
96
98
  ## 0.15.0 (2025-04-28)
99
+
97
100
  - Allow using sparse embeddings with Qdrant and local vector stores (#493)
98
101
  - Add support for sparse embeddings in the Pgvector Vector Store (#493)
99
102
  - Added secret key environment variable / generation for signatures across ragbits packages (#537)
@@ -109,6 +112,7 @@
109
112
  - modify LocalEmbedder to use sentence-transformers instead of torch (#508)
110
113
 
111
114
  ## 0.13.0 (2025-04-02)
115
+
112
116
  - Make the score in VectorStoreResult consistent (always bigger is better)
113
117
  - Add router option to LiteLLMEmbedder (#440)
114
118
  - Make LLM / Embedder APIs consistent (#463)
@@ -117,11 +121,13 @@
117
121
  - Cost and capabilities config for custom litellm models (#481)
118
122
 
119
123
  ## 0.12.0 (2025-03-25)
124
+
120
125
  - Allow Prompt class to accept the asynchronous response_parser. Change the signature of parse_response method.
121
126
  - Fix from_config for LiteLLM class (#441)
122
127
  - Fix Qdrant vector store serialization (#419)
123
128
 
124
129
  ## 0.11.0 (2025-03-25)
130
+
125
131
  - Add HybridSearchVectorStore which can aggregate results from multiple VectorStores (#412)
126
132
 
127
133
  ## 0.10.2 (2025-03-21)
@@ -202,7 +208,6 @@
202
208
  - Add streaming interface to LLMs (#188).
203
209
  - Better images support in Prompt abstractions (#201).
204
210
 
205
-
206
211
  ## 0.3.0 (2024-11-06)
207
212
 
208
213
  ### Added
@@ -242,4 +247,4 @@
242
247
  - LiteLLM integration.
243
248
  - ChromaDB integration.
244
249
  - Prompts lab.
245
- - Prompts autodiscovery.
250
+ - Prompts autodiscovery.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragbits-core
3
- Version: 1.4.0.dev202509220622
3
+ Version: 1.4.0.dev202512151244
4
4
  Summary: Building blocks for rapid development of GenAI applications
5
5
  Project-URL: Homepage, https://github.com/deepsense-ai/ragbits
6
6
  Project-URL: Bug Reports, https://github.com/deepsense-ai/ragbits/issues
@@ -89,6 +89,8 @@ pip install ragbits-core
89
89
  ## Quick Start
90
90
 
91
91
  ```python
92
+ import asyncio
93
+
92
94
  from pydantic import BaseModel
93
95
  from ragbits.core.prompt import Prompt
94
96
  from ragbits.core.llms.litellm import LiteLLM
@@ -11,6 +11,8 @@ pip install ragbits-core
11
11
  ## Quick Start
12
12
 
13
13
  ```python
14
+ import asyncio
15
+
14
16
  from pydantic import BaseModel
15
17
  from ragbits.core.prompt import Prompt
16
18
  from ragbits.core.llms.litellm import LiteLLM
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ragbits-core"
3
- version = "1.4.0.dev202509220622"
3
+ version = "1.4.0.dev202512151244"
4
4
  description = "Building blocks for rapid development of GenAI applications"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -102,6 +102,7 @@ class LiteLLM(LLM[LiteLLMOptions], LazyLiteLLM):
102
102
  self.use_structured_output = use_structured_output
103
103
  self.router = router
104
104
  self.custom_model_cost_config = custom_model_cost_config
105
+ self._cached_router: Router | None = None # Cache for auto-created router
105
106
  if custom_model_cost_config:
106
107
  self._litellm.register_model(custom_model_cost_config)
107
108
 
@@ -315,8 +316,13 @@ class LiteLLM(LLM[LiteLLMOptions], LazyLiteLLM):
315
316
  stream=True,
316
317
  stream_options={"include_usage": True},
317
318
  )
318
- if not response.completion_stream and not response.choices: # type: ignore
319
- raise LLMEmptyResponseError()
319
+
320
+ try:
321
+ if (not response.completion_stream and not response.choices) and not response.reasoning: # type: ignore
322
+ raise LLMEmptyResponseError()
323
+ except AttributeError:
324
+ # some providers might not include some parameters (i.e. Gemini -> choices)
325
+ pass
320
326
 
321
327
  async def response_to_async_generator(response: "CustomStreamWrapper") -> AsyncGenerator[dict, None]:
322
328
  nonlocal input_tokens, provider_calculated_usage
@@ -429,11 +435,21 @@ class LiteLLM(LLM[LiteLLMOptions], LazyLiteLLM):
429
435
  stream: bool = False,
430
436
  stream_options: dict | None = None,
431
437
  ) -> "ModelResponse | CustomStreamWrapper":
432
- entrypoint = self.router or self._create_router_from_self_and_options(options)
438
+ # Use provided router, or create/reuse cached router
439
+ if self.router:
440
+ entrypoint = self.router
441
+ else:
442
+ # Create router only once and cache it to avoid callback leak
443
+ if self._cached_router is None:
444
+ self._cached_router = self._create_router_from_self_and_options(options)
445
+ entrypoint = self._cached_router
446
+
447
+ # Preprocess messages for Claude with reasoning enabled
448
+ processed_conversation = self._preprocess_messages_for_claude(conversation, options)
433
449
 
434
450
  # Prepare kwargs for the completion call
435
451
  completion_kwargs = {
436
- "messages": conversation,
452
+ "messages": processed_conversation,
437
453
  "model": self.model_name,
438
454
  "response_format": response_format,
439
455
  "tools": tools,
@@ -461,6 +477,101 @@ class LiteLLM(LLM[LiteLLMOptions], LazyLiteLLM):
461
477
  raise LLMResponseError() from exc
462
478
  return response
463
479
 
480
+ def _preprocess_messages_for_claude(self, conversation: ChatFormat, options: LiteLLMOptions) -> ChatFormat:
481
+ """
482
+ Preprocess messages for Claude when reasoning is enabled.
483
+
484
+ Claude + reasoning_effort + tool calls creates a conflict:
485
+ - LiteLLM validates messages against OpenAI format (rejects Claude native format)
486
+ - Claude requires thinking blocks when reasoning_effort is set (rejects OpenAI format)
487
+
488
+ Subject to removal after the following are resolved on LiteLLM's side:
489
+ Issue: https://github.com/BerriAI/litellm/issues/14194
490
+ Linked PR(s): https://github.com/BerriAI/litellm/pull/15220
491
+
492
+ Solution: Summarize tool call history and append to last user message.
493
+ This provides context to Claude without triggering validation errors.
494
+
495
+ Args:
496
+ conversation: The conversation in OpenAI format
497
+ options: LLM options including reasoning_effort
498
+
499
+ Returns:
500
+ Processed conversation with tool context included
501
+ """
502
+
503
+ def create_enhanced_user_message(
504
+ tool_summary_parts: list[str], original_user_msg: str | None
505
+ ) -> dict[str, Any]:
506
+ if tool_summary_parts and original_user_msg:
507
+ enhanced_message = original_user_msg
508
+ enhanced_message += "\n\n[Previous tool calls in this conversation:"
509
+
510
+ for summary in tool_summary_parts:
511
+ enhanced_message += f"\n- {summary}"
512
+ enhanced_message += "\nUse this information to provide your final answer.]"
513
+ return {"role": "user", "content": enhanced_message}
514
+
515
+ return {"role": "user", "content": original_user_msg}
516
+
517
+ # Only process for Claude models with reasoning enabled
518
+ is_claude = "anthropic" in self.model_name.lower() or "claude" in self.model_name.lower()
519
+ has_reasoning = options.reasoning_effort is not NOT_GIVEN and options.reasoning_effort is not None
520
+
521
+ if not (is_claude and has_reasoning):
522
+ return conversation
523
+
524
+ # Check if conversation has tool calls
525
+ has_tool_calls = any(msg.get("role") == "assistant" and msg.get("tool_calls") for msg in conversation)
526
+
527
+ if not has_tool_calls:
528
+ # No tool calls, conversation is fine as-is
529
+ return conversation
530
+
531
+ # Build tool call summary from conversation history
532
+ tool_summary_parts = []
533
+ i = 0
534
+ while i < len(conversation):
535
+ msg = conversation[i]
536
+ if msg.get("role") == "assistant" and msg.get("tool_calls"):
537
+ # Found assistant message with tool calls
538
+ for tool_call in msg["tool_calls"]:
539
+ tool_name = tool_call["function"]["name"]
540
+ tool_args = tool_call["function"]["arguments"]
541
+ tool_id = tool_call["id"]
542
+
543
+ # Find corresponding tool result
544
+ tool_result = None
545
+ for j in range(i + 1, len(conversation)):
546
+ if conversation[j].get("role") == "tool" and conversation[j].get("tool_call_id") == tool_id:
547
+ tool_result = conversation[j].get("content")
548
+ break
549
+
550
+ if tool_result:
551
+ tool_summary_parts.append(f"{tool_name}({tool_args}) returned: {tool_result}")
552
+ i += 1
553
+
554
+ # Build processed conversation
555
+ processed = []
556
+
557
+ # Keep system message if present
558
+ for msg in conversation:
559
+ if msg.get("role") == "system":
560
+ processed.append(msg)
561
+ break
562
+
563
+ # Get the original user message (first non-system)
564
+ original_user_msg = None
565
+ for msg in conversation:
566
+ if msg.get("role") == "user":
567
+ original_user_msg = msg.get("content", "")
568
+ break
569
+
570
+ # Create enhanced user message with tool context
571
+ processed.append(create_enhanced_user_message(tool_summary_parts, original_user_msg))
572
+
573
+ return processed
574
+
464
575
  def _get_response_format(
465
576
  self, output_schema: type[BaseModel] | dict | None, json_mode: bool
466
577
  ) -> type[BaseModel] | dict | None:
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  from collections.abc import Iterable
3
3
  from pathlib import Path
4
- from typing import ClassVar
4
+ from typing import TYPE_CHECKING, ClassVar, TypeAlias
5
5
 
6
6
  from typing_extensions import Self
7
7
 
@@ -10,6 +10,11 @@ from ragbits.core.sources.base import Source, get_local_storage_dir
10
10
  from ragbits.core.sources.exceptions import SourceConnectionError, SourceNotFoundError
11
11
  from ragbits.core.utils.decorators import requires_dependencies
12
12
 
13
+ if TYPE_CHECKING:
14
+ from datasets import Dataset, DatasetDict, IterableDataset, IterableDatasetDict
15
+
16
+ HFDataset: TypeAlias = Dataset | DatasetDict | IterableDataset | IterableDatasetDict
17
+
13
18
 
14
19
  class HuggingFaceSource(Source):
15
20
  """
@@ -23,6 +28,7 @@ class HuggingFaceSource(Source):
23
28
 
24
29
  protocol: ClassVar[str] = "hf"
25
30
  path: str
31
+ name: str | None = None
26
32
  split: str = "train"
27
33
  row: int | None = None
28
34
 
@@ -33,6 +39,32 @@ class HuggingFaceSource(Source):
33
39
  """
34
40
  return f"hf:{self.path}/{self.split}{f'/{self.row}' if self.row is not None else ''}"
35
41
 
42
+ def _load_dataset(self, streaming: bool = False) -> "HFDataset":
43
+ """
44
+ Load the dataset from Hugging Face.
45
+
46
+ Args:
47
+ streaming: Whether to stream the dataset.
48
+
49
+ Returns:
50
+ The loaded dataset.
51
+
52
+ Raises:
53
+ SourceConnectionError: If the source connection fails.
54
+ SourceNotFoundError: If the source dataset is not found.
55
+ """
56
+ from datasets import load_dataset
57
+ from datasets.exceptions import DatasetNotFoundError
58
+
59
+ try:
60
+ if self.name is not None and str(self.name).strip():
61
+ return load_dataset(self.path, self.name, split=self.split, streaming=streaming)
62
+ return load_dataset(self.path, split=self.split, streaming=streaming)
63
+ except ConnectionError as exc:
64
+ raise SourceConnectionError() from exc
65
+ except DatasetNotFoundError as exc:
66
+ raise SourceNotFoundError(source_id=self.id) from exc
67
+
36
68
  @requires_dependencies(["datasets"], "hf")
37
69
  async def fetch(self) -> Path:
38
70
  """
@@ -45,17 +77,9 @@ class HuggingFaceSource(Source):
45
77
  SourceConnectionError: If the source connection fails.
46
78
  SourceNotFoundError: If the source document is not found.
47
79
  """
48
- from datasets import load_dataset
49
- from datasets.exceptions import DatasetNotFoundError
50
-
51
80
  with trace(path=self.path, split=self.split, row=self.row) as outputs:
52
81
  if self.row is not None:
53
- try:
54
- dataset = load_dataset(self.path, split=self.split, streaming=True)
55
- except ConnectionError as exc:
56
- raise SourceConnectionError() from exc
57
- except DatasetNotFoundError as exc:
58
- raise SourceNotFoundError(source_id=self.id) from exc
82
+ dataset = self._load_dataset(streaming=True)
59
83
 
60
84
  try:
61
85
  data = next(iter(dataset.skip(self.row).take(1)))
@@ -78,13 +102,7 @@ class HuggingFaceSource(Source):
78
102
  path = source_dir / f"{self.split}.json"
79
103
 
80
104
  if not path.is_file():
81
- try:
82
- dataset = load_dataset(self.path, split=self.split)
83
- except ConnectionError as exc:
84
- raise SourceConnectionError() from exc
85
- except DatasetNotFoundError as exc:
86
- raise SourceNotFoundError(source_id=self.id) from exc
87
-
105
+ dataset = self._load_dataset(streaming=False)
88
106
  dataset.to_json(path)
89
107
  outputs.path = path
90
108