dao-ai 0.0.24__tar.gz → 0.0.25__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 (353) hide show
  1. {dao_ai-0.0.24 → dao_ai-0.0.25}/.gitignore +3 -0
  2. {dao_ai-0.0.24 → dao_ai-0.0.25}/Makefile +1 -1
  3. {dao_ai-0.0.24 → dao_ai-0.0.25}/PKG-INFO +1 -1
  4. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/quick_serve_restaurant/quick-serve-restaurant.yaml +72 -43
  5. dao_ai-0.0.24/databricks.yaml → dao_ai-0.0.25/databricks.yaml.template +9 -7
  6. {dao_ai-0.0.24 → dao_ai-0.0.25}/pyproject.toml +1 -1
  7. {dao_ai-0.0.24 → dao_ai-0.0.25}/schemas/model_config_schema.json +10 -6
  8. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/cli.py +77 -18
  9. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/config.py +1 -1
  10. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_databricks.py +18 -0
  11. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_genie_databricks_integration.py +2 -0
  12. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_inference_integration.py +3 -1
  13. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_postgres_integration.py +1 -0
  14. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_prompts.py +10 -250
  15. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/hardware_store/test_graph.py +2 -0
  16. {dao_ai-0.0.24 → dao_ai-0.0.25}/.python-version +0 -0
  17. {dao_ai-0.0.24 → dao_ai-0.0.25}/CHANGELOG.md +0 -0
  18. {dao_ai-0.0.24 → dao_ai-0.0.25}/CONTRIBUTING.md +0 -0
  19. {dao_ai-0.0.24 → dao_ai-0.0.25}/LICENSE +0 -0
  20. {dao_ai-0.0.24 → dao_ai-0.0.25}/README.md +0 -0
  21. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/Makefile +0 -0
  22. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/REFACTORING_SUMMARY.md +0 -0
  23. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/base-environment-serverless.yaml +0 -0
  24. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/demo_docs/BRAND_REP_DEMO_SUMMARY.md +0 -0
  25. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/demo_docs/demo_scripts/brand_rep_product_education_demo.md +0 -0
  26. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/demo_docs/demo_scripts/store_associate_ai_assistant_demo.md +0 -0
  27. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/demo_docs/demo_scripts/store_manager_alert_response_demo.md +0 -0
  28. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/development_workflows.md +0 -0
  29. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/.gitkeep +0 -0
  30. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/Makefile +0 -0
  31. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agent_implementation.mmd +0 -0
  32. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agent_tools_architecture.mmd +0 -0
  33. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/agent-troubleshooting.md +0 -0
  34. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-best-practices.md +0 -0
  35. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-development-patterns.md +0 -0
  36. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-performance.md +0 -0
  37. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-quickstart.md +0 -0
  38. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/ai-agents.md +0 -0
  39. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/overview.md +0 -0
  40. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/references/agent-reference.md +0 -0
  41. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/agents-and-tools/references/tools-reference.md +0 -0
  42. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/applications/streamlit-app.md +0 -0
  43. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/architecture/overview.md +0 -0
  44. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/architecture.mmd +0 -0
  45. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/architecture.png +0 -0
  46. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/customer_preparation_guide.md +0 -0
  47. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/databricks_integration.mmd +0 -0
  48. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/deployment/production.md +0 -0
  49. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/development/contributing.md +0 -0
  50. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/employee_tools_guide.md +0 -0
  51. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/getting-started/installation.md +0 -0
  52. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/getting-started/mkdocs-quickstart.md +0 -0
  53. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/getting-started/quick-start.md +0 -0
  54. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/index.md +0 -0
  55. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/mkdocs.yml +0 -0
  56. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/scenario_1_architecture.mmd +0 -0
  57. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/scenario_1_flow.mmd +0 -0
  58. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/setup-docs.sh +0 -0
  59. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/task_assignment_workflow_guide.md +0 -0
  60. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/docs/tools/overview.md +0 -0
  61. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/examples/customer_preparation_workflow.py +0 -0
  62. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/examples/task_assignment_workflow.py +0 -0
  63. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/load-env.sh +0 -0
  64. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/CSS_REFACTORING_SUMMARY.md +0 -0
  65. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/DEMO_CONTROLS_RESTORED.md +0 -0
  66. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/DEMO_IMPLEMENTATION_SUMMARY.md +0 -0
  67. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/DEMO_QUICK_START.md +0 -0
  68. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/Dockerfile +0 -0
  69. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/HOMEPAGE_README.md +0 -0
  70. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/Makefile +0 -0
  71. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/README.md +0 -0
  72. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/app.py +0 -0
  73. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/app.yaml +0 -0
  74. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/__init__.py +0 -0
  75. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/backup_homepage.py +0 -0
  76. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/chat.py +0 -0
  77. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/enhanced_charts.py +0 -0
  78. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/enhanced_navigation.py +0 -0
  79. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/__init__.py +0 -0
  80. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/__init__.py +0 -0
  81. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/associate_homepage.py +0 -0
  82. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/dashboard_tab.py +0 -0
  83. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/my_tasks_tab.py +0 -0
  84. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/performance_tab.py +0 -0
  85. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/products_tab.py +0 -0
  86. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/schedule_tab.py +0 -0
  87. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/__init__.py +0 -0
  88. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/chat_integration.py +0 -0
  89. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/kpi_summary.py +0 -0
  90. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/notifications.py +0 -0
  91. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/homepage.py +0 -0
  92. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/__init__.py +0 -0
  93. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/alerts_tab.py +0 -0
  94. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/analytics_tab.py +0 -0
  95. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/dashboard_tab.py +0 -0
  96. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/demo_alerts.py +0 -0
  97. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/inventory_tab.py +0 -0
  98. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/manager_homepage.py +0 -0
  99. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/operations_tab.py +0 -0
  100. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/team_tab.py +0 -0
  101. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/__init__.py +0 -0
  102. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/ai_insights_tab.py +0 -0
  103. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/executive_dashboard_tab.py +0 -0
  104. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/geographical_analysis_tab.py +0 -0
  105. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/performance_metrics_tab.py +0 -0
  106. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/strategic_insights_tab.py +0 -0
  107. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/vp_homepage.py +0 -0
  108. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/metrics.py +0 -0
  109. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/navigation.py +0 -0
  110. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/oldhomepage.py +0 -0
  111. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/components/styles.py +0 -0
  112. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/config.yaml +0 -0
  113. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/demo_docs/BRAND_REP_DEMO_SUMMARY.md +0 -0
  114. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/demo_docs/comprehensive_demo_script.md +0 -0
  115. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/brand_rep_product_education_demo.md +0 -0
  116. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/store_associate_ai_assistant_demo.md +0 -0
  117. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/store_manager_alert_response_demo.md +0 -0
  118. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/README.md +0 -0
  119. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/__init__.py +0 -0
  120. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/components/__init__.py +0 -0
  121. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/components/dashboard_card.py +0 -0
  122. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/demo_alerts.py +0 -0
  123. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/dev/examples/sample_dashboard.py +0 -0
  124. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages/__init__.py +0 -0
  125. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages/component_showcase.py +0 -0
  126. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages/dev_playground.py +0 -0
  127. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages/playground.py +0 -0
  128. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/daily_operations.py +0 -0
  129. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/inventory.py +0 -0
  130. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/my_schedule.py +0 -0
  131. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/my_tasks.py +0 -0
  132. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/orders.py +0 -0
  133. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/products_promotions.py +0 -0
  134. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/staff.py +0 -0
  135. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pages_wip/team_insights.py +0 -0
  136. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/pyproject.toml +0 -0
  137. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/requirements.txt +0 -0
  138. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/static/css/style.css +0 -0
  139. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/README.md +0 -0
  140. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/__init__.py +0 -0
  141. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/base.py +0 -0
  142. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/components.py +0 -0
  143. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/dashboard.py +0 -0
  144. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/homepage.py +0 -0
  145. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/styles/theme.py +0 -0
  146. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/test_vip_notification.py +0 -0
  147. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/tests/test_calculations.py +0 -0
  148. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/utils/config.py +0 -0
  149. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/utils/database.py +0 -0
  150. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/utils/model_serving.py +0 -0
  151. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app/utils/store_context.py +0 -0
  152. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/Makefile +0 -0
  153. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/README.md +0 -0
  154. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/app.py +0 -0
  155. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/__init__.py +0 -0
  156. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/__init__.py +0 -0
  157. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_components.py +0 -0
  158. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_components_enhanced.py +0 -0
  159. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_styles.py +0 -0
  160. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin_styles.py +0 -0
  161. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/TAILADMIN_README.md +0 -0
  162. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/homepage_tailadmin.py +0 -0
  163. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/tailadmin_demo.py +0 -0
  164. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/tailadmin_implementation_guide.py +0 -0
  165. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/test_vp_dashboard.py +0 -0
  166. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/vp_dashboard_enhanced.py +0 -0
  167. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/vp_dashboard_tailadmin.py +0 -0
  168. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/components_demo.py +0 -0
  169. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/homepage.py +0 -0
  170. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/implementation_guide.py +0 -0
  171. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/vp_dashboard_clean.py +0 -0
  172. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/vp_dashboard_enhanced.py +0 -0
  173. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pyproject.toml +0 -0
  174. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/tests/__init__.py +0 -0
  175. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/streamlit_store_app_tailadmin/tests/test_imports.py +0 -0
  176. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/.gitkeep +0 -0
  177. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/README.md +0 -0
  178. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/images/doritos_upc.png +0 -0
  179. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/images/lays_upc.png +0 -0
  180. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/manager_demo_script.md +0 -0
  181. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/notebook_vector_search_test.py +0 -0
  182. {dao_ai-0.0.24 → dao_ai-0.0.25}/apps/dais2025/store-app/tests/test_vector_search_integration.py +0 -0
  183. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/dais2025/model_config_dais.yaml +0 -0
  184. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/deep_research.yaml +0 -0
  185. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/executive_assistant.yaml +0 -0
  186. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/genie.yaml +0 -0
  187. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/genie_and_vector_search.yaml +0 -0
  188. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/genie_with_conversion_id.yaml +0 -0
  189. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/human_in_the_loop.yaml +0 -0
  190. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/jira.yaml +0 -0
  191. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/mcp.yaml +0 -0
  192. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/mcp_with_uc_connection.yaml +0 -0
  193. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/minimal.yaml +0 -0
  194. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/prompt_registry.yaml +0 -0
  195. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/reservations.yaml +0 -0
  196. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/examples/slack.yaml +0 -0
  197. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/hardware_store/supervisor.yaml +0 -0
  198. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/hardware_store/supervisor_postgres.yaml +0 -0
  199. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/hardware_store/swarm.yaml +0 -0
  200. {dao_ai-0.0.24 → dao_ai-0.0.25}/config/quick_serve_restaurant/.gitkeep +0 -0
  201. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/appointments.sql +0 -0
  202. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/appointments_data.sql +0 -0
  203. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/brand_rep_demo_data.sql +0 -0
  204. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/brand_rep_demo_queries.sql +0 -0
  205. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/brand_rep_demo_tables.sql +0 -0
  206. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/brand_rep_demo_validation.sql +0 -0
  207. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/customers.sql +0 -0
  208. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/customers_data.sql +0 -0
  209. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/dim_stores.sql +0 -0
  210. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/dim_stores_data.sql +0 -0
  211. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/employee_performance.sql +0 -0
  212. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/employee_performance_data.sql +0 -0
  213. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/employee_tasks.sql +0 -0
  214. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/employee_tasks_data.sql +0 -0
  215. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/inventory.sql +0 -0
  216. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/inventory_data.sql +0 -0
  217. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/managers.sql +0 -0
  218. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/managers_data.sql +0 -0
  219. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/product_data.sql +0 -0
  220. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/products.sql +0 -0
  221. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/dais2025/task_assignments.sql +0 -0
  222. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/hardware_store/inventory.snappy.parquet +0 -0
  223. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/hardware_store/inventory.sql +0 -0
  224. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/hardware_store/products.snappy.parquet +0 -0
  225. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/hardware_store/products.sql +0 -0
  226. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/.gitkeep +0 -0
  227. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
  228. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/items_description.csv +0 -0
  229. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/items_description.sql +0 -0
  230. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/items_raw.csv +0 -0
  231. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/items_raw.sql +0 -0
  232. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/orders_raw.csv +0 -0
  233. {dao_ai-0.0.24 → dao_ai-0.0.25}/data/quick_serve_restaurant/orders_raw.sql +0 -0
  234. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/genie.png +0 -0
  235. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/hardware_store/README.md +0 -0
  236. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/hardware_store/retail_supervisor.png +0 -0
  237. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/hardware_store/retail_swarm.png +0 -0
  238. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/quick_serve_restaurant/.gitkeep +0 -0
  239. {dao_ai-0.0.24 → dao_ai-0.0.25}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
  240. {dao_ai-0.0.24 → dao_ai-0.0.25}/environment.yaml +0 -0
  241. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/dais2025/examples.yaml +0 -0
  242. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/deep_research/examples.yaml +0 -0
  243. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/executive_assistant/examples.yaml +0 -0
  244. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/hardware_store/examples.yaml +0 -0
  245. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/quick_serve_restaurant/.gitkeep +0 -0
  246. {dao_ai-0.0.24 → dao_ai-0.0.25}/examples/quick_serve_restaurant/examples.yaml +0 -0
  247. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/extract_store_numbers.sql +0 -0
  248. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_inventory_by_sku.sql +0 -0
  249. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_inventory_by_upc.sql +0 -0
  250. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_product_by_sku.sql +0 -0
  251. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_product_by_upc.sql +0 -0
  252. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_store_by_number.sql +0 -0
  253. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
  254. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
  255. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
  256. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
  257. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_product_by_sku.sql +0 -0
  258. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_product_by_upc.sql +0 -0
  259. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
  260. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
  261. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/quick_serve_restaurant/.gitkeep +0 -0
  262. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
  263. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
  264. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
  265. {dao_ai-0.0.24 → dao_ai-0.0.25}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
  266. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/01_ingest_and_transform.py +0 -0
  267. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/02_provision_vector_search.py +0 -0
  268. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/03_provision_lakebase.py +0 -0
  269. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/04_unity_catalog_tools.py +0 -0
  270. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/05_deploy_agent.py +0 -0
  271. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/06_generate_evaluation_data.py +0 -0
  272. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/07_run_evaluation.py +0 -0
  273. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/08_run_examples.py +0 -0
  274. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/09_evaluate_inferences.py +0 -0
  275. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/99_scratchpad.py +0 -0
  276. {dao_ai-0.0.24 → dao_ai-0.0.25}/notebooks/INVESTech.py +0 -0
  277. {dao_ai-0.0.24 → dao_ai-0.0.25}/requirements.txt +0 -0
  278. {dao_ai-0.0.24 → dao_ai-0.0.25}/schemas/bundle_config_schema.json +0 -0
  279. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/__init__.py +0 -0
  280. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/models.py +0 -0
  281. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/__init__.py +0 -0
  282. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/customer.py +0 -0
  283. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/employee.py +0 -0
  284. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/executive.py +0 -0
  285. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/genie.py +0 -0
  286. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/inventory.py +0 -0
  287. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/models.py +0 -0
  288. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dais2025/tools/store.py +0 -0
  289. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/__init__.py +0 -0
  290. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/agent_as_code.py +0 -0
  291. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/catalog.py +0 -0
  292. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/chat_models.py +0 -0
  293. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/graph.py +0 -0
  294. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/guardrails.py +0 -0
  295. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/hooks/__init__.py +0 -0
  296. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/hooks/core.py +0 -0
  297. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/memory/__init__.py +0 -0
  298. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/memory/base.py +0 -0
  299. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/memory/core.py +0 -0
  300. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/memory/postgres.py +0 -0
  301. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/messages.py +0 -0
  302. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/models.py +0 -0
  303. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/nodes.py +0 -0
  304. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/prompts.py +0 -0
  305. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/providers/__init__.py +0 -0
  306. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/providers/base.py +0 -0
  307. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/providers/databricks.py +0 -0
  308. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/state.py +0 -0
  309. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/__init__.py +0 -0
  310. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/agent.py +0 -0
  311. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/core.py +0 -0
  312. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/genie.py +0 -0
  313. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/human_in_the_loop.py +0 -0
  314. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/mcp.py +0 -0
  315. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/python.py +0 -0
  316. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/slack.py +0 -0
  317. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/time.py +0 -0
  318. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/unity_catalog.py +0 -0
  319. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/tools/vector_search.py +0 -0
  320. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/types.py +0 -0
  321. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/utils.py +0 -0
  322. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/dao_ai/vector_search.py +0 -0
  323. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/hardware_store/__init__.py +0 -0
  324. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/hardware_store/hooks.py +0 -0
  325. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/hardware_store/tools.py +0 -0
  326. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/quick_serve_restaurant/.gitkeep +0 -0
  327. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/quick_serve_restaurant/__init__.py +0 -0
  328. {dao_ai-0.0.24 → dao_ai-0.0.25}/src/quick_serve_restaurant/tools.py +0 -0
  329. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/config/test_model_config.yaml +0 -0
  330. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/conftest.py +0 -0
  331. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_catalog.py +0 -0
  332. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_chat_history.py +0 -0
  333. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_config.py +0 -0
  334. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_function_parsing.py +0 -0
  335. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_genie.py +0 -0
  336. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
  337. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_hooks.py +0 -0
  338. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_inference.py +0 -0
  339. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_mcp.py +0 -0
  340. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_messages.py +0 -0
  341. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_models.py +0 -0
  342. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_state.py +0 -0
  343. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_summarization_inference.py +0 -0
  344. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_tools.py +0 -0
  345. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_types.py +0 -0
  346. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_unity_catalog.py +0 -0
  347. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_utils.py +0 -0
  348. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/test_vector_search.py +0 -0
  349. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/dao_ai/weather_server_mcp.py +0 -0
  350. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/hardware_store/.gitkeep +0 -0
  351. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/images/doritos_upc.png +0 -0
  352. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/images/lays_upc.png +0 -0
  353. {dao_ai-0.0.24 → dao_ai-0.0.25}/tests/quick_serve_restaurant/.gitkeep +0 -0
