crewai-cli 1.15.2a2.dev20260707__tar.gz → 1.15.2.dev20260710__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.
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/PKG-INFO +2 -2
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/pyproject.toml +1 -1
- crewai_cli-1.15.2.dev20260710/src/crewai_cli/__init__.py +1 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/cli.py +2 -2
- crewai_cli-1.15.2.dev20260710/src/crewai_cli/input_prompt.py +84 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/model_catalog.py +32 -16
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/run_crew.py +116 -48
- crewai_cli-1.15.2.dev20260710/src/crewai_cli/run_declarative_flow.py +335 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_cli.py +6 -4
- crewai_cli-1.15.2.dev20260710/tests/test_input_prompt.py +82 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_model_catalog.py +65 -10
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_run_crew.py +220 -7
- crewai_cli-1.15.2.dev20260710/tests/test_run_declarative_flow.py +402 -0
- crewai_cli-1.15.2a2.dev20260707/src/crewai_cli/__init__.py +0 -1
- crewai_cli-1.15.2a2.dev20260707/src/crewai_cli/run_declarative_flow.py +0 -180
- crewai_cli-1.15.2a2.dev20260707/tests/test_run_declarative_flow.py +0 -148
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/add_crew_to_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/constants.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/auth0.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/base_provider.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/entra_id.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/keycloak.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/okta.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/providers/workos.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/token.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/authentication/utils.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/checkpoint_cli.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/checkpoint_tui.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/command.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/config.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/constants.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/create_json_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/crew_chat.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/crew_run_tui.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/archive.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/deploy/validate.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/enterprise/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/enterprise/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/evaluate_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/skills/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/experimental/skills/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/git.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/install_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/kickoff_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/memory_tui.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/organization/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/organization/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/plot_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/plus_api.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/provider.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/py.typed +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/remote_template/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/remote_template/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/replay_from_task.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/reset_memories_command.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/settings/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/settings/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/shared/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/shared/token_manager.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/task_outputs.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/AGENTS.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/config/agents.yaml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/config/tasks.yaml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/knowledge/user_preference.txt +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/pyproject.toml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/skills/.gitkeep +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/tools/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/crew/tools/custom_tool.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/AGENTS.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/flow.yaml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/declarative_flow/pyproject.toml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/config/agents.yaml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/config/tasks.yaml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/crews/content_crew/content_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/pyproject.toml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/skills/.gitkeep +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/tools/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/flow/tools/custom_tool.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/agent.jsonc +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/agent_settings.jsonc +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/crew.jsonc +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/knowledge/user_preference.txt +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/pyproject.toml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/json_crew/task.jsonc +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/.gitignore +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/README.md +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/pyproject.toml +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/src/{{folder_name}}/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/templates/tool/src/{{folder_name}}/tool.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tools/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tools/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/train_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/triggers/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/triggers/main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/tui_picker.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/update_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/user_data.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/utils.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/version.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_auth0.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_entra_id.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_keycloak.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_okta.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/providers/test_workos.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/test_auth_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/authentication/test_utils.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_archive.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_deploy_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/deploy/test_validate.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/enterprise/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/enterprise/test_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/skills/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/experimental/skills/test_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/organization/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/organization/test_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/skills/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/skills/test_safe_extract.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_click_compatibility.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_config.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_constants.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_create_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_create_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_crew_run_tui.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_crew_test.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_flow_commands.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_git.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_install_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_kickoff_flow.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_plus_api.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_settings_command.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_token_manager.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_train_crew.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_utils.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/test_version.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/tools/__init__.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/tools/test_main.py +0 -0
- {crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/tests/triggers/test_main.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crewai-cli
|
|
3
|
-
Version: 1.15.
|
|
3
|
+
Version: 1.15.2.dev20260710
|
|
4
4
|
Summary: CLI for CrewAI — scaffold, run, deploy and manage AI agent crews.
|
|
5
5
|
Project-URL: Homepage, https://crewai.com
|
|
6
6
|
Project-URL: Documentation, https://docs.crewai.com
|
|
@@ -10,7 +10,7 @@ Requires-Python: <3.14,>=3.10
|
|
|
10
10
|
Requires-Dist: appdirs~=1.4.4
|
|
11
11
|
Requires-Dist: certifi
|
|
12
12
|
Requires-Dist: click<9,>=8.1.7
|
|
13
|
-
Requires-Dist: crewai-core==1.15.
|
|
13
|
+
Requires-Dist: crewai-core==1.15.2.dev20260710
|
|
14
14
|
Requires-Dist: cryptography>=42.0
|
|
15
15
|
Requires-Dist: httpx~=0.28.1
|
|
16
16
|
Requires-Dist: packaging>=23.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.15.2.dev20260710"
|
|
@@ -526,8 +526,8 @@ def run(
|
|
|
526
526
|
inputs: str | None,
|
|
527
527
|
) -> None:
|
|
528
528
|
"""Run the Crew or Flow."""
|
|
529
|
-
|
|
530
|
-
|
|
529
|
+
# --inputs no longer requires --definition: with no override it resolves the
|
|
530
|
+
# configured [tool.crewai] flow, same as a bare `crewai run`.
|
|
531
531
|
if trained_agents_file is not None and definition is not None:
|
|
532
532
|
raise click.UsageError("--filename can only be used when running crews")
|
|
533
533
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Shared interactive prompting for runtime inputs (flows and crews).
|
|
2
|
+
|
|
3
|
+
``crewai run`` asks the user for values that were not provided up front — for a
|
|
4
|
+
declarative flow (derived from its state schema) and for a declarative (JSON)
|
|
5
|
+
crew (derived from the ``{placeholder}`` references in its agents and tasks).
|
|
6
|
+
Both paths go through this module so the experience is identical: the same
|
|
7
|
+
header, the same per-field prompt styling, and prompt chrome on stderr so
|
|
8
|
+
stdout carries only the run's result.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from collections.abc import Callable, Iterable
|
|
14
|
+
import difflib
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
import click
|
|
20
|
+
|
|
21
|
+
from crewai_cli.utils import enable_prompt_line_editing, is_dmn_mode_enabled
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def parse_inputs_json(inputs: str | None) -> dict[str, Any] | None:
|
|
25
|
+
"""Parse a ``--inputs`` JSON object, exiting with a pointed error if invalid."""
|
|
26
|
+
if inputs is None:
|
|
27
|
+
return None
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
parsed = json.loads(inputs)
|
|
31
|
+
except json.JSONDecodeError as exc:
|
|
32
|
+
click.echo(f"Invalid --inputs JSON: {exc}", err=True)
|
|
33
|
+
raise SystemExit(1) from exc
|
|
34
|
+
|
|
35
|
+
if not isinstance(parsed, dict):
|
|
36
|
+
click.echo("Invalid --inputs JSON: expected an object.", err=True)
|
|
37
|
+
raise SystemExit(1)
|
|
38
|
+
|
|
39
|
+
return parsed
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def closest_name(key: str, candidates: Iterable[str]) -> str | None:
|
|
43
|
+
"""Nearest candidate name to a likely typo, if one is close enough."""
|
|
44
|
+
matches = difflib.get_close_matches(key, list(candidates), n=1, cutoff=0.7)
|
|
45
|
+
return matches[0] if matches else None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def is_interactive() -> bool:
|
|
49
|
+
"""Prompt only in an interactive terminal, never in non-interactive mode."""
|
|
50
|
+
return not is_dmn_mode_enabled() and sys.stdin.isatty()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def prompt_for_inputs(
|
|
54
|
+
names: list[str],
|
|
55
|
+
*,
|
|
56
|
+
title: str,
|
|
57
|
+
subtitle: str,
|
|
58
|
+
describe: Callable[[str], str | None] | None = None,
|
|
59
|
+
coerce: Callable[[str, str], Any] | None = None,
|
|
60
|
+
) -> dict[str, Any]:
|
|
61
|
+
"""Prompt for each name and return ``{name: value}``.
|
|
62
|
+
|
|
63
|
+
``describe(name)`` returns an optional hint shown dim above the prompt (used
|
|
64
|
+
by flows to surface a field's schema description). ``coerce(name, raw)``
|
|
65
|
+
converts the typed string to the stored value (used by flows to coerce to
|
|
66
|
+
the field's JSON-schema type); by default the raw string is kept as-is.
|
|
67
|
+
|
|
68
|
+
Prompt chrome is written to stderr so stdout carries only the run result.
|
|
69
|
+
"""
|
|
70
|
+
enable_prompt_line_editing()
|
|
71
|
+
click.echo(err=True)
|
|
72
|
+
click.secho(f" {title}", fg="cyan", bold=True, err=True)
|
|
73
|
+
click.secho(f" {subtitle}", dim=True, err=True)
|
|
74
|
+
|
|
75
|
+
collected: dict[str, Any] = {}
|
|
76
|
+
for name in names:
|
|
77
|
+
if describe is not None and (hint := describe(name)):
|
|
78
|
+
click.secho(f" {hint}", dim=True, err=True)
|
|
79
|
+
raw = click.prompt(
|
|
80
|
+
click.style(f" {name}", fg="cyan"),
|
|
81
|
+
prompt_suffix=click.style(" > ", fg="bright_white"),
|
|
82
|
+
)
|
|
83
|
+
collected[name] = coerce(name, raw) if coerce is not None else raw
|
|
84
|
+
return collected
|
{crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/model_catalog.py
RENAMED
|
@@ -24,6 +24,7 @@ from __future__ import annotations
|
|
|
24
24
|
|
|
25
25
|
from collections.abc import Callable
|
|
26
26
|
import contextlib
|
|
27
|
+
import hashlib
|
|
27
28
|
import json
|
|
28
29
|
import os
|
|
29
30
|
from pathlib import Path
|
|
@@ -45,8 +46,11 @@ MAX_MODELS = 8
|
|
|
45
46
|
#: Timeout (seconds) for any network call made while resolving models.
|
|
46
47
|
_TIMEOUT = 6.0
|
|
47
48
|
|
|
48
|
-
#: How long a resolved (dynamic) catalog stays fresh before we refetch.
|
|
49
|
-
|
|
49
|
+
#: How long a resolved (dynamic) catalog stays fresh before we refetch. Kept
|
|
50
|
+
#: short: it only spares the picker repeated fetches within a wizard session,
|
|
51
|
+
#: and a stale list (new/removed models, account changes) is worse than a ~1s
|
|
52
|
+
#: refetch. Local providers (Ollama) are not cached at all — see _is_cacheable.
|
|
53
|
+
_CATALOG_TTL = 300
|
|
50
54
|
|
|
51
55
|
#: How long a fallback result is cached after a failed/empty fetch. Short, so a
|
|
52
56
|
#: newly-added API key takes effect soon, but long enough to spare the picker a
|
|
@@ -171,9 +175,8 @@ def get_provider_models(
|
|
|
171
175
|
|
|
172
176
|
# Nothing fresher than the curated list. Cache it briefly (negative cache)
|
|
173
177
|
# so a failed vendor/LiteLLM fetch isn't retried on every subsequent call.
|
|
174
|
-
#
|
|
175
|
-
|
|
176
|
-
if fallback and provider_key != "ollama":
|
|
178
|
+
# (_write_catalog_cache skips non-cacheable providers like Ollama.)
|
|
179
|
+
if fallback:
|
|
177
180
|
_write_catalog_cache(provider_key, fallback, source="fallback")
|
|
178
181
|
return fallback
|
|
179
182
|
|
|
@@ -601,25 +604,36 @@ def _litellm_cache_file() -> Path:
|
|
|
601
604
|
return _cache_dir() / "provider_cache.json"
|
|
602
605
|
|
|
603
606
|
|
|
607
|
+
def _is_cacheable(provider_key: str) -> bool:
|
|
608
|
+
"""Whether a provider's resolved catalog may be cached.
|
|
609
|
+
|
|
610
|
+
Ollama is a local server (``/api/tags`` is fast), and its installed models
|
|
611
|
+
change out-of-band, so it is never cached — the picker re-probes every call
|
|
612
|
+
and always reflects what is currently installed.
|
|
613
|
+
"""
|
|
614
|
+
return provider_key != "ollama"
|
|
615
|
+
|
|
616
|
+
|
|
604
617
|
def _cache_key(provider_key: str) -> str:
|
|
605
618
|
"""Cache key for a provider's resolved model list.
|
|
606
619
|
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
the negatively-cached fallback — so a key added after a no-key call is
|
|
613
|
-
not shadowed by the cached fallback.
|
|
620
|
+
Keyed by the exact API key (via a short, non-reversible digest — never the
|
|
621
|
+
key itself), so switching to a different key for the same provider misses
|
|
622
|
+
the previous account's cached entry and refetches. Absent key -> ``#nokey``,
|
|
623
|
+
which also keeps a negatively-cached no-key fallback from shadowing a run
|
|
624
|
+
after a key is added.
|
|
614
625
|
"""
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
626
|
+
api_key = _provider_api_key(provider_key)
|
|
627
|
+
if not api_key:
|
|
628
|
+
return f"{provider_key}#nokey"
|
|
629
|
+
digest = hashlib.sha256(api_key.encode("utf-8")).hexdigest()[:12]
|
|
630
|
+
return f"{provider_key}#{digest}"
|
|
619
631
|
|
|
620
632
|
|
|
621
633
|
def _read_catalog_cache(provider_key: str) -> list[tuple[str, str]] | None:
|
|
622
634
|
"""Return a fresh cached catalog for ``provider_key``, or ``None``."""
|
|
635
|
+
if not _is_cacheable(provider_key):
|
|
636
|
+
return None
|
|
623
637
|
payload = _read_json(_catalog_cache_file())
|
|
624
638
|
if not isinstance(payload, dict):
|
|
625
639
|
return None
|
|
@@ -642,6 +656,8 @@ def _read_catalog_cache(provider_key: str) -> list[tuple[str, str]] | None:
|
|
|
642
656
|
def _write_catalog_cache(
|
|
643
657
|
provider_key: str, models: list[tuple[str, str]], *, source: str
|
|
644
658
|
) -> None:
|
|
659
|
+
if not _is_cacheable(provider_key):
|
|
660
|
+
return
|
|
645
661
|
cache_file = _catalog_cache_file()
|
|
646
662
|
payload = _read_json(cache_file)
|
|
647
663
|
if not isinstance(payload, dict):
|
{crewai_cli-1.15.2a2.dev20260707 → crewai_cli-1.15.2.dev20260710}/src/crewai_cli/run_crew.py
RENAMED
|
@@ -12,9 +12,14 @@ import click
|
|
|
12
12
|
from crewai_core.constants import CREWAI_TRAINED_AGENTS_FILE_ENV
|
|
13
13
|
from packaging import version
|
|
14
14
|
|
|
15
|
+
from crewai_cli.input_prompt import (
|
|
16
|
+
closest_name,
|
|
17
|
+
is_interactive,
|
|
18
|
+
parse_inputs_json,
|
|
19
|
+
prompt_for_inputs,
|
|
20
|
+
)
|
|
15
21
|
from crewai_cli.utils import (
|
|
16
22
|
build_env_with_all_tool_credentials,
|
|
17
|
-
enable_prompt_line_editing,
|
|
18
23
|
is_dmn_mode_enabled,
|
|
19
24
|
)
|
|
20
25
|
from crewai_cli.version import get_crewai_tools_dependency, get_crewai_version
|
|
@@ -31,6 +36,7 @@ _INPUT_PLACEHOLDER_RE = re.compile(r"(?<!{){([A-Za-z_][A-Za-z0-9_\-]*)}(?!})")
|
|
|
31
36
|
_CREWAI_CLI_RUNNER_PACKAGE_DIR_ENV = "CREWAI_CLI_RUNNER_PACKAGE_DIR"
|
|
32
37
|
_CREWAI_RUNNER_SOURCE_DIR_ENV = "CREWAI_RUNNER_SOURCE_DIR"
|
|
33
38
|
_CREWAI_JSON_CREW_DEFINITION_ENV = "CREWAI_JSON_CREW_DEFINITION"
|
|
39
|
+
_CREWAI_JSON_CREW_INPUTS_ENV = "CREWAI_JSON_CREW_INPUTS"
|
|
34
40
|
_FULL_CREWAI_INSTALL_MESSAGE = f"""\
|
|
35
41
|
CrewAI CLI is installed without the `crewai` package required to run crews.
|
|
36
42
|
|
|
@@ -79,6 +85,8 @@ kwargs = {
|
|
|
79
85
|
}
|
|
80
86
|
if crew_definition := os.getenv("CREWAI_JSON_CREW_DEFINITION"):
|
|
81
87
|
kwargs["crew_path"] = crew_definition
|
|
88
|
+
if crew_inputs := os.getenv("CREWAI_JSON_CREW_INPUTS"):
|
|
89
|
+
kwargs["inputs"] = crew_inputs
|
|
82
90
|
|
|
83
91
|
try:
|
|
84
92
|
module._run_json_crew(**kwargs)
|
|
@@ -138,8 +146,8 @@ def _extract_input_placeholders(text: str | None) -> set[str]:
|
|
|
138
146
|
return set(_INPUT_PLACEHOLDER_RE.findall(text))
|
|
139
147
|
|
|
140
148
|
|
|
141
|
-
def
|
|
142
|
-
"""
|
|
149
|
+
def _referenced_input_names(crew: Any) -> set[str]:
|
|
150
|
+
"""All ``{placeholder}`` names referenced by a crew's agents and tasks."""
|
|
143
151
|
placeholders: set[str] = set()
|
|
144
152
|
|
|
145
153
|
for agent in getattr(crew, "agents", []) or []:
|
|
@@ -160,32 +168,70 @@ def _missing_input_names(crew: Any, inputs: dict[str, Any]) -> list[str]:
|
|
|
160
168
|
_extract_input_placeholders(getattr(task, "output_file", None))
|
|
161
169
|
)
|
|
162
170
|
|
|
163
|
-
return
|
|
171
|
+
return placeholders
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _missing_input_names(crew: Any, inputs: dict[str, Any]) -> list[str]:
|
|
175
|
+
"""Return input placeholders referenced by a crew but not provided as inputs."""
|
|
176
|
+
return sorted(name for name in _referenced_input_names(crew) if name not in inputs)
|
|
164
177
|
|
|
165
178
|
|
|
166
|
-
def
|
|
167
|
-
crew: Any,
|
|
179
|
+
def _resolve_crew_inputs(
|
|
180
|
+
crew: Any,
|
|
181
|
+
default_inputs: dict[str, Any],
|
|
182
|
+
provided: dict[str, Any] | None,
|
|
183
|
+
*,
|
|
184
|
+
interactive: bool,
|
|
168
185
|
) -> dict[str, Any]:
|
|
169
|
-
"""
|
|
186
|
+
"""Resolve kickoff inputs for a declarative crew.
|
|
187
|
+
|
|
188
|
+
Mirrors the declarative-flow experience (``_resolve_flow_inputs``): layers
|
|
189
|
+
``--inputs`` over the crew's declared ``inputs`` defaults, warns on provided
|
|
190
|
+
keys that aren't referenced as ``{placeholder}``s, prompts for any
|
|
191
|
+
still-missing placeholders when interactive, and exits with a pointed
|
|
192
|
+
message when one is still missing.
|
|
193
|
+
|
|
194
|
+
Unlike flows — whose state schema is an authoritative contract, so unknown
|
|
195
|
+
keys are dropped — the crew placeholder scan is heuristic (it only covers
|
|
196
|
+
agent/task text fields). An unrecognized key is therefore warned about but
|
|
197
|
+
*kept*, never dropped: dropping could silently discard a value that a field
|
|
198
|
+
the scan doesn't cover actually relies on.
|
|
199
|
+
"""
|
|
200
|
+
referenced = _referenced_input_names(crew)
|
|
170
201
|
inputs = dict(default_inputs or {})
|
|
171
|
-
missing = _missing_input_names(crew, inputs)
|
|
172
|
-
if not missing:
|
|
173
|
-
return inputs
|
|
174
202
|
|
|
175
|
-
|
|
203
|
+
for key, value in (provided or {}).items():
|
|
204
|
+
if key not in referenced:
|
|
205
|
+
suggestion = closest_name(key, referenced)
|
|
206
|
+
hint = f" Did you mean '{suggestion}'?" if suggestion else ""
|
|
207
|
+
click.secho(
|
|
208
|
+
f" Input '{key}' isn't referenced by any {{placeholder}} "
|
|
209
|
+
f"in the crew.{hint}",
|
|
210
|
+
fg="yellow",
|
|
211
|
+
err=True,
|
|
212
|
+
)
|
|
213
|
+
inputs[key] = value
|
|
176
214
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
215
|
+
missing = _missing_input_names(crew, inputs)
|
|
216
|
+
if missing and interactive:
|
|
217
|
+
inputs.update(
|
|
218
|
+
prompt_for_inputs(
|
|
219
|
+
missing,
|
|
220
|
+
title="Crew inputs",
|
|
221
|
+
subtitle="This crew needs the following to run.",
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
missing = _missing_input_names(crew, inputs)
|
|
183
225
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
click.
|
|
187
|
-
|
|
226
|
+
if missing:
|
|
227
|
+
for name in missing:
|
|
228
|
+
click.secho(f" Missing required input '{name}'", fg="red", err=True)
|
|
229
|
+
click.secho(
|
|
230
|
+
" Provide them via --inputs or the `inputs` object in crew.json(c).",
|
|
231
|
+
dim=True,
|
|
232
|
+
err=True,
|
|
188
233
|
)
|
|
234
|
+
raise SystemExit(1)
|
|
189
235
|
|
|
190
236
|
return inputs
|
|
191
237
|
|
|
@@ -243,29 +289,14 @@ def _prepare_json_crew_for_tui(crew: Any) -> None:
|
|
|
243
289
|
agent.llm.stream = True
|
|
244
290
|
|
|
245
291
|
|
|
246
|
-
def
|
|
247
|
-
crew: Any, default_inputs: dict[str, Any]
|
|
248
|
-
) -> dict[str, Any]:
|
|
249
|
-
"""Return runtime inputs in non-interactive mode or exit on missing values."""
|
|
250
|
-
inputs = dict(default_inputs or {})
|
|
251
|
-
missing = _missing_input_names(crew, inputs)
|
|
252
|
-
if missing:
|
|
253
|
-
missing_list = ", ".join(missing)
|
|
254
|
-
click.echo(
|
|
255
|
-
"Missing runtime inputs for CREWAI_DMN mode: "
|
|
256
|
-
f"{missing_list}. Add them to the `inputs` object in crew.json(c).",
|
|
257
|
-
err=True,
|
|
258
|
-
)
|
|
259
|
-
raise SystemExit(1)
|
|
260
|
-
return inputs
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
def _run_json_crew_without_tui(crew_path: Path) -> Any:
|
|
292
|
+
def _run_json_crew_without_tui(crew_path: Path, provided: dict[str, Any] | None) -> Any:
|
|
264
293
|
"""Run a JSON-defined crew with plain terminal output."""
|
|
265
294
|
with _json_loading_status("Preparing crew..."):
|
|
266
295
|
crew, default_inputs = _load_json_crew(crew_path)
|
|
267
296
|
|
|
268
|
-
runtime_inputs =
|
|
297
|
+
runtime_inputs = _resolve_crew_inputs(
|
|
298
|
+
crew, default_inputs, provided, interactive=False
|
|
299
|
+
)
|
|
269
300
|
result = crew.kickoff(inputs=runtime_inputs)
|
|
270
301
|
if result is not None:
|
|
271
302
|
click.echo(str(result))
|
|
@@ -275,6 +306,7 @@ def _run_json_crew_without_tui(crew_path: Path) -> Any:
|
|
|
275
306
|
def _run_json_crew(
|
|
276
307
|
trained_agents_file: str | None = None,
|
|
277
308
|
crew_path: str | Path | None = None,
|
|
309
|
+
inputs: str | None = None,
|
|
278
310
|
) -> Any:
|
|
279
311
|
"""Load and run a JSON-defined crew."""
|
|
280
312
|
from dotenv import load_dotenv
|
|
@@ -296,13 +328,17 @@ def _run_json_crew(
|
|
|
296
328
|
)
|
|
297
329
|
crew_path = Path(crew_path)
|
|
298
330
|
|
|
331
|
+
provided = parse_inputs_json(inputs)
|
|
332
|
+
|
|
299
333
|
if is_dmn_mode_enabled():
|
|
300
|
-
return _run_json_crew_without_tui(crew_path)
|
|
334
|
+
return _run_json_crew_without_tui(crew_path, provided)
|
|
301
335
|
|
|
302
336
|
crew_run_app_cls, crew, default_inputs, task_names, agent_names = (
|
|
303
337
|
_load_json_crew_for_tui(crew_path)
|
|
304
338
|
)
|
|
305
|
-
runtime_inputs =
|
|
339
|
+
runtime_inputs = _resolve_crew_inputs(
|
|
340
|
+
crew, default_inputs, provided, interactive=is_interactive()
|
|
341
|
+
)
|
|
306
342
|
|
|
307
343
|
app = crew_run_app_cls(
|
|
308
344
|
crew_name=crew.name or "Crew",
|
|
@@ -411,12 +447,18 @@ def _json_crew_run_command(project_root: Path | None = None) -> list[str]:
|
|
|
411
447
|
def _run_json_crew_in_project_env(
|
|
412
448
|
trained_agents_file: str | None = None,
|
|
413
449
|
crew_path: str | Path | None = None,
|
|
450
|
+
inputs: str | None = None,
|
|
414
451
|
) -> Any:
|
|
415
452
|
"""Run JSON crews from the project's uv-managed environment."""
|
|
453
|
+
# Validate --inputs up front so bad JSON fails before we spin up the uv env.
|
|
454
|
+
if inputs is not None:
|
|
455
|
+
parse_inputs_json(inputs)
|
|
456
|
+
|
|
416
457
|
if not (Path.cwd() / "pyproject.toml").is_file():
|
|
417
458
|
return _run_json_crew(
|
|
418
459
|
trained_agents_file=trained_agents_file,
|
|
419
460
|
crew_path=crew_path,
|
|
461
|
+
inputs=inputs,
|
|
420
462
|
)
|
|
421
463
|
|
|
422
464
|
_install_json_crew_dependencies_if_needed()
|
|
@@ -430,6 +472,8 @@ def _run_json_crew_in_project_env(
|
|
|
430
472
|
env[CREWAI_TRAINED_AGENTS_FILE_ENV] = trained_agents_file
|
|
431
473
|
if crew_path is not None:
|
|
432
474
|
env[_CREWAI_JSON_CREW_DEFINITION_ENV] = str(crew_path)
|
|
475
|
+
if inputs is not None:
|
|
476
|
+
env[_CREWAI_JSON_CREW_INPUTS_ENV] = inputs
|
|
433
477
|
|
|
434
478
|
try:
|
|
435
479
|
subprocess.run( # noqa: S603
|
|
@@ -569,11 +613,11 @@ def run_crew(
|
|
|
569
613
|
``CREWAI_TRAINED_AGENTS_FILE`` so agents load suggestions from this
|
|
570
614
|
file instead of the default ``trained_agents_data.pkl``.
|
|
571
615
|
definition: Optional path to a declarative Flow definition.
|
|
572
|
-
inputs: Optional JSON object
|
|
616
|
+
inputs: Optional JSON object of runtime inputs for a declarative flow
|
|
617
|
+
or declarative (JSON) crew. Layered over the definition's own
|
|
618
|
+
defaults; missing required values are prompted for interactively.
|
|
573
619
|
"""
|
|
574
|
-
|
|
575
|
-
raise click.UsageError("--inputs requires --definition")
|
|
576
|
-
|
|
620
|
+
# --definition is a pure override: run that flow directly.
|
|
577
621
|
if definition is not None:
|
|
578
622
|
_run_explicit_declarative_flow(
|
|
579
623
|
definition=definition,
|
|
@@ -584,9 +628,13 @@ def run_crew(
|
|
|
584
628
|
|
|
585
629
|
pyproject_data = read_toml()
|
|
586
630
|
if json_crew_definition := configured_project_json_crew(pyproject_data):
|
|
631
|
+
# Declarative (JSON) crews resolve inputs the same way flows do: --inputs
|
|
632
|
+
# layers over the crew's declared defaults, missing {placeholder}s are
|
|
633
|
+
# prompted for, and unknown keys are flagged. Forward the raw JSON.
|
|
587
634
|
_run_json_crew_in_project_env(
|
|
588
635
|
trained_agents_file=trained_agents_file,
|
|
589
636
|
crew_path=json_crew_definition,
|
|
637
|
+
inputs=inputs,
|
|
590
638
|
)
|
|
591
639
|
return
|
|
592
640
|
|
|
@@ -594,18 +642,29 @@ def run_crew(
|
|
|
594
642
|
project_type = get_crewai_project_type(pyproject_data)
|
|
595
643
|
|
|
596
644
|
if project_type == "flow":
|
|
645
|
+
# No --definition: resolve the configured [tool.crewai] flow — the same
|
|
646
|
+
# resolution as a bare `crewai run` — and pass --inputs straight through.
|
|
597
647
|
_run_flow_project(
|
|
598
648
|
pyproject_data=pyproject_data,
|
|
599
649
|
trained_agents_file=trained_agents_file,
|
|
650
|
+
inputs=inputs,
|
|
600
651
|
)
|
|
601
652
|
return
|
|
602
653
|
|
|
654
|
+
_reject_inputs_for_non_flow(inputs)
|
|
603
655
|
_run_classic_crew_project(
|
|
604
656
|
pyproject_data=pyproject_data,
|
|
605
657
|
trained_agents_file=trained_agents_file,
|
|
606
658
|
)
|
|
607
659
|
|
|
608
660
|
|
|
661
|
+
def _reject_inputs_for_non_flow(inputs: str | None) -> None:
|
|
662
|
+
if inputs is not None:
|
|
663
|
+
raise click.UsageError(
|
|
664
|
+
"--inputs is only supported for declarative flows and crews"
|
|
665
|
+
)
|
|
666
|
+
|
|
667
|
+
|
|
609
668
|
def _run_explicit_declarative_flow(
|
|
610
669
|
definition: str, inputs: str | None, trained_agents_file: str | None
|
|
611
670
|
) -> None:
|
|
@@ -618,7 +677,9 @@ def _run_explicit_declarative_flow(
|
|
|
618
677
|
|
|
619
678
|
|
|
620
679
|
def _run_flow_project(
|
|
621
|
-
pyproject_data: dict[str, Any],
|
|
680
|
+
pyproject_data: dict[str, Any],
|
|
681
|
+
trained_agents_file: str | None,
|
|
682
|
+
inputs: str | None = None,
|
|
622
683
|
) -> None:
|
|
623
684
|
if trained_agents_file is not None:
|
|
624
685
|
raise click.UsageError("--filename can only be used when running crews")
|
|
@@ -629,9 +690,16 @@ def _run_flow_project(
|
|
|
629
690
|
)
|
|
630
691
|
|
|
631
692
|
if definition := configured_project_declarative_flow(pyproject_data):
|
|
632
|
-
run_declarative_flow_in_project_env(definition=definition)
|
|
693
|
+
run_declarative_flow_in_project_env(definition=definition, inputs=inputs)
|
|
633
694
|
return
|
|
634
695
|
|
|
696
|
+
# No configured declarative flow definition to resolve inputs against.
|
|
697
|
+
if inputs is not None:
|
|
698
|
+
raise click.UsageError(
|
|
699
|
+
"--inputs requires a declarative flow definition "
|
|
700
|
+
"([tool.crewai].definition) or --definition"
|
|
701
|
+
)
|
|
702
|
+
|
|
635
703
|
from crewai_cli.kickoff_flow import (
|
|
636
704
|
_load_conversational_flow_from_kickoff_script,
|
|
637
705
|
_run_conversational_flow_tui,
|