dao-ai 0.1.3__tar.gz → 0.1.4__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 (277) hide show
  1. {dao_ai-0.1.3 → dao_ai-0.1.4}/PKG-INFO +35 -1
  2. {dao_ai-0.1.3 → dao_ai-0.1.4}/README.md +34 -0
  3. {dao_ai-0.1.3 → dao_ai-0.1.4}/databricks.yaml.template +21 -9
  4. dao_ai-0.1.4/docs/cli-reference.md +237 -0
  5. {dao_ai-0.1.3 → dao_ai-0.1.4}/pyproject.toml +1 -1
  6. {dao_ai-0.1.3 → dao_ai-0.1.4}/requirements.txt +1 -0
  7. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/cli.py +94 -18
  8. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/config.py +68 -28
  9. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/providers/databricks.py +10 -15
  10. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/vector_search.py +37 -0
  11. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_databricks.py +307 -10
  12. dao_ai-0.1.3/docs/cli-reference.md +0 -98
  13. {dao_ai-0.1.3 → dao_ai-0.1.4}/.gitignore +0 -0
  14. {dao_ai-0.1.3 → dao_ai-0.1.4}/.python-version +0 -0
  15. {dao_ai-0.1.3 → dao_ai-0.1.4}/CHANGELOG.md +0 -0
  16. {dao_ai-0.1.3 → dao_ai-0.1.4}/CONTRIBUTING.md +0 -0
  17. {dao_ai-0.1.3 → dao_ai-0.1.4}/LICENSE +0 -0
  18. {dao_ai-0.1.3 → dao_ai-0.1.4}/Makefile +0 -0
  19. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/01_getting_started/README.md +0 -0
  20. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/01_getting_started/minimal.yaml +0 -0
  21. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/02_mcp/README.md +0 -0
  22. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/02_mcp/custom_mcp.yaml +0 -0
  23. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/02_mcp/external_mcp.yaml +0 -0
  24. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/02_mcp/managed_mcp.yaml +0 -0
  25. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/02_mcp/slack_integration.yaml +0 -0
  26. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/03_reranking/README.md +0 -0
  27. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/03_reranking/vector_search_with_reranking.yaml +0 -0
  28. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/04_genie/README.md +0 -0
  29. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/04_genie/genie_basic.yaml +0 -0
  30. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
  31. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
  32. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
  33. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/05_memory/README.md +0 -0
  34. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/05_memory/conversation_summarization.yaml +0 -0
  35. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/05_memory/in_memory_basic.yaml +0 -0
  36. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
  37. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/05_memory/postgres_persistence.yaml +0 -0
  38. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/06_on_behalf_of_user/README.md +0 -0
  39. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
  40. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/07_human_in_the_loop/README.md +0 -0
  41. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
  42. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/08_guardrails/README.md +0 -0
  43. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
  44. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/09_structured_output/README.md +0 -0
  45. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/09_structured_output/structured_output.yaml +0 -0
  46. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/10_agent_integrations/README.md +0 -0
  47. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
  48. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/10_agent_integrations/kasal.yaml +0 -0
  49. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/11_prompt_engineering/README.md +0 -0
  50. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
  51. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
  52. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/12_middleware/README.md +0 -0
  53. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/12_middleware/combined_middleware.yaml +0 -0
  54. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
  55. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/12_middleware/logging_middleware.yaml +0 -0
  56. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/13_orchestration/README.md +0 -0
  57. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
  58. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
  59. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/14_basic_tools/README.md +0 -0
  60. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
  61. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/README.md +0 -0
  62. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/brick_store.yaml +0 -0
  63. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/deep_research.yaml +0 -0
  64. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
  65. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
  66. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
  67. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
  68. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +0 -0
  69. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
  70. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
  71. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
  72. {dao_ai-0.1.3 → dao_ai-0.1.4}/config/examples/README.md +0 -0
  73. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/appointments.sql +0 -0
  74. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/appointments_data.sql +0 -0
  75. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/brand_rep_demo_data.sql +0 -0
  76. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/brand_rep_demo_queries.sql +0 -0
  77. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/brand_rep_demo_tables.sql +0 -0
  78. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/brand_rep_demo_validation.sql +0 -0
  79. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/customers.sql +0 -0
  80. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/customers_data.sql +0 -0
  81. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/dim_stores.sql +0 -0
  82. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/dim_stores_data.sql +0 -0
  83. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/employee_performance.sql +0 -0
  84. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/employee_performance_data.sql +0 -0
  85. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/employee_tasks.sql +0 -0
  86. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/employee_tasks_data.sql +0 -0
  87. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/inventory.sql +0 -0
  88. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/inventory_data.sql +0 -0
  89. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/managers.sql +0 -0
  90. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/managers_data.sql +0 -0
  91. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/product_data.sql +0 -0
  92. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/products.sql +0 -0
  93. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/dais2025/task_assignments.sql +0 -0
  94. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/hardware_store/inventory.snappy.parquet +0 -0
  95. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/hardware_store/inventory.sql +0 -0
  96. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/hardware_store/products.snappy.parquet +0 -0
  97. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/hardware_store/products.sql +0 -0
  98. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/.gitkeep +0 -0
  99. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
  100. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/items_description.csv +0 -0
  101. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/items_description.sql +0 -0
  102. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/items_raw.csv +0 -0
  103. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/items_raw.sql +0 -0
  104. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/orders_raw.csv +0 -0
  105. {dao_ai-0.1.3 → dao_ai-0.1.4}/data/quick_serve_restaurant/orders_raw.sql +0 -0
  106. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/architecture.md +0 -0
  107. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/configuration-reference.md +0 -0
  108. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/contributing.md +0 -0
  109. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/examples.md +0 -0
  110. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/faq.md +0 -0
  111. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/hardware_store/README.md +0 -0
  112. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/hardware_store/retail_supervisor.png +0 -0
  113. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/hardware_store/retail_swarm.png +0 -0
  114. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/images/genie.png +0 -0
  115. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/key-capabilities.md +0 -0
  116. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/python-api.md +0 -0
  117. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/quick_serve_restaurant/.gitkeep +0 -0
  118. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
  119. {dao_ai-0.1.3 → dao_ai-0.1.4}/docs/why-dao.md +0 -0
  120. {dao_ai-0.1.3 → dao_ai-0.1.4}/environment.yaml +0 -0
  121. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/dais2025/examples.yaml +0 -0
  122. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/deep_research/examples.yaml +0 -0
  123. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/executive_assistant/examples.yaml +0 -0
  124. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/hardware_store/examples.yaml +0 -0
  125. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/quick_serve_restaurant/.gitkeep +0 -0
  126. {dao_ai-0.1.3 → dao_ai-0.1.4}/examples/quick_serve_restaurant/examples.yaml +0 -0
  127. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/extract_store_numbers.sql +0 -0
  128. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_inventory_by_sku.sql +0 -0
  129. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_inventory_by_upc.sql +0 -0
  130. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_product_by_sku.sql +0 -0
  131. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_product_by_upc.sql +0 -0
  132. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_store_by_number.sql +0 -0
  133. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
  134. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
  135. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
  136. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
  137. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_product_by_sku.sql +0 -0
  138. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_product_by_upc.sql +0 -0
  139. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
  140. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
  141. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/quick_serve_restaurant/.gitkeep +0 -0
  142. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
  143. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
  144. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
  145. {dao_ai-0.1.3 → dao_ai-0.1.4}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
  146. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/01_ingest_and_transform.py +0 -0
  147. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/02_provision_vector_search.py +0 -0
  148. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/03_provision_lakebase.py +0 -0
  149. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/04_unity_catalog_tools.py +0 -0
  150. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/05_deploy_agent.py +0 -0
  151. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/06_generate_evaluation_data.py +0 -0
  152. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/07_run_evaluation.py +0 -0
  153. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/08_run_examples.py +0 -0
  154. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/09_evaluate_inferences.py +0 -0
  155. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/10_optimize_prompts.py +0 -0
  156. {dao_ai-0.1.3 → dao_ai-0.1.4}/notebooks/99_scratchpad.py +0 -0
  157. {dao_ai-0.1.3 → dao_ai-0.1.4}/schemas/bundle_config_schema.json +0 -0
  158. {dao_ai-0.1.3 → dao_ai-0.1.4}/schemas/model_config_schema.json +0 -0
  159. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/__init__.py +0 -0
  160. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/models.py +0 -0
  161. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/__init__.py +0 -0
  162. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/customer.py +0 -0
  163. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/employee.py +0 -0
  164. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/executive.py +0 -0
  165. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/genie.py +0 -0
  166. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/inventory.py +0 -0
  167. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/models.py +0 -0
  168. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dais2025/tools/store.py +0 -0
  169. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/__init__.py +0 -0
  170. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/agent_as_code.py +0 -0
  171. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/catalog.py +0 -0
  172. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/__init__.py +0 -0
  173. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/cache/__init__.py +0 -0
  174. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/cache/base.py +0 -0
  175. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/cache/core.py +0 -0
  176. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/cache/lru.py +0 -0
  177. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/cache/semantic.py +0 -0
  178. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/genie/core.py +0 -0
  179. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/graph.py +0 -0
  180. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/hooks/__init__.py +0 -0
  181. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/hooks/core.py +0 -0
  182. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/logging.py +0 -0
  183. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/memory/__init__.py +0 -0
  184. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/memory/base.py +0 -0
  185. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/memory/core.py +0 -0
  186. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/memory/databricks.py +0 -0
  187. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/memory/postgres.py +0 -0
  188. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/messages.py +0 -0
  189. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/__init__.py +0 -0
  190. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/assertions.py +0 -0
  191. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/base.py +0 -0
  192. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/core.py +0 -0
  193. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/guardrails.py +0 -0
  194. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
  195. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/message_validation.py +0 -0
  196. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/middleware/summarization.py +0 -0
  197. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/models.py +0 -0
  198. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/nodes.py +0 -0
  199. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/optimization.py +0 -0
  200. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/orchestration/__init__.py +0 -0
  201. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/orchestration/core.py +0 -0
  202. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/orchestration/supervisor.py +0 -0
  203. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/orchestration/swarm.py +0 -0
  204. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/prompts.py +0 -0
  205. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/providers/__init__.py +0 -0
  206. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/providers/base.py +0 -0
  207. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/state.py +0 -0
  208. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/__init__.py +0 -0
  209. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/agent.py +0 -0
  210. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/core.py +0 -0
  211. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/email.py +0 -0
  212. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/genie.py +0 -0
  213. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/mcp.py +0 -0
  214. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/memory.py +0 -0
  215. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/python.py +0 -0
  216. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/search.py +0 -0
  217. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/slack.py +0 -0
  218. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/sql.py +0 -0
  219. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/time.py +0 -0
  220. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/unity_catalog.py +0 -0
  221. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/tools/vector_search.py +0 -0
  222. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/types.py +0 -0
  223. {dao_ai-0.1.3 → dao_ai-0.1.4}/src/dao_ai/utils.py +0 -0
  224. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/config/test_model_config.yaml +0 -0
  225. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/conftest.py +0 -0
  226. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_agent_response_format.py +0 -0
  227. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_assertions_middleware.py +0 -0
  228. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_catalog.py +0 -0
  229. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_chat_history.py +0 -0
  230. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_config.py +0 -0
  231. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_function_parsing.py +0 -0
  232. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_genie.py +0 -0
  233. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
  234. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
  235. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_genie_room_model.py +0 -0
  236. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_guardrail_retry.py +0 -0
  237. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_hitl_config_model.py +0 -0
  238. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
  239. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_hooks.py +0 -0
  240. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_human_in_the_loop.py +0 -0
  241. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_inference.py +0 -0
  242. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_inference_integration.py +0 -0
  243. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_input_output_structure.py +0 -0
  244. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_interrupt_type.py +0 -0
  245. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
  246. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_mcp.py +0 -0
  247. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_mcp_function_model.py +0 -0
  248. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_message_validation_middleware.py +0 -0
  249. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_messages.py +0 -0
  250. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_models.py +0 -0
  251. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_optimization.py +0 -0
  252. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_postgres_integration.py +0 -0
  253. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_prompt_optimizations.py +0 -0
  254. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_prompts.py +0 -0
  255. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_reranking.py +0 -0
  256. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_reranking_integration.py +0 -0
  257. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
  258. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_response_format.py +0 -0
  259. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_responses_agent_structured_output_unit.py +0 -0
  260. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_semantic_cache_context.py +0 -0
  261. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_sql_tool.py +0 -0
  262. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_sql_tool_integration.py +0 -0
  263. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_state.py +0 -0
  264. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_summarization_inference.py +0 -0
  265. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_swarm_middleware.py +0 -0
  266. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_tools.py +0 -0
  267. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_types.py +0 -0
  268. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_unity_catalog.py +0 -0
  269. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_utils.py +0 -0
  270. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
  271. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/test_vector_search.py +0 -0
  272. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/dao_ai/weather_server_mcp.py +0 -0
  273. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/hardware_store/.gitkeep +0 -0
  274. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/hardware_store/test_graph.py +0 -0
  275. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/images/doritos_upc.png +0 -0
  276. {dao_ai-0.1.3 → dao_ai-0.1.4}/tests/images/lays_upc.png +0 -0
  277. {dao_ai-0.1.3 → dao_ai-0.1.4}/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
