dao-ai 0.1.7__tar.gz → 0.1.9__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 (301) hide show
  1. {dao_ai-0.1.7 → dao_ai-0.1.9}/PKG-INFO +2 -2
  2. dao_ai-0.1.9/app.yaml +12 -0
  3. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/filtered_mcp.yaml +50 -23
  4. {dao_ai-0.1.7 → dao_ai-0.1.9}/pyproject.toml +2 -2
  5. {dao_ai-0.1.7 → dao_ai-0.1.9}/requirements.txt +10 -1
  6. {dao_ai-0.1.7 → dao_ai-0.1.9}/schemas/model_config_schema.json +46 -37
  7. dao_ai-0.1.9/src/dao_ai/app_server.py +103 -0
  8. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/cli.py +15 -1
  9. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/config.py +127 -52
  10. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/base.py +28 -2
  11. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/databricks.py +205 -3
  12. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/state.py +1 -0
  13. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/mcp.py +60 -40
  14. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_config.py +20 -14
  15. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_databricks.py +377 -20
  16. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie.py +1 -0
  17. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_room_model.py +157 -9
  18. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp.py +32 -16
  19. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_filtering_integration.py +464 -3
  20. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_function_model.py +59 -26
  21. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_sql_tool.py +72 -31
  22. dao_ai-0.1.9/tests/dao_ai/test_warehouse_model.py +166 -0
  23. {dao_ai-0.1.7 → dao_ai-0.1.9}/.gitignore +0 -0
  24. {dao_ai-0.1.7 → dao_ai-0.1.9}/.python-version +0 -0
  25. {dao_ai-0.1.7 → dao_ai-0.1.9}/CHANGELOG.md +0 -0
  26. {dao_ai-0.1.7 → dao_ai-0.1.9}/CONTRIBUTING.md +0 -0
  27. {dao_ai-0.1.7 → dao_ai-0.1.9}/LICENSE +0 -0
  28. {dao_ai-0.1.7 → dao_ai-0.1.9}/Makefile +0 -0
  29. {dao_ai-0.1.7 → dao_ai-0.1.9}/README.md +0 -0
  30. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/01_getting_started/README.md +0 -0
  31. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/01_getting_started/minimal.yaml +0 -0
  32. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/README.md +0 -0
  33. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/custom_mcp.yaml +0 -0
  34. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/external_mcp.yaml +0 -0
  35. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/managed_mcp.yaml +0 -0
  36. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/slack_integration.yaml +0 -0
  37. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/03_reranking/README.md +0 -0
  38. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/03_reranking/vector_search_with_reranking.yaml +0 -0
  39. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/README.md +0 -0
  40. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_basic.yaml +0 -0
  41. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
  42. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
  43. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
  44. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/README.md +0 -0
  45. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/conversation_summarization.yaml +0 -0
  46. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/in_memory_basic.yaml +0 -0
  47. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
  48. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/postgres_persistence.yaml +0 -0
  49. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/06_on_behalf_of_user/README.md +0 -0
  50. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
  51. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/07_human_in_the_loop/README.md +0 -0
  52. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
  53. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/08_guardrails/README.md +0 -0
  54. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
  55. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/09_structured_output/README.md +0 -0
  56. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/09_structured_output/structured_output.yaml +0 -0
  57. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/README.md +0 -0
  58. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
  59. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/kasal.yaml +0 -0
  60. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/README.md +0 -0
  61. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
  62. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
  63. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/README.md +0 -0
  64. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/combined_middleware.yaml +0 -0
  65. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/context_management.yaml +0 -0
  66. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
  67. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/limit_middleware.yaml +0 -0
  68. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/logging_middleware.yaml +0 -0
  69. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/pii_middleware.yaml +0 -0
  70. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/retry_middleware.yaml +0 -0
  71. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/tool_selector_middleware.yaml +0 -0
  72. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/README.md +0 -0
  73. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
  74. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
  75. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/14_basic_tools/README.md +0 -0
  76. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
  77. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/README.md +0 -0
  78. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/brick_store.yaml +0 -0
  79. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/deep_research.yaml +0 -0
  80. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
  81. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
  82. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
  83. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
  84. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +0 -0
  85. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
  86. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
  87. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
  88. {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/README.md +0 -0
  89. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/appointments.sql +0 -0
  90. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/appointments_data.sql +0 -0
  91. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_data.sql +0 -0
  92. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_queries.sql +0 -0
  93. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_tables.sql +0 -0
  94. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_validation.sql +0 -0
  95. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/customers.sql +0 -0
  96. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/customers_data.sql +0 -0
  97. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/dim_stores.sql +0 -0
  98. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/dim_stores_data.sql +0 -0
  99. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_performance.sql +0 -0
  100. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_performance_data.sql +0 -0
  101. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_tasks.sql +0 -0
  102. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_tasks_data.sql +0 -0
  103. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/inventory.sql +0 -0
  104. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/inventory_data.sql +0 -0
  105. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/managers.sql +0 -0
  106. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/managers_data.sql +0 -0
  107. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/product_data.sql +0 -0
  108. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/products.sql +0 -0
  109. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/task_assignments.sql +0 -0
  110. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/inventory.snappy.parquet +0 -0
  111. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/inventory.sql +0 -0
  112. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/products.snappy.parquet +0 -0
  113. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/products.sql +0 -0
  114. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/.gitkeep +0 -0
  115. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
  116. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_description.csv +0 -0
  117. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_description.sql +0 -0
  118. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_raw.csv +0 -0
  119. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_raw.sql +0 -0
  120. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/orders_raw.csv +0 -0
  121. {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/orders_raw.sql +0 -0
  122. {dao_ai-0.1.7 → dao_ai-0.1.9}/databricks.yaml.template +0 -0
  123. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/architecture.md +0 -0
  124. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/cli-reference.md +0 -0
  125. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/configuration-reference.md +0 -0
  126. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/contributing.md +0 -0
  127. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/examples.md +0 -0
  128. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/faq.md +0 -0
  129. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/README.md +0 -0
  130. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/retail_supervisor.png +0 -0
  131. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/retail_swarm.png +0 -0
  132. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/images/genie.png +0 -0
  133. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/key-capabilities.md +0 -0
  134. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/python-api.md +0 -0
  135. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/quick_serve_restaurant/.gitkeep +0 -0
  136. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
  137. {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/why-dao.md +0 -0
  138. {dao_ai-0.1.7 → dao_ai-0.1.9}/environment.yaml +0 -0
  139. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/dais2025/examples.yaml +0 -0
  140. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/deep_research/examples.yaml +0 -0
  141. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/executive_assistant/examples.yaml +0 -0
  142. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/hardware_store/examples.yaml +0 -0
  143. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/quick_serve_restaurant/.gitkeep +0 -0
  144. {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/quick_serve_restaurant/examples.yaml +0 -0
  145. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/extract_store_numbers.sql +0 -0
  146. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_inventory_by_sku.sql +0 -0
  147. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_inventory_by_upc.sql +0 -0
  148. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_product_by_sku.sql +0 -0
  149. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_product_by_upc.sql +0 -0
  150. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_by_number.sql +0 -0
  151. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
  152. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
  153. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
  154. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
  155. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_product_by_sku.sql +0 -0
  156. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_product_by_upc.sql +0 -0
  157. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
  158. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
  159. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/.gitkeep +0 -0
  160. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
  161. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
  162. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
  163. {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
  164. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/01_ingest_and_transform.py +0 -0
  165. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/02_provision_vector_search.py +0 -0
  166. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/03_provision_lakebase.py +0 -0
  167. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/04_unity_catalog_tools.py +0 -0
  168. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/05_deploy_agent.py +0 -0
  169. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/06_generate_evaluation_data.py +0 -0
  170. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/07_run_evaluation.py +0 -0
  171. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/08_run_examples.py +0 -0
  172. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/09_evaluate_inferences.py +0 -0
  173. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/10_optimize_prompts.py +0 -0
  174. {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/99_scratchpad.py +0 -0
  175. {dao_ai-0.1.7 → dao_ai-0.1.9}/schemas/bundle_config_schema.json +0 -0
  176. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/__init__.py +0 -0
  177. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/models.py +0 -0
  178. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/__init__.py +0 -0
  179. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/customer.py +0 -0
  180. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/employee.py +0 -0
  181. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/executive.py +0 -0
  182. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/genie.py +0 -0
  183. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/inventory.py +0 -0
  184. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/models.py +0 -0
  185. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/store.py +0 -0
  186. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/__init__.py +0 -0
  187. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/agent_as_code.py +0 -0
  188. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/catalog.py +0 -0
  189. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/__init__.py +0 -0
  190. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/__init__.py +0 -0
  191. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/base.py +0 -0
  192. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/core.py +0 -0
  193. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/lru.py +0 -0
  194. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/semantic.py +0 -0
  195. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/core.py +0 -0
  196. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/graph.py +0 -0
  197. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/hooks/__init__.py +0 -0
  198. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/hooks/core.py +0 -0
  199. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/logging.py +0 -0
  200. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/__init__.py +0 -0
  201. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/base.py +0 -0
  202. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/core.py +0 -0
  203. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/databricks.py +0 -0
  204. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/postgres.py +0 -0
  205. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/messages.py +0 -0
  206. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/__init__.py +0 -0
  207. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/assertions.py +0 -0
  208. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/base.py +0 -0
  209. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/context_editing.py +0 -0
  210. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/core.py +0 -0
  211. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/guardrails.py +0 -0
  212. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
  213. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/message_validation.py +0 -0
  214. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/model_call_limit.py +0 -0
  215. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/model_retry.py +0 -0
  216. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/pii.py +0 -0
  217. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/summarization.py +0 -0
  218. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_call_limit.py +0 -0
  219. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_retry.py +0 -0
  220. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_selector.py +0 -0
  221. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/models.py +0 -0
  222. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/nodes.py +0 -0
  223. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/optimization.py +0 -0
  224. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/__init__.py +0 -0
  225. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/core.py +0 -0
  226. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/supervisor.py +0 -0
  227. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/swarm.py +0 -0
  228. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/prompts.py +0 -0
  229. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/__init__.py +0 -0
  230. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/__init__.py +0 -0
  231. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/agent.py +0 -0
  232. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/core.py +0 -0
  233. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/email.py +0 -0
  234. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/genie.py +0 -0
  235. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/memory.py +0 -0
  236. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/python.py +0 -0
  237. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/search.py +0 -0
  238. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/slack.py +0 -0
  239. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/sql.py +0 -0
  240. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/time.py +0 -0
  241. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/unity_catalog.py +0 -0
  242. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/vector_search.py +0 -0
  243. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/types.py +0 -0
  244. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/utils.py +0 -0
  245. {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/vector_search.py +0 -0
  246. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/config/test_model_config.yaml +0 -0
  247. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/conftest.py +0 -0
  248. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_context_editing.py +0 -0
  249. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_model_call_limit.py +0 -0
  250. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_model_retry.py +0 -0
  251. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_pii.py +0 -0
  252. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_call_limit.py +0 -0
  253. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_retry.py +0 -0
  254. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_selector.py +0 -0
  255. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_agent_response_format.py +0 -0
  256. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_assertions_middleware.py +0 -0
  257. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_catalog.py +0 -0
  258. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_chat_history.py +0 -0
  259. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_function_parsing.py +0 -0
  260. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
  261. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
  262. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_guardrail_retry.py +0 -0
  263. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hitl_config_model.py +0 -0
  264. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
  265. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hooks.py +0 -0
  266. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_human_in_the_loop.py +0 -0
  267. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_inference.py +0 -0
  268. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_inference_integration.py +0 -0
  269. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_input_output_structure.py +0 -0
  270. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_interrupt_type.py +0 -0
  271. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
  272. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_filtering.py +0 -0
  273. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_message_validation_middleware.py +0 -0
  274. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_messages.py +0 -0
  275. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_models.py +0 -0
  276. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_optimization.py +0 -0
  277. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_postgres_integration.py +0 -0
  278. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_prompt_optimizations.py +0 -0
  279. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_prompts.py +0 -0
  280. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_reranking.py +0 -0
  281. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_reranking_integration.py +0 -0
  282. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
  283. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_response_format.py +0 -0
  284. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_responses_agent_structured_output_unit.py +0 -0
  285. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_semantic_cache_context.py +0 -0
  286. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_sql_tool_integration.py +0 -0
  287. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_state.py +0 -0
  288. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_summarization_inference.py +0 -0
  289. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_swarm_middleware.py +0 -0
  290. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_tools.py +0 -0
  291. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_types.py +0 -0
  292. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_unity_catalog.py +0 -0
  293. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_utils.py +0 -0
  294. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
  295. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_vector_search.py +0 -0
  296. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/weather_server_mcp.py +0 -0
  297. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/hardware_store/.gitkeep +0 -0
  298. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/hardware_store/test_graph.py +0 -0
  299. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/images/doritos_upc.png +0 -0
  300. {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/images/lays_upc.png +0 -0
  301. {dao_ai-0.1.7 → dao_ai-0.1.9}/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.7
3
+ Version: 0.1.9
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
@@ -43,7 +43,7 @@ Requires-Dist: langgraph>=1.0.5
43
43
  Requires-Dist: langmem>=0.0.30
44
44
  Requires-Dist: loguru>=0.7.3
45
45
  Requires-Dist: mcp>=1.24.0
46
- Requires-Dist: mlflow>=3.8.1
46
+ Requires-Dist: mlflow[databricks]>=3.8.1
47
47
  Requires-Dist: nest-asyncio>=1.6.0
48
48
  Requires-Dist: openevals>=0.1.3
49
49
  Requires-Dist: openpyxl>=3.1.5
dao_ai-0.1.9/app.yaml ADDED
@@ -0,0 +1,12 @@
1
+ command: ["uv", "run", "python", "-m", "dao_ai.app_server"]
2
+ # Databricks Apps listen by default on port 8000
3
+
4
+ env:
5
+ - name: MLFLOW_TRACKING_URI
6
+ value: "databricks"
7
+ - name: MLFLOW_REGISTRY_URI
8
+ value: "databricks-uc"
9
+ # Path to the dao-ai configuration file
10
+ # This can be set to a workspace path or local file path
11
+ - name: DAO_AI_CONFIG_PATH
12
+ value: "model_config.yaml"
@@ -85,8 +85,8 @@ tools:
85
85
  - execute_query # Exact match
86
86
  - list_tables # Exact match
87
87
  - describe_table # Exact match
88
- - get_* # Pattern: all getters
89
- - show_* # Pattern: all show operations
88
+ - "get_*" # Pattern: all getters
89
+ - "show_*" # Pattern: all show operations
90
90
 
91
91
  # ---------------------------------------------------------------------------
92
92
  # Example 2: Exclude Dangerous Tools (Denylist)
@@ -104,11 +104,11 @@ tools:
104
104
  workspace_host: *workspace_host
105
105
  # Load all tools EXCEPT these dangerous ones
106
106
  exclude_tools:
107
- - drop_* # Block all drop operations
108
- - delete_* # Block all delete operations
109
- - truncate_* # Block all truncate operations
107
+ - "drop_*" # Block all drop operations
108
+ - "delete_*" # Block all delete operations
109
+ - "truncate_*" # Block all truncate operations
110
110
  - execute_ddl # Block DDL execution
111
- - alter_* # Block all alter operations
111
+ - "alter_*" # Block all alter operations
112
112
 
113
113
  # ---------------------------------------------------------------------------
114
114
  # Example 3: Hybrid Filtering (Include + Exclude)
@@ -126,14 +126,14 @@ tools:
126
126
  workspace_host: *workspace_host
127
127
  # Start with these categories
128
128
  include_tools:
129
- - query_* # All query functions
130
- - get_* # All getter functions
131
- - list_* # All list functions
129
+ - "query_*" # All query functions
130
+ - "get_*" # All getter functions
131
+ - "list_*" # All list functions
132
132
  # But exclude sensitive ones
133
133
  exclude_tools:
134
- - *_sensitive # Exclude anything with "_sensitive"
135
- - *_admin # Exclude admin functions
136
- - get_secret_* # Exclude secret getters
134
+ - "*_sensitive" # Exclude anything with "_sensitive"
135
+ - "*_admin" # Exclude admin functions
136
+ - "get_secret_*" # Exclude secret getters
137
137
 
138
138
  # ---------------------------------------------------------------------------
139
139
  # Example 4: Pattern-Based Inclusion
@@ -151,10 +151,10 @@ tools:
151
151
  workspace_host: *workspace_host
152
152
  # Only read operations with patterns
153
153
  include_tools:
154
- - query_* # All queries
155
- - list_* # All lists
156
- - describe_* # All describe operations
157
- - show_* # All show operations
154
+ - "query_*" # All queries
155
+ - "list_*" # All lists
156
+ - "describe_*" # All describe operations
157
+ - "show_*" # All show operations
158
158
 
159
159
  # ---------------------------------------------------------------------------
160
160
  # Example 5: Maximum Security (Very Restrictive)
@@ -192,8 +192,8 @@ tools:
192
192
  workspace_host: *workspace_host
193
193
  # Allow everything except the really dangerous stuff
194
194
  exclude_tools:
195
- - drop_* # Can't drop anything
196
- - truncate_* # Can't truncate
195
+ - "drop_*" # Can't drop anything
196
+ - "truncate_*" # Can't truncate
197
197
  - execute_ddl # Can't run arbitrary DDL
198
198
 
199
199
  # =============================================================================
@@ -295,17 +295,44 @@ agents:
295
295
  # APPLICATION CONFIGURATION
296
296
  # =============================================================================
297
297
 
298
- app_name: filtered_mcp_example
299
- entry_agent: safe_sql_agent
298
+ app:
299
+ name: filtered_mcp_example # Application name
300
+ log_level: INFO # Logging level (DEBUG, INFO, WARNING, ERROR)
301
+ registered_model: # MLflow registered model configuration
302
+ schema: *retail_schema # Schema where model will be registered
303
+ name: filtered_mcp_example # Model name in MLflow registry
304
+ agents: # List of agents included in the system
305
+ - *safe_sql_agent # Safe SQL agent (read-only)
306
+ - *analyst_agent # Data analyst agent
307
+ - *dev_agent # Development agent
308
+ - *secure_agent # High-security agent
309
+ - *functions_agent # Functions agent
310
+ orchestration: # Agent orchestration configuration
311
+ swarm: # Supervisor orchestration pattern
312
+ model: *default_llm # LLM for routing decisions
313
+ # Agents will be automatically routed based on their capabilities
300
314
 
301
315
  # =============================================================================
302
316
  # USAGE NOTES
303
317
  # =============================================================================
304
318
  #
319
+ # Deployment:
320
+ # databricks apps deploy dao-ai-filtered-mcp --source-dir . --config-file config/examples/02_mcp/filtered_mcp.yaml
321
+ #
322
+ # The app uses swarm orchestration to automatically route user queries to the
323
+ # most appropriate agent based on their capabilities and tool access:
324
+ #
325
+ # - safe_sql_agent: Read-only SQL queries (allowlist of 5 safe operations)
326
+ # - analyst_agent: Data analysis queries (query_*, list_*, describe_*, show_*)
327
+ # - dev_agent: Development queries (all tools except dangerous DDL operations)
328
+ # - secure_agent: Maximum security (only 3 specific tools)
329
+ # - functions_agent: UC Functions access (filtered to exclude sensitive/admin)
330
+ #
305
331
  # Testing Filters:
306
- # 1. Run with safe_sql_agent - try to call drop_table (should not be available)
307
- # 2. Run with dev_agent - verify you can query but not drop
308
- # 3. Run with secure_agent - verify only 3 tools are available
332
+ # 1. Ask to query data Routes to analyst_agent or safe_sql_agent
333
+ # 2. Ask to drop a table Routes to dev_agent, which will refuse (blocked)
334
+ # 3. Ask in secure mode Routes to secure_agent (only 3 tools available)
335
+ # 4. Ask to call a function → Routes to functions_agent (sensitive functions blocked)
309
336
  #
310
337
  # Pattern Examples:
311
338
  # - "query_*" matches: query_sales, query_inventory, query_anything
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dao-ai"
7
- version = "0.1.7"
7
+ version = "0.1.9"
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" }
@@ -61,7 +61,7 @@ dependencies = [
61
61
  "langmem>=0.0.30",
62
62
  "loguru>=0.7.3",
63
63
  "mcp>=1.24.0",
64
- "mlflow>=3.8.1",
64
+ "mlflow[databricks]>=3.8.1",
65
65
  "nest-asyncio>=1.6.0",
66
66
  "openevals>=0.1.3",
67
67
  "openpyxl>=3.1.5",
@@ -9,6 +9,9 @@ anthropic==0.75.0
9
9
  anyio==4.12.0
10
10
  asyncer==0.0.8
11
11
  attrs==25.4.0
12
+ azure-core==1.37.0
13
+ azure-storage-blob==12.28.0
14
+ azure-storage-file-datalake==12.23.0
12
15
  backoff==2.2.1
13
16
  blinker==1.9.0
14
17
  boto3==1.42.16
@@ -57,13 +60,17 @@ fsspec==2025.10.0
57
60
  gepa==0.0.22
58
61
  gitdb==4.0.12
59
62
  gitpython==3.1.45
63
+ google-api-core==2.28.1
60
64
  google-auth==2.45.0
65
+ google-cloud-core==2.5.0
66
+ google-cloud-storage==3.7.0
67
+ google-crc32c==1.8.0
68
+ google-resumable-media==2.8.0
61
69
  googleapis-common-protos==1.72.0
62
70
  grandalf==0.8
63
71
  graphene==3.4.3
64
72
  graphql-core==3.2.7
65
73
  graphql-relay==3.2.0
66
- greenlet==3.3.0
67
74
  grpcio==1.76.0
68
75
  grpcio-status==1.76.0
69
76
  gunicorn==23.0.0
@@ -82,6 +89,7 @@ identify==2.6.15
82
89
  idna==3.11
83
90
  importlib-metadata==8.7.1
84
91
  iniconfig==2.3.0
92
+ isodate==0.7.2
85
93
  itsdangerous==2.2.0
86
94
  jinja2==3.1.6
87
95
  jiter==0.12.0
@@ -152,6 +160,7 @@ pluggy==1.6.0
152
160
  pre-commit==4.5.1
153
161
  primp==0.15.0
154
162
  propcache==0.4.1
163
+ proto-plus==1.27.0
155
164
  protobuf==6.33.2
156
165
  psycopg==3.3.2
157
166
  psycopg-binary==3.3.2
@@ -1196,6 +1196,7 @@
1196
1196
  },
1197
1197
  "DatabricksAppModel": {
1198
1198
  "additionalProperties": false,
1199
+ "description": "Configuration for a Databricks App resource.\n\nThe `name` is the unique instance name of the Databricks App within the workspace.\nThe `url` is dynamically retrieved from the workspace client by calling\n`apps.get(name)` and returning the app's URL.\n\nExample:\n ```yaml\n resources:\n apps:\n my_app:\n name: my-databricks-app\n ```",
1199
1200
  "properties": {
1200
1201
  "on_behalf_of_user": {
1201
1202
  "anyOf": [
@@ -1355,40 +1356,10 @@
1355
1356
  "name": {
1356
1357
  "title": "Name",
1357
1358
  "type": "string"
1358
- },
1359
- "url": {
1360
- "anyOf": [
1361
- {
1362
- "$ref": "#/$defs/CompositeVariableModel"
1363
- },
1364
- {
1365
- "$ref": "#/$defs/EnvironmentVariableModel"
1366
- },
1367
- {
1368
- "$ref": "#/$defs/SecretVariableModel"
1369
- },
1370
- {
1371
- "$ref": "#/$defs/PrimitiveVariableModel"
1372
- },
1373
- {
1374
- "type": "string"
1375
- },
1376
- {
1377
- "type": "integer"
1378
- },
1379
- {
1380
- "type": "number"
1381
- },
1382
- {
1383
- "type": "boolean"
1384
- }
1385
- ],
1386
- "title": "Url"
1387
1359
  }
1388
1360
  },
1389
1361
  "required": [
1390
- "name",
1391
- "url"
1362
+ "name"
1392
1363
  ],
1393
1364
  "title": "DatabricksAppModel",
1394
1365
  "type": "object"
@@ -2082,8 +2053,16 @@
2082
2053
  "title": "Pat"
2083
2054
  },
2084
2055
  "name": {
2085
- "title": "Name",
2086
- "type": "string"
2056
+ "anyOf": [
2057
+ {
2058
+ "type": "string"
2059
+ },
2060
+ {
2061
+ "type": "null"
2062
+ }
2063
+ ],
2064
+ "default": null,
2065
+ "title": "Name"
2087
2066
  },
2088
2067
  "description": {
2089
2068
  "anyOf": [
@@ -2128,7 +2107,6 @@
2128
2107
  }
2129
2108
  },
2130
2109
  "required": [
2131
- "name",
2132
2110
  "space_id"
2133
2111
  ],
2134
2112
  "title": "GenieRoomModel",
@@ -2935,6 +2913,17 @@
2935
2913
  "title": "Args",
2936
2914
  "type": "array"
2937
2915
  },
2916
+ "app": {
2917
+ "anyOf": [
2918
+ {
2919
+ "$ref": "#/$defs/DatabricksAppModel"
2920
+ },
2921
+ {
2922
+ "type": "null"
2923
+ }
2924
+ ],
2925
+ "default": null
2926
+ },
2938
2927
  "connection": {
2939
2928
  "anyOf": [
2940
2929
  {
@@ -4932,6 +4921,7 @@
4932
4921
  "type": "object"
4933
4922
  },
4934
4923
  "WarehouseModel": {
4924
+ "additionalProperties": false,
4935
4925
  "properties": {
4936
4926
  "on_behalf_of_user": {
4937
4927
  "anyOf": [
@@ -5089,8 +5079,16 @@
5089
5079
  "title": "Pat"
5090
5080
  },
5091
5081
  "name": {
5092
- "title": "Name",
5093
- "type": "string"
5082
+ "anyOf": [
5083
+ {
5084
+ "type": "string"
5085
+ },
5086
+ {
5087
+ "type": "null"
5088
+ }
5089
+ ],
5090
+ "default": null,
5091
+ "title": "Name"
5094
5092
  },
5095
5093
  "description": {
5096
5094
  "anyOf": [
@@ -5135,7 +5133,6 @@
5135
5133
  }
5136
5134
  },
5137
5135
  "required": [
5138
- "name",
5139
5136
  "warehouse_id"
5140
5137
  ],
5141
5138
  "title": "WarehouseModel",
@@ -5153,6 +5150,18 @@
5153
5150
  },
5154
5151
  "additionalProperties": false,
5155
5152
  "properties": {
5153
+ "version": {
5154
+ "anyOf": [
5155
+ {
5156
+ "type": "string"
5157
+ },
5158
+ {
5159
+ "type": "null"
5160
+ }
5161
+ ],
5162
+ "default": null,
5163
+ "title": "Version"
5164
+ },
5156
5165
  "variables": {
5157
5166
  "additionalProperties": {
5158
5167
  "anyOf": [
@@ -0,0 +1,103 @@
1
+ """
2
+ App server module for running dao-ai agents as Databricks Apps.
3
+
4
+ This module provides the entry point for deploying dao-ai agents as Databricks Apps
5
+ using MLflow's AgentServer. It follows the same pattern as agent_as_code.py but
6
+ uses the AgentServer for the Databricks Apps runtime.
7
+
8
+ Configuration Loading:
9
+ The config path is specified via the DAO_AI_CONFIG_PATH environment variable,
10
+ or defaults to model_config.yaml in the current directory.
11
+
12
+ Usage:
13
+ # With environment variable
14
+ DAO_AI_CONFIG_PATH=/path/to/config.yaml python -m dao_ai.app_server
15
+
16
+ # With default model_config.yaml in current directory
17
+ python -m dao_ai.app_server
18
+ """
19
+
20
+ import os
21
+ from typing import AsyncGenerator
22
+
23
+ import mlflow
24
+ from dotenv import load_dotenv
25
+ from mlflow.genai.agent_server import AgentServer, invoke, stream
26
+ from mlflow.pyfunc import ResponsesAgent
27
+ from mlflow.types.responses import (
28
+ ResponsesAgentRequest,
29
+ ResponsesAgentResponse,
30
+ ResponsesAgentStreamEvent,
31
+ )
32
+
33
+ from dao_ai.config import AppConfig
34
+ from dao_ai.logging import configure_logging
35
+
36
+ # Load environment variables from .env.local if it exists
37
+ load_dotenv(dotenv_path=".env.local", override=True)
38
+
39
+ # Configure MLflow
40
+ mlflow.set_registry_uri("databricks-uc")
41
+ mlflow.set_tracking_uri("databricks")
42
+ mlflow.langchain.autolog()
43
+
44
+ # Get config path from environment or use default
45
+ config_path: str = os.environ.get("DAO_AI_CONFIG_PATH", "model_config.yaml")
46
+
47
+ # Load configuration using AppConfig.from_file (consistent with CLI, notebook, builder)
48
+ config: AppConfig = AppConfig.from_file(config_path)
49
+
50
+ # Configure logging
51
+ if config.app and config.app.log_level:
52
+ configure_logging(level=config.app.log_level)
53
+
54
+ # Create the ResponsesAgent
55
+ _responses_agent: ResponsesAgent = config.as_responses_agent()
56
+
57
+
58
+ @invoke()
59
+ def non_streaming(request: ResponsesAgentRequest) -> ResponsesAgentResponse:
60
+ """
61
+ Handle non-streaming requests by delegating to the ResponsesAgent.
62
+
63
+ Args:
64
+ request: The incoming ResponsesAgentRequest
65
+
66
+ Returns:
67
+ ResponsesAgentResponse with the complete output
68
+ """
69
+ return _responses_agent.predict(request)
70
+
71
+
72
+ @stream()
73
+ def streaming(
74
+ request: ResponsesAgentRequest,
75
+ ) -> AsyncGenerator[ResponsesAgentStreamEvent, None]:
76
+ """
77
+ Handle streaming requests by delegating to the ResponsesAgent.
78
+
79
+ Args:
80
+ request: The incoming ResponsesAgentRequest
81
+
82
+ Yields:
83
+ ResponsesAgentStreamEvent objects as they are generated
84
+ """
85
+ # The predict_stream method returns a generator, convert to async generator
86
+ for event in _responses_agent.predict_stream(request):
87
+ yield event
88
+
89
+
90
+ # Create the AgentServer instance
91
+ agent_server = AgentServer("ResponsesAgent", enable_chat_proxy=True)
92
+
93
+ # Define the app as a module level variable to enable multiple workers
94
+ app = agent_server.app
95
+
96
+
97
+ def main() -> None:
98
+ """Entry point for running the agent server."""
99
+ agent_server.run(app_import_string="dao_ai.app_server:app")
100
+
101
+
102
+ if __name__ == "__main__":
103
+ main()
@@ -309,6 +309,14 @@ Examples:
309
309
  metavar="FILE",
310
310
  help="Path to the model configuration file to validate",
311
311
  )
312
+ deploy_parser.add_argument(
313
+ "-t",
314
+ "--target",
315
+ type=str,
316
+ choices=["model_serving", "apps"],
317
+ default="model_serving",
318
+ help="Deployment target: 'model_serving' (default) or 'apps'",
319
+ )
312
320
 
313
321
  # List MCP tools command
314
322
  list_mcp_parser: ArgumentParser = subparsers.add_parser(
@@ -729,11 +737,17 @@ def handle_graph_command(options: Namespace) -> None:
729
737
 
730
738
 
731
739
  def handle_deploy_command(options: Namespace) -> None:
740
+ from dao_ai.config import DeploymentTarget
741
+
732
742
  logger.debug(f"Validating configuration from {options.config}...")
733
743
  try:
734
744
  config: AppConfig = AppConfig.from_file(options.config)
745
+
746
+ # Convert target string to enum
747
+ target: DeploymentTarget = DeploymentTarget(options.target)
748
+
735
749
  config.create_agent()
736
- config.deploy_agent()
750
+ config.deploy_agent(target=target)
737
751
  sys.exit(0)
738
752
  except Exception as e:
739
753
  logger.error(f"Deployment failed: {e}")