@@ -273,3 +273,6 @@ tags
273
273
  .databricks
274
274
 
275
275
  mlruns/
276
+
277
+ # Generated bundle configurations (created from databricks.yaml.template at deployment time)
278
+ databricks.yaml
@@ -64,7 +64,7 @@ schema: depends
64
64
  @$(PYTHON) -c "from dao_ai.config import AppConfig; import json; print(json.dumps(AppConfig.model_json_schema(), indent=2))"
65
65
 
66
66
  test:
67
- $(PYTEST) $(TEST_DIR)
67
+ $(PYTEST) -ra --tb=short $(TEST_DIR)
68
68
 
69
69
  help:
70
70
  $(info TOP_DIR: $(TOP_DIR))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao-ai
3
- Version: 0.0.24
3
+ Version: 0.0.25
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
@@ -261,51 +261,30 @@ tools:
261
261
  name: dao_ai.tools.current_time_tool
262
262
 
263
263
 
264
- # =============================================================================
265
- # MEMORY CONFIGURATION
266
- # =============================================================================
267
- # Configure persistent storage for agent conversations and context
268
-
269
- memory: &memory
270
- # Conversation checkpointing for state persistence
271
- checkpointer:
272
- name: default_checkpointer # Checkpointer identifier
273
- #type: postgres # Store type (memory or postgres)
274
- type: memory
275
- database: *qsr_database # Reference to database configuration
276
-
277
- # Long-term memory store for agent context
278
- store:
279
- name: default_store # Store identifier
280
- #type: postgres # Store type (memory or postgres)
281
- type: memory
282
- embedding_model: *embedding_model # Model for semantic memory
283
- dims: 1536 # Embedding dimensions
284
- database: *qsr_database # Database for persistence (if needed)
285
- namespace: "{user_id}"
286
-
287
- # =============================================================================
288
- # AGENTS CONFIGURATION
289
- # =============================================================================
290
- # Define specialized agents for different aspects of customer service
291
- # Each agent has specific tools, capabilities, and responsibilities
292
-
293
- agents:
264
+ # ==============================================================================
265
+ # PROMPTS CONFIGURATION
266
+ # ==============================================================================
267
+ # Define reusable prompts that can be stored in MLflow Prompt Registry
268
+ #
269
+ # Prompts support:
270
+ # - default_template: Fallback template when registry is unavailable
271
+ # - description: Used as commit message when syncing to registry
272
+ # - alias: Reference specific versions (e.g., "production", "staging")
273
+ # - version: Pin to specific version number
274
+ # - tags: Metadata and organization
275
+ #
276
+ # Priority: Registry > default_template (registry is source of truth)
277
+ # ==============================================================================
278
+
279
+ prompts:
294
280
  # ---------------------------------------------------------------------------
295
- # BARISTA AGENT
281
+ # Barista Agent Prompt
296
282
  # ---------------------------------------------------------------------------
297
- # Expert coffee shop agent specialized in menu inquiries, recommendations, ordering, and order history
298
- barista: &barista
299
- name: barista # Agent identifier
300
- description: "Expert coffee shop barista specializing in menu recommendations, coffee ordering, price inquiries, item descriptions, and order history. Can find products by description, match items within price ranges, process coffee orders, and retrieve historical order data."
301
- model: *tool_calling_llm # Reference to LLM configuration
302
- tools:
303
- - *insert_coffee_order_tool
304
- - *match_item_by_description_and_price_tool
305
- - *match_historical_item_order_by_date_tool
306
- - *lookup_items_by_descriptions_tool
307
- - *current_time_tool
308
- prompt: | # System prompt defining agent behavior
283
+ barista_prompt: &barista_prompt
284
+ schema: *qsr_schema
285
+ name: barista_prompt
286
+ description: "Expert coffee shop barista prompt for menu recommendations, ordering, and order history"
287
+ default_template: |
309
288
  ### User Information
310
289
  - **User Id**: {user_id}
311
290
  - **Session ID**: {thread_id}
@@ -352,6 +331,56 @@ agents:
352
331
  **Handle Ambiguity**: If a customer's request is unclear, use your tools to show options and let them choose.
353
332
 
354
333
  You are friendly, knowledgeable, and always ready to help customers find exactly what they're looking for!
334
+ tags:
335
+ environment: production
336
+ agent_name: barista
337
+
338
+ # =============================================================================
339
+ # MEMORY CONFIGURATION
340
+ # =============================================================================
341
+ # Configure persistent storage for agent conversations and context
342
+
343
+ memory: &memory
344
+ # Conversation checkpointing for state persistence
345
+ checkpointer:
346
+ name: default_checkpointer # Checkpointer identifier
347
+ #type: postgres # Store type (memory or postgres)
348
+ type: memory
349
+ database: *qsr_database # Reference to database configuration
350
+
351
+ # Long-term memory store for agent context
352
+ store:
353
+ name: default_store # Store identifier
354
+ #type: postgres # Store type (memory or postgres)
355
+ type: memory
356
+ embedding_model: *embedding_model # Model for semantic memory
357
+ dims: 1536 # Embedding dimensions
358
+ database: *qsr_database # Database for persistence (if needed)
359
+ namespace: "{user_id}"
360
+
361
+ # =============================================================================
362
+ # AGENTS CONFIGURATION
363
+ # =============================================================================
364
+ # Define specialized agents for different aspects of customer service
365
+ # Each agent has specific tools, capabilities, and responsibilities
366
+
367
+ agents:
368
+ # ---------------------------------------------------------------------------
369
+ # BARISTA AGENT (Using Prompt Reference - Recommended)
370
+ # ---------------------------------------------------------------------------
371
+ # Expert coffee shop agent specialized in menu inquiries, recommendations, ordering, and order history
372
+ # This example shows how to use a prompt reference from the prompts section
373
+ barista: &barista
374
+ name: barista # Agent identifier
375
+ description: "Expert coffee shop barista specializing in menu recommendations, coffee ordering, price inquiries, item descriptions, and order history. Can find products by description, match items within price ranges, process coffee orders, and retrieve historical order data."
376
+ model: *tool_calling_llm # Reference to LLM configuration
377
+ tools:
378
+ - *insert_coffee_order_tool
379
+ - *match_item_by_description_and_price_tool
380
+ - *match_historical_item_order_by_date_tool
381
+ - *lookup_items_by_descriptions_tool
382
+ - *current_time_tool
383
+ prompt: *barista_prompt # Reference to prompt (instead of inline)
355
384
  handoff_prompt: |