3
+ Version: 0.1.4
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
@@ -293,6 +293,16 @@ This single command:
293
293
  3. Deploys it to Databricks
294
294
  4. Creates a serving endpoint
295
295
 
296
+ **Deploying to a specific workspace:**
297
+
298
+ ```bash
299
+ # Deploy to AWS workspace
300
+ dao-ai bundle --deploy --run -c config/my_agent.yaml --profile aws-field-eng
301
+
302
+ # Deploy to Azure workspace
303
+ dao-ai bundle --deploy --run -c config/my_agent.yaml --profile azure-retail
304
+ ```
305
+
296
306
  **Step 5: Interact with your agent**
297
307
 
298
308
  Once deployed, you can chat with your agent using Python:
@@ -422,10 +432,34 @@ dao-ai graph -c config/my_config.yaml -o workflow.png
422
432
  # Deploy with Databricks Asset Bundles
423
433
  dao-ai bundle --deploy --run -c config/my_config.yaml
424
434
 
435
+ # Deploy to a specific workspace (multi-cloud support)
436
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-field-eng
437
+ dao-ai bundle --deploy -c config/my_config.yaml --profile azure-retail
438
+
425
439
  # Interactive chat with agent
426
440
  dao-ai chat -c config/my_config.yaml
427
441
  ```
428
442
 
443
+ ### Multi-Cloud Deployment
444
+
445
+ DAO AI supports deploying to Azure, AWS, and GCP workspaces with automatic cloud detection:
446
+
447
+ ```bash
448
+ # Deploy to AWS workspace
449
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-prod
450
+
451
+ # Deploy to Azure workspace
452
+ dao-ai bundle --deploy -c config/my_config.yaml --profile azure-prod
453
+
454
+ # Deploy to GCP workspace
455
+ dao-ai bundle --deploy -c config/my_config.yaml --profile gcp-prod
456
+ ```
457
+
458
+ The CLI automatically:
459
+ - Detects the cloud provider from your profile's workspace URL
460
+ - Selects appropriate compute node types for each cloud
461
+ - Creates isolated deployment state per profile
462
+
429
463
  👉 **Learn more:** [CLI Reference Documentation](docs/cli-reference.md)
430
464
 
431
465
  ---
@@ -214,6 +214,16 @@ This single command:
214
214
  3. Deploys it to Databricks
215
215
  4. Creates a serving endpoint
216
216
 
217
+ **Deploying to a specific workspace:**
218
+
219
+ ```bash
220
+ # Deploy to AWS workspace
221
+ dao-ai bundle --deploy --run -c config/my_agent.yaml --profile aws-field-eng
222
+
223
+ # Deploy to Azure workspace
224
+ dao-ai bundle --deploy --run -c config/my_agent.yaml --profile azure-retail
225
+ ```
226
+
217
227
  **Step 5: Interact with your agent**
218
228
 
219
229
  Once deployed, you can chat with your agent using Python:
@@ -343,10 +353,34 @@ dao-ai graph -c config/my_config.yaml -o workflow.png
343
353
  # Deploy with Databricks Asset Bundles
344
354
  dao-ai bundle --deploy --run -c config/my_config.yaml
345
355
 
356
+ # Deploy to a specific workspace (multi-cloud support)
357
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-field-eng
358
+ dao-ai bundle --deploy -c config/my_config.yaml --profile azure-retail
359
+
346
360
  # Interactive chat with agent
347
361
  dao-ai chat -c config/my_config.yaml
348
362
  ```
