dao-ai 0.0.16__tar.gz → 0.0.17__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.0.16 → dao_ai-0.0.17}/PKG-INFO +1 -1
- dao_ai-0.0.17/config/examples/deep_research.yaml +237 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/executive_assistant.yaml +2 -3
- {dao_ai-0.0.16 → dao_ai-0.0.17}/pyproject.toml +1 -1
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/graph.py +1 -1
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/models.py +114 -58
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/nodes.py +7 -3
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/agent.py +3 -3
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/genie.py +4 -2
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/human_in_the_loop.py +3 -3
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/mcp.py +11 -12
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_summarization_inference.py +64 -48
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_tools.py +20 -7
- dao_ai-0.0.16/config/examples/deep_research.yaml +0 -356
- {dao_ai-0.0.16 → dao_ai-0.0.17}/.gitignore +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/.python-version +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/CHANGELOG.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/CONTRIBUTING.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/LICENSE +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/Makefile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/Makefile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/REFACTORING_SUMMARY.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/base-environment-serverless.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/demo_docs/BRAND_REP_DEMO_SUMMARY.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/demo_docs/demo_scripts/brand_rep_product_education_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/demo_docs/demo_scripts/store_associate_ai_assistant_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/demo_docs/demo_scripts/store_manager_alert_response_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/development_workflows.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/Makefile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agent_implementation.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agent_tools_architecture.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/agent-troubleshooting.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-best-practices.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-development-patterns.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-performance.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/agents/agent-quickstart.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/ai-agents.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/overview.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/references/agent-reference.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/agents-and-tools/references/tools-reference.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/applications/streamlit-app.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/architecture/overview.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/architecture.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/architecture.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/customer_preparation_guide.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/databricks_integration.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/deployment/production.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/development/contributing.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/employee_tools_guide.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/getting-started/installation.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/getting-started/mkdocs-quickstart.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/getting-started/quick-start.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/index.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/mkdocs.yml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/scenario_1_architecture.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/scenario_1_flow.mmd +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/setup-docs.sh +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/task_assignment_workflow_guide.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/docs/tools/overview.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/examples/customer_preparation_workflow.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/examples/task_assignment_workflow.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/load-env.sh +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/CSS_REFACTORING_SUMMARY.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/DEMO_CONTROLS_RESTORED.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/DEMO_IMPLEMENTATION_SUMMARY.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/DEMO_QUICK_START.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/Dockerfile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/HOMEPAGE_README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/Makefile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/app.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/app.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/backup_homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/chat.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/enhanced_charts.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/enhanced_navigation.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/associate_homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/dashboard_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/my_tasks_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/performance_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/products_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/associate/schedule_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/chat_integration.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/kpi_summary.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/common/notifications.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/alerts_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/analytics_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/dashboard_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/demo_alerts.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/inventory_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/manager_homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/operations_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/store_manager/team_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/ai_insights_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/executive_dashboard_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/geographical_analysis_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/performance_metrics_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/strategic_insights_tab.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/homepage/vp_retail_operations/vp_homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/metrics.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/navigation.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/oldhomepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/components/styles.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/config.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/demo_docs/BRAND_REP_DEMO_SUMMARY.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/demo_docs/comprehensive_demo_script.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/brand_rep_product_education_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/store_associate_ai_assistant_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/demo_docs/demo_scripts/store_manager_alert_response_demo.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/components/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/components/dashboard_card.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/demo_alerts.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/dev/examples/sample_dashboard.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages/component_showcase.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages/dev_playground.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages/playground.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/daily_operations.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/inventory.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/my_schedule.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/my_tasks.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/orders.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/products_promotions.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/staff.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pages_wip/team_insights.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/pyproject.toml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/requirements.txt +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/static/css/style.css +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/base.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/components.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/dashboard.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/styles/theme.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/test_vip_notification.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/tests/test_calculations.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/utils/config.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/utils/database.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/utils/model_serving.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app/utils/store_context.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/Makefile +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/app.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_components.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_components_enhanced.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin/tailadmin_styles.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/components/tailadmin/tailadmin_styles.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/TAILADMIN_README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/homepage_tailadmin.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/tailadmin_demo.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/tailadmin_implementation_guide.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/test_vp_dashboard.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/vp_dashboard_enhanced.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/old/vp_dashboard_tailadmin.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/components_demo.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/homepage.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/implementation_guide.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/vp_dashboard_clean.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pages/vp_dashboard_enhanced.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/pyproject.toml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/tests/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/streamlit_store_app_tailadmin/tests/test_imports.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/images/doritos_upc.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/images/lays_upc.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/manager_demo_script.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/notebook_vector_search_test.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/apps/dais2025/store-app/tests/test_vector_search_integration.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/dais2025/model_config_dais.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/genie.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/genie_and_vector_search.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/human_in_the_loop.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/jira.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/mcp.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/minimal.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/examples/reservations.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/hardware_store/supervisor.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/hardware_store/supervisor_postgres.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/hardware_store/swarm.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/config/quick_serve_restaurant/quick-serve-restaurant.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/appointments.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/appointments_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/brand_rep_demo_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/brand_rep_demo_queries.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/brand_rep_demo_tables.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/brand_rep_demo_validation.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/customers.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/customers_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/dim_stores.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/dim_stores_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/employee_performance.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/employee_performance_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/employee_tasks.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/employee_tasks_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/inventory.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/inventory_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/managers.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/managers_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/product_data.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/products.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/dais2025/task_assignments.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/hardware_store/inventory.snappy.parquet +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/hardware_store/inventory.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/hardware_store/products.snappy.parquet +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/hardware_store/products.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/fulfil_item_orders.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/items_description.csv +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/items_description.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/items_raw.csv +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/items_raw.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/orders_raw.csv +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/data/quick_serve_restaurant/orders_raw.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/databricks.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/genie.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/hardware_store/README.md +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/hardware_store/retail_supervisor.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/hardware_store/retail_swarm.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/docs/quick_serve_restaurant/quick-serve-restaurant.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/environment.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/dais2025/examples.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/deep_research/examples.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/executive_assistant/examples.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/hardware_store/examples.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/examples/quick_serve_restaurant/examples.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/extract_store_numbers.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_product_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_product_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_store_by_number.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/dais2025/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_inventory_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_inventory_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_product_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_product_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_store_inventory_by_sku.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/hardware_store/find_store_inventory_by_upc.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/quick_serve_restaurant/insert_coffee_order.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/quick_serve_restaurant/lookup_items_by_descriptions.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/quick_serve_restaurant/match_historical_item_order_by_date.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/functions/quick_serve_restaurant/match_item_by_description_and_price.sql +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/01_ingest_and_transform.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/02_provision_vector_search.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/03_generate_evaluation_data.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/04_unity_catalog_tools.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/05_agent_as_code_driver.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/06_run_evaluation.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/08_run_examples.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/09_evaluate_inferences.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/99_scratchpad.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/notebooks/INVESTech.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/requirements.txt +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/schemas/bundle_config_schema.json +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/schemas/model_config_schema.json +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/models.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/customer.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/employee.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/executive.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/genie.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/inventory.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/models.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dais2025/tools/store.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/agent_as_code.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/catalog.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/chat_models.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/cli.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/config.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/guardrails.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/hooks/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/hooks/core.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/memory/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/memory/base.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/memory/core.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/memory/postgres.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/messages.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/prompts.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/providers/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/providers/base.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/providers/databricks.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/state.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/core.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/python.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/time.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/unity_catalog.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/tools/vector_search.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/types.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/utils.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/dao_ai/vector_search.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/hardware_store/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/hardware_store/hooks.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/hardware_store/tools.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/quick_serve_restaurant/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/quick_serve_restaurant/__init__.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/src/quick_serve_restaurant/tools.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/config/test_model_config.yaml +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/conftest.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_catalog.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_chat_history.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_config.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_databricks.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_function_parsing.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_hooks.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_inference.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_mcp.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_messages.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_models.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_state.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_types.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_utils.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/test_vector_search.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/dao_ai/weather_server_mcp.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/hardware_store/.gitkeep +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/hardware_store/test_graph.py +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/images/doritos_upc.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/tests/images/lays_upc.png +0 -0
- {dao_ai-0.0.16 → dao_ai-0.0.17}/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.0.
|
|
3
|
+
Version: 0.0.17
|
|
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
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# yaml-language-server: $schema=../../schemas/model_config_schema.json
|
|
2
|
+
|
|
3
|
+
variables:
|
|
4
|
+
tavily_search_key: &tavily_search_key
|
|
5
|
+
options:
|
|
6
|
+
- env: TAVILY_API_KEY
|
|
7
|
+
- scope: retail_consumer_goods
|
|
8
|
+
secret: TAVILY_API_KEY
|
|
9
|
+
|
|
10
|
+
schemas:
|
|
11
|
+
executive_assistant_schema: &executive_assistant_schema
|
|
12
|
+
catalog_name: retail_consumer_goods
|
|
13
|
+
schema_name: store_ops
|
|
14
|
+
|
|
15
|
+
resources:
|
|
16
|
+
llms:
|
|
17
|
+
|
|
18
|
+
fast_llm: &fast_llm
|
|
19
|
+
name: databricks-meta-llama-3-1-8b-instruct
|
|
20
|
+
temperature: 0.1
|
|
21
|
+
max_tokens: 8192
|
|
22
|
+
|
|
23
|
+
tool_calling_llm: &tool_calling_llm
|
|
24
|
+
name: databricks-claude-3-7-sonnet
|
|
25
|
+
temperature: 0.1
|
|
26
|
+
max_tokens: 8192
|
|
27
|
+
fallbacks:
|
|
28
|
+
- databricks-meta-llama-3-3-70b-instruct
|
|
29
|
+
|
|
30
|
+
# LLM for complex reasoning tasks
|
|
31
|
+
reasoning_llm: &reasoning_llm
|
|
32
|
+
name: databricks-claude-3-7-sonnet
|
|
33
|
+
temperature: 0.1
|
|
34
|
+
max_tokens: 8192
|
|
35
|
+
|
|
36
|
+
deep_reasoning_llm: &deep_reasoning_llm
|
|
37
|
+
name: databricks-claude-sonnet-4
|
|
38
|
+
temperature: 0.1
|
|
39
|
+
max_tokens: 8192
|
|
40
|
+
fallbacks:
|
|
41
|
+
- databricks-claude-3-7-sonnet
|
|
42
|
+
|
|
43
|
+
judge_llm: &judge_llm
|
|
44
|
+
name: databricks-claude-3-7-sonnet
|
|
45
|
+
temperature: 0.5
|
|
46
|
+
max_tokens: 8192
|
|
47
|
+
|
|
48
|
+
embedding_model: &embedding_model
|
|
49
|
+
name: databricks-gte-large-en
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
tables:
|
|
53
|
+
employee_performance:
|
|
54
|
+
schema: *executive_assistant_schema
|
|
55
|
+
name: employee_performance
|
|
56
|
+
|
|
57
|
+
products:
|
|
58
|
+
schema: *executive_assistant_schema
|
|
59
|
+
name: products
|
|
60
|
+
|
|
61
|
+
inventory:
|
|
62
|
+
schema: *executive_assistant_schema
|
|
63
|
+
name: inventory
|
|
64
|
+
|
|
65
|
+
customers:
|
|
66
|
+
schema: *executive_assistant_schema
|
|
67
|
+
name: customers
|
|
68
|
+
|
|
69
|
+
managers:
|
|
70
|
+
schema: *executive_assistant_schema
|
|
71
|
+
name: managers
|
|
72
|
+
|
|
73
|
+
employee_tasks:
|
|
74
|
+
schema: *executive_assistant_schema
|
|
75
|
+
name: employee_tasks
|
|
76
|
+
|
|
77
|
+
appointments:
|
|
78
|
+
schema: *executive_assistant_schema
|
|
79
|
+
name: appointments
|
|
80
|
+
|
|
81
|
+
evaluation:
|
|
82
|
+
schema: *executive_assistant_schema
|
|
83
|
+
name: evaluation
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
functions:
|
|
87
|
+
|
|
88
|
+
find_inventory_by_sku: &find_inventory_by_sku
|
|
89
|
+
schema: *executive_assistant_schema
|
|
90
|
+
name: find_inventory_by_sku
|
|
91
|
+
|
|
92
|
+
find_inventory_by_upc: &find_inventory_by_upc
|
|
93
|
+
schema: *executive_assistant_schema
|
|
94
|
+
name: find_inventory_by_upc
|
|
95
|
+
|
|
96
|
+
find_product_by_sku: &find_product_by_sku
|
|
97
|
+
schema: *executive_assistant_schema
|
|
98
|
+
name: find_product_by_sku
|
|
99
|
+
|
|
100
|
+
find_product_by_upc: &find_product_by_upc
|
|
101
|
+
schema: *executive_assistant_schema
|
|
102
|
+
name: find_product_by_upc
|
|
103
|
+
|
|
104
|
+
find_store_by_number: &find_store_by_number
|
|
105
|
+
schema: *executive_assistant_schema
|
|
106
|
+
name: find_store_by_number
|
|
107
|
+
|
|
108
|
+
find_store_inventory_by_sku: &find_store_inventory_by_sku
|
|
109
|
+
schema: *executive_assistant_schema
|
|
110
|
+
name: find_store_inventory_by_sku
|
|
111
|
+
|
|
112
|
+
find_store_inventory_by_upc: &find_store_inventory_by_upc
|
|
113
|
+
schema: *executive_assistant_schema
|
|
114
|
+
name: find_store_inventory_by_upc
|
|
115
|
+
|
|
116
|
+
genie_rooms:
|
|
117
|
+
executive_assistant_genie_room: &executive_assistant_genie_room
|
|
118
|
+
name: "Executive Assistant Genie Room"
|
|
119
|
+
description: "A room for Genie agents to interact"
|
|
120
|
+
space_id: 01f05dd06c421ad6b522bf7a517cf6d2
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
tools:
|
|
124
|
+
executive_assistant_genie_tool: &executive_assistant_genie_tool
|
|
125
|
+
name: executive_assistant_genie_tool
|
|
126
|
+
function:
|
|
127
|
+
type: factory
|
|
128
|
+
name: dao_ai.tools.create_genie_tool
|
|
129
|
+
args:
|
|
130
|
+
name: executive_assistant_genie_tool
|
|
131
|
+
description: Query the data warehouse for customer KPIs, business metrics, employee performance, inventory data, and other operational insights. Use this tool multiple times as needed to gather comprehensive data for executive-level analysis and recommendations.
|
|
132
|
+
genie_room: *executive_assistant_genie_room
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
tavily_search_tool: &tavily_search_tool
|
|
136
|
+
name: tavily_search_tool
|
|
137
|
+
function:
|
|
138
|
+
type: factory
|
|
139
|
+
name: langchain_tavily.TavilySearch
|
|
140
|
+
args:
|
|
141
|
+
max_results: 5
|
|
142
|
+
topic: general
|
|
143
|
+
search_depth: advanced
|
|
144
|
+
include_domains: ~
|
|
145
|
+
exclude_domains: ~
|
|
146
|
+
|
|
147
|
+
agents:
|
|
148
|
+
executive_assistant_genie: &executive_assistant_genie
|
|
149
|
+
name: executive_assistant_genie
|
|
150
|
+
description: "Executive Assistant Genie Agent"
|
|
151
|
+
model: *reasoning_llm
|
|
152
|
+
tools:
|
|
153
|
+
- *executive_assistant_genie_tool
|
|
154
|
+
- *tavily_search_tool
|
|
155
|
+
prompt: |
|
|
156
|
+
You are an executive-level data analyst and strategic advisor for a retail consumer goods company. Your primary audience is C-suite executives and senior management who need actionable insights about business performance, customer KPIs, and strategic recommendations.
|
|
157
|
+
|
|
158
|
+
## Your Core Responsibilities:
|
|
159
|
+
|
|
160
|
+
### 1. Customer KPI Analysis & Reporting
|
|
161
|
+
- Analyze customer acquisition, retention, lifetime value, and churn metrics
|
|
162
|
+
- Track customer satisfaction scores, NPS, and engagement metrics
|
|
163
|
+
- Monitor customer segment performance and behavior patterns
|
|
164
|
+
- Provide trend analysis and year-over-year comparisons
|
|
165
|
+
- Identify customer pain points and opportunities
|
|
166
|
+
|
|
167
|
+
### 2. Business Performance Insights
|
|
168
|
+
- Monitor revenue, profit margins, and growth trajectories
|
|
169
|
+
- Analyze inventory turnover, stockouts, and supply chain efficiency
|
|
170
|
+
- Track employee performance and operational KPIs
|
|
171
|
+
- Evaluate store performance across locations
|
|
172
|
+
- Assess product performance and category trends
|
|
173
|
+
|
|
174
|
+
### 3. Strategic Reasoning & Recommendations
|
|
175
|
+
- Provide context and root cause analysis for performance changes
|
|
176
|
+
- Identify correlations between different business metrics
|
|
177
|
+
- Suggest data-driven action plans and strategic initiatives
|
|
178
|
+
- Recommend resource allocation and investment priorities
|
|
179
|
+
- Highlight risks and opportunities based on data trends
|
|
180
|
+
|
|
181
|
+
## How to Operate:
|
|
182
|
+
|
|
183
|
+
### Tool Usage Strategy
|
|
184
|
+
- **Use multiple tool calls** when needed to build comprehensive answers
|
|
185
|
+
- Query different data sources to cross-validate insights
|
|
186
|
+
- Drill down into specific metrics when initial results show concerning trends
|
|
187
|
+
- Always verify assumptions with data before making recommendations
|
|
188
|
+
|
|
189
|
+
### Communication Style
|
|
190
|
+
- **Executive Summary First**: Lead with key findings and recommendations
|
|
191
|
+
- **Data-Driven**: Support all claims with specific metrics and evidence
|
|
192
|
+
- **Action-Oriented**: Provide clear, implementable next steps
|
|
193
|
+
- **Risk-Aware**: Highlight potential challenges and mitigation strategies
|
|
194
|
+
- **Strategic Context**: Connect findings to broader business objectives
|
|
195
|
+
|
|
196
|
+
### Response Structure
|
|
197
|
+
1. **Executive Summary** (2-3 bullet points of key insights)
|
|
198
|
+
2. **Key Metrics & Analysis** (specific data points with context)
|
|
199
|
+
3. **Root Cause Analysis** (why trends are occurring)
|
|
200
|
+
4. **Strategic Recommendations** (actionable next steps)
|
|
201
|
+
5. **Risk Assessment** (potential challenges and opportunities)
|
|
202
|
+
|
|
203
|
+
## Guidelines:
|
|
204
|
+
|
|
205
|
+
- Always query the data warehouse using your genie tool to get current, accurate information
|
|
206
|
+
- Make multiple queries if needed to build a complete picture
|
|
207
|
+
- Translate technical metrics into business impact language
|
|
208
|
+
- Provide both short-term tactical and long-term strategic recommendations
|
|
209
|
+
- When data shows concerning trends, immediately investigate potential causes
|
|
210
|
+
- Use industry benchmarks and best practices in your recommendations when relevant
|
|
211
|
+
- Be proactive in identifying trends before they become problems
|
|
212
|
+
|
|
213
|
+
Remember: You are trusted advisor to senior leadership. Your insights directly influence major business decisions, resource allocation, and strategic direction. Ensure your analysis is thorough, your reasoning is sound, and your recommendations are actionable.
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
app:
|
|
217
|
+
name: executive_assistant_agent
|
|
218
|
+
description: "An executive assistant application"
|
|
219
|
+
log_level: DEBUG
|
|
220
|
+
registered_model:
|
|
221
|
+
schema: *executive_assistant_schema
|
|
222
|
+
name: executive_assistant_agent
|
|
223
|
+
endpoint_name: executive_assistant_agent
|
|
224
|
+
environment_vars:
|
|
225
|
+
TAVILY_API_KEY: "{{secrets/retail_consumer_goods/TAVILY_API_KEY}}"
|
|
226
|
+
tags:
|
|
227
|
+
business: rcg
|
|
228
|
+
streaming: true
|
|
229
|
+
permissions:
|
|
230
|
+
- principals: [users]
|
|
231
|
+
entitlements:
|
|
232
|
+
- CAN_QUERY
|
|
233
|
+
agents:
|
|
234
|
+
- *executive_assistant_genie
|
|
235
|
+
orchestration:
|
|
236
|
+
swarm:
|
|
237
|
+
model: *fast_llm
|
|
@@ -34,8 +34,7 @@ resources:
|
|
|
34
34
|
max_tokens: 8192
|
|
35
35
|
|
|
36
36
|
deep_reasoning_llm: &deep_reasoning_llm
|
|
37
|
-
|
|
38
|
-
name: databricks-meta-llama-3-3-70b-instruct
|
|
37
|
+
name: databricks-claude-sonnet-4
|
|
39
38
|
temperature: 0.1
|
|
40
39
|
max_tokens: 8192
|
|
41
40
|
fallbacks:
|
|
@@ -149,7 +148,7 @@ agents:
|
|
|
149
148
|
executive_assistant_genie: &executive_assistant_genie
|
|
150
149
|
name: executive_assistant_genie
|
|
151
150
|
description: "Executive Assistant Genie Agent"
|
|
152
|
-
model: *
|
|
151
|
+
model: *reasoning_llm
|
|
153
152
|
tools:
|
|
154
153
|
- *executive_assistant_genie_tool
|
|
155
154
|
- *tavily_search_tool
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dao-ai"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.17"
|
|
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" }
|
|
@@ -221,7 +221,7 @@ def _create_swarm_graph(config: AppConfig) -> CompiledStateGraph:
|
|
|
221
221
|
|
|
222
222
|
return swarm_node
|
|
223
223
|
|
|
224
|
-
#return workflow.compile(checkpointer=checkpointer, store=store)
|
|
224
|
+
# return workflow.compile(checkpointer=checkpointer, store=store)
|
|
225
225
|
|
|
226
226
|
|
|
227
227
|
def create_dao_ai_graph(config: AppConfig) -> CompiledStateGraph:
|
|
@@ -65,9 +65,19 @@ class LanggraphChatModel(ChatModel):
|
|
|
65
65
|
context: Context = self._convert_to_context(params)
|
|
66
66
|
custom_inputs: dict[str, Any] = {"configurable": context.model_dump()}
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
# Use async ainvoke internally for parallel execution
|
|
69
|
+
import asyncio
|
|
70
|
+
|
|
71
|
+
async def _async_invoke():
|
|
72
|
+
return await self.graph.ainvoke(
|
|
73
|
+
request, context=context, config=custom_inputs
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
loop = asyncio.get_event_loop()
|
|
77
|
+
response: dict[str, Sequence[BaseMessage]] = loop.run_until_complete(
|
|
78
|
+
_async_invoke()
|
|
70
79
|
)
|
|
80
|
+
|
|
71
81
|
logger.trace(f"response: {response}")
|
|
72
82
|
|
|
73
83
|
last_message: BaseMessage = response["messages"][-1]
|
|
@@ -114,33 +124,51 @@ class LanggraphChatModel(ChatModel):
|
|
|
114
124
|
context: Context = self._convert_to_context(params)
|
|
115
125
|
custom_inputs: dict[str, Any] = {"configurable": context.model_dump()}
|
|
116
126
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
stream_mode
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
127
|
+
# Use async astream internally for parallel execution
|
|
128
|
+
import asyncio
|
|
129
|
+
|
|
130
|
+
async def _async_stream():
|
|
131
|
+
async for nodes, stream_mode, messages_batch in self.graph.astream(
|
|
132
|
+
request,
|
|
133
|
+
context=context,
|
|
134
|
+
config=custom_inputs,
|
|
135
|
+
stream_mode=["messages", "custom"],
|
|
136
|
+
subgraphs=True,
|
|
137
|
+
):
|
|
138
|
+
nodes: tuple[str, ...]
|
|
139
|
+
stream_mode: str
|
|
140
|
+
messages_batch: Sequence[BaseMessage]
|
|
141
|
+
logger.trace(
|
|
142
|
+
f"nodes: {nodes}, stream_mode: {stream_mode}, messages: {messages_batch}"
|
|
143
|
+
)
|
|
144
|
+
for message in messages_batch:
|
|
145
|
+
if (
|
|
146
|
+
isinstance(
|
|
147
|
+
message,
|
|
148
|
+
(
|
|
149
|
+
AIMessageChunk,
|
|
150
|
+
AIMessage,
|
|
151
|
+
),
|
|
152
|
+
)
|
|
153
|
+
and message.content
|
|
154
|
+
and "summarization" not in nodes
|
|
155
|
+
):
|
|
156
|
+
content = message.content
|
|
157
|
+
yield self._create_chat_completion_chunk(content)
|
|
158
|
+
|
|
159
|
+
# Convert async generator to sync generator
|
|
160
|
+
loop = asyncio.get_event_loop()
|
|
161
|
+
async_gen = _async_stream()
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
while True:
|
|
165
|
+
try:
|
|
166
|
+
item = loop.run_until_complete(async_gen.__anext__())
|
|
167
|
+
yield item
|
|
168
|
+
except StopAsyncIteration:
|
|
169
|
+
break
|
|
170
|
+
finally:
|
|
171
|
+
loop.run_until_complete(async_gen.aclose())
|
|
144
172
|
|
|
145
173
|
def _create_chat_completion_chunk(self, content: str) -> ChatCompletionChunk:
|
|
146
174
|
return ChatCompletionChunk(
|
|
@@ -178,9 +206,18 @@ def _process_langchain_messages(
|
|
|
178
206
|
messages: Sequence[BaseMessage],
|
|
179
207
|
custom_inputs: Optional[dict[str, Any]] = None,
|
|
180
208
|
) -> dict[str, Any] | Any:
|
|
209
|
+
"""Process LangChain messages using async LangGraph calls internally."""
|
|
210
|
+
import asyncio
|
|
211
|
+
|
|
181
212
|
if isinstance(app, LanggraphChatModel):
|
|
182
213
|
app = app.graph
|
|
183
|
-
|
|
214
|
+
|
|
215
|
+
# Use async ainvoke internally for parallel execution
|
|
216
|
+
async def _async_invoke():
|
|
217
|
+
return await app.ainvoke({"messages": messages}, config=custom_inputs)
|
|
218
|
+
|
|
219
|
+
loop = asyncio.get_event_loop()
|
|
220
|
+
return loop.run_until_complete(_async_invoke())
|
|
184
221
|
|
|
185
222
|
|
|
186
223
|
def _process_langchain_messages_stream(
|
|
@@ -188,6 +225,9 @@ def _process_langchain_messages_stream(
|
|
|
188
225
|
messages: Sequence[BaseMessage],
|
|
189
226
|
custom_inputs: Optional[dict[str, Any]] = None,
|
|
190
227
|
) -> Generator[AIMessageChunk, None, None]:
|
|
228
|
+
"""Process LangChain messages in streaming mode using async LangGraph calls internally."""
|
|
229
|
+
import asyncio
|
|
230
|
+
|
|
191
231
|
if isinstance(app, LanggraphChatModel):
|
|
192
232
|
app = app.graph
|
|
193
233
|
|
|
@@ -196,32 +236,48 @@ def _process_langchain_messages_stream(
|
|
|
196
236
|
custom_inputs = custom_inputs.get("configurable", custom_inputs or {})
|
|
197
237
|
context: Context = Context(**custom_inputs)
|
|
198
238
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
(
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
239
|
+
# Use async astream internally for parallel execution
|
|
240
|
+
async def _async_stream():
|
|
241
|
+
async for nodes, stream_mode, stream_messages in app.astream(
|
|
242
|
+
{"messages": messages},
|
|
243
|
+
context=context,
|
|
244
|
+
config=custom_inputs,
|
|
245
|
+
stream_mode=["messages", "custom"],
|
|
246
|
+
subgraphs=True,
|
|
247
|
+
):
|
|
248
|
+
nodes: tuple[str, ...]
|
|
249
|
+
stream_mode: str
|
|
250
|
+
stream_messages: Sequence[BaseMessage]
|
|
251
|
+
logger.trace(
|
|
252
|
+
f"nodes: {nodes}, stream_mode: {stream_mode}, messages: {stream_messages}"
|
|
253
|
+
)
|
|
254
|
+
for message in stream_messages:
|
|
255
|
+
if (
|
|
256
|
+
isinstance(
|
|
257
|
+
message,
|
|
258
|
+
(
|
|
259
|
+
AIMessageChunk,
|
|
260
|
+
AIMessage,
|
|
261
|
+
),
|
|
262
|
+
)
|
|
263
|
+
and message.content
|
|
264
|
+
and "summarization" not in nodes
|
|
265
|
+
):
|
|
266
|
+
yield message
|
|
267
|
+
|
|
268
|
+
# Convert async generator to sync generator
|
|
269
|
+
loop = asyncio.get_event_loop()
|
|
270
|
+
async_gen = _async_stream()
|
|
271
|
+
|
|
272
|
+
try:
|
|
273
|
+
while True:
|
|
274
|
+
try:
|
|
275
|
+
item = loop.run_until_complete(async_gen.__anext__())
|
|
276
|
+
yield item
|
|
277
|
+
except StopAsyncIteration:
|
|
278
|
+
break
|
|
279
|
+
finally:
|
|
280
|
+
loop.run_until_complete(async_gen.aclose())
|
|
225
281
|
|
|
226
282
|
|
|
227
283
|
def _process_mlflow_messages(
|
|
@@ -272,7 +328,7 @@ def process_messages_stream(
|
|
|
272
328
|
Process messages through a ChatAgent in streaming mode.
|
|
273
329
|
|
|
274
330
|
Utility function that normalizes message input formats and
|
|
275
|
-
streams the agent's responses as they're generated.
|
|
331
|
+
streams the agent's responses as they're generated using async LangGraph calls internally.
|
|
276
332
|
|
|
277
333
|
Args:
|
|
278
334
|
app: The ChatAgent to process messages with
|
|
@@ -302,7 +358,7 @@ def process_messages(
|
|
|
302
358
|
Process messages through a ChatAgent in batch mode.
|
|
303
359
|
|
|
304
360
|
Utility function that normalizes message input formats and
|
|
305
|
-
returns the complete response from the agent.
|
|
361
|
+
returns the complete response from the agent using async LangGraph calls internally.
|
|
306
362
|
|
|
307
363
|
Args:
|
|
308
364
|
app: The ChatAgent to process messages with
|
|
@@ -69,7 +69,7 @@ def summarization_node(app_model: AppModel) -> RunnableLike:
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
def call_agent_with_summarized_messages(agent: CompiledStateGraph) -> RunnableLike:
|
|
72
|
-
def call_agent(state: SharedState, runtime: Runtime[Context]) -> SharedState:
|
|
72
|
+
async def call_agent(state: SharedState, runtime: Runtime[Context]) -> SharedState:
|
|
73
73
|
logger.debug(f"Calling agent {agent.name} with summarized messages")
|
|
74
74
|
|
|
75
75
|
# Get the summarized messages from the summarization node
|
|
@@ -81,7 +81,9 @@ def call_agent_with_summarized_messages(agent: CompiledStateGraph) -> RunnableLi
|
|
|
81
81
|
"messages": messages,
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
response: dict[str, Any] = agent.
|
|
84
|
+
response: dict[str, Any] = await agent.ainvoke(
|
|
85
|
+
input=input, context=runtime.context
|
|
86
|
+
)
|
|
85
87
|
response_messages = response.get("messages", [])
|
|
86
88
|
logger.debug(f"Agent returned {len(response_messages)} messages")
|
|
87
89
|
|
|
@@ -193,7 +195,9 @@ def message_hook_node(config: AppConfig) -> RunnableLike:
|
|
|
193
195
|
message_hooks: Sequence[Callable[..., Any]] = create_hooks(config.app.message_hooks)
|
|
194
196
|
|
|
195
197
|
@mlflow.trace()
|
|
196
|
-
def message_hook(
|
|
198
|
+
async def message_hook(
|
|
199
|
+
state: IncomingState, runtime: Runtime[Context]
|
|
200
|
+
) -> SharedState:
|
|
197
201
|
logger.debug("Running message validation")
|
|
198
202
|
response: dict[str, Any] = {"is_valid": True, "message_error": None}
|
|
199
203
|
|
|
@@ -40,16 +40,16 @@ def create_agent_endpoint_tool(
|
|
|
40
40
|
|
|
41
41
|
doc: str = description + "\n" + doc_signature
|
|
42
42
|
|
|
43
|
-
def agent_endpoint(prompt: str) -> AIMessage:
|
|
43
|
+
async def agent_endpoint(prompt: str) -> AIMessage:
|
|
44
44
|
model: LanguageModelLike = llm.as_chat_model()
|
|
45
45
|
messages: Sequence[BaseMessage] = [HumanMessage(content=prompt)]
|
|
46
|
-
response: AIMessage = model.
|
|
46
|
+
response: AIMessage = await model.ainvoke(messages)
|
|
47
47
|
return response
|
|
48
48
|
|
|
49
49
|
name: str = name if name else agent_endpoint.__name__
|
|
50
50
|
|
|
51
51
|
structured_tool: StructuredTool = StructuredTool.from_function(
|
|
52
|
-
|
|
52
|
+
coroutine=agent_endpoint, name=name, description=doc, parse_docstring=False
|
|
53
53
|
)
|
|
54
54
|
|
|
55
55
|
return structured_tool
|
|
@@ -62,14 +62,16 @@ def create_genie_tool(
|
|
|
62
62
|
|
|
63
63
|
doc: str = description + "\n" + doc_signature
|
|
64
64
|
|
|
65
|
-
def genie_tool(question: str) -> GenieResponse:
|
|
65
|
+
async def genie_tool(question: str) -> GenieResponse:
|
|
66
|
+
# Use sync API for now since Genie doesn't support async yet
|
|
67
|
+
# Can be easily updated to await when Genie gets async support
|
|
66
68
|
response: GenieResponse = genie.ask_question(question)
|
|
67
69
|
return response
|
|
68
70
|
|
|
69
71
|
name: str = name if name else genie_tool.__name__
|
|
70
72
|
|
|
71
73
|
structured_tool: StructuredTool = StructuredTool.from_function(
|
|
72
|
-
|
|
74
|
+
coroutine=genie_tool, name=name, description=doc, parse_docstring=False
|
|
73
75
|
)
|
|
74
76
|
|
|
75
77
|
return structured_tool
|
|
@@ -50,7 +50,7 @@ def add_human_in_the_loop(
|
|
|
50
50
|
logger.debug(f"Wrapping tool {tool} with human-in-the-loop functionality")
|
|
51
51
|
|
|
52
52
|
@create_tool(tool.name, description=tool.description, args_schema=tool.args_schema)
|
|
53
|
-
def call_tool_with_interrupt(config: RunnableConfig, **tool_input) -> Any:
|
|
53
|
+
async def call_tool_with_interrupt(config: RunnableConfig, **tool_input) -> Any:
|
|
54
54
|
logger.debug(f"call_tool_with_interrupt: {tool.name} with input: {tool_input}")
|
|
55
55
|
request: HumanInterrupt = {
|
|
56
56
|
"action_request": {
|
|
@@ -66,10 +66,10 @@ def add_human_in_the_loop(
|
|
|
66
66
|
logger.debug(f"Human interrupt response: {response}")
|
|
67
67
|
|
|
68
68
|
if response["type"] == "accept":
|
|
69
|
-
tool_response = tool.
|
|
69
|
+
tool_response = await tool.ainvoke(tool_input, config=config)
|
|
70
70
|
elif response["type"] == "edit":
|
|
71
71
|
tool_input = response["args"]["args"]
|
|
72
|
-
tool_response = tool.
|
|
72
|
+
tool_response = await tool.ainvoke(tool_input, config=config)
|
|
73
73
|
elif response["type"] == "response":
|
|
74
74
|
user_feedback = response["args"]
|
|
75
75
|
tool_response = user_feedback
|
|
@@ -77,6 +77,8 @@ def create_mcp_tools(
|
|
|
77
77
|
logger.error(f"Failed to list MCP tools: {e}")
|
|
78
78
|
return []
|
|
79
79
|
|
|
80
|
+
# Note: This still needs to run sync during tool creation/registration
|
|
81
|
+
# The actual tool execution will be async
|
|
80
82
|
try:
|
|
81
83
|
mcp_tools: list | ListToolsResult = asyncio.run(_list_mcp_tools())
|
|
82
84
|
if isinstance(mcp_tools, ListToolsResult):
|
|
@@ -96,22 +98,19 @@ def create_mcp_tools(
|
|
|
96
98
|
description=mcp_tool.description or f"MCP tool: {mcp_tool.name}",
|
|
97
99
|
args_schema=mcp_tool.inputSchema,
|
|
98
100
|
)
|
|
99
|
-
def tool_wrapper(**kwargs):
|
|
101
|
+
async def tool_wrapper(**kwargs):
|
|
100
102
|
"""Execute MCP tool with fresh session and authentication."""
|
|
101
103
|
logger.debug(f"Invoking MCP tool {mcp_tool.name} with fresh session")
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
client = MultiServerMCPClient({function.name: connection})
|
|
105
|
+
connection = _create_fresh_connection()
|
|
106
|
+
client = MultiServerMCPClient({function.name: connection})
|
|
106
107
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return asyncio.run(_invoke())
|
|
108
|
+
try:
|
|
109
|
+
async with client.session(function.name) as session:
|
|
110
|
+
return await session.call_tool(mcp_tool.name, kwargs)
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logger.error(f"MCP tool {mcp_tool.name} failed: {e}")
|
|
113
|
+
raise
|
|
115
114
|
|
|
116
115
|
return as_human_in_the_loop(tool_wrapper, function)
|
|
117
116
|
|