dao-ai 0.1.2__tar.gz → 0.1.3__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 (278) hide show
  1. {dao_ai-0.1.2 → dao_ai-0.1.3}/PKG-INFO +2 -2
  2. {dao_ai-0.1.2 → dao_ai-0.1.3}/README.md +1 -1
  3. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/03_reranking/vector_search_with_reranking.yaml +9 -7
  4. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +1 -1
  5. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/key-capabilities.md +12 -8
  6. {dao_ai-0.1.2 → dao_ai-0.1.3}/pyproject.toml +1 -1
  7. {dao_ai-0.1.2 → dao_ai-0.1.3}/requirements.txt +0 -1
  8. {dao_ai-0.1.2 → dao_ai-0.1.3}/schemas/model_config_schema.json +29 -16
  9. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/cli.py +13 -3
  10. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/config.py +81 -12
  11. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/databricks.py +16 -0
  12. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_databricks.py +187 -0
  13. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_reranking.py +4 -0
  14. dao_ai-0.1.2/src/quick_serve_restaurant/__init__.py +0 -0
  15. dao_ai-0.1.2/tests/quick_serve_restaurant/.gitkeep +0 -0
  16. {dao_ai-0.1.2 → dao_ai-0.1.3}/.gitignore +0 -0
  17. {dao_ai-0.1.2 → dao_ai-0.1.3}/.python-version +0 -0
  18. {dao_ai-0.1.2 → dao_ai-0.1.3}/CHANGELOG.md +0 -0
  19. {dao_ai-0.1.2 → dao_ai-0.1.3}/CONTRIBUTING.md +0 -0
  20. {dao_ai-0.1.2 → dao_ai-0.1.3}/LICENSE +0 -0
  21. {dao_ai-0.1.2 → dao_ai-0.1.3}/Makefile +0 -0
  22. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/01_getting_started/README.md +0 -0
  23. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/01_getting_started/minimal.yaml +0 -0
  24. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/README.md +0 -0
  25. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/custom_mcp.yaml +0 -0
  26. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/external_mcp.yaml +0 -0
  27. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/managed_mcp.yaml +0 -0
  28. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/slack_integration.yaml +0 -0
  29. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/03_reranking/README.md +0 -0
  30. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/README.md +0 -0
  31. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_basic.yaml +0 -0
  32. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
  33. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
  34. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
  35. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/README.md +0 -0
  36. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/conversation_summarization.yaml +0 -0
  37. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/in_memory_basic.yaml +0 -0
  38. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
  39. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/postgres_persistence.yaml +0 -0
  40. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/06_on_behalf_of_user/README.md +0 -0
  41. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
  42. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/07_human_in_the_loop/README.md +0 -0
  43. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
  44. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/08_guardrails/README.md +0 -0
  45. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
  46. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/09_structured_output/README.md +0 -0
  47. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/09_structured_output/structured_output.yaml +0 -0
  48. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/README.md +0 -0
  49. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
  50. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/kasal.yaml +0 -0
  51. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/README.md +0 -0
  52. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
  53. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
  54. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/README.md +0 -0
  55. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/combined_middleware.yaml +0 -0
  56. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
  57. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/logging_middleware.yaml +0 -0
  58. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/README.md +0 -0
  59. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
  60. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
  61. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/14_basic_tools/README.md +0 -0
  62. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
  63. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/README.md +0 -0
  64. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/brick_store.yaml +0 -0
  65. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/deep_research.yaml +0 -0
  66. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
  67. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
  68. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
  69. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
  70. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
  71. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
  72. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
  73. {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/README.md +0 -0
  74. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/appointments.sql +0 -0
  75. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/appointments_data.sql +0 -0
  76. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_data.sql +0 -0
  77. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_queries.sql +0 -0
  78. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_tables.sql +0 -0
  79. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_validation.sql +0 -0
  80. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/customers.sql +0 -0
  81. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/customers_data.sql +0 -0
  82. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/dim_stores.sql +0 -0
  83. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/dim_stores_data.sql +0 -0
  84. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_performance.sql +0 -0
  85. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_performance_data.sql +0 -0
  86. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_tasks.sql +0 -0
  87. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_tasks_data.sql +0 -0
  88. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/inventory.sql +0 -0
  89. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/inventory_data.sql +0 -0
  90. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/managers.sql +0 -0
  91. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/managers_data.sql +0 -0
  92. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/product_data.sql +0 -0
  93. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/products.sql +0 -0
  94. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/task_assignments.sql +0 -0
  95. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/inventory.snappy.parquet +0 -0
  96. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/inventory.sql +0 -0
  97. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/products.snappy.parquet +0 -0
  98. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/products.sql +0 -0
  99. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/.gitkeep +0 -0
  100. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
  101. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_description.csv +0 -0
  102. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_description.sql +0 -0
  103. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_raw.csv +0 -0
  104. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_raw.sql +0 -0
  105. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/orders_raw.csv +0 -0
  106. {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/orders_raw.sql +0 -0
  107. {dao_ai-0.1.2 → dao_ai-0.1.3}/databricks.yaml.template +0 -0
  108. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/architecture.md +0 -0
  109. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/cli-reference.md +0 -0
  110. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/configuration-reference.md +0 -0
  111. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/contributing.md +0 -0
  112. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/examples.md +0 -0
  113. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/faq.md +0 -0
  114. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/README.md +0 -0
  115. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/retail_supervisor.png +0 -0
  116. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/retail_swarm.png +0 -0
  117. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/images/genie.png +0 -0
  118. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/python-api.md +0 -0
  119. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/quick_serve_restaurant/.gitkeep +0 -0
  120. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
  121. {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/why-dao.md +0 -0
  122. {dao_ai-0.1.2 → dao_ai-0.1.3}/environment.yaml +0 -0
  123. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/dais2025/examples.yaml +0 -0
  124. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/deep_research/examples.yaml +0 -0
  125. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/executive_assistant/examples.yaml +0 -0
  126. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/hardware_store/examples.yaml +0 -0
  127. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/quick_serve_restaurant/.gitkeep +0 -0
  128. {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/quick_serve_restaurant/examples.yaml +0 -0
  129. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/extract_store_numbers.sql +0 -0
  130. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_inventory_by_sku.sql +0 -0
  131. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_inventory_by_upc.sql +0 -0
  132. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_product_by_sku.sql +0 -0
  133. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_product_by_upc.sql +0 -0
  134. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_by_number.sql +0 -0
  135. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
  136. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
  137. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
  138. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
  139. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_product_by_sku.sql +0 -0
  140. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_product_by_upc.sql +0 -0
  141. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
  142. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
  143. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/.gitkeep +0 -0
  144. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
  145. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
  146. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
  147. {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
  148. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/01_ingest_and_transform.py +0 -0
  149. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/02_provision_vector_search.py +0 -0
  150. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/03_provision_lakebase.py +0 -0
  151. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/04_unity_catalog_tools.py +0 -0
  152. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/05_deploy_agent.py +0 -0
  153. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/06_generate_evaluation_data.py +0 -0
  154. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/07_run_evaluation.py +0 -0
  155. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/08_run_examples.py +0 -0
  156. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/09_evaluate_inferences.py +0 -0
  157. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/10_optimize_prompts.py +0 -0
  158. {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/99_scratchpad.py +0 -0
  159. {dao_ai-0.1.2 → dao_ai-0.1.3}/schemas/bundle_config_schema.json +0 -0
  160. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/__init__.py +0 -0
  161. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/models.py +0 -0
  162. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/__init__.py +0 -0
  163. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/customer.py +0 -0
  164. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/employee.py +0 -0
  165. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/executive.py +0 -0
  166. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/genie.py +0 -0
  167. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/inventory.py +0 -0
  168. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/models.py +0 -0
  169. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/store.py +0 -0
  170. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/__init__.py +0 -0
  171. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/agent_as_code.py +0 -0
  172. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/catalog.py +0 -0
  173. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/__init__.py +0 -0
  174. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/__init__.py +0 -0
  175. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/base.py +0 -0
  176. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/core.py +0 -0
  177. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/lru.py +0 -0
  178. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/semantic.py +0 -0
  179. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/core.py +0 -0
  180. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/graph.py +0 -0
  181. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/hooks/__init__.py +0 -0
  182. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/hooks/core.py +0 -0
  183. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/logging.py +0 -0
  184. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/__init__.py +0 -0
  185. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/base.py +0 -0
  186. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/core.py +0 -0
  187. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/databricks.py +0 -0
  188. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/postgres.py +0 -0
  189. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/messages.py +0 -0
  190. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/__init__.py +0 -0
  191. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/assertions.py +0 -0
  192. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/base.py +0 -0
  193. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/core.py +0 -0
  194. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/guardrails.py +0 -0
  195. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
  196. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/message_validation.py +0 -0
  197. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/summarization.py +0 -0
  198. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/models.py +0 -0
  199. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/nodes.py +0 -0
  200. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/optimization.py +0 -0
  201. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/__init__.py +0 -0
  202. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/core.py +0 -0
  203. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/supervisor.py +0 -0
  204. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/swarm.py +0 -0
  205. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/prompts.py +0 -0
  206. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/__init__.py +0 -0
  207. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/base.py +0 -0
  208. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/state.py +0 -0
  209. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/__init__.py +0 -0
  210. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/agent.py +0 -0
  211. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/core.py +0 -0
  212. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/email.py +0 -0
  213. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/genie.py +0 -0
  214. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/mcp.py +0 -0
  215. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/memory.py +0 -0
  216. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/python.py +0 -0
  217. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/search.py +0 -0
  218. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/slack.py +0 -0
  219. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/sql.py +0 -0
  220. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/time.py +0 -0
  221. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/unity_catalog.py +0 -0
  222. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/vector_search.py +0 -0
  223. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/types.py +0 -0
  224. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/utils.py +0 -0
  225. {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/vector_search.py +0 -0
  226. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/config/test_model_config.yaml +0 -0
  227. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/conftest.py +0 -0
  228. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_agent_response_format.py +0 -0
  229. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_assertions_middleware.py +0 -0
  230. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_catalog.py +0 -0
  231. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_chat_history.py +0 -0
  232. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_config.py +0 -0
  233. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_function_parsing.py +0 -0
  234. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie.py +0 -0
  235. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
  236. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
  237. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_room_model.py +0 -0
  238. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_guardrail_retry.py +0 -0
  239. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hitl_config_model.py +0 -0
  240. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
  241. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hooks.py +0 -0
  242. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_human_in_the_loop.py +0 -0
  243. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_inference.py +0 -0
  244. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_inference_integration.py +0 -0
  245. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_input_output_structure.py +0 -0
  246. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_interrupt_type.py +0 -0
  247. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
  248. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_mcp.py +0 -0
  249. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_mcp_function_model.py +0 -0
  250. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_message_validation_middleware.py +0 -0
  251. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_messages.py +0 -0
  252. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_models.py +0 -0
  253. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_optimization.py +0 -0
  254. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_postgres_integration.py +0 -0
  255. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_prompt_optimizations.py +0 -0
  256. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_prompts.py +0 -0
  257. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_reranking_integration.py +0 -0
  258. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
  259. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_response_format.py +0 -0
  260. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_responses_agent_structured_output_unit.py +0 -0
  261. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_semantic_cache_context.py +0 -0
  262. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_sql_tool.py +0 -0
  263. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_sql_tool_integration.py +0 -0
  264. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_state.py +0 -0
  265. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_summarization_inference.py +0 -0
  266. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_swarm_middleware.py +0 -0
  267. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_tools.py +0 -0
  268. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_types.py +0 -0
  269. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_unity_catalog.py +0 -0
  270. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_utils.py +0 -0
  271. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
  272. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_vector_search.py +0 -0
  273. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/weather_server_mcp.py +0 -0
  274. {dao_ai-0.1.2/src/quick_serve_restaurant → dao_ai-0.1.3/tests/hardware_store}/.gitkeep +0 -0
  275. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/hardware_store/test_graph.py +0 -0
  276. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/images/doritos_upc.png +0 -0
  277. {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/images/lays_upc.png +0 -0
  278. {dao_ai-0.1.2/tests/hardware_store → dao_ai-0.1.3/tests/quick_serve_restaurant}/.gitkeep +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao-ai
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: DAO AI: A modular, multi-agent orchestration framework for complex AI workflows. Supports agent handoff, tool integration, and dynamic configuration via YAML.
5
5
  Project-URL: Homepage, https://github.com/natefleming/dao-ai
6
6
  Project-URL: Documentation, https://natefleming.github.io/dao-ai
@@ -79,7 +79,7 @@ Description-Content-Type: text/markdown
79
79
 
80
80
  # DAO: Declarative Agent Orchestration
81
81
 
82
- [![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](CHANGELOG.md)
82
+ [![Version](https://img.shields.io/badge/version-0.1.2-blue.svg)](CHANGELOG.md)
83
83
  [![Python](https://img.shields.io/badge/python-3.11+-green.svg)](https://www.python.org/)
84
84
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
85
85
 
@@ -1,6 +1,6 @@
1
1
  # DAO: Declarative Agent Orchestration
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](CHANGELOG.md)
3
+ [![Version](https://img.shields.io/badge/version-0.1.2-blue.svg)](CHANGELOG.md)
4
4
  [![Python](https://img.shields.io/badge/python-3.11+-green.svg)](https://www.python.org/)
5
5
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
6
 
@@ -83,7 +83,7 @@ retrievers:
83
83
  filters: {}
84
84
  query_type: ANN
85
85
  rerank: # Custom reranking configuration
86
- model: ms-marco-MiniLM-L-6-v2 # Faster, lighter model
86
+ model: ms-marco-TinyBERT-L-2-v2 # Fastest, smallest model (~4MB)
87
87
  top_n: 5 # Return top 5 after reranking
88
88
  # cache_dir: ~/.dao_ai/cache/flashrank # Cache directory (default shown)
89
89
 
@@ -258,7 +258,7 @@ app:
258
258
  # - Use when: Need better results than standard search
259
259
  #
260
260
  # 3. Fast Reranking - fast_search_agent
261
- # - Uses lighter model (ms-marco-MiniLM-L-6-v2)
261
+ # - Uses lighter model (ms-marco-TinyBERT-L-2-v2)
262
262
  # - Retrieves 100 candidates, returns top 5
263
263
  # - Faster than default but still improves results
264
264
  # - Use when: High volume, need speed with some accuracy boost
@@ -286,8 +286,10 @@ app:
286
286
  # - More candidates = better reranking but slower
287
287
  # - Cache directory should be on fast storage
288
288
  #
289
- # Model Selection:
290
- # - ms-marco-TinyBERT-L-2-v2: Fastest, basic accuracy
291
- # - ms-marco-MiniLM-L-6-v2: Fast, good accuracy
292
- # - ms-marco-MiniLM-L-12-v2: Balanced (default)
293
- # - rank-T5-flan: Most accurate, slowest
289
+ # Model Selection (see https://github.com/PrithivirajDamodaran/FlashRank):
290
+ # - ms-marco-TinyBERT-L-2-v2: ~4MB, fastest
291
+ # - ms-marco-MiniLM-L-12-v2: ~34MB, best cross-encoder (default)
292
+ # - rank-T5-flan: ~110MB, best non cross-encoder
293
+ # - ms-marco-MultiBERT-L-12: ~150MB, multilingual (100+ languages)
294
+ # - ce-esci-MiniLM-L12-v2: e-commerce optimized (Amazon ESCI)
295
+ # - miniReranker_arabic_v1: Arabic language
@@ -689,7 +689,7 @@ app:
689
689
  registered_model: # MLflow registered model configuration
690
690
  schema: *retail_schema # Schema where model will be registered
691
691
  name: hardware_store_lakebase_dao
692
- endpoint_name: hardware_store_postgres_beta # Model serving endpoint name
692
+ endpoint_name: hardware_store_lakebase_dao # Model serving endpoint name
693
693
  environment_vars:
694
694
  PGHOST: "{{secrets/retail_ai/PGHOST}}" # Databricks host URL
695
695
  RETAIL_AI_DATABRICKS_CLIENT_ID: "{{secrets/retail_ai/RETAIL_AI_DATABRICKS_CLIENT_ID}}"
@@ -298,12 +298,16 @@ Vector embeddings capture semantic similarity but may rank loosely related docum
298
298
 
299
299
  ### Available Models
300
300
 
301
- | Model | Speed | Quality | Use Case |
302
- |-------|-------|---------|----------|
303
- | `ms-marco-TinyBERT-L-2-v2` | ⚡⚡⚡ Fastest | Good | High-throughput, latency-sensitive |
304
- | `ms-marco-MiniLM-L-6-v2` | ⚡⚡ Fast | Better | Balanced performance |
305
- | `ms-marco-MiniLM-L-12-v2` | Moderate | Best | Default, recommended |
306
- | `rank-T5-flan` | Slower | Excellent | Maximum accuracy |
301
+ See [FlashRank](https://github.com/PrithivirajDamodaran/FlashRank) for the full list of supported models.
302
+
303
+ | Model | Size | Speed | Use Case |
304
+ |-------|------|-------|----------|
305
+ | `ms-marco-TinyBERT-L-2-v2` | ~4MB | ⚡⚡⚡ Fastest | High-throughput, latency-sensitive |
306
+ | `ms-marco-MiniLM-L-12-v2` | ~34MB | ⚡⚡ Fast | Default, best cross-encoder |
307
+ | `rank-T5-flan` | ~110MB | ⚡ Moderate | Best non cross-encoder |
308
+ | `ms-marco-MultiBERT-L-12` | ~150MB | Slower | Multilingual (100+ languages) |
309
+ | `ce-esci-MiniLM-L12-v2` | - | ⚡⚡ Fast | E-commerce optimized |
310
+ | `miniReranker_arabic_v1` | - | ⚡⚡ Fast | Arabic language |
307
311
 
308
312
  ### Configuration Options
309
313
 
@@ -311,11 +315,11 @@ Vector embeddings capture semantic similarity but may rank loosely related docum
311
315
  rerank:
312
316
  model: ms-marco-MiniLM-L-12-v2 # FlashRank model name
313
317
  top_n: 10 # Documents to return (default: all)
314
- cache_dir: /tmp/flashrank_cache # Model weights cache location
318
+ cache_dir: ~/.dao_ai/cache/flashrank # Model weights cache location
315
319
  columns: [description, name] # Columns for Databricks Reranker (optional)
316
320
  ```
317
321
 
318
- **Note:** Model weights are downloaded automatically on first use (~20MB for MiniLM-L-12-v2).
322
+ **Note:** Model weights are downloaded automatically on first use (~34MB for MiniLM-L-12-v2).
319
323
 
320
324
  ## 5. Human-in-the-Loop Approvals
321
325
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dao-ai"
7
- version = "0.1.2"
7
+ version = "0.1.3"
8
8
  description = "DAO AI: A modular, multi-agent orchestration framework for complex AI workflows. Supports agent handoff, tool integration, and dynamic configuration via YAML."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -63,7 +63,6 @@ grandalf==0.8
63
63
  graphene==3.4.3
64
64
  graphql-core==3.2.7
65
65
  graphql-relay==3.2.0
66
- greenlet==3.3.0
67
66
  grpcio==1.76.0
68
67
  grpcio-status==1.76.0
69
68
  gunicorn==23.0.0
@@ -3402,7 +3402,7 @@
3402
3402
  },
3403
3403
  "RerankParametersModel": {
3404
3404
  "additionalProperties": false,
3405
- "description": "Configuration for reranking retrieved documents using FlashRank.\n\nFlashRank provides fast, local reranking without API calls using lightweight\ncross-encoder models. Reranking improves retrieval quality by reordering results\nbased on semantic relevance to the query.\n\nTypical workflow:\n1. Retrieve more documents than needed (e.g., 50 via num_results)\n2. Rerank all retrieved documents\n3. Return top_n best matches (e.g., 5)\n\nExample:\n ```yaml\n retriever:\n search_parameters:\n num_results: 50 # Retrieve more candidates\n rerank:\n model: ms-marco-MiniLM-L-12-v2\n top_n: 5 # Return top 5 after reranking\n ```\n\nAvailable models (from fastest to most accurate):\n- \"ms-marco-TinyBERT-L-2-v2\" (fastest, smallest)\n- \"ms-marco-MiniLM-L-6-v2\"\n- \"ms-marco-MiniLM-L-12-v2\" (default, good balance)\n- \"rank-T5-flan\" (most accurate, slower)",
3405
+ "description": "Configuration for reranking retrieved documents using FlashRank.\n\nFlashRank provides fast, local reranking without API calls using lightweight\ncross-encoder models. Reranking improves retrieval quality by reordering results\nbased on semantic relevance to the query.\n\nTypical workflow:\n1. Retrieve more documents than needed (e.g., 50 via num_results)\n2. Rerank all retrieved documents\n3. Return top_n best matches (e.g., 5)\n\nExample:\n ```yaml\n retriever:\n search_parameters:\n num_results: 50 # Retrieve more candidates\n rerank:\n model: ms-marco-MiniLM-L-12-v2\n top_n: 5 # Return top 5 after reranking\n ```\n\nAvailable models (see https://github.com/PrithivirajDamodaran/FlashRank):\n- \"ms-marco-TinyBERT-L-2-v2\" (~4MB, fastest)\n- \"ms-marco-MiniLM-L-12-v2\" (~34MB, best cross-encoder, default)\n- \"rank-T5-flan\" (~110MB, best non cross-encoder)\n- \"ms-marco-MultiBERT-L-12\" (~150MB, multilingual 100+ languages)\n- \"ce-esci-MiniLM-L12-v2\" (e-commerce optimized, Amazon ESCI)\n- \"miniReranker_arabic_v1\" (Arabic language)",
3406
3406
  "properties": {
3407
3407
  "model": {
3408
3408
  "default": "ms-marco-MiniLM-L-12-v2",
@@ -4336,6 +4336,7 @@
4336
4336
  },
4337
4337
  "VectorStoreModel": {
4338
4338
  "additionalProperties": false,
4339
+ "description": "Configuration model for a Databricks Vector Search store.\n\nSupports two modes:\n1. **Use Existing Index**: Provide only `index` (fully qualified name).\n Used for querying an existing vector search index at runtime.\n2. **Provisioning Mode**: Provide `source_table` + `embedding_source_column`.\n Used for creating a new vector search index.\n\nExamples:\n Minimal configuration (use existing index):\n ```yaml\n vector_stores:\n products_search:\n index:\n name: catalog.schema.my_index\n ```\n\n Full provisioning configuration:\n ```yaml\n vector_stores:\n products_search:\n source_table:\n schema: *my_schema\n name: products\n embedding_source_column: description\n endpoint:\n name: my_endpoint\n ```",
4339
4340
  "properties": {
4340
4341
  "on_behalf_of_user": {
4341
4342
  "anyOf": [
@@ -4492,10 +4493,10 @@
4492
4493
  "default": null,
4493
4494
  "title": "Pat"
4494
4495
  },
4495
- "embedding_model": {
4496
+ "index": {
4496
4497
  "anyOf": [
4497
4498
  {
4498
- "$ref": "#/$defs/LLMModel"
4499
+ "$ref": "#/$defs/IndexModel"
4499
4500
  },
4500
4501
  {
4501
4502
  "type": "null"
@@ -4503,10 +4504,33 @@
4503
4504
  ],
4504
4505
  "default": null
4505
4506
  },
4506
- "index": {
4507
+ "source_table": {
4507
4508
  "anyOf": [
4508
4509
  {
4509
- "$ref": "#/$defs/IndexModel"
4510
+ "$ref": "#/$defs/TableModel"
4511
+ },
4512
+ {
4513
+ "type": "null"
4514
+ }
4515
+ ],
4516
+ "default": null
4517
+ },
4518
+ "embedding_source_column": {
4519
+ "anyOf": [
4520
+ {
4521
+ "type": "string"
4522
+ },
4523
+ {
4524
+ "type": "null"
4525
+ }
4526
+ ],
4527
+ "default": null,
4528
+ "title": "Embedding Source Column"
4529
+ },
4530
+ "embedding_model": {
4531
+ "anyOf": [
4532
+ {
4533
+ "$ref": "#/$defs/LLMModel"
4510
4534
  },
4511
4535
  {
4512
4536
  "type": "null"
@@ -4525,9 +4549,6 @@
4525
4549
  ],
4526
4550
  "default": null
4527
4551
  },
4528
- "source_table": {
4529
- "$ref": "#/$defs/TableModel"
4530
- },
4531
4552
  "source_path": {
4532
4553
  "anyOf": [
4533
4554
  {
@@ -4587,16 +4608,8 @@
4587
4608
  ],
4588
4609
  "default": null,
4589
4610
  "title": "Doc Uri"
4590
- },
4591
- "embedding_source_column": {
4592
- "title": "Embedding Source Column",
4593
- "type": "string"
4594
4611
  }
4595
4612
  },
4596
- "required": [
4597
- "source_table",
4598
- "embedding_source_column"
4599
- ],
4600
4613
  "title": "VectorStoreModel",
4601
4614
  "type": "object"
4602
4615
  },
@@ -715,7 +715,15 @@ def run_databricks_command(
715
715
  target: Optional[str] = None,
716
716
  dry_run: bool = False,
717
717
  ) -> None:
718
- """Execute a databricks CLI command with optional profile and target."""
718
+ """Execute a databricks CLI command with optional profile and target.
719
+
720
+ Args:
721
+ command: The databricks CLI command to execute (e.g., ["bundle", "deploy"])
722
+ profile: Optional Databricks CLI profile name
723
+ config: Optional path to the configuration file
724
+ target: Optional bundle target name
725
+ dry_run: If True, print the command without executing
726
+ """
719
727
  config_path = Path(config) if config else None
720
728
 
721
729
  if config_path and not config_path.exists():
@@ -737,15 +745,17 @@ def run_databricks_command(
737
745
  logger.debug(f"Using app-specific target: {target}")
738
746
 
739
747
  # Build databricks command (no -c flag needed, uses databricks.yaml in current dir)
748
+ # Note: --profile is a global flag, but --target is a subcommand flag for 'bundle'
740
749
  cmd = ["databricks"]
741
750
  if profile:
742
751
  cmd.extend(["--profile", profile])
743
752
 
753
+ cmd.extend(command)
754
+
755
+ # --target must come after the bundle subcommand (it's a subcommand-specific flag)
744
756
  if target:
745
757
  cmd.extend(["--target", target])
746
758
 
747
- cmd.extend(command)
748
-
749
759
  # Add config_path variable for notebooks
750
760
  if config_path and app_config:
751
761
  # Calculate relative path from notebooks directory to config file
@@ -1009,27 +1009,92 @@ class VolumePathModel(BaseModel, HasFullName):
1009
1009
 
1010
1010
 
1011
1011
  class VectorStoreModel(IsDatabricksResource):
1012
+ """
1013
+ Configuration model for a Databricks Vector Search store.
1014
+
1015
+ Supports two modes:
1016
+ 1. **Use Existing Index**: Provide only `index` (fully qualified name).
1017
+ Used for querying an existing vector search index at runtime.
1018
+ 2. **Provisioning Mode**: Provide `source_table` + `embedding_source_column`.
1019
+ Used for creating a new vector search index.
1020
+
1021
+ Examples:
1022
+ Minimal configuration (use existing index):
1023
+ ```yaml
1024
+ vector_stores:
1025
+ products_search:
1026
+ index:
1027
+ name: catalog.schema.my_index
1028
+ ```
1029
+
1030
+ Full provisioning configuration:
1031
+ ```yaml
1032
+ vector_stores:
1033
+ products_search:
1034
+ source_table:
1035
+ schema: *my_schema
1036
+ name: products
1037
+ embedding_source_column: description
1038
+ endpoint:
1039
+ name: my_endpoint
1040
+ ```
1041
+ """
1042
+
1012
1043
  model_config = ConfigDict(use_enum_values=True, extra="forbid")
1013
- embedding_model: Optional[LLMModel] = None
1044
+
1045
+ # RUNTIME: Only index is truly required for querying existing indexes
1014
1046
  index: Optional[IndexModel] = None
1047
+
1048
+ # PROVISIONING ONLY: Required when creating a new index
1049
+ source_table: Optional[TableModel] = None
1050
+ embedding_source_column: Optional[str] = None
1051
+ embedding_model: Optional[LLMModel] = None
1015
1052
  endpoint: Optional[VectorSearchEndpoint] = None
1016
- source_table: TableModel
1053
+
1054
+ # OPTIONAL: For both modes
1017
1055
  source_path: Optional[VolumePathModel] = None
1018
1056
  checkpoint_path: Optional[VolumePathModel] = None
1019
1057
  primary_key: Optional[str] = None
1020
1058
  columns: Optional[list[str]] = Field(default_factory=list)
1021
1059
  doc_uri: Optional[str] = None
1022
- embedding_source_column: str
1060
+
1061
+ @model_validator(mode="after")
1062
+ def validate_configuration_mode(self) -> Self:
1063
+ """
1064
+ Validate that configuration is valid for either:
1065
+ - Use existing mode: index is provided
1066
+ - Provisioning mode: source_table + embedding_source_column provided
1067
+ """
1068
+ has_index = self.index is not None
1069
+ has_source_table = self.source_table is not None
1070
+ has_embedding_col = self.embedding_source_column is not None
1071
+
1072
+ # Must have at least index OR source_table
1073
+ if not has_index and not has_source_table:
1074
+ raise ValueError(
1075
+ "Either 'index' (for existing indexes) or 'source_table' "
1076
+ "(for provisioning) must be provided"
1077
+ )
1078
+
1079
+ # If provisioning mode, need embedding_source_column
1080
+ if has_source_table and not has_embedding_col:
1081
+ raise ValueError(
1082
+ "embedding_source_column is required when source_table is provided (provisioning mode)"
1083
+ )
1084
+
1085
+ return self
1023
1086
 
1024
1087
  @model_validator(mode="after")
1025
1088
  def set_default_embedding_model(self) -> Self:
1026
- if not self.embedding_model:
1089
+ # Only set default embedding model in provisioning mode
1090
+ if self.source_table is not None and not self.embedding_model:
1027
1091
  self.embedding_model = LLMModel(name="databricks-gte-large-en")
1028
1092
  return self
1029
1093
 
1030
1094
  @model_validator(mode="after")
1031
1095
  def set_default_primary_key(self) -> Self:
1032
- if self.primary_key is None:
1096
+ # Only auto-discover primary key in provisioning mode
1097
+ if self.primary_key is None and self.source_table is not None:
1033
1098
  from dao_ai.providers.databricks import DatabricksProvider
1034
1099
 
1035
1100
  provider: DatabricksProvider = DatabricksProvider()
@@ -1050,14 +1115,16 @@ class VectorStoreModel(IsDatabricksResource):
1050
1115
 
1051
1116
  @model_validator(mode="after")
1052
1117
  def set_default_index(self) -> Self:
1053
- if self.index is None:
1118
+ # Only generate index from source_table in provisioning mode
1119
+ if self.index is None and self.source_table is not None:
1054
1120
  name: str = f"{self.source_table.name}_index"
1055
1121
  self.index = IndexModel(schema=self.source_table.schema_model, name=name)
1056
1122
  return self
1057
1123
 
1058
1124
  @model_validator(mode="after")
1059
1125
  def set_default_endpoint(self) -> Self:
1060
- if self.endpoint is None:
1126
+ # Only find/create endpoint in provisioning mode
1127
+ if self.endpoint is None and self.source_table is not None:
1061
1128
  from dao_ai.providers.databricks import (
1062
1129
  DatabricksProvider,
1063
1130
  with_available_indexes,
@@ -1549,11 +1616,13 @@ class RerankParametersModel(BaseModel):
1549
1616
  top_n: 5 # Return top 5 after reranking
1550
1617
  ```
1551
1618
 
1552
- Available models (from fastest to most accurate):
1553
- - "ms-marco-TinyBERT-L-2-v2" (fastest, smallest)
1554
- - "ms-marco-MiniLM-L-6-v2"
1555
- - "ms-marco-MiniLM-L-12-v2" (default, good balance)
1556
- - "rank-T5-flan" (most accurate, slower)
1619
+ Available models (see https://github.com/PrithivirajDamodaran/FlashRank):
1620
+ - "ms-marco-TinyBERT-L-2-v2" (~4MB, fastest)
1621
+ - "ms-marco-MiniLM-L-12-v2" (~34MB, best cross-encoder, default)
1622
+ - "rank-T5-flan" (~110MB, best non cross-encoder)
1623
+ - "ms-marco-MultiBERT-L-12" (~150MB, multilingual 100+ languages)
1624
+ - "ce-esci-MiniLM-L12-v2" (e-commerce optimized, Amazon ESCI)
1625
+ - "miniReranker_arabic_v1" (Arabic language)
1557
1626
  """
1558
1627
 
1559
1628
  model_config = ConfigDict(use_enum_values=True, extra="forbid")
@@ -625,6 +625,22 @@ class DatabricksProvider(ServiceProvider):
625
625
  df.write.mode("overwrite").saveAsTable(table)
626
626
 
627
627
  def create_vector_store(self, vector_store: VectorStoreModel) -> None:
628
+ # Validate that this is a provisioning-mode config
629
+ if vector_store.source_table is None:
630
+ raise ValueError(
631
+ "Cannot create vector store: source_table is required for provisioning. "
632
+ "This VectorStoreModel appears to be configured for 'use existing index' mode. "
633
+ "To provision a new vector store, provide source_table and embedding_source_column."
634
+ )
635
+ if vector_store.embedding_source_column is None:
636
+ raise ValueError(
637
+ "Cannot create vector store: embedding_source_column is required for provisioning."
638
+ )
639
+ if vector_store.endpoint is None:
640
+ raise ValueError(
641
+ "Cannot create vector store: endpoint is required for provisioning."
642
+ )
643
+
628
644
  if not endpoint_exists(self.vsc, vector_store.endpoint.name):
629
645
  self.vsc.create_endpoint_and_wait(
630
646
  name=vector_store.endpoint.name,
@@ -10,8 +10,10 @@ from dao_ai.config import (
10
10
  AppConfig,
11
11
  DatabaseModel,
12
12
  FunctionModel,
13
+ IndexModel,
13
14
  SchemaModel,
14
15
  TableModel,
16
+ VectorStoreModel,
15
17
  )
16
18
  from dao_ai.providers.databricks import DatabricksProvider
17
19
 
@@ -1442,3 +1444,188 @@ def test_create_lakebase_instance_role_with_composite_variable():
1442
1444
  mock_workspace_client.database.get_database_instance_role.assert_called_once()
1443
1445
  call_args = mock_workspace_client.database.get_database_instance_role.call_args
1444
1446
  assert call_args.kwargs["name"] == "test-client-id-456"
1447
+
1448
+
1449
+ # ==================== VectorStoreModel Tests ====================
1450
+
1451
+
1452
+ @pytest.mark.unit
1453
+ def test_vector_store_model_use_existing_index_minimal():
1454
+ """Test VectorStoreModel with minimal config for existing index (use existing mode)."""
1455
+ # Create VectorStoreModel with just an index - this is the minimal config
1456
+ vector_store = VectorStoreModel(
1457
+ index=IndexModel(name="catalog.schema.my_index"),
1458
+ )
1459
+
1460
+ assert vector_store.index is not None
1461
+ assert vector_store.index.full_name == "catalog.schema.my_index"
1462
+ # Provisioning fields should be None
1463
+ assert vector_store.source_table is None
1464
+ assert vector_store.embedding_source_column is None
1465
+ # Endpoint should NOT be auto-discovered (only in provisioning mode)
1466
+ assert vector_store.endpoint is None
1467
+ # Embedding model should NOT be set (only in provisioning mode)
1468
+ assert vector_store.embedding_model is None
1469
+
1470
+
1471
+ @pytest.mark.unit
1472
+ def test_vector_store_model_use_existing_index_with_optional_fields():
1473
+ """Test VectorStoreModel with existing index and optional fields."""
1474
+ vector_store = VectorStoreModel(
1475
+ index=IndexModel(name="catalog.schema.my_index"),
1476
+ columns=["id", "name", "description"],
1477
+ primary_key="id",
1478
+ doc_uri="https://docs.example.com",
1479
+ )
1480
+
1481
+ assert vector_store.index.full_name == "catalog.schema.my_index"
1482
+ assert vector_store.columns == ["id", "name", "description"]
1483
+ assert vector_store.primary_key == "id"
1484
+ assert vector_store.doc_uri == "https://docs.example.com"
1485
+ # Provisioning fields remain None
1486
+ assert vector_store.source_table is None
1487
+ assert vector_store.embedding_source_column is None
1488
+
1489
+
1490
+ @pytest.mark.unit
1491
+ def test_vector_store_model_validation_requires_index_or_source_table():
1492
+ """Test that VectorStoreModel fails without either index or source_table."""
1493
+ with pytest.raises(ValueError) as exc_info:
1494
+ VectorStoreModel()
1495
+
1496
+ assert "Either 'index' (for existing indexes) or 'source_table'" in str(
1497
+ exc_info.value
1498
+ )
1499
+
1500
+
1501
+ @pytest.mark.unit
1502
+ def test_vector_store_model_provisioning_requires_embedding_source_column():
1503
+ """Test that provisioning mode requires embedding_source_column."""
1504
+ schema = SchemaModel(catalog_name="test_catalog", schema_name="test_schema")
1505
+ table = TableModel(schema=schema, name="test_table")
1506
+
1507
+ with pytest.raises(ValueError) as exc_info:
1508
+ VectorStoreModel(source_table=table)
1509
+
1510
+ assert "embedding_source_column is required when source_table is provided" in str(
1511
+ exc_info.value
1512
+ )
1513
+
1514
+
1515
+ @pytest.mark.unit
1516
+ def test_vector_store_model_provisioning_mode():
1517
+ """Test VectorStoreModel in provisioning mode (source_table + embedding_source_column)."""
1518
+ schema = SchemaModel(catalog_name="test_catalog", schema_name="test_schema")
1519
+ table = TableModel(schema=schema, name="test_table")
1520
+
1521
+ # Mock the DatabricksProvider to avoid actual API calls
1522
+ # The import happens inside the validators, so we patch the providers module
1523
+ with patch(
1524
+ "dao_ai.providers.databricks.DatabricksProvider"
1525
+ ) as mock_provider_class:
1526
+ mock_provider = MagicMock()
1527
+ mock_provider.find_primary_key.return_value = ["id"]
1528
+ mock_provider.find_endpoint_for_index.return_value = "test_endpoint"
1529
+ mock_provider_class.return_value = mock_provider
1530
+
1531
+ vector_store = VectorStoreModel(
1532
+ source_table=table,
1533
+ embedding_source_column="description",
1534
+ )
1535
+
1536
+ # Index should be auto-generated
1537
+ assert vector_store.index is not None
1538
+ assert vector_store.index.name == "test_table_index"
1539
+ assert (
1540
+ vector_store.index.full_name == "test_catalog.test_schema.test_table_index"
1541
+ )
1542
+
1543
+ # Default embedding model should be set in provisioning mode
1544
+ assert vector_store.embedding_model is not None
1545
+ assert vector_store.embedding_model.name == "databricks-gte-large-en"
1546
+
1547
+ # Primary key should be auto-discovered
1548
+ assert vector_store.primary_key == "id"
1549
+
1550
+ # Endpoint should be auto-discovered in provisioning mode
1551
+ assert vector_store.endpoint is not None
1552
+ assert vector_store.endpoint.name == "test_endpoint"
1553
+
1554
+
1555
+ @pytest.mark.unit
1556
+ def test_vector_store_model_provisioning_with_explicit_index():
1557
+ """Test that explicit index is respected in provisioning mode."""
1558
+ schema = SchemaModel(catalog_name="test_catalog", schema_name="test_schema")
1559
+ table = TableModel(schema=schema, name="test_table")
1560
+
1561
+ with patch(
1562
+ "dao_ai.providers.databricks.DatabricksProvider"
1563
+ ) as mock_provider_class:
1564
+ mock_provider = MagicMock()
1565
+ mock_provider.find_primary_key.return_value = ["id"]
1566
+ mock_provider.find_endpoint_for_index.return_value = "test_endpoint"
1567
+ mock_provider_class.return_value = mock_provider
1568
+
1569
+ vector_store = VectorStoreModel(
1570
+ source_table=table,
1571
+ embedding_source_column="description",
1572
+ index=IndexModel(schema=schema, name="custom_index"),
1573
+ )
1574
+
1575
+ # Explicit index should be preserved
1576
+ assert vector_store.index.name == "custom_index"
1577
+ assert vector_store.index.full_name == "test_catalog.test_schema.custom_index"
1578
+
1579
+
1580
+ @pytest.mark.unit
1581
+ def test_vector_store_model_use_existing_no_auto_discovery():
1582
+ """Test that use existing mode does not trigger expensive auto-discovery."""
1583
+ # This test ensures no DatabricksProvider calls happen in "use existing" mode
1584
+ with patch(
1585
+ "dao_ai.providers.databricks.DatabricksProvider"
1586
+ ) as mock_provider_class:
1587
+ mock_provider = MagicMock()
1588
+ mock_provider_class.return_value = mock_provider
1589
+
1590
+ vector_store = VectorStoreModel(
1591
+ index=IndexModel(name="catalog.schema.existing_index"),
1592
+ )
1593
+
1594
+ # In use existing mode, no provider methods should be called
1595
+ mock_provider.find_primary_key.assert_not_called()
1596
+ mock_provider.find_endpoint_for_index.assert_not_called()
1597
+ mock_provider.find_vector_search_endpoint.assert_not_called()
1598
+
1599
+ # Verify the model is correctly created
1600
+ assert vector_store.index.full_name == "catalog.schema.existing_index"
1601
+
1602
+
1603
+ @pytest.mark.unit
1604
+ def test_vector_store_model_api_scopes():
1605
+ """Test VectorStoreModel API scopes."""
1606
+ vector_store = VectorStoreModel(
1607
+ index=IndexModel(name="catalog.schema.my_index"),
1608
+ )
1609
+
1610
+ api_scopes = vector_store.api_scopes
1611
+ assert "vectorsearch.vector-search-endpoints" in api_scopes
1612
+ assert "serving.serving-endpoints" in api_scopes
1613
+ assert "vectorsearch.vector-search-indexes" in api_scopes
1614
+
1615
+
1616
+ @pytest.mark.unit
1617
+ def test_create_vector_store_fails_for_use_existing_mode():
1618
+ """Test that create_vector_store raises clear error for use-existing mode config."""
1619
+ # Create a use-existing mode VectorStoreModel
1620
+ vector_store = VectorStoreModel(
1621
+ index=IndexModel(name="catalog.schema.existing_index"),
1622
+ )
1623
+
1624
+ # Try to provision (should fail with clear error)
1625
+ provider = DatabricksProvider(w=MagicMock(), vsc=MagicMock())
1626
+
1627
+ with pytest.raises(ValueError) as exc_info:
1628
+ provider.create_vector_store(vector_store)
1629
+
1630
+ assert "source_table is required for provisioning" in str(exc_info.value)
1631
+ assert "use existing index" in str(exc_info.value).lower()
@@ -54,7 +54,11 @@ def create_mock_vector_store() -> Mock:
54
54
  vector_store.embedding_model = None
55
55
  vector_store.primary_key = "id"
56
56
  vector_store.index = Mock()
57
+ vector_store.index.full_name = "catalog.schema.test_index"
57
58
  vector_store.endpoint = Mock()
59
+ # New optional fields for VectorStoreModel
60
+ vector_store.source_table = None # Use existing index mode
61
+ vector_store.embedding_source_column = None
58
62
  add_databricks_resource_attrs(vector_store)
59
63
  return vector_store
60
64
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes