dao-ai 0.1.7__tar.gz → 0.1.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dao_ai-0.1.7 → dao_ai-0.1.11}/.gitignore +3 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/PKG-INFO +3 -3
- dao_ai-0.1.11/app.yaml +12 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/filtered_mcp.yaml +50 -23
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +16 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/databricks.yaml.template +4 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/05_deploy_agent.py +21 -3
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/99_scratchpad.py +1 -1
- {dao_ai-0.1.7 → dao_ai-0.1.11}/pyproject.toml +3 -3
- {dao_ai-0.1.7 → dao_ai-0.1.11}/requirements.txt +11 -1
- {dao_ai-0.1.7 → dao_ai-0.1.11}/schemas/model_config_schema.json +67 -37
- dao_ai-0.1.11/src/dao_ai/apps/__init__.py +24 -0
- dao_ai-0.1.11/src/dao_ai/apps/handlers.py +84 -0
- dao_ai-0.1.11/src/dao_ai/apps/model_serving.py +29 -0
- dao_ai-0.1.11/src/dao_ai/apps/resources.py +1072 -0
- dao_ai-0.1.11/src/dao_ai/apps/server.py +39 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/cli.py +62 -1
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/config.py +158 -53
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/memory/postgres.py +29 -4
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/models.py +327 -370
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/providers/base.py +28 -2
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/providers/databricks.py +248 -4
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/state.py +1 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/mcp.py +225 -108
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_config.py +20 -14
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_databricks.py +486 -20
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_genie.py +1 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_genie_room_model.py +157 -9
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_input_output_structure.py +6 -4
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_mcp.py +32 -16
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_mcp_filtering_integration.py +464 -3
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_mcp_function_model.py +59 -26
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_responses_agent_structured_output_unit.py +61 -19
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_sql_tool.py +72 -31
- dao_ai-0.1.11/tests/dao_ai/test_warehouse_model.py +166 -0
- dao_ai-0.1.7/src/dao_ai/agent_as_code.py +0 -22
- {dao_ai-0.1.7 → dao_ai-0.1.11}/.python-version +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/CHANGELOG.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/CONTRIBUTING.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/LICENSE +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/Makefile +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/01_getting_started/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/01_getting_started/minimal.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/custom_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/external_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/managed_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/02_mcp/slack_integration.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/03_reranking/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/03_reranking/vector_search_with_reranking.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/04_genie/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/04_genie/genie_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/05_memory/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/05_memory/conversation_summarization.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/05_memory/in_memory_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/05_memory/postgres_persistence.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/06_on_behalf_of_user/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/07_human_in_the_loop/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/08_guardrails/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/09_structured_output/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/09_structured_output/structured_output.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/10_agent_integrations/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/10_agent_integrations/kasal.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/11_prompt_engineering/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/combined_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/context_management.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/limit_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/logging_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/pii_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/retry_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/12_middleware/tool_selector_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/13_orchestration/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/14_basic_tools/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/brick_store.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/deep_research.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/appointments.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/appointments_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/brand_rep_demo_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/brand_rep_demo_queries.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/brand_rep_demo_tables.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/brand_rep_demo_validation.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/customers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/customers_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/dim_stores.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/dim_stores_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/employee_performance.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/employee_performance_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/employee_tasks.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/employee_tasks_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/inventory.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/inventory_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/managers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/managers_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/product_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/products.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/dais2025/task_assignments.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/hardware_store/inventory.snappy.parquet +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/hardware_store/inventory.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/hardware_store/products.snappy.parquet +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/hardware_store/products.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/items_description.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/items_description.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/items_raw.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/items_raw.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/orders_raw.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/data/quick_serve_restaurant/orders_raw.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/architecture.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/cli-reference.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/configuration-reference.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/contributing.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/examples.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/faq.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/hardware_store/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/hardware_store/retail_supervisor.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/hardware_store/retail_swarm.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/images/genie.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/key-capabilities.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/python-api.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/docs/why-dao.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/environment.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/dais2025/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/deep_research/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/executive_assistant/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/hardware_store/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/examples/quick_serve_restaurant/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/extract_store_numbers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_store_by_number.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/01_ingest_and_transform.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/02_provision_vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/03_provision_lakebase.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/04_unity_catalog_tools.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/06_generate_evaluation_data.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/07_run_evaluation.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/08_run_examples.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/09_evaluate_inferences.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/notebooks/10_optimize_prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/schemas/bundle_config_schema.json +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/customer.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/employee.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/executive.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/genie.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/inventory.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dais2025/tools/store.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/cache/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/cache/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/cache/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/cache/lru.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/cache/semantic.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/genie/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/graph.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/hooks/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/hooks/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/logging.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/memory/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/memory/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/memory/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/memory/databricks.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/messages.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/assertions.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/context_editing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/guardrails.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/message_validation.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/model_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/model_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/pii.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/summarization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/tool_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/tool_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/middleware/tool_selector.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/nodes.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/optimization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/orchestration/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/orchestration/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/orchestration/supervisor.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/orchestration/swarm.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/providers/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/agent.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/email.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/genie.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/memory.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/python.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/slack.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/sql.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/time.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/unity_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/tools/vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/types.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/utils.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/src/dao_ai/vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/config/test_model_config.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/conftest.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_context_editing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_model_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_model_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_pii.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_tool_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_tool_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/middleware/test_tool_selector.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_agent_response_format.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_assertions_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_chat_history.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_function_parsing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_guardrail_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_hitl_config_model.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_hooks.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_human_in_the_loop.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_inference.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_inference_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_interrupt_type.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_mcp_filtering.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_message_validation_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_messages.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_optimization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_postgres_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_prompt_optimizations.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_reranking.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_reranking_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_response_format.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_semantic_cache_context.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_sql_tool_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_state.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_summarization_inference.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_swarm_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_tools.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_types.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_unity_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_utils.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/test_vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/dao_ai/weather_server_mcp.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/hardware_store/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/hardware_store/test_graph.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/images/doritos_upc.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/images/lays_upc.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.11}/tests/quick_serve_restaurant/.gitkeep +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dao-ai
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.11
|
|
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
|
|
@@ -28,7 +28,7 @@ Requires-Python: >=3.11
|
|
|
28
28
|
Requires-Dist: databricks-agents>=1.9.0
|
|
29
29
|
Requires-Dist: databricks-langchain[memory]>=0.12.1
|
|
30
30
|
Requires-Dist: databricks-mcp>=0.5.0
|
|
31
|
-
Requires-Dist: databricks-sdk[openai]>=0.
|
|
31
|
+
Requires-Dist: databricks-sdk[openai]>=0.77.0
|
|
32
32
|
Requires-Dist: ddgs>=9.10.0
|
|
33
33
|
Requires-Dist: dspy>=2.6.27
|
|
34
34
|
Requires-Dist: flashrank>=0.2.10
|
|
@@ -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.11/app.yaml
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
command: ["uv", "run", "python", "-m", "dao_ai.apps.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_*
|
|
89
|
-
- show_*
|
|
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_*
|
|
108
|
-
- delete_*
|
|
109
|
-
- truncate_*
|
|
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_*
|
|
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_*
|
|
130
|
-
- get_*
|
|
131
|
-
- list_*
|
|
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
|
|
135
|
-
- *_admin
|
|
136
|
-
- get_secret_*
|
|
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_*
|
|
155
|
-
- list_*
|
|
156
|
-
- describe_*
|
|
157
|
-
- show_*
|
|
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_*
|
|
196
|
-
- 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
|
-
|
|
299
|
-
|
|
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.
|
|
307
|
-
# 2.
|
|
308
|
-
# 3.
|
|
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
|
{dao_ai-0.1.7 → dao_ai-0.1.11}/config/examples/15_complete_applications/hardware_store_lakebase.yaml
RENAMED
|
@@ -10,6 +10,20 @@
|
|
|
10
10
|
# DATABRICKS SCHEMAS
|
|
11
11
|
# =============================================================================
|
|
12
12
|
# Define Unity Catalog schemas where data and functions will be stored
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
variables:
|
|
16
|
+
client_id: &client_id
|
|
17
|
+
options:
|
|
18
|
+
- env: RETAIL_AI_DATABRICKS_CLIENT_ID # Service principal client ID
|
|
19
|
+
- scope: retail_consumer_goods
|
|
20
|
+
secret: RETAIL_AI_DATABRICKS_CLIENT_ID
|
|
21
|
+
client_secret: &client_secret
|
|
22
|
+
options:
|
|
23
|
+
- env: RETAIL_AI_DATABRICKS_CLIENT_SECRET # Service principal secret
|
|
24
|
+
- scope: retail_consumer_goods
|
|
25
|
+
secret: RETAIL_AI_DATABRICKS_CLIENT_SECRET
|
|
26
|
+
|
|
13
27
|
schemas:
|
|
14
28
|
retail_schema: &retail_schema
|
|
15
29
|
catalog_name: retail_consumer_goods # Unity Catalog name
|
|
@@ -134,6 +148,8 @@ resources:
|
|
|
134
148
|
instance_name: "retail-consumer-goods" # Use instance_name for Databricks Lakebase
|
|
135
149
|
description: "Database for agent memory and checkpoints"
|
|
136
150
|
|
|
151
|
+
client_id: *client_id
|
|
152
|
+
client_secret: *client_secret
|
|
137
153
|
on_behalf_of_user: false
|
|
138
154
|
|
|
139
155
|
# =============================================================================
|
|
@@ -16,6 +16,9 @@ variables:
|
|
|
16
16
|
description: The job compute node type (cloud-specific, set per target)
|
|
17
17
|
cloud:
|
|
18
18
|
description: Cloud provider (azure, aws, gcp) - auto-detected or set per target
|
|
19
|
+
deployment_target:
|
|
20
|
+
description: Agent deployment target (model_serving or apps) - defaults to model_serving
|
|
21
|
+
default: model_serving
|
|
19
22
|
|
|
20
23
|
resources:
|
|
21
24
|
jobs:
|
|
@@ -83,6 +86,7 @@ resources:
|
|
|
83
86
|
notebook_path: ./notebooks/05_deploy_agent.py
|
|
84
87
|
base_parameters:
|
|
85
88
|
config-path: ${var.config_path}
|
|
89
|
+
deployment-target: ${var.deployment_target}
|
|
86
90
|
environment_key: dao-ai-env
|
|
87
91
|
- task_key: run-evaluation
|
|
88
92
|
depends_on:
|
|
@@ -28,16 +28,23 @@ def find_yaml_files_os_walk(base_path: str) -> Sequence[str]:
|
|
|
28
28
|
# COMMAND ----------
|
|
29
29
|
|
|
30
30
|
dbutils.widgets.text(name="config-path", defaultValue="")
|
|
31
|
+
dbutils.widgets.dropdown(
|
|
32
|
+
name="deployment-target",
|
|
33
|
+
choices=["", "model_serving", "apps"],
|
|
34
|
+
defaultValue="",
|
|
35
|
+
)
|
|
31
36
|
|
|
32
37
|
config_files: Sequence[str] = find_yaml_files_os_walk("../config")
|
|
33
38
|
dbutils.widgets.dropdown(name="config-paths", choices=config_files, defaultValue=next(iter(config_files), ""))
|
|
34
39
|
|
|
35
40
|
config_path: str | None = dbutils.widgets.get("config-path") or None
|
|
36
41
|
project_path: str = dbutils.widgets.get("config-paths") or None
|
|
42
|
+
deployment_target_str: str | None = dbutils.widgets.get("deployment-target") or None
|
|
37
43
|
|
|
38
44
|
config_path: str = config_path or project_path
|
|
39
45
|
|
|
40
|
-
print(config_path)
|
|
46
|
+
print(f"Config path: {config_path}")
|
|
47
|
+
print(f"Deployment target: {deployment_target_str or '(using config default)'}")
|
|
41
48
|
|
|
42
49
|
# COMMAND ----------
|
|
43
50
|
|
|
@@ -93,10 +100,21 @@ nest_asyncio.apply()
|
|
|
93
100
|
|
|
94
101
|
# COMMAND ----------
|
|
95
102
|
|
|
96
|
-
from dao_ai.config import AppConfig
|
|
103
|
+
from dao_ai.config import AppConfig, DeploymentTarget
|
|
97
104
|
|
|
98
105
|
config: AppConfig = AppConfig.from_file(path=config_path)
|
|
99
106
|
|
|
107
|
+
# Resolve deployment target from widget (hybrid resolution)
|
|
108
|
+
# If widget is empty/None, deploy_agent() will use config.app.deployment_target or default
|
|
109
|
+
deployment_target: DeploymentTarget | None = None
|
|
110
|
+
if deployment_target_str:
|
|
111
|
+
deployment_target = DeploymentTarget(deployment_target_str)
|
|
112
|
+
print(f"Using widget-specified deployment target: {deployment_target.value}")
|
|
113
|
+
elif config.app and config.app.deployment_target:
|
|
114
|
+
print(f"Using config file deployment target: {config.app.deployment_target.value}")
|
|
115
|
+
else:
|
|
116
|
+
print("Using default deployment target: model_serving")
|
|
117
|
+
|
|
100
118
|
# COMMAND ----------
|
|
101
119
|
|
|
102
120
|
config.display_graph()
|
|
@@ -107,4 +125,4 @@ config.create_agent()
|
|
|
107
125
|
|
|
108
126
|
# COMMAND ----------
|
|
109
127
|
|
|
110
|
-
config.deploy_agent()
|
|
128
|
+
config.deploy_agent(target=deployment_target)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dao-ai"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.11"
|
|
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" }
|
|
@@ -46,7 +46,7 @@ dependencies = [
|
|
|
46
46
|
"databricks-agents>=1.9.0",
|
|
47
47
|
"databricks-langchain[memory]>=0.12.1",
|
|
48
48
|
"databricks-mcp>=0.5.0",
|
|
49
|
-
"databricks-sdk[openai]>=0.
|
|
49
|
+
"databricks-sdk[openai]>=0.77.0",
|
|
50
50
|
"ddgs>=9.10.0",
|
|
51
51
|
"dspy>=2.6.27",
|
|
52
52
|
"flashrank>=0.2.10",
|
|
@@ -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
|
|
@@ -30,7 +33,7 @@ databricks-agents==1.9.0
|
|
|
30
33
|
databricks-ai-bridge==0.11.0
|
|
31
34
|
databricks-langchain==0.12.1
|
|
32
35
|
databricks-mcp==0.5.1
|
|
33
|
-
databricks-sdk==0.
|
|
36
|
+
databricks-sdk==0.77.0
|
|
34
37
|
dataclasses-json==0.6.7
|
|
35
38
|
datasets==4.4.2
|
|
36
39
|
ddgs==9.10.0
|
|
@@ -57,7 +60,12 @@ 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
|
|
@@ -82,6 +90,7 @@ identify==2.6.15
|
|
|
82
90
|
idna==3.11
|
|
83
91
|
importlib-metadata==8.7.1
|
|
84
92
|
iniconfig==2.3.0
|
|
93
|
+
isodate==0.7.2
|
|
85
94
|
itsdangerous==2.2.0
|
|
86
95
|
jinja2==3.1.6
|
|
87
96
|
jiter==0.12.0
|
|
@@ -152,6 +161,7 @@ pluggy==1.6.0
|
|
|
152
161
|
pre-commit==4.5.1
|
|
153
162
|
primp==0.15.0
|
|
154
163
|
propcache==0.4.1
|
|
164
|
+
proto-plus==1.27.0
|
|
155
165
|
protobuf==6.33.2
|
|
156
166
|
psycopg==3.3.2
|
|
157
167
|
psycopg-binary==3.3.2
|
|
@@ -395,6 +395,18 @@
|
|
|
395
395
|
"default": "3.12",
|
|
396
396
|
"description": "Python version for Model Serving deployment. Defaults to 3.12 which is supported by Databricks Model Serving. This allows deploying from environments with different Python versions (e.g., Databricks Apps with 3.11).",
|
|
397
397
|
"title": "Python Version"
|
|
398
|
+
},
|
|
399
|
+
"deployment_target": {
|
|
400
|
+
"anyOf": [
|
|
401
|
+
{
|
|
402
|
+
"$ref": "#/$defs/DeploymentTarget"
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"type": "null"
|
|
406
|
+
}
|
|
407
|
+
],
|
|
408
|
+
"default": null,
|
|
409
|
+
"description": "Default deployment target. If not specified, defaults to MODEL_SERVING. Can be overridden via CLI --target flag. Options: 'model_serving' or 'apps'."
|
|
398
410
|
}
|
|
399
411
|
},
|
|
400
412
|
"required": [
|
|
@@ -1196,6 +1208,7 @@
|
|
|
1196
1208
|
},
|
|
1197
1209
|
"DatabricksAppModel": {
|
|
1198
1210
|
"additionalProperties": false,
|
|
1211
|
+
"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
1212
|
"properties": {
|
|
1200
1213
|
"on_behalf_of_user": {
|
|
1201
1214
|
"anyOf": [
|
|
@@ -1355,40 +1368,10 @@
|
|
|
1355
1368
|
"name": {
|
|
1356
1369
|
"title": "Name",
|
|
1357
1370
|
"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
1371
|
}
|
|
1388
1372
|
},
|
|
1389
1373
|
"required": [
|
|
1390
|
-
"name"
|
|
1391
|
-
"url"
|
|
1374
|
+
"name"
|
|
1392
1375
|
],
|
|
1393
1376
|
"title": "DatabricksAppModel",
|
|
1394
1377
|
"type": "object"
|
|
@@ -1501,6 +1484,15 @@
|
|
|
1501
1484
|
"title": "DatasetModel",
|
|
1502
1485
|
"type": "object"
|
|
1503
1486
|
},
|
|
1487
|
+
"DeploymentTarget": {
|
|
1488
|
+
"description": "Target platform for agent deployment.",
|
|
1489
|
+
"enum": [
|
|
1490
|
+
"model_serving",
|
|
1491
|
+
"apps"
|
|
1492
|
+
],
|
|
1493
|
+
"title": "DeploymentTarget",
|
|
1494
|
+
"type": "string"
|
|
1495
|
+
},
|
|
1504
1496
|
"Entitlement": {
|
|
1505
1497
|
"enum": [
|
|
1506
1498
|
"CAN_MANAGE",
|
|
@@ -2082,8 +2074,16 @@
|
|
|
2082
2074
|
"title": "Pat"
|
|
2083
2075
|
},
|
|
2084
2076
|
"name": {
|
|
2085
|
-
"
|
|
2086
|
-
|
|
2077
|
+
"anyOf": [
|
|
2078
|
+
{
|
|
2079
|
+
"type": "string"
|
|
2080
|
+
},
|
|
2081
|
+
{
|
|
2082
|
+
"type": "null"
|
|
2083
|
+
}
|
|
2084
|
+
],
|
|
2085
|
+
"default": null,
|
|
2086
|
+
"title": "Name"
|
|
2087
2087
|
},
|
|
2088
2088
|
"description": {
|
|
2089
2089
|
"anyOf": [
|
|
@@ -2128,7 +2128,6 @@
|
|
|
2128
2128
|
}
|
|
2129
2129
|
},
|
|
2130
2130
|
"required": [
|
|
2131
|
-
"name",
|
|
2132
2131
|
"space_id"
|
|
2133
2132
|
],
|
|
2134
2133
|
"title": "GenieRoomModel",
|
|
@@ -2935,6 +2934,17 @@
|
|
|
2935
2934
|
"title": "Args",
|
|
2936
2935
|
"type": "array"
|
|
2937
2936
|
},
|
|
2937
|
+
"app": {
|
|
2938
|
+
"anyOf": [
|
|
2939
|
+
{
|
|
2940
|
+
"$ref": "#/$defs/DatabricksAppModel"
|
|
2941
|
+
},
|
|
2942
|
+
{
|
|
2943
|
+
"type": "null"
|
|
2944
|
+
}
|
|
2945
|
+
],
|
|
2946
|
+
"default": null
|
|
2947
|
+
},
|
|
2938
2948
|
"connection": {
|
|
2939
2949
|
"anyOf": [
|
|
2940
2950
|
{
|
|
@@ -4932,6 +4942,7 @@
|
|
|
4932
4942
|
"type": "object"
|
|
4933
4943
|
},
|
|
4934
4944
|
"WarehouseModel": {
|
|
4945
|
+
"additionalProperties": false,
|
|
4935
4946
|
"properties": {
|
|
4936
4947
|
"on_behalf_of_user": {
|
|
4937
4948
|
"anyOf": [
|
|
@@ -5089,8 +5100,16 @@
|
|
|
5089
5100
|
"title": "Pat"
|
|
5090
5101
|
},
|
|
5091
5102
|
"name": {
|
|
5092
|
-
"
|
|
5093
|
-
|
|
5103
|
+
"anyOf": [
|
|
5104
|
+
{
|
|
5105
|
+
"type": "string"
|
|
5106
|
+
},
|
|
5107
|
+
{
|
|
5108
|
+
"type": "null"
|
|
5109
|
+
}
|
|
5110
|
+
],
|
|
5111
|
+
"default": null,
|
|
5112
|
+
"title": "Name"
|
|
5094
5113
|
},
|
|
5095
5114
|
"description": {
|
|
5096
5115
|
"anyOf": [
|
|
@@ -5135,7 +5154,6 @@
|
|
|
5135
5154
|
}
|
|
5136
5155
|
},
|
|
5137
5156
|
"required": [
|
|
5138
|
-
"name",
|
|
5139
5157
|
"warehouse_id"
|
|
5140
5158
|
],
|
|
5141
5159
|
"title": "WarehouseModel",
|
|
@@ -5153,6 +5171,18 @@
|
|
|
5153
5171
|
},
|
|
5154
5172
|
"additionalProperties": false,
|
|
5155
5173
|
"properties": {
|
|
5174
|
+
"version": {
|
|
5175
|
+
"anyOf": [
|
|
5176
|
+
{
|
|
5177
|
+
"type": "string"
|
|
5178
|
+
},
|
|
5179
|
+
{
|
|
5180
|
+
"type": "null"
|
|
5181
|
+
}
|
|
5182
|
+
],
|
|
5183
|
+
"default": null,
|
|
5184
|
+
"title": "Version"
|
|
5185
|
+
},
|
|
5156
5186
|
"variables": {
|
|
5157
5187
|
"additionalProperties": {
|
|
5158
5188
|
"anyOf": [
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Databricks Apps deployment module for dao-ai.
|
|
3
|
+
|
|
4
|
+
This subpackage contains all modules related to deploying dao-ai agents
|
|
5
|
+
as Databricks Apps or Model Serving endpoints.
|
|
6
|
+
|
|
7
|
+
Modules:
|
|
8
|
+
handlers: MLflow AgentServer request handlers (@invoke, @stream)
|
|
9
|
+
server: Entry point for Databricks Apps deployment
|
|
10
|
+
resources: Databricks App resource configuration generation
|
|
11
|
+
model_serving: Entry point for Databricks Model Serving deployment
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from dao_ai.apps.resources import (
|
|
15
|
+
generate_app_resources,
|
|
16
|
+
generate_app_yaml,
|
|
17
|
+
generate_sdk_resources,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"generate_app_resources",
|
|
22
|
+
"generate_app_yaml",
|
|
23
|
+
"generate_sdk_resources",
|
|
24
|
+
]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent request handlers for MLflow AgentServer.
|
|
3
|
+
|
|
4
|
+
This module defines the invoke and stream handlers that are registered
|
|
5
|
+
with the MLflow AgentServer. These handlers delegate to the ResponsesAgent
|
|
6
|
+
created from the dao-ai configuration.
|
|
7
|
+
|
|
8
|
+
The handlers use async methods (apredict, apredict_stream) to be compatible
|
|
9
|
+
with both Databricks Model Serving and Databricks Apps environments.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
from typing import AsyncGenerator
|
|
14
|
+
|
|
15
|
+
import mlflow
|
|
16
|
+
from dotenv import load_dotenv
|
|
17
|
+
from mlflow.genai.agent_server import invoke, stream
|
|
18
|
+
from mlflow.types.responses import (
|
|
19
|
+
ResponsesAgentRequest,
|
|
20
|
+
ResponsesAgentResponse,
|
|
21
|
+
ResponsesAgentStreamEvent,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from dao_ai.config import AppConfig
|
|
25
|
+
from dao_ai.logging import configure_logging
|
|
26
|
+
from dao_ai.models import LanggraphResponsesAgent
|
|
27
|
+
|
|
28
|
+
# Load environment variables from .env.local if it exists
|
|
29
|
+
load_dotenv(dotenv_path=".env.local", override=True)
|
|
30
|
+
|
|
31
|
+
# Configure MLflow
|
|
32
|
+
mlflow.set_registry_uri("databricks-uc")
|
|
33
|
+
mlflow.set_tracking_uri("databricks")
|
|
34
|
+
mlflow.langchain.autolog()
|
|
35
|
+
|
|
36
|
+
# Get config path from environment or use default
|
|
37
|
+
config_path: str = os.environ.get("DAO_AI_CONFIG_PATH", "model_config.yaml")
|
|
38
|
+
|
|
39
|
+
# Load configuration using AppConfig.from_file (consistent with CLI, notebook, builder)
|
|
40
|
+
config: AppConfig = AppConfig.from_file(config_path)
|
|
41
|
+
|
|
42
|
+
# Configure logging
|
|
43
|
+
if config.app and config.app.log_level:
|
|
44
|
+
configure_logging(level=config.app.log_level)
|
|
45
|
+
|
|
46
|
+
# Create the ResponsesAgent - cast to LanggraphResponsesAgent to access async methods
|
|
47
|
+
_responses_agent: LanggraphResponsesAgent = config.as_responses_agent() # type: ignore[assignment]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@invoke()
|
|
51
|
+
async def non_streaming(request: ResponsesAgentRequest) -> ResponsesAgentResponse:
|
|
52
|
+
"""
|
|
53
|
+
Handle non-streaming requests by delegating to the ResponsesAgent.
|
|
54
|
+
|
|
55
|
+
Uses the async apredict() method for compatibility with both
|
|
56
|
+
Model Serving and Apps environments.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
request: The incoming ResponsesAgentRequest
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
ResponsesAgentResponse with the complete output
|
|
63
|
+
"""
|
|
64
|
+
return await _responses_agent.apredict(request)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@stream()
|
|
68
|
+
async def streaming(
|
|
69
|
+
request: ResponsesAgentRequest,
|
|
70
|
+
) -> AsyncGenerator[ResponsesAgentStreamEvent, None]:
|
|
71
|
+
"""
|
|
72
|
+
Handle streaming requests by delegating to the ResponsesAgent.
|
|
73
|
+
|
|
74
|
+
Uses the async apredict_stream() method for compatibility with both
|
|
75
|
+
Model Serving and Apps environments.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
request: The incoming ResponsesAgentRequest
|
|
79
|
+
|
|
80
|
+
Yields:
|
|
81
|
+
ResponsesAgentStreamEvent objects as they are generated
|
|
82
|
+
"""
|
|
83
|
+
async for event in _responses_agent.apredict_stream(request):
|
|
84
|
+
yield event
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Apply nest_asyncio FIRST before any other imports
|
|
2
|
+
# This allows dao-ai's async/sync patterns to work in Model Serving
|
|
3
|
+
# where there may already be an event loop running (e.g., notebook context)
|
|
4
|
+
import nest_asyncio
|
|
5
|
+
|
|
6
|
+
nest_asyncio.apply()
|
|
7
|
+
|
|
8
|
+
import mlflow # noqa: E402
|
|
9
|
+
from mlflow.models import ModelConfig # noqa: E402
|
|
10
|
+
from mlflow.pyfunc import ResponsesAgent # noqa: E402
|
|
11
|
+
|
|
12
|
+
from dao_ai.config import AppConfig # noqa: E402
|
|
13
|
+
from dao_ai.logging import configure_logging # noqa: E402
|
|
14
|
+
|
|
15
|
+
mlflow.set_registry_uri("databricks-uc")
|
|
16
|
+
mlflow.set_tracking_uri("databricks")
|
|
17
|
+
|
|
18
|
+
mlflow.langchain.autolog()
|
|
19
|
+
|
|
20
|
+
model_config: ModelConfig = ModelConfig()
|
|
21
|
+
config: AppConfig = AppConfig(**model_config.to_dict())
|
|
22
|
+
|
|
23
|
+
log_level: str = config.app.log_level
|
|
24
|
+
|
|
25
|
+
configure_logging(level=log_level)
|
|
26
|
+
|
|
27
|
+
app: ResponsesAgent = config.as_responses_agent()
|
|
28
|
+
|
|
29
|
+
mlflow.models.set_model(app)
|