356
385
  Coffee shop inquiries including menu questions, item recommendations, price checks, coffee ordering, taste descriptions, and order history.
357
386
  Examples: "What coffee drinks do you have?", "I'd like a medium latte", "What's good for under $4?", "What did I order yesterday?", "Tell me about your cold brew", "Can you recommend something sweet?"
@@ -1,7 +1,7 @@
1
1
  # yaml-language-server: $schema=./schemas/bundle_config_schema.json
2
2
 
3
3
  bundle:
4
- name: dao-ai-bundle
4
+ name: __APP_NAME__
5
5
 
6
6
  artifacts:
7
7
  default:
@@ -12,17 +12,19 @@ artifacts:
12
12
  variables:
13
13
  config_path:
14
14
  description: Path to the configuration file for the job.
15
- default: ../config/model_config.yaml
16
15
  node_type:
17
16
  description: The job compute node type
18
17
  default: Standard_D4ads_v5
19
- app_name:
20
- description: The job name
21
18
 
22
19
  resources:
23
20
  jobs:
24
- deploy-end-to-end:
25
- name: ${var.app_name}
21
+ # The job name and bundle name are templated and replaced by CLI at deployment time
22
+ # This allows multiple apps to coexist with separate bundle identities
23
+ deploy_job:
24
+ name: __APP_NAME__-job
25
+ tags:
26
+ app_name: __APP_NAME__
27
+ config_path: ${var.config_path}
26
28
  job_clusters:
27
29
  - job_cluster_key: common-cluster
28
30
  new_cluster:
@@ -92,7 +94,7 @@ resources:
92
94
  environment_key: dao-ai-env
93
95
 
94
96
  targets:
95
- dev:
97
+ __APP_NAME__:
96
98
  mode: development
97
99
  default: true
98
100
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dao-ai"
7
- version = "0.0.24"
7
+ version = "0.0.25"
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" }
@@ -548,14 +548,18 @@
548
548
  "title": "Messages"
549
549
  },
550
550
  "custom_inputs": {
551
- "additionalProperties": true,
552
- "title": "Custom Inputs",
553
- "type": "object"
551
+ "anyOf": [
552
+ {
553
+ "additionalProperties": true,
554
+ "type": "object"
555
+ },
556
+ {
557
+ "type": "null"
558
+ }
559
+ ],
560
+ "title": "Custom Inputs"
554
561
  }
555
562
  },
556
- "required": [
557
- "custom_inputs"
558
- ],
559
563
  "title": "ChatPayload",
560
564
  "type": "object"
561
565
  },
@@ -460,6 +460,49 @@ def setup_logging(verbosity: int) -> None:
460
460
  logger.add(sys.stderr, level=level)
461
461
 
462
462
 
463
+ def generate_bundle_from_template(config_path: Path, app_name: str) -> Path:
464
+ """
465
+ Generate an app-specific databricks.yaml from databricks.yaml.template.
466
+
467
+ This function:
468
+ 1. Reads databricks.yaml.template (permanent template file)
469
+ 2. Replaces __APP_NAME__ with the actual app name
470
+ 3. Writes to databricks.yaml (overwrites if exists)
471
+ 4. Returns the path to the generated file
472
+
473
+ The generated databricks.yaml is overwritten on each deployment and is not tracked in git.
474
+ Schema reference remains pointing to ./schemas/bundle_config_schema.json.
475
+
476
+ Args:
477
+ config_path: Path to the app config file
478
+ app_name: Normalized app name
479
+
480
+ Returns:
481
+ Path to the generated databricks.yaml file
482
+ """
483
+ cwd = Path.cwd()
484
+ template_path = cwd / "databricks.yaml.template"
485
+ output_path = cwd / "databricks.yaml"
486
+
487
+ if not template_path.exists():
488
+ logger.error(f"Template file {template_path} does not exist.")
489
+ sys.exit(1)
490
+
491
+ # Read template
492
+ with open(template_path, "r") as f:
493
+ template_content = f.read()
494
+
495
+ # Replace template variables
496
+ bundle_content = template_content.replace("__APP_NAME__", app_name)
497
+
498
+ # Write generated databricks.yaml (overwrite if exists)
499
+ with open(output_path, "w") as f:
500
+ f.write(bundle_content)
501
+
502
+ logger.info(f"Generated bundle configuration at {output_path} from template")
503
+ return output_path
504
+
505
+
463
506
  def run_databricks_command(
464
507
  command: list[str],
465
508
  profile: Optional[str] = None,
@@ -467,44 +510,55 @@ def run_databricks_command(
467
510
  target: Optional[str] = None,
468
511
  dry_run: bool = False,
469
512
  ) -> None:
470
- """Execute a databricks CLI command with optional profile."""
513
+ """Execute a databricks CLI command with optional profile and target."""
514
+ config_path = Path(config) if config else None
515
+
516
+ if config_path and not config_path.exists():
517
+ logger.error(f"Configuration file {config_path} does not exist.")
518
+ sys.exit(1)
519
+
520
+ # Load app config and generate bundle from template
521
+ app_config: AppConfig = AppConfig.from_file(config_path) if config_path else None
522
+ normalized_name: str = normalize_name(app_config.app.name) if app_config else None
523
+
524
+ # Generate app-specific bundle from template (overwrites databricks.yaml temporarily)
525
+ if config_path and app_config:
526
+ generate_bundle_from_template(config_path, normalized_name)
527
+
528
+ # Use app name as target if not explicitly provided
529
+ # This ensures each app gets its own Terraform state in .databricks/bundle/<app-name>/
530
+ if not target and normalized_name:
531
+ target = normalized_name
532
+ logger.debug(f"Using app-specific target: {target}")
533
+
534
+ # Build databricks command (no -c flag needed, uses databricks.yaml in current dir)
471
535
  cmd = ["databricks"]
472
536
  if profile:
473
537
  cmd.extend(["--profile", profile])
538
+
474
539
  if target:
475
540
  cmd.extend(["--target", target])
476
- cmd.extend(command)
477
- if config:
478
- config_path = Path(config)
479
541
 
480
- if not config_path.exists():
481
- logger.error(f"Configuration file {config_path} does not exist.")
482
- sys.exit(1)
483
-
484
- app_config: AppConfig = AppConfig.from_file(config_path)
542
+ cmd.extend(command)
485
543
 
486
- # Always convert to path relative to notebooks directory
487
- # Get absolute path of config file and current working directory
544
+ # Add config_path variable for notebooks
545
+ if config_path and app_config:
546
+ # Calculate relative path from notebooks directory to config file
488
547
  config_abs = config_path.resolve()
489
548
  cwd = Path.cwd()
490
549
  notebooks_dir = cwd / "notebooks"
491
550
 
492
- # Calculate relative path from notebooks directory to config file
493
551
  try:
494
552
  relative_config = config_abs.relative_to(notebooks_dir)
495
553
  except ValueError:
496
- # Config file is outside notebooks directory, calculate relative path
497
- # Use os.path.relpath to get the relative path from notebooks_dir to config file
498
554
  relative_config = Path(os.path.relpath(config_abs, notebooks_dir))
499
555
 
500
556
  cmd.append(f'--var="config_path={relative_config}"')
501
557
 
502
- normalized_name: str = normalize_name(app_config.app.name)
503
- cmd.append(f'--var="app_name={normalized_name}"')
504
-
505
558
  logger.debug(f"Executing command: {' '.join(cmd)}")
506
559
 
507
560
  if dry_run:
561
+ logger.info(f"[DRY RUN] Would execute: {' '.join(cmd)}")
508
562
  return
509
563
 
510
564
  try:
@@ -531,6 +585,9 @@ def run_databricks_command(
531
585
  except FileNotFoundError:
532
586
  logger.error("databricks CLI not found. Please install the Databricks CLI.")
533
587
  sys.exit(1)
588
+ except Exception as e:
589
+ logger.error(f"Command execution failed: {e}")
590
+ sys.exit(1)
534
591
 
535
592
 
536
593
  def handle_bundle_command(options: Namespace) -> None:
@@ -539,6 +596,7 @@ def handle_bundle_command(options: Namespace) -> None:
539
596
  config: Optional[str] = options.config
540
597
  target: Optional[str] = options.target
541
598
  dry_run: bool = options.dry_run
599
+
542
600
  if options.deploy:
543
601
  logger.info("Deploying DAO AI asset bundle...")
544
602
  run_databricks_command(
@@ -546,8 +604,9 @@ def handle_bundle_command(options: Namespace) -> None:
546
604
  )
547
605
  if options.run:
548
606
  logger.info("Running DAO AI system with current configuration...")
607
+ # Use static job resource key that matches databricks.yaml (resources.jobs.deploy_job)
549
608
  run_databricks_command(
550
- ["bundle", "run", "deploy-end-to-end"],
609
+ ["bundle", "run", "deploy_job"],
551
610
  profile,
552
611
  config,
553
612
  target,
@@ -1301,7 +1301,7 @@ class ChatPayload(BaseModel):
1301
1301
  model_config = ConfigDict(use_enum_values=True, extra="forbid")
1302
1302
  input: Optional[list[Message]] = None
1303
1303
  messages: Optional[list[Message]] = None
1304
- custom_inputs: dict
1304
+ custom_inputs: Optional[dict] = Field(default_factory=dict)
1305
1305
 
1306
1306
  @model_validator(mode="after")
1307
1307
  def validate_mutual_exclusion_and_alias(self) -> "ChatPayload":
@@ -354,6 +354,7 @@ def test_database_model_capacity_validation():
354
354
 
355
355
 
356
356
  @pytest.mark.unit
357
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
357
358
  def test_create_lakebase_new_database():
358
359
  """Test create_lakebase when database doesn't exist."""
359
360
  # Mock workspace client
@@ -393,6 +394,7 @@ def test_create_lakebase_new_database():
393
394
 
394
395
 
395
396
  @pytest.mark.unit
397
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
396
398
  def test_create_lakebase_database_already_exists_available():
397
399
  """Test create_lakebase when database already exists and is AVAILABLE."""
398
400
  # Mock workspace client
@@ -430,6 +432,7 @@ def test_create_lakebase_database_already_exists_available():
430
432
 
431
433
 
432
434
  @pytest.mark.unit
435
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
433
436
  def test_create_lakebase_database_starting_state():
434
437
  """Test create_lakebase when database is in STARTING state."""
435
438
  # Mock workspace client
@@ -475,6 +478,7 @@ def test_create_lakebase_database_starting_state():
475
478
 
476
479
 
477
480
  @pytest.mark.unit
481
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
478
482
  def test_create_lakebase_database_updating_state():
479
483
  """Test create_lakebase when database is in UPDATING state."""
480
484
  # Mock workspace client
@@ -520,6 +524,7 @@ def test_create_lakebase_database_updating_state():
520
524
 
521
525
 
522
526
  @pytest.mark.unit
527
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
523
528
  def test_create_lakebase_database_stopped_state():
524
529
  """Test create_lakebase when database is in STOPPED state."""
525
530
  # Mock workspace client
@@ -555,6 +560,7 @@ def test_create_lakebase_database_stopped_state():
555
560
 
556
561
 
557
562
  @pytest.mark.unit
563
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
558
564
  def test_create_lakebase_database_deleting_state():
559
565
  """Test create_lakebase when database is in DELETING state."""
560
566
  # Mock workspace client
@@ -590,6 +596,7 @@ def test_create_lakebase_database_deleting_state():
590
596
 
591
597
 
592
598
  @pytest.mark.unit
599
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
593
600
  def test_create_lakebase_concurrent_creation():
594
601
  """Test create_lakebase when database is created concurrently by another process."""
595
602
  # Mock workspace client
@@ -626,6 +633,7 @@ def test_create_lakebase_concurrent_creation():
626
633
 
627
634
 
628
635
  @pytest.mark.unit
636
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
629
637
  def test_create_lakebase_unexpected_error():
630
638
  """Test create_lakebase handles unexpected errors appropriately."""
631
639
  # Mock workspace client
@@ -659,6 +667,7 @@ def test_create_lakebase_unexpected_error():
659
667
 
660
668
 
661
669
  @pytest.mark.unit
670
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
662
671
  def test_create_lakebase_timeout_waiting_for_available():
663
672
  """Test create_lakebase handles timeout when waiting for AVAILABLE state."""
664
673
  # Mock workspace client
@@ -696,6 +705,7 @@ def test_create_lakebase_timeout_waiting_for_available():
696
705
 
697
706
 
698
707
  @pytest.mark.unit
708
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
699
709
  def test_create_lakebase_default_values():
700
710
  """Test create_lakebase uses correct default values."""
701
711
  # Mock workspace client
@@ -729,6 +739,7 @@ def test_create_lakebase_default_values():
729
739
 
730
740
 
731
741
  @pytest.mark.unit
742
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
732
743
  def test_create_lakebase_custom_capacity_cu1():
733
744
  """Test create_lakebase with custom capacity CU_1."""
734
745
  # Mock workspace client
@@ -763,6 +774,7 @@ def test_create_lakebase_custom_capacity_cu1():
763
774
 
764
775
 
765
776
  @pytest.mark.unit
777
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
766
778
  def test_create_lakebase_database_disappears_during_wait():
767
779
  """Test create_lakebase when database disappears while waiting for AVAILABLE state."""
768
780
  # Mock workspace client
@@ -806,6 +818,7 @@ def test_create_lakebase_database_disappears_during_wait():
806
818
 
807
819
 
808
820
  @pytest.mark.unit
821
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
809
822
  def test_create_lakebase_instance_role_success():
810
823
  """Test creating a lakebase instance role successfully."""
811
824
  # Mock workspace client
@@ -847,6 +860,7 @@ def test_create_lakebase_instance_role_success():
847
860
 
848
861
 
849
862
  @pytest.mark.unit
863
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
850
864
  def test_create_lakebase_instance_role_already_exists():
851
865
  """Test when instance role already exists."""
852
866
  # Mock workspace client
@@ -881,6 +895,7 @@ def test_create_lakebase_instance_role_already_exists():
881
895
 
882
896
 
883
897
  @pytest.mark.unit
898
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
884
899
  def test_create_lakebase_instance_role_missing_client_id():
885
900
  """Test that a warning is logged and method returns early when client_id is not provided."""
886
901
  # Mock workspace client
@@ -907,6 +922,7 @@ def test_create_lakebase_instance_role_missing_client_id():
907
922
 
908
923
 
909
924
  @pytest.mark.unit
925
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
910
926
  def test_create_lakebase_instance_role_concurrent_creation():
911
927
  """Test when role is created concurrently by another process."""
912
928
  # Mock workspace client
@@ -940,6 +956,7 @@ def test_create_lakebase_instance_role_concurrent_creation():
940
956
 
941
957
 
942
958
  @pytest.mark.unit
959
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
943
960
  def test_create_lakebase_instance_role_unexpected_error():
944
961
  """Test that unexpected errors are raised."""
945
962
  # Mock workspace client
@@ -970,6 +987,7 @@ def test_create_lakebase_instance_role_unexpected_error():
970
987
 
971
988
 
972
989
  @pytest.mark.unit
990
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
973
991
  def test_create_lakebase_instance_role_with_composite_variable():
974
992
  """Test creating role when client_id is a CompositeVariableModel."""
975
993
  from dao_ai.config import CompositeVariableModel, EnvironmentVariableModel
@@ -22,6 +22,7 @@ The fix involved:
22
22
  from unittest.mock import Mock, patch
23
23
 
24
24
  import pytest
25
+ from conftest import has_databricks_env
25
26
  from langchain_core.tools import StructuredTool
26
27
 
27
28
  from dao_ai.config import GenieRoomModel
@@ -208,6 +209,7 @@ class TestGenieDatabricksIntegration:
208
209
  assert hasattr(tool, "func")
209
210
  assert tool.func is not None
210
211
 
212
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
211
213
  def test_conversation_persistence_with_injected_state(self, mock_genie_tool):
212
214
  """
213
215
  Test that conversation persistence works correctly with injected state pattern.
@@ -5,7 +5,7 @@ import sys
5
5
  from pathlib import Path
6
6
 
7
7
  import pytest
8
- from conftest import has_postgres_env
8
+ from conftest import has_databricks_env, has_postgres_env
9
9
  from mlflow.types.responses import ResponsesAgentRequest
10
10
  from mlflow.types.responses_helpers import Message
11
11
 
@@ -43,6 +43,7 @@ def app_config_postgres(supervisor_postgres_config_path: Path) -> AppConfig:
43
43
 
44
44
 
45
45
  @pytest.mark.integration
46
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
46
47
  def test_load_config_and_create_responses_agent(
47
48
  app_config_supervisor: AppConfig,
48
49
  ) -> None:
@@ -373,6 +374,7 @@ def test_inference_with_postgres_memory(app_config_postgres: AppConfig) -> None:
373
374
 
374
375
 
375
376
  @pytest.mark.unit
377
+ @pytest.mark.skipif(not has_databricks_env(), reason="Databricks env vars not set")
376
378
  def test_config_has_required_components_for_inference() -> None:
377
379
  """Unit test to verify config has required components for inference without actual inference."""
378
380
  config_path = (
@@ -202,6 +202,7 @@ def test_postgres_memory_initialization(postgres_app_config: AppConfig) -> None:
202
202
 
203
203
 
204
204
  @pytest.mark.unit
205
+ @pytest.mark.skipif(not has_postgres_env(), reason="PostgreSQL env vars not set")
205
206
  def test_load_postgres_config_without_env() -> None:
206
207
  """Test that PostgreSQL config loads without requiring environment variables."""
207
208
  config_path = (