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.
- {dao_ai-0.1.2 → dao_ai-0.1.3}/PKG-INFO +2 -2
- {dao_ai-0.1.2 → dao_ai-0.1.3}/README.md +1 -1
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/03_reranking/vector_search_with_reranking.yaml +9 -7
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +1 -1
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/key-capabilities.md +12 -8
- {dao_ai-0.1.2 → dao_ai-0.1.3}/pyproject.toml +1 -1
- {dao_ai-0.1.2 → dao_ai-0.1.3}/requirements.txt +0 -1
- {dao_ai-0.1.2 → dao_ai-0.1.3}/schemas/model_config_schema.json +29 -16
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/cli.py +13 -3
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/config.py +81 -12
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/databricks.py +16 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_databricks.py +187 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_reranking.py +4 -0
- dao_ai-0.1.2/src/quick_serve_restaurant/__init__.py +0 -0
- dao_ai-0.1.2/tests/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/.gitignore +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/.python-version +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/CHANGELOG.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/CONTRIBUTING.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/LICENSE +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/Makefile +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/01_getting_started/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/01_getting_started/minimal.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/custom_mcp.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/external_mcp.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/managed_mcp.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/02_mcp/slack_integration.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/03_reranking/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_basic.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/conversation_summarization.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/in_memory_basic.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/05_memory/postgres_persistence.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/06_on_behalf_of_user/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/07_human_in_the_loop/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/08_guardrails/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/09_structured_output/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/09_structured_output/structured_output.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/10_agent_integrations/kasal.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/combined_middleware.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/12_middleware/logging_middleware.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/14_basic_tools/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/brick_store.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/deep_research.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/appointments.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/appointments_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_queries.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_tables.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/brand_rep_demo_validation.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/customers.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/customers_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/dim_stores.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/dim_stores_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_performance.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_performance_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_tasks.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/employee_tasks_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/inventory.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/inventory_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/managers.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/managers_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/product_data.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/products.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/dais2025/task_assignments.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/inventory.snappy.parquet +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/inventory.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/products.snappy.parquet +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/hardware_store/products.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_description.csv +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_description.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_raw.csv +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/items_raw.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/orders_raw.csv +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/data/quick_serve_restaurant/orders_raw.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/databricks.yaml.template +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/architecture.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/cli-reference.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/configuration-reference.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/contributing.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/examples.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/faq.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/README.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/retail_supervisor.png +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/hardware_store/retail_swarm.png +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/images/genie.png +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/python-api.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/docs/why-dao.md +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/environment.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/dais2025/examples.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/deep_research/examples.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/executive_assistant/examples.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/hardware_store/examples.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/examples/quick_serve_restaurant/examples.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/extract_store_numbers.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_by_number.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/01_ingest_and_transform.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/02_provision_vector_search.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/03_provision_lakebase.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/04_unity_catalog_tools.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/05_deploy_agent.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/06_generate_evaluation_data.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/07_run_evaluation.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/08_run_examples.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/09_evaluate_inferences.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/10_optimize_prompts.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/notebooks/99_scratchpad.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/schemas/bundle_config_schema.json +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/models.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/customer.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/employee.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/executive.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/genie.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/inventory.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/models.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dais2025/tools/store.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/agent_as_code.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/catalog.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/base.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/lru.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/cache/semantic.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/genie/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/graph.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/hooks/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/hooks/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/logging.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/base.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/databricks.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/memory/postgres.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/messages.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/assertions.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/base.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/guardrails.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/message_validation.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/middleware/summarization.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/models.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/nodes.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/optimization.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/supervisor.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/orchestration/swarm.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/prompts.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/providers/base.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/state.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/__init__.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/agent.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/core.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/email.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/genie.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/mcp.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/memory.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/python.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/search.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/slack.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/sql.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/time.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/unity_catalog.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/tools/vector_search.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/types.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/utils.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/src/dao_ai/vector_search.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/config/test_model_config.yaml +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/conftest.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_agent_response_format.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_assertions_middleware.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_catalog.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_chat_history.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_config.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_function_parsing.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_genie_room_model.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_guardrail_retry.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hitl_config_model.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_hooks.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_human_in_the_loop.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_inference.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_inference_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_input_output_structure.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_interrupt_type.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_mcp.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_mcp_function_model.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_message_validation_middleware.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_messages.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_models.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_optimization.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_postgres_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_prompt_optimizations.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_prompts.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_reranking_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_response_format.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_responses_agent_structured_output_unit.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_semantic_cache_context.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_sql_tool.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_sql_tool_integration.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_state.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_summarization_inference.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_swarm_middleware.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_tools.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_types.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_unity_catalog.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_utils.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/test_vector_search.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/dao_ai/weather_server_mcp.py +0 -0
- {dao_ai-0.1.2/src/quick_serve_restaurant → dao_ai-0.1.3/tests/hardware_store}/.gitkeep +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/hardware_store/test_graph.py +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/images/doritos_upc.png +0 -0
- {dao_ai-0.1.2 → dao_ai-0.1.3}/tests/images/lays_upc.png +0 -0
- {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.
|
|
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
|
-
[](CHANGELOG.md)
|
|
83
83
|
[](https://www.python.org/)
|
|
84
84
|
[](LICENSE)
|
|
85
85
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DAO: Declarative Agent Orchestration
|
|
2
2
|
|
|
3
|
-
[](CHANGELOG.md)
|
|
4
4
|
[](https://www.python.org/)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
{dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/03_reranking/vector_search_with_reranking.yaml
RENAMED
|
@@ -83,7 +83,7 @@ retrievers:
|
|
|
83
83
|
filters: {}
|
|
84
84
|
query_type: ANN
|
|
85
85
|
rerank: # Custom reranking configuration
|
|
86
|
-
model: ms-marco-
|
|
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-
|
|
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:
|
|
291
|
-
# - ms-marco-MiniLM-L-
|
|
292
|
-
# -
|
|
293
|
-
# -
|
|
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
|
{dao_ai-0.1.2 → dao_ai-0.1.3}/config/examples/15_complete_applications/hardware_store_lakebase.yaml
RENAMED
|
@@ -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:
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
|
304
|
-
|
|
305
|
-
| `ms-marco-
|
|
306
|
-
| `
|
|
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: /
|
|
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 (~
|
|
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.
|
|
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" }
|
|
@@ -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 (
|
|
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
|
-
"
|
|
4496
|
+
"index": {
|
|
4496
4497
|
"anyOf": [
|
|
4497
4498
|
{
|
|
4498
|
-
"$ref": "#/$defs/
|
|
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
|
-
"
|
|
4507
|
+
"source_table": {
|
|
4507
4508
|
"anyOf": [
|
|
4508
4509
|
{
|
|
4509
|
-
"$ref": "#/$defs/
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
1553
|
-
- "ms-marco-TinyBERT-L-2-v2" (
|
|
1554
|
-
- "ms-marco-MiniLM-L-
|
|
1555
|
-
- "
|
|
1556
|
-
- "
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|