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.
- {dao_ai-0.1.7 → dao_ai-0.1.9}/PKG-INFO +2 -2
- dao_ai-0.1.9/app.yaml +12 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/filtered_mcp.yaml +50 -23
- {dao_ai-0.1.7 → dao_ai-0.1.9}/pyproject.toml +2 -2
- {dao_ai-0.1.7 → dao_ai-0.1.9}/requirements.txt +10 -1
- {dao_ai-0.1.7 → dao_ai-0.1.9}/schemas/model_config_schema.json +46 -37
- dao_ai-0.1.9/src/dao_ai/app_server.py +103 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/cli.py +15 -1
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/config.py +127 -52
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/base.py +28 -2
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/databricks.py +205 -3
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/state.py +1 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/mcp.py +60 -40
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_config.py +20 -14
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_databricks.py +377 -20
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie.py +1 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_room_model.py +157 -9
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp.py +32 -16
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_filtering_integration.py +464 -3
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_function_model.py +59 -26
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_sql_tool.py +72 -31
- dao_ai-0.1.9/tests/dao_ai/test_warehouse_model.py +166 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/.gitignore +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/.python-version +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/CHANGELOG.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/CONTRIBUTING.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/LICENSE +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/Makefile +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/01_getting_started/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/01_getting_started/minimal.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/custom_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/external_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/managed_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/02_mcp/slack_integration.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/03_reranking/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/03_reranking/vector_search_with_reranking.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_lru_cache.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_semantic_cache.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/04_genie/genie_with_conversation_id.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/conversation_summarization.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/in_memory_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/lakebase_persistence.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/05_memory/postgres_persistence.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/06_on_behalf_of_user/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/06_on_behalf_of_user/obo_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/07_human_in_the_loop/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/07_human_in_the_loop/human_in_the_loop.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/08_guardrails/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/08_guardrails/guardrails_basic.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/09_structured_output/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/09_structured_output/structured_output.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/agent_bricks.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/10_agent_integrations/kasal.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/prompt_optimization.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/11_prompt_engineering/prompt_registry.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/combined_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/context_management.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/custom_field_validation.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/limit_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/logging_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/pii_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/retry_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/12_middleware/tool_selector_middleware.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/supervisor_pattern.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/13_orchestration/swarm_pattern.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/14_basic_tools/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/14_basic_tools/sql_tool_example.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/brick_store.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/deep_research.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/executive_assistant.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/genie_and_genie_mcp.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/genie_vector_search_hybrid.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store_lakebase.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/hardware_store_swarm.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/quick_serve_restaurant.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/15_complete_applications/reservations_system.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/config/examples/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/appointments.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/appointments_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_queries.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_tables.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/brand_rep_demo_validation.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/customers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/customers_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/dim_stores.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/dim_stores_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_performance.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_performance_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_tasks.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/employee_tasks_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/inventory.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/inventory_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/managers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/managers_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/product_data.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/products.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/dais2025/task_assignments.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/inventory.snappy.parquet +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/inventory.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/products.snappy.parquet +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/hardware_store/products.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_description.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_description.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_raw.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/items_raw.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/orders_raw.csv +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/data/quick_serve_restaurant/orders_raw.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/databricks.yaml.template +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/architecture.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/cli-reference.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/configuration-reference.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/contributing.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/examples.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/faq.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/README.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/retail_supervisor.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/hardware_store/retail_swarm.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/images/genie.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/key-capabilities.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/python-api.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/docs/why-dao.md +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/environment.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/dais2025/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/deep_research/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/executive_assistant/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/hardware_store/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/examples/quick_serve_restaurant/examples.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/extract_store_numbers.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_by_number.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_product_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_product_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/01_ingest_and_transform.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/02_provision_vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/03_provision_lakebase.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/04_unity_catalog_tools.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/05_deploy_agent.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/06_generate_evaluation_data.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/07_run_evaluation.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/08_run_examples.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/09_evaluate_inferences.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/10_optimize_prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/notebooks/99_scratchpad.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/schemas/bundle_config_schema.json +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/customer.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/employee.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/executive.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/genie.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/inventory.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dais2025/tools/store.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/agent_as_code.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/lru.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/cache/semantic.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/genie/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/graph.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/hooks/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/hooks/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/logging.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/databricks.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/memory/postgres.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/messages.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/assertions.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/base.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/context_editing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/guardrails.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/human_in_the_loop.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/message_validation.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/model_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/model_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/pii.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/summarization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/middleware/tool_selector.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/nodes.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/optimization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/supervisor.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/orchestration/swarm.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/providers/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/__init__.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/agent.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/core.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/email.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/genie.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/memory.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/python.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/slack.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/sql.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/time.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/unity_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/tools/vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/types.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/utils.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/src/dao_ai/vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/config/test_model_config.yaml +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/conftest.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_context_editing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_model_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_model_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_pii.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_call_limit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/middleware/test_tool_selector.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_agent_response_format.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_assertions_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_chat_history.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_function_parsing.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_conversation_ids_in_outputs.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_genie_databricks_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_guardrail_retry.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hitl_config_model.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hitl_responses_agent.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_hooks.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_human_in_the_loop.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_inference.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_inference_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_input_output_structure.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_interrupt_type.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_llm_interrupt_handling.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_mcp_filtering.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_message_validation_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_messages.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_models.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_optimization.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_postgres_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_prompt_optimizations.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_prompts.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_reranking.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_reranking_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_resources_model_genie_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_response_format.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_responses_agent_structured_output_unit.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_semantic_cache_context.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_sql_tool_integration.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_state.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_summarization_inference.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_swarm_middleware.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_tools.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_types.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_unity_catalog.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_utils.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_utils_type_from_fqn.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/test_vector_search.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/dao_ai/weather_server_mcp.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/hardware_store/.gitkeep +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/hardware_store/test_graph.py +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/images/doritos_upc.png +0 -0
- {dao_ai-0.1.7 → dao_ai-0.1.9}/tests/images/lays_upc.png +0 -0
- {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.
|
|
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_*
|
|
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
|
|
@@ -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.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
|
-
"
|
|
2086
|
-
|
|
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
|
-
"
|
|
5093
|
-
|
|
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}")
|