349
363
 
364
+ ### Multi-Cloud Deployment
365
+
366
+ DAO AI supports deploying to Azure, AWS, and GCP workspaces with automatic cloud detection:
367
+
368
+ ```bash
369
+ # Deploy to AWS workspace
370
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-prod
371
+
372
+ # Deploy to Azure workspace
373
+ dao-ai bundle --deploy -c config/my_config.yaml --profile azure-prod
374
+
375
+ # Deploy to GCP workspace
376
+ dao-ai bundle --deploy -c config/my_config.yaml --profile gcp-prod
377
+ ```
378
+
379
+ The CLI automatically:
380
+ - Detects the cloud provider from your profile's workspace URL
381
+ - Selects appropriate compute node types for each cloud
382
+ - Creates isolated deployment state per profile
383
+
350
384
  👉 **Learn more:** [CLI Reference Documentation](docs/cli-reference.md)
351
385
 
352
386
  ---
@@ -13,8 +13,9 @@ variables:
13
13
  config_path:
14
14
  description: Path to the configuration file for the job.
15
15
  node_type:
16
- description: The job compute node type
17
- default: Standard_D4ads_v5
16
+ description: The job compute node type (cloud-specific, set per target)
17
+ cloud:
18
+ description: Cloud provider (azure, aws, gcp) - auto-detected or set per target
18
19
 
19
20
  resources:
20
21
  jobs:
@@ -93,12 +94,23 @@ resources:
93
94
  config-path: ${var.config_path}
94
95
  environment_key: dao-ai-env
95
96
 
97
+ # Cloud-specific targets with appropriate node types
98
+ # The CLI auto-selects the target based on workspace cloud detection
96
99
  targets:
97
- __APP_NAME__:
100
+ azure:
98
101
  mode: development
99
- default: true
100
-
101
-
102
-
103
-
104
-
102
+ variables:
103
+ cloud: azure
104
+ node_type: Standard_D4ads_v5
105
+
106
+ aws:
107
+ mode: development
108
+ variables:
109
+ cloud: aws
110
+ node_type: i3.xlarge
111
+
112
+ gcp:
113
+ mode: development
114
+ variables:
115
+ cloud: gcp
116
+ node_type: n1-standard-4
@@ -0,0 +1,237 @@
1
+ # CLI Reference
2
+
3
+ ## Validate Configuration
4
+
5
+ Check your configuration for errors:
6
+
7
+ ```bash
8
+ dao-ai validate -c config/my_config.yaml
9
+ ```
10
+
11
+ ## Generate JSON Schema
12
+
13
+ Generate JSON schema for IDE support and validation:
14
+
15
+ ```bash
16
+ dao-ai schema > schemas/model_config_schema.json
17
+ ```
18
+
19
+ ## Visualize Agent Workflow
20
+
21
+ Generate a diagram showing how your agent works:
22
+
23
+ ```bash
24
+ dao-ai graph -c config/my_config.yaml -o workflow.png
25
+ ```
26
+
27
+ ## Deploy with Databricks Asset Bundles
28
+
29
+ Deploy your agent to Databricks. The CLI supports multi-cloud deployments with automatic cloud detection.
30
+
31
+ ### Basic Deployment
32
+
33
+ ```bash
34
+ # Deploy using default profile or environment
35
+ dao-ai bundle --deploy -c config/my_config.yaml
36
+ ```
37
+
38
+ ### Multi-Cloud Deployment
39
+
40
+ The CLI automatically detects the cloud provider from your Databricks workspace and selects the appropriate configuration (node types, etc.):
41
+
42
+ ```bash
43
+ # Deploy to AWS workspace
44
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-field-eng
45
+
46
+ # Deploy to Azure workspace
47
+ dao-ai bundle --deploy -c config/my_config.yaml --profile azure-retail
48
+
49
+ # Deploy to GCP workspace
50
+ dao-ai bundle --deploy -c config/my_config.yaml --profile gcp-analytics
51
+ ```
52
+
53
+ ### Deploy and Run
54
+
55
+ ```bash
56
+ # Deploy and immediately run the job
57
+ dao-ai bundle --deploy --run -c config/my_config.yaml --profile aws-field-eng
58
+ ```
59
+
60
+ ### Explicit Cloud Override
61
+
62
+ If cloud auto-detection doesn't work, you can specify the cloud explicitly:
63
+
64
+ ```bash
65
+ dao-ai bundle --deploy -c config/my_config.yaml --cloud aws
66
+ ```
67
+
68
+ ### Dry Run
69
+
70
+ Preview commands without executing:
71
+
72
+ ```bash
73
+ dao-ai bundle --deploy -c config/my_config.yaml --profile aws-field-eng --dry-run
74
+ ```
75
+
76
+ ## Interactive Chat
77
+
78
+ Start an interactive chat session with your agent:
79
+
80
+ ```bash
81
+ dao-ai chat -c config/my_config.yaml
82
+ ```
83
+
84
+ ## Verbose Output
85
+
86
+ Increase verbosity for debugging (use `-v` through `-vvvv`):
87
+
88
+ ```bash
89
+ dao-ai -vvvv validate -c config/my_config.yaml
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Command Options
95
+
96
+ ### Common Options
97
+
98
+ | Option | Description |
99
+ |--------|-------------|
100
+ | `-c, --config FILE` | Path to configuration file (required) |
101
+ | `-p, --profile NAME` | Databricks CLI profile to use |
102
+ | `-v, --verbose` | Increase verbosity (can be repeated up to 4 times) |
103
+ | `--help` | Show help message |
104
+
105
+ ### Validate Options
106
+
107
+ ```bash
108
+ dao-ai validate -c config/my_config.yaml [OPTIONS]
109
+ ```
110
+
111
+ ### Graph Options
112
+
113
+ ```bash
114
+ dao-ai graph -c config/my_config.yaml -o output.png [OPTIONS]
115
+ ```
116
+
117
+ | Option | Description |
118
+ |--------|-------------|
119
+ | `-o, --output FILE` | Output file path (supports .png, .pdf, .svg) |
120
+
121
+ ### Bundle Options
122
+
123
+ ```bash
124
+ dao-ai bundle -c config/my_config.yaml [OPTIONS]
125
+ ```
126
+
127
+ | Option | Description |
128
+ |--------|-------------|
129
+ | `-d, --deploy` | Deploy the bundle to Databricks |
130
+ | `-r, --run` | Run the deployment job after deploying |
131
+ | `--destroy` | Destroy the deployed bundle |
132
+ | `-p, --profile NAME` | Databricks CLI profile to use |
133
+ | `--cloud {azure,aws,gcp}` | Cloud provider (auto-detected if not specified) |
134
+ | `-t, --target NAME` | Bundle target name (auto-generated if not specified) |
135
+ | `--dry-run` | Preview commands without executing |
136
+
137
+ ### Chat Options
138
+
139
+ ```bash
140
+ dao-ai chat -c config/my_config.yaml [OPTIONS]
141
+ ```
142
+
143
+ Starts an interactive REPL session where you can chat with your agent locally.
144
+
145
+ ---
146
+
147
+ ## Multi-Cloud Support
148
+
149
+ DAO AI supports deploying to Azure, AWS, and GCP Databricks workspaces. The CLI handles cloud-specific configurations automatically.
150
+
151
+ ### How It Works
152
+
153
+ 1. **Cloud Detection**: When you specify a `--profile`, the CLI detects the cloud provider from the workspace URL
154
+ 2. **Target Selection**: The CLI uses the profile name as the deployment target for per-profile isolation
155
+ 3. **Node Types**: Cloud-appropriate compute node types are automatically selected:
156
+ - Azure: `Standard_D4ads_v5`
157
+ - AWS: `i3.xlarge`
158
+ - GCP: `n1-standard-4`
159
+
160
+ ### Profile Configuration
161
+
162
+ Profiles are configured in `~/.databrickscfg`:
163
+
164
+ ```ini
165
+ [aws-field-eng]
166
+ host = https://my-workspace.cloud.databricks.com
167
+ token = dapi...
168
+
169
+ [azure-retail]
170
+ host = https://adb-123456789.azuredatabricks.net
171
+ token = dapi...
172
+
173
+ [gcp-analytics]
174
+ host = https://my-workspace.gcp.databricks.com
175
+ token = dapi...
176
+ ```
177
+
178
+ ### Deployment Isolation
179
+
180
+ Each profile gets its own isolated deployment state:
181
+
182
+ ```
183
+ /.bundle/my_app/aws-field-eng/files # AWS deployment
184
+ /.bundle/my_app/azure-retail/files # Azure deployment
185
+ /.bundle/my_app/gcp-analytics/files # GCP deployment
186
+ ```
187
+
188
+ This allows you to deploy the same application to multiple workspaces without conflicts.
189
+
190
+ ---
191
+
192
+ ## Examples
193
+
194
+ ### Deploy to Multiple Clouds
195
+
196
+ ```bash
197
+ # Deploy to AWS
198
+ dao-ai bundle --deploy -c config/hardware_store.yaml --profile aws-prod
199
+
200
+ # Deploy same app to Azure
201
+ dao-ai bundle --deploy -c config/hardware_store.yaml --profile azure-prod
202
+
203
+ # Deploy same app to GCP
204
+ dao-ai bundle --deploy -c config/hardware_store.yaml --profile gcp-prod
205
+ ```
206
+
207
+ ### Development vs Production
208
+
209
+ ```bash
210
+ # Deploy to development workspace
211
+ dao-ai bundle --deploy -c config/my_app.yaml --profile aws-dev
212
+
213
+ # Deploy to production workspace
214
+ dao-ai bundle --deploy -c config/my_app.yaml --profile aws-prod
215
+ ```
216
+
217
+ ### Full Deployment Pipeline
218
+
219
+ ```bash
220
+ # Validate configuration
221
+ dao-ai validate -c config/my_app.yaml
222
+
223
+ # Generate workflow diagram
224
+ dao-ai graph -c config/my_app.yaml -o workflow.png
225
+
226
+ # Deploy and run
227
+ dao-ai bundle --deploy --run -c config/my_app.yaml --profile aws-field-eng
228
+ ```
229
+
230
+ ---
231
+
232
+ ## Navigation
233
+
234
+ - [← Previous: Examples](examples.md)
235
+ - [↑ Back to Documentation Index](../README.md#-documentation)
236
+ - [Next: Python API →](python-api.md)
237
+
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dao-ai"
7
- version = "0.1.3"
7
+ version = "0.1.4"
8
8
  description = "DAO AI: A modular, multi-agent orchestration framework for complex AI workflows. Supports agent handoff, tool integration, and dynamic configuration via YAML."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -63,6 +63,7 @@ grandalf==0.8
63
63
  graphene==3.4.3
64
64
  graphql-core==3.2.7
65
65
  graphql-relay==3.2.0
66
+ greenlet==3.3.0
66
67
  grpcio==1.76.0
67
68
  grpcio-status==1.76.0
68
69
  gunicorn==23.0.0
@@ -47,6 +47,57 @@ def get_default_user_id() -> str:
47
47
  return local_user
48
48
 
49
49
 
50
+ def detect_cloud_provider(profile: Optional[str] = None) -> Optional[str]:
51
+ """
52
+ Detect the cloud provider from the Databricks workspace URL.
53
+
54
+ The cloud provider is determined by the workspace URL pattern:
55
+ - Azure: *.azuredatabricks.net
56
+ - AWS: *.cloud.databricks.com (without gcp subdomain)
57
+ - GCP: *.gcp.databricks.com
58
+
59
+ Args:
60
+ profile: Optional Databricks CLI profile name
61
+
62
+ Returns:
63
+ Cloud provider string ('azure', 'aws', 'gcp') or None if detection fails
64
+ """
65
+ try:
66
+ from databricks.sdk import WorkspaceClient
67
+
68
+ # Create workspace client with optional profile
69
+ if profile:
70
+ w = WorkspaceClient(profile=profile)
71
+ else:
72
+ w = WorkspaceClient()
73
+
74
+ # Get the workspace URL from config
75
+ host = w.config.host
76
+ if not host:
77
+ logger.warning("Could not determine workspace URL for cloud detection")
78
+ return None
79
+
80
+ host_lower = host.lower()
81
+
82
+ if "azuredatabricks.net" in host_lower:
83
+ logger.debug(f"Detected Azure cloud from workspace URL: {host}")
84
+ return "azure"
85
+ elif ".gcp.databricks.com" in host_lower:
86
+ logger.debug(f"Detected GCP cloud from workspace URL: {host}")
87
+ return "gcp"
88
+ elif ".cloud.databricks.com" in host_lower or "databricks.com" in host_lower:
89
+ # AWS uses *.cloud.databricks.com or regional patterns
90
+ logger.debug(f"Detected AWS cloud from workspace URL: {host}")
91
+ return "aws"
92
+ else:
93
+ logger.warning(f"Could not determine cloud provider from URL: {host}")
94
+ return None
95
+
96
+ except Exception as e:
97
+ logger.warning(f"Could not detect cloud provider: {e}")
98
+ return None
99
+
100
+
50
101
  env_path: str = find_dotenv()
51
102
  if env_path:
52
103
  logger.info(f"Loading environment variables from: {env_path}")
@@ -220,6 +271,13 @@ Examples:
220
271
  "-t",
221
272
  "--target",
222
273
  type=str,
274
+ help="Bundle target name (default: auto-generated from app name and cloud)",
275
+ )
276
+ bundle_parser.add_argument(
277
+ "--cloud",
278
+ type=str,
279
+ choices=["azure", "aws", "gcp"],
280
+ help="Cloud provider (auto-detected from workspace URL if not specified)",
223
281
  )
224
282
  bundle_parser.add_argument(
225
283
  "--dry-run",
@@ -676,7 +734,7 @@ def generate_bundle_from_template(config_path: Path, app_name: str) -> Path:
676
734
  4. Returns the path to the generated file
677
735
 
678
736
  The generated databricks.yaml is overwritten on each deployment and is not tracked in git.
679
- Schema reference remains pointing to ./schemas/bundle_config_schema.json.
737
+ The template contains cloud-specific targets (azure, aws, gcp) with appropriate node types.
680
738
 
681
739
  Args:
682
740
  config_path: Path to the app config file
@@ -713,15 +771,17 @@ def run_databricks_command(
713
771
  profile: Optional[str] = None,
714
772
  config: Optional[str] = None,
715
773
  target: Optional[str] = None,
774
+ cloud: Optional[str] = None,
716
775
  dry_run: bool = False,
717
776
  ) -> None:
718
- """Execute a databricks CLI command with optional profile and target.
777
+ """Execute a databricks CLI command with optional profile, target, and cloud.
719
778
 
720
779
  Args:
721
780
  command: The databricks CLI command to execute (e.g., ["bundle", "deploy"])
722
781
  profile: Optional Databricks CLI profile name
723
782
  config: Optional path to the configuration file
724
- target: Optional bundle target name
783
+ target: Optional bundle target name (if not provided, auto-generated from app name and cloud)
784
+ cloud: Optional cloud provider ('azure', 'aws', 'gcp'). Auto-detected if not specified.
725
785
  dry_run: If True, print the command without executing
726
786
  """
727
787
  config_path = Path(config) if config else None
@@ -730,22 +790,30 @@ def run_databricks_command(
730
790
  logger.error(f"Configuration file {config_path} does not exist.")
731
791
  sys.exit(1)
732
792
 
733
- # Load app config and generate bundle from template
793
+ # Load app config
734
794
  app_config: AppConfig = AppConfig.from_file(config_path) if config_path else None
735
795
  normalized_name: str = normalize_name(app_config.app.name) if app_config else None
736
796
 
797
+ # Auto-detect cloud provider if not specified
798
+ if not cloud:
799
+ cloud = detect_cloud_provider(profile)
800
+ if cloud:
801
+ logger.info(f"Auto-detected cloud provider: {cloud}")
802
+ else:
803
+ logger.warning("Could not detect cloud provider. Defaulting to 'azure'.")
804
+ cloud = "azure"
805
+
737
806
  # Generate app-specific bundle from template (overwrites databricks.yaml temporarily)
738
807
  if config_path and app_config:
739
808
  generate_bundle_from_template(config_path, normalized_name)
740
809
 
741
- # Use app name as target if not explicitly provided
742
- # This ensures each app gets its own Terraform state in .databricks/bundle/<app-name>/
743
- if not target and normalized_name:
744
- target = normalized_name
745
- logger.debug(f"Using app-specific target: {target}")
810
+ # Use cloud as target (azure, aws, gcp) - can be overridden with explicit --target
811
+ if not target:
812
+ target = cloud
813
+ logger.debug(f"Using cloud-based target: {target}")
746
814
 
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'
815
+ # Build databricks command
816
+ # --profile is a global flag, --target is a subcommand flag for 'bundle'
749
817
  cmd = ["databricks"]
750
818
  if profile:
751
819
  cmd.extend(["--profile", profile])
@@ -810,30 +878,38 @@ def handle_bundle_command(options: Namespace) -> None:
810
878
  profile: Optional[str] = options.profile
811
879
  config: Optional[str] = options.config
812
880
  target: Optional[str] = options.target
881
+ cloud: Optional[str] = options.cloud
813
882
  dry_run: bool = options.dry_run
814
883
 
815
884
  if options.deploy:
816
885
  logger.info("Deploying DAO AI asset bundle...")
817
886
  run_databricks_command(
818
- ["bundle", "deploy"], profile, config, target, dry_run=dry_run
887
+ ["bundle", "deploy"],
888
+ profile=profile,
889
+ config=config,
890
+ target=target,
891
+ cloud=cloud,
892
+ dry_run=dry_run,
819
893
  )
820
894
  if options.run:
821
895
  logger.info("Running DAO AI system with current configuration...")
822
896
  # Use static job resource key that matches databricks.yaml (resources.jobs.deploy_job)
823
897
  run_databricks_command(
824
898
  ["bundle", "run", "deploy_job"],
825
- profile,
826
- config,
827
- target,
899
+ profile=profile,
900
+ config=config,
901
+ target=target,
902
+ cloud=cloud,
828
903
  dry_run=dry_run,
829
904
  )
830
905
  if options.destroy:
831
906
  logger.info("Destroying DAO AI system with current configuration...")
832
907
  run_databricks_command(
833
908
  ["bundle", "destroy", "--auto-approve"],
834
- profile,
835
- config,
836
- target,
909
+ profile=profile,
910
+ config=config,
911
+ target=target,
912
+ cloud=cloud,
837
913
  dry_run=dry_run,
838
914
  )
839
915
  else: