From 3e9deaf9c02b365fde20a8ff7a860961734efe5e Mon Sep 17 00:00:00 2001 From: Greyson LaLonde Date: Thu, 23 Apr 2026 04:55:08 +0800 Subject: [PATCH] feat: bump versions to 1.14.3a3 --- .github/workflows/import-time.yml | 103 ------------------ lib/crewai-files/src/crewai_files/__init__.py | 2 +- lib/crewai-tools/pyproject.toml | 2 +- lib/crewai-tools/src/crewai_tools/__init__.py | 2 +- lib/crewai/pyproject.toml | 2 +- lib/crewai/src/crewai/__init__.py | 2 +- .../crewai/cli/templates/crew/pyproject.toml | 2 +- .../crewai/cli/templates/flow/pyproject.toml | 2 +- .../crewai/cli/templates/tool/pyproject.toml | 2 +- lib/devtools/src/crewai_devtools/__init__.py | 2 +- scripts/benchmark_import_time.py | 76 ------------- uv.lock | 46 +++++++- 12 files changed, 54 insertions(+), 189 deletions(-) delete mode 100644 .github/workflows/import-time.yml delete mode 100755 scripts/benchmark_import_time.py diff --git a/.github/workflows/import-time.yml b/.github/workflows/import-time.yml deleted file mode 100644 index 7c0126b23..000000000 --- a/.github/workflows/import-time.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: Import Time Guard - -on: - pull_request: - paths: - - "lib/crewai/src/**" - - "lib/crewai/pyproject.toml" - - "pyproject.toml" - -permissions: - contents: read - -jobs: - import-time: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.12"] - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: astral-sh/setup-uv@v6 - with: - version: "0.11.3" - enable-cache: true - - - name: Install the project - run: uv sync --all-extras --no-dev - env: - UV_PYTHON: ${{ matrix.python-version }} - - - name: Benchmark PR branch - id: pr - run: | - result=$(uv run python scripts/benchmark_import_time.py --runs 5 --json) - echo "result=$result" >> "$GITHUB_OUTPUT" - echo "pr_median=$(echo $result | python3 -c 'import sys,json; print(json.load(sys.stdin)["median_s"])')" >> "$GITHUB_OUTPUT" - echo "### PR Branch Import Time" >> "$GITHUB_STEP_SUMMARY" - echo "$result" | python3 -c " - import sys, json - d = json.load(sys.stdin) - print(f'- Median: {d[\"median_s\"]}s') - print(f'- Mean: {d[\"mean_s\"]}s ± {d[\"stdev_s\"]}s') - print(f'- Range: {d[\"min_s\"]}s – {d[\"max_s\"]}s') - " >> "$GITHUB_STEP_SUMMARY" - env: - UV_PYTHON: ${{ matrix.python-version }} - - - name: Checkout base branch - run: git checkout ${{ github.event.pull_request.base.sha }} - - - name: Install base branch - run: uv sync --all-extras --no-dev - env: - UV_PYTHON: ${{ matrix.python-version }} - - - name: Benchmark base branch - id: base - run: | - result=$(uv run python scripts/benchmark_import_time.py --runs 5 --json 2>/dev/null || echo '{"median_s": 0}') - echo "result=$result" >> "$GITHUB_OUTPUT" - echo "base_median=$(echo $result | python3 -c 'import sys,json; print(json.load(sys.stdin)["median_s"])')" >> "$GITHUB_OUTPUT" - echo "### Base Branch Import Time" >> "$GITHUB_STEP_SUMMARY" - echo "$result" | python3 -c " - import sys, json - d = json.load(sys.stdin) - if d.get('median_s', 0) > 0: - print(f'- Median: {d[\"median_s\"]}s') - else: - print('- Benchmark script not present on base branch (skip comparison)') - " >> "$GITHUB_STEP_SUMMARY" - env: - UV_PYTHON: ${{ matrix.python-version }} - - - name: Compare and gate - run: | - pr_median=${{ steps.pr.outputs.pr_median }} - base_median=${{ steps.base.outputs.base_median }} - - python3 -c " - pr = float('$pr_median') - base = float('$base_median') - - if base <= 0: - print('⏭️ No base benchmark available — skipping comparison.') - exit(0) - - change_pct = ((pr - base) / base) * 100 - print(f'Base: {base:.3f}s') - print(f'PR: {pr:.3f}s') - print(f'Change: {change_pct:+.1f}%') - print() - - if change_pct > 5: - print(f'❌ BLOCKED: Import time regressed by {change_pct:.1f}% (threshold: 5%)') - exit(1) - elif change_pct > 0: - print(f'⚠️ Slight regression ({change_pct:.1f}%) but within 5% threshold.') - else: - print(f'✅ Import time improved by {abs(change_pct):.1f}%') - " diff --git a/lib/crewai-files/src/crewai_files/__init__.py b/lib/crewai-files/src/crewai_files/__init__.py index 051eda5d4..8ed8d0053 100644 --- a/lib/crewai-files/src/crewai_files/__init__.py +++ b/lib/crewai-files/src/crewai_files/__init__.py @@ -152,4 +152,4 @@ __all__ = [ "wrap_file_source", ] -__version__ = "1.14.3a2" +__version__ = "1.14.3a3" diff --git a/lib/crewai-tools/pyproject.toml b/lib/crewai-tools/pyproject.toml index 2d3b1bba2..40e0fb951 100644 --- a/lib/crewai-tools/pyproject.toml +++ b/lib/crewai-tools/pyproject.toml @@ -10,7 +10,7 @@ requires-python = ">=3.10, <3.14" dependencies = [ "pytube~=15.0.0", "requests>=2.33.0,<3", - "crewai==1.14.3a2", + "crewai==1.14.3a3", "tiktoken~=0.8.0", "beautifulsoup4~=4.13.4", "python-docx~=1.2.0", diff --git a/lib/crewai-tools/src/crewai_tools/__init__.py b/lib/crewai-tools/src/crewai_tools/__init__.py index e03687484..af9de2437 100644 --- a/lib/crewai-tools/src/crewai_tools/__init__.py +++ b/lib/crewai-tools/src/crewai_tools/__init__.py @@ -321,4 +321,4 @@ __all__ = [ "ZapierActionTools", ] -__version__ = "1.14.3a2" +__version__ = "1.14.3a3" diff --git a/lib/crewai/pyproject.toml b/lib/crewai/pyproject.toml index cbf017801..24f01ea90 100644 --- a/lib/crewai/pyproject.toml +++ b/lib/crewai/pyproject.toml @@ -55,7 +55,7 @@ Repository = "https://github.com/crewAIInc/crewAI" [project.optional-dependencies] tools = [ - "crewai-tools==1.14.3a2", + "crewai-tools==1.14.3a3", ] embeddings = [ "tiktoken~=0.8.0" diff --git a/lib/crewai/src/crewai/__init__.py b/lib/crewai/src/crewai/__init__.py index 8d1587056..176b0ca61 100644 --- a/lib/crewai/src/crewai/__init__.py +++ b/lib/crewai/src/crewai/__init__.py @@ -48,7 +48,7 @@ def _suppress_pydantic_deprecation_warnings() -> None: _suppress_pydantic_deprecation_warnings() -__version__ = "1.14.3a2" +__version__ = "1.14.3a3" _LAZY_IMPORTS: dict[str, tuple[str, str]] = { "Memory": ("crewai.memory.unified_memory", "Memory"), diff --git a/lib/crewai/src/crewai/cli/templates/crew/pyproject.toml b/lib/crewai/src/crewai/cli/templates/crew/pyproject.toml index 93ee87691..65225c0fb 100644 --- a/lib/crewai/src/crewai/cli/templates/crew/pyproject.toml +++ b/lib/crewai/src/crewai/cli/templates/crew/pyproject.toml @@ -5,7 +5,7 @@ description = "{{name}} using crewAI" authors = [{ name = "Your Name", email = "you@example.com" }] requires-python = ">=3.10,<3.14" dependencies = [ - "crewai[tools]==1.14.3a2" + "crewai[tools]==1.14.3a3" ] [project.scripts] diff --git a/lib/crewai/src/crewai/cli/templates/flow/pyproject.toml b/lib/crewai/src/crewai/cli/templates/flow/pyproject.toml index a7f5747bc..0b0760f5d 100644 --- a/lib/crewai/src/crewai/cli/templates/flow/pyproject.toml +++ b/lib/crewai/src/crewai/cli/templates/flow/pyproject.toml @@ -5,7 +5,7 @@ description = "{{name}} using crewAI" authors = [{ name = "Your Name", email = "you@example.com" }] requires-python = ">=3.10,<3.14" dependencies = [ - "crewai[tools]==1.14.3a2" + "crewai[tools]==1.14.3a3" ] [project.scripts] diff --git a/lib/crewai/src/crewai/cli/templates/tool/pyproject.toml b/lib/crewai/src/crewai/cli/templates/tool/pyproject.toml index cac3afab3..4dd6b344c 100644 --- a/lib/crewai/src/crewai/cli/templates/tool/pyproject.toml +++ b/lib/crewai/src/crewai/cli/templates/tool/pyproject.toml @@ -5,7 +5,7 @@ description = "Power up your crews with {{folder_name}}" readme = "README.md" requires-python = ">=3.10,<3.14" dependencies = [ - "crewai[tools]==1.14.3a2" + "crewai[tools]==1.14.3a3" ] [tool.crewai] diff --git a/lib/devtools/src/crewai_devtools/__init__.py b/lib/devtools/src/crewai_devtools/__init__.py index 14470c742..9574be2db 100644 --- a/lib/devtools/src/crewai_devtools/__init__.py +++ b/lib/devtools/src/crewai_devtools/__init__.py @@ -1,3 +1,3 @@ """CrewAI development tools.""" -__version__ = "1.14.3a2" +__version__ = "1.14.3a3" diff --git a/scripts/benchmark_import_time.py b/scripts/benchmark_import_time.py deleted file mode 100755 index e44b2272a..000000000 --- a/scripts/benchmark_import_time.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -"""Benchmark `import crewai` cold start time. - -Usage: - python scripts/benchmark_import_time.py [--runs N] [--json] - -Spawns a fresh Python subprocess for each run to ensure cold imports. -Prints median, mean, min, max across all runs. -With --json, outputs machine-readable results for CI. -""" -import argparse -import json -import statistics -import subprocess -import sys - - -IMPORT_SCRIPT = "import time; t0 = time.perf_counter(); import crewai; print(time.perf_counter() - t0)" - - -def measure_import(python: str = sys.executable) -> float: - """Run a single cold-import measurement in a subprocess.""" - result = subprocess.run( - [python, "-c", IMPORT_SCRIPT], - capture_output=True, - text=True, - env={"PATH": "", "VIRTUAL_ENV": "", "PYTHONPATH": ""}, - timeout=30, - ) - if result.returncode != 0: - raise RuntimeError(f"Import failed: {result.stderr.strip()}") - return float(result.stdout.strip()) - - -def main(): - parser = argparse.ArgumentParser(description="Benchmark crewai import time") - parser.add_argument("--runs", type=int, default=5, help="Number of runs (default: 5)") - parser.add_argument("--json", action="store_true", help="Output JSON for CI") - parser.add_argument("--threshold", type=float, default=None, - help="Fail if median exceeds this value (seconds)") - args = parser.parse_args() - - times = [] - for i in range(args.runs): - t = measure_import() - times.append(t) - if not args.json: - print(f" Run {i + 1}: {t:.3f}s") - - median = statistics.median(times) - mean = statistics.mean(times) - stdev = statistics.stdev(times) if len(times) > 1 else 0.0 - - result = { - "runs": args.runs, - "median_s": round(median, 3), - "mean_s": round(mean, 3), - "stdev_s": round(stdev, 3), - "min_s": round(min(times), 3), - "max_s": round(max(times), 3), - } - - if args.json: - print(json.dumps(result)) - else: - print(f"\n Median: {median:.3f}s") - print(f" Mean: {mean:.3f}s ± {stdev:.3f}s") - print(f" Range: {min(times):.3f}s – {max(times):.3f}s") - - if args.threshold and median > args.threshold: - print(f"\n ❌ FAILED: median {median:.3f}s exceeds threshold {args.threshold:.3f}s") - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/uv.lock b/uv.lock index 768be7983..461c859a4 100644 --- a/uv.lock +++ b/uv.lock @@ -13,7 +13,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-04-23T07:00:00Z" +exclude-newer = "2026-04-22T16:00:00Z" [manifest] members = [ @@ -510,6 +510,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/d6/8ebcd05b01a580f086ac9a97fb9fac65c09a4b012161cc97c21a336e880b/azure_core-1.39.0-py3-none-any.whl", hash = "sha256:4ac7b70fab5438c3f68770649a78daf97833caa83827f91df9c14e0e0ea7d34f", size = 218318, upload-time = "2026-03-19T01:31:31.25Z" }, ] +[[package]] +name = "azure-identity" +version = "1.25.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "cryptography" }, + { name = "msal" }, + { name = "msal-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/0e/3a63efb48aa4a5ae2cfca61ee152fbcb668092134d3eb8bfda472dd5c617/azure_identity-1.25.3.tar.gz", hash = "sha256:ab23c0d63015f50b630ef6c6cf395e7262f439ce06e5d07a64e874c724f8d9e6", size = 286304, upload-time = "2026-03-13T01:12:20.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/9a/417b3a533e01953a7c618884df2cb05a71e7b68bdbce4fbdb62349d2a2e8/azure_identity-1.25.3-py3-none-any.whl", hash = "sha256:f4d0b956a8146f30333e071374171f3cfa7bdb8073adb8c3814b65567aa7447c", size = 192138, upload-time = "2026-03-13T01:12:22.951Z" }, +] + [[package]] name = "backoff" version = "2.2.1" @@ -1305,6 +1321,7 @@ aws = [ ] azure-ai-inference = [ { name = "azure-ai-inference" }, + { name = "azure-identity" }, ] bedrock = [ { name = "boto3" }, @@ -1359,6 +1376,7 @@ requires-dist = [ { name = "anthropic", marker = "extra == 'anthropic'", specifier = "~=0.73.0" }, { name = "appdirs", specifier = "~=1.4.4" }, { name = "azure-ai-inference", marker = "extra == 'azure-ai-inference'", specifier = "~=1.0.0b9" }, + { name = "azure-identity", marker = "extra == 'azure-ai-inference'", specifier = ">=1.17.0,<2" }, { name = "boto3", marker = "extra == 'aws'", specifier = "~=1.42.79" }, { name = "boto3", marker = "extra == 'bedrock'", specifier = "~=1.42.79" }, { name = "chromadb", specifier = "~=1.1.0" }, @@ -4484,6 +4502,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] +[[package]] +name = "msal" +version = "1.36.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/cb/b02b0f748ac668922364ccb3c3bff5b71628a05f5adfec2ba2a5c3031483/msal-1.36.0.tar.gz", hash = "sha256:3f6a4af2b036b476a4215111c4297b4e6e236ed186cd804faefba23e4990978b", size = 174217, upload-time = "2026-04-09T10:20:33.525Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/d3/414d1f0a5f6f4fe5313c2b002c54e78a3332970feb3f5fed14237aa17064/msal-1.36.0-py3-none-any.whl", hash = "sha256:36ecac30e2ff4322d956029aabce3c82301c29f0acb1ad89b94edcabb0e58ec4", size = 121547, upload-time = "2026-04-09T10:20:32.336Z" }, +] + +[[package]] +name = "msal-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315, upload-time = "2025-03-14T23:51:03.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583, upload-time = "2025-03-14T23:51:03.016Z" }, +] + [[package]] name = "msgpack" version = "1.1.2"